예제 #1
0
파일: fgcmMakeLut.py 프로젝트: lsst/fgcmcal
class FgcmMakeLutConnections(pipeBase.PipelineTaskConnections,
                             dimensions=('instrument', ),
                             defaultTemplates={}):
    camera = connectionTypes.PrerequisiteInput(
        doc="Camera instrument",
        name="camera",
        storageClass="Camera",
        dimensions=("instrument", ),
        lookupFunction=lookupStaticCalibrations,
        isCalibration=True,
    )

    transmission_optics = connectionTypes.PrerequisiteInput(
        doc="Optics transmission curve information",
        name="transmission_optics",
        storageClass="TransmissionCurve",
        dimensions=("instrument", ),
        lookupFunction=lookupStaticCalibrations,
        isCalibration=True,
        deferLoad=True,
    )

    transmission_sensor = connectionTypes.PrerequisiteInput(
        doc="Sensor transmission curve information",
        name="transmission_sensor",
        storageClass="TransmissionCurve",
        dimensions=(
            "instrument",
            "detector",
        ),
        lookupFunction=lookupStaticCalibrations,
        isCalibration=True,
        deferLoad=True,
        multiple=True,
    )

    transmission_filter = connectionTypes.PrerequisiteInput(
        doc="Filter transmission curve information",
        name="transmission_filter",
        storageClass="TransmissionCurve",
        dimensions=(
            "band",
            "instrument",
            "physical_filter",
        ),
        lookupFunction=lookupStaticCalibrations,
        isCalibration=True,
        deferLoad=True,
        multiple=True,
    )

    fgcmLookUpTable = connectionTypes.Output(
        doc=("Atmosphere + instrument look-up-table for FGCM throughput and "
             "chromatic corrections."),
        name="fgcmLookUpTable",
        storageClass="Catalog",
        dimensions=("instrument", ),
    )
예제 #2
0
class SkyCorrectionConnections(pipeBase.PipelineTaskConnections, dimensions=("instrument", "visit")):
    rawLinker = cT.Input(
        doc="Raw data to provide exp-visit linkage to connect calExp inputs to camera/sky calibs.",
        name="raw",
        multiple=True,
        deferLoad=True,
        storageClass="ExposureU",
        dimensions=["instrument", "exposure", "detector"],
    )
    calExpArray = cT.Input(
        doc="Input exposures to process",
        name="calexp",
        multiple=True,
        storageClass="ExposureF",
        dimensions=["instrument", "visit", "detector"],
    )
    calBkgArray = cT.Input(
        doc="Input background files to use",
        multiple=True,
        name="calexpBackground",
        storageClass="Background",
        dimensions=["instrument", "visit", "detector"],
    )
    camera = cT.PrerequisiteInput(
        doc="Input camera to use.",
        name="camera",
        storageClass="Camera",
        dimensions=["instrument", "calibration_label"],
    )
    skyCalibs = cT.PrerequisiteInput(
        doc="Input sky calibrations to use.",
        name="sky",
        multiple=True,
        storageClass="ExposureF",
        dimensions=["instrument", "physical_filter", "detector", "calibration_label"],
    )
    calExpCamera = cT.Output(
        doc="Output camera image.",
        name='calexp_camera',
        storageClass="ImageF",
        dimensions=["instrument", "visit"],
    )
    skyCorr = cT.Output(
        doc="Output sky corrected images.",
        name='skyCorr',
        multiple=True,
        storageClass="Background",
        dimensions=["instrument", "visit", "detector"],
    )
예제 #3
0
class GenerateDonutCatalogWcsTaskConnections(pipeBase.PipelineTaskConnections,
                                             dimensions=("instrument", "visit",
                                                         "detector")):
    """
    Specify the pipeline connections needed for
    GenerateDonutCatalogWcsTask. We
    need the reference catalogs and exposures and
    will produce donut catalogs for a specified instrument.
    """

    refCatalogs = connectionTypes.PrerequisiteInput(
        doc="Reference catalog",
        storageClass="SimpleCatalog",
        dimensions=("htm7", ),
        multiple=True,
        deferLoad=True,
        name="cal_ref_cat",
    )
    exposure = connectionTypes.Input(
        doc="Input exposure to make measurements on",
        dimensions=("exposure", "detector", "instrument"),
        storageClass="Exposure",
        name="postISRCCD",
    )
    donutCatalog = connectionTypes.Output(
        doc="Donut Locations",
        dimensions=(
            "visit",
            "detector",
            "instrument",
        ),
        storageClass="DataFrame",
        name="donutCatalog",
    )
예제 #4
0
class MergeDefectsConnections(pipeBase.PipelineTaskConnections,
                              dimensions=("instrument", "detector")):
    inputDefects = cT.Input(
        name="singleExpDefects",
        doc="Measured defect lists.",
        storageClass="Defects",
        dimensions=("instrument", "detector", "exposure"),
        multiple=True,
    )
    camera = cT.PrerequisiteInput(
        name='camera',
        doc="Camera associated with these defects.",
        storageClass="Camera",
        dimensions=("instrument", ),
        isCalibration=True,
        lookupFunction=lookupStaticCalibration,
    )

    mergedDefects = cT.Output(
        name="defects",
        doc="Final merged defects.",
        storageClass="Defects",
        dimensions=("instrument", "detector"),
        multiple=False,
        isCalibration=True,
    )
예제 #5
0
class ProcessBrightStarsConnections(pipeBase.PipelineTaskConnections,
                                    dimensions=("instrument", "visit", "detector")):
    inputExposure = cT.Input(
        doc="Input exposure from which to extract bright star stamps",
        name="calexp",
        storageClass="ExposureF",
        dimensions=("visit", "detector")
    )
    skyCorr = cT.Input(
        doc="Input Sky Correction to be subtracted from the calexp if doApplySkyCorr=True",
        name="skyCorr",
        storageClass="Background",
        dimensions=("instrument", "visit", "detector")
    )
    refCat = cT.PrerequisiteInput(
        doc="Reference catalog that contains bright star positions",
        name="gaia_dr2_20200414",
        storageClass="SimpleCatalog",
        dimensions=("skypix",),
        multiple=True,
        deferLoad=True
    )
    brightStarStamps = cT.Output(
        doc="Set of preprocessed postage stamps, each centered on a single bright star.",
        name="brightStarStamps",
        storageClass="BrightStarStamps",
        dimensions=("visit", "detector")
    )

    def __init__(self, *, config=None):
        super().__init__(config=config)
        if not config.doApplySkyCorr:
            self.inputs.remove("skyCorr")
예제 #6
0
class SingleStarCentroidTaskConnections(pipeBase.PipelineTaskConnections,
                                        dimensions=("instrument", "visit",
                                                    "detector")):
    inputExp = cT.Input(
        name="icExp",
        doc="Image-characterize output exposure",
        storageClass="ExposureF",
        dimensions=("instrument", "visit", "detector"),
        multiple=False,
    )
    inputSources = cT.Input(
        name="icSrc",
        doc="Image-characterize output sources.",
        storageClass="SourceCatalog",
        dimensions=("instrument", "visit", "detector"),
        multiple=False,
    )
    astromRefCat = cT.PrerequisiteInput(
        doc="Reference catalog to use for astrometry",
        name="gaia_dr2_20200414",
        storageClass="SimpleCatalog",
        dimensions=("skypix", ),
        deferLoad=True,
        multiple=True,
    )
    atmospecCentroid = cT.Output(
        name="atmospecCentroid",
        doc="The main star centroid in yaml format.",
        storageClass="StructuredDataDict",
        dimensions=("instrument", "visit", "detector"),
    )
예제 #7
0
class CpVerifyVisitExpMergeConnections(pipeBase.PipelineTaskConnections,
                                       dimensions={"instrument", "visit"},
                                       defaultTemplates={}):
    inputStats = cT.Input(
        name="detectorStats",
        doc="Input statistics to merge.",
        storageClass="StructuredDataDict",
        dimensions=["instrument", "visit", "detector"],
        multiple=True,
    )
    camera = cT.PrerequisiteInput(
        name="camera",
        storageClass="Camera",
        doc="Input camera.",
        dimensions=[
            "instrument",
        ],
        isCalibration=True,
    )

    outputStats = cT.Output(
        name="exposureStats",
        doc="Output statistics.",
        storageClass="StructuredDataDict",
        dimensions=["instrument", "visit"],
    )
예제 #8
0
class CpFlatNormalizationConnections(pipeBase.PipelineTaskConnections,
                                     dimensions=("instrument",
                                                 "physical_filter")):
    inputMDs = cT.Input(
        name="cpFlatProc_metadata",
        doc="Input metadata for each visit/detector in input set.",
        storageClass="PropertyList",
        dimensions=("instrument", "physical_filter", "detector", "exposure"),
        multiple=True,
    )
    camera = cT.PrerequisiteInput(
        name="camera",
        doc="Input camera to use for gain lookup.",
        storageClass="Camera",
        dimensions=("instrument", ),
        lookupFunction=lookupStaticCalibration,
        isCalibration=True,
    )

    outputScales = cT.Output(
        name="cpFlatNormScales",
        doc="Output combined proposed calibration.",
        storageClass="StructuredDataDict",
        dimensions=("instrument", "physical_filter"),
    )
예제 #9
0
class PhotonTransferCurveSolveConnections(pipeBase.PipelineTaskConnections,
                                          dimensions=("instrument", "detector")
                                          ):
    inputCovariances = cT.Input(
        name="ptcCovariances",
        doc="Tuple with measured covariances from flats.",
        storageClass="PhotonTransferCurveDataset",
        dimensions=("instrument", "exposure", "detector"),
        multiple=True,
    )
    camera = cT.PrerequisiteInput(
        name="camera",
        doc="Camera the input data comes from.",
        storageClass="Camera",
        dimensions=("instrument", ),
        isCalibration=True,
        lookupFunction=lookupStaticCalibration,
    )
    outputPtcDataset = cT.Output(
        name="ptcDatsetProposal",
        doc="Output proposed ptc dataset.",
        storageClass="PhotonTransferCurveDataset",
        dimensions=("instrument", "detector"),
        multiple=False,
        isCalibration=True,
    )
