STScI Logo

Hubble Space Telescope
ACS Zeropoints and Flux Calibration


For convenience, the ACS Team implemented the Zeropoint Calculator to compute time-dependent zeropoints for all supported observing modes. We strongly advised users to use this calculator to derive the zeropoints required for photometric calibration of their observation. The examples below give the same results as the calculator.

This webpage contains information for how to calibrate photometric measurements made with the HST/ACS instrument. There are several supporting documents linked below which give a more detailed explanation of many topics and methods used to in the photometric calibration of the ACS instrument. The topics on this page will be suitable for most users performing basic aperture photometry. Aperture correction tables can be found on the Aperture Corrections webpage.

To download this page as a Python 3 Jupyter Notebook, please visit the acs-notebook GitHub page.

Summary of Changes Made in Deriving the 2016 ACS/WFC Zeropoints

Bohlin (2016; hereafter ISR 2016-03) continues the work documented in ACS ISRs 2011-02, 2011-03, and 2012-01 by performing the most precise set of flux calibration for the HRC and WFC cameras to date. The data are comprised of ~18 orbits of the primary hot white dwarf stars G191B2B, GC153, and GD71, which are used to define the ACS flux calibration and its change over time, spanning a ~7 year period from August 2009 to March 2016. The average decline in sensitivity is 0.061% 0.007% per year across all filters, which differs at most by $<1\sigma$ from the measured rate of 0.035% 0.037% for F850LP; therefore, the average loss rate is adopted for all WFC data taken after SM4 (2009.4). even with gain adjustments made after the revival of the ACS WFC to match post-SM4 photometry to 2002.4 epoch photometry of 47 Tuc for F606W (ACS ISR 2011-03), an additional (small) shift in sensitivity by 0.997 improves the match at F606W. These adjustments range from 0.996 to 1.007 for the other filters. After applying corrections for sensitivity loss and renormalizing, the new observations and newly reprocessed data for F435W and F814W required shifts to each filter's bandpass transmission function to reduce the maximum error. Once all of the adjustments are made, the fully corrected photometry at the WFC1-1K reference point in the eight broadband filters achieves the 1% precision goal.

Comparing the WFC PHOTFLAM results of ISR 2016-03 with Sirianni et al. (2005) for 2002.16 epoch reveals differences ranging from 5% smaller for F660N to 1% larger for F550M, while the eight broadband filters are 1$-$3% smaller. For the HRC, differences range from 0$-$3% smaller, except for F344N, where the new calibration is 3% larger. These differences are due mostly to changes in the CALSPEC reference spectral energy distributions (SEDs) and to a refined and expanded set of ACS observations of these standard stars.

Photometric Systems

Here we define several terms generally used in the photometric analysis of HST/ACS observations.

  • Flux: The average flux $F$ (units: erg cm$^{-2}$ s$^{-1}$ Ang$^{-1}$) over an ACS bandpass is $F=N~\times$ PHOTFLAM, where $N$ is the count rate in an infinite aperture. For count rates $N_{\mathrm{ap}}$ in a given aperture, $N=N_{\mathrm{ap}}/EE$ where $EE$ is the fractional encircled energy. See the ACS Data Handbook and ISR 2016-03 section 7.3 for more information on aperture corrections.

  • VegaMag: A magnitude system in which Vega has an apparent magnitude of 0 at all wavelengths. Using the flux spectrum of Vega from the CALSPEC archive ($F_{\mathrm{Vega}}$), the magnitude of a star with flux $F$ is:

    • $m = -2.5\log_{10}(F/F_{\mathrm{Vega}})$

  • STMag and ABMag: These magnitude systems differ from VegaMag in that they have an artifical reference flux for conversion to magnitude. The reference flux for STMag ($3.63\times10^{-9}$ erg cm$^{-2}$ s$^{-1}$ Ang$^{-1}$) is flat in wavelength space, while the reference for ABMag ($3.63\times10^{-20}$ erg cm$^{-2}$ s$^{-1}$ Hz$^{-1}$) is flat in frequency space. The conversion between flux density and magnitude for these photometric systems are:

    • STMag $= -2.5\log_{10}(F_\lambda) - 21.10$
    • ABMag $= -2.5\log_{10}(F_\nu) - 48.60$

