lsst.synpipe  15.0-4-g9ee0f43+3
matchFakeStars.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 """
3 matchFakes.py
4 matches fakes based on position stored in the calibrated exposure image header
5 """
6 from __future__ import print_function
7 
8 from builtins import map
9 from builtins import range
10 import lsst.daf.persistence as dafPersist
11 from lsst.afw.table.tableLib import SourceCatalog
12 import numpy as np
13 import argparse
14 import re
15 import collections
16 
17 
18 def getFakeSources(rootdir, dataId, tol=0.1):
19  """Get list of sources which agree in position with fake ones with tol
20  """
21  butler = dafPersist.Butler(rootdir)
22 
23  sources = butler.get('src', dataId)
24  cal_md = butler.get('calexp_md', dataId)
25 
26  # Get the X, Y locations of objects on the CCD
27  srcX, srcY = sources.getX(), sources.getY()
28  # Get the zeropoint
29  zeropoint = 2.5*np.log10(cal_md.get("FLUXMAG0"))
30  # Get the PSF flux and its error
31  flux, ferr = sources.getPsfFlux(), sources.getPsfFluxErr()
32  # Convert them into magnitude and its error
33  mag, merr = 2.5*np.log10(flux), 2.5/np.log(10)*(ferr/flux)
34  mag = zeropoint - mag
35 
36  # X, Y locations of the fake stars
37  fakeXY = collections.defaultdict(tuple)
38  # Regular Expression
39  fakename = re.compile('FAKE([0-9]+)')
40  for card in cal_md.names():
41  m = fakename.match(card)
42  if m is not None:
43  x, y = list(map(float, (cal_md.get(card)).split(',')))
44  fakeXY[int(m.group(1))] = (x, y)
45 
46  srcIndex = collections.defaultdict(list)
47  for fid, fcoord in fakeXY.items():
48  matched = ((np.abs(srcX-fcoord[0]) < tol) &
49  (np.abs(srcY-fcoord[1]) < tol))
50  s1 = sources.subset(matched)
51  srcIndex[fid] = np.where(matched)[0]
52 
53  #srcList = None
54  srcPsfMag = []
55  srcPsfMerr = []
56  matchX = []
57  matchY = []
58  for s in srcIndex.values():
59  #for ss in s:
60  #if srcList is None:
61  # srcList = SourceCatalog(sources.getSchema())
62  # srcList.append(sources[ss])
63  #
64  if len(s) > 0:
65  ss = s[0]
66  srcPsfMag.append(mag[ss])
67  srcPsfMerr.append(merr[ss])
68  matchX.append(srcX[ss])
69  matchY.append(srcY[ss])
70  else:
71  srcPsfMag.append(0)
72  srcPsfMerr.append(0)
73  matchX.append(0)
74  matchY.append(0)
75 
76  return srcIndex, fakeXY, matchX, matchY, srcPsfMag, srcPsfMerr
77 
78 
79 def main():
80 
81  #TODO: this should use the LSST/HSC conventions
82  parser = argparse.ArgumentParser()
83  parser.add_argument('rootDir', help='root dir of data repo')
84  parser.add_argument('visit', help='id of visit', type=int)
85  parser.add_argument('ccd', help='id of ccd', type=int)
86  args = parser.parse_args()
87 
88  #(starIndex,starList) = getFakeSources(args.rootDir, {'visit':args.visit, 'ccd':args.ccd})
89  (starIndex, fakeXY, matchX, matchY, starPsfMag, starPsfMerr) = getFakeSources(args.rootDir,
90  {'visit': args.visit, 'ccd': args.ccd})
91 
92  nInject = len(fakeXY)
93  nMatch = len(np.argwhere(starPsfMag))
94  print("# Number of Injected Stars : %d" % nInject)
95  print("# Number of Matched Stars : %d" % nMatch)
96  print("# Visit = %d CCD = %d" % (args.visit, args.ccd))
97  print("# FakeX FakeY PSFMag PSFMagErr Deblend ")
98 
99  for i in range(nInject):
100  if len(starIndex[i]) > 1:
101  deblend = "blended"
102  elif starPsfMag[i] > 0:
103  deblend = "isolate"
104  else:
105  deblend = "nomatch"
106 
107  injectXY = fakeXY[i]
108 
109  print("%6.1d %6.1d %7.3f %6.3f %s" % (injectXY[0], injectXY[1],
110  starPsfMag[i], starPsfMerr[i], deblend))
111 
112 
113 if __name__ == '__main__':
114  main()
def getFakeSources(rootdir, dataId, tol=0.1)