Selavy Basics


Selavy is the ASKAP implementation of the source-finding algorithms of Duchamp (publicly available at the Duchamp website).

Duchamp is a source-finder designed for three-dimensional datasets (such as HI spectral-line cubes), but is easily applied to two- or one-dimensional data. There is an extensive user’s guide available on the Duchamp website that provides details about the algorithms. Users are also referred to the Duchamp journal paper Whiting (2012), MNRAS 421, 3242 for further details and examples. The name ‘Duchamp’ comes from Marcel Duchamp, the artist who pioneered the art of the “readymade”, or “found object”.

Selavy uses the core Duchamp algorithms, and adds new features as dictated by the requirements of ASKAP processing. See Whiting & Humphreys (2012), PASA 29, 371 for descriptions and some benchmarks. The new features include support for distributed processing, Gaussian fitting to two-dimensional images, variable-threshold detection, and additional pre- and post-processing algorithms specified by the Survey Science Teams. The name ‘Selavy’ comes from Rrose Selavy, a pseudonym of Marcel Duchamp.

Basic Execution and Control Parameters

This section summarises the basic execution of Selavy, with control of specific types of processing discussed in later sections. The default approach of Selavy is to follow the Duchamp method of applying a single threshold, either a flux value (specified by the user) or a signal-to-noise level, to the entire image. Pixels above this threshold are grouped together in objects - they may be required to be contiguous, or they can be separated by up to some limit. Detected objects may be “grown” to a secondary (lower) threshold, to include faint pixels without having to search to a faint level.

One of the aims of Selavy is to provide distributed processing support, and details on how this is done can be found below. To get a single SNR threshold in this case, the noise stats are calculated on a subimage basis and combined to find the average noise across the image. Selavy also permits variable detection thresholds to be determined in several ways - these are described on the Thresholds page.

The input image can be a FITS format image or a CASA image (as is produced by the ASKAPsoft imaging pipeline). The code to read CASA images is new: it extracts the flux, WCS and metadata information and stores them in the classes used by the Duchamp code. While the Duchamp software is able to read FITS images, this has issues with very large cubes depending on the memory of the system being used - sometimes even the getMetadata() function would break (e.g. when subsections were being requested) when the number of pixels in the subsection was more than memory could hold. For this reason, the CASA code is default, unless the useCASAforFITS parameter is set to false.

General parameters

The following table lists the basic parameters governing the searching. All parameters listed here should have a Selavy. prefix (ie. Selavy.image).

All parameters from Duchamp can be provided in an input parameter set, although some are not implemented in Selavy. A list of these and brief explanations can be found on the Duchamp Exclusions page.

Parameter Type Default Description
image string none The input image - can also use imageFile for consistency with Duchamp parameters
useCASAforFITS bool true Whether to use the casacore functionality for FITS images (if false, the native Duchamp code is used - see discussion above)
searchType string spatial How the searches are done: in 2D channel maps (“spatial”) or in 1D spectra (“spectral”)
snrCut float 4.0 Threshold value, in multiples of the rms above the mean noise level
threshold float no default Threshold value in units of the image (if not given, the signal-to-noise threshold given by snrCut will be used instead.)
flagGrowth bool false Whether to grow detections to a lower threshold
growthCut float 3.0 Signal-to-noise ratio to grow detections down to
growthThreshold float 0.0 Threshold value to grow detections down to (takes precedence over growthCut)
flagNegative bool false Whether to invert the cube and search for negative features
flagRobustStats bool true Whether to use robust statistics when evaluating image noise statistics.
minPix int 2 Minimum number of pixels allowed in a detection
minChannels int 3 Minimum number of channels allowed in a detection
minVoxels int minPix + minChannels + 1 Minimum number of voxels allowed in a detection. Will be at least minPix + minChannels + 1, but can be higher.
maxPix int -1 Maximum number of pixels allowed in a detection. No check is made if value is negative.
maxChannels int -1 Maximum number of channels allowed in a detection . No check is made if value is negative.
maxVoxels int -1 Maximum number of voxels allowed in a detection. No check is made if value is negative.
flagAdjacent bool true When merging sources, whether sources need to be adjacent to be merged
threshSpatial float 3.0 When flagAdjacent=false, this is the spatial threshold (in pixels) within which objects are combined
threshVelocity float 7.0 When flagAdjacent=false, this is the frequency threshold (in channels) within which objects are combined
flagRejectBeforeMerge bool false A flag indicating whether to reject sources that fail to meet the minimum size criteria before the merging stage. Default behaviour is to do the rejection last.
flagTwoStageMerging bool true A flag indicating whether to do an initial merge of newly-detected sources into the source list as they are found. If false, new sources are simply added to the end of the list for later merging.
flagSubsection bool false Whether to look at just a subsection of the given image
subsection string full image A subsection string, e.g. [1001:2000, 50:1572, *, *] - only these pixels will be examined
flagStatSec bool false Whether to use a subsection of the image to calculate the image statistics
statsec string full image A subsection string indicating the pixel region to be used to calculate statistics (mean, rms,…)
flaggedChannels string no default A comma-separated list of channels and channel ranges (for instance, 1,2,5-9,13) that should be ignored for the purposes of detecting objects. Replaces the old (for Duchamp versions <1.5) flagMW/minMW/maxMW parameters.
beamArea float 10.0 The area of the beam in pixels. This parameter is only used when the image does not provide beam information. When this is used, a circular beam is assumed.
beamFWHM float -1.0 The FWHM of the beam in pixels. This parameter is only used when the image does not provide beam information. When this is used, a circular beam is assumed. This value takes precedence over beamArea but is ignored if negative (the default).
spectralUnits string no default The units desired for the spectral axis. If no value is given, the units in the image header are used.
spectralType string no default An alternative WCS type that the spectral axis is to be expressed in. If no value is given, the type held by the image header is used. The specification should conform to the standards described in Greisen et al (2006), although it is possible to provide just the first four letters (the ‘S-type’, e.g. ‘VELO’).
restFrequency float -1.0 If provided, this will be used in preference to the rest frequency given in the image header. If not provided, the image header value will be used if required.

