Making Images & Filtering Data: an Introduction to the Chandra Data Model
![[CXC Logo]](../../imgs/cxc-logo.gif)
CIAO 4.17 Science Threads
Overview
Synopsis:
The CIAO Data Model is a versatile interface used to examine standard format datafiles (FITS, IMH); it also allows powerful filtering of datafiles. The filtered output can either be saved or input directly to an analysis task as a "virtual file." A brief introduction to the Data Model interface and examples on how to use the four core tools are provided here.
Related Links:
- 
	  Using ASCII Files in CIAO thread: filtering ASCII (text) files with the DM ASCII kernel. 
- Full details on all the dmtools can be found in their respective ahelp files.
Last Update: 13 Jan 2022 - Reviewed for CIAO 4.14. No changes.
Contents
- Get Started
- Data Model Tools
- Running Data Model Tools
- Virtual Files
- The Core Tools
- Parameter files:
- History
Get Started
For illustration, this thread utilizes the ObsID 1843 (ACIS-I, G21.5-0.9) data that was downloaded in the How to Download Chandra Data from the Archive thread.
If this is your first time using CIAO, please read the Starting CIAO thread to ensure that your environment is configured properly.
Data Model Tools
The four most frequently used (aka "core") tools are:
- dmlist - List contents or structure of a file
- dmcopy - Filter and bin tables and images
- dmextract - Make a histogram table file (e.g. PHA or PI file) for spectral fitting or a radial profile for spatial fitting.
- dmgti - Define custom good time intervals (GTIs)
In addition, there are a number of more specialized tools (partial list):
- dmappend - Append multiple blocks/extensions to an existing output file
- dmarfadd - Add multiple ARF files together, weighting by exposure time
- dmcontour - Make contour regions from a 2-D image
- dmcoords - Convert between Chandra instrumental coordinate systems
- dmdiff - Compare values in two FITS files
- dmfilth - Replace pixel values in source regions of an image with interpolated values
- dmgroup - Group a specified column in a table
- dmgroupreg - Translates ds9 regions and groups to CIAO format
- dmhedit - Edit Data Model file headers
- dmhistory - Extracts processing history from file header
- dmimg2jpg - Make a color JPEG image from three image files
- dmimgcalc - Perform arithmetic on images
- dmimghist - Make histogram of values in a 2-D image
- dmimgpick - Maps image values to rows in a table
- dmimgthresh - Set low exposure regions of an image to zero
- dmjoin - Join two files whose sampling is different
- dmkeypar - Retrieve information about a keyword from an input file
- dmmakepar - Write header keywords to a parameter file
- dmmakereg - Create a FITS region file from an ASCII region description
- dmmerge - Merge two or more compatible tables into one
- dmpaste - Add new columns to a table
- dmreadpar - Add parameters from a .par file to a file header
- dmregrid - Rebin a stack of two-dimensional images
- dmsort - Sort a table block on a given column
- dmstat - Compute standard statistics for the column in a table or image
- dmtcalc - Define new table columns as functions of old ones
- dmtype2split - Create a type 1 file for specified rows of a type 2 file
Running Data Model Tools
Tools are usually executed from the command-line prompt:
unix% dmcopy "acisf01843N004_evt2.fits[EVENTS]" acis_events.fits
Alternatively, the parameters can be input to the parameter file before the tool is run:
unix% punlearn dmcopy unix% pset dmcopy infile=acisf01843N004_evt2.fits unix% pset dmcopy outfile=acis_events.fits unix% dmcopy Input dataset/block specification (acisf01843N004_evt2.fits): Output dataset name (acis_events.fits):
The parameter file that was used can be examined with plist dmcopy. Note that the Data Model automatically uses the "interesting" block (e.g. EVENTS for an event file, SPECTRUM for a PHA file) when one is not provided, so we chose not to specify it in the second example.
Virtual Files
The Data Model offers an easy and powerful means of filtering data. As mentioned, the filtered file can be directly input to an analysis task without writing it to disk first; this is known as a "virtual file." The virtual file, which can also be referred to as a subspace, is simply a means of defining a subset of interest in the dataset.
The basic syntax of a virtual file has four arguments:
filename[block][filter][columns/binning][newblock]
- block - the section of the file to use
- filter - the filter to be applied
- columns/binning - either the columns from a table to be included in an output table or the binning
- newblock (optional) - the name for the new block in the output file, default is the block used from the input file
See ahelp dmfiltering for more information on filtering syntax.
Examples of virtual files:
- 
	    Select the first three columns of the EVENTS block by number:
