In [52]:
# imports
from importlib import reload
import numpy as np
from scipy import optimize
from matplotlib import pyplot as plt
import yaml
from desispec.qa import qalib
from desispec.io import read_frame, read_params
In [2]:
tst_file = '/home/xavier/DESI/DESI_SCRATCH/18.7/spectro/redux/mini/QA/exposures/20200316/00000021/qa-b1-00000021.yaml'
In [3]:
# Read yaml
with open(tst_file, 'r') as infile:
qa_data = yaml.load(infile)
In [4]:
qa_data['20200316'][21]['b1']['S2N']['PARAMS']
Out[4]:
In [5]:
qa_data['20200316'][21]['b1']['S2N']['METRICS'].keys()
Out[5]:
In [6]:
qa_data['20200316'][21]['b1']['S2N']['METRICS']['OBJLIST']
Out[6]:
In [7]:
s2n_dict = qa_data['20200316'][21]['b1']['S2N']['METRICS']
In [8]:
all_mags = np.resize(np.array(s2n_dict['MAGNITUDES']), (500,3))
all_mags.shape
Out[8]:
In [9]:
fidx = np.where(np.array(qa_data['20200316'][21]['b1']['S2N']['METRICS']['FILTERS']) == qa_data['20200316'][21]['b1']['S2N']['METRICS']['FIT_FILTER'])[0]
fidx
Out[9]:
In [10]:
mags = all_mags[:,fidx].flatten()
mags.shape
Out[10]:
In [11]:
gd_mag = np.isfinite(mags)
np.sum(~gd_mag)
Out[11]:
In [12]:
plt.clf()
ax=plt.gca()
#
ax.scatter(mags[gd_mag], np.array(s2n_dict['MEDIAN_SNR'])[gd_mag])
#
plt.show()
In [13]:
exptime = qa_data['20200316'][21]['b1']['S2N']['METRICS']['EXPTIME']
exptime
Out[13]:
In [14]:
r2= qa_data['20200316'][21]['b1']['S2N']['METRICS']['r2']
funcMap={"linear":lambda x,a,b:a+b*x,
"poly":lambda x,a,b,c:a+b*x+c*x**2,
"astro":lambda x,a,b:(exptime*a*x)/np.sqrt(exptime*(a*x+b)+r2)
}
In [15]:
fitfunc = funcMap['astro']
In [16]:
sci_idx = qa_data['20200316'][21]['b1']['S2N']['METRICS']['OBJLIST'].index('SCIENCE')
sci_idx
Out[16]:
In [17]:
coeff = qa_data['20200316'][21]['b1']['S2N']['METRICS']['FITCOEFF_TGT'][sci_idx]
coeff
Out[17]:
In [18]:
x=10**(-0.4*(mags[gd_mag]-22.5))
fit_snr = fitfunc(x, *coeff)
fit_snr[0:50]
Out[18]:
In [19]:
r2
Out[19]:
In [20]:
resid = (np.array(s2n_dict['MEDIAN_SNR'])[gd_mag]-fit_snr)/fit_snr
In [21]:
plt.clf()
ax=plt.gca()
#
ax.scatter(mags[gd_mag], resid)
#
plt.show()
In [22]:
plt.clf()
ax=plt.gca()
#
ax.scatter(mags[gd_mag], np.array(s2n_dict['MEDIAN_SNR'])[gd_mag])
# Fit
xmag = np.linspace(17., 26., 100)
xval=10**(-0.4*(xmag-22.5))
yval = fitfunc(xval, *coeff)
ax.plot(xmag, yval, '--r')
#
#ax.set_ylim(5., 20.)
#
plt.show()
In [32]:
def fit_astro(flux, A, B):
return flux*A/np.sqrt(A*flux + B)
In [25]:
snr_norm = np.array(s2n_dict['MEDIAN_SNR'])[gd_mag] / exptime**(1/2)
In [29]:
flux = 10**(-0.4*(mags[gd_mag]-22.5))
In [43]:
popt, pcov = optimize.curve_fit(fit_astro, flux, snr_norm, p0=(0.02, 1.))
In [44]:
popt
Out[44]:
In [45]:
fit_snr = fit_astro(flux, *popt)
In [47]:
plt.clf()
ax=plt.gca()
#
ax.scatter(mags[gd_mag], np.array(s2n_dict['MEDIAN_SNR'])[gd_mag])
# Fit
xmag = np.linspace(17., 26., 100)
xval=10**(-0.4*(xmag-22.5))
yval = fit_astro(xval, *popt) * exptime**(1/2)
ax.plot(xmag, yval, '--r')
#
ax.set_xlim(18., 25.)
ax.set_ylim(-1., 15.)
#
plt.show()
In [38]:
coeff
Out[38]:
In [91]:
cframe_file = '/home/xavier/DESI/DESI_SCRATCH/19.9/spectro/redux/mini/exposures/20200319/00000031/cframe-r6-00000031.fits'
In [92]:
cframe = read_frame(cframe_file)
In [93]:
cframe.fibermap[0:5]
Out[93]:
In [94]:
params = read_params()
In [95]:
reload(qalib)
qadict = qalib.SNRFit(cframe, 'r6', params['qa']['s2n'])
In [22]:
np.array(s2n_dict['MAGNITUDES']).size
Out[22]:
In [21]:
np.array(s2n_dict['MEDIAN_SNR']).size
Out[21]: