needCalibRegistry: true

levels:
  # List of keys that are NOT relevant to a particular level
  tract: patch
  skyTile:
  - visit
  - raftName
  - detectorName
  - detector
  expId:
  - raftName
  - detectorName
  - detector
  visit:
  - raftName
  - detectorName
  - detector
  - run
  - dayObs
  filter:
  - raftName
  - detectorName
  - detector
  - run
  - dayObs

defaultLevel: sensor

defaultSubLevels:
   skyTile: sensor
   expId: sensor
   visit: sensor


exposures:
  _raw:
    level: Ccd
    persistable: PropertyList
    python: lsst.daf.base.PropertyList
    storage: FitsStorage
    tables: raw
    template: raw/%(dayObs)s/%(expId)013d/%(expId)013d-%(raftName)s-%(detectorName)s-det%(detector)03d.fits[0]
  raw:
    assembler: lsst.obs.lsst.lsstCamMapper.assemble_raw
    python: lsst.afw.image.DecoratedImageF
    composite:
      raw_amp:
        datasetType: raw_amp
        subset: true
      raw_hdu:
        datasetType: raw_hdu
    inputOnly: true
  raw_amp:
    level: Amp
    # NB If type is changed to an exposureI then constructDark breaks. If changing this be sure to test calibs
    persistable: DecoratedImageF
    python: lsst.afw.image.DecoratedImageF
    storage: FitsStorage
    tables: raw
    template: raw/%(dayObs)s/%(expId)013d/%(expId)013d-%(raftName)s-%(detectorName)s-det%(detector)03d.fits[%(channel)d]
  postISRCCD:
    template: postISRCCD/%(expId)013d-%(filter)s/%(raftName)s/postISRCCD_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  postISRCCD_uninterpolated:
    template: postISRCCD/%(expId)013d-%(filter)s/%(raftName)s/postISRCCD_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d-preInterp.fits
  calexp:
    template: calexp/%(expId)013d-%(filter)s/%(raftName)s/calexp_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  icExp:
    template: icExp/%(expId)013d-%(filter)s/%(raftName)s/icExp_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  wcs:
    tables:
    - raw
    - raw_visit
    template: wcs/%(expId)013d-%(filter)s/%(raftName)s/wcs_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  eimage:
    level: Ccd
    persistable: DecoratedImageF
    python: lsst.afw.image.DecoratedImageF
    storage: FitsStorage
    tables: raw
    template: eimage/%(expId)d/E%(snap)03d/%(raftName)s/eimage_%(visit)08d_%(raftName)s_%(detectorName)s_E%(snap)03d.fits.gz
  fcr:
    level: Ccd
    persistable: ExposureI
    python: lsst.afw.image.ExposureI
    storage: FitsStorage
    tables:
    - raw
    - raw_visit
    template: fcr/%(expId)013d-%(filter)s/%(raftName)s/fcr_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  deepCoadd_directWarp:
    template: deepCoadd/%(filter)s/%(tract)d/%(patch)s/warp-%(filter)s-%(tract)d-%(patch)s-%(expId)d.fits
  deepCoadd_psfMatchedWarp:
    template: deepCoadd/%(filter)s/%(tract)d/%(patch)s/psfMatchedWarp-%(filter)s-%(tract)d-%(patch)s-%(expId)d.fits
  dcrCoadd_directWarp:
    template: dcrCoadd/%(filter)s%(subfilter)d/%(tract)d/%(patch)s/warp-%(filter)s%(subfilter)d-%(tract)d-%(patch)s-%(expId)d.fits
  deepDiff_differenceExp:
    template: deepDiff/v%(expId)013d-f%(filter)s/%(raftName)s/diffexp_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  deepDiff_matchedExp:
    template: deepDiff/v%(expId)013d-f%(filter)s/%(raftName)s/matchexp_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  dcrDiff_differenceExp:
    template: dcrDiff/v%(expId)013d-f%(filter)s/%(raftName)s/diffexp_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  dcrDiff_matchedExp:
    template: dcrDiff/v%(expId)013d-f%(filter)s/%(raftName)s/matchexp_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  quickLookExp:
    template: 'quickLookExp/d%(dayObs)s/quickLookExp-d%(dayObs)s-s%(seqNum)05d.fits'

