#!/usr/bin/env python3
# -*- coding: utf-8 -*-


import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
import widgets
import scipy.constants as constants
from matplotlib import rc
#rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
## for Palatino and other serif fonts use:
#rc('font',**{'family':'serif','serif':['Palatino']})
#rc('text', usetex=True)
title = "Oscillations du système en fonction des frottements et du forçage"

#description = """Résolution de l'équation différentielle régissant $x$ en fonction des paramètres du système"""

#===========================================================
# --- Initial parameters  ---------------------
#===========================================================

parameters = {
    'Q' : widgets.FloatSlider(value=0.5, description = '$Q = \\frac{m}{\lambda}\sqrt{\\frac{g}{l}}$', min=0.1, max=10),
    }
#default parameter for the potential of the couple considered : E0, temperature T, number of exchanged electrons n
m=10
g=9.81
l=10
F=8
w= np.pi * 2.
omega_0 = 2*np.pi

#===========================================================
# --- Functions to plot-------------------------------------
#===========================================================



def ResolveEDF(u,t,Q):
	return (u[1], -(omega_0/Q)*u[1]-omega_0**2*u[0])
	
def ResolveEDFforcage(u,t,Q):
	return (u[1], -(omega_0/Q)*u[1]-omega_0**2*u[0]+ F*np.sin(w*t))	

def ResolveEDSFforcage(u,t,Q):
	return (u[1], -omega_0**2*u[0]+ F*np.sin(w*t))	
	
def ResolveEDSF(u,t,Q):
	return (u[1], -omega_0**2*u[0])
 

def SolF(t,Q):
	u_0=[5,0]
	us=odeint(ResolveEDF,u_0,t,(Q,))
	return (us[:,0])
	
def SolFforcage(t,Q):
	u_0=[5,0]
	us=odeint(ResolveEDFforcage,u_0,t,(Q,))
	return (us[:,0])
	
def SolSFforcage(t,Q):
	u_0=[5,0]
	us=odeint(ResolveEDSFforcage,u_0,t,(Q,))
	return (us[:,0])

def SolSF(t,Q):
	u_0=[5,0]
	us=odeint(ResolveEDSF,u_0,t,(Q,))
	return (us[:,0])


#===========================================================
# --- Plot of the updated curves ---------------------------
#===========================================================

# This function is called when the sliders are changed 
def plot_data(Q):
    lines['Avec frottements'].set_data(t,SolF(t,Q) )
    lines['Sans frottements'].set_data(t,SolSF(t,Q) )
    lines['Foçage sans frottements'].set_data(t,SolSFforcage(t,Q) )
    lines['Foçage avec frottements'].set_data(t,SolFforcage(t,Q) )
    fig.canvas.draw_idle()


#===========================================================
# --- Initialization of the plot ---------------------------
#===========================================================

fig = plt.figure(figsize=(12,6))
fig.suptitle(title)
#plot of the text
#fig.text(0.01, .9, widgets.justify(description), multialignment='left', verticalalignment='top')

ax = fig.add_axes([0.35, 0.3, 0.6, 0.6])
ax.axhline(0, color='k')

lines = {}
lines['Sans frottements'], = ax.plot([], [], lw=2, color='red')
lines['Avec frottements'], = ax.plot([], [], lw=2, color='blue')
lines['Foçage sans frottements'], = ax.plot([], [], lw=2, color='green')
lines['Foçage avec frottements'], = ax.plot([], [], lw=2, color='black')



t = np.linspace(0, 30, 100000)
ax.set_xlim(0, 20)
ax.set_ylim(-8, 8)

ax.set_xlabel('t (s)')
ax.set_ylabel('x (m)')

param_widgets = widgets.make_param_widgets(parameters, plot_data, slider_box=[0.35, 0.07, 0.4, 0.15])
choose_widget = widgets.make_choose_plot(lines, box=[0.015, 0.25, 0.2, 0.15])
reset_button = widgets.make_reset_button(param_widgets)

if __name__=='__main__':
    plt.show()

