Note: This correction is now in acis_process_events (as of CIAO 4.3, 15 Dec 2010).

Applying a temperature-dependent CTI correction to ACIS data

Jennifer Posson-Brown (SAO), Catherine Grant (MIT), Glenn Allen (MIT), Paul Plucinsky (SAO), Richard Edgar (SAO), Dale Graessle (SAO) and the ACIS calibration team


The spectral resolution of the ACIS CCDs is substantially improved by a charge transfer inefficiency (CTI) correction algorithm included in acis_process_events. However, the behavior of the charge traps that cause CTI is temperature dependent: warmer-than-nominal focal plane temperatures reduce the effectiveness of the correction algorithm. As the insulation on the exterior of the SIM and the ACIS radiator shade have aged, the surfaces around the ACIS focal plane and radiator have become warmer, leading to FP temperatures which are sometimes a few degrees warmer than desired, particularly for observations done at spacecraft pitch angles greater than ~140 degrees. The ACIS team successfully reduced average focal plane temperatures by shutting off the detector housing heater in April 2008, and a heater on the SIM was turned off in August 2009 providing additional margin, but many warm observations exist in the archive, and observations done at "tail-Sun" attitudes still often have warm focal plane temperatures.

Catherine Grant developed an algorithm to correct for the temperature dependence of the ACIS CTI (see her Chandra Calibration Workshop presentation "Correcting for the temperature dependence of ACIS charge transfer inefficiency"). The ACIS calibration team has developed this algorithm into an IDL program designed to work with current CIAO tools and CALDB products (see the Chandra Calibration Review presentation "Developing contributed software to correct for the temperature dependence of charge transfer inefficiency"). The IDL program applies the temperature-dependent CTI correction to the PHAS column in a level=1 ACIS event file, using focal plane temperature measurements from the MTL file, then runs the CIAO tool acis_process_events to update the PHA, flight grade, grade and energy columns based on the corrected PHAS.

Testing of the IDL program by the ACIS calibration team is documented here.

This page will explain how to examine the ACIS focal plane temperature for an observation and how to use the IDL program to apply the temperature-dependent CTI correction. As an example, we will use a calibration observation of E0102 (ObsID 6050).

The temperature-dependent CTI correction will be included in version 4.3 of CIAO, scheduled for release in December 2010.

