189 gainDict, noiseDict, aDict, bDict, pdfPages):
190 """Plot covariances and models: Cov00, Cov10, Cov01.
192 Figs. 6 and 7 of Astier+19
196 mu : `dict`, [`str`, `list`]
197 Dictionary keyed by amp name with mean signal values.
199 covs : `dict`, [`str`, `list`]
200 Dictionary keyed by amp names containing a list of measued covariances per mean flux.
202 covsModel : `dict`, [`str`, `list`]
203 Dictionary keyed by amp names containinging covariances model (Eq. 20 of Astier+19) per mean flux.
205 covsWeights : `dict`, [`str`, `list`]
206 Dictionary keyed by amp names containinging sqrt. of covariances weights.
208 covsNoB : `dict`, [`str`, `list`]
209 Dictionary keyed by amp names containing a list of measued covariances per mean flux ('b'=0 in
212 covsModelNoB : `dict`, [`str`, `list`]
213 Dictionary keyed by amp names containing covariances model (with 'b'=0 in Eq. 20 of Astier+19)
216 covsWeightsNoB : `dict`, [`str`, `list`]
217 Dictionary keyed by amp names containing sqrt. of covariances weights ('b' = 0 in Eq. 20 of
220 gainDict : `dict`, [`str`, `float`]
221 Dictionary keyed by amp names containing the gains in e-/ADU.
223 noiseDict : `dict`, [`str`, `float`]
224 Dictionary keyed by amp names containing the rms redout noise in e-.
226 aDict : `dict`, [`str`, `numpy.array`]
227 Dictionary keyed by amp names containing 'a' coefficients (Eq. 20 of Astier+19).
229 bDict : `dict`, [`str`, `numpy.array`]
230 Dictionary keyed by amp names containing 'b' coefficients (Eq. 20 of Astier+19).
232 pdfPages: `matplotlib.backends.backend_pdf.PdfPages`
233 PDF file where the plots will be saved.
239 supTitleFontSize = 18
245 nRows = np.sqrt(nAmps)
246 mantissa, _ = np.modf(nRows)
248 nRows = int(nRows) + 1
254 f, ax = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
255 f2, ax2 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
256 fResCov00, axResCov00 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row',
258 fCov01, axCov01 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
259 fCov10, axCov10 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
261 assert(len(covsModel) == nAmps)
262 assert(len(covsWeights) == nAmps)
264 assert(len(covsNoB) == nAmps)
265 assert(len(covsModelNoB) == nAmps)
266 assert(len(covsWeightsNoB) == nAmps)
268 for i, (amp, a, a2, aResVar, a3, a4)
in enumerate(zip(covs, ax.flatten(),
269 ax2.flatten(), axResCov00.flatten(),
270 axCov01.flatten(), axCov10.flatten())):
272 muAmp, cov, model, weight = mu[amp], covs[amp], covsModel[amp], covsWeights[amp]
273 if not np.isnan(np.array(cov)).
all():
274 aCoeffs, bCoeffs = np.array(aDict[amp]), np.array(bDict[amp])
275 gain, noise = gainDict[amp], noiseDict[amp]
276 (meanVecFinal, varVecFinal, varVecModelFinal,
282 varWeightsFinal, len(meanVecFinal), 4)
284 (meanVecFinalCov01, varVecFinalCov01, varVecModelFinalCov01,
287 (meanVecFinalCov10, varVecFinalCov10, varVecModelFinalCov10,
291 par2 = np.polyfit(meanVecFinal, varVecFinal, 2, w=varWeightsFinal)
292 varModelFinalQuadratic = np.polyval(par2, meanVecFinal)
294 varWeightsFinal, len(meanVecFinal), 3)
297 covNoB, modelNoB, weightNoB = covsNoB[amp], covsModelNoB[amp], covsWeightsNoB[amp]
298 (meanVecFinalNoB, varVecFinalNoB, varVecModelFinalNoB,
300 weightNoB, returnMasked=
True)
303 varWeightsFinalNoB, len(meanVecFinalNoB),
305 stringLegend = (f
"Gain: {gain:.4} e/ADU \n"
306 f
"Noise: {noise:.4} e \n"
307 +
r"$a_{00}$: %.3e 1/e"%aCoeffs[0, 0] +
"\n"
308 +
r"$b_{00}$: %.3e 1/e"%bCoeffs[0, 0]
309 + f
"\nLast in fit: {meanVecFinal[-1]:.7} ADU ")
310 minMeanVecFinal = np.nanmin(meanVecFinal)
311 maxMeanVecFinal = np.nanmax(meanVecFinal)
312 deltaXlim = maxMeanVecFinal - minMeanVecFinal
314 a.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
315 a.set_ylabel(
r'Variance (ADU$^2$)', fontsize=labelFontSize)
316 a.tick_params(labelsize=11)
317 a.set_xscale(
'linear')
318 a.set_yscale(
'linear')
319 a.scatter(meanVecFinal, varVecFinal, c=
'blue', marker=
'o', s=markerSize)
320 a.plot(meanVecFinal, varVecModelFinal, color=
'red', lineStyle=
'-')
321 a.text(0.03, 0.7, stringLegend, transform=a.transAxes, fontsize=legendFontSize)
322 a.set_title(amp, fontsize=titleFontSize)
323 a.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
326 a2.set_xlabel(
r'Mean Signal ($\mu$, ADU)', fontsize=labelFontSize)
327 a2.set_ylabel(
r'Variance (ADU$^2$)', fontsize=labelFontSize)
328 a2.tick_params(labelsize=11)
331 a2.plot(meanVecFinal, varVecModelFinal, color=
'red', lineStyle=
'-')
332 a2.scatter(meanVecFinal, varVecFinal, c=
'blue', marker=
'o', s=markerSize)
333 a2.text(0.03, 0.7, stringLegend, transform=a2.transAxes, fontsize=legendFontSize)
334 a2.set_title(amp, fontsize=titleFontSize)
335 a2.set_xlim([minMeanVecFinal, maxMeanVecFinal])
338 aResVar.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
339 aResVar.set_ylabel(
r'Residuals (ADU$^2$)', fontsize=labelFontSize)
340 aResVar.tick_params(labelsize=11)
341 aResVar.set_xscale(
'linear')
342 aResVar.set_yscale(
'linear')
343 aResVar.plot(meanVecFinal, varVecFinal - varVecModelFinal, color=
'blue', lineStyle=
'-',
344 label=
r'Full fit ($\chi_{\rm{red}}^2$: %g)'%chi2FullModelVar)
345 aResVar.plot(meanVecFinal, varVecFinal - varModelFinalQuadratic, color=
'red', lineStyle=
'-',
346 label=
r'Quadratic fit ($\chi_{\rm{red}}^2$: %g)'%chi2QuadModelVar)
347 aResVar.plot(meanVecFinalNoB, varVecFinalNoB - varVecModelFinalNoB, color=
'green',
349 label=
r'Full fit (b=0) ($\chi_{\rm{red}}^2$: %g)'%chi2FullModelNoBVar)
350 aResVar.axhline(color=
'black')
351 aResVar.set_title(amp, fontsize=titleFontSize)
352 aResVar.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
353 aResVar.legend(fontsize=7)
355 a3.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
356 a3.set_ylabel(
r'Cov01 (ADU$^2$)', fontsize=labelFontSize)
357 a3.tick_params(labelsize=11)
358 a3.set_xscale(
'linear')
359 a3.set_yscale(
'linear')
360 a3.scatter(meanVecFinalCov01, varVecFinalCov01, c=
'blue', marker=
'o', s=markerSize)
361 a3.plot(meanVecFinalCov01, varVecModelFinalCov01, color=
'red', lineStyle=
'-')
362 a3.set_title(amp, fontsize=titleFontSize)
363 a3.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
365 a4.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
366 a4.set_ylabel(
r'Cov10 (ADU$^2$)', fontsize=labelFontSize)
367 a4.tick_params(labelsize=11)
368 a4.set_xscale(
'linear')
369 a4.set_yscale(
'linear')
370 a4.scatter(meanVecFinalCov10, varVecFinalCov10, c=
'blue', marker=
'o', s=markerSize)
371 a4.plot(meanVecFinalCov10, varVecModelFinalCov10, color=
'red', lineStyle=
'-')
372 a4.set_title(amp, fontsize=titleFontSize)
373 a4.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
376 a.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
377 a2.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
378 a3.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
379 a4.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
381 f.suptitle(
"PTC from covariances as in Astier+19 \n Fit: Eq. 20, Astier+19",
382 fontsize=supTitleFontSize)
384 f2.suptitle(
"PTC from covariances as in Astier+19 (log-log) \n Fit: Eq. 20, Astier+19",
385 fontsize=supTitleFontSize)
387 fResCov00.suptitle(
"Residuals (data-model) for Cov00 (Var)", fontsize=supTitleFontSize)
388 pdfPages.savefig(fResCov00)
389 fCov01.suptitle(
"Cov01 as in Astier+19 (nearest parallel neighbor covariance) \n"
390 " Fit: Eq. 20, Astier+19", fontsize=supTitleFontSize)
391 pdfPages.savefig(fCov01)
392 fCov10.suptitle(
"Cov10 as in Astier+19 (nearest serial neighbor covariance) \n"
393 "Fit: Eq. 20, Astier+19", fontsize=supTitleFontSize)
394 pdfPages.savefig(fCov10)
def getFitDataFromCovariances(i, j, mu, fullCov, fullCovModel, fullCovSqrtWeights, gain=1.0, divideByMu=False, returnMasked=False)
def calculateWeightedReducedChi2(measured, model, weightsMeasured, nData, nParsModel)