6.10. Absolute Calibration of SPIRE Maps


6.10.1. SPIRE Map Zero Point from Herschel-Planck Calibration Introduction

Herschel-SPIRE detectors are only sensitive to relative variations, as a consequence the absolute brightness of the observed region is unknown and maps are constructed such that they have zero median.

Although the Planck-HFI detectors are similar to SPIRE, Plancks' observing strategy allows it to (almost) observe a sky's great circle every minute (having a 1 rpm spinning rate). By comparing the sky brightness as measured by COBE-FIRAS at the galactic poles (where the dust emission is lower), HFI is capable of setting an absolute offset to its maps. Moreover, since SPIRE and HFI share two channels with overlapping wavebands it is possible to use the Planck HFI maps to obtain an absolute calibration for the SPIRE maps.

The details of the Herschel - Planck cross calibration are covered extensively in the SPIRE Handbook (formerly the SPIRE Observers Manual) and here we explain the algorithm used to create the absolute calibrated SPIRE maps (referred to as extdPxW in a SPIRE observation). The Zero Point Correction Task

As of HCSS 10, a new task named zeroPointCorrection is available that will calculate the absolute offset for a SPIRE map based on cross-calibration with HFI-545 and HFI-857 maps, colour-correcting HFI to SPIRE wavebands assuming a grey body function with fixed beta.

In addition a new Useful Script, "Photometer_ZeroPointCorrection.py" is available to enable the production of these Level-2 absolute calibrated maps for extended emission from the Level 1 timelines.