예제 #10
0
    def __init__(self, *, config=None):
        super().__init__(config=config)

        if config and config.exposureScaling != 'InputList':
            self.inputs.discard("inputScales")

        if config and len(config.calibrationDimensions) != 0:
            newDimensions = tuple(config.calibrationDimensions)
            newOutputData = cT.Output(
                name=self.outputData.name,
                doc=self.outputData.doc,
                storageClass=self.outputData.storageClass,
                dimensions=self.allConnections['outputData'].dimensions +
                newDimensions,
                isCalibration=True,
            )
            self.dimensions.update(config.calibrationDimensions)
            self.outputData = newOutputData

            if config.exposureScaling == 'InputList':
                newInputScales = cT.PrerequisiteInput(
                    name=self.inputScales.name,
                    doc=self.inputScales.doc,
                    storageClass=self.inputScales.storageClass,
                    dimensions=self.allConnections['inputScales'].dimensions +
                    newDimensions)
                self.dimensions.update(config.calibrationDimensions)
                self.inputScales = newInputScales
예제 #11
0
class GridFitConnections(pipeBase.PipelineTaskConnections,
                         dimensions=("instrument", "exposure", "detector")):

    inputCat = cT.Input(
        doc="Source catalog produced by characterize spot task.",
        name='spotSrc',
        storageClass="SourceCatalog",
        dimensions=("instrument", "exposure", "detector"))
    bbox = cT.Input(doc="Bounding box for CCD.",
                    name="postISRCCD.bbox",
                    storageClass="Box2I",
                    dimensions=("instrument", "exposure", "detector"))
    gridCalibTable = cT.PrerequisiteInput(
        doc="Calibration table for spot grid.",
        name="gridCalibration",
        storageClass="AstropyTable",
        dimensions=("instrument", "detector"),
        isCalibration=True)
    gridSourceCat = cT.Output(doc="Source catalog produced by grid fit task.",
                              name="gridSpotSrc",
                              storageClass="SourceCatalog",
                              dimensions=("instrument", "exposure",
                                          "detector"))

    def __init__(self, *, config=None):
        super().__init__(config=config)

        if config.useGridCalibration is not True:
            self.prerequisiteInputs.discard("gridCalibTable")
예제 #12
0
class PatchConnections(PipelineTaskConnections, dimensions={"skymap", "tract"}):
    a = connectionTypes.Input(
        name="PatchA",
        storageClass="StructuredData",
        multiple=True,
        dimensions={"skymap", "tract", "patch"},
    )
    b = connectionTypes.PrerequisiteInput(
        name="PatchB",
        storageClass="StructuredData",
        multiple=False,
        dimensions={"skymap", "tract"},
    )
    out = connectionTypes.Output(
        name="PatchOut",
        storageClass="StructuredData",
        multiple=True,
        dimensions={"skymap", "tract", "patch"},
    )

    def __init__(self, *, config=None):
        super().__init__(config=config)

        if not config.doUseB:
            self.prerequisiteInputs.remove("b")
예제 #13
0
class ApertureTaskConnections(
        pipeBase.PipelineTaskConnections,
        defaultTemplates={"outputName": "customAperture"},
        dimensions=("visit", "band"),
):
    exposures = connectionTypes.Input(
        doc="Input exposure to make measurements on",
        dimensions=("visit", "detector", "band"),
        storageClass="ExposureF",
        name="calexp",
        multiple=True,
        deferLoad=True,
    )
    backgrounds = connectionTypes.Input(
        doc="Background model for the exposure",
        storageClass="Background",
        name="calexpBackground",
        dimensions=("visit", "detector", "band"),
        multiple=True,
        deferLoad=True,
    )
    inputCatalogs = connectionTypes.Input(
        doc="Input catalog with existing measurements",
        dimensions=(
            "visit",
            "detector",
            "band",
        ),
        storageClass="SourceCatalog",
        name="src",
        multiple=True,
        deferLoad=True,
    )
    outputCatalogs = connectionTypes.Output(
        doc="Aperture measurements",
        dimensions=("visit", "detector", "band"),
        storageClass="SourceCatalog",
        name="{outputName}",
        multiple=True,
    )
    outputSchema = connectionTypes.InitOutput(
        doc="Schema created in Aperture PipelineTask",
        storageClass="SourceCatalog",
        name="{outputName}_schema",
    )
    areaMasks = connectionTypes.PrerequisiteInput(
        doc="A mask of areas to be ignored",
        storageClass="Mask",
        dimensions=("visit", "detector", "band"),
        name="ApAreaMask",
        multiple=True,
        deferLoad=True,
    )

    def __init__(self, *, config=None):
        super().__init__(config=config)

        if config.doLocalBackground is False:
            self.inputs.remove("backgrounds")
예제 #14
0
class CpVerifyStatsConnections(
        pipeBase.PipelineTaskConnections,
        dimensions={"instrument", "exposure", "detector"},
        defaultTemplates={}):
    inputExp = cT.Input(
        name="postISRCCD",
        doc="Input exposure to calculate statistics for.",
        storageClass="Exposure",
        dimensions=["instrument", "exposure", "detector"],
    )
    taskMetadata = cT.Input(
        name="isrTask_metadata",
        doc="Input task metadata to extract statistics from.",
        storageClass="PropertySet",
        dimensions=["instrument", "exposure", "detector"],
    )
    inputCatalog = cT.Input(
        name="src",
        doc="Input catalog to calculate statistics for.",
        storageClass="SourceCatalog",
        dimensions=["instrument", "visit", "detector"],
    )
    uncorrectedCatalog = cT.Input(
        name="uncorrectedSrc",
        doc="Input catalog without correction applied.",
        storageClass="SourceCatalog",
        dimensions=["instrument", "visit", "detector"],
    )
    camera = cT.PrerequisiteInput(
        name="camera",
        storageClass="Camera",
        doc="Input camera.",
        dimensions=[
            "instrument",
        ],
        isCalibration=True,
    )

    outputStats = cT.Output(
        name="detectorStats",
        doc="Output statistics from cp_verify.",
        storageClass="StructuredDataDict",
        dimensions=["instrument", "exposure", "detector"],
    )

    def __init__(self, *, config=None):
        super().__init__(config=config)

        if len(config.metadataStatKeywords) < 1:
            self.inputs.discard('taskMetadata')

        if len(config.catalogStatKeywords) < 1:
            self.inputs.discard('inputCatalog')
            self.inputs.discard('uncorrectedCatalog')
