12 from lsst.pipe.base
import ArgumentParser
14 from argparse
import ArgumentParser
25 from lsst.pipe.base
import Task
as BatchPoolTask
29 """Make and write an image of an entire focal plane
36 CCD exposures, binned by `binning`.
38 Binning size that has been applied to images.
41 """Source of images for makeImageFromCamera"""
42 def __init__(self, exposures):
48 CCD exposures, already binned.
51 self.exposures = exposures
52 self.background = np.nan
54 def getCcdImage(self, detector, imageFactory, binSize):
55 """Provide image of CCD to makeImageFromCamera"""
56 detId = detector.getId()
57 if detId
not in self.exposures:
58 dims = detector.getBBox().getDimensions()/binSize
59 image = imageFactory(*[int(xx)
for xx
in dims])
60 image.set(self.background)
62 image = self.exposures[detector.getId()]
63 if hasattr(image,
"getMaskedImage"):
64 image = image.getMaskedImage()
65 if hasattr(image,
"getMask"):
66 mask = image.getMask()
67 isBad = mask.getArray() & mask.getPlaneBitMask(
"NO_DATA") > 0
69 image.getImage().getArray()[isBad] = self.background
70 if hasattr(image,
"getImage"):
71 image = image.getImage()
73 image = afwMath.rotateImageBy90(image, detector.getOrientation().getNQuarter())
75 return image, detector
77 image = makeImageFromCamera(
79 imageSource=ImageSource(exposures),
80 imageFactory=afwImage.ImageF,
87 binning = Field(dtype=int, default=8, doc=
"Binning factor to apply")
91 ConfigClass = VisualizeVisitConfig
92 _DefaultName =
"visualizeVisit"
95 BatchPoolTask.__init__(self, *args, **kwargs)
99 def _makeArgumentParser(cls, *args, **kwargs):
100 kwargs.pop(
"doBatch",
False)
101 parser = ArgumentParser(name=
"visualizeVisit", *args, **kwargs)
102 parser.add_id_argument(
"--id", datasetType=
"calexp", level=
"visit",
103 help=
"data ID, e.g. --id visit=12345")
108 """Return walltime request for batch job
110 Subclasses should override if the walltime should be calculated
111 differently (e.g., addition of some serial time).
116 Requested time per iteration.
117 parsedCmd : `argparse.Namespace`
118 Results of argument parsing.
122 numTargets = len(cls.RunnerClass.getTargetList(parsedCmd))
123 return time*numTargets
126 """Generate an image of the entire visit
128 Only the master node executes this method; it controls the slave nodes,
129 which do the data retrieval.
133 expRef : `lsst.daf.persistence.ButlerDataRef`
134 Data reference for exposure.
139 pool.storeSet(butler=expRef.getButler())
141 with self.
logOperation(
"processing %s" % (expRef.dataId,)):
142 camera = expRef.get(
"camera")
143 dataIdList = [ccdRef.dataId
for ccdRef
in expRef.subItems(
"ccd")
if
144 ccdRef.datasetExists(
"calexp")]
146 exposures = pool.map(self.
readImage, dataIdList)
147 exposures = dict(keyValue
for keyValue
in exposures
if keyValue
is not None)
149 expRef.put(image,
"calexp_camera")
152 """Collect original image for visualisation
154 This method runs on the slave nodes.
158 cache : `lsst.pipe.base.Struct`
170 exposure = cache.butler.get("calexp", dataId)
171 return (exposure.getDetector().getId(),
172 afwMath.binImage(exposure.getMaskedImage(), self.config.binning))
174 def _getConfigName(self):
175 """It's not worth preserving the configuration"""
178 def _getMetadataName(self):
179 """There's no metadata to write out"""
def logOperation(self, operation, catch=False, trace=True)
def batchWallTime(cls, time, parsedCmd, numCores)
def runDataRef(self, expRef)
def __init__(self, *args, **kwargs)
def readImage(self, cache, dataId)
def makeCameraImage(camera, exposures, binning)