219 gainDict, noiseDict, aDict, bDict, pdfPages):
220 """Plot covariances and models: Cov00, Cov10, Cov01.
222 Figs. 6 and 7 of Astier+19
226 mu : `dict`, [`str`, `list`]
227 Dictionary keyed by amp name with mean signal values.
229 covs : `dict`, [`str`, `list`]
230 Dictionary keyed by amp names containing a list of measued covariances per mean flux.
232 covsModel : `dict`, [`str`, `list`]
233 Dictionary keyed by amp names containinging covariances model (Eq. 20 of Astier+19) per mean flux.
235 covsWeights : `dict`, [`str`, `list`]
236 Dictionary keyed by amp names containinging sqrt. of covariances weights.
238 covsNoB : `dict`, [`str`, `list`]
239 Dictionary keyed by amp names containing a list of measued covariances per mean flux ('b'=0 in
242 covsModelNoB : `dict`, [`str`, `list`]
243 Dictionary keyed by amp names containing covariances model (with 'b'=0 in Eq. 20 of Astier+19)
246 covsWeightsNoB : `dict`, [`str`, `list`]
247 Dictionary keyed by amp names containing sqrt. of covariances weights ('b' = 0 in Eq. 20 of
250 gainDict : `dict`, [`str`, `float`]
251 Dictionary keyed by amp names containing the gains in e-/ADU.
253 noiseDict : `dict`, [`str`, `float`]
254 Dictionary keyed by amp names containing the rms redout noise in e-.
256 aDict : `dict`, [`str`, `numpy.array`]
257 Dictionary keyed by amp names containing 'a' coefficients (Eq. 20 of Astier+19).
259 bDict : `dict`, [`str`, `numpy.array`]
260 Dictionary keyed by amp names containing 'b' coefficients (Eq. 20 of Astier+19).
262 pdfPages: `matplotlib.backends.backend_pdf.PdfPages`
263 PDF file where the plots will be saved.
269 supTitleFontSize = 18
275 nRows = np.sqrt(nAmps)
276 mantissa, _ = np.modf(nRows)
278 nRows = int(nRows) + 1
284 f, ax = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
285 f2, ax2 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
286 fResCov00, axResCov00 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row',
288 fCov01, axCov01 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
289 fCov10, axCov10 = plt.subplots(nrows=nRows, ncols=nCols, sharex=
'col', sharey=
'row', figsize=(13, 10))
291 assert(len(covsModel) == nAmps)
292 assert(len(covsWeights) == nAmps)
294 assert(len(covsNoB) == nAmps)
295 assert(len(covsModelNoB) == nAmps)
296 assert(len(covsWeightsNoB) == nAmps)
298 for i, (amp, a, a2, aResVar, a3, a4)
in enumerate(zip(covs, ax.flatten(),
299 ax2.flatten(), axResCov00.flatten(),
300 axCov01.flatten(), axCov10.flatten())):
302 muAmp, cov, model, weight = mu[amp], covs[amp], covsModel[amp], covsWeights[amp]
303 if not np.isnan(np.array(cov)).
all():
304 aCoeffs, bCoeffs = np.array(aDict[amp]), np.array(bDict[amp])
305 gain, noise = gainDict[amp], noiseDict[amp]
306 (meanVecFinal, varVecFinal, varVecModelFinal,
312 varWeightsFinal, len(meanVecFinal), 4)
314 (meanVecFinalCov01, varVecFinalCov01, varVecModelFinalCov01,
317 (meanVecFinalCov10, varVecFinalCov10, varVecModelFinalCov10,
321 par2 = np.polyfit(meanVecFinal, varVecFinal, 2, w=varWeightsFinal)
322 varModelFinalQuadratic = np.polyval(par2, meanVecFinal)
324 varWeightsFinal, len(meanVecFinal), 3)
327 covNoB, modelNoB, weightNoB = covsNoB[amp], covsModelNoB[amp], covsWeightsNoB[amp]
328 (meanVecFinalNoB, varVecFinalNoB, varVecModelFinalNoB,
330 weightNoB, returnMasked=
True)
333 varWeightsFinalNoB, len(meanVecFinalNoB),
335 stringLegend = (f
"Gain: {gain:.4} e/ADU \n"
336 f
"Noise: {noise:.4} e \n"
337 +
r"$a_{00}$: %.3e 1/e"%aCoeffs[0, 0] +
"\n"
338 +
r"$b_{00}$: %.3e 1/e"%bCoeffs[0, 0]
339 + f
"\nLast in fit: {meanVecFinal[-1]:.7} ADU ")
340 minMeanVecFinal = np.nanmin(meanVecFinal)
341 maxMeanVecFinal = np.nanmax(meanVecFinal)
342 deltaXlim = maxMeanVecFinal - minMeanVecFinal
344 a.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
345 a.set_ylabel(
r'Variance (ADU$^2$)', fontsize=labelFontSize)
346 a.tick_params(labelsize=11)
347 a.set_xscale(
'linear')
348 a.set_yscale(
'linear')
349 a.scatter(meanVecFinal, varVecFinal, c=
'blue', marker=
'o', s=markerSize)
350 a.plot(meanVecFinal, varVecModelFinal, color=
'red', linestyle=
'-')
351 a.text(0.03, 0.7, stringLegend, transform=a.transAxes, fontsize=legendFontSize)
352 a.set_title(amp, fontsize=titleFontSize)
353 a.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
356 a2.set_xlabel(
r'Mean Signal ($\mu$, ADU)', fontsize=labelFontSize)
357 a2.set_ylabel(
r'Variance (ADU$^2$)', fontsize=labelFontSize)
358 a2.tick_params(labelsize=11)
361 a2.plot(meanVecFinal, varVecModelFinal, color=
'red', linestyle=
'-')
362 a2.scatter(meanVecFinal, varVecFinal, c=
'blue', marker=
'o', s=markerSize)
363 a2.text(0.03, 0.7, stringLegend, transform=a2.transAxes, fontsize=legendFontSize)
364 a2.set_title(amp, fontsize=titleFontSize)
365 a2.set_xlim([minMeanVecFinal, maxMeanVecFinal])
368 aResVar.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
369 aResVar.set_ylabel(
r'Residuals (ADU$^2$)', fontsize=labelFontSize)
370 aResVar.tick_params(labelsize=11)
371 aResVar.set_xscale(
'linear')
372 aResVar.set_yscale(
'linear')
373 aResVar.plot(meanVecFinal, varVecFinal - varVecModelFinal, color=
'blue', linestyle=
'-',
374 label=
r'Full fit ($\chi_{\rm{red}}^2$: %g)'%chi2FullModelVar)
375 aResVar.plot(meanVecFinal, varVecFinal - varModelFinalQuadratic, color=
'red', linestyle=
'-',
376 label=
r'Quadratic fit ($\chi_{\rm{red}}^2$: %g)'%chi2QuadModelVar)
377 aResVar.plot(meanVecFinalNoB, varVecFinalNoB - varVecModelFinalNoB, color=
'green',
379 label=
r'Full fit (b=0) ($\chi_{\rm{red}}^2$: %g)'%chi2FullModelNoBVar)
380 aResVar.axhline(color=
'black')
381 aResVar.set_title(amp, fontsize=titleFontSize)
382 aResVar.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
383 aResVar.legend(fontsize=7)
385 a3.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
386 a3.set_ylabel(
r'Cov01 (ADU$^2$)', fontsize=labelFontSize)
387 a3.tick_params(labelsize=11)
388 a3.set_xscale(
'linear')
389 a3.set_yscale(
'linear')
390 a3.scatter(meanVecFinalCov01, varVecFinalCov01, c=
'blue', marker=
'o', s=markerSize)
391 a3.plot(meanVecFinalCov01, varVecModelFinalCov01, color=
'red', linestyle=
'-')
392 a3.set_title(amp, fontsize=titleFontSize)
393 a3.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
395 a4.set_xlabel(
r'Mean signal ($\mu$, ADU)', fontsize=labelFontSize)
396 a4.set_ylabel(
r'Cov10 (ADU$^2$)', fontsize=labelFontSize)
397 a4.tick_params(labelsize=11)
398 a4.set_xscale(
'linear')
399 a4.set_yscale(
'linear')
400 a4.scatter(meanVecFinalCov10, varVecFinalCov10, c=
'blue', marker=
'o', s=markerSize)
401 a4.plot(meanVecFinalCov10, varVecModelFinalCov10, color=
'red', linestyle=
'-')
402 a4.set_title(amp, fontsize=titleFontSize)
403 a4.set_xlim([minMeanVecFinal - 0.2*deltaXlim, maxMeanVecFinal + 0.2*deltaXlim])
406 a.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
407 a2.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
408 a3.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
409 a4.set_title(f
"{amp} (BAD)", fontsize=titleFontSize)
411 f.suptitle(
"PTC from covariances as in Astier+19 \n Fit: Eq. 20, Astier+19",
412 fontsize=supTitleFontSize)
414 f2.suptitle(
"PTC from covariances as in Astier+19 (log-log) \n Fit: Eq. 20, Astier+19",
415 fontsize=supTitleFontSize)
417 fResCov00.suptitle(
"Residuals (data-model) for Cov00 (Var)", fontsize=supTitleFontSize)
418 pdfPages.savefig(fResCov00)
419 fCov01.suptitle(
"Cov01 as in Astier+19 (nearest parallel neighbor covariance) \n"
420 " Fit: Eq. 20, Astier+19", fontsize=supTitleFontSize)
421 pdfPages.savefig(fCov01)
422 fCov10.suptitle(
"Cov10 as in Astier+19 (nearest serial neighbor covariance) \n"
423 "Fit: Eq. 20, Astier+19", fontsize=supTitleFontSize)
424 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)