Photometric Keywords in the SCI Extension of ACS Images

Here we describe several header keywords present in ACS FITS files. These keywords can be used to obtain photometric calibration information for your data.

  • PHOTMODE: Observation configuration for photometric calibration.
  • PHOTFLAM: Inverse sensitivy (units: erg cm$^{-2}$ Ang$^{-1}$ electron$^{-1}$). This represents the scaling factor necessary to transform an instrumental flux in units of electrons per second to a physical flux density.
  • PHOTZPT: STMag zeropoint.
  • PHOTPLAM: Pivot wavelength (units: Angstroms)

The PHOTFLAM and PHOTPLAM header keywords are used to derive the instrumental zeropoint magnitudes, which are defined to be the magnitude of an object that produces one count per second. The instrumental magnitudes are defined as follows:

  • $\mathrm{ZP}_{\mathrm{ST}} = -2.5\log_{10}($ PHOTFLAM $) - 21.10$

  • $\mathrm{ZP}_{\mathrm{AB}} = -2.5\log_{10}($ PHOTFLAM $) - 5\log_{10}($ PHOTPLAM $) - 2.408$

In addition to being present in the image headers, the PHOTFLAM value for a given date can be calculated using PySynphot. See the Examples below.

Note: The ACS absolute flux calibration represented by the PHOTFLAM keyword is applicable to the distortion corrected pipeline products (*_drz.fits or *_drc.fits) produced by AstroDrizzle. In order to extract photometry from non-geometrically-corrected pipeline products (*_flt.fits or *_flc.fits), the appropriate pixel area maps must be applied to the images first. See the ACS Data Handbook section 5.1.3 for more information.


Warning: Before running any code, please be sure you have installed or updated to the latest version of AstroConda. You will also need to install the component throughput tables and CALSPEC spectroscopic library for use with PySynphot.

Calculating the Zeropoints for a Specific Date

For the first example, we will calculate all of the zeropoints (VegaMag, STMag, and ABMag) for a specific date and filter. In this case, we will use Jan 1, 2017 (the MJD of this date is 57754) and the F555W filter. Using this information, PySynphot will determine the appropriate PHOTFLAM and PHOTPLAM values. Given a source specrtrum, it will also calculate the VegaMag, STMag, and ABMag magnitudes for the source. By choosing a spectrum that produces a count rate of 1 count/second (we can do this by normalizing our source spectrum), PySynphot can be made to return the VegaMag, STMag, and ABMag zeropoints.

Recall that the appropriate PHOTFLAM and PHOTPLAM values for a given observation can be found in the SCI extention headers of every ACS image.

In [1]:
import pysynphot as pyS
import numpy as np

# Set up bandpass and source spectrum. Perform a 
# synthetic observation of the source. Note that the
# term 'counts' in PySynphot is variable for each instrument.
# For ACS, 'counts' refers to electrons.
bp = pyS.ObsBandpass('acs,wfc1,f555w,mjd#57754')
spec_bb = pyS.BlackBody(10000)
spec_bb_norm = spec_bb.renorm(1, 'counts', bp)
obs = pyS.Observation(spec_bb_norm, bp)

# Get photometric calibration information.
photflam = obs.effstim('flam') 
photplam = bp.pivot() 

# Get the magnitudes of the source spectrum in the
# bandpass. Because the source was normalized to
# 1 electron per second, the magnitudes are the 
# zeropoints in their respective systems.
# e.g. m_vega = -2.5*log10(counts) + zpt_vega
zp_vega = obs.effstim('vegamag')
zp_st = obs.effstim('stmag')
zp_ab = obs.effstim('abmag')

print(bp.pivot(),obs.efflam(), obs.pivot())
# Print the results.
print('PHOTFLAM = {}'.format(photflam))
print('PHOTPLAM = {}'.format(photplam))
print('VegaMag_ZP = {}'.format(zp_vega))
print('STMag_ZP = {}'.format(zp_st))
print('ABMag_ZP = {}'.format(zp_ab))
5360.938374660126 5346.10754454 5334.019379527958
PHOTFLAM = 1.9641265291094434e-19
PHOTPLAM = 5360.938374660126

