Pulsar Search Observations#

When to Use This Quick Guide

This quick guide can be used to obtain high time-resolution data when searching for new pulsars, following up on pulsars whose properties are not well known, observing multiple pulsars in the same region of the sky (e.g. globular clusters), or when observing single pulses from pulsars and fast radio bursts (FRBs).

We will use two different configurations, one with coherent dedispersion, and one without coherent dedispersion. Coherent dedispersion should be used any time the dispersion measure (DM) of a source is known, either from previous observations or from a reliable model estimate.

Overview#

This quick guide can be used to obtain high time-resolution data when searching for new pulsars, following up on pulsars whose properties are not well known, observing multiple pulsars in the same region of the sky (e.g. globular clusters), or when observing single pulses from pulsars and fast radio bursts (FRBs).

We will use two different configurations, one with coherent dedispersion, and one without coherent dedispersion. Coherent dedispersion should be used any time the dispersion measure (DM) of a source is known, either from previous observations or from a reliable model estimate.

Example Configurations#

Configuration Keywords Common to Pulsar Search Modes#

The following configuration string is common to both pulsar modes in this tutorial.

# Define config strings
config_common = """
obstype = 'Pulsar'
backend = 'VEGAS'
deltafreq = 0.0
swtype = 'none'
swper = 0.04
swfreq = 0
vdef = 'Radio'
vframe = 'topo'
vlow = 0.0
vhigh = 0.0 
vegas.outbits = 8

Receiver-Specific Configuration Keywords#

The following configuration keywords are receiver-specific. In this example, we will use the L-Band receiver.


config_LBand = """
receiver = 'Rcvr1_2'
pol = 'Linear'
notchfilter = 'In'
nwin = 1
restfreq = 1500.0
dopplertrackfreq = 1500.0
bandwidth = 800.0

Note

  • Not every receiver has a notch filter.

  • The value of nwin must match the number of rest frequencies.

  • You should choose a bandwidth that is well-matched to the frequency range of the receiver you are using.

VEGAS Keywords#

Search Mode With Coherent Dedispersion#

The following configuration string specifies keywords that will configure for a pulsar search observation that uses coherent dedispersion. Because coherent dedispersion completely removes intra-channel dispersive smearing, we usually use wider frequency channels in order to achieve higher time resolution, compared to when we do not use coherent dedispersion.


config_coherent_search = """
swmode = 'tp_nocal' 
noisecal = 'off'
vegas.obsmode = 'coherent_search'
tint = 10.24e-6
vegas.numchan = 512
vegas.scale = 1585
vegas.polnmode = 'full_stokes'
vegas.dm = 100

Note

  • The value of vegas.dm is specific to each source. Here we use a value of 100 but you must change this for each source you are observing.

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

  • The recommended value of tint depends on the frequency resolution (i.e. the bandwidth, \(BW\), and number of channels, \(n_{chan}\)). The formula for calculating the recommended integration time \(t_{int}\) is \(t_{int} = \frac{16 \times n_{chan}}{BW}\).

  • 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.

Search Mode Without Coherent Dedispersion#

The following configuration string specifies keywords that will configure for a pulsar search observation that does not use coherent dedispersion. To minimize intra-channel dispersive smearing, we use narrow channel bandwidths and longer integration times compared to coherent dedispersion.


config_incoherent_search = """
vegas.obsmode = 'search'
tint = 81.92e-6
vegas.numchan = 2048
vegas.scale = 7495
vegas.polnmode = 'total_intensity'

Note

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

  • The recommended value of tint depends on the frequency resolution (i.e. the bandwidth, \(BW\), and number of channels, \(n_{chan}\)). The formula for calculating the recommended integration time \(t_{int}\) is \(t_{int} = a * n_{chan} / BW\), where \(a\) is the accumulation length, which controls the amount of data that is being written out to disk. Here we use a value of \(a=32\). We recommend values of 32 or 64.

  • 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.

Observing Scripts#

Listing 4 is a complete observing script that will perform a coherent search.

Note

  • We perform the test observation with the same configuration as your search observation to ensure everything is working and nothing changes between the two. Data can be folded as soon as the test pulsar is observed using PRESTO.

  • 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.

    Note

    The PF800 and PF342 receivers only require an AutoPeak().

Tips and Tricks#

