LSSTApplications  16.0-10-g0ee56ad+5,16.0-11-ga33d1f2+5,16.0-12-g3ef5c14+3,16.0-12-g71e5ef5+18,16.0-12-gbdf3636+3,16.0-13-g118c103+3,16.0-13-g8f68b0a+3,16.0-15-gbf5c1cb+4,16.0-16-gfd17674+3,16.0-17-g7c01f5c+3,16.0-18-g0a50484+1,16.0-20-ga20f992+8,16.0-21-g0e05fd4+6,16.0-21-g15e2d33+4,16.0-22-g62d8060+4,16.0-22-g847a80f+4,16.0-25-gf00d9b8+1,16.0-28-g3990c221+4,16.0-3-gf928089+3,16.0-32-g88a4f23+5,16.0-34-gd7987ad+3,16.0-37-gc7333cb+2,16.0-4-g10fc685+2,16.0-4-g18f3627+26,16.0-4-g5f3a788+26,16.0-5-gaf5c3d7+4,16.0-5-gcc1f4bb+1,16.0-6-g3b92700+4,16.0-6-g4412fcd+3,16.0-6-g7235603+4,16.0-69-g2562ce1b+2,16.0-8-g14ebd58+4,16.0-8-g2df868b+1,16.0-8-g4cec79c+6,16.0-8-gadf6c7a+1,16.0-8-gfc7ad86,16.0-82-g59ec2a54a+1,16.0-9-g5400cdc+2,16.0-9-ge6233d7+5,master-g2880f2d8cf+3,v17.0.rc1
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:833