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.scaledepends 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"""
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"""
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.
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.