We strongly recommend that all observers check their test pulsar data when observing in incoherent search mode as soon as the scan is completed. This can be done using PRESTO:

prepfold -psr [pulsar name] <file_name>

Observing Multiple Sources#

Listing 5 will automatically observe multiple sources one after another. We highlight lines of the script that differ from Listing 4.

Listing 5 This script will automatically observe multiple sources one after another.#
 1# Load a source catalog
 2# pulsars_all_GBT is a built-in catalog
 3psr_catalog = Catalog(pulsars_all_GBT)
 4
 5# Specify several sources in a list
 6sources = ['J1713+0747', 'B1937+21', 'B1929+10']
 7DMs = [15.9918, 71.0, 3.18]
 8
 9# Observe each pulsar for 30 minutes
10pulsar_scan_length = 60 * 30
11
12cal_scan_length = 65
13
14
15# Define config strings
16config_common = """
17obstype = 'Pulsar'
18backend = 'VEGAS'
19deltafreq = 0.0
20swtype = 'none'
21swper = 0.04
22swfreq = 0
23vdef = 'Radio'
24vframe = 'topo'
25vlow = 0.0
26vhigh = 0.0 
27vegas.outbits = 8
28"""
29
30config_LBand = """
31receiver = 'Rcvr1_2'
32pol = 'Linear'
33notchfilter = 'In'
34nwin = 1
35restfreq = 1500.0
36dopplertrackfreq = 1500.0
37bandwidth = 800.0
38"""
39
40# Note the use of string substitution to dynamically specify the DM
41# for each source
42config_coherent_search = """
43swmode = 'tp_nocal' 
44noisecal = 'off'
45vegas.obsmode = 'coherent_search'
46tint = 10.24e-6
47vegas.numchan = 512
48vegas.scale = 1585
49vegas.polnmode = 'full_stokes'
50vegas.dm = %f
51"""
52
53config_coherent_cal = """
54swmode = 'tp' 
55noisecal = 'lo' 
56vegas.obsmode = 'coherent_cal'
57tint = 10.24e-6
58vegas.numchan = 512
59vegas.scale = 1585
60vegas.fold_bins = 2048
61vegas.fold_dumptime = 10.0
62"""
63
64ResetConfig()
65
66# Pointing/focus corrections using a source close to the first pulsar
67AutoPeakFocus(location = sources[0])
68
69# Loop over all sources defined above
70for source,DM in zip(sources,DMs):
71      Slew(source)
72
73      # Configure for calibration observation
74      Configure(config_common + config_LBand + config_coherent_cal)
75      # Balance the IF system
76      Balance()
77      Balance()
78      # Take calibration data
79      Track(source, None, cal_scan_length)
80
81      # Configure for pulsar observation
82      Configure(config_common + config_LBand + config_coherent_search%DM)
83      # Take pulsar data
84      Track(source, None, pulsar_scan_length)

Advanced Use of Catalogs#

Here we demonstrate an advanced use of catalogs in which we specify the DM for each source and access this in the script.

First, we define an example catalog:

Listing 6 A custom catalog#
format = spherical
coordmode = J2000
head = name 	ra                  	dec                 	dm
J1713+0747  	17:13:49.5335615    	+07:47:37.482501    	15.9918
B1937+21    	19:39:38.561224     	+21:34:59.12570     	71.0
B1929+10    	19:32:13.9497       	+10:59:32.420       	3.18

Now we define the observing script. The dm column from our catalog is read in for each source and substituted into the configuration string. The sources will be observed in the order they appear in the catalog. We highlight the relevant lines for advanced use of the catalog.