VegaMag_ZP = 25.712712461641793
STMag_ZP = 25.667076345950036
ABMag_ZP = 25.71292402862334

Converting Between Instrumental and Physical Fluxes/Magnitudes

In this example, we have a measurement of the fluxes of several point sources in 0.2 arcsecond (4 pixel) radius apertures using the ACS/WFC camera and the F555W filter taken on Jan 1, 2017. We will need to first apply an aperture correction to our measurements and then convert from the instrumental units of electrons per second to physically meaningful values (e.g., STMag and ABMag).

While we can use PySynphot to estimate the aperture corrections, it is best to measure these values from a selection of isolated point sources in your data. In the example below, we have used the PySynphot method.

Aperture corrections from 0.5 and 1.0 arcseconds to "infinity" can be found on the Aperture Corrections webpage. These tables are a collection of information from several publications and include information for all ACS cameras (WFC, SBC, and HRC). The “infinite” aperture corresponds to a radius of 4 arcseconds for SBC, and 5.5 arcseconds for WFC and HRC.

If using the notebook version of these examples, this assumes you have run the previous example first to define several variables. If you have not, then please run the code in the example Calculating the Zeropoints for a Specific Date.

In [2]:
import pysynphot as pyS
import numpy as np
from astropy.table import Table

# Create some fake fluxes in electrons per second.
instrumental_flux = np.array([5.2393, 7.2935, 3.2355, 4.9368])

# Get and apply the aperture correction from 0.2" to 0.5". Use
# the blackbody defined in the previous example to be our source
# and measure the count rate in a 0.2" and 0.5" aperture.
band02 = pyS.ObsBandpass('acs,wfc1,f555w,mjd#57754,aper#0.2')
band05 = pyS.ObsBandpass('acs,wfc1,f555w,mjd#57754,aper#0.5')

obs02 = pyS.Observation(spec_bb, band02)
obs05 = pyS.Observation(spec_bb, band05)

correction_05 = obs02.countrate()/obs05.countrate()
print('Aperture correction 0.2 -> 0.5 = {}'.format(correction_05))

# Apply the aperture correction from 0.2" to 0.5" to measured 
# fluxes. Then apply the correction from 0.5" to infinity.
# The correction from 0.5" to infinity for the ACS/WFC camera
# in F555W is 0.915.
correction_inf = 0.915

flux05 = instrumental_flux / correction_05
flux_inf = flux05 / correction_inf

# Let's recalculate the zeropoints assuming we only know
# PHOTFLAM and PHOTPLAM rather than having PySynphot tell
# us the values. We will re-use the zeropoint for VegaMag
# from the previous example as we would have used PySynphot 
# to get that value in any case.
zp_stmag = -2.5 * np.log10(photflam) - 21.10
zp_abmag = -2.5 * np.log10(photflam) - (5 * np.log10(photplam)) - 2.408

# Now convert instrumental fluxes to physical fluxes and magnitudes.
# f_lambda is the flux density in units of erg/sec/cm^2/Angstrom.
f_lambda = flux_inf * photflam
stmags = -2.5 * np.log10(flux_inf) + zp_stmag
abmags = -2.5 * np.log10(flux_inf) + zp_abmag
vegamags = -2.5 * np.log10(flux_inf) + zp_vega

# Assemble the values into an Astropy Table. Note that we could
# attach units to these columns, however advanced Astropy
# Tables use is outside the scope of this example.
phot_table = Table({'Measured Flux': instrumental_flux, 'F_lambda': f_lambda,
                    'ST Mag': stmags, 'AB Mag': abmags, 'Vega Mag': vegamags}, 
                   names=['Measured Flux', 'F_lambda', 'ST Mag', 'AB Mag', 'Vega Mag'])

Aperture correction 0.2 -> 0.5 = 0.9209783626680301
Table length=4
Measured FluxF_lambdaST MagAB MagVega Mag