예제 #15
0
class VircamIsrTaskConnections(IsrTaskConnections):
    confidence = cT.PrerequisiteInput(
        name="confidence",
        doc="Confidence map associated with input exposure to process.",
        storageClass="ExposureF",
        dimensions=["instrument", "exposure", "detector"],
    )

    def __init__(self, *, config=None):
        super().__init__(config=config)

        if config.doVircamConfidence is not True:
            self.prerequisiteInputs.discard("confidence")
예제 #16
0
class EstimateZernikesBaseConnections(pipeBase.PipelineTaskConnections,
                                      dimensions=("detector", "instrument")):
    donutCatalog = connectionTypes.Input(
        doc="Donut Locations",
        dimensions=(
            "visit",
            "detector",
            "instrument",
        ),
        storageClass="DataFrame",
        name="donutCatalog",
        multiple=True,
    )
    camera = connectionTypes.PrerequisiteInput(
        name="camera",
        storageClass="Camera",
        doc="Input camera to construct complete exposures.",
        dimensions=["instrument"],
        isCalibration=True,
        lookupFunction=lookupStaticCalibration,
    )
    donutStampsExtra = connectionTypes.Output(
        doc="Extra-focal Donut Postage Stamp Images",
        dimensions=("visit", "detector", "instrument"),
        storageClass="StampsBase",
        name="donutStampsExtra",
        multiple=True,
    )
    donutStampsIntra = connectionTypes.Output(
        doc="Intra-focal Donut Postage Stamp Images",
        dimensions=("visit", "detector", "instrument"),
        storageClass="StampsBase",
        name="donutStampsIntra",
        multiple=True,
    )
    outputZernikesRaw = connectionTypes.Output(
        doc="Zernike Coefficients from all donuts",
        dimensions=("visit", "detector", "instrument"),
        storageClass="NumpyArray",
        name="zernikeEstimateRaw",
        multiple=True,
    )
    outputZernikesAvg = connectionTypes.Output(
        doc="Zernike Coefficients averaged over donuts",
        dimensions=("visit", "detector", "instrument"),
        storageClass="NumpyArray",
        name="zernikeEstimateAvg",
        multiple=True,
    )
예제 #17
0
class CutOutDonutsBaseTaskConnections(pipeBase.PipelineTaskConnections,
                                      dimensions=("exposure", "instrument")):
    exposures = connectionTypes.Input(
        doc="Input exposure to make measurements on",
        dimensions=("exposure", "detector", "instrument"),
        storageClass="Exposure",
        name="postISRCCD",
        multiple=True,
    )
    donutCatalog = connectionTypes.Input(
        doc="Donut Locations",
        dimensions=(
            "visit",
            "detector",
            "instrument",
        ),
        storageClass="DataFrame",
        name="donutCatalog",
        multiple=True,
    )
    camera = connectionTypes.PrerequisiteInput(
        name="camera",
        storageClass="Camera",
        doc="Input camera to construct complete exposures.",
        dimensions=["instrument"],
        isCalibration=True,
        lookupFunction=lookupStaticCalibration,
    )
    donutStampsExtra = connectionTypes.Output(
        doc="Extra-focal Donut Postage Stamp Images",
        dimensions=("visit", "detector", "instrument"),
        storageClass="StampsBase",
        name="donutStampsExtra",
        multiple=True,
    )
    donutStampsIntra = connectionTypes.Output(
        doc="Intra-focal Donut Postage Stamp Images",
        dimensions=("visit", "detector", "instrument"),
        storageClass="StampsBase",
        name="donutStampsIntra",
        multiple=True,
    )
예제 #18
0
class VisualizeBinExpConnections(pipeBase.PipelineTaskConnections,
                                 dimensions=("instrument", "detector")):
    inputExp = cT.Input(
        name="calexp",
        doc="Input exposure data to mosaic.",
        storageClass="ExposureF",
        dimensions=("instrument", "detector"),
    )
    camera = cT.PrerequisiteInput(
        name="camera",
        doc="Input camera to use for mosaic geometry.",
        storageClass="Camera",
        dimensions=("instrument", "calibration_label"),
    )

    outputExp = cT.Output(
        name="calexpBin",
        doc="Output binned image.",
        storageClass="ExposureF",
        dimensions=("instrument", "detector"),
    )
예제 #19
0
class VisualizeMosaicExpConnections(pipeBase.PipelineTaskConnections,
                                    dimensions=("instrument", )):
    inputExps = cT.Input(
        name="calexpBin",
        doc="Input binned images mosaic.",
        storageClass="ExposureF",
        dimensions=("instrument", "detector"),
        multiple=True,
    )
    camera = cT.PrerequisiteInput(
        name="camera",
        doc="Input camera to use for mosaic geometry.",
        storageClass="Camera",
        dimensions=("instrument", "calibration_label"),
    )

    outputData = cT.Output(
        name="calexpFocalPlane",
        doc="Output binned mosaicked frame.",
        storageClass="ImageF",
        dimensions=("instrument", ),
    )