Listing 7 This script uses catalog information in the congfiguration#
 1# Load a source catalog; update this to point to your catalog
 2catalog = Catalog('valid/path/to/catalog.cat') 
 3
 4# Define config strings
 5config_common = """
 6obstype = 'Pulsar'
 7backend = 'VEGAS'
 8deltafreq = 0.0
 9swtype = 'none'
10swper = 0.04
11swfreq = 0
12vdef = 'Radio'
13vframe = 'topo'
14vlow = 0.0
15vhigh = 0.0 
16vegas.outbits = 8
17"""
18
19config_LBand = """
20receiver = 'Rcvr1_2'
21pol = 'Linear'
22notchfilter = 'In'
23nwin = 1
24restfreq = 1500.0
25dopplertrackfreq = 1500.0
26bandwidth = 800.0
27"""
28
29config_coherent_search = """
30swmode = 'tp_nocal' 
31noisecal = 'off'
32vegas.obsmode = 'coherent_search'
33tint = 10.24e-6
34vegas.numchan = 512
35vegas.scale = 1585
36vegas.polnmode = 'full_stokes'
37vegas.dm = %f
38"""
39
40config_coherent_cal = """
41swmode = 'tp' 
42noisecal = 'lo' 
43vegas.obsmode = 'coherent_cal'
44tint = 10.24e-6
45vegas.numchan = 512
46vegas.scale = 1585
47vegas.fold_bins = 2048
48vegas.fold_dumptime = 10.0
49"""
50
51
52ResetConfig()
53
54for i, source in enumerate(catalog.keys()):
55      # Only perform AutoPeakFocus() for first source
56      if i == 0:
57            AutoPeakFocus(location=source)
58      Slew(source)
59
60      # Configure for calibration observation
61      Configure(config_common + config_LBand + config_coherent_cal)
62      # Balance the IF system
63      Balance()
64      Balance()
65      # Take calibration data
66      Track(source, None, cal_scan_length)
67
68      # Configure for pulsar observation
69      DM = float(catalog[source]['dm'])
70      Configure(config_common + config_LBand + config_coherent_search%DM)
71      # Take pulsar data
72      Track(source, None, pulsar_scan_length)

Multiple Bank Configuration#

For some receivers a wider bandwidth is available, these receivers allow for observations with a bandwidth greater than 1250 MHz. The following example outlines a C-Band configuration that covers the full bandwidth available from this receiver.

Listing 8 A multi-bank incoherent dedispersion configuration#
# Load a source catalog
# pulsars_all_GBT is a built-in catalog
psr_catalog = Catalog(pulsars_all_GBT)
# Load in your catalog of globular clusters; update this to point to
# your catalog
gc_catalog = Catalog('valid/path/to/my_gc_catalog.cat')

# Test scan source
test_source = 'B1933+16'
# Target of interest
source = 'GlobClusterX'

# Search for pulsars for 30 minutes or until a UTC stop time
use_stop_time = True
pulsar_scan_length = 60 * 30
stop_time = '21:00:00'

cal_scan_length = 65


# Define config strings
config_common = """
obstype = 'Pulsar'
backend = 'VEGAS'
deltafreq = 0.0
swtype = 'none'
swper = 0.04
swfreq = 0
vdef = 'Radio'
vframe = 'topo'
vlow = 0.0
vhigh = 0.0 
vegas.outbits = 8
"""

config_CBand = """
receiver = 'Rcvr4_6'
pol = 'Linear'
restfreq = 7687.5, 6562.5, 5437.5, 4312.5
dopplertrackfreq = 6000.0
bandwidth = 1500.0
"""

config_incoherent_search = """
vegas.obsmode = 'search'
swmode = 'tp_nocal' 
noisecal = 'off'
tint = 40.96e-6
vegas.numchan = 2048
vegas.scale = 13035
vegas.polnmode = 'total_intensity'
"""

config_incoherent_cal = """
vegas.obsmode = 'cal'
swmode = 'tp' 
noisecal = 'lo'
tint = 40.96e-6
vegas.numchan = 2048
vegas.scale = 13035
vegas.polnmode = 'total_intensity'
"""

ResetConfig()

# Pointing/focus corrections using a source close to the pulsar
AutoPeakFocus(location = test_source)


# Slew to the test source
Slew(test_source)
# Configure for a calibration scan
Configure(config_common + config_CBand + config_incoherent_cal)
# Balance the IF system
Balance()
Balance()
# Take a calibration scan
Track(test_source, None, cal_scan_length)

# Configure for a search-mode scan
Configure(config_common + config_CBand + config_incoherent_search)
# Take test data
Track(test_source, None, cal_scan_length)


# Slew to the pulsar source
Slew(source)
# Configure for a calibration scan
Configure(config_common + config_CBand + config_incoherent_cal)
# Balance the IF system
Balance()
Balance()
# Take a calibration scan
Track(source, None, cal_scan_length)

# Configure for a search-mode scan
Configure(config_common + config_CBand + config_incoherent_search)
# Take pulsar search data
if use_stop_time:
      Track(source, None, stopTime=stop_time)
else:
      Track(source, None, pulsar_scan_length)