#################
# Bibliothèques #
#################
import numpy as np
import matplotlib.pyplot as plt


############################
# PARAMETRES EXPERIMENTAUX #
############################
m = 0.2
delta_m = 0.001 # imprécision sur la mesure de m (kg)

#############################
# CHARGEMENT DU FICHIER CSV #
#############################
fichier = "./tp14/data.csv"
data = np.loadtxt(fichier, skiprows=1, delimiter=",")#, max_rows = 2000
indStart = 12431  #permet d'ajuster le premier point pour retirer les données ne correspondant pas aux oscillations
indEnd = 62173
t    = data[indStart:indEnd,0] - data[indStart,0]
a    = data[indStart:indEnd,2]
a_abs = np.abs(a)



#####################################
# TRACE GRAPHIQUE DE L'ACCELERATION #
#####################################
fig = plt.figure(1)
plt.title("Oscillations d'un système masse-ressort")
plt.ylabel("Acceleration $m\cdot s^{-2}$")
plt.xlabel("temps($s$)")
plt.plot(t, a)
plt.show()


###############################
# RECHERCHE DES MAXIMA LOCAUX #
###############################
""" Objectifs :
    Ecrire une structure algorithmique qui trouve les extrema locaux de
    l'accélération et leurs instants t. On pourra rechercher les maximas de a_abs = |a|
    Ces maximas et instants seront stockés dans deux listes a_max, et t_max.
"""

a_max = []
t_max = []


# Etape 1 : recherche des zeros
a_mean = np.mean(a)
liste_indice = []
for i in range(len(a)-1):
    if (a[i]-a_mean)*(a[i+1]-a_mean)<0 :
        liste_indice.append(i)

#Etape 2 : recherche des maximas sur la fonction valeur absolue de a


a_max = []
t_max = []



max_index = []

for i in range(len(liste_indice)-1):
    indiceMin = liste_indice[i]
    indiceMax = liste_indice[i+1]
    max_index = indiceMin +  np.argmax(a_abs[indiceMin:indiceMax]) # Pour avoir l'indice du maximum
    if a_abs[max_index] > a_mean + 1 :
        a_max.append(a_abs[max_index]) # Valeur maximum
        t_max.append(t[max_index])     # instant de la vale


# tracé graphique de ces maxima
# Vérifier l'absence fausses detections
fig = plt.figure(2)
plt.title("Oscillations d'un système masse-ressort")
plt.ylabel("Acceleration $m\cdot s^{-2}$")
plt.xlabel("temps($s$)")
plt.plot(t, a_abs)
plt.scatter(t_max, a_max, color='r')
plt.show()

###############################
# DETERMINATION DE LA PERIODE #
###############################
""" Objectifs :
    Ecrire une structure algorithmique détermine la période moyenne des oscillations.
    On définit ainsi T.
    En déduire la pulsation omega et la constante de raideur k
"""

Delta_t_max = []
for i in range(len(t_max)-1):
    Delta_t_max.append(t_max[i+1]-t_max[i])

T = np.mean(Delta_t_max)
omega = 2*3.14159/T
k = m*(omega**2)  #approximation





#######################
# DETERMINATION DE Em #
#######################
"""
Ecrire l'expression de Em à partir des maximas locaux a_max
"""

Em = []
for a in a_max:
    Em.append(0.5*m*(omega**2)*(a**2))


#############################
# TRACE GRAPHIQUE DE ln(Em) #
#############################
fig = plt.figure(3)
plt.title("Ajustement de l'énergie mécanique")
plt.ylabel("$\ln{E_m}$")
plt.xlabel("temps($s$)")
plt.plot(t_max, np.log(Em))
plt.show()





############################
# TRAITEMENT DE DONNEES  : #
############################
# Hypothèse frottement linéaire
# On applique un ajustement linéaire d'ordre 1 à ln(Em)
coeffDir, OrdOrigine = np.polyfit(t_max, np.log(Em),1) # A COMPLETER

mu = -coeffDir

fig = plt.figure(4)
plt.title("Hypothèse frottement linéaire")
plt.ylabel("$\ln{E_m}$")
plt.xlabel("t")
plt.scatter(t_max, np.log(Em), label="Données")
plt.plot(t_max,
         coeffDir*np.array(t_max) + OrdOrigine,
         "r-",
         label="Ajustement linéaire")
plt.legend()
plt.show()


print("Coefficient µ\n")
print(mu)

# alpha = # A COMPLETER

# print("Coefficient de frottements\n")
# print(alpha)