예제 #20
0
class CrosstalkSolveConnections(pipeBase.PipelineTaskConnections,
                                dimensions=("instrument", "detector")):
    inputRatios = cT.Input(
        name="crosstalkRatios",
        doc="Ratios measured for an input exposure.",
        storageClass="StructuredDataDict",
        dimensions=("instrument", "exposure", "detector"),
        multiple=True,
    )
    inputFluxes = cT.Input(
        name="crosstalkFluxes",
        doc="Fluxes of CT source pixels, for nonlinear fits.",
        storageClass="StructuredDataDict",
        dimensions=("instrument", "exposure", "detector"),
        multiple=True,
    )
    camera = cT.PrerequisiteInput(
        name="camera",
        doc="Camera the input data comes from.",
        storageClass="Camera",
        dimensions=("instrument",),
        isCalibration=True,
        lookupFunction=lookupStaticCalibration,
    )

    outputCrosstalk = cT.Output(
        name="crosstalk",
        doc="Output proposed crosstalk calibration.",
        storageClass="CrosstalkCalib",
        dimensions=("instrument", "detector"),
        multiple=False,
        isCalibration=True,
    )

    def __init__(self, *, config=None):
        super().__init__(config=config)

        if config.fluxOrder == 0:
            self.inputs.discard("inputFluxes")
예제 #21
0
class MeasureDefectsConnections(pipeBase.PipelineTaskConnections,
                                dimensions=("instrument", "exposure",
                                            "detector")):
    inputExp = cT.Input(name="defectExps",
                        doc="Input ISR-processed exposures to measure.",
                        storageClass="Exposure",
                        dimensions=("instrument", "detector", "exposure"),
                        multiple=False)
    camera = cT.PrerequisiteInput(
        name='camera',
        doc="Camera associated with this exposure.",
        storageClass="Camera",
        dimensions=("instrument", ),
        isCalibration=True,
        lookupFunction=lookupStaticCalibration,
    )

    outputDefects = cT.Output(
        name="singleExpDefects",
        doc="Output measured defects.",
        storageClass="Defects",
        dimensions=("instrument", "detector", "exposure"),
    )
예제 #22
0
class CpVerifyBfkConnections(CpVerifyStatsConnections,
                             dimensions={'instrument', 'visit', 'detector'}):
    inputExp = cT.Input(
        name="icExp",
        doc="Input exposure to calculate statistics for.",
        storageClass="ExposureF",
        dimensions=["instrument", "visit", "detector"],
    )
    inputCatalog = cT.Input(
        name="icSrc",
        doc="Input catalog to calculate statistics from.",
        storageClass="SourceCatalog",
        dimensions=["instrument", "visit", "detector"],
    )
    uncorrectedCatalog = cT.Input(
        name="uncorrectedSrc",
        doc="Input catalog without correction applied.",
        storageClass="SourceCatalog",
        dimensions=["instrument", "visit", "detector"],
    )
    camera = cT.PrerequisiteInput(
        name="camera",
        storageClass="Camera",
        doc="Input camera.",
        dimensions=[
            "instrument",
        ],
        isCalibration=True,
    )

    outputStats = cT.Output(
        name="detectorStats",
        doc="Output statistics from cp_verify.",
        storageClass="StructuredDataDict",
        dimensions=["instrument", "visit", "detector"],
    )
예제 #23
0
class ApertureTaskConnections(
        pipeBase.PipelineTaskConnections,
        defaultTemplates={"outputName": "customAperture"},
        dimensions=("visit", "band"),
):
    exposures = connectionTypes.Input(
        doc="Input exposure to make measurements on",
        dimensions=("visit", "detector", "band"),
        storageClass="ExposureF",
        name="calexp",
        multiple=True,
        deferLoad=True,
    )
    backgrounds = connectionTypes.Input(
        doc="Background model for the exposure",
        storageClass="Background",
        name="calexpBackground",
        dimensions=("visit", "detector", "band"),
        multiple=True,
        deferLoad=True,
    )
    inputCatalogs = connectionTypes.Input(
        doc="Input catalog with existing measurements",
        dimensions=(
            "visit",
            "detector",
            "band",
        ),
        storageClass="SourceCatalog",
        name="src",
        multiple=True,
        deferLoad=True,
    )
    outputCatalogs = connectionTypes.Output(
        doc="Aperture measurements",
        dimensions=("visit", "detector", "band"),
        storageClass="SourceCatalog",
        name="{outputName}",
        multiple=True,
    )
    outputSchema = connectionTypes.InitOutput(
        doc="Schema created in Aperture PipelineTask",
        storageClass="SourceCatalog",
        name="{outputName}_schema",
    )
    areaMasks = connectionTypes.PrerequisiteInput(
        doc="A mask of areas to be ignored",
        storageClass="Mask",
        dimensions=("visit", "detector", "band"),
        name="ApAreaMask",
        multiple=True,
        deferLoad=True,
    )

    def __init__(self, *, config=None):
        super().__init__(config=config)

        if config.doLocalBackground is False:
            self.inputs.remove("backgrounds")

    def adjustQuantum(self, inputs, outputs, label, data_id):
        # Find the data IDs common to all multiple=True inputs.
        input_names = ("exposures", "inputCatalogs", "backgrounds")
        inputs_by_data_id = []
        for name in input_names:
            inputs_by_data_id.append(
                {ref.dataId: ref
                 for ref in inputs[name][1]})
        # Intersection looks messy because dict_keys only supports |.
        # not an "intersection" method.
        data_ids_to_keep = functools.reduce(operator.__and__,
                                            (d.keys()
                                             for d in inputs_by_data_id))
        # Pull out just the DatasetRefs that are in common in the inputs
        # and order them consistently (note that consistent ordering is not
        # automatic).
        adjusted_inputs = {}
        for name, refs in zip(input_names, inputs_by_data_id):
            adjusted_inputs[name] = (
                inputs[name][0],
                [refs[data_id] for data_id in data_ids_to_keep],
            )
            # Also update the full dict of inputs, so we can pass it to
            # super() later.
            inputs[name] = adjusted_inputs[name]
        # Do the same for the outputs.
        outputs_by_data_id = {
            ref.dataId: ref
            for ref in outputs["outputCatalogs"][1]
        }
        adjusted_outputs = {
            "outputCatalogs": (
                outputs["outputCatalogs"][0],
                [outputs_by_data_id[data_id] for data_id in data_ids_to_keep],
            )
        }
        outputs["outputCatalogs"] = adjusted_outputs["outputCatalogs"]
        # Delegate to super(); ignore results because they are guaranteed
        # to be empty.
        super().adjustQuantum(inputs, outputs, label, data_id)
        return adjusted_inputs, adjusted_outputs
