23 'DiffMatchedTractCatalogConfig',
'DiffMatchedTractCatalogTask',
'MatchedCatalogFluxesConfig',
31import lsst.pipe.base.connectionTypes
as cT
39DiffMatchedTractCatalogBaseTemplates = {
40 "name_input_cat_ref":
"truth_summary",
41 "name_input_cat_target":
"objectTable_tract",
42 "name_skymap": BaseSkyMap.SKYMAP_DATASET_TYPE_NAME,
47 pipeBase.PipelineTaskConnections,
48 dimensions=(
"tract",
"skymap"),
49 defaultTemplates=DiffMatchedTractCatalogBaseTemplates,
52 doc=
"Reference object catalog to match from",
53 name=
"{name_input_cat_ref}",
54 storageClass=
"DataFrame",
55 dimensions=(
"tract",
"skymap"),
58 cat_target = cT.Input(
59 doc=
"Target object catalog to match",
60 name=
"{name_input_cat_target}",
61 storageClass=
"DataFrame",
62 dimensions=(
"tract",
"skymap"),
66 doc=
"Input definition of geometry/bbox and projection/wcs for coadded exposures",
68 storageClass=
"SkyMap",
69 dimensions=(
"skymap",),
71 cat_match_ref = cT.Input(
72 doc=
"Reference matched catalog with indices of target matches",
73 name=
"match_ref_{name_input_cat_ref}_{name_input_cat_target}",
74 storageClass=
"DataFrame",
75 dimensions=(
"tract",
"skymap"),
78 cat_match_target = cT.Input(
79 doc=
"Target matched catalog with indices of references matches",
80 name=
"match_target_{name_input_cat_ref}_{name_input_cat_target}",
81 storageClass=
"DataFrame",
82 dimensions=(
"tract",
"skymap"),
85 cat_matched = cT.Output(
86 doc=
"Catalog with reference and target columns for matched sources only",
87 name=
"matched_{name_input_cat_ref}_{name_input_cat_target}",
88 storageClass=
"DataFrame",
89 dimensions=(
"tract",
"skymap"),
94 column_ref_flux = pexConfig.Field(
96 doc=
'Reference catalog flux column name',
98 columns_target_flux = pexConfig.ListField(
100 listCheck=
lambda x: len(set(x)) == len(x),
101 doc=
"List of target catalog flux column names",
103 columns_target_flux_err = pexConfig.ListField(
105 listCheck=
lambda x: len(set(x)) == len(x),
106 doc=
"List of target catalog flux error column names",
119 pipeBase.PipelineTaskConfig,
120 pipelineConnections=DiffMatchedTractCatalogConnections,
122 column_matched_prefix_ref = pexConfig.Field(
125 doc=
'The prefix for matched columns copied from the reference catalog',
127 column_ref_extended = pexConfig.Field(
129 default=
'is_pointsource',
130 doc=
'The boolean reference table column specifying if the target is extended',
132 column_ref_extended_inverted = pexConfig.Field(
135 doc=
'Whether column_ref_extended specifies if the object is compact, not extended',
137 column_target_extended = pexConfig.Field(
139 default=
'refExtendedness',
140 doc=
'The target table column estimating the extendedness of the object (0 <= x <= 1)',
147 for columns_list
in (
151 (x.columns_in_ref
for x
in self.
columns_fluxcolumns_flux.values()),
153 for columns
in columns_list:
154 columns_all.extend(columns)
156 return set(columns_all)
160 columns_all = [self.
coord_formatcoord_format.column_target_coord1, self.
coord_formatcoord_format.column_target_coord2,
162 if self.
coord_formatcoord_format.coords_ref_to_convert
is not None:
163 columns_all.extend(self.
coord_formatcoord_format.coords_ref_to_convert.values())
164 for columns_list
in (
171 (x.columns_in_target
for x
in self.
columns_fluxcolumns_flux.values()),
173 for columns
in columns_list:
174 columns_all.extend(columns)
175 return set(columns_all)
177 columns_flux = pexConfig.ConfigDictField(
179 itemtype=MatchedCatalogFluxesConfig,
180 doc=
"Configs for flux columns for each band",
182 columns_ref_copy = pexConfig.ListField(
185 doc=
'Reference table columns to copy to copy into cat_matched',
187 columns_target_coord_err = pexConfig.ListField(
189 listCheck=
lambda x: (len(x) == 2)
and (x[0] != x[1]),
190 doc=
'Target table coordinate columns with standard errors (sigma)',
192 columns_target_copy = pexConfig.ListField(
195 doc=
'Target table columns to copy to copy into cat_matched',
197 columns_target_select_true = pexConfig.ListField(
199 default=(
'detect_isPrimary',),
200 doc=
'Target table columns to require to be True for selecting sources',
202 columns_target_select_false = pexConfig.ListField(
204 default=(
'merge_peak_sky',),
205 doc=
'Target table columns to require to be False for selecting sources',
207 coord_format = pexConfig.ConfigField(
208 dtype=ConvertCatalogCoordinatesConfig,
209 doc=
"Configuration for coordinate conversion",
214 """Load subsets of matched catalogs and output a merged catalog of matched sources.
216 ConfigClass = DiffMatchedTractCatalogConfig
217 _DefaultName = "DiffMatchedTractCatalog"
220 inputs = butlerQC.get(inputRefs)
221 skymap = inputs.pop(
"skymap")
223 outputs = self.
runrun(
224 catalog_ref=inputs[
'cat_ref'].get(parameters={
'columns': self.config.columns_in_ref}),
225 catalog_target=inputs[
'cat_target'].get(parameters={
'columns': self.config.columns_in_target}),
226 catalog_match_ref=inputs[
'cat_match_ref'].get(
227 parameters={
'columns': [
'match_candidate',
'match_row']},
229 catalog_match_target=inputs[
'cat_match_target'].get(
230 parameters={
'columns': [
'match_row']},
232 wcs=skymap[butlerQC.quantum.dataId[
"tract"]].wcs,
234 butlerQC.put(outputs, outputRefs)
238 catalog_ref: pd.DataFrame,
239 catalog_target: pd.DataFrame,
240 catalog_match_ref: pd.DataFrame,
241 catalog_match_target: pd.DataFrame,
242 wcs: afwGeom.SkyWcs =
None,
243 ) -> pipeBase.Struct:
244 """Load matched reference and target (measured) catalogs, measure summary statistics (TBD) and output
245 a combined matched catalog with columns
from both inputs.
249 catalog_ref : `pandas.DataFrame`
250 A reference catalog to diff objects/sources
from.
251 catalog_target : `pandas.DataFrame`
252 A target catalog to diff reference objects/sources to.
253 catalog_match_ref : `pandas.DataFrame`
254 A catalog
with match indices of target sources
and selection flags
255 for each reference source.
256 catalog_match_target : `pandas.DataFrame`
257 A catalog
with selection flags
for each target source.
258 wcs : `lsst.afw.image.SkyWcs`
259 A coordinate system to convert catalog positions to sky coordinates,
264 retStruct : `lsst.pipe.base.Struct`
265 A struct
with output_ref
and output_target attribute containing the
266 output matched catalogs.
272 select_target = (catalog_match_target[
'match_candidate'].values
273 if 'match_candidate' in catalog_match_target.columns
274 else np.ones(len(catalog_match_target), dtype=bool))
275 for column
in config.columns_target_select_true:
276 select_target &= catalog_target[column].values
277 for column
in config.columns_target_select_false:
278 select_target &= ~catalog_target[column].values
280 ref, target = config.coord_format.format_catalogs(
281 catalog_ref=catalog_ref, catalog_target=catalog_target,
282 select_ref=
None, select_target=select_target, wcs=wcs, radec_to_xy_func=radec_to_xy,
283 return_converted_columns=config.coord_format.coords_ref_to_convert
is not None,
285 cat_ref = ref.catalog
286 cat_target = target.catalog
287 n_target = len(cat_target)
289 match_row = catalog_match_ref[
'match_row'].values
290 matched_ref = match_row >= 0
291 matched_row = match_row[matched_ref]
292 matched_target = np.zeros(n_target, dtype=bool)
293 matched_target[matched_row] =
True
296 cat_left = cat_target.iloc[matched_row]
297 has_index_left = cat_left.index.name
is not None
298 cat_right = cat_ref[matched_ref].reset_index()
299 cat_matched = pd.concat((cat_left.reset_index(drop=
True), cat_right), 1)
301 cat_matched.index = cat_left.index
302 cat_matched.columns.values[len(cat_target.columns):] = [f
'refcat_{col}' for col
in cat_right.columns]
304 retStruct = pipeBase.Struct(cat_matched=cat_matched)
columns_target_select_true
Set[str] columns_in_ref(self)
columns_target_select_false
Set[str] columns_in_target(self)
pipeBase.Struct run(self, pd.DataFrame catalog_ref, pd.DataFrame catalog_target, pd.DataFrame catalog_match_ref, pd.DataFrame catalog_match_target, afwGeom.SkyWcs wcs=None)
def runQuantum(self, butlerQC, inputRefs, outputRefs)
Set[str] columns_in_ref(self)
Set[str] columns_in_target(self)