4 from __future__
import print_function
5 from __future__
import absolute_import
6 from builtins
import str
19 from lsst.pipe.tasks.fakes
import BaseFakeSourcesConfig, BaseFakeSourcesTask
21 from .
import FakeSourceLib
as fsl
22 from .
import makeFakeGalaxy
as makeFake
26 galList = lsstConfig.Field(dtype=str,
27 doc=
"catalog of galaxies to add")
28 maxMargin = lsstConfig.Field(dtype=int, default=600,
31 seed = lsstConfig.Field(dtype=int, default=1,
32 doc=
"Seed for random number generator")
33 addShear = lsstConfig.Field(dtype=bool, default=
False,
34 doc=
'include shear in the galaxies')
35 addMask = lsstConfig.Field(dtype=bool, default=
False,
36 doc=
'add FAKE mask plane')
37 sersic_prec = lsstConfig.Field(dtype=float, default=0.0,
38 doc=
'The desired precision for n')
39 cosStr =
'Use Galsim.COSMOSlog()' 40 serStr =
'Single sersic galaxies added' 41 dSerStr =
'Double sersic galaxies added' 42 realStr =
'Real HST galaxy images added' 43 galType = lsstConfig.ChoiceField(dtype=str, default=
'sersic',
44 allowed={
'dsersic': dSerStr,
48 doc=
'type of GalSim galaxies to add')
49 exclusionLevel = lsstConfig.ChoiceField(dtype=str, default=
'none',
50 allowed={
'none':
"None",
51 'marginal':
"Marginal",
52 'bad_stamp':
"Bad Stamp",
53 'bad_fits':
"Bad Fits"},
54 doc=
'Exclusion level')
58 ConfigClass = PositionGalSimFakesConfig
61 BaseFakeSourcesTask.__init__(self, **kwargs)
62 print(
"RNG seed:", self.config.seed)
64 self.
npRand = np.random.RandomState(self.config.seed)
65 self.
galData = fits.open(self.config.galList)[1].data
67 def run(self, exposure, background):
68 self.log.info(
"Adding fake galaxies at real positions")
69 PARENT = lsst.afw.image.PARENT
70 psf = exposure.getPsf()
71 md = exposure.getMetadata()
72 calib = exposure.getCalib()
73 expBBox = exposure.getBBox(PARENT)
74 wcs = exposure.getWcs()
76 """Deal with the skipped ones.""" 77 skipLog =
'runAddFake.skipped' 78 if not os.path.isfile(skipLog):
79 os.system(
'touch ' + skipLog)
81 if self.config.galType
is 'cosmos':
83 exLevel = self.config.exclusionLevel
84 cosmosCat = galsim.COSMOSCatalog(exclusion_level=exLevel)
88 for igal, gal
in enumerate(self.
galData):
95 flux = calib.getFlux(
float(gal[
'mag']))
97 raise KeyError(
"No mag column in %s" % self.config.galList)
102 raise KeyError(
"No RA/DEC column in {} table".format(self.config.galList))
104 skyToPixelMatrix = wcs.linearizeSkyToPixel(galCoord, lsst.afw.geom.degrees)
105 skyToPixelMatrix = skyToPixelMatrix.getLinear().getParameterVector() / 3600.0
107 galXY = wcs.skyToPixel(galCoord)
108 bboxI = exposure.getBBox(PARENT)
109 bboxI.grow(self.config.maxMargin)
116 self.log.info(
"Mag <= 0: Skipping %d" % galident)
117 self.log.info(
" mag: %7.3d" % gal[
'mag'])
118 with open(skipLog,
"a")
as slog:
120 fcntl.flock(slog, fcntl.LOCK_EX)
121 slog.write(
"%8d , negMag\n" % galident)
122 fcntl.flock(slog, fcntl.LOCK_UN)
131 psfImage = psf.computeKernelImage(galXY)
137 addShear = self.config.addShear
138 prec = self.config.sersic_prec
139 galType = self.config.galType
140 if self.config.galType
is not 'cosmos':
141 galArray = makeFake.makeGalaxy(flux, gal,
147 transform=skyToPixelMatrix)
149 galArray = makeFake.makeGalaxy(flux, gal,
156 transform=skyToPixelMatrix)
157 except IndexError
as ierr:
158 self.log.info(
"GalSim Index Error: Skipping %d" % galident)
159 self.log.info(ierr.message)
160 with open(skipLog,
"a")
as slog:
162 fcntl.flock(slog, fcntl.LOCK_EX)
163 slog.write(
"%8d , galsimI\n" % galident)
164 fcntl.flock(slog, fcntl.LOCK_UN)
168 except KeyError
as kerr:
169 self.log.info(
"GalSim Key Error: Skipping %d" % galident)
170 self.log.info(kerr.message)
171 with open(skipLog,
"a")
as slog:
173 fcntl.flock(slog, fcntl.LOCK_EX)
174 slog.write(
"%8d , galsimK\n" % galident)
175 fcntl.flock(slog, fcntl.LOCK_UN)
179 except ValueError
as verr:
180 self.log.info(
"GalSim Value Error: Skipping %d" % galident)
181 self.log.info(verr.message)
182 with open(skipLog,
"a")
as slog:
184 fcntl.flock(slog, fcntl.LOCK_EX)
185 slog.write(
"%8d , galsimV\n" % galident)
186 fcntl.flock(slog, fcntl.LOCK_UN)
190 except RuntimeError
as rerr:
191 self.log.info(
"GalSim Runtime Error: Skipping %d" % galident)
192 self.log.info(rerr.message)
193 with open(skipLog,
"a")
as slog:
195 fcntl.flock(slog, fcntl.LOCK_EX)
196 slog.write(
"%8d , galsimR\n" % galident)
197 fcntl.flock(slog, fcntl.LOCK_UN)
201 except Exception
as uerr:
202 self.log.info(
"Unexpected Error: Skipping %d" % galident)
203 self.log.info(uerr.message)
204 with open(skipLog,
"a")
as slog:
206 fcntl.flock(slog, fcntl.LOCK_EX)
207 slog.write(
"%8d , Unexpected\n" % galident)
208 fcntl.flock(slog, fcntl.LOCK_UN)
213 galImage = lsst.afw.image.ImageF(galArray.astype(np.float32))
214 galBBox = galImage.getBBox(PARENT)
215 galX0 = (galXY.getX() - galBBox.getWidth()/2.0 + 0.5)
216 galY0 = (galXY.getY() - galBBox.getHeight()/2.0 + 0.5)
220 galBBox = galImage.getBBox(PARENT)
223 parentBox = galImage.getBBox(PARENT)
224 if expBBox.contains(parentBox)
is False:
225 newBBox = galImage.getBBox(PARENT)
226 newBBox.clip(expBBox)
227 if newBBox.getArea() <= 0:
228 self.log.info(
"BBoxEdge Error: Skipping %d" % galident)
229 with open(skipLog,
"a")
as slog:
231 fcntl.flock(slog, fcntl.LOCK_EX)
232 slog.write(
"%8d , bboxEdge\n" % galident)
233 fcntl.flock(slog, fcntl.LOCK_UN)
237 self.log.info(
"Cropping FAKE%d from %s to %s" % (galident,
238 str(galBBox),
str(newBBox)))
239 galImage = galImage.Factory(galImage, newBBox,
243 galMaskedImage = lsst.afw.image.MaskedImageF(galImage)
246 md.set(
"FAKE%s" %
str(galident),
"%.3f, %.3f" % (galXY.getX(),
248 self.log.info(
"Adding fake %s at: %.1f,%.1f" % (
str(galident),
252 galMaskedImage.getMask().set(self.bitmask)
253 if not self.config.addMask:
255 galMaskedImage.getMask().removeAndClearMaskPlane(
'FAKE',
260 galMaskedImage.getMask().removeAndClearMaskPlane(
'CROSSTALK',
265 galMaskedImage.getMask().removeAndClearMaskPlane(
'UNMASKEDNAN',
270 maskedImage = exposure.getMaskedImage()
272 maskedImage.getMask().removeAndClearMaskPlane(
'CROSSTALK',
277 maskedImage.getMask().removeAndClearMaskPlane(
'UNMASKEDNAN',
281 if not self.config.addMask:
283 maskedImage.getMask().removeAndClearMaskPlane(
'FAKE',
True)
287 BBox = galMaskedImage.getBBox(PARENT)
288 subMaskedImage = maskedImage.Factory(exposure.getMaskedImage(),
291 subMaskedImage += galMaskedImage
295 galMaskedImage.getMask().set(self.bitmask) 297 maskedImage = exposure.getMaskedImage() 299 maskedImage.getMask().removeAndClearMaskPlane('CROSSTALK', 304 maskedImage.getMask().removeAndClearMaskPlane('UNMASKEDNAN', 309 maskedImage.getMask().removeAndClearMaskPlane('FAKE', True)
def __init__(self, kwargs)
std::shared_ptr< ImageT > offsetImage(ImageT const &image, float dx, float dy, std::string const &algorithmName="lanczos5", unsigned int buffer=0)
def run(self, exposure, background)