예제 #24
0
class FgcmCalibrateTractTableConnections(pipeBase.PipelineTaskConnections,
                                         dimensions=(
                                             "instrument",
                                             "tract",
                                         )):
    camera = connectionTypes.PrerequisiteInput(
        doc="Camera instrument",
        name="camera",
        storageClass="Camera",
        dimensions=("instrument", ),
        lookupFunction=lookupStaticCalibrations,
        isCalibration=True,
    )

    fgcmLookUpTable = connectionTypes.PrerequisiteInput(
        doc=("Atmosphere + instrument look-up-table for FGCM throughput and "
             "chromatic corrections."),
        name="fgcmLookUpTable",
        storageClass="Catalog",
        dimensions=("instrument", ),
        deferLoad=True,
    )

    sourceSchema = connectionTypes.InitInput(
        doc="Schema for source catalogs",
        name="src_schema",
        storageClass="SourceCatalog",
    )

    refCat = connectionTypes.PrerequisiteInput(
        doc="Reference catalog to use for photometric calibration",
        name="cal_ref_cat",
        storageClass="SimpleCatalog",
        dimensions=("skypix", ),
        deferLoad=True,
        multiple=True,
    )

    source_catalogs = connectionTypes.Input(
        doc="Source table in parquet format, per visit",
        name="sourceTable_visit",
        storageClass="DataFrame",
        dimensions=("instrument", "visit"),
        deferLoad=True,
        multiple=True,
    )

    visitSummary = connectionTypes.Input(
        doc="Per-visit summary statistics table",
        name="visitSummary",
        storageClass="ExposureCatalog",
        dimensions=("instrument", "visit"),
        deferLoad=True,
        multiple=True,
    )

    background = connectionTypes.Input(
        doc="Calexp background model",
        name="calexpBackground",
        storageClass="Background",
        dimensions=("instrument", "visit", "detector"),
        deferLoad=True,
        multiple=True,
    )

    fgcmPhotoCalib = connectionTypes.Output(
        doc=
        "Per-tract, per-visit photoCalib exposure catalogs produced from fgcm calibration",
        name="fgcmPhotoCalibTractCatalog",
        storageClass="ExposureCatalog",
        dimensions=(
            "instrument",
            "tract",
            "visit",
        ),
        multiple=True,
    )

    fgcmTransmissionAtmosphere = connectionTypes.Output(
        doc=
        "Per-visit atmosphere transmission files produced from fgcm calibration",
        name="transmission_atmosphere_fgcm_tract",
        storageClass="TransmissionCurve",
        dimensions=(
            "instrument",
            "tract",
            "visit",
        ),
        multiple=True,
    )

    fgcmRepeatability = connectionTypes.Output(
        doc="Per-band raw repeatability numbers in the fgcm tract calibration",
        name="fgcmRawRepeatability",
        storageClass="Catalog",
        dimensions=(
            "instrument",
            "tract",
        ),
        multiple=False,
    )

    def __init__(self, *, config=None):
        super().__init__(config=config)

        # The ref_dataset_name will be deprecated with Gen2
        loaderName = config.fgcmBuildStars.fgcmLoadReferenceCatalog.refObjLoader.ref_dataset_name
        if config.connections.refCat != loaderName:
            raise ValueError(
                "connections.refCat must be the same as "
                "config.fgcmBuildStars.fgcmLoadReferenceCatalog.refObjLoader.ref_dataset_name"
            )
        if config.fgcmOutputProducts.doReferenceCalibration:
            loaderName = config.fgcmOutputProducts.refObjLoader.ref_dataset_name
            if config.connections.refCat != loaderName:
                raise ValueError(
                    "connections.refCat must be the same as "
                    "config.fgcmOutputProducts.refObjLoader.ref_dataset_name")

        if not config.fgcmBuildStars.doModelErrorsWithBackground:
            self.inputs.remove("background")

        if not config.fgcmOutputProducts.doAtmosphereOutput:
            self.prerequisiteInputs.remove("fgcmAtmosphereParameters")
        if not config.fgcmOutputProducts.doZeropointOutput:
            self.prerequisiteInputs.remove("fgcmZeropoints")
