Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DM-15862: Reduce ISR code duplication between ip_isr, obs_subaru, and obs_decam #100

Merged
merged 1 commit into from
Jan 4, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
103 changes: 98 additions & 5 deletions config/isr.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,108 @@
"""
DECam-specific overrides of IsrTask
"""
import os.path

from lsst.obs.decam.crosstalk import DecamCrosstalkTask
config.crosstalk.retarget(DecamCrosstalkTask)

config.doCrosstalk = True
config.doDark = False
config.doAddDistortionModel = False # rely on the TPV terms instead
config.fringe.filters = ['z', 'y']
config.datasetType = "raw"
config.fallbackFilterName = None
config.expectWcs = True
config.fwhm = 1.0

config.doConvertIntToFloat = False

config.doSaturation=True
config.saturatedMaskName = "SAT"
config.saturation = float("NaN")
config.growSaturationFootprintSize = 1

config.doSuspect=True
config.suspectMaskName = "SUSPECT"
config.numEdgeSuspect = 35

config.doSetBadRegions = True
config.badStatistic = "MEANCLIP"

config.doOverscan = True
config.overscanFitType = "MEDIAN"
config.overscanOrder = 1
config.overscanNumSigmaClip = 3.0
config.overscanNumLeadingColumnsToSkip = 0
config.overscanNumTrailingColumnsToSkip = 0
config.overscanMaxDev = 1000.0
config.overscanBiasJump = True
config.overscanBiasJumpKeyword = "FPA"
config.overscanBiasJumpDevices = ["DECAM_BKP3", "DECAM_BKP5", "DECAM_BKP1", "DECAM_BKP4"]
config.overscanBiasJumpLocation = 2098

config.doAssembleCcd = True
# Use default ISR assembleCcdTask
config.assembleCcd.doTrim = True
config.assembleCcd.keysToRemove = ['DATASECA', 'DATASECB',
'TRIMSECA', 'TRIMSECB',
'BIASSECA', 'BIASSECB',
'PRESECA', 'PRESECB',
'POSTSECA', 'POSTSECB']

config.doAssembleIsrExposures = False
config.doTrimToMatchCalib = True

config.doBias = True
config.biasDataProductName = "cpBias"

config.doVariance = True
config.gain = float("NaN")
config.readNoise = 0.0
config.doEmpiricalReadNoise = False

config.doLinearize = True

config.doCrosstalkBeforeAssemble = True
config.doCrosstalk = True
config.crosstalk.retarget(DecamCrosstalkTask)
config.crosstalk.minPixelToMask=45000.0
config.crosstalk.crosstalkMaskPlane="CROSSTALK"

config.doWidenSaturationTrails = True

config.doBrighterFatter = False

config.doDefect = True
config.doSaturationInterpolation = True
config.numEdgeSuspect=35

config.doDark = False
config.darkDataProductName = "dark"

config.doStrayLight = False

config.doFlat = True
config.flatDataProductName = "cpFlat"
config.flatScalingType = "USER"
config.flatUserScale = 1.0
config.doTweakFlat = False

config.doApplyGains = False
config.normalizeGains = False

config.doFringe = True
config.fringeAfterFlat = True
config.fringe.filters = ['z', 'y']
czwa marked this conversation as resolved.
Show resolved Hide resolved

config.doNanInterpAfterFlat = False

config.doAddDistortionModel = False # rely on the TPV terms instead

config.doMeasureBackground = True

config.doCameraSpecificMasking = False

config.doVignette = False
config.doAttachTransmissionCurve = False
config.doUseOpticsTransmission = False
config.doUseFilterTransmission = False
config.doUseSensorTransmission = False
config.doUseAtmosphereTransmission = False

config.doWrite = True
2 changes: 0 additions & 2 deletions config/processCcd.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@

from lsst.utils import getPackageDir
from lsst.meas.algorithms import LoadIndexedReferenceObjectsTask
from lsst.obs.decam.isr import DecamIsrTask

obsConfigDir = os.path.join(getPackageDir('obs_decam'), 'config')

config.isr.retarget(DecamIsrTask)
config.isr.load(os.path.join(obsConfigDir, 'isr.py'))

config.charImage.repair.cosmicray.nCrPixelMax = 100000
Expand Down
2 changes: 0 additions & 2 deletions config/processCcdCpIsr.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@

from lsst.utils import getPackageDir
from lsst.meas.algorithms import LoadIndexedReferenceObjectsTask
from lsst.obs.decam.decamCpIsr import DecamCpIsrTask

obsConfigDir = os.path.join(getPackageDir('obs_decam'), 'config')

config.isr.retarget(DecamCpIsrTask)
config.isr.load(os.path.join(obsConfigDir, 'isr.py'))

config.charImage.repair.cosmicray.nCrPixelMax = 100000
Expand Down
2 changes: 0 additions & 2 deletions config/runIsr.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
import os.path

from lsst.utils import getPackageDir
from lsst.obs.decam.isr import DecamIsrTask

obsConfigDir = os.path.join(getPackageDir("obs_decam"), "config")

config.isr.retarget(DecamIsrTask)
config.isr.load(os.path.join(obsConfigDir, "isr.py"))
2 changes: 0 additions & 2 deletions config/runIsrCp.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
import os.path