calibrations:
  linearizer:
    columns:
    - detector
    - dateObs
    level: Ccd
    obsTimeName: dateObs        
    persistable: Linearizer
    python: lsst.ip.isr.linearize.Linearizer
    refCols:
    - visit
    - detector
    - raftName
    - detectorName
    - expId
    - dayObs
    - seqNum
    reference: raw
    storage: FitsCatalogStorage
    tables: linearizer
    template: linearizer/%(calibDate)s/linearizer-det%(detector)03d_%(calibDate)s.fits
    validEndName: validEnd
    validRange: true
    validStartName: validStart
  qe_curve:
    columns:
    - detector
    - calibDate
    level: Ccd
    persistable: BaseCatalog
    python: lsst.meas.algorithms.simple_curve.Curve
    refCols:
    - visit
    - detector
    - raftName
    - detectorName
    - expId
    - dayObs
    - seqNum
    reference: raw
    storage: FitsCatalogStorage
    tables: qe_curve
    template: qe_curve/%(calibDate)s/qe_curve-%(calibDate)s-%(raftName)s-%(detectorName)s.fits
    validEndName: validEnd
    validRange: true
    validStartName: validStart
  defects:
    columns:
    - detector
    - dateObs
    level: Ccd
    obsTimeName: dateObs
    persistable: DefectsList
    python: lsst.ip.isr.Defects
    refCols:
    - visit
    - detector
    - raftName
    - detectorName
    - expId
    - dayObs
    - seqNum
    reference: raw
    storage: FitsStorage
    tables: defects
    template: defects/%(calibDate)s/defects-%(calibDate)s-%(raftName)s-%(detectorName)s-%(detector)03d.fits
    validEndName: validEnd
    validRange: true
    validStartName: validStart
  bias:
    columns:
    - dateObs
    - raftName
    - detectorName
    level: Ccd
    obsTimeName: dateObs
    persistable: ExposureF
    python: lsst.afw.image.ExposureF
    refCols:
    - visit
    - detector
    - raftName
    - detectorName
    - expId
    - dayObs
    - seqNum
    reference: raw
    storage: FitsStorage
    tables: bias
    template: bias/%(calibDate)s/bias-%(raftName)s-%(detectorName)s-det%(detector)03d_%(calibDate)s.fits
    validRange: true
  dark:
    columns:
    - dateObs
    - raftName
    - detectorName
    level: Ccd
    obsTimeName: dateObs
    persistable: ExposureF
    python: lsst.afw.image.ExposureF
    refCols:
    - visit
    - detector
    - raftName
    - detectorName
    - expId
    - dayObs
    - seqNum
    reference: raw
    storage: FitsStorage
    tables: dark
    template: dark/%(calibDate)s/dark-%(raftName)s-%(detectorName)s-det%(detector)03d_%(calibDate)s.fits
    validRange: true
  flat:
    columns:
    - dateObs
    - filter
    - raftName
    - detectorName
    filter: true
    level: Ccd
    obsTimeName: dateObs
    persistable: ExposureF
    python: lsst.afw.image.ExposureF
    refCols:
    - visit
    - filter
    - detector
    - raftName
    - detectorName
    - expId
    - dayObs
    - seqNum
    reference: raw
    storage: FitsStorage
    tables: flat
    template: flat/%(filter)s/%(calibDate)s/flat_%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d_%(calibDate)s.fits
    validRange: true
  fringe:
    columns:
    - dateObs
    - filter
    - raftName
    - detectorName
    filter: true
    level: Ccd
    obsTimeName: dateObs
    persistable: ExposureF
    python: lsst.afw.image.ExposureF
    refCols:
    - visit
    - filter
    - detector
    - raftName
    - detectorName
    - expId
    - dayObs
    - seqNum
    reference: raw
    storage: FitsStorage
    tables: flat
    template: fringe/%(filter)s/%(calibDate)s/fringe_%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d_%(calibDate)s.fits
    validRange: true
  bias_camera:
    template: focalplane/bias/%(calibDate)s/bias_%(calibDate)s.fits
    persistable: ExposureF
    python: lsst.afw.image.ExposureF
    storage: FitsStorage
    level: None
  dark_camera:
    template: focalplane/dark/%(calibDate)s/dark_%(calibDate)s.fits
    persistable: ExposureF
    python: lsst.afw.image.ExposureF
    storage: FitsStorage
    level: None
  flat_camera:
    template: focalplane/flat/%(calibDate)s/%(filter)s/flat-%(filter)s_%(calibDate)s.fits
    persistable: ExposureF
    python: lsst.afw.image.ExposureF
    storage: FitsStorage
    level: None
  fringe_camera:
    template: focalplane/fringe/%(calibDate)s/%(filter)s/fringe-%(filter)s_%(calibDate)s.fits
    persistable: ExposureF
    python: lsst.afw.image.ExposureF
    storage: FitsStorage
    level: None
  sky:
    template: sky/%(calibDate)s/%(filter)s/sky-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d_%(calibDate)s.fits
    python: lsst.afw.image.ExposureF
    persistable: ExposureF
    storage: FitsStorage
    level: Ccd
    tables: sky
    columns:
    - dateObs
    - filter
    - raftName
    - detectorName
    obsTimeName: dateObs
    reference: raw
    refCols:
    - visit
    - filter
    - detector
    - raftName
    - detectorName
    - expId
    - dayObs
    - seqNum
    filter: true
    validRange: true
    validStartName: validStart
    validEndName: validEnd
  sky_camera:
    template: focalplane/sky/%(calibDate)s/%(filter)s/sky-%(filter)s_%(calibDate)s.fits
    persistable: ExposureF
    python: lsst.afw.image.ExposureF
    storage: FitsStorage
    level: None