Control switches

The following table lists parameters that control different modes of Selavy. They are not switched on by default.

Parameter Type Default Description
flagATrous bool false Use the à trous wavelet reconstruction algorithm prior to source-finding. See the Preprocessing page for details.
flagSmooth bool false Use spectral or spatial smoothing prior to source-finding. See the Preprocessing page for details.
recon2D1D bool false Use the 2D1D wavelet reconstruction algorithm (provided by WALLABY). See the Preprocessing page for details.
Weights bool false If true, scale the fluxes in the image by the normalised weights, to remove sensitivity varations. See the Thresholds page for details.
VariableThreshold bool false If true, use a sliding box to find the noise local to a pixel and set the (spatially-varying) detection threshold accordingly. See the Thresholds page for details.
optimiseMask bool false Whether to use the mask optimisation algorithm to optimally increase the size of each object. See the Postprocessing page for details.
extractSpectra bool false Extract a spectrum (to a CASA image) for each detected source. See the Extraction page for details.
extractNoiseSpectra bool false Extract a noise spectrum (to a CASA image) for each detected source. See the Extraction page for details.
Fitter.doFit bool false Fit Gaussian components to objects detected in a two-dimensional image. See the Postprocessing page for details.

Distributed processing


The primary innovation in the ASKAPsoft implementation has been to allow distributed processing of images, to test the likely functionality of pipeline processing. The image is split up into subimages according to a user-specified scheme (the user provides the number of subdivisions in the x-, y- and z-directions). Neighbouring subimages can be overlapped by a certain amount (which may be desirable, particularly in the case of variable thresholds - see below).

Processing is performed under a master-worker framework, where a single master process coordinates the processing, and each worker handles a single subimage. Each of these subimages is searched independently, then the worker sends the list of detected sources to the master process. Once the master has accumulated the full set of detected sources, objects near the overlap regions are merged (if necessary) and have their parameters recalculated. The results are then written out.

Distributed processing parameters

Parameter Type Default Description
nsubx int 1 The number of subdivisions in the x-direction when making the subimages.
nsuby int 1 The number of subdivisions in the y-direction when making the subimages.
nsubz int 1 The number of subdivisions in the z-direction when making the subimages.
overlapx int 0 The number of pixels of overlap between neighbouring subimages in the x-direction
overlapy int 0 The number of pixels of overlap between neighbouring subimages in the y-direction
overlapz int 0 The number of pixels of overlap between neighbouring subimages in the z-direction
subimageAnnotationFile string selavy-SubimageLocations.ann The filename of a Karma annotation file that is created to show the boundaries of the subimages (see description below). If empty, no such file is created.

Output files

Standard Duchamp output