Please direct questions and comments to Jennifer Posson-Brown (jpossonbrown at

Who should use the temperature-dependent CTI correction?

How to

1. Check focal plane temperature

To determine if you need the temperature-dependent CTI correction, you can check the focal plane temperature for your observation, which is recorded in the MTL file (acisf*mtl1.fits.gz). After downloading the MTL file from the archive, plot FP_TEMP versus TIME or EXPNO (exposure number).

For example, in IDL:
IDL> mtl=mrdfits('acisf06050_000N002_mtl1.fits.gz',1,h)
IDL> fpt=mtl.fp_temp ; focal plane temperature (Kelvin)
IDL> fpt_cel=fpt-273.15 ; converted to degrees Celsius
IDL> plot,mtl.expno,fpt_cel,/xs,/ys,xtitle="Exposure Number",title='Focal Plane Temperature'

The nominal ACIS focal plane temperature is -119.7 degrees Celsius (153.45 Kelvin) and the desired range is -120.2 to -119.2 degrees Celsius (152.95 to 153.95 Kelvin).

In the following plot, the red line shows the focal plane temperature during the E0102 observation, with the blue dashed line indicating the optimal ACIS focal plane temperature and the blue dotted lines showing the desired range. As you can see, the FP temperature is warmer than -119.2 C for most of the observation.

If the focal plane temperature is above the desired range during your observation, you may want to apply the temperature-dependent CTI correction. Approximate percentages of pulse-height change per degree above -119.7 C are shown below:

event energy1.5 keV6 keV
FI chip-0.7%-0.4%
BI chip+0.2%+0.1%

Note that these numbers are for the top 64 rows of the CCD, which are the most strongly affected by CTI. The numbers would be smaller for events at lower rows.

2. Assemble files

To apply the temperature-dependent CTI correction, we will first need to gather the required files.

ACIS data products needed from archive:

For obsid 6050, the files are:

Download the following from this page:

The script assumes that all files are in the same directory.

3. Reprocess level=1 event file

Before applying the temperature-dependent CTI correction, you may need to reprocess the level=1 event file from the archive to ensure that the most recent CALDB products have been applied. This CIAO thread discusses how to determine if you need to reprocess. If in doubt, it is best to reprocess your data.

For example,
unix% punlearn acis_process_events

unix% acis_process_events infile="acisf06050_000N002_evt1.fits.gz" outfile="obs6050_evt1_ape.fits" \
? acaofffile="pcadf219296454N002_asol1.fits.gz" badpixfile="acisf06050_000N002_bpix1.fits.gz" \
? apply_tgain=yes tgainfile=CALDB apply_cti=yes ctifile=CALDB

If there is more than one aspect solution file for your observation, the files should be provided to the acaofffile parameter in chronological order as a list or stack. See this CIAO thread on reprocessing ACIS data.

If you are working with VFAINT mode data and wish to flag potential cosmic-ray background events, you should set the acis_process_events parameter check_vf_pha to yes in this step.

You may also choose to select a subset of the chips at this point. The IDL program is not very fast, so you can save time by running it only on the chips of interest. For example, in obsid 6050 the source is on I3, so will we make an event file with only this chip:

unix% dmcopy "obs6050_evt1_ape.fits[ccd_id=3]" obs6050_evt1_ape_I3.fits

4. Run IDL code

Now we can use the IDL code to apply the temperature-dependent CTI correction. The syntax is as follows:


Required parameters:
Optional parameters:
The script will output two intermediate files and a level=1 event file: If the filter keyword is set, the script will produce two additional event files:

Before starting IDL, initialize CIAO.

For example,
unix% ciao
unix% idl

This creates two intermediate files (obs6050_tcticorr_intermediate1.fits and obs6050_tcticorr_intermediate2.fits), a level=1 event file (obs6050_tcticorr_evt1.fits), a level=1 event file filtered on status and grade (obs6050_tcticorr_evt1_flt.fits), and a level=2 event file (obs6050_tcticorr_evt2.fits).

You are now done with the temperature-dependent CTI correction. If you did not set the filter keyword, you may wish to manually create a level=2 event file at this point. For example:

unix% dmcopy "obs6050_tcticorr_evt1.fits[EVENTS][grade=0,2,3,4,6,status=0]" obs6050_tcticorr_evt1_flt.fits
unix% dmcopy "obs6050_tcticorr_evt1_flt.fits[EVENTS][@acisf06050_000N002_flt1.fits.gz]" obs6050_tcticorr_evt2.fits

To see the effect of the temperature-dependent correction, we can compare pulse-heights corrected with the regular (acis_process_events) CTI correction and the temperature-dependent CTI correction. For ObsID 6050, I have the level=2 event file with the temperature-dependent CTI correction applied, but I still need to make a level=2 event file with the regular CTI correction:

unix% dmcopy "obs6050_evt1_ape_I3.fits[EVENTS][grade=0,2,3,4,6,status=0]" obs6050_ape_evt1_flt.fits
unix% dmcopy "obs6050_ape_evt1_flt.fits[EVENTS][@acisf06050_000N002_flt1.fits.gz]" obs6050_ape_evt2.fits

We can now compare obs6050_tcticorr_evt2.fits and obs6050_ape_evt2.fits to see the effect of the temperature-dependent CTI correction.

The effect is subtle for this observation since the focal plane temperature was only a few tenths of a degree above the desired range, but it is clear that the temperature-dependent CTI corrected PHAs (red histogram) are slightly higher than the non-temperature-dependent CTI corrected PHAs (black histogram).

I used IDL to make this plot:

read in the two event files:
IDL> ape=mrdfits('obs6050_ape_evt2.fits',1,h)
IDL> tcti=mrdfits('obs6050_tcticorr_evt2.fits',1,h)
settings for plot:
IDL> set_plot,'ps'
IDL> peasecolr,white=white
(peasecolr is a color package available in PINTofALE)
IDL> !p.thick=5
IDL> !x.thick=5
IDL> !y.thick=5
IDL> !p.charsize=1.5
IDL> !x.charsize=1
IDL> !y.charsize=1
IDL> !p.charthick=5
make plot:
IDL> device,filename='',/landscape,/color
IDL> plot,histogram(ape.pha,min=0,max=500,bin=1),/xs,/ys,xtitle="PHA",title="E0102, ObsID 6050, I3",psym=10,thick=5,xr=[100,400],ytitle="Counts"
IDL> oplot,histogram(tcti.pha,min=0,max=500,bin=1),col=2,psym=10,thick=5
IDL> legend,['obs6050_ape_evt2','obs6050_tcticorr_evt2'],col=[0,2],psym=[1,1],box=0,/top,/right
IDL> device,/close

Run time:
The following table indicates the run time of the IDL code (on a SunUltra20) for input event files of various sizes.

file size (MB)# eventsapprox run time (min)