LSSTApplications  19.0.0-14-gb0260a2+599893a4c6,20.0.0+126303c00d,20.0.0+2f3d0e5c40,20.0.0+36ef800059,20.0.0+5ac7adcc0c,20.0.0+693a64958a,20.0.0+bebc1f60e8,20.0.0+cad136aba6,20.0.0+e2e26847c2,20.0.0+e69b5d60e7,20.0.0-1-g10df615+11b215b765,20.0.0-1-g253301a+36ef800059,20.0.0-1-g2b7511a+bebc1f60e8,20.0.0-1-g4d801e7+aeeb640673,20.0.0-1-g5b95a8c+f111d5f02f,20.0.0-1-g660595b+f45b7d88f4,20.0.0-1-gc96f8cb+e3b38461e6,20.0.0-1-gd1c87d7+85c46248f3,20.0.0-1-gedffbd8+d0b27f8bcb,20.0.0-16-g111fe95+e3b38461e6,20.0.0-16-g18096c8+d1a4df0137,20.0.0-16-g233ea98+a4df35922d,20.0.0-17-ga9337b4+41f27cfd54,20.0.0-2-g4dae9ad+e3b38461e6,20.0.0-2-g7818986+85c46248f3,20.0.0-2-gec03fae+ff10c6d78d,20.0.0-28-g282f9e7e+feda6aebd8,20.0.0-3-g4cc78c6+63636aeed8,20.0.0-3-g6a8623c+d1a4df0137,20.0.0-3-g750bffe+f5427621ce,20.0.0-4-gfea843c+f45b7d88f4,20.0.0-5-g357b56b+f45b7d88f4,20.0.0-5-gfcebe35+e2b15ed341,20.0.0-52-g73d9071+9bf1eb8e0a,20.0.0-7-gcda7bf1+773ba852cb,20.0.0-8-g4540fe2a+952f6d3c43,20.0.0-9-g61a2a9a3d+14f89e4eca,w.2020.40
LSSTDataManagementBasePackage
compareModel.py
Go to the documentation of this file.
1 """
2 Compare the input fake galaxy model to the output one
3 """
4 import argparse
5 
6 import numpy as np
7 import astropy.table
8 
9 import lsst.pipe.base
10 import lsst.afw.table
12 import lsst.daf.persistence as dafPersist
13 
14 from .matchFakes import getFakeSources
15 
16 
17 def getParams(record, galType='sersic'):
18  """
19  return the semi-major axis, axis ratio and position angle (in degrees)
20  """
21  fluxType = {'dev': 'cmodel.dev',
22  'exp': 'cmodel.exp',
23  'sersic': 'cmodel',
24  'cmodel': 'cmodel'}[galType]
25 
26  e = lsst.afw.geom.ellipses.Axes(record.get(fluxType + '.ellipse'))
27  q = (e.getB() / e.getA())
28  reff = e.getA()
29  pa = (e.getTheta() * 180.0 / np.pi)
30  return reff, q, pa
31 
32 
33 def getMag(record, fluxType='cmodel'):
34  """
35  return the magnitude and error
36  """
37  flux, fluxerr = record.get(fluxType), record.get(fluxType+'.err')
38  mag, magerr = -2.5 * np.log10(flux), 2.5/np.log(10.0)*fluxerr/flux
39  mag += record.get('zeropoint')
40  return mag, magerr
41 
42 
43 def writeNumpyTable(fakeTable):
44  """Writes output to numpy
45  """
46  npTable = np.recarray(len(fakeTable),
47  dtype={'names': ['id', 'fakeid', 'visit', 'ccd',
48  'cmodelMag', 'expMag',
49  'devMag',
50  'expReff', 'devReff',
51  'expBA', 'devBA',
52  'expPosAng', 'devPosAng',
53  'cmodelMagErr', 'expMagErr',
54  'devMagErr', 'nchild', 'parent'],
55  'formats': [int, int, int, int,
56  float, float,
57  float, float, float, float,
58  float, float, float, float,
59  float, float, int, int]})
60  for indFake, fake in enumerate(fakeTable):
61  npTable[indFake]['id'] = fake.get('id')
62  npTable[indFake]['fakeid'] = fake.get('fakeId')
63  npTable[indFake]['ccd'] = fake.get('ccd')
64  npTable[indFake]['visit'] = fake.get('visit')
65  nameMatch = {'sersic': 'cmodel',
66  'exp': 'cmodel.exp',
67  'cmodel': 'cmodel',
68  'dev': 'cmodel.dev'}
69  for name in ('cmodel', 'exp', 'dev'):
70  m1, m2 = getMag(fake, nameMatch[name]+'.flux')
71  npTable[indFake][name+'Mag'] = m1
72  npTable[indFake][name+'MagErr'] = m2
73  for name in ('exp', 'dev'):
74  params = getParams(fake, name)
75  npTable[indFake][name+'Reff'] = params[0]
76  npTable[indFake][name+'BA'] = params[1]
77  npTable[indFake][name+'PosAng'] = params[2]
78  npTable[indFake]['nchild'] = fake.get('deblend.nchild')
79  npTable[indFake]['parent'] = fake.get('parent')
80  return npTable
81 
82 
83 def main(root, visit, ccds, galType='sersic', output='outputs/'):
84  """
85  main function for controlling fake source comparison
86  """
87  butler = dafPersist.Butler(root)
88  fakeTable = None
89  for ccd in ccds:
90  dataId = {'visit': visit, 'ccd': ccd}
91  try:
92  temp = getFakeSources(butler, dataId, tol=1.0,
93  visit=True, ccd=True)
94  except Exception:
95  continue
96  if fakeTable is None:
97  fakeTable = temp.copy(True)
98  else:
99  fakeTable.extend(temp, True)
100 
101  npTable = writeNumpyTable(fakeTable)
102  rerunName = root.split('/')[-2]
103  tableFileName = output + '/' + rerunName + '_galMags.txt'
104  astropy.table.Table(npTable).write(tableFileName, format='ascii')
105 
106 
107 if __name__ == '__main__':
108  parser = argparse.ArgumentParser()
109  parser.add_argument('root', help="Root directory of data repository")
110  parser.add_argument("visit", type=int, help="Visit")
111  parser.add_argument("--ccd", nargs='+', type=int, help="CCD(s)")
112  parser.add_argument('-g', '--galtype', type=str, dest='galType',
113  choices=['exp', 'dev', 'sersic'])
114  parser.add_argument('-o', '--outputpath', dest='outpath',
115  help='path for output')
116  args = parser.parse_args()
117 
118  main(args.root, args.visit, args.ccd, galType=args.galType,
119  output=args.outpath)
lsst.synpipe.compareModel.writeNumpyTable
def writeNumpyTable(fakeTable)
Definition: compareModel.py:43
lsst.synpipe.matchFakes.getFakeSources
def getFakeSources(butler, dataId, tol=1.0, extraCols=('zeropoint', 'visit', 'ccd'), includeMissing=False, footprints=False, radecMatch=None, multiband=False, reffMatch=False, pix=0.168, minRad=None, raCol='RA', decCol='Dec')
Definition: matchFakes.py:215
lsst.synpipe.compareModel.getMag
def getMag(record, fluxType='cmodel')
Definition: compareModel.py:33
lsst::afw::geom::ellipses::Axes
An ellipse core for the semimajor/semiminor axis and position angle parametrization (a,...
Definition: Axes.h:47
lsst.pipe.tasks.mergeDetections.write
def write(self, patchRef, catalog)
Write the output.
Definition: mergeDetections.py:388
lsst::daf::persistence.butler.Butler
Definition: butler.py:321
lsst::afw::geom::ellipses
Definition: Axes.h:42
lsst::afw::table
Definition: table.dox:3
lsst::daf::persistence
Definition: Utils.h:50
lsst.pipe.base
Definition: __init__.py:1
lsst.synpipe.compareModel.getParams
def getParams(record, galType='sersic')
Definition: compareModel.py:17
lsst.synpipe.compareModel.main
def main(root, visit, ccds, galType='sersic', output='outputs/')
Definition: compareModel.py:83