Selavy builds on the Duchamp library, and provides the ability to write standard Duchamp output files. Whether these are written is governed by the writeDuchampFiles parameter, which defaults to true. Standard Duchamp provides for flexibility in naming the output files it generates. They are summarised here, listed by the parameter name with the default value in square brackets.:

  • resultsFile [selavy-results.txt] - the list of detected sources and their parameters. Also includes (if flagSeparateHeader=false, the default case) a summary of the input parameters.
  • headerFile [selavy-results.hdr] - if flagSeparateHeader=true, this contains just the input parameter summary from the results file.
  • karmaFile [selavy-results.ann] - a Karma annotation file, showing the location of detected sources. This is produced when flagKarma=true.
  • ds9File [selavy-results.reg] - a DS9 region file, showing the location of detected sources. This is produced when flagDS9=true.
  • casaFile [selavy-results.crf] - a CASA region file, showing the location of detected sources. This is produced when flagCASA=true.
  • logFile [selavy-Logfile.txt / selavy-Logfile-Master.txt / selavy-Logfile-?.txt] - the logfiles, showing lists of intermediate detections (before the final merging), as well as pixel-level details on the final detection list. The first default listed is the default when running serial processing. The other two come from the distributed-processing case. In this case, the parameter’s value has either ‘-Master’ or ‘-?’ (where ? is replaced by the worker number, starting at 0) inserted before the suffix, or at the end if there is no suffix in the name provided. Only the master file (or the sole logfile in the serial case) has the pixel-level details of the final detections. These files will not be produced unless you set flagLog=true.
  • votFile [selavy-results.xml] - a VOTable of the final list of detections. This is produced when flagVOT=true (the default, unlike standard Duchamp).
  • binaryCatalogue [selavy-catalogue.dpc] - a binary format catalogue of detected sources that can be re-used by Selavy or Duchamp.

ASKAP-specific output

The following files are produced as a result of the new features implemented in the ASKAP source finder:

  • subimageAnnotationFile [selavy-SubimageLocations.ann] - a Karma annotation file showing the locations of the subimages used (see “Distributed Processing” section above). Lines are drawn showing the outer borders of each worker’s subimage, and each subimage is labelled with the worker number (starting at 1).

  • CASDA-suitable catalogues - in conjunction with the CASDA project (CSIRO ASKAP Science Data Archive), the following catalogues may be created:

    • continuum islands
    • continuum components (fitted 2D Gaussians)
    • spectral-line (HI) sources

    These are written in both ASCII (.txt) and VOTable (.xml) formats. These take their names from the resultsFile detailed above: replacing the .txt extension with islands.txt, components.txt and hiobjects.txt (so if the resultsFile parameter is selavy-results.txt, the islands catalogue will be selavy-results.islands.txt, the components catalogue will be selavy-results.components.txt and the HI emission catalogue will be selavy-results.hiobjects.txt). The VOTable equivalents will have a .xml extension. An example of the components catalogue can be found at Post-processing of detections, while an example island catalogue is shown below. The HI catalogue is only produced when HiEmissionCatalogue=true.

  • Fitting results - when Gaussian fitting is done for the continuum sources, several files can be written: a catalogue in ASCII & VOTable format (differing from the CASDA-format components catalogue), and annotation files showing the location of fitted components. These will be called selavy-results.fitResults.txt etc. To produce these files, set writeFitResults=true (default is false). See Post-processing of detections for details of the content of these files.

  • Images: when the variable-threshold option is used, the user can opt to write out relevant maps to CASA images. These include the noise map, detection threshold, and signal-to-noise ratio. These are described in more detail in Preprocessing for Selavy. Additionally, when the curvature-map option in the Gaussian fitting is used, the curvature map can be written to a CASA image - consult Post-processing of detections for information. Finally, whenever Gaussian fitting is used, maps of the fitted components and the residuals after subtracting them from the input image are always created.

  • Extracted spectra and images: Extraction of Spectra, Images and Cubelets describes various ways to extract data from the input image relating to individual detections. These can include integrated spectra, moment maps, cutout images or cubelets. All are saved to CASA-format images.

  • There will also be a log file produced by Selavy that contains the stdout logging information - this is described in Logging (note the difference with the Duchamp log file described in the previous section).

The island catalogue will look something like the following:

