LSSTApplications  18.0.0+106,18.0.0+50,19.0.0,19.0.0+1,19.0.0+10,19.0.0+11,19.0.0+13,19.0.0+17,19.0.0+2,19.0.0-1-g20d9b18+6,19.0.0-1-g425ff20,19.0.0-1-g5549ca4,19.0.0-1-g580fafe+6,19.0.0-1-g6fe20d0+1,19.0.0-1-g7011481+9,19.0.0-1-g8c57eb9+6,19.0.0-1-gb5175dc+11,19.0.0-1-gdc0e4a7+9,19.0.0-1-ge272bc4+6,19.0.0-1-ge3aa853,19.0.0-10-g448f008b,19.0.0-12-g6990b2c,19.0.0-2-g0d9f9cd+11,19.0.0-2-g3d9e4fb2+11,19.0.0-2-g5037de4,19.0.0-2-gb96a1c4+3,19.0.0-2-gd955cfd+15,19.0.0-3-g2d13df8,19.0.0-3-g6f3c7dc,19.0.0-4-g725f80e+11,19.0.0-4-ga671dab3b+1,19.0.0-4-gad373c5+3,19.0.0-5-ga2acb9c+2,19.0.0-5-gfe96e6c+2,w.2020.01
LSSTDataManagementBasePackage
FakeSourceLib.py
Go to the documentation of this file.
1 import numpy as np
2 
3 import lsst.afw.geom
4 import lsst.afw.math
5 import lsst.pex.config
6 import lsst.afw.image
8 import lsst.pipe.base as pipeBase
9 
10 
11 """
12 Helper functions for making fake sources
13 """
14 
15 
16 class SkyMapIdContainer(pipeBase.DataIdContainer):
17  """A version of lsst.pipe.base.DataIdContainer specialized for loading a skyMap
18  in the make fake source catalog scripts. These scripts use the data id in a
19  unique way, such that they only need a tract number. This class supports that
20  use case and should not be used in any other contexts in the LSST stack.
21  Required because butler.subset does not support only tract
22  """
23 
24  def makeDataRefList(self, namespace):
25  """Make self.refList from self.idList
26  """
27 
28  for dataId in self.idList:
29  if "tract" not in dataId:
30  raise RuntimeError("id must specify which tract to process tract")
31  # warn about unused options
32  for key in dataId:
33  if key != "tract":
34  namespace.log.warn("'{}' specified in --id is unused and will be ignored".format(key))
35  addList = [dataId]
36 
37  self.refList += [namespace.butler.dataRef(datasetType="deepCoadd_skyMap", dataId=addId)
38  for addId in addList]
39 
40 
41 def cropFakeImage(fakeImage, expBBox):
42  """
43  Crops the Fake image to fit inside the exposure BBox
44  Note that the bboxes need to have the correct offsets applied
45  Args:
46  fakeImage: fake image object
47  expBBox: bounding box for CCD exposure (integer type, BBoxI)
48  and with offsets applied
49 
50  Returns:
51  New cropped fake image
52  """
53  fakeBBox = fakeImage.getBBox(lsst.afw.image.PARENT)
54 
55  if not expBBox.contains(fakeBBox):
56  newBBox = fakeImage.getBBox(lsst.afw.image.PARENT)
57  newBBox.clip(expBBox)
58  fakeImage = fakeImage.Factory(fakeImage, newBBox,
59  lsst.afw.image.PARENT)
60  # TODO: finish this up
61 
62 
63 def addNoise(galImage, detector, rand_gen=None):
64  """
65  adds noise to the the image and returns a variance plane
66  INPUT: image to add noise to
67  detector where the image will be located, this sets the gain
68  NOTE: this assumes float type images and will break if given doubles
69  RETURN: a MaskedImageF with the image with additional noise and the
70  variance plane
71  giving the variance due to the object
72  """
73  # TODO: this is gaussian noise right now, probably good enough
74  varImage = galImage.Factory(galImage, True)
75  if rand_gen is None:
76  rand_gen = np.random
77  scale = np.sqrt(np.abs(varImage.getArray())) + 1e-12
78  noiseArray = rand_gen.normal(loc=0.0,
79  scale=scale,
80  size=(galImage.getHeight(),
81  galImage.getWidth()))
82  noiseImage = lsst.afw.image.ImageF(noiseArray.astype(np.float32))
83  galImage += noiseImage
84 
85  return lsst.afw.image.MaskedImageF(galImage, None, varImage)
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174
def cropFakeImage(fakeImage, expBBox)
def addNoise(galImage, detector, rand_gen=None)
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects...