Skip to content

Commit b70190b

Browse files
authored
Merge pull request #296 from lsst/tickets/DM-46105
DM-46105: Add matching for diaSrcs and split metrics between pre & post filtering diaSrcs
2 parents a842004 + 438fc7e commit b70190b

File tree

1 file changed

+108
-10
lines changed

1 file changed

+108
-10
lines changed

python/lsst/analysis/tools/atools/diaFakeMetrics.py

Lines changed: 108 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323
__all__ = ("FractionFoundFakesDiaSnrMetric", "FractionFoundFakesDiaMagMetric")
2424

2525
import numpy as np
26-
from lsst.pex.config import Field
26+
from lsst.pex.config import Field, ListField
2727

2828
from ..actions.scalar import CountAction, FracThreshold
29-
from ..actions.vector import DownselectVector, RangeSelector
29+
from ..actions.vector import FlagSelector, MultiCriteriaDownselectVector, RangeSelector
3030
from ..interfaces import AnalysisTool
3131

3232

@@ -44,33 +44,81 @@ class FractionFoundFakesDiaSnrMetric(AnalysisTool):
4444
"Flux type for fake sources metric calculation.", default="forced_base_PsfFlux_instFlux"
4545
)
4646

47+
fakeFlagsWhenTrue = ListField[str](
48+
"Flags for fake source cleaning before metrics calculation.", default=[]
49+
)
50+
51+
fakeFlagsWhenFalse = ListField[str](
52+
"Flags for fake source cleaning before metrics calculation.",
53+
default=[
54+
"forced_base_PixelFlags_flag_bad",
55+
"forced_base_LocalBackground_flag",
56+
"forced_base_PixelFlags_flag_interpolated",
57+
"forced_base_PixelFlags_flag_edgeCenter",
58+
],
59+
)
60+
4761
def setDefaults(self):
4862
super().setDefaults()
4963

