LSSTApplications  17.0+11,17.0+34,17.0+56,17.0+57,17.0+59,17.0+7,17.0-1-g377950a+33,17.0.1-1-g114240f+2,17.0.1-1-g4d4fbc4+28,17.0.1-1-g55520dc+49,17.0.1-1-g5f4ed7e+52,17.0.1-1-g6dd7d69+17,17.0.1-1-g8de6c91+11,17.0.1-1-gb9095d2+7,17.0.1-1-ge9fec5e+5,17.0.1-1-gf4e0155+55,17.0.1-1-gfc65f5f+50,17.0.1-1-gfc6fb1f+20,17.0.1-10-g87f9f3f+1,17.0.1-11-ge9de802+16,17.0.1-16-ga14f7d5c+4,17.0.1-17-gc79d625+1,17.0.1-17-gdae4c4a+8,17.0.1-2-g26618f5+29,17.0.1-2-g54f2ebc+9,17.0.1-2-gf403422+1,17.0.1-20-g2ca2f74+6,17.0.1-23-gf3eadeb7+1,17.0.1-3-g7e86b59+39,17.0.1-3-gb5ca14a,17.0.1-3-gd08d533+40,17.0.1-30-g596af8797,17.0.1-4-g59d126d+4,17.0.1-4-gc69c472+5,17.0.1-6-g5afd9b9+4,17.0.1-7-g35889ee+1,17.0.1-7-gc7c8782+18,17.0.1-9-gc4bbfb2+3,w.2019.22
LSSTDataManagementBasePackage
matchFakeStars.py
Go to the documentation of this file.
1 """
2 matchFakes.py
3 matches fakes based on position stored in the calibrated exposure image header
4 """
5 
6 import argparse
7 import re
8 import collections
9 
10 import numpy as np
11 
12 import lsst.daf.persistence as dafPersist
13 
14 
15 def getFakeSources(rootdir, dataId, tol=0.1):
16  """Get list of sources which agree in position with fake ones with tol
17  """
18  butler = dafPersist.Butler(rootdir)
19 
20  sources = butler.get('src', dataId)
21  cal_md = butler.get('calexp_md', dataId)
22 
23  # Get the X, Y locations of objects on the CCD
24  srcX, srcY = sources.getX(), sources.getY()
25  # Get the zeropoint
26  zeropoint = 2.5*np.log10(cal_md.getScalar("FLUXMAG0"))
27  # Get the PSF flux and its error
28  flux, ferr = sources.getPsfFlux(), sources.getPsfFluxErr()
29  # Convert them into magnitude and its error
30  mag, merr = 2.5*np.log10(flux), 2.5/np.log(10)*(ferr/flux)
31  mag = zeropoint - mag
32 
33  # X, Y locations of the fake stars
34  fakeXY = collections.defaultdict(tuple)
35  # Regular Expression
36  fakename = re.compile('FAKE([0-9]+)')
37  for card in cal_md.names():
38  m = fakename.match(card)
39  if m is not None:
40  x, y = list(map(float, (cal_md.getScalar(card)).split(',')))
41  fakeXY[int(m.group(1))] = (x, y)
42 
43  srcIndex = collections.defaultdict(list)
44  for fid, fcoord in fakeXY.items():
45  matched = ((np.abs(srcX-fcoord[0]) < tol) &
46  (np.abs(srcY-fcoord[1]) < tol))
47  srcIndex[fid] = np.where(matched)[0]
48 
49  srcPsfMag = []
50  srcPsfMerr = []
51  matchX = []
52  matchY = []
53  for s in srcIndex.values():
54  if len(s) > 0:
55  ss = s[0]
56  srcPsfMag.append(mag[ss])
57  srcPsfMerr.append(merr[ss])
58  matchX.append(srcX[ss])
59  matchY.append(srcY[ss])
60  else:
61  srcPsfMag.append(0)
62  srcPsfMerr.append(0)
63  matchX.append(0)
64  matchY.append(0)
65 
66  return srcIndex, fakeXY, matchX, matchY, srcPsfMag, srcPsfMerr
67 
68 
69 def main():
70 
71  # TODO: this should use the LSST/HSC conventions
72  parser = argparse.ArgumentParser()
73  parser.add_argument('rootDir', help='root dir of data repo')
74  parser.add_argument('visit', help='id of visit', type=int)
75  parser.add_argument('ccd', help='id of ccd', type=int)
76  args = parser.parse_args()
77 
78  starIndex, fakeXY, matchX, matchY, starPsfMag, starPsfMerr = getFakeSources(args.rootDir,
79  {'visit': args.visit,
80  'ccd': args.ccd})
81 
82  nInject = len(fakeXY)
83  nMatch = len(np.argwhere(starPsfMag))
84  print("# Number of Injected Stars : %d" % nInject)
85  print("# Number of Matched Stars : %d" % nMatch)
86  print("# Visit = %d CCD = %d" % (args.visit, args.ccd))
87  print("# FakeX FakeY PSFMag PSFMagErr Deblend ")
88 
89  for i in range(nInject):
90  if len(starIndex[i]) > 1:
91  deblend = "blended"
92  elif starPsfMag[i] > 0:
93  deblend = "isolate"
94  else:
95  deblend = "nomatch"
96 
97  injectXY = fakeXY[i]
98 
99  print("%6.1d %6.1d %7.3f %6.3f %s" % (injectXY[0], injectXY[1],
100  starPsfMag[i], starPsfMerr[i], deblend))
101 
102 
103 if __name__ == '__main__':
104  main()
def getFakeSources(rootdir, dataId, tol=0.1)
daf::base::PropertyList * list
Definition: fits.cc:885