from lsst.utils import getPackageDir
from lsst.obs.decam.decamCpIsr import DecamCpIsrTask

obsConfigDir = os.path.join(getPackageDir("obs_decam"), "config")

config.isr.retarget(DecamCpIsrTask)
config.isr.load(os.path.join(obsConfigDir, "isr.py"))
8 changes: 6 additions & 2 deletions policy/DecamMapper.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ datasets:
template: '%(visit)07d/metadata/metadata-%(visit)07d_%(ccdnum)02d.yaml'
isr_config:
python: lsst.obs.decam.isr.DecamIsrConfig
isr_metadata:
runIsr_metadata:
template: '%(visit)07d/metadata/metadata-%(visit)07d_%(ccdnum)02d.yaml'
characterizeImage_metadata:
template: '%(visit)07d/metadata/metadata-%(visit)07d_%(ccdnum)02d.yaml'
Expand Down Expand Up @@ -264,4 +264,8 @@ datasets:
dcrDiff_kernelSrc:
template: dcrDiff/v%(visit)d/kernelSrc-%(ccdnum)02d.fits
apPipe_metadata:
template: '%(visit)07d/apPipe_metadata/metadata-%(visit)07d_%(ccdnum)02d.yaml'
template: '%(visit)07d/apPipe_metadata/metadata-%(visit)07d_%(ccdnum)02d.yaml'
ossThumb:
template: '%(visit)07d/thumbs/oss-%(visit)07d-%(ccdnum)03d.png'
flattenedThumb:
template: '%(visit)07d/thumbs/flattened-%(visit)07d-%(ccdnum)03d.png'
29 changes: 20 additions & 9 deletions python/lsst/obs/decam/crosstalk.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@

import lsst.log
import lsst.pipe.base as pipeBase
from lsst.ip.isr import CrosstalkConfig, CrosstalkTask
from lsst.ip.isr import CrosstalkConfig, CrosstalkTask, IsrTask
from lsst.obs.decam import DecamMapper
from lsst.utils import getPackageDir
import lsst.afw.math as afwMath
from .isr import DecamIsrTask


__all__ = ["DecamCrosstalkTask"]

Expand Down Expand Up @@ -142,7 +142,7 @@ def prepCrosstalk(self, dataRef):
ccdnum = det.getId()
ccdnum_str = '%02d' % ccdnum
crosstalkSources = defaultdict(list)
decamisr = DecamIsrTask() # needed for source_exposure overscan correction
decamisr = IsrTask() # needed for source_exposure overscan correction
for amp in det:
victim = ccdnum_str + amp.getName()
for source in sources[victim]:
Expand All @@ -160,15 +160,17 @@ def prepCrosstalk(self, dataRef):
else:
self.log.fatal('DECam source amp name does not contain A or B, cannot proceed')
source_amp = source_exposure.getDetector()[amp_idx]
source_dataBBox = source_amp.getRawDataBBox()
# If doCrosstalkBeforeAssemble=True, then use getRawBBox(). Otherwise, getRawDataBBox().
source_dataBBox = source_amp.getRawBBox()
# Check to see if source overscan has been corrected, and if not, correct it first
if not source_exposure.getMetadata().exists('OVERSCAN'):
decamisr.overscanCorrection(source_exposure, source_amp)
self.log.info('Correcting source %s overscan before using to correct crosstalk'
% source)
source_image = source_exposure.getMaskedImage().getImage()

source_data = source_image.Factory(source_image, source_dataBBox, deep=True)
crosstalkSources[victim].append((source_data, coeffs[(victim, source)]))
crosstalkSources[victim].append((source_data, coeffs[(victim, source)], amp_idx))
return crosstalkSources

@pipeBase.timeMethod
Expand Down Expand Up @@ -204,19 +206,28 @@ def run(self, exposure, crosstalkSources=None):
ccdnum = det.getId()
ccdnum_str = '%02d' % ccdnum
victim = ccdnum_str + amp.getName()
dataBBox = amp.getRawDataBBox()
# If doCrosstalkBeforeAssemble=True, then use getRawBBox(). Otherwise, getBBox().
dataBBox = amp.getRawBBox()
# Check to see if victim overscan has been corrected, and if not, correct it first
if not exposure.getMetadata().exists('OVERSCAN'):
decamisr = DecamIsrTask()
decamisr = IsrTask()
decamisr.overscanCorrection(exposure, amp)
self.log.warn('Overscan correction did not happen prior to crosstalk correction')
self.log.info('Correcting victim %s overscan before crosstalk' % victim)
image = exposure.getMaskedImage().getImage()
victim_data = image.Factory(image, dataBBox)
# Load data from crosstalk 'source' exposures
for source in crosstalkSources[victim]:
source_data, source_coeff = source
if victim_data.getX0() != source_data.getX0():
source_data, source_coeff, source_idx = source
victim_idx = 0
if 'A' in victim:
victim_idx = 0
elif 'B' in victim:
victim_idx = 1
else:
self.log.fatal('DECam victim amp name does not contain A or B, cannot proceed')

if source_idx != victim_idx:
# Occurs with amp A and B mismatch; need to flip horizontally
source_data = afwMath.flipImage(source_data, flipLR=True, flipTB=False)
# Perform the linear crosstalk correction
Expand Down