The zeroPointCorrection task is shown in Figure 6.91 and estimates the absolute offset of SPIRE maps, in MJy/sr, comparing them to the equivalent sky area as observed by HFI. To run properly, the task requires the following input;

  • A level2 context with 3 maps named either psrcPxW or simply PxW. This ideally should come from a destriped Level 1 with relative gain correction applied. The output of the task will be the input level2 with appended the extdPxW maps.

  • The two Planck HFI-545 and HFI-857 full-sky maps are assumed to have been downloaded and linked to the HIPE build. The Useful Script has initialization code that can be run the first time to automatically download the Planck maps and set up the appropriate links (Note that a restart of HIPE may be required the first time the script is run). Alternatively the Planck maps can be downloaded from the HSC website

  • Planck-SPIRE Colour Correction calibration file (contained within the SPIRE Calibration Tree) to make the colour correction factors to go from HFI-545 to PLW, HFI-857 to PMW and HFI-857 to PSW bands.

  • SPIRE Flux Calibration product which contains the necessary parameters (K4P, K4E, see Section to convert point source to extended calibrated maps.

  • As an option, the user may also change the full width to half-maximum (FWHM) of the 2D Gaussian function used in the convolution of SPIRE maps to HFI beam (default value: 8 arcmin) and the gain correction factors (default values: HFI-545 = 1.029, HFI-857 = 0.991, where a value of 1 would mean that no correction is applied).

The level2,flux conversion product and Colour Correction table can either be dragged to the dialogue window in Figure 6.91 directly or alternatively, if they exist, can be dragged from the variable window (as shown in Figure 6.91). These products can be generated with the following lines of code, assuming an obseravtion obs has already been read into memory:

# cal = spireCal()
colorCorrHfi = cal.phot.colorCorrHfi
fluxConv = cal.phot.fluxConvList.getProduct(obs.meta["biasMode"].value, obs.startDate)        

Zero point correction task dialogue

Figure 6.91. Zero point correction task dialogue The Zero Point Correction Task: Initial Set Up

The very first time the Zero Point Correction Task is used (either in the Useful Script or User Pipeline) the Planck Maps need to be downloaded locally and the zero-point correction environment needs to be set up. Although, the Planck maps can be retrieved from the Herschel Science Centre manually, the Useful Script, "Photometer_ZeroPointCorrection.py" provides all the code to efficiently set up the environment:

import urllib, os
planckMapPath = '/path/for/planck/maps/'
hfi545Map = "DX11d_map_545_smooth_8arcmin.fits"
hfi857Map = "DX11d_map_857_smooth_8arcmin.fits"
urllib.urlretrieve ("http://archives.esac.esa.int/hsa/legacy/cal/HFI_Maps/"  \
urllib.urlretrieve ("http://archives.esac.esa.int/hsa/legacy/cal/HFI_Maps/"  \
Configuration.save("user.props", ["spire.spg.hfi.545map","spire.spg.hfi.857map"])

The code imports the necessary libraries into HIPE and then fetches the HFI 545GHz and 857GHz Planck maps from the ESA FTP site and stores them in a path specified by the variable planckMapPath. The location of the Planck maps is then hard-coded into the configuration properties spire.spg.hfi.545map and spire.spg.hfi.857map, stord in your user.props (usually found in your home directory within a .hcss directory). Note that a restart of HIPE may be required to make HIPE recognize the new set-up. Creating Absolute Calibrated SPIRE maps

Then, the zeroPointCorrection runs the following steps, also illustrated in Figure 6.92

Step-by-step description of the calculations performed internally by the zeroPointCorrection task to estimate the absolute offset to add to the SPIRE maps.

Figure 6.92. Step-by-step description of the calculations performed internally by the zeroPointCorrection task to estimate the absolute offset to add to the SPIRE maps.

  1. It loads the the three SPIRE maps psrcPLW, psrcPMW and psrcPSW and converts them from Jy/beam to MJy/sr using the KmonP and KmonE factors;

  2. In order to avoid edge effects, it enlarges the SPIRE maps by 0.5 degrees in each direction (i.e. it adds a ring of 1 deg2);

  3. It reads the HFI maps, extracts and re-projects HFI data based on SPIRE astrometry;

  4. It applies the colour correction factors K545 -> PMW,K857 -> PMW, K857 -> PSW to HFI data. The colour correction factors are computed, pixel by pixel, interpolating the ratio RHFI obtained from the colour correction table and comparing it to the ratio of maps HFI-545/HFI-857.

  5. The task convolves SPIRE maps with a 2D Gaussian beam function, which by default has an FWHM of 8 arcmin;

  6. Then, the difference maps (HFI-545 -> PLW), (HFI-857 -> PMW) and (HFI-857 -> PSW) are computed: a first estimation of the PLW, PMW and PSW offsets, respectively, is obtained as the median of the these difference maps.

  7. The offsets are applied full-resolution SPIRE maps obtained in step 1 above;

  8. These SPIRE maps are then embedded in the HFI colour corrected maps obtained in step 4.

  9. The task runs the convolution on SPIRE maps embedded into HFI ones;

  10. SPIRE maps are de-embedded: the result is the original SPIRE maps, convolved with the defined Gaussian beam and with edge effects reduced, especially for maps smaller then ~1 deg2.

  11. The difference maps (HFI-545 -> PLW), (HFI-857 -> PMW) and (HFI-857 -> PSW) are computed: a second estimation of the PLW, PMW and PSW offsets, respectively, is obtained as the median of the these difference maps. The statistical error on the offset estimation is competed as the difference map standard deviation.

  12. Finally, the total offsets are applied to the full resolution SPIRE maps extdPLW, extdPMW and extdPSW. Their values, as well as their estimated error, are reported in the maps metadata and the level-2 context is updated.

As described above, the zeroPointCorrection task computes the offset as the median of the difference map between an HFI colour corrected map and the corresponding SPIRE one. However, this method works under the assumption that the relative gain between SPIRE and HFI is 1. Nevertheless, extended testing has shown that a relative gain is present: with an assumed colour correction table available within the SPIRE Calibration Tree, it is estimated to be HFI-545/PLW ~ 1.029 and HFI-857/PMW ~ 0.991. As a consequence, it is suggested to use these values when launching the zeroPointCorrection task. Output Maps from the Zero-Point Correction Task

In addition to the final absolute calibrated SPIRE maps, the Zero Point Correction task also outputs various auxilliary maps crated during the processing steps. These maps are summarized below and illustrated in Figure 6.93.

The Useful Script, Photometer Map Zero Point Correction shows the code necessary to access these auxilliary products;

print "Running the zero point correction task"
zeroPointMaps, zeroPointParam=zeroPointCorrection(level2=level2ZeroPoint, \
    hfiFwhm=hfiFwhm, hfi545Gain=hfi545Gain, hfi857Gain=hfi857Gain, \
    colorCorrHfi=colorCorrHfi, fluxConv=fluxConv, \
     hfi545Map=hfi545Map, hfi857Map=hfi857Map)

#  ### Optional auxilliary outputs from the ZeroPointcorrection task
#  ###  Example shown for PLW band
# SPIRE PLW map in MJy/sr with enlarged surrounding area padded with NaNs
enlargedPlw = zeroPointParam.getProduct("PLW").enlarged
# Interpolated and colour corrected Planck-HFI map for PLW filter
hfiMapPlw = zeroPointParam.getProduct("PLW").hfi
# Combination of SPIRE PLW map and Planck-HFI map before convolution
embeddedPlw  = zeroPointParam.getProduct("PLW").embedded
# Extracted SPIRE map from convolved embedded map combination
deEmbeddedPlw  = zeroPointParam.getProduct("PLW").deEmbedded
# Difference map of convolved SPIRE map and colour corrected Planck-HFI map
differencePlw = zeroPointParam.getProduct("PLW").difference
# Final zero point corrected map (same as zeroPointMaps)
finalPlw = zeroPointParam.getProduct("PLW").final

  1. Enlarged SPIRE Map:SPIRE map in MJy/sr with enlarged surrounding area padded with NaNs. For PSW this is a regridded map to 10 arcsec pixels, matching the PMW wcs. All other maps have standard pixel sizes. The map is accessed as zeroPointParam.getProduct("PxW").enlarged

  2. HFI Map:Planck-HFI map derived from from 545GHz and 857GHz maps, convolved to 8’ Gaussian resolution, colour corrected for the respective SPIRE filter, and interpolated to the smaller pixels of the enlarged SPIRE map in MJy/sr. Note that for PSW this is a wavelength extrapolation and larger errors are expected. The map is accessed as zeroPointParam.getProduct("PxW").hfi

  3. Embedded Map:SPIRE map before convolution embedded into colour corrected / interpolated Planck-HFI map. An offset was added to the SPIRE map derived from a first estimate (first iteration) to improve the match. The map is accessed as zeroPointParam.getProduct("PxW").embedded

  4. De-embedded Map:Extraction of all pixels that belong to the original SPIRE map from the SPIRE/Planck-HFI combined map convolved with an 8” Gaussian. The map is accessed as zeroPointParam.getProduct("PxW").deEmbedded

  5. Difference Map:Difference map of de-embedded SPIRE map and colour corrected / interpolated Planck-HFI map. This represents the difference map of the second iteration. The map is accessed as zeroPointParam.getProduct("PxW").difference

  6. Final Calibrated SPIRE Map:The final zero point corrected map (same as zeroPointMap) derived as adding the sum of the offsets from the two iterations to the original SPIRE image that is also the basis for the enlarged map. The map is accessed as zeroPointParam.getProduct("PxW").final

Output maps from the Zero Point Correction Task

Figure 6.93. Output maps from the Zero Point Correction Task

The offset appearing in the metadata as “zPointOffset” can also be derived as

 final = zeroPointParam.getProduct("PxW").final
 enlarged = zeroPointParam.getProduct("PxW").enlarged
 differenceMap = imageSubtract(image1=final, ref=1, image2=enlarged)
 print MEDIAN(NAN_FILTER(differenceMap.image)), final.meta['zPointOffset'].value

Both values should be the same.

The offset from the first iteration can be derived as:

 embedded = zeroPointParam.getProduct("PxW").embedded
 differenceMap1 = imageSubtract(image1=embedded, ref=1, image2=enlarged)
 print MEDIAN(NAN_FILTER(differenceMap1.image))

The offset from the second iteration can be derived as:

 difference = zeroPointParam.getProduct("PxW").difference
 print MEDIAN(NAN_FILTER(difference.image))

for all arrays. For PSW this is the only iteration that is performed.

The sum of both iterations yields the total offset added.

     print MEDIAN(NAN_FILTER(differenceMap1.image))+MEDIAN(NAN_FILTER(difference.image)), final.meta['zPointOffset'].value

Note that there is a caveat for absolute calibrated maps made in SPIRE Small Map Mode. In this case, the Planck beam for the HFI-857 is comparable to the size of a SPIRE Small Map. For most small maps, there is no problem, however, care should be taken in the vicinity of bright sources and users can check by inspecting either the HFI Map or SPIRE Embedded Map auxilliary outputs from the zeroPointCorrection task which cover the surrounding area around the small map.