#-*-coding:utf-8-*-
###################################
##########     J.B      ###########
###################################
############ 2025  ###############
###################################

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


## Récupération du fichiers de points

# Mettre le fichier de données dans le même dossier
def separateur(nomfichier):
    s = {';':0,',':0,'\t':0}
    with open(nomfichier, "r") as contenu:
        for ligne in contenu:
            for c in ligne :
                if c in s.keys(): s[c] +=1
    return s


def recup(nomfichier, colonnes):
    """
    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.
    """
    s = separateur(nomfichier)
    sep = max(s, key=s.get)
    if sep not in {';':0,'\t':0} :
        print("Mauvais séparateur :",sep)

    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



##Points expérimentaux factices
nomfichier ='TP.csv'
Donnees = recup(nomfichier, 2)

liste_x =  Donnees[0] #abscisses
liste_y = Donnees[1] #ordonnées

## Valeur de l'incertitudes de mesures : +/-0.2 en x, +/- 0.4 en y
ux = 0.2
uy = 0.4

e_x = [ux for k in range(len(liste_x))]
e_y = [uy for k in range(len(liste_x))]


## Méthode de monté-Carlo
N= 10000
a,b = [] ,[]

for _ in range(N):
    x = liste_x+ np.random.uniform(-ux,ux,len(liste_x))
    y = liste_y+ np.random.uniform(-uy,uy,len(liste_x))
    ar,br,rho,_,_ = linregress(x,y)
    a.append(ar)
    b.append(br)

ua, a_m = np.std(a,ddof=1), np.mean(a)
ub, b_m = np.std(b,ddof=1), np.mean(b)

print('a ={:.2e} , u(a) = {:.3e}'.format(a_m,ua))
print('b ={:.2e} , u(b) = {:.3e}'.format(b_m,ub))


## Régression linéaire
(a,b,rho,_,_)=linregress(liste_x,liste_y)

print("Equation de la droite : ")
print("y ={:.2e} x + {:.2e}".format(a,b))


## représentation graphique
plt.figure(figsize=(10,8))
plt.grid()
plt.plot(liste_x,a*liste_x+b,label="modèle",linewidth=3)
plt.errorbar(liste_x,liste_y,xerr=e_x,yerr=e_y,label="expérience",capsize = 5,fmt="go",linewidth=2)
plt.legend(loc="best",fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.xlabel(" X (unite)",fontsize = 16)
plt.ylabel(" Y (unite)",fontsize = 16)
plt.title(" Mon Titre ",fontsize = 18)
plt.show()

plt.figure(2,figsize=(10,8))
plt.grid()
plt.plot(liste_x,liste_y,"o",label="expérience",linewidth=2)
plt.legend(loc="best",fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.xlabel(" X (unite)",fontsize = 16)
plt.ylabel(" Y (unite)",fontsize = 16)
plt.title(" Mon Titre ",fontsize = 18)
plt.show()