datasets:
  ampExposureId:
    persistable: ignored
    python: lsst.daf.base.PropertySet
    storage: ignored:ampExposureId
    tables: raw
    template: ignored
  ampExposureId_bits:
    persistable: ignored
    python: lsst.daf.base.PropertySet
    storage: ignored:ampExposureId_bits
    tables: raw
    template: ignored
  apCorr:
    persistable: ApertureCorrection
    python: lsst.meas.algorithms.ApertureCorrection
    storage: PickleStorage
    tables: raw
    template: apCorr/%(expId)013d-%(filter)s/%(raftName)s/apCorr_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.pickle
  cal_ref_cat:
    persistable: SourceCatalog
    python: lsst.afw.table.SourceCatalog
    storage: FitsCatalogStorage
    table: ignored
    template: photo_astro_ref/%(pixel_id)s.fits
  calexpBackground:
    persistable: PurePythonClass
    python: lsst.afw.math.BackgroundList
    storage: FitsCatalogStorage
    tables: raw
    template: calexp/%(expId)013d-%(filter)s/%(raftName)s/bkgd_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  ccdExposureId:
    persistable: ignored
    python: lsst.daf.base.PropertySet
    storage: ignored:ccdExposureId
    tables: raw
    template: ignored
  calexp_camera:
    template: calexp_camera/%(expId)013d-%(filter)s/calexp_camera_%(expId)013d-%(filter)s.fits
  skyCorr:
    template: skyCorr/%(expId)013d-%(filter)s/%(raftName)s/skyCorr_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  ccdExposureId_bits:
    persistable: ignored
    python: lsst.daf.base.PropertySet
    storage: ignored:ccdExposureId_bits
    tables: raw
    template: ignored
  chiSquaredCoaddId:
    persistable: ignored
    python: lsst.daf.base.PropertySet
    storage: ignored
    tables: raw
    template: ignored
  chiSquaredCoaddId_bits:
    persistable: ignored
    python: lsst.daf.base.PropertySet
    storage: ignored
    tables: raw
    template: ignored
  dcrDiff_diaSrc:
    template: dcrDiff/v%(expId)013d-f%(filter)s/%(raftName)s/diaSrc_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  dcrDiff_kernelSrc:
    template: dcrDiff/v%(expId)013d-f%(filter)s/%(raftName)s/kernelSrc_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  dcrDiff_metadata:
    template: dcrDiff/v%(expId)013d-f%(filter)s/%(raftName)s/metadata_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.yaml
  deepDiff_diaSrc:
    template: deepDiff/v%(expId)013d-f%(filter)s/%(raftName)s/diaSrc_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  deepDiff_kernelSrc:
    template: deepDiff/v%(expId)013d-f%(filter)s/%(raftName)s/kernelSrc_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  deepDiff_metadata:
    template: deepDiff/v%(expId)013d-f%(filter)s/%(raftName)s/metadata_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.yaml
  forced_metadata:
    persistable: PropertySet
    python: lsst.daf.base.PropertySet
    storage: YamlStorage
    tables: raw
    template: forced_metadata/%(expId)013d-%(filter)s/%(raftName)s/forcedMetadata_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.yaml
  forced_src:
    persistable: SourceCatalog
    python: lsst.afw.table.SourceCatalog
    storage: FitsCatalogStorage
    tables: raw
    template: forced/%(expId)013d-%(filter)s/%(raftName)s/forced_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  forcedPhotCcd_metadata:
    template: forcedPhotCcd_metadata/%(expId)013d-%(filter)s/%(raftName)s/forcedPhotCcd_metadata_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.yaml
  goodSeeingCoaddId:
    persistable: ignored
    python: lsst.daf.base.PropertySet
    storage: ignored
    tables: raw
    template: ignored
  goodSeeingCoaddId_bits:
    persistable: ignored
    python: lsst.daf.base.PropertySet
    storage: ignored
    tables: raw
    template: ignored
  icExpBackground:
    template: icExp/%(expId)013d-%(filter)s/%(raftName)s/bkgd_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  icSrc:
    persistable: SourceCatalog
    python: lsst.afw.table.SourceCatalog
    storage: FitsCatalogStorage
    tables: raw
    template: icSrc/%(expId)013d-%(filter)s/%(raftName)s/icSrc_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  processCcd_metadata:
    persistable: PropertySet
    python: lsst.daf.base.PropertySet
    storage: YamlStorage
    tables: raw
    template: processCcd_metadata/%(expId)013d-%(filter)s/%(raftName)s/processCcdMetadata_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.yaml
  raw_hdu:
    level: Ccd
    persistable: PropertyList
    python: lsst.daf.base.PropertyList
    storage: FitsStorage
    tables: raw
    template: raw/%(dayObs)s/%(expId)013d/%(expId)013d-%(raftName)s-%(detectorName)s-det%(detector)03d.fits[0]
  refcat:
    persistable: SimpleCatalog
    python: lsst.afw.table.SimpleCatalog
    storage: FitsCatalogStorage
    tables: raw
    template: refcat.fits
  src:
    persistable: SourceCatalog
    python: lsst.afw.table.SourceCatalog
    storage: FitsCatalogStorage
    tables: raw
    template: src/%(expId)013d-%(filter)s/%(raftName)s/src_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  srcMatch:
    persistable: BaseCatalog
    python: lsst.afw.table.BaseCatalog
    storage: FitsCatalogStorage
    tables: raw
    template: srcMatch/%(expId)013d-%(filter)s/%(raftName)s/srcMatch_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  jointcal_wcs:  # astrometric calibration produced by jointcal
    template: jointcal-results/%(filter)s/%(tract)04d/jointcal_wcs-%(expId)07d-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  jointcal_photoCalib:  # photometric calibration produced by jointcal
    template: jointcal-results/%(filter)s/%(tract)04d/jointcal_photoCalib-%(expId)07d-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  transformSrcMeasurement_metadata:
    persistable: PropertySet
    python: lsst.daf.base.PropertySet
    storage: YamlStorage
    tables: raw
    template: transformSrcMeasurement_metadata/%(expId)013d-%(filter)s/%(raftName)s/transformSrcMeasurementMetadata_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.yaml
  singleFrameDriver_metadata:
    persistable: PropertySet
    python: lsst.daf.base.PropertySet
    storage: YamlStorage
    tables:
    - raw
    - raw_visit
    template: singleFrameDriver_metadata/%(expId)06d-%(filter)s/%(raftName)s/singleFrameDriverMetadata_%(expId)06d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.yaml
  transformed_src:
    persistable: ignored
    python: lsst.afw.table.BaseCatalog
    storage: FitsCatalogStorage
    tables: raw
    template: transformedSrc/%(expId)013d-%(filter)s/%(raftName)s/transformedSrc_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
  eotest_gain:  # set of amplifier gains, as measured by eotest
    level: Ccd
    persistable: ignored
    python: dict
    storage: PickleStorage
    tables: raw
    template: gain/%(run)s/gain_%(run)s-%(raftName)s-%(detectorName)s-det%(detector)03d.pickle
  apPipe_metadata:
    template: apPipe_metadata/%(expId)013d-%(filter)s/%(raftName)s/apPipeMetadata_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.yaml
  runIsr_metadata:
    template: runIsr_metadata/%(expId)013d-%(filter)s/%(raftName)s/runIsrMetadata_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.yaml
  brighterFatterKernel:
    template: calibrations/bfKernel-%(raftName)s-%(detectorName)s-det%(detector)03d.pkl
  brighterFatterGain:
    template: calibrations/bfGain-%(detector)03d.pkl
  plotBrighterFatterPtc:
    template: plots/bfPtc-ccd-%(detector)03d-amp-%(amp)s.png
  measurePhotonTransferCurve_metadata:
    template: measurePhotonTransferCurves_metadata/%(detector)03d.yaml
  plotPhotonTransferCurve_metadata:
    template: plotPhotonTransferCurves_metadata/%(detector)03d.yaml
  photonTransferCurveDataset:
    template: calibrations/ptc/ptcDataset-det%(detector)03d.fits
  measureLinearity_metadata:
    template: measureLinearity_metadata/%(detector)03d.yaml
  linearizeLut:
          template: calibrations/linearizers/linearize-lut-det%(detector)03d_%(calibDate)s.fits
  linearizeSquared:
          template: calibrations/linearizers/linearize-squared-det%(detector)03d_%(calibDate)s.fits
  linearizePolynomial:
          template: calibrations/linearizers/linearize-polynomial-det%(detector)03d_%(calibDate)s.fits
  crosstalk:
     persistable: ignored
     storage: FitsCatalogStorage
     python: lsst.ip.isr.CrosstalkCalib
     template: 'calibrations/crosstalk/crosstalk-det%(detector)03d.fits'
  plotCoadd:
    persistable: None
    python: None
    storage: MatplotlibStorage
    template: plots/%(filter)s/tract-%(tract)d%(subdir)s/plot-t%(tract)d-%(filter)s-%(description)s-%(style)s.png
  plotSky:
    persistable: None
    python: None
    storage: MatplotlibStorage
    template: plots/%(filter)s/sky/plot-%(filter)s-%(description)s-%(style)s.png
  plotColor:
    persistable: None
    python: None
    storage: MatplotlibStorage
    template: plots/color/tract-%(tract)d%(subdir)s/plot-t%(tract)d-%(description)s-%(style)s.png
  plotVisit:
    persistable: None
    python: None
    storage: MatplotlibStorage
    template: plots/%(filter)s/tract-%(tract)d/visit-%(expId)d%(subdir)s/plot-v%(expId)d-%(description)s-%(style)s.png
  plotCompareCoadd:
    persistable: None
    python: None
    storage: MatplotlibStorage
    template: plots/%(filter)s/tract-%(tract)d%(subdir)s/compare-t%(tract)d-%(filter)s-%(description)s-%(style)s.png
  plotCompareVisit:
    persistable: None
    python: None
    storage: MatplotlibStorage
    template: plots/%(filter)s/tract-%(tract)d/visit-%(expId)d%(subdir)s/compareVisit-v%(expId)d-%(description)s-%(style)s.png
  # ISR stage thumbnails
  ossThumb:
    template: thumbs/%(expId)013d-%(filter)s/%(raftName)s/ossThumb_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.png
  flattenedThumb:
    template: thumbs/%(expId)013d-%(filter)s/%(raftName)s/flattenedThumb_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.png
  # Difference image products
  deepDiff_diaObject:
    description: "Catalog of combined diaSrc objects."
    persistable: SourceCatalog
    storage: FitsCatalogStorage
    python: lsst.afw.table.SourceCatalog
    template: deepDiff/diaObject/%(tract)d/%(patch)s/diaObject-%(tract)d-%(patch)s.fits
  deepDiff_diaObject_schema:
    description: "Catalog of diaObjects"
    persistable: SourceCatalog
    storage: FitsCatalogStorage
    python: lsst.afw.table.SourceCatalog
    template: schema/deepDiff_diaObject.fits
  deepDiff_forced_diaSrc:
    description: "Catalog of forced measurements (shape and position parameters held fixed) on the difference images."
    persistable: SourceCatalog
    storage: FitsCatalogStorage
    python: lsst.afw.table.SourceCatalog
    template: deepDiff/v%(expId)013d-f%(filter)s/%(raftName)s/diaForced_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.fits
    tables: 'raw'
  deepDiff_forced_diaSrc_schema:
    persistable: SourceCatalog
    storage: FitsCatalogStorage
    python: lsst.afw.table.SourceCatalog
    template: schema/deepDiff_forced_dia_src.fits
  deepDiff_forced_diaObject:
    description: "Catalog of forced measurements (shape and position parameters held fixed) on the templates."
    persistable: SourceCatalog
    storage: FitsCatalogStorage
    python: lsst.afw.table.SourceCatalog
    template: deepDiff/%(filter)s/%(tract)d/%(patch)s/diaObject-%(filter)s-%(tract)d-%(patch)s.fits
  deepDiff_forced_diaObject_schema:
    persistable: SourceCatalog
    storage: FitsCatalogStorage
    python: lsst.afw.table.SourceCatalog
    template: schema/deepDiff_forced_dia_object.fits
  deepDiff_diaObjectId:
    description: "Catalog of diaSrc ids for each diaObject"
    template: deepDiff/diaObject/%(tract)d/%(patch)s/diaObjectId-%(tract)d-%(patch)s.parq
    persistable: ignored
    storage: ParquetStorage
    python: lsst.dia.pipe.parquetTable.ParquetTable
  imageDifferenceDriver_config:
    persistable: Config
    storage: ConfigStorage
    python: lsst.dia.pipe.imageDifferenceDriver.ImageDifferenceDriverConfig
    template: config/imageDifferenceDriver.py
  imageDifferenceDriver_metadata:
    persistable: PropertySet
    python: lsst.daf.base.PropertySet
    storage: YamlStorage
    tables:
    - raw
    - raw_visit
    template: imageDifferenceDriver_metadata/%(expId)013d-%(filter)s/%(tract)d/%(patch)s/imageDifferenceDriverMetadata_%(expId)013d-%(filter)s-%(raftName)s-%(detectorName)s-det%(detector)03d.yaml
  associationDriver_config:
    persistable: Config
    storage: ConfigStorage
    python: lsst.dia.pipe.associationDriver.AssociationDriverConfig
    template: config/associationDriver.py
  forcedPhotCcdDiaDriver_config:
    persistable: Config
    storage: ConfigStorage
    python: lsst.dia.pipe.forcedPhotCcdDiaDriver.ForcedPhotCcdDiaDriverConfig
    template: config/forcedPhotCcdDiaDriver.py
  forcedPhotCoaddDiaDriver_config:
    persistable: Config
    storage: ConfigStorage
    python: lsst.dia.pipe.forcedPhotCoaddDiaDriver.ForcedPhotCoaddDiaDriverConfig
    template: config/forcedPhotCoaddDiaDriver.py
  forcedPhotCcdDia_config:
    persistable: Config
    storage: ConfigStorage
    python: lsst.dia.pipe.forcedPhotDia.ForcedPhotCcdDiaDriverConfig
    template: config/forcedPhotCcdDiaDriver.py
  forcedPhotCoaddDia_config:
    persistable: Config
    storage: ConfigStorage
    python: lsst.dia.pipe.forcedPhotDia.ForcedPhotCoaddDiaConfig
    template: config/forcedPhotCoaddDia.py

  # Focal plane summary plots
  focal_plane_fits:
    level: Visit
    persistable: MaskedImageF
    python: lsst.afw.image.MaskedImageF
    storage: FitsStorage
    tables: raw
    template: focal_plane/%(dstype)s-v%(expId)013d.fits
  focal_plane_png:
    level: Visit
    persistable: None
    python: builtins.str
    storage: TextStorage
    template: focal_plane/%(dstype)s-v%(expId)013d.png
  binned_sensor_fits:
    level: Visit
    persistable: MaskedImageF
    python: lsst.afw.image.MaskedImageF
    storage: FitsStorage
    tables: raw
    template: binned_sensor/%(dstype)s-v%(expId)013d/%(raftName)s/%(detectorName)s.fits
  binned_sensor_fits_halves:
    level: Visit
    persistable: MaskedImageF
    python: lsst.afw.image.MaskedImageF
    storage: FitsStorage
    tables: raw
    template: binned_sensor/%(dstype)s-v%(expId)013d/%(raftName)s/%(detectorName)s_%(half)s.fits
  newDefects:
    level: Ccd
    persistable: lsst.meas.algorithms.Defects
    python: lsst.meas.algorithms.Defects
    storage: FitsStorage
    tables:
    - raw
    template: calibrations/SomethingHasToGoHereButThisIsOverwrittenLater%(detector)03d.extension
