702 def calculateDcr(visitInfo, wcs, filterInfo, dcrNumSubfilters, splitSubfilters=False):
703 """Calculate the shift in pixels of an exposure due to DCR.
707 visitInfo : `lsst.afw.image.VisitInfo`
708 Metadata for the exposure.
709 wcs : `lsst.afw.geom.SkyWcs`
710 Coordinate system definition (wcs) for the exposure.
711 filterInfo : `lsst.afw.image.Filter`
712 The filter definition, set in the current instruments' obs package.
713 dcrNumSubfilters : `int`
714 Number of sub-filters used to model chromatic effects within a band.
715 splitSubfilters : `bool`, optional
716 Calculate DCR for two evenly-spaced wavelengths in each subfilter,
717 instead of at the midpoint. Default: False
721 dcrShift : `tuple` of two `float`
722 The 2D shift due to DCR, in pixels.
723 Uses numpy axes ordering (Y, X).
727 weight = [0.75, 0.25]
728 lambdaEff = filterInfo.getFilterProperty().getLambdaEff()
732 elevation=visitInfo.getBoresightAzAlt().getLatitude(),
733 observatory=visitInfo.getObservatory(),
734 weather=visitInfo.getWeather())
736 elevation=visitInfo.getBoresightAzAlt().getLatitude(),
737 observatory=visitInfo.getObservatory(),
738 weather=visitInfo.getWeather())
740 diffRefractPix0 = diffRefractAmp0.asArcseconds()/wcs.getPixelScale().asArcseconds()
741 diffRefractPix1 = diffRefractAmp1.asArcseconds()/wcs.getPixelScale().asArcseconds()
742 diffRefractArr = [diffRefractPix0*weight[0] + diffRefractPix1*weight[1],
743 diffRefractPix0*weight[1] + diffRefractPix1*weight[0]]
744 shiftX = [diffRefractPix*np.sin(rotation.asRadians())
for diffRefractPix
in diffRefractArr]
745 shiftY = [diffRefractPix*np.cos(rotation.asRadians())
for diffRefractPix
in diffRefractArr]
746 dcrShift.append(((shiftY[0], shiftX[0]), (shiftY[1], shiftX[1])))
748 diffRefractAmp = (diffRefractAmp0 + diffRefractAmp1)/2.
749 diffRefractPix = diffRefractAmp.asArcseconds()/wcs.getPixelScale().asArcseconds()
750 shiftX = diffRefractPix*np.sin(rotation.asRadians())
751 shiftY = diffRefractPix*np.cos(rotation.asRadians())
752 dcrShift.append((shiftY, shiftX))