1 from __future__
import absolute_import, division, print_function
16 """Make and write an image of an entire focal plane 20 camera : `lsst.afw.cameraGeom.Camera` 22 exposures : `dict` mapping detector ID to `lsst.afw.image.Exposure` 23 CCD exposures, binned by `binning`. 25 Binning size that has been applied to images. 27 class ImageSource(object):
28 """Source of images for makeImageFromCamera""" 29 def __init__(self, exposures):
34 exposures : `dict` mapping detector ID to `lsst.afw.image.Exposure` 35 CCD exposures, already binned. 38 self.exposures = exposures
39 self.background = np.nan
41 def getCcdImage(self, detector, imageFactory, binSize):
42 """Provide image of CCD to makeImageFromCamera""" 43 if detector.getId()
not in self.exposures:
44 return imageFactory(1, 1), detector
45 image = self.exposures[detector.getId()]
46 if hasattr(image,
"getMaskedImage"):
47 image = image.getMaskedImage()
48 if hasattr(image,
"getMask"):
49 mask = image.getMask()
50 isBad = mask.getArray() & mask.getPlaneBitMask(
"NO_DATA") > 0
52 image.getImage().getArray()[isBad] = self.background
53 if hasattr(image,
"getImage"):
54 image = image.getImage()
55 return image, detector
57 image = makeImageFromCamera(
59 imageSource=ImageSource(exposures),
60 imageFactory=afwImage.ImageF,
67 binning = Field(dtype=int, default=8, doc=
"Binning factor to apply")
71 ConfigClass = VisualizeVisitConfig
72 _DefaultName =
"visualizeVisit" 75 BatchPoolTask.__init__(self, *args, **kwargs)
79 def _makeArgumentParser(cls, *args, **kwargs):
80 kwargs.pop(
"doBatch",
False)
81 parser = ArgumentParser(name=
"visualizeVisit", *args, **kwargs)
82 parser.add_id_argument(
"--id", datasetType=
"calexp", level=
"visit",
83 help=
"data ID, e.g. --id visit=12345")
88 """Return walltime request for batch job 90 Subclasses should override if the walltime should be calculated 91 differently (e.g., addition of some serial time). 96 Requested time per iteration. 97 parsedCmd : `argparse.Namespace` 98 Results of argument parsing. 102 numTargets = len(cls.RunnerClass.getTargetList(parsedCmd))
103 return time*numTargets
106 """Generate an image of the entire visit 108 Only the master node executes this method; it controls the slave nodes, 109 which do the data retrieval. 113 expRef : `lsst.daf.persistence.ButlerDataRef` 114 Data reference for exposure. 119 pool.storeSet(butler=expRef.getButler())
121 with self.
logOperation(
"processing %s" % (expRef.dataId,)):
122 camera = expRef.get(
"camera")
123 dataIdList = [ccdRef.dataId
for ccdRef
in expRef.subItems(
"ccd")
if 124 ccdRef.datasetExists(
"calexp")]
126 exposures = pool.map(self.
readImage, dataIdList)
127 exposures = dict(keyValue
for keyValue
in exposures
if keyValue
is not None)
129 expRef.put(image,
"calexp_camera")
132 """Collect original image for visualisation 134 This method runs on the slave nodes. 138 cache : `lsst.pipe.base.Struct` 147 image : `lsst.afw.image.MaskedImage` 150 exposure = cache.butler.get(
"calexp", dataId)
151 return (exposure.getDetector().getId(),
152 afwMath.binImage(exposure.getMaskedImage(), self.config.binning))
154 def _getConfigName(self):
155 """It's not worth preserving the configuration""" 158 def _getMetadataName(self):
159 """There's no metadata to write out"""
def readImage(self, cache, dataId)
def batchWallTime(cls, time, parsedCmd, numCores)
def logOperation(self, operation, catch=False, trace=True)
def __init__(self, args, kwargs)
def makeCameraImage(camera, exposures, binning)