212 def plotCovariances(mu, covs, covsModel, covsWeights, covsNoB, covsModelNoB, covsWeightsNoB,
213 gainDict, noiseDict, aDict, bDict, expIdMask, pdfPages):
214 """Plot covariances and models: Cov00, Cov10, Cov01.
216 Figs. 6 and 7 of Astier+19
220 mu : `dict`, [`str`, `list`]
221 Dictionary keyed by amp name with mean signal values.
223 covs : `dict`, [`str`, `list`]
224 Dictionary keyed by amp names containing a list of measued covariances per mean flux.
226 covsModel : `dict`, [`str`, `list`]
227 Dictionary keyed by amp names containinging covariances model (Eq. 20 of Astier+19) per mean flux.
229 covsWeights : `dict`, [`str`, `list`]
230 Dictionary keyed by amp names containinging sqrt. of covariances weights.
232 covsNoB : `dict`, [`str`, `list`]
233 Dictionary keyed by amp names containing a list of measued covariances per mean flux ('b'=0 in
236 covsModelNoB : `dict`, [`str`, `list`]
237 Dictionary keyed by amp names containing covariances model (with 'b'=0 in Eq. 20 of Astier+19)
240 covsWeightsNoB : `dict`, [`str`, `list`]
241 Dictionary keyed by amp names containing sqrt. of covariances weights ('b' = 0 in Eq. 20 of
244 gainDict : `dict`, [`str`, `float`]
245 Dictionary keyed by amp names containing the gains in e-/ADU.
247 noiseDict : `dict`, [`str`, `float`]
248 Dictionary keyed by amp names containing the rms redout noise in e-.
250 aDict : `dict`, [`str`, `numpy.array`]
251 Dictionary keyed by amp names containing 'a' coefficients (Eq. 20 of Astier+19).
253 bDict : `dict`, [`str`, `numpy.array`]
254 Dictionary keyed by amp names containing 'b' coefficients (Eq. 20 of Astier+19).
256 expIdMask : `dict`, [`str`, `list`]
257 Dictionary keyed by amp names containing the masked exposure pairs.
259 pdfPages: `matplotlib.backends.backend_pdf.PdfPages`
260 PDF file where the plots will be saved.
266 supTitleFontSize = 18
272 nRows = np.sqrt(nAmps)
273 mantissa, _ = np.modf(nRows)
275 nRows = int(nRows) + 1
281 f, ax = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
282 f2, ax2 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
283 fResCov00, axResCov00 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row',
285 fCov01, axCov01 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
286 fCov10, axCov10 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
288 assert(len(covsModel) == nAmps)
289 assert(len(covsWeights) == nAmps)
291 assert(len(covsNoB) == nAmps)
292 assert(len(covsModelNoB) == nAmps)
293 assert(len(covsWeightsNoB) == nAmps)
295 for i, (amp, a, a2, aResVar, a3, a4)
in enumerate(zip(covs, ax.flatten(),
296 ax2.flatten(), axResCov00.flatten(),
297 axCov01.flatten(), axCov10.flatten())):
299 muAmp, cov, model, weight = mu[amp], covs[amp], covsModel[amp], covsWeights[amp]
300 if not np.isnan(np.array(cov)).
all():
301 aCoeffs, bCoeffs = np.array(aDict[amp]), np.array(bDict[amp])
302 gain, noise = gainDict[amp], noiseDict[amp]
303 mask = expIdMask[amp]
305 (meanVecOriginal, varVecOriginal, varVecModelOriginal,
307 meanVecFinal, varVecFinal = meanVecOriginal[mask], varVecOriginal[mask]
308 varVecModelFinal = varVecModelOriginal[mask]
309 meanVecOutliers = meanVecOriginal[np.invert(mask)]
310 varVecOutliers = varVecOriginal[np.invert(mask)]
311 varWeightsFinal = weightsOriginal[mask]
314 varWeightsFinal, len(meanVecFinal), 4)
316 (meanVecOrigCov01, varVecOrigCov01, varVecModelOrigCov01,
318 meanVecFinalCov01, varVecFinalCov01 = meanVecOrigCov01[mask], varVecOrigCov01[mask]
319 varVecModelFinalCov01 = varVecModelOrigCov01[mask]
320 meanVecOutliersCov01 = meanVecOrigCov01[np.invert(mask)]
321 varVecOutliersCov01 = varVecOrigCov01[np.invert(mask)]
323 (meanVecOrigCov10, varVecOrigCov10, varVecModelOrigCov10,
325 meanVecFinalCov10, varVecFinalCov10 = meanVecOrigCov10[mask], varVecOrigCov10[mask]
326 varVecModelFinalCov10 = varVecModelOrigCov10[mask]
327 meanVecOutliersCov10 = meanVecOrigCov10[np.invert(mask)]
328 varVecOutliersCov10 = varVecOrigCov10[np.invert(mask)]
331 par2 = np.polyfit(meanVecFinal, varVecFinal, 2, w=varWeightsFinal)
332 varModelFinalQuadratic = np.polyval(par2, meanVecFinal)
334 varWeightsFinal, len(meanVecFinal), 3)
337 covNoB, modelNoB, weightNoB = covsNoB[amp], covsModelNoB[amp], covsWeightsNoB[amp]
338 (meanVecOriginalNoB, varVecOriginalNoB, varVecModelOriginalNoB,
342 meanVecFinalNoB, varVecFinalNoB, varVecModelFinalNoB, varWeightsFinalNoB = (
343 meanVecOriginalNoB[mask], varVecOriginalNoB[mask], varVecModelOriginalNoB[mask],
344 varWeightsOriginalNoB[mask])
347 varWeightsFinalNoB, len(meanVecFinalNoB),
349 stringLegend = (f
"Gain: {gain:.4} e/ADU \n" +
350 f
"Noise: {noise:.4} e \n" +
351 r"$a_{00}$: %.3e 1/e"%aCoeffs[0, 0] +
352 "\n" +
r"$b_{00}$: %.3e 1/e"%bCoeffs[0, 0] +
353 f
"\nLast in fit: {meanVecFinal[-1]:.7} ADU ")
354 minMeanVecFinal = np.nanmin(meanVecFinal)
355 maxMeanVecFinal = np.nanmax(meanVecFinal)
356 deltaXlim = maxMeanVecFinal - minMeanVecFinal
358 a.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
359 a.set_ylabel(
r'Variance (ADU$^2$)', fontsize=labelFontSize)
360 a.tick_params(labelsize=11)
361 a.set_xscale(
'linear', fontsize=labelFontSize)
362 a.set_yscale(
'linear', fontsize=labelFontSize)
363 a.scatter(meanVecFinal, varVecFinal, c=
'blue', marker=
'o', s=markerSize)
364 a.scatter(meanVecOutliers, varVecOutliers, c=
'magenta', marker=
's', s=markerSize)
365 a.plot(meanVecFinal, varVecModelFinal, color=
'red', lineStyle=
'-')
366 a.text(0.03, 0.7, stringLegend, transform=a.transAxes, fontsize=legendFontSize)
367 a.set_title(amp, fontsize=titleFontSize)
368 a.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
371 a2.set_xlabel(
r'Mean Signal ($\mu$, ADU)', fontsize=labelFontSize)
372 a2.set_ylabel(
r'Variance (ADU$^2$)', fontsize=labelFontSize)
373 a2.tick_params(labelsize=11)
376 a2.plot(meanVecFinal, varVecModelFinal, color=
'red', lineStyle=
'-')
377 a2.scatter(meanVecFinal, varVecFinal, c=
'blue', marker=
'o', s=markerSize)
378 a2.scatter(meanVecOutliers, varVecOutliers, c=
'magenta', marker=
's', s=markerSize)
379 a2.text(0.03, 0.7, stringLegend, transform=a2.transAxes, fontsize=legendFontSize)
380 a2.set_title(amp, fontsize=titleFontSize)
381 a2.set_xlim([minMeanVecFinal, maxMeanVecFinal])
384 aResVar.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
385 aResVar.set_ylabel(
r'Residuals (ADU$^2$)', fontsize=labelFontSize)
386 aResVar.tick_params(labelsize=11)
387 aResVar.set_xscale(
'linear', fontsize=labelFontSize)
388 aResVar.set_yscale(
'linear', fontsize=labelFontSize)
389 aResVar.plot(meanVecFinal, varVecFinal - varVecModelFinal, color=
'blue', lineStyle=
'-',
390 label=
r'Full fit ($\chi_{\rm{red}}^2$: %g)'%chi2FullModelVar)
391 aResVar.plot(meanVecFinal, varVecFinal - varModelFinalQuadratic, color=
'red', lineStyle=
'-',
392 label=
r'Quadratic fit ($\chi_{\rm{red}}^2$: %g)'%chi2QuadModelVar)
393 aResVar.plot(meanVecFinalNoB, varVecFinalNoB - varVecModelFinalNoB, color=
'green',
395 label=
r'Full fit (b=0) ($\chi_{\rm{red}}^2$: %g)'%chi2FullModelNoBVar)
396 aResVar.axhline(color=
'black')
397 aResVar.set_title(amp, fontsize=titleFontSize)
398 aResVar.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
399 aResVar.legend(fontsize=7)
401 a3.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
402 a3.set_ylabel(
r'Cov01 (ADU$^2$)', fontsize=labelFontSize)
403 a3.tick_params(labelsize=11)
404 a3.set_xscale(
'linear', fontsize=labelFontSize)
405 a3.set_yscale(
'linear', fontsize=labelFontSize)
406 a3.scatter(meanVecFinalCov01, varVecFinalCov01, c=
'blue', marker=
'o', s=markerSize)
407 a3.scatter(meanVecOutliersCov01, varVecOutliersCov01, c=
'magenta', marker=
's', s=markerSize)
408 a3.plot(meanVecFinalCov01, varVecModelFinalCov01, color=
'red', lineStyle=
'-')
409 a3.set_title(amp, fontsize=titleFontSize)
410 a3.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
412 a4.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
413 a4.set_ylabel(
r'Cov10 (ADU$^2$)', fontsize=labelFontSize)
414 a4.tick_params(labelsize=11)
415 a4.set_xscale(
'linear', fontsize=labelFontSize)
416 a4.set_yscale(
'linear', fontsize=labelFontSize)
417 a4.scatter(meanVecFinalCov10, varVecFinalCov10, c=
'blue', marker=
'o', s=markerSize)
418 a4.scatter(meanVecOutliersCov10, varVecOutliersCov10, c=
'magenta', marker=
's', s=markerSize)
419 a4.plot(meanVecFinalCov10, varVecModelFinalCov10, color=
'red', lineStyle=
'-')
420 a4.set_title(amp, fontsize=titleFontSize)
421 a4.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
424 a.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
425 a2.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
426 a3.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
427 a4.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
429 f.suptitle(
"PTC from covariances as in Astier+19 \n Fit: Eq. 20, Astier+19",
430 fontsize=supTitleFontSize)
432 f2.suptitle(
"PTC from covariances as in Astier+19 (log-log) \n Fit: Eq. 20, Astier+19",
433 fontsize=supTitleFontSize)
435 fResCov00.suptitle(
"Residuals (data-model) for Cov00 (Var)", fontsize=supTitleFontSize)
436 pdfPages.savefig(fResCov00)
437 fCov01.suptitle(
"Cov01 as in Astier+19 (nearest parallel neighbor covariance) \n" +
438 " Fit: Eq. 20, Astier+19", fontsize=supTitleFontSize)
439 pdfPages.savefig(fCov01)
440 fCov10.suptitle(
"Cov10 as in Astier+19 (nearest serial neighbor covariance) \n" +
441 "Fit: Eq. 20, Astier+19", fontsize=supTitleFontSize)
442 pdfPages.savefig(fCov10)