예제 #25
0
class CalibrateConnections(pipeBase.PipelineTaskConnections, dimensions=("instrument", "visit", "detector"),
                           defaultTemplates={}):

    icSourceSchema = cT.InitInput(
        doc="Schema produced by characterize image task, used to initialize this task",
        name="icSrc_schema",
        storageClass="SourceCatalog",
    )

    outputSchema = cT.InitOutput(
        doc="Schema after CalibrateTask has been initialized",
        name="src_schema",
        storageClass="SourceCatalog",
    )

    exposure = cT.Input(
        doc="Input image to calibrate",
        name="icExp",
        storageClass="ExposureF",
        dimensions=("instrument", "visit", "detector"),
    )

    background = cT.Input(
        doc="Backgrounds determined by characterize task",
        name="icExpBackground",
        storageClass="Background",
        dimensions=("instrument", "visit", "detector"),
    )

    icSourceCat = cT.Input(
        doc="Source catalog created by characterize task",
        name="icSrc",
        storageClass="SourceCatalog",
        dimensions=("instrument", "visit", "detector"),
    )

    astromRefCat = cT.PrerequisiteInput(
        doc="Reference catalog to use for astrometry",
        name="cal_ref_cat",
        storageClass="SimpleCatalog",
        dimensions=("skypix",),
        deferLoad=True,
        multiple=True,
    )

    photoRefCat = cT.PrerequisiteInput(
        doc="Reference catalog to use for photometric calibration",
        name="cal_ref_cat",
        storageClass="SimpleCatalog",
        dimensions=("skypix",),
        deferLoad=True,
        multiple=True
    )

    outputExposure = cT.Output(
        doc="Exposure after running calibration task",
        name="calexp",
        storageClass="ExposureF",
        dimensions=("instrument", "visit", "detector"),
    )

    outputCat = cT.Output(
        doc="Source catalog produced in calibrate task",
        name="src",
        storageClass="SourceCatalog",
        dimensions=("instrument", "visit", "detector"),
    )

    outputBackground = cT.Output(
        doc="Background models estimated in calibration task",
        name="calexpBackground",
        storageClass="Background",
        dimensions=("instrument", "visit", "detector"),
    )

    matches = cT.Output(
        doc="Source/refObj matches from the astrometry solver",
        name="srcMatch",
        storageClass="Catalog",
        dimensions=("instrument", "visit", "detector"),
    )

    matchesDenormalized = cT.Output(
        doc="Denormalized matches from astrometry solver",
        name="srcMatchFull",
        storageClass="Catalog",
        dimensions=("instrument", "visit", "detector"),
    )

    def __init__(self, *, config=None):
        super().__init__(config=config)

        if config.doAstrometry is False:
            self.prerequisiteInputs.remove("astromRefCat")
        if config.doPhotoCal is False:
            self.prerequisiteInputs.remove("photoRefCat")

        if config.doWriteMatches is False or config.doAstrometry is False:
            self.outputs.remove("matches")
        if config.doWriteMatchesDenormalized is False or config.doAstrometry is False:
            self.outputs.remove("matchesDenormalized")
예제 #26
0
class FgcmBuildStarsTableConnections(pipeBase.PipelineTaskConnections,
                                     dimensions=("instrument", ),
                                     defaultTemplates={}):
    camera = connectionTypes.PrerequisiteInput(
        doc="Camera instrument",
        name="camera",
        storageClass="Camera",
        dimensions=("instrument", ),
        lookupFunction=lookupStaticCalibrations,
        isCalibration=True,
    )

    fgcmLookUpTable = connectionTypes.PrerequisiteInput(
        doc=("Atmosphere + instrument look-up-table for FGCM throughput and "
             "chromatic corrections."),
        name="fgcmLookUpTable",
        storageClass="Catalog",
        dimensions=("instrument", ),
        deferLoad=True,
    )

    sourceSchema = connectionTypes.InitInput(
        doc="Schema for source catalogs",
        name="src_schema",
        storageClass="SourceCatalog",
    )

    refCat = connectionTypes.PrerequisiteInput(
        doc="Reference catalog to use for photometric calibration",
        name="cal_ref_cat",
        storageClass="SimpleCatalog",
        dimensions=("skypix", ),
        deferLoad=True,
        multiple=True,
    )

    sourceTable_visit = connectionTypes.Input(
        doc="Source table in parquet format, per visit",
        name="sourceTable_visit",
        storageClass="DataFrame",
        dimensions=("instrument", "visit"),
        deferLoad=True,
        multiple=True,
    )

    visitSummary = connectionTypes.Input(
        doc=("Per-visit consolidated exposure metadata.  These catalogs use "
             "detector id for the id and must be sorted for fast lookups of a "
             "detector."),
        name="visitSummary",
        storageClass="ExposureCatalog",
        dimensions=("instrument", "visit"),
        deferLoad=True,
        multiple=True,
    )

    background = connectionTypes.Input(
        doc="Calexp background model",
        name="calexpBackground",
        storageClass="Background",
        dimensions=("instrument", "visit", "detector"),
        deferLoad=True,
        multiple=True,
    )

    fgcmVisitCatalog = connectionTypes.Output(
        doc="Catalog of visit information for fgcm",
        name="fgcmVisitCatalog",
        storageClass="Catalog",
        dimensions=("instrument", ),
    )

    fgcmStarObservations = connectionTypes.Output(
        doc="Catalog of star observations for fgcm",
        name="fgcmStarObservations",
        storageClass="Catalog",
        dimensions=("instrument", ),
    )

    fgcmStarIds = connectionTypes.Output(
        doc="Catalog of fgcm calibration star IDs",
        name="fgcmStarIds",
        storageClass="Catalog",
        dimensions=("instrument", ),
    )

    fgcmStarIndices = connectionTypes.Output(
        doc="Catalog of fgcm calibration star indices",
        name="fgcmStarIndices",
        storageClass="Catalog",
        dimensions=("instrument", ),
    )

    fgcmReferenceStars = connectionTypes.Output(
        doc="Catalog of fgcm-matched reference stars",
        name="fgcmReferenceStars",
        storageClass="Catalog",
        dimensions=("instrument", ),
    )

    def __init__(self, *, config=None):
        super().__init__(config=config)

        if not config.doReferenceMatches:
            self.prerequisiteInputs.remove("refCat")
            self.prerequisiteInputs.remove("fgcmLookUpTable")

        if not config.doModelErrorsWithBackground:
            self.inputs.remove("background")

        if not config.doReferenceMatches:
            self.outputs.remove("fgcmReferenceStars")
