Slider Example
This example will allow the user to use sliders to interact with the ISR spectra. Currently this notebook creates two images. The first is a dual plot of the ACF and Power spectra expected for 100% O+ ionosphere and k = 18.5 with ion and electron temperature from the sliders. The second image is an image of the spectra that varies over wave number and an ion temperature derived from the sliders.
[1]:
import numpy as np
import matplotlib as mpl
import scipy.fftpack as scfft
import scipy.constants as spconst
import matplotlib.pylab as plt
import seaborn as sns
sns.set_style("white")
sns.set_context("notebook")
#
from ISRSpectrum import Specinit
import ipywidgets
from IPython.display import display
#%matplotlib inline
#%matplotlib notebook
%matplotlib widget
def plot1dspec(Ti,Tr):
"""Plot an IS spectra and ACF given ion and electron temperatures.
Will plot a spectra and ACF over a sampling rate of 50 kHz 256 samples with a center frequency of 440 MHz
Parameters
----------
Ti : float
Ion temperture in degrees K.
Tr : float
Ratio of electron temperature over ion temperature.
"""
Te= Tr*Ti
databloc = np.array([[1e11, Ti], [1e11,Te]])
# Select Number of points and sampling frequency in the spectra
nspec=256
spfreq=50e3
cfreq = 440e6
kvec = 4*spconst.pi*cfreq/spconst.c
ISpec_ion = Specinit(centerFrequency=cfreq, nspec=nspec, sampfreq=spfreq,dFlag=True)
species=['O+','e-']
ylim=[0,1.4]
ylim2=[-.5,1.4]
flims=np.array([3.03e6,3.034e6])
fion,ionline= ISpec_ion.getspecsep(databloc,species)
acf=scfft.ifft(scfft.ifftshift(ionline)).real
tau=scfft.ifftshift(np.arange(-np.ceil((float(nspec)-1)/2),np.floor((float(nspec)-1)/2)+1))/spfreq
if 'fig' in locals():
fig.close()
del fig
del ax
fig,ax = plt.subplots(1,2,sharey=False,facecolor='w')
l1=ax[0].plot(fion*1e-3,ionline/ionline.max(),'-',lw=3)[0]
sns.despine()
ax[0].set_xlim([-15,15])
ax[0].spines['right'].set_visible(False)
ax[0].set_xlabel('Frequency (kHz)',fontsize=14)
kstr = '{:0.1f}'.format(kvec)
ax[0].set_title('Spectra K={:0.1f}'.format(kvec),fontsize=18)
ax[0].set_ylabel('Normalized Magnitude',fontsize=14)
ax[0].set_ylim(ylim)
l1=ax[1].plot(tau[:64]*1e6,acf[:64]/acf[0],'-',lw=3)[0]
sns.despine()
ax[1].set_xlim([0,480])
ax[1].spines['right'].set_visible(False)
ax[1].set_xlabel('Lag in Microseconds ',fontsize=14)
ax[1].set_title('ACF K={:0.1f}'.format(kvec),fontsize=18)
ax[1].set_ylabel('Normalized Magnitude',fontsize=14)
ax[1].set_ylim(ylim2)
plt.tight_layout()
plt.show()
ACF and Spectra
This will show a plot of the spectra and ACF with sliders for the electron and ion temperatures. The frequency of the radar is 440 MHz carrier frequency (UHF).
[2]:
slideTi = ipywidgets.FloatSlider(
value=1000.,
min=500.,
max=5000.,
step=500.,
description='Ti in K:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='.1f',
slider_color='white'
)
slideTr = ipywidgets.FloatSlider(
value=1.,
min=1.,
max=8.,
step=0.25,
description='Tr: ',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='.1f',
slider_color='white'
)
%matplotlib inline
w=ipywidgets.interactive(plot1dspec,Ti=slideTi,Tr=slideTr)
output = w.children[-1]
output.layout.height = '800px'
output.layout.width= '100%'
display(w)
Spectra Image Varying by Wave Number
A plot will be created showing how the IS spectra will vary with wave number using the ion temperature from the slider.
[3]:
slide1 = ipywidgets.FloatSlider(
value=1000.,
min=500.,
max=5000.,
step=500.,
description='Ti in K:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='.1f',
slider_color='white'
)
def plot2dspec(Ti):
"""Create a 2-D plot of spectra from wave number and frequency.
Parameters
----------
Ti : float
Ion temperture in degrees K.
"""
databloc = np.array([[1e11,Ti],[1e11,2.5e3]])
species=['O+','e-']
newcentfreq = 449e6 +np.linspace(-200,550,250)*1e6
k_all= 2*2*np.pi*newcentfreq/spconst.c
k_lims=np.array([k_all.min(),k_all.max()])
freq_lims=np.array([newcentfreq.min(),newcentfreq.max()])
oution = []
for i,if_0 in enumerate(newcentfreq):
ISpec_ion = Specinit(centerFrequency = if_0, nspec=256, sampfreq=50e3,dFlag=False)
fion,ionline= ISpec_ion.getspecsep(databloc,species)
oution.append(ionline)
oution=np.array(oution)
F,K_b=np.meshgrid(fion,k_all)
fig,ax = plt.subplots(1,1,sharey=True, figsize=(6,4),facecolor='w')
l1=ax.pcolor(F*1e-3,K_b,oution/oution.max(),cmap='viridis')
cb1 = plt.colorbar(l1, ax=ax)
ax.set_xlim([-25,25])
ax.set_ylim(k_lims)
ax.set_xlabel('Frequency (kHz)',fontsize=14)
ax.set_title(r'$\langle|n_e(\mathbf{k},\omega)|^2\rangle$',fontsize=18)
ax.set_ylabel(r'$|\mathbf{k}|$ (rad/m)',fontsize=14)
%matplotlib inline
w = ipywidgets.interactive(plot2dspec, Ti=slide1)
output = w.children[-1]
output.layout.height = '1200px'
display(w)