Coverage for tests/test_ptc.py: 8%
423 statements
« prev ^ index » next coverage.py v7.5.1, created at 2024-05-09 04:05 -0700
« prev ^ index » next coverage.py v7.5.1, created at 2024-05-09 04:05 -0700
1#!/usr/bin/env python
3#
4# LSST Data Management System
5#
6# Copyright 2008-2017 AURA/LSST.
7#
8# This product includes software developed by the
9# LSST Project (http://www.lsst.org/).
10#
11# This program is free software: you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation, either version 3 of the License, or
14# (at your option) any later version.
15#
16# This program is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19# GNU General Public License for more details.
20#
21# You should have received a copy of the LSST License Statement and
22# the GNU General Public License along with this program. If not,
23# see <https://www.lsstcorp.org/LegalNotices/>.
24#
25"""Test cases for cp_pipe."""
27import unittest
28import numpy as np
29import copy
30import tempfile
31import logging
33import lsst.utils
34import lsst.utils.tests
36import lsst.cp.pipe as cpPipe
37import lsst.ip.isr.isrMock as isrMock
38from lsst.ip.isr import PhotonTransferCurveDataset, PhotodiodeCalib
39from lsst.cp.pipe.utils import makeMockFlats
41from lsst.pipe.base import InMemoryDatasetHandle, TaskMetadata
44class FakeCamera(list):
45 def getName(self):
46 return "FakeCam"
49class PretendRef:
50 "A class to act as a mock exposure reference"
52 def __init__(self, exposure):
53 self.exp = exposure
55 def get(self, component=None):
56 if component == "visitInfo":
57 return self.exp.getVisitInfo()
58 elif component == "detector":
59 return self.exp.getDetector()
60 elif component == "metadata":
61 return self.exp.getMetadata()
62 else:
63 return self.exp
66class MeasurePhotonTransferCurveTaskTestCase(lsst.utils.tests.TestCase):
67 """A test case for the PTC tasks."""
69 def setUp(self):
70 self.defaultConfigExtract = (
71 cpPipe.ptc.PhotonTransferCurveExtractTask.ConfigClass()
72 )
73 self.defaultTaskExtract = cpPipe.ptc.PhotonTransferCurveExtractTask(
74 config=self.defaultConfigExtract
75 )
77 self.defaultConfigSolve = cpPipe.ptc.PhotonTransferCurveSolveTask.ConfigClass()
78 self.defaultTaskSolve = cpPipe.ptc.PhotonTransferCurveSolveTask(
79 config=self.defaultConfigSolve
80 )
82 self.flatMean = 2000
83 self.readNoiseAdu = 10
84 mockImageConfig = isrMock.IsrMock.ConfigClass()
86 # flatDrop is not really relevant as we replace the data
87 # but good to note it in case we change how this image is made
88 mockImageConfig.flatDrop = 0.99999
89 mockImageConfig.isTrimmed = True
91 self.flatExp1 = isrMock.FlatMock(config=mockImageConfig).run()
92 self.flatExp2 = self.flatExp1.clone()
93 (shapeY, shapeX) = self.flatExp1.getDimensions()
95 self.flatWidth = np.sqrt(self.flatMean) + self.readNoiseAdu
97 self.rng1 = np.random.RandomState(1984)
98 flatData1 = self.rng1.normal(self.flatMean, self.flatWidth, (shapeX, shapeY))
99 self.rng2 = np.random.RandomState(666)
100 flatData2 = self.rng2.normal(self.flatMean, self.flatWidth, (shapeX, shapeY))
102 self.flatExp1.image.array[:] = flatData1
103 self.flatExp2.image.array[:] = flatData2
105 # create fake PTC data to see if fit works, for one amp ('amp')
106 self.flux = 1000.0 # ADU/sec
107 self.timeVec = np.arange(1.0, 101.0, 5)
108 self.k2NonLinearity = -5e-6
109 # quadratic signal-chain non-linearity
110 muVec = self.flux * self.timeVec + self.k2NonLinearity * self.timeVec**2
111 self.gain = 0.75 # e-/ADU
112 self.c1 = 1.0 / self.gain
113 self.noiseSq = 2 * self.gain # 7.5 (e-)^2
114 self.a00 = -1.2e-6
115 self.c2 = -1.5e-6
116 self.c3 = -4.7e-12 # tuned so that it turns over for 200k mean
117 self.photoCharges = np.linspace(1e-8, 1e-5, len(self.timeVec))
119 self.ampNames = [
120 amp.getName() for amp in self.flatExp1.getDetector().getAmplifiers()
121 ]
122 self.dataset = PhotonTransferCurveDataset(self.ampNames, ptcFitType="PARTIAL")
123 self.covariancesSqrtWeights = {}
124 for (
125 ampName
126 ) in self.ampNames: # just the expTimes and means here - vars vary per function
127 self.dataset.rawExpTimes[ampName] = self.timeVec
128 self.dataset.rawMeans[ampName] = muVec
129 self.dataset.covariancesSqrtWeights[ampName] = np.zeros(
130 (1, self.dataset.covMatrixSide, self.dataset.covMatrixSide)
131 )
133 # ISR metadata
134 self.metadataContents = TaskMetadata()
135 self.metadataContents["isr"] = {}
136 # Overscan readout noise [in ADU]
137 for amp in self.ampNames:
138 self.metadataContents["isr"][f"RESIDUAL STDEV {amp}"] = (
139 np.sqrt(self.noiseSq) / self.gain
140 )
142 def test_covAstier(self):
143 """Test to check getCovariancesAstier
145 We check that the gain is the same as the imput gain from the
146 mock data, that the covariances via FFT (as it is in
147 MeasurePhotonTransferCurveTask when doCovariancesAstier=True)
148 are the same as calculated in real space, and that Cov[0, 0]
149 (i.e., the variances) are similar to the variances calculated
150 with the standard method (when doCovariancesAstier=false),
152 """
153 extractConfig = self.defaultConfigExtract
154 extractConfig.minNumberGoodPixelsForCovariance = 5000
155 extractConfig.detectorMeasurementRegion = "FULL"
156 extractConfig.doExtractPhotodiodeData = True
157 extractConfig.auxiliaryHeaderKeys = ["CCOBCURR", "CCDTEMP"]
158 extractTask = cpPipe.ptc.PhotonTransferCurveExtractTask(config=extractConfig)
160 solveConfig = self.defaultConfigSolve
161 solveConfig.ptcFitType = "FULLCOVARIANCE"
162 # Cut off the low-flux point which is a bad fit, and this
163 # also exercises this functionality and makes the tests
164 # run a lot faster.
165 solveConfig.minMeanSignal["ALL_AMPS"] = 2000.0
166 # Set the outlier fit threshold higher than the default appropriate
167 # for this test dataset.
168 solveConfig.maxSignalInitialPtcOutlierFit = 90000.0
169 solveTask = cpPipe.ptc.PhotonTransferCurveSolveTask(config=solveConfig)
171 inputGain = self.gain
173 muStandard, varStandard = {}, {}
174 expDict = {}
175 expIds = []
176 pdHandles = []
177 idCounter = 0
178 for i, expTime in enumerate(self.timeVec):
179 mockExp1, mockExp2 = makeMockFlats(
180 expTime,
181 gain=inputGain,
182 readNoiseElectrons=3,
183 expId1=idCounter,
184 expId2=idCounter + 1,
185 )
186 for mockExp in [mockExp1, mockExp2]:
187 md = mockExp.getMetadata()
188 # These values are chosen to be easily compared after
189 # processing for correct ordering.
190 md['CCOBCURR'] = float(idCounter)
191 md['CCDTEMP'] = float(idCounter + 1)
192 mockExp.setMetadata(md)
194 mockExpRef1 = PretendRef(mockExp1)
195 mockExpRef2 = PretendRef(mockExp2)
196 expDict[expTime] = ((mockExpRef1, idCounter), (mockExpRef2, idCounter + 1))
197 expIds.append(idCounter)
198 expIds.append(idCounter + 1)
199 for ampNumber, ampName in enumerate(self.ampNames):
200 # cov has (i, j, var, cov, npix)
201 (
202 im1Area,
203 im2Area,
204 imStatsCtrl,
205 mu1,
206 mu2,
207 ) = extractTask.getImageAreasMasksStats(mockExp1, mockExp2)
208 muDiff, varDiff, covAstier, rowMeanVariance = extractTask.measureMeanVarCov(
209 im1Area, im2Area, imStatsCtrl, mu1, mu2
210 )
211 muStandard.setdefault(ampName, []).append(muDiff)
212 varStandard.setdefault(ampName, []).append(varDiff)
214 # Make a photodiode dataset to integrate.
215 timeSamples = np.linspace(0, 20.0, 100)
216 currentSamples = np.zeros(100)
217 currentSamples[50] = -1.0*self.photoCharges[i]
219 pdCalib = PhotodiodeCalib(timeSamples=timeSamples, currentSamples=currentSamples)
220 pdCalib.currentScale = -1.0
221 pdCalib.integrationMethod = "CHARGE_SUM"
223 pdHandles.append(
224 InMemoryDatasetHandle(
225 pdCalib,
226 dataId={"exposure": idCounter},
227 )
228 )
229 pdHandles.append(
230 InMemoryDatasetHandle(
231 pdCalib,
232 dataId={"exposure": idCounter + 1},
233 )
234 )
235 idCounter += 2
237 resultsExtract = extractTask.run(
238 inputExp=expDict,
239 inputDims=expIds,
240 taskMetadata=[self.metadataContents for x in expIds],
241 inputPhotodiodeData=pdHandles,
242 )
244 # Force the last PTC dataset to have a NaN, and ensure that the
245 # task runs (DM-38029). This is a minor perturbation and does not
246 # affect the output comparison. Note that we use index -2 because
247 # these datasets are in pairs of [real, dummy] to match the inputs
248 # to the extract task.
249 resultsExtract.outputCovariances[-2].rawMeans["C:0,0"] = np.array([np.nan])
250 resultsExtract.outputCovariances[-2].rawVars["C:0,0"] = np.array([np.nan])
252 # Force the next-to-last PTC dataset to have a decreased variance to
253 # ensure that the outlier fit rejection works. Note that we use
254 # index -4 because these datasets are in pairs of [real, dummy] to
255 # match the inputs to the extract task.
256 rawVar = resultsExtract.outputCovariances[-4].rawVars["C:0,0"]
257 resultsExtract.outputCovariances[-4].rawVars["C:0,0"] = rawVar * 0.9
259 # Reorganize the outputCovariances so we can confirm they come
260 # out sorted afterwards.
261 outputCovariancesRev = resultsExtract.outputCovariances[::-1]
263 resultsSolve = solveTask.run(
264 outputCovariancesRev, camera=FakeCamera([self.flatExp1.getDetector()])
265 )
267 ptc = resultsSolve.outputPtcDataset
269 # Some expected values for noise matrix, just to check that
270 # it was calculated.
271 noiseMatrixNoBExpected = {
272 (0, 0): 6.53126505,
273 (1, 1): -23.20924747,
274 (2, 2): 35.69834113,
275 }
276 noiseMatrixExpected = {
277 (0, 0): 29.37146918,
278 (1, 1): -14.6849025,
279 (2, 2): 24.7328517,
280 }
282 noiseMatrixExpected = np.array(
283 [
284 [
285 29.37146918,
286 9.2760363,
287 -29.08907932,
288 33.65818827,
289 -52.65710984,
290 -18.5821773,
291 -46.26896286,
292 65.01049736,
293 ],
294 [
295 -3.62427987,
296 -14.6849025,
297 -46.55230305,
298 -1.30410627,
299 6.44903599,
300 18.11796075,
301 -22.72874074,
302 20.90219857,
303 ],
304 [
305 5.09203058,
306 -4.40097862,
307 24.7328517,
308 39.2847586,
309 -21.46132351,
310 8.12179783,
311 6.23585617,
312 -2.09949622,
313 ],
314 [
315 35.79204016,
316 -6.50205005,
317 3.37910363,
318 15.22335662,
319 -19.29035067,
320 9.66065941,
321 7.47510934,
322 20.25962845,
323 ],
324 [
325 -36.23187633,
326 -22.72307472,
327 16.29140749,
328 -13.09493835,
329 3.32091085,
330 52.4380977,
331 -8.06428902,
332 -22.66669839,
333 ],
334 [
335 -27.93122896,
336 15.37016686,
337 9.18835073,
338 -24.48892946,
339 8.14480304,
340 22.38983222,
341 22.36866891,
342 -0.38803439,
343 ],
344 [
345 17.13962665,
346 -28.33153763,
347 -17.79744334,
348 -18.57064463,
349 7.69408833,
350 8.48265396,
351 18.0447022,
352 -16.97496022,
353 ],
354 [
355 10.09078383,
356 -26.61613002,
357 10.48504889,
358 15.33196998,
359 -23.35165517,
360 -24.53098643,
361 -18.21201067,
362 17.40755051,
363 ],
364 ]
365 )
367 noiseMatrixNoBExpected = np.array(
368 [
369 [
370 6.53126505,
371 12.14827594,
372 -37.11919923,
373 41.18675353,
374 -85.1613845,
375 -28.45801954,
376 -61.24442999,
377 88.76480122,
378 ],
379 [
380 -4.64541165,
381 -23.20924747,
382 -66.08733987,
383 -0.87558055,
384 12.20111853,
385 24.84795549,
386 -34.92458788,
387 24.42745014,
388 ],
389 [
390 7.66734507,
391 -4.51403645,
392 35.69834113,
393 52.73693356,
394 -30.85044089,
395 10.86761771,
396 10.8503068,
397 -2.18908327,
398 ],
399 [
400 50.9901156,
401 -7.34803977,
402 5.33443765,
403 21.60899396,
404 -25.06129827,
405 15.14015505,
406 10.94263771,
407 29.23975515,
408 ],
409 [
410 -48.66912069,
411 -31.58003774,
412 21.81305735,
413 -13.08993444,
414 8.17275394,
415 74.85293723,
416 -11.18403252,
417 -31.7799437,
418 ],
419 [
420 -38.55206382,
421 22.92982676,
422 13.39861008,
423 -33.3307362,
424 8.65362238,
425 29.18775548,
426 31.78433947,
427 1.27923706,
428 ],
429 [
430 23.33663918,
431 -41.74105625,
432 -26.55920751,
433 -24.71611677,
434 12.13343146,
435 11.25763907,
436 21.79131019,
437 -26.579393,
438 ],
439 [
440 11.44334226,
441 -34.9759641,
442 13.96449509,
443 19.64121933,
444 -36.09794843,
445 -34.27205933,
446 -25.16574105,
447 23.80460972,
448 ],
449 ]
450 )
452 for amp in self.ampNames:
453 self.assertAlmostEqual(ptc.gain[amp], inputGain, places=2)
454 for v1, v2 in zip(varStandard[amp], ptc.finalVars[amp]):
455 self.assertAlmostEqual(v1 / v2, 1.0, places=1)
457 # Check that the PTC turnoff is correctly computed.
458 # This will be different for the C:0,0 amp.
459 if amp == "C:0,0":
460 self.assertAlmostEqual(ptc.ptcTurnoff[amp], ptc.rawMeans[ampName][-3])
461 else:
462 self.assertAlmostEqual(ptc.ptcTurnoff[amp], ptc.rawMeans[ampName][-1])
464 # Test that all the quantities are correctly ordered and have
465 # not accidentally been masked. We check every other output ([::2])
466 # because these datasets are in pairs of [real, dummy] to
467 # match the inputs to the extract task.
468 for i, extractPtc in enumerate(resultsExtract.outputCovariances[::2]):
469 self.assertFloatsAlmostEqual(
470 extractPtc.rawExpTimes[ampName][0],
471 ptc.rawExpTimes[ampName][i],
472 )
473 self.assertFloatsAlmostEqual(
474 extractPtc.rawMeans[ampName][0],
475 ptc.rawMeans[ampName][i],
476 )
477 self.assertFloatsAlmostEqual(
478 extractPtc.rawVars[ampName][0],
479 ptc.rawVars[ampName][i],
480 )
481 self.assertFloatsAlmostEqual(
482 extractPtc.photoCharges[ampName][0],
483 ptc.photoCharges[ampName][i],
484 )
485 self.assertFloatsAlmostEqual(
486 extractPtc.histVars[ampName][0],
487 ptc.histVars[ampName][i],
488 )
489 self.assertFloatsAlmostEqual(
490 extractPtc.histChi2Dofs[ampName][0],
491 ptc.histChi2Dofs[ampName][i],
492 )
493 self.assertFloatsAlmostEqual(
494 extractPtc.kspValues[ampName][0],
495 ptc.kspValues[ampName][i],
496 )
497 self.assertFloatsAlmostEqual(
498 extractPtc.covariances[ampName][0],
499 ptc.covariances[ampName][i],
500 )
501 self.assertFloatsAlmostEqual(
502 extractPtc.covariancesSqrtWeights[ampName][0],
503 ptc.covariancesSqrtWeights[ampName][i],
504 )
505 self.assertFloatsAlmostEqual(
506 ptc.noiseMatrix[ampName], noiseMatrixExpected, atol=1e-8, rtol=None
507 )
508 self.assertFloatsAlmostEqual(
509 ptc.noiseMatrixNoB[ampName],
510 noiseMatrixNoBExpected,
511 atol=1e-8,
512 rtol=None,
513 )
515 mask = ptc.getGoodPoints(amp)
517 values = (
518 ptc.covariancesModel[amp][mask, 0, 0] - ptc.covariances[amp][mask, 0, 0]
519 ) / ptc.covariancesModel[amp][mask, 0, 0]
520 np.testing.assert_array_less(np.abs(values), 2e-3)
522 values = (
523 ptc.covariancesModel[amp][mask, 1, 1] - ptc.covariances[amp][mask, 1, 1]
524 ) / ptc.covariancesModel[amp][mask, 1, 1]
525 np.testing.assert_array_less(np.abs(values), 0.2)
527 values = (
528 ptc.covariancesModel[amp][mask, 1, 2] - ptc.covariances[amp][mask, 1, 2]
529 ) / ptc.covariancesModel[amp][mask, 1, 2]
530 np.testing.assert_array_less(np.abs(values), 0.2)
532 # And test that the auxiliary values are there and correctly ordered.
533 self.assertIn('CCOBCURR', ptc.auxValues)
534 self.assertIn('CCDTEMP', ptc.auxValues)
535 firstExpIds = np.array([i for i, _ in ptc.inputExpIdPairs['C:0,0']], dtype=np.float64)
536 self.assertFloatsAlmostEqual(ptc.auxValues['CCOBCURR'], firstExpIds)
537 self.assertFloatsAlmostEqual(ptc.auxValues['CCDTEMP'], firstExpIds + 1)
539 expIdsUsed = ptc.getExpIdsUsed("C:0,0")
540 # Check that these are the same as the inputs, paired up, with the
541 # first two (low flux) and final four (outliers, nans) removed.
542 self.assertTrue(
543 np.all(expIdsUsed == np.array(expIds).reshape(len(expIds) // 2, 2)[1:-2])
544 )
546 goodAmps = ptc.getGoodAmps()
547 self.assertEqual(goodAmps, self.ampNames)
549 # Check that every possibly modified field has the same length.
550 covShape = None
551 covSqrtShape = None
552 covModelShape = None
553 covModelNoBShape = None
555 for ampName in self.ampNames:
556 if covShape is None:
557 covShape = ptc.covariances[ampName].shape
558 covSqrtShape = ptc.covariancesSqrtWeights[ampName].shape
559 covModelShape = ptc.covariancesModel[ampName].shape
560 covModelNoBShape = ptc.covariancesModelNoB[ampName].shape
561 else:
562 self.assertEqual(ptc.covariances[ampName].shape, covShape)
563 self.assertEqual(
564 ptc.covariancesSqrtWeights[ampName].shape, covSqrtShape
565 )
566 self.assertEqual(ptc.covariancesModel[ampName].shape, covModelShape)
567 self.assertEqual(
568 ptc.covariancesModelNoB[ampName].shape, covModelNoBShape
569 )
571 # And check that this is serializable
572 with tempfile.NamedTemporaryFile(suffix=".fits") as f:
573 usedFilename = ptc.writeFits(f.name)
574 fromFits = PhotonTransferCurveDataset.readFits(usedFilename)
575 self.assertEqual(fromFits, ptc)
577 def ptcFitAndCheckPtc(
578 self,
579 order=None,
580 fitType=None,
581 doFitBootstrap=False,
582 doLegacy=False,
583 ):
584 localDataset = copy.deepcopy(self.dataset)
585 localDataset.ptcFitType = fitType
586 configSolve = copy.copy(self.defaultConfigSolve)
587 if doFitBootstrap:
588 configSolve.doFitBootstrap = True
590 configSolve.doLegacyTurnoffSelection = doLegacy
592 if fitType == "POLYNOMIAL":
593 if order not in [2, 3]:
594 RuntimeError("Enter a valid polynomial order for this test: 2 or 3")
595 if order == 2:
596 for ampName in self.ampNames:
597 localDataset.rawVars[ampName] = [
598 self.noiseSq + self.c1 * mu + self.c2 * mu**2
599 for mu in localDataset.rawMeans[ampName]
600 ]
601 configSolve.polynomialFitDegree = 2
602 if order == 3:
603 for ampName in self.ampNames:
604 localDataset.rawVars[ampName] = [
605 self.noiseSq
606 + self.c1 * mu
607 + self.c2 * mu**2
608 + self.c3 * mu**3
609 for mu in localDataset.rawMeans[ampName]
610 ]
611 configSolve.polynomialFitDegree = 3
612 elif fitType == "EXPAPPROXIMATION":
613 g = self.gain
614 for ampName in self.ampNames:
615 localDataset.rawVars[ampName] = [
616 (
617 0.5 / (self.a00 * g**2) * (np.exp(2 * self.a00 * mu * g) - 1)
618 + self.noiseSq / (g * g)
619 )
620 for mu in localDataset.rawMeans[ampName]
621 ]
622 else:
623 raise RuntimeError(
624 "Enter a fit function type: 'POLYNOMIAL' or 'EXPAPPROXIMATION'"
625 )
627 # Initialize mask and covariance weights that will be used in fits.
628 # Covariance weights values empirically determined from one of
629 # the cases in test_covAstier.
630 matrixSize = localDataset.covMatrixSide
631 maskLength = len(localDataset.rawMeans[ampName])
632 for ampName in self.ampNames:
633 localDataset.expIdMask[ampName] = np.repeat(True, maskLength)
634 localDataset.covariancesSqrtWeights[ampName] = np.repeat(
635 np.ones((matrixSize, matrixSize)), maskLength
636 ).reshape((maskLength, matrixSize, matrixSize))
637 localDataset.covariancesSqrtWeights[ampName][:, 0, 0] = [
638 0.07980188,
639 0.01339653,
640 0.0073118,
641 0.00502802,
642 0.00383132,
643 0.00309475,
644 0.00259572,
645 0.00223528,
646 0.00196273,
647 0.00174943,
648 0.00157794,
649 0.00143707,
650 0.00131929,
651 0.00121935,
652 0.0011334,
653 0.00105893,
654 0.00099357,
655 0.0009358,
656 0.00088439,
657 0.00083833,
658 ]
660 solveTask = cpPipe.ptc.PhotonTransferCurveSolveTask(config=configSolve)
662 localDataset = solveTask.fitMeasurementsToModel(localDataset)
664 # check entries in localDataset, which was modified by the function
665 for ampName in self.ampNames:
666 self.assertEqual(fitType, localDataset.ptcFitType)
667 self.assertAlmostEqual(self.gain, localDataset.gain[ampName])
668 if fitType == "POLYNOMIAL":
669 self.assertAlmostEqual(self.c1, localDataset.ptcFitPars[ampName][1])
670 self.assertAlmostEqual(
671 np.sqrt(self.noiseSq) * self.gain, localDataset.noise[ampName]
672 )
673 if fitType == "EXPAPPROXIMATION":
674 self.assertAlmostEqual(
675 self.a00, localDataset.ptcFitPars[ampName][0]
676 )
677 # noise already in electrons for 'EXPAPPROXIMATION' fit
678 self.assertAlmostEqual(
679 np.sqrt(self.noiseSq), localDataset.noise[ampName]
680 )
682 def test_lsstcam_samples(self):
683 for dense in [False, True]:
684 for mode in ["normal", "upturn", "dip"]:
685 rawMeans, rawVars, ptcTurnoff = self._getSampleMeanAndVar(dense=dense, mode=mode)
687 # We only need a single amp.
688 ampName = self.ampNames[0]
689 dataset = PhotonTransferCurveDataset([ampName], ptcFitType="EXPAPPROXIMATION")
690 dataset.rawExpTimes[ampName] = np.arange(len(rawMeans), dtype=np.float64) + 1.0
691 dataset.rawMeans[ampName] = rawMeans
692 dataset.rawVars[ampName] = rawVars
693 dataset.covariancesSqrtWeights[ampName] = np.repeat(
694 np.ones((dataset.covMatrixSide, dataset.covMatrixSide)), len(rawMeans)
695 ).reshape((len(rawMeans), dataset.covMatrixSide, dataset.covMatrixSide))
696 dataset.covariancesSqrtWeights[ampName][:, 0, 0] = np.sqrt(rawVars)
697 mask = np.ones(len(rawMeans), dtype=np.bool_)
698 mask[~np.isfinite(rawMeans) | ~np.isfinite(rawVars)] = False
699 dataset.expIdMask[ampName] = mask
701 configSolve = copy.copy(self.defaultConfigSolve)
702 configSolve.doFitBootstrap = False
703 configSolve.doLegacyTurnoffSelection = False
705 solveTask = cpPipe.ptc.PhotonTransferCurveSolveTask(config=configSolve)
707 solvedDataset = solveTask.fitMeasurementsToModel(dataset)
709 # Check that the ptcTurnoff is what is expected.
710 self.assertFloatsAlmostEqual(
711 solvedDataset.ptcTurnoff[ampName],
712 ptcTurnoff,
713 msg=f"Dense: {dense}; Mode: {mode}",
714 )
716 # Check that no values above the turnoff are "good".
717 above = (solvedDataset.finalMeans[ampName] > solvedDataset.ptcTurnoff[ampName])
718 self.assertEqual(np.sum(above), 0, msg=f"Dense: {dense}; Mode: {mode}")
720 # Check the sampling error on the turnoff.
721 last = np.where(np.isfinite(solvedDataset.finalMeans[ampName]))[0][-1]
722 samplingError = (rawMeans[last + 1] - rawMeans[last - 1])/2.
723 self.assertFloatsAlmostEqual(
724 solvedDataset.ptcTurnoffSamplingError[ampName],
725 samplingError,
726 msg=f"Dense: {dense}; Mode: {mode}",
727 )
729 def test_ptcFit(self):
730 for doLegacy in [False, True]:
731 for fitType, order in [
732 ("POLYNOMIAL", 2),
733 ("POLYNOMIAL", 3),
734 ("EXPAPPROXIMATION", None),
735 ]:
736 self.ptcFitAndCheckPtc(
737 fitType=fitType,
738 order=order,
739 doLegacy=doLegacy,
740 )
742 def test_meanVarMeasurement(self):
743 task = self.defaultTaskExtract
744 im1Area, im2Area, imStatsCtrl, mu1, mu2 = task.getImageAreasMasksStats(
745 self.flatExp1, self.flatExp2
746 )
747 mu, varDiff, _, _ = task.measureMeanVarCov(im1Area, im2Area, imStatsCtrl, mu1, mu2)
749 self.assertLess(self.flatWidth - np.sqrt(varDiff), 1)
750 self.assertLess(self.flatMean - mu, 1)
752 def test_meanVarMeasurementWithNans(self):
753 task = self.defaultTaskExtract
755 flatExp1 = self.flatExp1.clone()
756 flatExp2 = self.flatExp2.clone()
758 flatExp1.image.array[20:30, :] = np.nan
759 flatExp2.image.array[20:30, :] = np.nan
761 im1Area, im2Area, imStatsCtrl, mu1, mu2 = task.getImageAreasMasksStats(
762 flatExp1, flatExp2
763 )
764 mu, varDiff, _, _ = task.measureMeanVarCov(im1Area, im2Area, imStatsCtrl, mu1, mu2)
766 expectedMu1 = np.nanmean(flatExp1.image.array)
767 expectedMu2 = np.nanmean(flatExp2.image.array)
768 expectedMu = 0.5 * (expectedMu1 + expectedMu2)
770 # Now the variance of the difference. First, create the diff image.
771 im1 = flatExp1.maskedImage
772 im2 = flatExp2.maskedImage
774 temp = im2.clone()
775 temp *= expectedMu1
776 diffIm = im1.clone()
777 diffIm *= expectedMu2
778 diffIm -= temp
779 diffIm /= expectedMu
781 # Divide by two as it is what measureMeanVarCov returns
782 # (variance of difference)
783 expectedVar = 0.5 * np.nanvar(diffIm.image.array)
785 # Check that the standard deviations and the emans agree to
786 # less than 1 ADU
787 self.assertLess(np.sqrt(expectedVar) - np.sqrt(varDiff), 1)
788 self.assertLess(expectedMu - mu, 1)
790 def test_meanVarMeasurementAllNan(self):
791 task = self.defaultTaskExtract
792 flatExp1 = self.flatExp1.clone()
793 flatExp2 = self.flatExp2.clone()
795 flatExp1.image.array[:, :] = np.nan
796 flatExp2.image.array[:, :] = np.nan
798 im1Area, im2Area, imStatsCtrl, mu1, mu2 = task.getImageAreasMasksStats(
799 flatExp1, flatExp2
800 )
801 mu, varDiff, covDiff, rowMeanVariance = task.measureMeanVarCov(
802 im1Area, im2Area, imStatsCtrl, mu1, mu2
803 )
805 self.assertTrue(np.isnan(mu))
806 self.assertTrue(np.isnan(varDiff))
807 self.assertTrue(covDiff is None)
808 self.assertTrue(np.isnan(rowMeanVariance))
810 def test_meanVarMeasurementTooFewPixels(self):
811 task = self.defaultTaskExtract
812 flatExp1 = self.flatExp1.clone()
813 flatExp2 = self.flatExp2.clone()
815 flatExp1.image.array[0:190, :] = np.nan
816 flatExp2.image.array[0:190, :] = np.nan
818 bit = flatExp1.mask.getMaskPlaneDict()["NO_DATA"]
819 flatExp1.mask.array[0:190, :] &= 2**bit
820 flatExp2.mask.array[0:190, :] &= 2**bit
822 im1Area, im2Area, imStatsCtrl, mu1, mu2 = task.getImageAreasMasksStats(
823 flatExp1, flatExp2
824 )
825 with self.assertLogs(level=logging.WARNING) as cm:
826 mu, varDiff, covDiff, rowMeanVariance = task.measureMeanVarCov(
827 im1Area, im2Area, imStatsCtrl, mu1, mu2
828 )
829 self.assertIn("Number of good points", cm.output[0])
831 self.assertTrue(np.isnan(mu))
832 self.assertTrue(np.isnan(varDiff))
833 self.assertTrue(covDiff is None)
834 self.assertTrue(np.isnan(rowMeanVariance))
836 def test_meanVarMeasurementTooNarrowStrip(self):
837 # We need a new config to make sure the second covariance cut is
838 # triggered.
839 config = cpPipe.ptc.PhotonTransferCurveExtractTask.ConfigClass()
840 config.minNumberGoodPixelsForCovariance = 10
841 task = cpPipe.ptc.PhotonTransferCurveExtractTask(config=config)
842 flatExp1 = self.flatExp1.clone()
843 flatExp2 = self.flatExp2.clone()
845 flatExp1.image.array[0:195, :] = np.nan
846 flatExp2.image.array[0:195, :] = np.nan
847 flatExp1.image.array[:, 0:195] = np.nan
848 flatExp2.image.array[:, 0:195] = np.nan
850 bit = flatExp1.mask.getMaskPlaneDict()["NO_DATA"]
851 flatExp1.mask.array[0:195, :] &= 2**bit
852 flatExp2.mask.array[0:195, :] &= 2**bit
853 flatExp1.mask.array[:, 0:195] &= 2**bit
854 flatExp2.mask.array[:, 0:195] &= 2**bit
856 im1Area, im2Area, imStatsCtrl, mu1, mu2 = task.getImageAreasMasksStats(
857 flatExp1, flatExp2
858 )
859 with self.assertLogs(level=logging.WARNING) as cm:
860 mu, varDiff, covDiff, rowMeanVariance = task.measureMeanVarCov(
861 im1Area, im2Area, imStatsCtrl, mu1, mu2
862 )
863 self.assertIn("Not enough pixels", cm.output[0])
865 self.assertTrue(np.isnan(mu))
866 self.assertTrue(np.isnan(varDiff))
867 self.assertTrue(covDiff is None)
868 self.assertTrue(np.isnan(rowMeanVariance))
870 def test_makeZeroSafe(self):
871 noZerosArray = [1.0, 20, -35, 45578.98, 90.0, 897, 659.8]
872 someZerosArray = [1.0, 20, 0, 0, 90, 879, 0]
873 allZerosArray = [0.0, 0.0, 0, 0, 0.0, 0, 0]
875 substituteValue = 1e-10
877 expectedSomeZerosArray = [
878 1.0,
879 20,
880 substituteValue,
881 substituteValue,
882 90,
883 879,
884 substituteValue,
885 ]
886 expectedAllZerosArray = np.repeat(substituteValue, len(allZerosArray))
888 measuredSomeZerosArray = self.defaultTaskSolve._makeZeroSafe(
889 someZerosArray, substituteValue=substituteValue
890 )
891 measuredAllZerosArray = self.defaultTaskSolve._makeZeroSafe(
892 allZerosArray, substituteValue=substituteValue
893 )
894 measuredNoZerosArray = self.defaultTaskSolve._makeZeroSafe(
895 noZerosArray, substituteValue=substituteValue
896 )
898 for exp, meas in zip(expectedSomeZerosArray, measuredSomeZerosArray):
899 self.assertEqual(exp, meas)
900 for exp, meas in zip(expectedAllZerosArray, measuredAllZerosArray):
901 self.assertEqual(exp, meas)
902 for exp, meas in zip(noZerosArray, measuredNoZerosArray):
903 self.assertEqual(exp, meas)
905 def test_getInitialGoodPoints(self):
906 xs = [1, 2, 3, 4, 5, 6]
907 ys = [2 * x for x in xs]
908 points = self.defaultTaskSolve._getInitialGoodPoints(
909 xs, ys, minVarPivotSearch=0.0, consecutivePointsVarDecreases=2
910 )
911 assert np.all(points) == np.all(np.array([True for x in xs]))
913 ys[4] = 7 # Variance decreases in two consecutive points after ys[3]=8
914 ys[5] = 6
915 points = self.defaultTaskSolve._getInitialGoodPoints(
916 xs, ys, minVarPivotSearch=0.0, consecutivePointsVarDecreases=2
917 )
918 assert np.all(points) == np.all(np.array([True, True, True, True, False]))
920 def runGetGainFromFlatPair(self, correctionType="NONE"):
921 extractConfig = self.defaultConfigExtract
922 extractConfig.gainCorrectionType = correctionType
923 extractConfig.minNumberGoodPixelsForCovariance = 5000
924 extractTask = cpPipe.ptc.PhotonTransferCurveExtractTask(config=extractConfig)
926 expDict = {}
927 expIds = []
928 idCounter = 0
929 inputGain = self.gain # 1.5 e/ADU
930 for expTime in self.timeVec:
931 # Approximation works better at low flux, e.g., < 10000 ADU
932 mockExp1, mockExp2 = makeMockFlats(
933 expTime,
934 gain=inputGain,
935 readNoiseElectrons=np.sqrt(self.noiseSq),
936 fluxElectrons=100,
937 expId1=idCounter,
938 expId2=idCounter + 1,
939 )
940 mockExpRef1 = PretendRef(mockExp1)
941 mockExpRef2 = PretendRef(mockExp2)
942 expDict[expTime] = ((mockExpRef1, idCounter), (mockExpRef2, idCounter + 1))
943 expIds.append(idCounter)
944 expIds.append(idCounter + 1)
945 idCounter += 2
947 resultsExtract = extractTask.run(
948 inputExp=expDict,
949 inputDims=expIds,
950 taskMetadata=[self.metadataContents for x in expIds],
951 )
952 for exposurePair in resultsExtract.outputCovariances:
953 for ampName in self.ampNames:
954 if exposurePair.gain[ampName] is np.nan:
955 continue
956 self.assertAlmostEqual(
957 exposurePair.gain[ampName], inputGain, delta=0.04
958 )
960 def test_getGainFromFlatPair(self):
961 for gainCorrectionType in [
962 "NONE",
963 "SIMPLE",
964 "FULL",
965 ]:
966 self.runGetGainFromFlatPair(gainCorrectionType)
968 def test_ptcFitBootstrap(self):
969 """Test the bootstrap fit option for the PTC"""
970 for (fitType, order) in [('POLYNOMIAL', 2), ('POLYNOMIAL', 3), ('EXPAPPROXIMATION', None)]:
971 self.ptcFitAndCheckPtc(fitType=fitType, order=order, doFitBootstrap=True)
973 def _getSampleMeanAndVar(self, dense=False, mode="normal"):
974 """Get sample mean/var vectors and ptcTurnoff from LSSTCam data.
976 The ptcTurnoff values here were obtained by looking at the data
977 and what the code does. These may be changed in the future if
978 we decide on a different way of computing the turnoff.
980 Parameters
981 ----------
982 dense : `bool`, optional
983 Return a dense PTC?
984 mode : `str`, optional
985 The ptc type, should be "normal", "upturn", or "dip".
987 Returns
988 -------
989 rawMeans : `np.ndarray`
990 Array of raw mean values.
991 rawVars : `np.ndarray`
992 Array of raw variance values.
993 ptcTurnoff : `float`
994 PTC turnoff determined from fitting by eye.
995 """
996 if dense and mode == "normal":
997 # Taken from dense run 13591, detector 94, amplifier C02
998 ptcTurnoff = 92239.4794
999 rawMeans = np.array([
1000 3.72806883e+01, 3.86850679e+01, 4.09319941e+01, 4.30288886e+01,
1001 4.59546561e+01, 4.77510985e+01, 5.06130505e+01, 5.35060747e+01,
1002 5.61016577e+01, 5.95244630e+01, 6.21722799e+01, 6.59958508e+01,
1003 7.32513785e+01, 7.91695151e+01, 8.19214651e+01, 8.66175502e+01,
1004 9.06656207e+01, 9.57917501e+01, 1.00925700e+02, 1.07661026e+02,
1005 1.12211207e+02, 1.18038278e+02, 1.24776787e+02, 1.33127394e+02,
1006 1.39086972e+02, 1.47962442e+02, 1.55007859e+02, 1.64972119e+02,
1007 1.72224552e+02, 1.81663660e+02, 1.92083706e+02, 2.01818483e+02,
1008 2.12893098e+02, 2.25865898e+02, 2.36777769e+02, 2.50805751e+02,
1009 2.63582968e+02, 2.78848126e+02, 2.93430577e+02, 3.10974538e+02,
1010 3.28617662e+02, 3.44447122e+02, 3.63779087e+02, 3.85447934e+02,
1011 4.04865571e+02, 4.26619625e+02, 4.50642349e+02, 4.75572605e+02,
1012 5.00924590e+02, 5.29463072e+02, 5.56894775e+02, 5.89400667e+02,
1013 6.22194672e+02, 6.55411968e+02, 6.90233178e+02, 7.28617776e+02,
1014 7.70386654e+02, 8.11275732e+02, 8.56899058e+02, 9.04075885e+02,
1015 9.53041280e+02, 1.00428165e+03, 1.05984066e+03, 1.11936964e+03,
1016 1.17993499e+03, 1.24493657e+03, 1.31333429e+03, 1.38477571e+03,
1017 1.46288220e+03, 1.54131684e+03, 1.62718454e+03, 1.71685496e+03,
1018 1.91104434e+03, 1.91128408e+03, 2.01496942e+03, 2.01510504e+03,
1019 2.12643136e+03, 2.12665024e+03, 2.24351981e+03, 2.36534141e+03,
1020 2.49658670e+03, 2.77859948e+03, 2.92932915e+03, 3.21897902e+03,
1021 3.39732732e+03, 3.58413491e+03, 3.78057120e+03, 3.98731229e+03,
1022 4.20691253e+03, 4.43947873e+03, 4.68353906e+03, 4.94068272e+03,
1023 5.20957520e+03, 5.21201592e+03, 5.49832249e+03, 5.80143284e+03,
1024 6.12091976e+03, 6.81333865e+03, 7.18560833e+03, 7.76381518e+03,
1025 8.33998116e+03, 8.91777512e+03, 9.49514657e+03, 1.00697547e+04,
1026 1.06495655e+04, 1.12197718e+04, 1.18024551e+04, 1.23803888e+04,
1027 1.29546730e+04, 1.35302383e+04, 1.41095292e+04, 1.46864242e+04,
1028 1.52554127e+04, 1.58424382e+04, 1.64174609e+04, 1.69934436e+04,
1029 1.75654540e+04, 1.81523967e+04, 1.87298339e+04, 1.93014337e+04,
1030 2.04450305e+04, 2.10377447e+04, 2.16102067e+04, 2.16123196e+04,
1031 2.21851791e+04, 2.21921696e+04, 2.33433082e+04, 2.39171545e+04,
1032 2.44958327e+04, 2.50717007e+04, 2.56486425e+04, 2.62185599e+04,
1033 2.68048566e+04, 2.73814219e+04, 2.79519282e+04, 2.85325879e+04,
1034 2.91077169e+04, 2.96844973e+04, 3.02554411e+04, 3.14125545e+04,
1035 3.25683638e+04, 3.31324135e+04, 3.33243063e+04, 3.38868072e+04,
1036 3.44574798e+04, 3.50295131e+04, 3.55959947e+04, 3.61681182e+04,
1037 3.67288051e+04, 3.73019527e+04, 3.78659087e+04, 3.84175071e+04,
1038 3.90035052e+04, 3.95715617e+04, 4.06979100e+04, 4.12778387e+04,
1039 4.18444142e+04, 4.24067921e+04, 4.29743477e+04, 4.35479754e+04,
1040 4.41086362e+04, 4.46748906e+04, 4.57912581e+04, 4.63620286e+04,
1041 4.69293084e+04, 4.80512660e+04, 4.86149041e+04, 4.91798146e+04,
1042 5.03083769e+04, 5.08678825e+04, 5.14329108e+04, 5.20101245e+04,
1043 5.25674618e+04, 5.31040686e+04, 5.36908774e+04, 5.42697605e+04,
1044 5.47843148e+04, 5.53743324e+04, 5.59452125e+04, 5.70753786e+04,
1045 5.76356662e+04, 5.81990397e+04, 5.87644952e+04, 5.98894309e+04,
1046 6.04630169e+04, 6.10270338e+04, 6.15960865e+04, 6.21427559e+04,
1047 6.27197146e+04, 6.32781202e+04, 6.38170695e+04, 6.44264810e+04,
1048 6.49720024e+04, 6.55524996e+04, 6.66814853e+04, 6.72313467e+04,
1049 6.78274362e+04, 6.83859289e+04, 6.89427312e+04, 6.95198678e+04,
1050 7.00847030e+04, 7.06620283e+04, 7.12327432e+04, 7.17769841e+04,
1051 7.23610736e+04, 7.29237272e+04, 7.34938353e+04, 7.40400864e+04,
1052 7.46399787e+04, 7.52085787e+04, 7.57175033e+04, 7.63346271e+04,
1053 7.69141477e+04, 7.74690838e+04, 7.80403707e+04, 7.85672045e+04,
1054 7.91728742e+04, 7.97519543e+04, 8.03063026e+04, 8.08869068e+04,
1055 8.14577271e+04, 8.20105730e+04, 8.25824739e+04, 8.31490218e+04,
1056 8.37308110e+04, 8.42758180e+04, 8.48493221e+04, 8.54126656e+04,
1057 8.59826959e+04, 8.65501659e+04, 8.70696403e+04, 8.76932979e+04,
1058 8.82464074e+04, 8.93795020e+04, 8.99537321e+04, 9.05097100e+04,
1059 9.10881246e+04, 9.22394794e+04, 9.27870984e+04, 9.33315296e+04,
1060 9.39230922e+04, 9.44926266e+04, 9.56192429e+04, 9.61483057e+04,
1061 9.72621754e+04, 9.78325850e+04, 9.83972793e+04, 9.89552969e+04,
1062 9.94332509e+04, 1.00047506e+05, 1.00569417e+05, 1.01105830e+05,
1063 1.01634936e+05, 1.02121705e+05, 1.02641415e+05, 1.03123767e+05,
1064 1.03599733e+05, 1.04062370e+05, 1.04907216e+05, 1.05256436e+05,
1065 1.05665701e+05, 1.06007083e+05, 1.06318115e+05, 1.06593953e+05,
1066 1.06893542e+05, 1.07121150e+05, 1.07346243e+05, 1.07625934e+05,
1067 1.08044429e+05, 1.08167080e+05, 1.08308995e+05, 1.08399830e+05,
1068 1.08526582e+05, 1.08620505e+05, 1.08713803e+05, 1.08784455e+05,
1069 1.08862350e+05, 1.08937801e+05, 1.08989964e+05, 1.09060085e+05,
1070 1.09162026e+05, 1.09220593e+05, 1.09273416e+05, 1.09333464e+05,
1071 1.09372863e+05, 1.09468530e+05, 1.09513735e+05, 1.09553322e+05,
1072 1.09594566e+05, 1.09641845e+05, 1.09679236e+05, 1.09723860e+05,
1073 1.09753056e+05, 1.09826579e+05, 1.09872135e+05, 1.09895670e+05,
1074 1.09902080e+05, 1.09943174e+05, 1.10002465e+05, 1.10019329e+05,
1075 1.10068730e+05, 1.10095848e+05, 1.10145789e+05, 1.10193658e+05,
1076 1.10213581e+05, 1.10248075e+05, 1.10291320e+05, 1.10316883e+05,
1077 1.10358975e+05, 1.10350689e+05, 1.10391552e+05, 1.10400507e+05,
1078 1.10409523e+05, 1.10409459e+05, 1.10412119e+05, 1.10409689e+05,
1079 1.10414648e+05, 1.10391061e+05, 1.10420513e+05, 1.10424437e+05,
1080 1.10435588e+05, 1.10438362e+05, 1.10443905e+05, 1.10450180e+05,
1081 1.10452714e+05, 1.10449100e+05, 1.10466222e+05, 1.10458324e+05,
1082 1.10478871e+05, 1.10486620e+05, 1.10485105e+05, 1.10489515e+05,
1083 1.10491243e+05, 1.10499598e+05, 1.10501449e+05, 1.10501009e+05,
1084 1.10515083e+05, 1.10533044e+05, 1.10531740e+05, 1.10548636e+05,
1085 1.10558815e+05, 1.10560570e+05, 1.10569349e+05, 1.10572778e+05,
1086 1.10588800e+05, 1.10593287e+05, 1.10596037e+05, 1.10584233e+05,
1087 1.10611084e+05, 1.10616525e+05, 1.10621289e+05, 1.10631455e+05,
1088 1.10639320e+05, 1.10647906e+05, 1.10646043e+05, 1.10635789e+05,
1089 1.10635305e+05, 1.10652093e+05, 1.10638755e+05, 1.10655426e+05,
1090 1.10651182e+05, 1.10653604e+05, 1.10665648e+05, 1.10655049e+05,
1091 1.10650105e+05, 1.10655658e+05, 1.10660937e+05, 1.10673337e+05,
1092 1.10673003e+05, 1.10655815e+05, 1.10661151e+05, 1.10662036e+05,
1093 1.10676951e+05, 1.10667334e+05, 1.10679642e+05, 1.10678497e+05])
1094 rawVars = np.array([
1095 4.47787277e+01, 4.64353847e+01, 4.85247580e+01, 4.93948408e+01,
1096 5.15948411e+01, 5.30389406e+01, 5.58813000e+01, 5.88525810e+01,
1097 6.11585484e+01, 6.41104167e+01, 6.56152371e+01, 6.82093774e+01,
1098 7.14063291e+01, 7.45066055e+01, 7.64755940e+01, 7.93540481e+01,
1099 8.18907727e+01, 8.66402959e+01, 8.97887750e+01, 9.68782459e+01,
1100 9.95221383e+01, 1.02767714e+02, 1.08068716e+02, 1.16108758e+02,
1101 1.20246097e+02, 1.26018524e+02, 1.30397686e+02, 1.36138570e+02,
1102 1.41942986e+02, 1.46772865e+02, 1.53919845e+02, 1.60521709e+02,
1103 1.68353264e+02, 1.78909843e+02, 1.88788533e+02, 2.00792706e+02,
1104 2.07611019e+02, 2.16057203e+02, 2.26987335e+02, 2.39701806e+02,
1105 2.51287870e+02, 2.64963149e+02, 2.81918185e+02, 2.93010615e+02,
1106 3.04772726e+02, 3.21723049e+02, 3.43194608e+02, 3.60791523e+02,
1107 3.72312673e+02, 3.92534946e+02, 4.18291901e+02, 4.40825475e+02,
1108 4.58818537e+02, 4.88340078e+02, 5.12852998e+02, 5.35522179e+02,
1109 5.69935148e+02, 5.92975103e+02, 6.31052929e+02, 6.61056947e+02,
1110 6.95541286e+02, 7.33787875e+02, 7.74291674e+02, 8.19211863e+02,
1111 8.62765375e+02, 8.98546352e+02, 9.55344080e+02, 1.00237170e+03,
1112 1.05926161e+03, 1.10844186e+03, 1.17604012e+03, 1.24027865e+03,
1113 1.37334609e+03, 1.37631570e+03, 1.44433952e+03, 1.44613237e+03,
1114 1.53642103e+03, 1.53144123e+03, 1.60103165e+03, 1.69486912e+03,
1115 1.79228744e+03, 1.97807118e+03, 2.08913779e+03, 2.29127569e+03,
1116 2.41035376e+03, 2.54559185e+03, 2.68285671e+03, 2.82061302e+03,
1117 2.98565936e+03, 3.13680879e+03, 3.29910967e+03, 3.48157975e+03,
1118 3.66147828e+03, 3.67694292e+03, 3.84787540e+03, 4.07925681e+03,
1119 4.28699288e+03, 4.75578456e+03, 5.00956756e+03, 5.39321737e+03,
1120 5.79686635e+03, 6.17477624e+03, 6.55132737e+03, 6.93000705e+03,
1121 7.31757235e+03, 7.68650298e+03, 8.05377657e+03, 8.42789583e+03,
1122 8.77475510e+03, 9.17341164e+03, 9.54927300e+03, 9.89596158e+03,
1123 1.02637150e+04, 1.06167914e+04, 1.09873368e+04, 1.13685550e+04,
1124 1.17026479e+04, 1.20765605e+04, 1.23946750e+04, 1.27577017e+04,
1125 1.34485509e+04, 1.37927193e+04, 1.42006355e+04, 1.41857628e+04,
1126 1.44769908e+04, 1.45162172e+04, 1.51614067e+04, 1.55571196e+04,
1127 1.58809609e+04, 1.61752079e+04, 1.65104318e+04, 1.68369000e+04,
1128 1.71408213e+04, 1.75355600e+04, 1.78226398e+04, 1.81932474e+04,
1129 1.84482292e+04, 1.88389901e+04, 1.91150651e+04, 1.97375210e+04,
1130 2.03591057e+04, 2.07155451e+04, 2.07138350e+04, 2.11073361e+04,
1131 2.13837002e+04, 2.16588926e+04, 2.19612146e+04, 2.22753789e+04,
1132 2.25303517e+04, 2.27928117e+04, 2.31125410e+04, 2.33679689e+04,
1133 2.37393625e+04, 2.40488975e+04, 2.45764011e+04, 2.48064050e+04,
1134 2.50721617e+04, 2.53965873e+04, 2.56131331e+04, 2.59277943e+04,
1135 2.61709392e+04, 2.64119896e+04, 2.68955682e+04, 2.72267063e+04,
1136 2.74887295e+04, 2.79083033e+04, 2.82310485e+04, 2.84366770e+04,
1137 2.90226269e+04, 2.92324828e+04, 2.94521967e+04, 2.97949458e+04,
1138 2.99735234e+04, 3.02749574e+04, 3.05427850e+04, 3.07518546e+04,
1139 3.09317879e+04, 3.12692332e+04, 3.15643550e+04, 3.21293639e+04,
1140 3.24007437e+04, 3.26147619e+04, 3.28979579e+04, 3.34807881e+04,
1141 3.37109710e+04, 3.40246283e+04, 3.43898469e+04, 3.45302267e+04,
1142 3.47818944e+04, 3.51593681e+04, 3.52477656e+04, 3.56490287e+04,
1143 3.59240161e+04, 3.61669226e+04, 3.66423677e+04, 3.68827117e+04,
1144 3.71622239e+04, 3.74768274e+04, 3.76872328e+04, 3.79405515e+04,
1145 3.81364527e+04, 3.84119822e+04, 3.86423009e+04, 3.88877574e+04,
1146 3.91248488e+04, 3.92990610e+04, 3.96215459e+04, 3.98297091e+04,
1147 4.00712366e+04, 4.04322148e+04, 4.05178037e+04, 4.07431736e+04,
1148 4.10193223e+04, 4.11740695e+04, 4.13790755e+04, 4.14632263e+04,
1149 4.18525778e+04, 4.20979322e+04, 4.23130642e+04, 4.24582022e+04,
1150 4.24946930e+04, 4.27860167e+04, 4.30933820e+04, 4.32894483e+04,
1151 4.33858206e+04, 4.34411628e+04, 4.36629531e+04, 4.39919091e+04,
1152 4.40293360e+04, 4.42002784e+04, 4.42310862e+04, 4.45443328e+04,
1153 4.45481958e+04, 4.48604145e+04, 4.48891948e+04, 4.48416001e+04,
1154 4.50553039e+04, 4.50927543e+04, 4.51136486e+04, 4.51126520e+04,
1155 4.49857031e+04, 4.48705631e+04, 4.46276191e+04, 4.43327388e+04,
1156 4.37938194e+04, 4.32211550e+04, 4.27332194e+04, 4.23177306e+04,
1157 4.14539982e+04, 4.06974694e+04, 3.96551098e+04, 3.82440396e+04,
1158 3.67165456e+04, 3.47661502e+04, 3.28393493e+04, 3.02395522e+04,
1159 2.76939927e+04, 2.48272541e+04, 1.92526286e+04, 1.63986811e+04,
1160 1.42095886e+04, 1.22350406e+04, 1.06293553e+04, 9.24838723e+03,
1161 8.09429377e+03, 7.27582028e+03, 6.47441127e+03, 5.21985266e+03,
1162 4.36279092e+03, 4.00953782e+03, 3.69585190e+03, 3.43405611e+03,
1163 3.18567804e+03, 3.01195379e+03, 2.89123841e+03, 2.68282359e+03,
1164 2.60091022e+03, 2.51301062e+03, 2.43890788e+03, 2.35838231e+03,
1165 2.26256855e+03, 2.21204078e+03, 2.20282902e+03, 2.18205860e+03,
1166 2.15007675e+03, 2.08949483e+03, 2.10732780e+03, 2.09600072e+03,
1167 2.07407783e+03, 2.11741997e+03, 2.08083045e+03, 2.06397688e+03,
1168 2.04765529e+03, 2.05836012e+03, 2.04093663e+03, 1.98334647e+03,
1169 2.01999612e+03, 1.99394914e+03, 1.96972450e+03, 1.88216817e+03,
1170 1.86902307e+03, 1.98290800e+03, 1.94714119e+03, 1.92046621e+03,
1171 1.83796316e+03, 1.87468459e+03, 1.89491779e+03, 1.83110571e+03,
1172 1.75025929e+03, 1.66067524e+03, 1.68052010e+03, 1.67404206e+03,
1173 1.65221787e+03, 1.63380745e+03, 1.61258211e+03, 1.57173282e+03,
1174 1.55635385e+03, 1.59914440e+03, 1.63280915e+03, 1.62416209e+03,
1175 1.55550327e+03, 1.59790786e+03, 1.63913552e+03, 1.62123248e+03,
1176 1.59571147e+03, 1.48508783e+03, 1.60763833e+03, 1.60573267e+03,
1177 1.66286509e+03, 1.56023986e+03, 1.60226461e+03, 1.62178972e+03,
1178 1.63248481e+03, 1.63982132e+03, 1.67350316e+03, 1.62120745e+03,
1179 1.69261497e+03, 1.67835970e+03, 1.71259617e+03, 1.66567572e+03,
1180 1.73107044e+03, 1.60808418e+03, 1.62957233e+03, 1.65949976e+03,
1181 1.62773379e+03, 1.74438786e+03, 1.61948665e+03, 1.83335873e+03,
1182 1.65774501e+03, 1.65605436e+03, 1.72054542e+03, 1.68968657e+03,
1183 1.73787963e+03, 1.74437326e+03, 1.71408015e+03, 1.93871967e+03,
1184 1.87508731e+03, 1.70631906e+03, 1.92219749e+03, 1.72410949e+03,
1185 1.86172638e+03, 1.88692937e+03, 1.77337717e+03, 1.95303579e+03,
1186 1.86292107e+03, 1.87948406e+03, 1.91966097e+03, 1.76238101e+03,
1187 1.59694869e+03, 1.89306746e+03, 1.84068186e+03, 1.86018512e+03,
1188 1.81578862e+03, 1.83413719e+03, 1.80771751e+03, 1.79214601e+03])
1189 elif dense and mode == "upturn":
1190 # Taken from dense run 13591, detector 73, amplifier C07
1191 ptcTurnoff = 86917.0045
1192 rawMeans = np.array([
1193 2.87448603e+01, 3.03861239e+01, 3.20301466e+01, 3.35831624e+01,
1194 3.51161960e+01, 3.69857753e+01, 3.91580507e+01, 4.12179225e+01,
1195 4.36662086e+01, 4.58399375e+01, 4.80202775e+01, 5.10071275e+01,
1196 5.68263968e+01, 5.99352524e+01, 6.34210182e+01, 6.68834309e+01,
1197 7.01195882e+01, 7.43313750e+01, 7.80758357e+01, 8.27309929e+01,
1198 8.73124933e+01, 9.17856382e+01, 9.70086101e+01, 1.02546128e+02,
1199 1.08169091e+02, 1.13738150e+02, 1.20058621e+02, 1.26792703e+02,
1200 1.33422104e+02, 1.40893068e+02, 1.48727555e+02, 1.56662520e+02,
1201 1.65129261e+02, 1.74130948e+02, 1.83878223e+02, 1.93976598e+02,
1202 2.04599993e+02, 2.16044601e+02, 2.27838642e+02, 2.40360862e+02,
1203 2.53772624e+02, 2.67443055e+02, 2.82013487e+02, 2.97705423e+02,
1204 3.14297001e+02, 3.31260825e+02, 3.49758342e+02, 3.68963998e+02,
1205 3.88634613e+02, 4.10112249e+02, 4.32301833e+02, 4.56407219e+02,
1206 4.81690100e+02, 5.08370293e+02, 5.35921852e+02, 5.65828928e+02,
1207 5.96685398e+02, 6.29615188e+02, 6.64802708e+02, 7.00563142e+02,
1208 7.39711995e+02, 7.79679559e+02, 8.22530629e+02, 8.67814522e+02,
1209 9.15951880e+02, 9.65946953e+02, 1.01948611e+03, 1.07504268e+03,
1210 1.13509200e+03, 1.19727942e+03, 1.26351949e+03, 1.33211624e+03,
1211 1.48320209e+03, 1.48384430e+03, 1.56467822e+03, 1.56485206e+03,
1212 1.65060918e+03, 1.65147654e+03, 1.74229201e+03, 1.83706229e+03,
1213 1.93811946e+03, 2.15719262e+03, 2.27546155e+03, 2.50056748e+03,
1214 2.63872700e+03, 2.78379012e+03, 2.93745238e+03, 3.09833186e+03,
1215 3.27013288e+03, 3.44990418e+03, 3.63968250e+03, 3.83921968e+03,
1216 4.04711266e+03, 4.05013387e+03, 4.27266981e+03, 4.50809670e+03,
1217 4.75635569e+03, 5.29310771e+03, 5.58427306e+03, 6.03306708e+03,
1218 6.48160541e+03, 6.92983470e+03, 7.37874615e+03, 7.82619855e+03,
1219 8.27493037e+03, 8.72049208e+03, 9.17227788e+03, 9.62234260e+03,
1220 1.00674503e+04, 1.05166951e+04, 1.09652006e+04, 1.14145457e+04,
1221 1.18581337e+04, 1.23138210e+04, 1.27597933e+04, 1.32094995e+04,
1222 1.36537794e+04, 1.41079990e+04, 1.45579666e+04, 1.50042564e+04,
1223 1.58932106e+04, 1.63527856e+04, 1.67995854e+04, 1.68014549e+04,
1224 1.72456751e+04, 1.72511595e+04, 1.81472850e+04, 1.85967925e+04,
1225 1.90437339e+04, 1.94933795e+04, 1.99423590e+04, 2.03854630e+04,
1226 2.08408610e+04, 2.12909264e+04, 2.17356857e+04, 2.21873924e+04,
1227 2.26346682e+04, 2.30822802e+04, 2.35248689e+04, 2.44292445e+04,
1228 2.53306721e+04, 2.57709779e+04, 2.59292740e+04, 2.63672474e+04,
1229 2.68118979e+04, 2.72586202e+04, 2.76977437e+04, 2.81455545e+04,
1230 2.85840092e+04, 2.90309073e+04, 2.94738200e+04, 2.99007273e+04,
1231 3.03581316e+04, 3.08035397e+04, 3.16820715e+04, 3.21348581e+04,
1232 3.25795035e+04, 3.30160938e+04, 3.34614077e+04, 3.39098464e+04,
1233 3.43488841e+04, 3.47938018e+04, 3.56683528e+04, 3.61120617e+04,
1234 3.65571740e+04, 3.74373798e+04, 3.78795706e+04, 3.83213509e+04,
1235 3.92106205e+04, 3.96436191e+04, 4.00888939e+04, 4.05395713e+04,
1236 4.09729696e+04, 4.13953138e+04, 4.18558141e+04, 4.23098575e+04,
1237 4.27184098e+04, 4.31754813e+04, 4.36191519e+04, 4.45068672e+04,
1238 4.49463419e+04, 4.53858299e+04, 4.58261673e+04, 4.67014085e+04,
1239 4.71515103e+04, 4.75882657e+04, 4.80322253e+04, 4.84586953e+04,
1240 4.89039488e+04, 4.93442503e+04, 4.97561230e+04, 5.02341725e+04,
1241 5.06588581e+04, 5.11035621e+04, 5.19836216e+04, 5.24056394e+04,
1242 5.28686518e+04, 5.33018757e+04, 5.37265598e+04, 5.41807663e+04,
1243 5.46136176e+04, 5.50609130e+04, 5.55007300e+04, 5.59337737e+04,
1244 5.63788843e+04, 5.68094757e+04, 5.72570533e+04, 5.76741866e+04,
1245 5.81383020e+04, 5.85826153e+04, 5.89753856e+04, 5.94617576e+04,
1246 5.99083532e+04, 6.03419978e+04, 6.07815876e+04, 6.11916990e+04,
1247 6.16679074e+04, 6.21070006e+04, 6.25498996e+04, 6.30000329e+04,
1248 6.34432415e+04, 6.38632967e+04, 6.43145751e+04, 6.47608638e+04,
1249 6.52134266e+04, 6.56348895e+04, 6.60841662e+04, 6.65220989e+04,
1250 6.69687269e+04, 6.74171257e+04, 6.78295038e+04, 6.83037417e+04,
1251 6.87381890e+04, 6.96234966e+04, 7.00749883e+04, 7.05130803e+04,
1252 7.09702156e+04, 7.18669367e+04, 7.23008238e+04, 7.27326728e+04,
1253 7.31879639e+04, 7.36444652e+04, 7.45313822e+04, 7.49512933e+04,
1254 7.58422569e+04, 7.63002282e+04, 7.67542279e+04, 7.71971910e+04,
1255 7.75899806e+04, 7.80880043e+04, 7.85207688e+04, 7.89717058e+04,
1256 7.94257076e+04, 7.98485141e+04, 8.03023282e+04, 8.07414358e+04,
1257 8.11910981e+04, 8.16398955e+04, 8.25250712e+04, 8.29401845e+04,
1258 8.34236581e+04, 8.38641888e+04, 8.42971844e+04, 8.47295006e+04,
1259 8.52114910e+04, 8.56328503e+04, 8.60862279e+04, 8.69170045e+04,
1260 8.78165034e+04, 8.82689547e+04, 8.87058177e+04, 8.90804208e+04,
1261 8.95362169e+04, 8.99496410e+04, 9.03236457e+04, 9.06958198e+04,
1262 9.11193888e+04, 9.14557890e+04, 9.17189073e+04, 9.21437093e+04,
1263 9.28449356e+04, 9.31434208e+04, 9.33064667e+04, 9.34994900e+04,
1264 9.37926812e+04, 9.41725477e+04, 9.45383949e+04, 9.46575696e+04,
1265 9.49209096e+04, 9.49952393e+04, 9.50539106e+04, 9.52347786e+04,
1266 9.52460768e+04, 9.54989344e+04, 9.56298553e+04, 9.58490767e+04,
1267 9.62648021e+04, 9.61075892e+04, 9.63538129e+04, 9.63559508e+04,
1268 9.64708846e+04, 9.64756350e+04, 9.66256538e+04, 9.64809810e+04,
1269 9.65366387e+04, 9.68214859e+04, 9.69137722e+04, 9.68210311e+04,
1270 9.71873201e+04, 9.71342102e+04, 9.71078451e+04, 9.71069892e+04,
1271 9.75296912e+04, 9.74999383e+04, 9.73480623e+04, 9.76524037e+04,
1272 9.74981803e+04, 9.76922174e+04, 9.76337785e+04, 9.75835125e+04,
1273 9.75674694e+04, 9.75367570e+04, 9.77438281e+04, 9.76871410e+04,
1274 9.78773702e+04, 9.78321613e+04, 9.77808877e+04, 9.77359422e+04,
1275 9.79278808e+04, 9.79329075e+04, 9.77675254e+04, 9.78952318e+04,
1276 9.77270368e+04, 9.79509533e+04, 9.77760093e+04, 9.80460286e+04,
1277 9.81360499e+04, 9.79637125e+04, 9.79664967e+04, 9.78575509e+04,
1278 9.80556911e+04, 9.81417648e+04, 9.80352945e+04, 9.81329700e+04,
1279 9.81188437e+04, 9.79678779e+04, 9.79598626e+04, 9.80560275e+04,
1280 9.79542087e+04, 9.79987939e+04, 9.81534114e+04, 9.83899105e+04,
1281 9.84065000e+04, 9.82811922e+04, 9.82840840e+04, 9.82784134e+04,
1282 9.82871998e+04, 9.84461381e+04, 9.84682635e+04, 9.85020571e+04,
1283 np.nan, np.nan, np.nan, np.nan,
1284 np.nan, np.nan, np.nan, np.nan,
1285 np.nan, np.nan, np.nan, np.nan,
1286 np.nan, np.nan, np.nan, np.nan])
1287 rawVars = np.array([
1288 4.87069525e+01, 4.96960311e+01, 5.04910053e+01, 5.17128726e+01,
1289 5.25955479e+01, 5.38353690e+01, 5.53191132e+01, 5.66941478e+01,
1290 5.82926522e+01, 5.98938552e+01, 6.12951161e+01, 6.37287578e+01,
1291 6.80636332e+01, 7.04028909e+01, 7.29998462e+01, 7.48586667e+01,
1292 7.66622012e+01, 7.82391455e+01, 7.99899592e+01, 8.21891213e+01,
1293 8.44852817e+01, 8.74729321e+01, 9.05085253e+01, 9.45153523e+01,
1294 9.84325033e+01, 1.02490363e+02, 1.05547104e+02, 1.08782968e+02,
1295 1.12593458e+02, 1.17458820e+02, 1.22086446e+02, 1.27863525e+02,
1296 1.34404768e+02, 1.42189276e+02, 1.48361964e+02, 1.52241417e+02,
1297 1.56903695e+02, 1.63487388e+02, 1.71250175e+02, 1.79776726e+02,
1298 1.87500190e+02, 1.95127335e+02, 2.05237738e+02, 2.17941739e+02,
1299 2.27601893e+02, 2.34445474e+02, 2.46136553e+02, 2.58638437e+02,
1300 2.70612240e+02, 2.88057360e+02, 3.01436607e+02, 3.11174829e+02,
1301 3.27060261e+02, 3.47777215e+02, 3.68419809e+02, 3.80518820e+02,
1302 3.97377177e+02, 4.25381795e+02, 4.42049448e+02, 4.59452324e+02,
1303 4.92530031e+02, 5.14495733e+02, 5.34196108e+02, 5.72228281e+02,
1304 5.92914611e+02, 6.29229419e+02, 6.63254402e+02, 7.10047069e+02,
1305 7.31110299e+02, 7.74635732e+02, 8.06624321e+02, 8.55180585e+02,
1306 9.44435441e+02, 9.43183163e+02, 1.00413513e+03, 9.99872981e+02,
1307 1.05311443e+03, 1.05562621e+03, 1.10199374e+03, 1.15531802e+03,
1308 1.22522414e+03, 1.36520090e+03, 1.42667128e+03, 1.56495960e+03,
1309 1.65397576e+03, 1.74424087e+03, 1.84231293e+03, 1.94740328e+03,
1310 2.03765806e+03, 2.14414450e+03, 2.27212692e+03, 2.38935653e+03,
1311 2.50602833e+03, 2.51661588e+03, 2.64775661e+03, 2.78538088e+03,
1312 2.93987651e+03, 3.26826498e+03, 3.44330599e+03, 3.69978469e+03,
1313 3.97061173e+03, 4.24728849e+03, 4.50971380e+03, 4.77595875e+03,
1314 5.05755732e+03, 5.30327839e+03, 5.58773282e+03, 5.81966058e+03,
1315 6.10932503e+03, 6.36332817e+03, 6.61863136e+03, 6.90433479e+03,
1316 7.13413117e+03, 7.43562156e+03, 7.66582807e+03, 7.94754672e+03,
1317 8.18686206e+03, 8.45779399e+03, 8.71402609e+03, 8.95964156e+03,
1318 9.47591061e+03, 9.76959463e+03, 9.95917651e+03, 9.97584309e+03,
1319 1.02555717e+04, 1.02417814e+04, 1.07674493e+04, 1.09981921e+04,
1320 1.12352859e+04, 1.15551940e+04, 1.17333125e+04, 1.19690736e+04,
1321 1.22534101e+04, 1.24640828e+04, 1.27500496e+04, 1.29625045e+04,
1322 1.32703257e+04, 1.34926746e+04, 1.37251524e+04, 1.42302648e+04,
1323 1.46793658e+04, 1.49722647e+04, 1.49709034e+04, 1.52549107e+04,
1324 1.55088982e+04, 1.57314736e+04, 1.59816003e+04, 1.61640169e+04,
1325 1.64548981e+04, 1.66413940e+04, 1.68686050e+04, 1.71125336e+04,
1326 1.73511674e+04, 1.75817535e+04, 1.80470011e+04, 1.82624491e+04,
1327 1.84524739e+04, 1.87019552e+04, 1.89575762e+04, 1.91930866e+04,
1328 1.94004074e+04, 1.96460005e+04, 2.00479314e+04, 2.02955099e+04,
1329 2.04822881e+04, 2.09531956e+04, 2.11697303e+04, 2.13633602e+04,
1330 2.18346507e+04, 2.19539919e+04, 2.22252821e+04, 2.25155821e+04,
1331 2.26702123e+04, 2.28414558e+04, 2.30830649e+04, 2.32726468e+04,
1332 2.34988786e+04, 2.37395021e+04, 2.39101878e+04, 2.43317884e+04,
1333 2.45771060e+04, 2.47054420e+04, 2.49622825e+04, 2.52797662e+04,
1334 2.55292494e+04, 2.57138336e+04, 2.59366428e+04, 2.61122036e+04,
1335 2.63896695e+04, 2.64562386e+04, 2.66907602e+04, 2.69102279e+04,
1336 2.71833821e+04, 2.73303887e+04, 2.77661838e+04, 2.79006930e+04,
1337 2.81874904e+04, 2.83607526e+04, 2.86045106e+04, 2.87425416e+04,
1338 2.89632711e+04, 2.91293885e+04, 2.93514145e+04, 2.96850582e+04,
1339 2.98715928e+04, 3.01274873e+04, 3.03033141e+04, 3.04572121e+04,
1340 3.07470469e+04, 3.10501508e+04, 3.11450218e+04, 3.14122871e+04,
1341 3.16022955e+04, 3.18325755e+04, 3.21339141e+04, 3.23047828e+04,
1342 3.24219992e+04, 3.28022196e+04, 3.30193533e+04, 3.32907509e+04,
1343 3.34017470e+04, 3.36009585e+04, 3.39733107e+04, 3.40535547e+04,
1344 3.42458795e+04, 3.44664410e+04, 3.47643491e+04, 3.50165080e+04,
1345 3.51727941e+04, 3.53854796e+04, 3.55711407e+04, 3.58190707e+04,
1346 3.60454029e+04, 3.63969548e+04, 3.66329292e+04, 3.68771986e+04,
1347 3.71032547e+04, 3.73983989e+04, 3.76425541e+04, 3.79247481e+04,
1348 3.80882104e+04, 3.82317170e+04, 3.86471187e+04, 3.89086176e+04,
1349 3.92339037e+04, 3.95436246e+04, 3.96460919e+04, 3.98028414e+04,
1350 3.99125771e+04, 4.01715067e+04, 4.03722901e+04, 4.05626968e+04,
1351 4.06933838e+04, 4.10184964e+04, 4.11922744e+04, 4.13557454e+04,
1352 4.16157584e+04, 4.16356931e+04, 4.21157583e+04, 4.21816345e+04,
1353 4.24543184e+04, 4.26313857e+04, 4.27797954e+04, 4.29586701e+04,
1354 4.31317246e+04, 4.31196229e+04, 4.30508028e+04, 4.29439940e+04,
1355 4.14814510e+04, 4.17104998e+04, 4.12950588e+04, 4.00762620e+04,
1356 3.95745952e+04, 3.79603760e+04, 3.68764412e+04, 3.59324071e+04,
1357 3.41774826e+04, 3.35146378e+04, 3.01416949e+04, 3.10962443e+04,
1358 2.93723225e+04, 2.88267934e+04, 2.93057515e+04, 2.78885387e+04,
1359 2.97481790e+04, 2.89003096e+04, 2.98475325e+04, 3.15227067e+04,
1360 3.15157345e+04, 3.32593077e+04, 3.30733852e+04, 3.37623662e+04,
1361 3.58784503e+04, 3.75160267e+04, 3.82803313e+04, 3.89001912e+04,
1362 4.17283047e+04, 4.20086699e+04, 4.22993774e+04, 4.34867653e+04,
1363 4.17054368e+04, 4.52190044e+04, 4.55586401e+04, 4.39034690e+04,
1364 4.49939183e+04, 4.75700720e+04, 4.78978238e+04, 4.62120749e+04,
1365 4.85317658e+04, 4.97305999e+04, 4.70691830e+04, 4.77667215e+04,
1366 5.19257836e+04, 5.01885056e+04, 4.83671721e+04, 5.21924342e+04,
1367 5.10329762e+04, 5.25552111e+04, 5.17040972e+04, 5.11958488e+04,
1368 5.19165668e+04, 4.88842210e+04, 5.17286013e+04, 5.13182361e+04,
1369 5.16342048e+04, 5.17850241e+04, 5.16475818e+04, 5.00165868e+04,
1370 5.19391672e+04, 5.21771011e+04, 5.01633917e+04, 5.19270231e+04,
1371 4.93839429e+04, 4.96516804e+04, 4.93706114e+04, 5.25025570e+04,
1372 5.43045043e+04, 5.27477605e+04, 5.23609667e+04, 4.89296194e+04,
1373 5.26232764e+04, 5.24395882e+04, 4.90790820e+04, 5.19268918e+04,
1374 5.21608822e+04, 4.89292620e+04, 4.86074588e+04, 4.93274381e+04,
1375 4.84901815e+04, 4.91868029e+04, 5.25082453e+04, 5.44279458e+04,
1376 5.55797293e+04, 5.20003094e+04, 5.19304424e+04, 5.17391458e+04,
1377 5.24042964e+04, 5.53566164e+04, 5.53202737e+04, 5.58931187e+04,
1378 np.nan, np.nan, np.nan, np.nan,
1379 np.nan, np.nan, np.nan, np.nan,
1380 np.nan, np.nan, np.nan, np.nan,
1381 np.nan, np.nan, np.nan, np.nan])
1382 elif dense and mode == "dip":
1383 # Taken from dense run 13591, detector 46, amplifier C16
1384 ptcTurnoff = 78592.643
1385 rawMeans = np.array(
1386 [3.46319253e+01, 3.66430301e+01, 3.86622690e+01, 4.05725802e+01,
1387 4.25802432e+01, 4.40269809e+01, 4.80275071e+01, 5.05005628e+01,
1388 5.24638704e+01, 5.51726716e+01, 5.80431294e+01, 6.18363693e+01,
1389 6.76872491e+01, 7.54744430e+01, 7.59445874e+01, 8.07200670e+01,
1390 8.39801977e+01, 8.89822266e+01, 9.34165914e+01, 1.00259640e+02,
1391 1.04115753e+02, 1.09746401e+02, 1.16495426e+02, 1.24702365e+02,
1392 1.29617918e+02, 1.38517235e+02, 1.44598282e+02, 1.55474182e+02,
1393 1.60372893e+02, 1.68952583e+02, 1.79169853e+02, 1.87803850e+02,
1394 1.97901901e+02, 2.12236200e+02, 2.20703858e+02, 2.33721460e+02,
1395 2.45632287e+02, 2.60078861e+02, 2.73309812e+02, 2.91303550e+02,
1396 3.08138900e+02, 3.20634527e+02, 3.39157572e+02, 3.61285287e+02,
1397 3.77306857e+02, 3.97532592e+02, 4.19725123e+02, 4.42637799e+02,
1398 4.66432222e+02, 4.92760774e+02, 5.18439719e+02, 5.49043359e+02,
1399 5.80725784e+02, 6.10607872e+02, 6.42130865e+02, 6.78015970e+02,
1400 7.19634201e+02, 7.56125967e+02, 7.97647549e+02, 8.44250515e+02,
1401 8.88164221e+02, 9.35554605e+02, 9.87551014e+02, 1.04304478e+03,
1402 1.09859274e+03, 1.15934514e+03, 1.22290957e+03, 1.28928061e+03,
1403 1.36205339e+03, 1.43517932e+03, 1.51527821e+03, 1.59829513e+03,
1404 1.77964089e+03, 1.78170273e+03, 1.87682761e+03, 1.87684189e+03,
1405 1.98075997e+03, 1.98113130e+03, 2.08945214e+03, 2.20305152e+03,
1406 2.32556464e+03, 2.58962409e+03, 2.72814882e+03, 2.99794092e+03,
1407 3.16447505e+03, 3.33946592e+03, 3.52147949e+03, 3.71394579e+03,
1408 3.91907040e+03, 4.13438382e+03, 4.36189594e+03, 4.60043753e+03,
1409 4.85130253e+03, 4.85473652e+03, 5.12061926e+03, 5.40324180e+03,
1410 5.70061253e+03, 6.34723550e+03, 6.69436828e+03, 7.23257375e+03,
1411 7.76958269e+03, 8.30697359e+03, 8.84549436e+03, 9.38149894e+03,
1412 9.92214412e+03, 1.04540863e+04, 1.09984280e+04, 1.15336125e+04,
1413 1.20730516e+04, 1.26066598e+04, 1.31475457e+04, 1.36835704e+04,
1414 1.42142220e+04, 1.47607783e+04, 1.52995772e+04, 1.58349683e+04,
1415 1.63699779e+04, 1.69169118e+04, 1.74527183e+04, 1.79882677e+04,
1416 1.90590055e+04, 1.96042099e+04, 2.01412931e+04, 2.01415525e+04,
1417 2.06773002e+04, 2.06836599e+04, 2.17563308e+04, 2.22945949e+04,
1418 2.28326494e+04, 2.33730224e+04, 2.39083711e+04, 2.44415981e+04,
1419 2.49887745e+04, 2.55254849e+04, 2.60582748e+04, 2.66026296e+04,
1420 2.71388848e+04, 2.76745959e+04, 2.82098429e+04, 2.92893984e+04,
1421 3.03685478e+04, 3.08997866e+04, 3.10729575e+04, 3.16013527e+04,
1422 3.21337166e+04, 3.26668783e+04, 3.31930745e+04, 3.37295906e+04,
1423 3.42575950e+04, 3.47930111e+04, 3.53194913e+04, 3.58360666e+04,
1424 3.63796428e+04, 3.69119003e+04, 3.79618999e+04, 3.85046991e+04,
1425 3.90341729e+04, 3.95622456e+04, 4.00906725e+04, 4.06248524e+04,
1426 4.11506714e+04, 4.16820728e+04, 4.27281690e+04, 4.32583738e+04,
1427 4.37923105e+04, 4.48436280e+04, 4.53713042e+04, 4.58983070e+04,
1428 4.69589412e+04, 4.74759399e+04, 4.80036320e+04, 4.85414573e+04,
1429 4.90619668e+04, 4.95708602e+04, 5.01124419e+04, 5.06550432e+04,
1430 5.11459970e+04, 5.16864720e+04, 5.22155963e+04, 5.32732837e+04,
1431 5.37950395e+04, 5.43202717e+04, 5.48449050e+04, 5.58936896e+04,
1432 5.64268047e+04, 5.69454503e+04, 5.74788533e+04, 5.79886165e+04,
1433 5.85227316e+04, 5.90467563e+04, 5.95529633e+04, 6.01107425e+04,
1434 6.06190504e+04, 6.11482815e+04, 6.22041090e+04, 6.27192672e+04,
1435 6.32698650e+04, 6.37882800e+04, 6.43035282e+04, 6.48401842e+04,
1436 6.53646656e+04, 6.59030142e+04, 6.64333556e+04, 6.69479267e+04,
1437 6.74848468e+04, 6.80079972e+04, 6.85445388e+04, 6.90509171e+04,
1438 6.96092229e+04, 7.01385610e+04, 7.06212128e+04, 7.11939523e+04,
1439 7.17266360e+04, 7.22471223e+04, 7.27780652e+04, 7.32761803e+04,
1440 7.38361226e+04, 7.43656998e+04, 7.48934046e+04, 7.54352821e+04,
1441 7.59644966e+04, 7.64724502e+04, 7.70119423e+04, 7.75439221e+04,
1442 7.80842181e+04, 7.85926430e+04, 7.91251970e+04, 7.96491204e+04,
1443 8.01869810e+04, 8.07146073e+04, 8.12202954e+04, 8.17785695e+04,
1444 8.22963087e+04, 8.33550384e+04, 8.38994212e+04, 8.44155447e+04,
1445 8.49563789e+04, 8.60281829e+04, 8.65433251e+04, 8.70627645e+04,
1446 8.76007341e+04, 8.81511125e+04, 8.92018550e+04, 8.97044207e+04,
1447 9.07592037e+04, 9.13032564e+04, 9.18479184e+04, 9.23763279e+04,
1448 9.28541040e+04, 9.34276276e+04, 9.39508203e+04, 9.44807722e+04,
1449 9.50201270e+04, 9.55260238e+04, 9.60584060e+04, 9.65900977e+04,
1450 9.71082260e+04, 9.76499634e+04, 9.86927409e+04, 9.92001749e+04,
1451 9.97605950e+04, 1.00281826e+05, 1.00799323e+05, 1.01317520e+05,
1452 1.01880214e+05, 1.02375482e+05, 1.02921781e+05, 1.03914664e+05,
1453 1.04996919e+05, 1.05531177e+05, 1.06045662e+05, 1.06553960e+05,
1454 1.07074502e+05, 1.07620081e+05, 1.08135030e+05, 1.08625699e+05,
1455 1.09176443e+05, 1.09713812e+05, 1.10216327e+05, 1.10733831e+05,
1456 1.11710810e+05, 1.12193799e+05, 1.12690561e+05, 1.13133767e+05,
1457 1.13607554e+05, 1.14479014e+05, 1.14907269e+05, 1.15294108e+05,
1458 1.15680838e+05, 1.16050756e+05, 1.16395663e+05, 1.16738698e+05,
1459 1.17036744e+05, 1.17606634e+05, 1.17864854e+05, 1.18107937e+05,
1460 1.18338933e+05, 1.18484492e+05, 1.18751107e+05, 1.18925783e+05,
1461 1.19127596e+05, 1.19257553e+05, 1.19452513e+05, 1.19608706e+05,
1462 1.19753398e+05, 1.19883813e+05, 1.20021670e+05, 1.20155507e+05,
1463 1.20406612e+05, 1.20605600e+05, 1.20753078e+05, 1.20866466e+05,
1464 np.nan, np.nan, np.nan, np.nan,
1465 np.nan, np.nan, np.nan, np.nan,
1466 np.nan, np.nan, np.nan, np.nan,
1467 np.nan, np.nan, np.nan, np.nan,
1468 np.nan, np.nan, np.nan, np.nan,
1469 np.nan, np.nan, np.nan, np.nan,
1470 np.nan, np.nan, np.nan, np.nan,
1471 np.nan, np.nan, np.nan, np.nan,
1472 np.nan, np.nan, np.nan, np.nan,
1473 np.nan, np.nan, np.nan, np.nan,
1474 np.nan, np.nan, np.nan, np.nan,
1475 np.nan, np.nan, np.nan, np.nan,
1476 np.nan, np.nan, np.nan, np.nan,
1477 np.nan, np.nan, np.nan, np.nan,
1478 np.nan, np.nan, np.nan, np.nan,
1479 np.nan, np.nan, np.nan, np.nan])
1480 rawVars = np.array(
1481 [3.70611558e+01, 3.83737395e+01, 3.99468861e+01, 4.10014338e+01,
1482 4.23251266e+01, 4.33678155e+01, 4.59071461e+01, 4.73626968e+01,
1483 4.87148063e+01, 5.03835098e+01, 5.25225011e+01, 5.49763960e+01,
1484 5.89144406e+01, 6.46901096e+01, 6.46921274e+01, 6.77000641e+01,
1485 7.03062675e+01, 7.37864491e+01, 7.78022510e+01, 8.44978037e+01,
1486 8.74723267e+01, 9.13765683e+01, 9.51046462e+01, 9.90038919e+01,
1487 1.01309767e+02, 1.06498820e+02, 1.10600587e+02, 1.18170347e+02,
1488 1.21408878e+02, 1.28214192e+02, 1.36647653e+02, 1.42148979e+02,
1489 1.48491678e+02, 1.59805162e+02, 1.65823057e+02, 1.73305507e+02,
1490 1.80522937e+02, 1.87449934e+02, 1.96245721e+02, 2.08352732e+02,
1491 2.21201432e+02, 2.32523118e+02, 2.44009905e+02, 2.56991468e+02,
1492 2.68047397e+02, 2.79329180e+02, 2.97712914e+02, 3.15304298e+02,
1493 3.27789122e+02, 3.44980267e+02, 3.61446379e+02, 3.84494985e+02,
1494 4.05677044e+02, 4.22749240e+02, 4.44709272e+02, 4.77813761e+02,
1495 5.01815280e+02, 5.21252820e+02, 5.49793847e+02, 5.80608964e+02,
1496 6.10172377e+02, 6.44282320e+02, 6.76618722e+02, 7.14200019e+02,
1497 7.52150585e+02, 7.90093939e+02, 8.43584018e+02, 8.74257958e+02,
1498 9.25137165e+02, 9.77217130e+02, 1.02268591e+03, 1.07911844e+03,
1499 1.20579007e+03, 1.21094193e+03, 1.26536689e+03, 1.26783114e+03,
1500 1.33667935e+03, 1.34071853e+03, 1.40959965e+03, 1.49236868e+03,
1501 1.56214455e+03, 1.73911080e+03, 1.84452009e+03, 2.01282493e+03,
1502 2.11914383e+03, 2.23859893e+03, 2.35101284e+03, 2.48665441e+03,
1503 2.61201878e+03, 2.74350197e+03, 2.89732268e+03, 3.05252644e+03,
1504 3.22199981e+03, 3.22767156e+03, 3.38954315e+03, 3.58149621e+03,
1505 3.76614023e+03, 4.19955412e+03, 4.39939398e+03, 4.74116692e+03,
1506 5.08774295e+03, 5.43362489e+03, 5.76587686e+03, 6.09147076e+03,
1507 6.46434875e+03, 6.77118428e+03, 7.10758829e+03, 7.41292668e+03,
1508 7.75391200e+03, 8.07133480e+03, 8.40331959e+03, 8.71723040e+03,
1509 9.03873483e+03, 9.36871022e+03, 9.69206829e+03, 9.99510413e+03,
1510 1.03183250e+04, 1.06519986e+04, 1.09717629e+04, 1.12984284e+04,
1511 1.19017371e+04, 1.22009054e+04, 1.25073348e+04, 1.24828917e+04,
1512 1.28123892e+04, 1.27965364e+04, 1.34024560e+04, 1.36798307e+04,
1513 1.40186807e+04, 1.43485421e+04, 1.45916270e+04, 1.48802247e+04,
1514 1.51990105e+04, 1.54775801e+04, 1.57746393e+04, 1.60211115e+04,
1515 1.63459546e+04, 1.66499888e+04, 1.68983125e+04, 1.74427484e+04,
1516 1.80456894e+04, 1.82652348e+04, 1.83690177e+04, 1.86208031e+04,
1517 1.89412363e+04, 1.91602864e+04, 1.94785697e+04, 1.97091334e+04,
1518 1.99827654e+04, 2.02492520e+04, 2.04397095e+04, 2.07912874e+04,
1519 2.09363768e+04, 2.12446667e+04, 2.17637411e+04, 2.19817593e+04,
1520 2.22395694e+04, 2.24653630e+04, 2.27254307e+04, 2.29678916e+04,
1521 2.32155716e+04, 2.34915971e+04, 2.39308788e+04, 2.41386350e+04,
1522 2.43300723e+04, 2.47776731e+04, 2.49855450e+04, 2.52822560e+04,
1523 2.57310565e+04, 2.58705668e+04, 2.61365827e+04, 2.63745002e+04,
1524 2.64761919e+04, 2.67763879e+04, 2.69546269e+04, 2.72247330e+04,
1525 2.73854794e+04, 2.75964799e+04, 2.78536768e+04, 2.83219440e+04,
1526 2.84473603e+04, 2.86066766e+04, 2.88858064e+04, 2.93640042e+04,
1527 2.95802005e+04, 2.97953000e+04, 2.99784114e+04, 3.01818213e+04,
1528 3.04537120e+04, 3.07186903e+04, 3.09159639e+04, 3.11340544e+04,
1529 3.13467981e+04, 3.16593731e+04, 3.19829978e+04, 3.22855092e+04,
1530 3.25921574e+04, 3.27154499e+04, 3.28698071e+04, 3.31481419e+04,
1531 3.34606399e+04, 3.37260080e+04, 3.38331508e+04, 3.40882291e+04,
1532 3.43298166e+04, 3.44626343e+04, 3.47352389e+04, 3.48844453e+04,
1533 3.50976243e+04, 3.53422532e+04, 3.54703155e+04, 3.57850397e+04,
1534 3.60218788e+04, 3.61282209e+04, 3.63718905e+04, 3.64159312e+04,
1535 3.67264583e+04, 3.68810487e+04, 3.70236104e+04, 3.73025531e+04,
1536 3.74696213e+04, 3.74774745e+04, 3.76885954e+04, 3.77461428e+04,
1537 3.77311980e+04, 3.76449769e+04, 3.71874494e+04, 3.67403027e+04,
1538 3.58397731e+04, 3.44249565e+04, 3.25971681e+04, 3.12036933e+04,
1539 2.94985871e+04, 2.71719366e+04, 2.69809068e+04, 2.72483125e+04,
1540 2.83267080e+04, 3.15350383e+04, 3.33307911e+04, 3.48927220e+04,
1541 3.65827728e+04, 3.79316518e+04, 3.97114600e+04, 4.02038182e+04,
1542 4.10252529e+04, 4.14747301e+04, 4.16607368e+04, 4.18321712e+04,
1543 4.18311337e+04, 4.21298732e+04, 4.21384783e+04, 4.21559876e+04,
1544 4.23156351e+04, 4.22011377e+04, 4.22592203e+04, 4.20913479e+04,
1545 4.15029042e+04, 4.09470822e+04, 3.85767751e+04, 3.64665853e+04,
1546 3.45138148e+04, 3.21709915e+04, 2.96629755e+04, 2.69203438e+04,
1547 2.43537600e+04, 2.23428644e+04, 2.01581545e+04, 1.62544599e+04,
1548 1.34824506e+04, 1.18721963e+04, 1.05452615e+04, 9.46843007e+03,
1549 8.23841467e+03, 7.23997272e+03, 6.36586857e+03, 5.65708162e+03,
1550 4.99963764e+03, 4.48251363e+03, 4.09078951e+03, 3.72817220e+03,
1551 3.21067198e+03, 3.03262162e+03, 2.89743032e+03, 2.77343484e+03,
1552 2.69667301e+03, 2.60188277e+03, 2.55172731e+03, 2.52540578e+03,
1553 2.56130915e+03, 2.52293303e+03, 2.50717444e+03, 2.51044664e+03,
1554 2.51531215e+03, 2.53768779e+03, 2.56201926e+03, 2.56217908e+03,
1555 2.60528686e+03, 2.61531849e+03, 2.62971142e+03, 2.66896083e+03,
1556 2.69706371e+03, 2.73927492e+03, 2.74999442e+03, 2.75180096e+03,
1557 2.78694836e+03, 2.80704605e+03, 2.83222240e+03, 2.86654398e+03,
1558 2.90678852e+03, 2.95139745e+03, 2.95942911e+03, 3.00791154e+03,
1559 np.nan, np.nan, np.nan, np.nan,
1560 np.nan, np.nan, np.nan, np.nan,
1561 np.nan, np.nan, np.nan, np.nan,
1562 np.nan, np.nan, np.nan, np.nan,
1563 np.nan, np.nan, np.nan, np.nan,
1564 np.nan, np.nan, np.nan, np.nan,
1565 np.nan, np.nan, np.nan, np.nan,
1566 np.nan, np.nan, np.nan, np.nan,
1567 np.nan, np.nan, np.nan, np.nan,
1568 np.nan, np.nan, np.nan, np.nan,
1569 np.nan, np.nan, np.nan, np.nan,
1570 np.nan, np.nan, np.nan, np.nan,
1571 np.nan, np.nan, np.nan, np.nan,
1572 np.nan, np.nan, np.nan, np.nan,
1573 np.nan, np.nan, np.nan, np.nan,
1574 np.nan, np.nan, np.nan, np.nan])
1575 elif not dense and mode == "normal":
1576 # Taken from B protocol run 13557, detector 94, amplifier C02
1577 ptcTurnoff = 92173.9596
1578 rawMeans = np.array([
1579 7.35242203e+01, 9.29532799e+01, 1.12149391e+02, 1.39776279e+02,
1580 1.74220020e+02, 2.15692281e+02, 2.68814926e+02, 3.34446868e+02,
1581 4.14359931e+02, 5.14691775e+02, 6.40642848e+02, 7.95596873e+02,
1582 9.90753280e+02, 1.22885224e+03, 1.52684706e+03, 1.89907469e+03,
1583 2.35701770e+03, 2.93106806e+03, 3.59466174e+03, 4.46720318e+03,
1584 5.55232373e+03, 6.90091293e+03, 8.57660238e+03, 1.06583769e+04,
1585 1.32457052e+04, 1.64618675e+04, 2.04605037e+04, 2.54301936e+04,
1586 3.15926481e+04, 3.87784321e+04, 4.81318315e+04, 5.97145570e+04,
1587 7.41859291e+04, 9.21739596e+04, 1.08484387e+05, 1.10456942e+05,
1588 1.10677645e+05, 1.10691134e+05, 1.10693202e+05, 1.10692292e+05,
1589 1.10699619e+05, 1.10703407e+05, 1.10704764e+05])
1590 rawVars = np.array([
1591 71.66098099, 85.85187266, 100.07444552, 121.59045422,
1592 143.54998243, 171.39262057, 210.51220342, 257.40796789,
1593 313.11677494, 381.91333248, 476.46542075, 583.72632638,
1594 729.26397749, 888.46194891, 1101.58606157, 1363.39263745,
1595 1686.28916615, 2096.14920835, 2552.12897667, 3159.70329711,
1596 3894.29254595, 4800.37079501, 5940.17760433, 7310.2253724,
1597 9015.14374818, 11022.81586492, 13509.18049715, 16391.89059679,
1598 19905.15871788, 23628.84875886, 28128.21785629, 33476.91933085,
1599 40023.07406229, 45198.48421179, 3390.76561947, 1601.38678043,
1600 1890.12715102, 1805.34862035, 1904.84156084, 1903.84859699,
1601 1857.15885789, 1889.45649514, 1892.01672711])
1602 elif not dense and mode == "upturn":
1603 # Taken from B protocol run 13557, detector 73, amplifier C07
1604 ptcTurnoff = 71832.2986
1605 rawMeans = np.array([
1606 5.65607783e+01, 7.04062631e+01, 8.74047057e+01, 1.08812996e+02,
1607 1.35333046e+02, 1.67636667e+02, 2.08445200e+02, 2.59202618e+02,
1608 3.21602277e+02, 3.99545078e+02, 4.96963648e+02, 6.17791959e+02,
1609 7.67578708e+02, 9.54040040e+02, 1.18587264e+03, 1.47297327e+03,
1610 1.83109922e+03, 2.27527491e+03, 2.79309339e+03, 3.47193365e+03,
1611 4.31520802e+03, 5.36244611e+03, 6.66482002e+03, 8.28357528e+03,
1612 1.02962387e+04, 1.27972565e+04, 1.59069356e+04, 1.97746199e+04,
1613 2.45737678e+04, 3.01873089e+04, 3.75075197e+04, 4.65677579e+04,
1614 5.77977537e+04, 7.18322986e+04, 8.92553708e+04, 9.74408608e+04,
1615 np.nan, np.nan, np.nan, np.nan,
1616 np.nan, np.nan, np.nan])
1617 rawVars = np.array([
1618 68.2700079, 76.51661413, 84.52771312, 98.70960506,
1619 113.95644441, 137.2544902, 158.39159813, 190.7985178,
1620 229.92447148, 279.52534113, 338.90663196, 414.97072284,
1621 510.16012626, 622.00951125, 763.81268011, 938.07098006,
1622 1149.75983481, 1424.88125193, 1745.36382679, 2165.89927287,
1623 2666.43505016, 3303.63407541, 4094.4066631, 5072.7831761,
1624 6238.35971003, 7697.01580574, 9479.41363292, 11654.65158713,
1625 14268.54471588, 17316.88016853, 21012.8242229, 25275.74644538,
1626 30725.05799423, 37363.24467221, 39830.3337401, 48083.26241611,
1627 np.nan, np.nan, np.nan, np.nan,
1628 np.nan, np.nan, np.nan])
1629 elif not dense and mode == "dip":
1630 # Taken from B protocol run 13557, detector 46, amplifier C16
1631 ptcTurnoff = 87557.8289
1632 rawMeans = np.array(
1633 [6.94187281e+01, 8.92438988e+01, 1.05958756e+02, 1.32423251e+02,
1634 1.64877564e+02, 2.04367731e+02, 2.55076247e+02, 3.16940500e+02,
1635 3.92525299e+02, 4.87631833e+02, 6.06783494e+02, 7.53540982e+02,
1636 9.39742534e+02, 1.16367754e+03, 1.44670172e+03, 1.80047945e+03,
1637 2.23357272e+03, 2.77872101e+03, 3.40646845e+03, 4.23306945e+03,
1638 5.26085005e+03, 6.53969254e+03, 8.12914423e+03, 1.01016373e+04,
1639 1.25546410e+04, 1.56072062e+04, 1.93987924e+04, 2.41153677e+04,
1640 2.99669024e+04, 3.67956267e+04, 4.56879445e+04, 5.66901053e+04,
1641 7.04360489e+04, 8.75578289e+04, 1.08738204e+05, np.nan,
1642 np.nan, np.nan, np.nan, np.nan,
1643 np.nan, np.nan, np.nan])
1644 rawVars = np.array(
1645 [61.7553328, 75.60175792, 88.98931208, 106.95977,
1646 129.78637495, 153.5130247, 192.25182776, 233.4904232,
1647 287.02595043, 349.57554198, 428.71515892, 528.0987701,
1648 656.97011401, 820.88213784, 1003.62289116, 1243.67283887,
1649 1543.24210179, 1905.00050382, 2321.63329694, 2889.08652787,
1650 3574.52610263, 4393.02299998, 5427.50087472, 6691.62708604,
1651 8226.42941205, 10104.75767742, 12365.56291744, 15029.66357377,
1652 18233.5785582, 21684.66746226, 25811.97832361, 30686.30643311,
1653 36834.73747467, 41993.20346722, 30079.64884394, np.nan,
1654 np.nan, np.nan, np.nan, np.nan,
1655 np.nan, np.nan, np.nan])
1656 else:
1657 raise RuntimeError("Illegal mode")
1659 return rawMeans, rawVars, ptcTurnoff
1662class MeasurePhotonTransferCurveDatasetTestCase(lsst.utils.tests.TestCase):
1663 def setUp(self):
1664 self.ptcData = PhotonTransferCurveDataset(["C00", "C01"], " ")
1665 self.ptcData.inputExpIdPairs = {
1666 "C00": [(123, 234), (345, 456), (567, 678)],
1667 "C01": [(123, 234), (345, 456), (567, 678)],
1668 }
1670 def test_generalBehaviour(self):
1671 test = PhotonTransferCurveDataset(["C00", "C01"], " ")
1672 test.inputExpIdPairs = {
1673 "C00": [(123, 234), (345, 456), (567, 678)],
1674 "C01": [(123, 234), (345, 456), (567, 678)],
1675 }
1678class TestMemory(lsst.utils.tests.MemoryTestCase):
1679 pass
1682def setup_module(module):
1683 lsst.utils.tests.init()
1686if __name__ == "__main__": 1686 ↛ 1687line 1686 didn't jump to line 1687, because the condition on line 1686 was never true
1687 lsst.utils.tests.init()
1688 unittest.main()