imcontsub

The purpose of this software is to subtract continuum in a parallel/distributed environment or on a single computer system. The software leverages MPI, however can be run on a simple laptop or a large supercomputer.

The imcontsub task was originally based on the version of the ACES robust_contsub.py script from Dec 2019. It is still available by specifying iterativeclip=false. It performs the following processing for each spectrum:

  • exclude outliers (top and bottom 5%),

  • do approximate linear fit of the spectrum (using every 10th data point)

  • subtract off the linear fit to remove source spectral index to 1st order

  • determine mask based on threshold and IQR relative to median (see below)

  • use mask to fit original channels with polynomial of given order

  • subtract fit and write out residual spectrum

In Oct 2023 the algorithm was improved to implement iterative robust clipping. The new algorithm consists of the following steps:

  • exclude outliers (top and bottom 5%),

  • do linear fit to remaining points

  • exclude the 50% largest residuals and redo linear fit

  • determine a mask based on threshold and IQR relative to median

  • (on the first pass use minimum of Q50-Q25 and Q75-Q50 to estimate IQR)

  • repeat above steps until there are no further changes (up to 5 times)

  • use mask to fit original channels with polynomial of given order

  • subtract fit and write out residual spectrum

Running the program

It can be run with the following command, where “config.in” is a file containing the configuration parameters described in the next section.

$ <MPI wrapper> imcontsub -c config.in

Note that the number of ranks needs to divide evenly into the 2nd axis of the input cube (Nx,Ny,Nz). Each rank processes a block of Ny/Nranks x-z planes (containing Nx * Ny/Nranks spectra of length Nz each).

Configuration Parameters

Parset parameters understood by imcontsub are given in the following table (all parameters must have imcontsub prefix, i.e. imcontsub.order).

Parameter

Type

Default

Description

inputfitscube

string

None

Image cube to work with. The input file has to be in FITS format. It is read and left unchanged.

outputfitscube

string

generated

The name of the cube to write the results to. If the file already exists, it will be overwritten. If the output name is left unspecified, it is generated from the input name: mycube.fits -> mycube.contsub.fits

order

int

2

The order of the polynomial used to fit for the continuum.

threshold

float

2.0

The threshold (in robust rms units) used to decide which channels to include in the fit for the continuum. A channel is included if it is not flagged and: abs(pixval-median) < threshold*rms where rms is estimated from the IQR (inter quartile range)

blocksize

int

0

Do the subtraction in blocks of channels, this serves two needs: match the beamforming interval to deal with discontinuities at boundaries; better model the continuum by fitting over a smaller frequency range. The default of 0 will fit and subtract the whole spectrum at once

shift

int

0

Shift the origin of the subtraction blocks ‘left’ by this many channels to match the location of beamforming steps.

interleave

bool

false

Interleave the fit/subtract blocks, using blocksize channels to fit the spectrum, but subtracting only the central 50%, stepping by half a block. This avoids some edge effects of the fitting process obvious in the rms spectrum

iterativeclip

bool

true

If true, use iterative robust clipping to reject emission and absorption features before fitting continuum. If false, use the previous algorithm which was less accurate and mainly aimed at rejecting emission features

imageacces

string

collective

The default is to use MPI collective IO, which is the most efficient way to read and write the data. If that is not available, specify ‘individual’ for all ranks to work independently and write in sequential mode.

imageHistory

vector<string>

none

Specify lines to add to the image history

Example

# The input fits cube
imcontsub.inputfitscube                           = mycube.fits
# The output fits cube
imcontsub.outputfitscube                          = mycube.contsub.fits
# The polynomial order - doing a linear fit
imcontsub.order                                   = 1
# The threshold - include channels within 2.5 sigma
imcontsub.threshold                               = 2.5
# The blocksize - match default beamforming interval
imcontsub.blocksize                               = 54