5064
def finalize(self):
5165
# There is no need to calculate the SNR as it is already estimated
5266
# Select the fake sources using their SNR values for the given range
5367
# and flux type estimation
54-
self.process.filterActions.fakeSourcesDiaSrcId = DownselectVector(
55-
vectorKey="diaSourceId",
56-
selector=RangeSelector(
57-
vectorKey=f"{self.fluxType}_SNR", maximum=self.snrMax, minimum=self.snrMin
58-
),
68+
self.process.filterActions.fakeSourcesDiaSrcId = MultiCriteriaDownselectVector(
69+
vectorKey="diaSourceId"
70+
)
71+
72+
self.process.filterActions.fakeSourcesDiaSrcId.selectors.snrange = RangeSelector(
73+
vectorKey=f"{self.fluxType}_SNR", maximum=self.snrMax, minimum=self.snrMin
74+
)
75+
76+
self.process.filterActions.fakeSourcesDiaSrcId.selectors.fakeFlags = FlagSelector(
77+
selectWhenFalse=self.fakeFlagsWhenFalse, selectWhenTrue=self.fakeFlagsWhenTrue
5978
)
6079

6180
self.process.calculateActions.numTotalFakeSources = CountAction(vectorKey="fakeSourcesDiaSrcId")
6281

6382
self.process.calculateActions.numFoundFakeSources = CountAction(
6483
vectorKey="fakeSourcesDiaSrcId", op="gt", threshold=0
6584
)
85+
6686
self.process.calculateActions.fractionFoundFakesDiaAll = FracThreshold(
6787
vectorKey="fakeSourcesDiaSrcId", op="gt", threshold=0
6888
)
89+
90+
self.process.filterActions.fakeSourcesAssocDiaSrcId = MultiCriteriaDownselectVector(
91+
vectorKey="isAssocDiaSource"
92+
)
93+
94+
self.process.filterActions.fakeSourcesAssocDiaSrcId.selectors.snrange = RangeSelector(
95+
vectorKey=f"{self.fluxType}_SNR", maximum=self.snrMax, minimum=self.snrMin
96+
)
97+
98+
self.process.filterActions.fakeSourcesAssocDiaSrcId.selectors.fakeFlags = FlagSelector(
99+
selectWhenFalse=self.fakeFlagsWhenFalse, selectWhenTrue=self.fakeFlagsWhenTrue
100+
)
101+
102+
self.process.calculateActions.numTotalFakeAssocSources = CountAction(
103+
vectorKey="fakeSourcesAssocDiaSrcId"
104+
)
105+
106+
self.process.calculateActions.numFoundFakeAssocSources = CountAction(
107+
vectorKey="fakeSourcesAssocDiaSrcId", op="gt", threshold=0
108+
)
109+
110+
self.process.calculateActions.fractionFoundFakesAssocDiaAll = FracThreshold(
111+
vectorKey="fakeSourcesAssocDiaSrcId", op="gt", threshold=0
112+
)
113+
69114
# the units for the quantity (count, an astropy quantity)
70115
self.produce.metric.units = {
71116
"numTotalFakeSources": "ct",
72117
"numFoundFakeSources": "ct",
73118
"fractionFoundFakesDiaAll": "",
119+
"numTotalFakeAssocSources": "ct",
120+
"numFoundFakeAssocSources": "ct",
121+
"fractionFoundFakesAssocDiaAll": "",
74122
}
75123

76124

@@ -84,24 +132,74 @@ class FractionFoundFakesDiaMagMetric(AnalysisTool):
84132

85133
magMax = Field[float](doc="Maximum magnitude for fake sources metric calculation.", default=22)
86134

135+
fakeFlagsWhenTrue = ListField[str](
136+
"Flags for fake source cleaning before metrics calculation.", default=[]
137+
)
138+
139+
fakeFlagsWhenFalse = ListField[str](
140+
"Flags for fake source cleaning before metrics calculation.",
141+
default=[
142+
"forced_base_PixelFlags_flag_interpolated",
143+
"forced_base_LocalBackground_flag",
144+
"forced_base_PixelFlags_flag_bad",
145+
"forced_base_PixelFlags_flag_edgeCenter",
146+
],
147+
)
148+
87149
def finalize(self):
88150
# Selecting the fake sources using the truth magnitude values.
89-
self.process.filterActions.fakeSourcesDiaSrcId = DownselectVector(
90-
vectorKey="diaSourceId",
91-
selector=RangeSelector(vectorKey="mag", maximum=self.magMax, minimum=self.magMin),
151+
self.process.filterActions.fakeSourcesDiaSrcId = MultiCriteriaDownselectVector(
152+
vectorKey="diaSourceId"
153+
)
154+
155+
self.process.filterActions.fakeSourcesDiaSrcId.selectors.magrange = RangeSelector(
156+
vectorKey="mag", maximum=self.magMax, minimum=self.magMin
157+
)
158+
159+
self.process.filterActions.fakeSourcesDiaSrcId.selectors.fakeFlags = FlagSelector(
160+
selectWhenFalse=self.fakeFlagsWhenFalse, selectWhenTrue=self.fakeFlagsWhenTrue
92161
)
93162

94163
self.process.calculateActions.numTotalFakeSources = CountAction(vectorKey="fakeSourcesDiaSrcId")
95164

96165
self.process.calculateActions.numFoundFakeSources = CountAction(
97166
vectorKey="fakeSourcesDiaSrcId", op="gt", threshold=0
98167
)
168+
99169
self.process.calculateActions.fractionFoundFakesDiaAll = FracThreshold(
100170
vectorKey="fakeSourcesDiaSrcId", op="gt", threshold=0
101171
)
172+
173+
self.process.filterActions.fakeSourcesAssocDiaSrcId = MultiCriteriaDownselectVector(
174+
vectorKey="isAssocDiaSource"
175+
)
176+
177+
self.process.filterActions.fakeSourcesAssocDiaSrcId.selectors.magrange = RangeSelector(
178+
vectorKey="mag", maximum=self.magMax, minimum=self.magMin
179+
)
180+
181+
self.process.filterActions.fakeSourcesAssocDiaSrcId.selectors.fakeFlags = FlagSelector(
182+
selectWhenFalse=self.fakeFlagsWhenFalse, selectWhenTrue=self.fakeFlagsWhenTrue
183+
)
184+
185+
self.process.calculateActions.numTotalFakeAssocSources = CountAction(
186+
vectorKey="fakeSourcesAssocDiaSrcId"
187+
)
188+
189+
self.process.calculateActions.numFoundFakeAssocSources = CountAction(
190+
vectorKey="fakeSourcesAssocDiaSrcId", op="gt", threshold=0
191+
)
192+
193+
self.process.calculateActions.fractionFoundFakesAssocDiaAll = FracThreshold(
194+
vectorKey="fakeSourcesAssocDiaSrcId", op="gt", threshold=0
195+
)
196+
102197
# the units for the quantity (count, an astropy quantity)
103198
self.produce.metric.units = {
104199
"numTotalFakeSources": "ct",
105200
"numFoundFakeSources": "ct",
106201
"fractionFoundFakesDiaAll": "",
202+
"numTotalFakeAssocSources": "ct",
203+
"numFoundFakeAssocSources": "ct",
204+
"fractionFoundFakesAssocDiaAll": "",
107205
}

0 commit comments

Comments
 (0)