Cyclic Spectroscopy Observations of a Pulsar#

When to Use This Quick Guide

This quick guide can be used to obtain the cyclic spectrum of known pulsars. Cyclic spectroscopy (CS) can be used to resolve narrow-bandwidth scintles without sacrificing pulse phase resolution. Under certain circumstances it can also be used to measure the impulse response function (IRF) of the interstellar medium and deconvolve it from a pulsar’s intrinsic profile (i.e., to remove scattering). See Demorest [2011] for an introduction to CS, and Walker et al. [2013], Dolch et al. [2021], and Turner et al. [2025] for guidelines on using CS to deconvolve the IRF.

Overview#

First, we will define the configurations used for calibration and pulsar observations, taking advantage of Python syntax to break the configuration parameters into groups that can be combined when a Configure() command is issued. This allows us to reduce redundant parameter specifications and the opportunities for errors.

Next, we provide a complete example of a simple observing script that will perform flux and polarization calibration observations, as well as a pulsar observations.

Example Configurations#

Configuration Keywords Common to All Pulsar Modes#

The following configuration string is common to all pulsar modes.

 1config_common = """
 2obstype     = 'Pulsar'
 3backend     = 'VEGAS'
 4deltafreq   = 0.0
 5swtype      = 'none'
 6swper       = 0.04
 7swfreq      = 0
 8vdef        = 'Radio'
 9vframe      = 'topo'
10vlow        = 0.0
11vhigh       = 0.0
12"""

Receiver-Specific Configuration Keywords#

The following configuration keywords are receiver-specific. In this example, we will use the ultrawideband receiver (UWBR).

1config_UWBR = """
2receiver            = 'Rcvr_2500'
3pol                 = 'Linear'
4nwin                = 3
5restfreq            = 1225.0,2350.0,3475.0
6if0freq             = 6875.0
7bandwidth           = 1500.0
8"""

Note

  • We use three frequency windows (indicated by the three rest frequencies and nwin = 3) to cover the full bandwidth of UWBR.

  • The rest frequencies are chosen such that the frequency windows overlap by 187.5 MHz. This avoids filters near the edge of each frequency window and ensures complete coverage of the full UWBR frequency range.

  • The bandwidth specified here is that of a single frequency window. When accounting for the overlap mentioned above, the total bandwidth is 3375 MHz.

Common VEGAS and Cyclic Spectroscopy Configuration Keywords#

Recall that the CS backend operates in parallel with VEGAS, producing both cyclic spectra and traditional VEGAS data products. The following configuration string specifies keywords are common to both the pulsar fold-mode and calibration scans that we will perform with VEGAS and CS. In this example, we will use the most frequently used parameters for high-precision pulsar timing.

1config_vegas_common = """
2tint                = 16*1024/1500e6
3vegas.numchan       = 1024
4vegas.scale         = 1000
5vegas.outbits       = 8
6vegas.fold_bins     = 2048
7vegas.fold_dumptime = 10.0
8vegas.polnmode      = 'full_stokes'
9"""

Note

  • The number of channels specified here are those of a single frequency window.

  • This configuration will result in frequency channels that are approximately 1.5 MHz wide.

  • The recommended value of vegas.scale depends on the dedispersion mode, bandwidth, and number of channels. See the VPM Observing Reference for recommendations for valid combinations of dedispersion mode / bandwidth / number of channels.

Configuration Keywords Specific to Cyclic Spectroscopy#

These keywords enable and define the setup of the CS backend.

1config_cycspec = """
2vegas.cycspec = 1
3vegas.ncyc = 128
4vegas.cycspec_num_bins = 512
5vegas.cycspec_fold_dumptime = 10.0
6"""

Note

  • We use 128 cyclic channels per VEGAS channel. Given the number of channels used above, the final frequency resolution of the CS data will be approximately 11.44 kHz.

  • See Allowable Observing Parameters for other combinations of vegas.numchan, vegas.ncyc, and vegas.cycspec_num_bins

Keywords Specific to Fold Mode


These keywords define the setup for observing the known pulsar. These keywords will be passed to both VEGAS and the CS backend.

1config_fold = """
2swmode              = 'tp_nocal'
3noisecal            = 'off'
4vegas.obsmode       = 'coherent_fold'
5vegas.fold_parfile  = '/home/gpu/tzpar/B1937+21.par'
6"""

Note

  • vegas.fold_parfile must specify a valid TEMPO1 formatted file specific to your pulsar of interest.

  • See these links for more information about the following parameters: swmode and noisecal.

Keywords Specific to Calibration Scans#

These keywords specify the setup for taking data that can be used for flux and polarization calibration. These keywords will be passed to both VEGAS and the CS backend.

1config_cal = """
2swmode          = 'tp'
3noisecal        = 'lo'
4vegas.obsmode   = 'coherent_cal'
5"""

Note

  • See these links for more information about the following

parameters: swmode and noisecal.

Observing Scripts#

Listing 9 is a complete observing script that will perform a flux and polarization calibration scans, followed by an observation of a single pulsar.