#         island_id    island_name n_components ra_hms_cont dec_dms_cont ra_deg_cont dec_deg_cont    freq maj_axis min_axis pos_ang flux_int flux_int_err  flux_peak mean_background background_noise max_residual min_residual mean_residual rms_residual stdev_residual x_min x_max y_min y_max    n_pix solid_angle beam_area   x_ave   y_ave   x_cen   y_cen x_peak y_peak flag_i1 flag_i2 flag_i3 flag_i4                                                                                             comment
#                --                                                            [deg]        [deg]   [MHz] [arcsec] [arcsec]   [deg]    [mJy]        [mJy] [mJy/beam]      [mJy/beam]       [mJy/beam]   [mJy/beam]   [mJy/beam]    [mJy/beam]   [mJy/beam]     [mJy/beam]                                    [arcmin2] [arcmin2]
    SB2338_island_1 J221655-452149            1  22:16:55.2    -45:21:49  334.230172   -45.363766  1400.5    26.08    23.66   25.24  391.352        0.000   1726.833          -0.097            2.903       30.722      -30.143        -0.970       13.945         13.911  1451  1457  1719  1724       30        1.20      0.22 1454.40 1721.73 1454.45 1721.85   1454   1722       0       0       0       0
    SB2338_island_2 J221021-454251            1  22:10:21.5    -45:42:51  332.589481   -45.714248  1400.5    43.58    25.00   42.91  246.408        0.000    766.953           0.035            2.263       58.459      -48.519        -2.437       25.201         25.083  1796  1803  1617  1624       40        1.60      0.22 1799.88 1620.38 1800.16 1619.96   1800   1620       0       0       0       0
    SB2338_island_3 J221105-433313            1  22:11:05.4    -43:33:13  332.772397   -43.553859  1400.5    36.35     2.40   89.86  168.103        0.000    880.182          -0.057            1.636        9.359       -9.123        -0.290        4.547          4.538  1758  1764  2266  2270       27        1.08      0.22 1760.85 2268.00 1760.85 2268.01   1761   2268       0       0       0       0
    SB2338_island_4 J222254-452729            1  22:22:54.4    -45:27:29  335.726537   -45.458264  1400.5    44.08    23.17   81.00  123.720        0.000    426.248          -0.022            1.517        8.803      -12.089        -0.366        5.708          5.696  1137  1143  1682  1687       31        1.24      0.22 1140.10 1684.58 1140.40 1684.48   1141   1684       0       0       0       0
    SB2338_island_5 J221416-425710            1  22:14:16.8    -42:57:10  333.569945   -42.952995  1400.5    27.31    16.49   51.64  112.662        0.000    493.966          -0.014            0.901        3.475       -5.042        -0.416        2.138          2.097  1582  1589  2445  2449       31        1.24      0.22 1585.55 2447.06 1585.47 2447.08   1585   2447       0       0       0       0
    SB2338_island_6 J215840-471934            2  21:58:40.7    -47:19:34  329.669444   -47.326161  1400.5    37.88    23.97   86.96   87.930        0.000    329.294          -0.033            1.029        5.870       -3.945        -0.357        2.281          2.253  2390  2400  1123  1128       41        1.64      0.22 2394.37 1125.68 2393.32 1125.52   2393   1126       0       0       0       0
    SB2338_island_7 J221804-461322            1  22:18:04.8    -46:13:22  334.520001   -46.222839  1400.5    52.19    26.56   64.60   81.990        0.000    261.075          -0.042            1.497        8.945       -8.666        -0.878        4.586          4.501  1396  1403  1461  1465       30        1.20      0.22 1399.37 1463.00 1399.43 1462.94   1399   1463       0       0       0       0
    SB2338_island_8 J222720-450513            2  22:27:20.2    -45:05:13  336.834110   -45.087183  1400.5    37.55    28.01   75.69   74.291        0.000    202.028          -0.027            0.947       20.066      -25.765         5.607        9.393          7.535   899   905  1782  1791       48        1.92      0.22  901.83 1785.92  902.04 1785.24    902   1786       0       0       0       0

The columns used are:

  • island_id is the unique identifier for the island. When an SBID is provided, the form is “SB<SBID>_island_<NUM>”, where <NUM> is a unique numerical counter. If no SBID has been provided, the ID string is simply “island_<NUM>”.
  • island_name is the “IAU-format” name taken from the J2000 position of the island’s centroid.
  • n_components indicates how many components were fitted to this island.
  • The position of the island is indicated by both HMS/DMS-formatted strings and decimal degrees for RA and DEC.
  • freq indicates the frequency of the image.
  • Estimates of the size and orientation of the island are provided with maj_axis, min_axis and pos_ang – these are not fitted values, but calculated by the Duchamp code based on detected pixels.
  • The integrated and peak fluxes are given by flux_int (with an error) and flux_peak.
  • The background level and noise in the vicinity of the island are indicated by the mean_background and the background_noise.
  • The effectiveness of the Gaussian fits can be seen by the residual statistics - these are the residuals from subtracting the fitted Gaussians of the island from the image, and the statistics are evaluated using only the pixels within the island.
  • The pixel ranges are shown by x_min, x_max, y_min and y_max, with n_pix giving the total number of detected pixels.
  • The size of the island is also indicated by the solid_angle (in square-arcmin), with the comparable size of the restoring beam in beam_area.
  • Three estimates of the “centre” of the island are shown: x_ave & y_ave give the average pixel in each axis; x_cen & y_cen give the centroid, or flux-weighted-average; and x_peak & y_peak give the location of the peak pixel.
  • There are placeholders for four flags, but these are not yet used.