62 def assembleCcd(self, assembleInput):
63 """Assemble a set of amps into a single CCD size image.
64
65 Parameters
66 ----------
67 assembleInput : `dict` [`str`, `lsst.afw.image.Exposure`] or \
68 `lsst.afw.image.Exposure`
69 Either a dictionary of amp exposures, or a single exposure
70 containing all raw amps. If a dictionary of amp exposures, the key
71 should be the amp name.
72
73 Returns
74 -------
75 assembledCcd : `lsst.afw.image.Exposure`
76 An exposure of the assembled amp sections.
77
78 Raises
79 ------
80 TypeError
81 Raised if the input exposures to be assembled do not adhere to the
82 required format.
83 RuntimeError
84 Raised if the detector set on the input exposure is not set.
85 """
86 ccd = None
87 if isinstance(assembleInput, dict):
88
89
90
91
92 ccd = next(iter(assembleInput.values())).getDetector()
93
94 def getNextExposure(amp):
95 return assembleInput[amp.getName()]
96 elif hasattr(assembleInput, "getMaskedImage"):
97
98 ccd = assembleInput.getDetector()
99
100 def getNextExposure(amp):
101 return assembleInput
102 else:
103 raise TypeError("Expected either a dictionary of amp exposures or a single raw exposure")
104
105 if ccd is None:
106 raise RuntimeError("No ccd detector found")
107
108 if not self.config.doTrim:
109 outBox = cameraGeomUtils.calcRawCcdBBox(ccd)
110 else:
111 outBox = ccd.getBBox()
112 outExposure = afwImage.ExposureF(outBox)
113 outMI = outExposure.getMaskedImage()
114
115 if self.config.doTrim:
116 assemble = cameraGeom.assembleAmplifierImage
117 else:
118 assemble = cameraGeom.assembleAmplifierRawImage
119
120 for amp in ccd:
121 inMI = getNextExposure(amp).getMaskedImage()
122 assemble(outMI, inMI, amp)
123
124
125
126
127
128
129 if not self.config.doTrim:
130 ccd = cameraGeom.makeUpdatedDetector(ccd)
131
132 outExposure.setDetector(ccd)
133 self.postprocessExposure(outExposure=outExposure, inExposure=getNextExposure(ccd[0]))
134
135 return outExposure
136