# -*- coding: utf-8 -*-
"""
Ugo Hincelin - Avril 2017

Rayonnement du corps noir en fonction de sa température. Affiche l'exitance spectrale (W.m⁻².nm⁻¹) en fonction de la longueur d'onde, pour une température ajustable.

"""

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons, Cursor

h = 6.626e-34 # [J.s] constante de Planck
kb = 1.38e-23 # [J.K⁻¹] constante de Boltzmann
c = 2.998e8 # [m.s⁻¹] vitesse lumière dans vide

lambd = np.linspace(1,30000,1000)

fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)
T0 = 5500. # température du soleil
y0 = (2*np.pi*h*c**2)/(lambd*1e-9)**5/(np.exp(h*c/((lambd*1e-9)*kb*T0))-1)
print(max(y0),min(y0))
#quit()
l, = plt.plot(lambd, y0, lw=2, color='red')
plt.axis([100,30000,1e2,1e16])
ax.set_yscale('log')
ax.set_xscale('log')
plt.xlabel("longueur d'onde [nm]")
plt.ylabel("exitance [W.m$^{-2}$.nm$^{-1}$]")

axcolor = 'lightgoldenrodyellow'
axT = plt.axes([0.25, 0.07, 0.65, 0.03], axisbg=axcolor)
ioT = Slider(axT, 'T', 200, 10000, valinit=T0)

def update(val):
    T = ioT.val
    l.set_ydata((2*np.pi*h*c**2)/(lambd*1e-9)**5/(np.exp(h*c/((lambd*1e-9)*kb*T))-1))
    fig.canvas.draw_idle()
    
ioT.on_changed(update)

resetax = plt.axes([0.03, 0.07, 0.1, 0.04])
button = Button(resetax, 'Reset', color=axcolor, hovercolor='0.975')

def reset(event):
    ioT.reset()
button.on_clicked(reset)

# set useblit = True on gtkagg for enhanced performance
cursor = Cursor(ax, useblit=True, color='green', linewidth=2)

plt.show()