Listing 9 This script will perform flux and polarization calibrations scans followed by a CS and VEGAS pulsar observation.#
  1# Load source catalog
  2# pulsars_all_GBT is a built-in catalog
  3pulsars = Catalog(pulsars_all_GBT)
  4# psrchive_fluxcal contains standard PSRCHIVE flux calibrators
  5fluxcal = Catalog("/users/rlynch/Catalogs/psrchive_fluxcal.cat")
  6
  7# Choose pulse and flux calibration sources; make sure both sources
  8# are above the horizon during your session
  9pulsar_source = "B1937+21"
 10fluxcal_source = "3C295"
 11
 12# Observe the pulsar for 1 hour (3600 seconds)
 13pulsar_scan_length = 3600
 14
 15# Use 95 second scans for calibration observations
 16cal_scan_length = 95
 17
 18
 19# Define config strings
 20config_common = """
 21obstype     = 'Pulsar'
 22backend     = 'VEGAS'
 23deltafreq   = 0.0
 24swtype      = 'none'
 25swper       = 0.04
 26swfreq      = 0
 27vdef        = 'Radio'
 28vframe      = 'topo'
 29vlow        = 0.0
 30vhigh       = 0.0
 31"""
 32
 33config_UWBR = """
 34receiver            = 'Rcvr_2500'
 35pol                 = 'Linear'
 36nwin                = 3
 37restfreq            = 1225.0,2350.0,3475.0
 38if0freq             = 6875.0
 39bandwidth           = 1500.0
 40"""
 41
 42config_vegas_common = """
 43tint                = 16*1024/1500e6
 44vegas.numchan       = 1024
 45vegas.scale         = 1000
 46vegas.outbits       = 8
 47vegas.fold_bins     = 2048
 48vegas.fold_dumptime = 10.0
 49vegas.polnmode      = 'full_stokes'
 50"""
 51
 52config_fold = """
 53swmode              = 'tp_nocal'
 54noisecal            = 'off'
 55vegas.obsmode       = 'coherent_fold'
 56vegas.fold_parfile  = '/home/gpu/tzpar/B1937+21.par'
 57"""
 58
 59config_cal = """
 60swmode          = 'tp'
 61noisecal        = 'lo'
 62vegas.obsmode   = 'coherent_cal'
 63"""
 64
 65config_cycspec = """
 66vegas.cycspec = 1
 67vegas.ncyc = 128
 68vegas.cycspec_num_bins = 512
 69vegas.cycspec_fold_dumptime = 10.0
 70"""
 71
 72ResetConfig()
 73
 74# Pointing/focus corrections using the flux calibration source
 75AutoPeakFocus(source=fluxcal_source)
 76
 77# Move the telescope back to the flux calibration source
 78Slew(source)
 79
 80# Configure for calibration observation
 81Configure(config_common+config_UWBR+config_vegas_common+config_cal+config_cycspec)
 82
 83# Balance the IF system
 84Balance()
 85
 86# Take flux calibration data
 87OnOff(source, Offset("AzEl",1.0,0.0), cal_scan_length)
 88
 89# Move the telescope to the pulsar
 90Slew(pulsar_source)
 91
 92# Configure for the polarization calibration observation
 93Configure(config_common+config_UWBR+config_vegas_common+config_cal+config_cycspec)
 94
 95# Balance the IF system
 96Balance()
 97
 98# Take polarization calibration data
 99Track(pulsar_source, None, cal_scan_length)
100
101# Configure for the pulsar observation
102Configure(config_common+config_UWBR+config_vegas_common+config_fold+config_cycspec)
103
104# Take pulsar data
105Track(source, None, pulsar_scan_length)

Note

  • We use a flux calibration source from the Perley and Butler (2017) catalog. Be sure to select a source that is up during your observation session. You should also select a stable source. Choosing a built-in source from the PSRCHIVE software package will simplify data processing.

  • We do not balance the IF system between the polarization calibration scan and the pulsar scan. This ensures that the instrument response does not change between the two scans.

  • It is highly recommended to perform an AutoPeakFocus() at the beginning of your session - this will ensure the telescope is set up correctly in addition to checking the pointing solution.

Additional Information#

Note

Always start your observing session by taking a short (1–2 minute) scan of a bright, known pulsar. This is especially important for the CS backend since data will only appear after a scan has ended. By taking a short scan on a well-known source, you can check that the system is properly configured using fully processed within the first few minutes of your observing session.

You should use Cyclops to monitor data acquisition and processing during and after your observation. Specifically:

  • Once the CS backend has been configured, check that the observing mode and various parameters are set properly using Cyclops.

  • Once you have started recording data, check the quality of the baseband data using the Cyclops Quality Check pages or that scan.

  • Check in on the processing status of your data using Cyclops after your session has ended, and contact the GBT operator if processing has failed for some reason.

You should also use the VEGAS tools to check input power levels and the health of the VEGAS backend.

Once a scan ends, unmerged data for each bank should start to appear in your project area in /stor/gbtdata, and processing should finish within \(2\times\) the scan duration.