#-*-coding:utf-8-*-
###############################################
########  Modélisation loi de Malus     #######
#### à  partir de mesures expérimentales ######
################# J.B 10/23 ###################
################# Python 3.4  #################
###############################################

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
plt.close("all") # pour fermer les fenêtres graphiques


## Pour lire les données csv
def recup(nomfichier, colonnes, sep = ";"):
    """
    nomfichier : fichier texte .txt ou .csv
    colonnes : type int, nbre de colonnes à récupérer
    sep : type str, séparateur de colonnes, ";" par défaut
    RETOUR : type array, tableau de données.
    """
    L = [ [] for _ in range(colonnes)] #initialisaition de la liste de données
    with open(nomfichier, "r") as contenu:
        for ligne in contenu:
            try : #pour éviter les entêtes
                ligne = ligne.replace(',','.') #  transforme les , en .
                ligne = ligne.split(sep) #sépare les valeurs
                for i in range(colonnes):
                    L[i].append(float(ligne[i]) )#remplissage et conversion en flottant
            except: ValueError
    return np.array(L) # conversion en tableau

## Lecture des données

nomfichier = 'tp.csv' # remplacer ici le nom de votre fichier
angle,intensite = recup(nomfichier, 2, sep = ";")

## Valeur de l'incertitudes de mesures : à modifier
e_x = [1 for k in range(len(angle))]
e_y = [10 for k in range(len(intensite))]


## Modélisation par une fonction
#  A* cos²(angle-angle0) + cste

def modele(t,a,b,t0):
    return a*np.cos(-3.14/180*(t-t0))**2 + b

#initialisation des coefficients :
# ces valeurs sont à renseigner à la louche
a_ini =150
b_ini = 0.1
t0_ini = 0.5


popt, pcov = curve_fit(
    modele,
    angle, intensite, p0=(a_ini,b_ini,t0_ini)
)

# fonction modéle :
x_modele = np.linspace(0,90,200)
a,b,t0 = popt
y_modele = modele(x_modele,a,b,t0,)


texte_modele = "a  = {:.2f} \n b = {:.2f} \n $t_0$ = {:.2f}  ".format(a,b,t0 )


## représentation graphique
plt.figure(figsize=(8,6))
plt.grid()
plt.errorbar(angle,intensite,xerr=e_x,yerr=e_y,label="expérience",capsize = 5,fmt="go",linewidth=2)
plt.plot(x_modele,y_modele,"-r",linewidth=2,label="modèle")
plt.legend(loc="best")

plt.text(3,.4,texte_modele,fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.xlabel(" Angle ($^\circ$)",fontsize=14)
plt.ylabel(" Irradiance (Lx)",fontsize=14)
plt.title(" Validité de la loi de Malus ",fontsize=14)
plt.show()