예제 #27
0
class FgcmOutputProductsConnections(pipeBase.PipelineTaskConnections,
                                    dimensions=("instrument", ),
                                    defaultTemplates={"cycleNumber": "0"}):
    camera = connectionTypes.PrerequisiteInput(
        doc="Camera instrument",
        name="camera",
        storageClass="Camera",
        dimensions=("instrument", ),
        lookupFunction=lookupStaticCalibrations,
        isCalibration=True,
    )

    fgcmLookUpTable = connectionTypes.PrerequisiteInput(
        doc=("Atmosphere + instrument look-up-table for FGCM throughput and "
             "chromatic corrections."),
        name="fgcmLookUpTable",
        storageClass="Catalog",
        dimensions=("instrument", ),
        deferLoad=True,
    )

    fgcmVisitCatalog = connectionTypes.Input(
        doc="Catalog of visit information for fgcm",
        name="fgcmVisitCatalog",
        storageClass="Catalog",
        dimensions=("instrument", ),
        deferLoad=True,
    )

    fgcmStandardStars = connectionTypes.Input(
        doc="Catalog of standard star data from fgcm fit",
        name="fgcmStandardStars{cycleNumber}",
        storageClass="SimpleCatalog",
        dimensions=("instrument", ),
        deferLoad=True,
    )

    fgcmZeropoints = connectionTypes.Input(
        doc="Catalog of zeropoints from fgcm fit",
        name="fgcmZeropoints{cycleNumber}",
        storageClass="Catalog",
        dimensions=("instrument", ),
        deferLoad=True,
    )

    fgcmAtmosphereParameters = connectionTypes.Input(
        doc="Catalog of atmosphere parameters from fgcm fit",
        name="fgcmAtmosphereParameters{cycleNumber}",
        storageClass="Catalog",
        dimensions=("instrument", ),
        deferLoad=True,
    )

    refCat = connectionTypes.PrerequisiteInput(
        doc="Reference catalog to use for photometric calibration",
        name="cal_ref_cat",
        storageClass="SimpleCatalog",
        dimensions=("skypix", ),
        deferLoad=True,
        multiple=True,
    )

    fgcmPhotoCalib = connectionTypes.Output(
        doc=(
            "Per-visit photometric calibrations derived from fgcm calibration. "
            "These catalogs use detector id for the id and are sorted for "
            "fast lookups of a detector."),
        name="fgcmPhotoCalibCatalog",
        storageClass="ExposureCatalog",
        dimensions=(
            "instrument",
            "visit",
        ),
        multiple=True,
    )

    fgcmTransmissionAtmosphere = connectionTypes.Output(
        doc=
        "Per-visit atmosphere transmission files produced from fgcm calibration",
        name="transmission_atmosphere_fgcm",
        storageClass="TransmissionCurve",
        dimensions=(
            "instrument",
            "visit",
        ),
        multiple=True,
    )

    fgcmOffsets = connectionTypes.Output(
        doc="Per-band offsets computed from doReferenceCalibration",
        name="fgcmReferenceCalibrationOffsets",
        storageClass="Catalog",
        dimensions=("instrument", ),
        multiple=False,
    )

    def __init__(self, *, config=None):
        super().__init__(config=config)

        if str(int(config.connections.cycleNumber)
               ) != config.connections.cycleNumber:
            raise ValueError("cycleNumber must be of integer format")

        if not config.doReferenceCalibration:
            self.prerequisiteInputs.remove("refCat")
        if not config.doAtmosphereOutput:
            self.inputs.remove("fgcmAtmosphereParameters")
        if not config.doZeropointOutput:
            self.inputs.remove("fgcmZeropoints")
        if not config.doReferenceCalibration:
            self.outputs.remove("fgcmOffsets")