# -*- coding: utf-8 -*-

"""
Préparation à l'Agrégation de Physique de Bordeaux (2016-2017)
Traitement de données : exemple de la décharge d'un condensateur dans un RLC
"""

## Importation des bibliotheques

from pylab import *
from scipy import *
from numpy import *
#from scipy.integrate import *
from scipy.optimize import curve_fit


## Lectures des données à partir d'un fichier & conversions si nécessaires

A=open("ugo_ferro_2.csv", 'r')       # ouvre le fichier csv
#A.readline()                            # enlève la première ligne
T=array([])                             # cree une liste pour la variable t
U=array([])
for i in A:
    var=i.split(",")  # decoupe la ligne i en mots et i part depuis la deuxieme ligne avec le separateur de colonnes
    t=float(var[0])                     # transforme le mot de la premiere colonne en variable + conversion si necessaire
    u=float(var[1])
    T=append(t,T)                       # on concatene la liste precedente de x avec le x de la ligne i (colonne 1)
    U=append(u,U)

T=T*500/12.0/48e-2 #H
# U=(U-3.4e-3)*200e3*2e-6/250/(3.8e-2)**2 #B
U=U*200e3*2e-6/250/(3.8e-2)**2 #B

U=U/(4*pi*1e-7)-T #M

print(max(U))
print(max(U)*4*pi*1e-7)

# ## ajustement par un modèle : x = variable, (a,b,c,d) = paramètres
# 
# def fonc(x,a,b,c,d):
#     return a+b*exp(-x/c)*cos(2*pi*x/d)
# 
# param=[0,6,0.002,0.001]                 # initialisation des parametres dans le but d aider le programme a optimiser
# popt, pcov = curve_fit(fonc, T, U,param) # si pas d initialisation alors enlever le param
# [a,b,c,d] = popt                        # popt renvoie les parametres optimises
# sigma_a = sqrt(pcov[0, 0])              # pcov renvoie (termes diagonaux) les variances
# sigma_b = sqrt(pcov[1, 1])
# sigma_c = sqrt(pcov[2, 2])
# sigma_d = sqrt(pcov[3, 3])
# 
# 
# ## ajout des incertitudes et des erreurs : chi2_red = paramètre à mettre proche de 1 avec nos incertitudes
# 
errX=0.02*T                                             # erreur sur X ici T  on prend 1 pourcent
errY=0.02*U                                             # erreur sur Y ici U  on prend 1 pourcent
# sigma_exp = errY
# yth = fonc(T,a,b,c,d)                                   # fonction theorique a partir des parametres de l'ajustement
# chi2 = sum(((yth - U)/sigma_exp)**2)
# chi2_red = chi2/(len(T) - 4)                            # divide by no.of DOF = ecart relatif entre les deux courbes
# erra,errb,errc,errd= np.sqrt(diag(pcov)/chi2_red)       # incertitude sur les parametres
# 
# print("a=",a,"+/-",erra)
# print("b=",b,"+/-",errb)
# print("c=",c,"+/-",errc)
# print("d=",d,"+/-",errd)


## Tracer des courbes : expérimentales + ajustement + barres d'erreurs

# figure(1)
fig, ax = plt.subplots(1)               # cette commande va nous permettre de rajouter du texte
plot(T,U,'o',label='experimental')      # courbe provenant des points
# plot(T,yth,'r',label='ajustement')      # plot du fit
errorbar(T,U,errY,errX,fmt='bo')        # ajout des erreurs
# ax.axis([xmin,xmax,ymin,ymax])        # on fixe les limites du graphique
xlabel('Excitation magnetique H (A.m$^{-1}$)')
ylabel('Aimantation M (A.m$^{-1}$)')
title('Cycle d hysteresis magnetique du fer doux')

# ajout d un texte sur le plot : ajout des parametres
# textstr = "U=a+b*exp(-t/c)*cos(2$\pi$*t/d)\n\
# a= (%.2f +/- %.2f) V\n\
# b= (%.2f +/- %.2f) V\n\
# c= (%.2f +/- %.2f) ms\n\
# d= (%.2f +/- %.2f) ms\n\
# chi2_red = %.2f"  %(a,erra,b,errb,c*1000,errc*1000,d*1000,errd*1000,chi2_red)
# ax.text(0.30, 0.30, textstr,transform=ax.transAxes, fontsize=12, verticalalignment='top')
grid(True)
legend(loc=2)
show()