or by name:acisf01843N004_evt2.fits[EVENTS][cols #1,#2,#3] acisf01843N004_evt2.fits[cols time,ccd_id,node_id] 
- 
	Select certain rows from a FITS file:
acisf01843N004_evt2.fits[#row=1:4] 
- 
	    Bin an event file to create a PI spectrum (using 
	    dmextract): 
or an image (using dmcopy):acisf01843N004_evt2.fits[EVENTS][bin pi=1:1024:1] More information on binning data is available from ahelp dmbinning.acisf01843N004_evt2.fits[EVENTS][bin x=3200:4800:4,y=3200:4800:4] 
The Core Tools
These examples show just a few of the uses for each tool - see the ahelp files for more options and examples.
1. dmlist
FITS files generally contain several different blocks, each containing multi-dimensional data. The dmlist tool allows the user to inspect all or part of a data file by column, row, etc.
- 
		To list the blocks in a file:
unix% dmlist acisf01843N004_evt2.fits blocks -------------------------------------------------------------------------------- Dataset: acisf01843N004_evt2.fits -------------------------------------------------------------------------------- Block Name Type Dimensions -------------------------------------------------------------------------------- Block 1: PRIMARY Null Block 2: EVENTS Table 15 cols x 490795 rows Block 3: GTI7 Table 2 cols x 1 rows Block 4: GTI6 Table 2 cols x 1 rows Block 5: GTI3 Table 2 cols x 2 rows Block 6: GTI2 Table 2 cols x 1 rows Block 7: GTI1 Table 2 cols x 1 rows Block 8: GTI0 Table 2 cols x 1 rows
- 
		To list the columns of the events block in a file, use the
		cols option (note the required quotes):
unix% dmlist "acisf01843N004_evt2.fits[events]" cols -------------------------------------------------------------------------------- Columns for Table Block EVENTS -------------------------------------------------------------------------------- ColNo Name Unit Type Range 1 time s Real8 84270902.1685000062: 84280645.8188659996 S/C TT corresponding to mid-exposure 2 ccd_id Int2 0:9 CCD reporting event 3 node_id Int2 0:3 CCD serial readout amplifier node 4 expno Int4 0:2147483647 Exposure number of CCD frame containing event 5 chip(chipx,chipy) pixel Int2 1:1024 Chip coords 6 tdet(tdetx,tdety) pixel Int2 1:8192 ACIS tiled detector coordinates 7 det(detx,dety) pixel Real4 0.50: 8192.50 ACIS detector coordinates 8 sky(x,y) pixel Real4 0.50: 8192.50 sky coordinates 9 pha adu Int4 0:36855 total pulse height of event 10 pha_ro adu Int4 0:36855 total read-out pulse height of event 11 energy eV Real4 0: 1000000.0 nominal energy of event (eV) 12 pi chan Int4 1:1024 pulse invariant energy of event 13 fltgrade Int2 0:255 event grade, flight system 14 grade Int2 0:7 binned event grade 15 status[4] Bit(4) event status bits -------------------------------------------------------------------------------- World Coord Transforms for Columns in Table Block EVENTS -------------------------------------------------------------------------------- ColNo Name 5: CPC(CPCX) = (+0)[mm] +(+0.0240)* (chip(chipx)-(+0.50)) (CPCY) (+0) (+0.0240) ( (chipy) (+0.50)) 7: MSC(PHI ) = (+0)[deg] +TAN-P[(+0.000136667)* (det(detx)-(+4096.50))] (THETA) (+0) (+0.000136667) ( (dety) (+4096.50)) 8: EQPOS(RA ) = (+278.0479)[deg] +TAN[(-0.000136667)* (sky(x)-(+4096.50))] (DEC) (-10.5704 ) (+0.000136667) ( (y) (+4096.50))
- 
		To list the first 5 events in a file, use the data option
		and rows parameter together:
unix% dmlist acisf01843N004_evt2.fits data row=1:5 -------------------------------------------------------------------------------- Data for Table Block EVENTS -------------------------------------------------------------------------------- ROW time ccd_id node_id expno chip(chipx,chipy) tdet(tdetx,tdety) det(detx,dety) sky(x,y) pha energy pi fltgrade grade status[4] 1 84272491.7915800959 6 0 4 (162,185) (3037,1887) ( 2999.5632324219, 6754.0478515625) ( 1516.4484863281, 2857.8146972656) 1413 1360 5585.42968750 383 0 0 00000000000000000000000000000000 2 84272491.7915800959 6 1 4 (364,292) (3239,1994) ( 3201.9252929688, 6646.9384765625) ( 1612.3209228516, 3065.7360839844) 3259 3095 12443.2968750 853 104 6 00000000000000000000000000000000 3 84272491.7915800959 6 2 4 (521,626) (3396,2328) ( 3358.3686523438, 6312.3784179688) ( 1937.8156738281, 3240.25781250) 1100 898 4318.5424804688 296 16 4 00000000000000000000000000000000 4 84272491.8326200992 7 2 4 (520,19) (4437,1721) ( 4400.3793945312, 6917.9926757812) ( 1276.0732421875, 4247.5571289062) 377 362 1778.7789306641 122 16 4 00000000000000000000000000000000 5 84272491.8326200992 7 0 4 (238,116) (4155,1818) ( 4118.5268554688, 6822.0991210938) ( 1387.2509765625, 3971.3754882812) 2755 2698 12297.6308593750 843 10 6 00000000000000000000000000000000
- 
		To list the file header:
unix% dmlist acisf01843N004_evt2.fits header -------------------------------------------------------------------------------- Header keys for block EVENTS -------------------------------------------------------------------------------- -- COMMENT This FITS file may contain long string keyword values that are -- COMMENT continued over multiple keywords. The HEASARC convention uses the & -- COMMENT character at the end of each substring which is then continued -- COMMENT on the next keyword which has the name CONTINUE. 0001 ASOLFILE pcadf084271087N004_asol1.fits String 0002 THRFILE acisD1996-11-01evtspltN0002.fits String -- COMMENT character at the end of each substring which is then continued -- COMMENT on the next keyword which has the name CONTINUE. 0003 ORIGIN ASC String Source of FITS file 0004 CREATOR cxc - Version DS 7.6.10 String tool that created this output 0005 ASCDSVER 7.6.10 String ASCDS version number 0006 MJD_OBS 51789.3576639870 Real8 Modified Julian date of observation 0007 DS_IDENT ADS/Sa.CXO#obs/01843 String dataset identifier 0008 TLMVER P008 String Telemetry revision number (IP&CL) 0009 REVISION 2 Int4 Processing version of data 0010 CHECKSUM 8FqAAEn71EnA8En7 String HDU checksum updated 2007-06-06T15:05:05 0011 DATASUM 773790139 String data unit checksum updated 2007-06-06T15:03:28 0012 CONTENT EVT2 String What data product ... 0022 DATE 2007-06-06T15:03:09 String Date and time of file creation 0023 DATE-OBS 2000-09-02T08:35:02 String Observation start date 0024 OBS_MODE POINTING String Observation mode 0025 DATE-END 2000-09-02T11:17:25 String Observation end date 0026 TIMESYS TT String Time system 0027 MJDREF 50814.0 Real8 MJD zero point for times . . (etc.) . 
- 
		All of the above examples may be combined into one command that
		yields the greatest possible amount of information:
which is shorthand for:unix% dmlist acisf01843N004_evt2.fits full unix% dmlist "acisf01843N004_evt2.fits[events]" blocks,header,cols,subspace,data 
- 
		To save the output to a text file:
unix% dmlist acisf01843N004_evt2.fits blocks outfile=blocks.txt unix% cat blocks.txt -------------------------------------------------------------------------------- Dataset: acisf01843N004_evt2.fits -------------------------------------------------------------------------------- Block Name Type Dimensions -------------------------------------------------------------------------------- Block 1: PRIMARY Null Block 2: EVENTS Table 15 cols x 490795 rows Block 3: GTI7 Table 2 cols x 1 rows Block 4: GTI6 Table 2 cols x 1 rows Block 5: GTI3 Table 2 cols x 2 rows Block 6: GTI2 Table 2 cols x 1 rows Block 7: GTI1 Table 2 cols x 1 rows Block 8: GTI0 Table 2 cols x 1 rows
2. dmcopy
The dmcopy tool can be used to manipulate data. Unlike dmlist, which produces text output, this tool produces a new data file in one of the supported formats.
- 
		Copy the events from the central region of a file into a new
		FITS file:
unix% dmcopy "acisf01843N004_evt2.fits[events][x=3600:4000,y=3800:4200]" \ acis_center.fits
- 
		Generate a blocked image:
		A convenient way to display the full field of view of an event file is to bin it into an image. In this example, the full range of sky coordinates is blocked by a factor of 4: unix% dmcopy "acisf01843N004_evt2.fits[events][bin x=::4,y=::4][IMAGE]" \ acis_img.fitsSince the image file is a binned version of the event file, only the selected variable (i.e. sky coordinates) is retained. All other information (photon arrival times, energy, etc.) is lost. unix% dmlist acis_img.fits cols -------------------------------------------------------------------------------- Columns for Image Block IMAGE -------------------------------------------------------------------------------- ColNo Name Unit Type Range 1 IMAGE[2048,2048] Int2(2048x2048) - -------------------------------------------------------------------------------- Physical Axis Transforms for Image Block IMAGE -------------------------------------------------------------------------------- Group# Axis# 1 1,2 sky(x) = (+0.50) +(+4.0)* ((#1)-(+0.50)) (y) (+0.50) (+4.0) ((#2) (+0.50)) -------------------------------------------------------------------------------- World Coordinate Axis Transforms for Image Block IMAGE -------------------------------------------------------------------------------- Group# Axis# 1 1,2 EQPOS(RA ) = (+278.0479)[deg] +TAN[(-0.000136667)* (sky(x)-(+4096.50))] (DEC) (-10.5704 ) (+0.000136667) ( (y) (+4096.50))
- 
		Filter using a region defined in sky coordinates:
unix% dmcopy "acisf01843N004_evt2.fits[sky=ellipse(1628,4116,92,160,0)]" \ source.fitsNote that the name of the column in the filter must match the name within the file itself; in Chandra data, "sky" is shorthand for "(x, y)." 
3. dmextract
The dmextract tool is similar to dmcopy. It is used to bin tables into images, but writes the binned data to a table instead of creating an image.
- 
		Make a histogram from a table column:
		
unix% dmextract "acisf01843N004_evt2.fits[bin pha=1:2048:2]" histogram.pha 
- 
		Extract the PI spectrum of a source in sky coordinates:
whereunix% dmextract "acisf01843N004_evt2.fits[sky=region(ds9.reg)][bin pi]" \ spectrum.fitsunix% more ds9.reg # Region file format: CIAO version 1.0 ellipse(1628,4116,92,172,0) More examples of region syntax are available from ahelp dmregions. 
- 
		Use a stack input:
		This tool can take a stack as input, output, or both. To combine both of the previous examples into one command: unix% more infiles.lis acisf01843N004_evt2.fits[bin pha=1:2048:2] acisf01843N004_evt2.fits[sky=ellipse(1628,4116,92,172,0)][bin pi] unix% more outfiles.lis histogram_lis.pha spectrum_lis.fits unix% dmextract infile=@infiles.lis outfile=@outfiles.lis 
4. dmgti
Pipeline processing of Chandra data uses dmgti to calculate good time intervals (GTIs) based on input MTL files. Although this is what the tool was designed for, dmgti will work equally well on any GTI filter as long as the first column of the input file is time.
A look at a lightcurve file (created with dmextract and these parameters) shows background flares where the count rate reaches values much higher than the mean (several rows were omitted for the sake of space):
unix% dmextract \
      "acisf01843N004_evt2.fits[(x,y)=field()-ellipse(1628,4116,100,140,0)][bin time=::3.24104]" \
      bkg_lc.fits opt=ltc1
unix% dmlist "bkg_lc.fits[cols time,count_rate,stat_err]" data 
 
--------------------------------------------------------------------------------
Data for Table Block LIGHTCURVE
--------------------------------------------------------------------------------
 
ROW    TIME                 COUNT_RATE           STAT_ERR            
 
     1  84270903.7890200019                    0                    0
     2  84270907.0300600231                    0                    0
     3  84270910.2711000144                    0                    0
.
.
   490  84272488.6575800180                    0                    0
   491  84272491.8986200094         6.5624999873         4.5825756950
   492  84272495.1396600008         10.312499980         5.7445626465
   493  84272498.3807000220         7.1874999861         4.7958315233
.
.
   740  84273298.9175800085        95.9374998141        17.5214154679
   741  84273302.1586199999        94.3749998171        17.3781471970
   742  84273305.3996600211        87.1874998311        16.7032930885
   743  84273308.6407000124       123.7499997602        19.8997487421
   744  84273311.8817400038        86.8749998317        16.6733320005
   745  84273315.1227799952        98.1249998099        17.7200451467
.
.
  3005  84280639.8731800020                    0                    0
  3006  84280643.1142200232                    0                    0
  3007  84280646.3552600145                    0                    0
The tool dmsort is used to sort the count_rate column in descending order, to show more clearly the times of high background:
unix% dmsort bkg_lc.fits sorted_bkg_lc.fits keys=-count_rate
unix% dmlist "sorted_bkg_lc.fits[cols time,count_rate,stat_err]" data | less
 
--------------------------------------------------------------------------------
Data for Table Block LIGHTCURVE
--------------------------------------------------------------------------------
 
ROW    TIME                 COUNT_RATE           STAT_ERR            
 
     1  84274245.3012599945       185.6249996403        24.3721152139
     2  84274261.5064600110       184.0624996434        24.2693221990
     3  84274248.5423000157       175.9374996591        23.7276210354
     4  84274242.0602200031       166.5624996773        23.0867927612
.
.
   537  84280341.6975000203        77.8124998492        15.7797338381
   538  84280114.8246999979        77.8124998492        15.7797338381
   539  84280108.3426200151        77.8124998492        15.7797338381
   540  84280095.3784600198        77.8124998492        15.7797338381
.
.
  2324  84272556.7194200158         8.1249999843         5.0990195136
  2325  84272537.2731800079         8.1249999843         5.0990195136
  2326  84273039.6343800128         7.8124999849                  5.0
.
.
  3005  84270910.2711000144                    0                    0
  3006  84270907.0300600231                    0                    0
  3007  84270903.7890200019                    0                    0
If we wanted to exclude the times when the count rate was less than 40.0 and greater than 100.0:
unix% dmgti infile=bkg_lc.fits outfile=acis_gti.fits \
      userlimit="(count_rate>40.0)&&(count_rate<100.0)"
unix% dmlist "acis_gti.fits[gti]" data
--------------------------------------------------------------------------------
Data for Table Block GTI
--------------------------------------------------------------------------------
 
ROW    START                STOP                
 
     1  84273206.5479400158  84273209.7889800072
     2  84273213.0300200284  84273232.4762600064
     3  84273242.1993800104  84273307.0201800168
.
.
    84  84279860.4030600190  84279879.8493000269
    85  84279883.0903400183  84279892.8134600222
    86  84279896.0545000136  84280443.7902600169
The event file may now be filtered on the newly calculated GTI:
unix% dmcopy "acisf01843N004_evt2.fits[@acis_gti.fits]" acis_filtered_evt2.fits
Doing a dmlist on each of the files shows how the number of events and the GTI blocks are affected by this filter:
unix% dmlist acisf01843N004_evt2.fits blocks
 
--------------------------------------------------------------------------------
Dataset: acisf01843N004_evt2.fits
--------------------------------------------------------------------------------
 
     Block Name                          Type         Dimensions
--------------------------------------------------------------------------------
Block    1: PRIMARY                        Null
Block    2: EVENTS                         Table        15 cols x 490795   rows
Block    3: GTI7                           Table         2 cols x 1        rows
Block    4: GTI6                           Table         2 cols x 1        rows
Block    5: GTI3                           Table         2 cols x 2        rows
Block    6: GTI2                           Table         2 cols x 1        rows
Block    7: GTI1                           Table         2 cols x 1        rows
Block    8: GTI0                           Table         2 cols x 1        rows
unix% dmlist acis_filtered_evt2.fits blocks
 
--------------------------------------------------------------------------------
Dataset: acis_filtered_evt2.fits
--------------------------------------------------------------------------------
 
     Block Name                          Type         Dimensions
--------------------------------------------------------------------------------
Block    1: PRIMARY                        Null
Block    2: EVENTS                         Table        15 cols x 416088   rows
Block    3: GTI7                           Table         2 cols x 86       rows
Block    4: GTI6                           Table         2 cols x 86       rows
Block    5: GTI3                           Table         2 cols x 87       rows
Block    6: GTI2                           Table         2 cols x 86       rows
Block    7: GTI1                           Table         2 cols x 86       rows
Block    8: GTI0                           Table         2 cols x 86       rows
Parameters for /home/username/cxcds_param/dmcopy.par
        infile = acisf01843N004_evt2.fits Input dataset/block specification
       outfile = acis_events.fits Output dataset name
       (kernel = default)         Output file format type
       (option = )                Option - force output type
      (verbose = 0)               Debug Level
      (clobber = no)              Clobber existing file
         (mode = ql)              
    
Parameters for /home/username/cxcds_param/dmextract.par
        infile = acisf01843N004_evt2.fits[(x,y)=field()-ellipse(1628,4116,100,140,0)][bin time=::3.24104] Input event file 
       outfile = bkg_lc.fits      Enter output file name
          (bkg = )                Background region file or fixed background (counts/pixel/s) subtraction
        (error = gaussian)        Method for error determination(gaussian|gehrels|<variance file>)
     (bkgerror = gaussian)        Method for background error determination(gaussian|gehrels|<variance file>)
      (bkgnorm = 1.0)               Background normalization
          (exp = )                Exposure map image file
       (bkgexp = )                Background exposure map image file
      (sys_err = 0)               Fixed systematic error value for SYS_ERR keyword
          (opt = ltc1)            Output file type 
     (defaults = ${ASCDS_CALIB}/cxo.mdb -> /soft/ciao/data/cxo.mdb) Instrument defaults file
         (wmap = )                WMAP filter/binning (e.g. det=8 or default)
      (clobber = no)              OK to overwrite existing output file(s)?
      (verbose = 0)               Verbosity level
         (mode = ql)              
    History
| 23 Dec 2004 | reviewed for CIAO 3.2: no changes | 
| 01 Dec 2005 | updated for CIAO 3.3: default value of dmextract error and bkgerror parameters is "gaussian"; updates to screen output in dmgti example | 
| 01 Dec 2006 | updated for CIAO 3.4: updates to screen output in dmgti example | 
| 09 Jan 2008 | updated for CIAO 4.0: filenames and screen output updated for reprocessed data (version N002 event file) | 
| 02 Jan 2009 | reviewed for CIAO 4.1: no changes | 
| 25 Jan 2010 | reviewed for CIAO 4.2: no changes | 
| 11 Jan 2011 | reviewed for CIAO 4.3: no changes | 
| 11 Apr 2011 | changed title from "Introduction to the Data Model" to "Making Images & Filtering Data with the Data Model" | 
| 03 Jan 2012 | reviewed for CIAO 4.4: no changes | 
| 03 Dec 2012 | Review for CIAO 4.5; update file versions | 
| 26 Apr 2013 | changed title from "Making Images & Filtering Data with the Data Model" to "Making Images & Filtering Data: an Introduction to the Chandra Data Model" | 
| 25 Nov 2013 | Review for CIAO 4.6. No changes. | 
| 17 Dec 2014 | Reviewed for CIAO 4.7; no changes. | 
| 03 Jan 2017 | Reviewed for CIAO 4.9; minor edits only. | 
| 02 Nov 2020 | Remove reference to peg and the analysis menu which have been withdrawn from CIAO 4.13. | 
| 18 Oct 2021 | Updated for Repro-5 version number. | 
| 13 Jan 2022 | Reviewed for CIAO 4.14. No changes. |