def plot_line_gradients(ax,s,names,cmap,iphase,irefs,itau,iwvls,pos,normalize=False): """ Make multiple lines on the subplot ax of the spectra s, for the case defined by names with the cmap for one particular phase (iphase), range of refs (irefs) and at one itau. Returns the axis handles for the thin and thick ref """ rf = range(irefs[0],irefs[1]) colors = plt.cm._generate_cmap(cmap,int(len(rf)*2.25)) for ir in rf: if not(normalize): a1 = ax.plot(s.wv,s.sp[iphase,iwvls,0,ir,itau], color=(0.2,0.2,0.2), lw=1.0+1.4*float(ir)/irefs[1]) ax.plot(s.wv,s.sp[iphase,iwvls,0,ir,itau], color=colors(ir), lw=1.0+1.3*float(ir)/irefs[1]) ax.text(pos[0],pos[1],names,color=colors(irefs[1])) else: a1 = ax.plot(s.wv,norm2max(s.sp[iphase,iwvls,0,ir,itau]), color=(0.2,0.2,0.2), lw=1.0+1.4*float(ir)/irefs[1]) ax.plot(s.wv,norm2max(s.sp[iphase,iwvls,0,ir,itau]), color=colors(ir), lw=1.0+1.3*float(ir)/irefs[1]) ax.text(pos[0],pos[1]/0.22,names,color=colors(irefs[1])) if ir == rf[0]: alow = a1 if ir == rf[-1]: ahigh = a1 return [alow,ahigh]
def param(sp,wvlin): " Calculates the parameters from a spectrum." from linfit import linfit from Sp_parameters import nanmasked, norm2max, smooth, deriv, find_closest npar = 16 spc, mask = nanmasked(sp) wvl = wvlin[mask] try: norm = norm2max(spc) except ValueError: par = np.zeros(npar)*np.nan return par [i1000,i1077,i1493,i1600,i1200,i1300,i530,i610, i1565,i1634,i1193,i1198,i1236,i1248,i1270,i1644, i1050,i1040,i1065,i600,i870,i515] = find_closest(wvl,np.array([1000,1077,1493,1600,1200,1300,530, 610,1565,1634,1193,1198,1236,1248, 1270,1644,1050,1040,1065,600,870,515])) if np.isnan(spc[i1000]) or not spc[i1000]: par = np.zeros(npar)*np.nan return par norm2 = spc/spc[i1000] dsp = smooth(deriv(norm2,wvl/1000),2,nan=False) imaxwvl = np.argmax(spc) maxwvl = wvl[mask[imaxwvl]] # now calculate each parameter fit0 = np.polyfit(np.array([wvl[i1000],wvl[i1077]]),np.array([norm2[i1000],norm2[i1077]]),1) fit0_fn = np.poly1d(fit0) fit7 = np.polyfit(np.array([wvl[i1493],wvl[i1600]]),np.array([norm2[i1493],norm2[i1600]]),1) fit7_fn = np.poly1d(fit7) fit8,z = linfit(wvl[i1000:i1077],dsp[i1000:i1077]) fit9,z = linfit(wvl[i1200:i1300],dsp[i1200:i1300]) fit10,z = linfit(wvl[i530:i610]/1000,norm[i530:i610]) fit14,z = linfit(wvl[i1565:i1634],spc[i1565:i1634]/norm[i1565]) par = [sum(norm2[i1000:i1077]-fit0_fn(wvl[i1000:i1077])), # 1 curvature of rad normed to 1000 nm for 1000 nm - 1077 nm dsp[i1198], # 2 deriv of rad normed to 1000 nm at 1198 nm (!=IDL version) dsp[i1493], # 3 deriv of rad normed to 1000 nm at 1493 nm norm[i1198]/norm[i1236], # 4 ratio of normalized rad of 1198 nm / 1236 nm np.nanmean(norm[i1248:i1270]), # 5 mean of normalized rad between 1248 nm - 1270 nm np.nanmean(norm[i1565:i1644]), # 6 mean of normalized rad between 1565 nm - 1644 nm np.nanmean(norm[i1000:i1050]), # 7 mean of normalized rad between 1000 nm - 1050 nm sum(norm2[i1493:i1600]-fit7_fn(wvl[i1493:i1600])), # 8 curvature of rad normed to 1000 nm for 1493 nm - 1600 nm fit8[0], # 9 slope of deriv of rad normed to 1000 nm, 1000 nm - 1077 nm fit9[0], # 10 slope of deriv of rad normed to 1000 nm, 1200 nm - 1300 nm fit10[0], # 11 slope of normalized radiance between 530 nm - 610 nm norm[i1040], # 12 normalized radiance at 1040 nm norm[i1000]/norm[i1065], # 13 ratio of normalized radiance at 1000 nm / 1065 nm norm[i600]/norm[i870], # 14 ratio of normalized radiance at 600 nm / 870 nm np.nanmin([0.003,fit14[0]]), # 15 slope of radiance / rad at 1565 between 1565 nm - 1634 nm spc[i515]] # 16 radiance at 515 nm # do a check for bad points if np.all(np.isnan(par[0:13])): par[14] = np.nan par[15] = np.nan return par
def norm(fig=None,ax=None): "Plotting of zenith measurements in normalized radiance" if ax is None: fig,ax = plt.subplots() doaxes = True else: doaxes = False ax.plot(sm.nm[mask],norm2max(rad),lw=2, c='k', label='4STAR measured at: '+str(time_ref)) if doaxes: plt.title('Zenith radiance spectra') plt.ylabel('Normalized Radiance') plt.xlabel('Wavelength [nm]') plt.xlim([350,1700]) plt.ylim([0,1.0]) plt.legend(frameon=False) #plot_url = py.plot_mpl(fig) return fig,ax
ax4[1].plot(np.arange(16),lut.par[1,10,10,:],label='python') ax4[1].plot(np.arange(16),p_1_10_10,label='idl') ax4[1].set_title('difference in parameters - ice example') ax4[1].set_xlabel('Parameters') ax4[1].legend() # <markdowncell> # Create the desired arrays which are used in creating the parameters # <codecell> s_0_5_6 = lut.sp[0,:,0,5,6] s,n = nanmasked(s_0_5_6) snorm = norm2max(s_0_5_6) [i1000,i1077,i1493,i1600,i1200,i1300,i530,i610, i1565,i1634,i1193,i1198,i1236,i1248,i1270,i1644, i1050,i1040,i1065,i600,i870,i515] = find_closest(lut.wvl,np.array([1000,1077,1493,1600,1200,1300,530, 610,1565,1634,1193,1198,1236,1248, 1270,1644,1050,1040,1065,600,870,515])) norm2 = s_0_5_6/s_0_5_6[i1000] dsp = smooth(np.gradient(norm2,lut.wvl/1000.),2) # <codecell> norm2_uni = UnivariateSpline(lut.wvl/1000.0,norm2,k=5) norm2_uni.set_smoothing_factor(1) dnorm2 = norm2_uni.derivative() # <codecell>