next up previous contents index
Next: Flux Calibration Up: Recipes Previous: gmake/gfiddle

Bandpass calibration

The script below, bandcal.csh, is a working example how Jin Koda's M51 data can be passband calibrated. Courtesy Stuart Vogel.


   1 #! /bin/csh -f
   2 # 
   3 # 1. Uses noise source for narrow-band channel to channel bandpass calibration
   4 #    Conjugate LSB for USB
   5 # 2. Uses astronomical source for wideband and low-order polynomical narrow-
   6 #    band passband calibration
   7 # 3. Uses hybrid mode data for band-offset phase calibration
   8 # 4. Generates temporal phase calibration from phase calibrator using
   9 #    super-wideband (average of all three bands from both sidebands)
  10 # 5. Applies calibrations to each of the source data bands
  11 # 6. Glues source bands back together
  12 # 7. Flags bad channels in overlap region between bands.
  13 
  14 # Assumes that a relatively bright quasar has been observed in the following
  15 # modes:
  16 # 1. 500/500/500
  17 # 2. nb / nb/ nb   nb=narrowband
  18 # 3. With 2 bands in narrowband and the other in 500.  aka "hybrid" mode
  19 #     Note - easy mod to script to use 1 band in nb, others in hybrid.
  20 #
  21 # SNV 2/18/2007
  22 
  23 # Assumes data properly flagged so that self cal solutions are good!!
  24 # Make sure refant is a good choice!
  25 
  26 # To-do list:
  27 # 1. this script assumes just one visibility calibrator
  28 
  29 # User parameters
  30 
  31 set vis = c0064.jk_m51co_c.4.miriad  # visibility file
  32 set refant=9                         # reference antenna
  33 set cal = 3C279                      # passband calibrator
  34 set viscal = 1153+495                # visibility calibrator
  35 set source = M51MOS                  # source
  36 set nb_array = ( 4 5 6 )             # spectral line bands to calibrate
  37 set wide_array = ( 5 6 5  )          # hybrid band with wide setup
  38 				     # For each element in nb_array, the
  39 				     # corresponding element in wide_array
  40                                      # should be the hybrid band that is wideband
  41 set superwidewin = "2,3,5,6"         # windows to use for super-wideband
  42 set superwidechan = "1,1,60"         # Channels for superwide
  43 set bw = 64                          # Spectral Line bandwidth
  44 set wideline = "1,3,11,11"           # line type for 500 MHz
  45 set narrowline = "1,3,58,58"         # line type for narrow band
  46 set sideband = "usb"                 # Sideband (used for noise conjugation)
  47 set calint = 0.2                     # passband calibration interval (minutes)
  48 set vcalint = 42                     # visibility calibrator cal interval
  49 set order = 1                        # polynomial order for smamfcal fit
  50 set edge = 3                         # # of edge channels to discard in smamfcal
  51 set badants = "2,3,5"                    # bad antennas to flag
  52                                      # Do heavy uvflagging prior to script
  53 set badchan1 = "6,61,1,1"            # bad overlap channels between 1st 2 bands
  54 set badchan2 = "6,124,1,1"           # bad overlap channels between 2nd 2 bands
  55 set restfreq = 115.271203            # rest frequency of line
  56 
  57 # End user parameters
  58 
  59 uvflag vis=$vis select=anten'('$badants')' flagval=flag
  60 
  61 rm -rf all.wide all.nb  
  62 rm -rf $cal.wide* $cal.nb* $cal.hyb* 
  63 
  64 # Select all-wideband and all-narrowband data
  65 bwsel vis=$vis bw=500,500,500 nspect=6 out=all.wide 
  66 bwsel vis=$vis bw=$bw,$bw,$bw nspect=6 out=all.nb
  67 
  68 # First get super-wideband on passband calibrator and phase calibrator
  69 rm -r $cal.wide $cal.wide.0 $viscal.v.wide $viscal.v.wide.0
  70 uvcat vis=all.wide out=$cal.wide.0 \
  71         "select=-auto,source($cal)" options=nocal,nopass
  72 uvcat vis=all.wide out=$viscal.v.wide.0 \
  73         "select=-auto,source($viscal)" options=nocal,nopass
  74 
  75 # mfcal passband on superwideband 
  76 # Don't bother using noise source for superwideband
  77 mfcal vis=$cal.wide.0 interval=$calint refant=$refant
  78 echo "**** Plot super-wideband passband on $cal.wide.0 "
  79 gpplt vis=$cal.wide.0 options=bandpass yaxis=phase nxy=4,4 yrange=-360,360 device=bp$cal.wide.0.ps/ps
  80 gv bp$cal.wide.0.ps
  81 
  82 # Inspect temporal phase variation on superwideband
  83 echo "**** Check temporal phase variations on superwideband $cal.wide.0 "
  84 gpplt vis=$cal.wide.0 yaxis=phase yrange=-360,360 nxy=4,4 device=p$cal.wide.0.ps/ps
  85 gv p$cal.wide.0.ps
  86 
  87 # Apply superwideband passband for later use in band offset cal
  88 uvcat vis=$cal.wide.0 out=$cal.wide options=nocal
  89 
  90 # Copy wideband passband to visibility calibrator
  91 gpcopy vis=$cal.wide.0 out=$viscal.v.wide.0 options=nocal,nopol
  92 uvcat vis=$viscal.v.wide.0 out=$viscal.v.wide options=nocal
  93 
  94 # Determine phase gain variations on visibility calibrator using superwide
  95 rm -r $viscal.v.wide.sw
  96 uvcat vis=$viscal.v.wide out=$viscal.v.wide.sw select='win('$superwidewin')' 
  97 selfcal vis=$viscal.v.wide.sw line=channel,$superwidechan \
  98      interval=$vcalint options=phase refant=$refant
  99 echo "**** Phases on the superwideband visibility calibrator $viscal.v.wide.sw"
 100 gpplt vis=$viscal.v.wide.sw device=p$viscal.v.wide.sw.ps/ps yaxis=phase yrange=-360,360 nxy=4,4 
 101 gv p$viscal.v.wide.sw.ps
 102 
 103 # LOOP OVER EACH NARROW BAND
 104 
 105 set nblength = $#nb_array
 106 if $nblength == 1 set list = 1
 107 if $nblength == 2 set list = ( 1 2 )
 108 if $nblength == 3 set list = ( 1 2 3 )
 109 
 110 foreach i  ( $list )
 111 
 112 set nb = $nb_array[$i]
 113 set wide = $wide_array[$i]
 114 rm -r all.hyb
 115 
 116 # Select hybrid data 
 117 # NB:  assumes only 1 band is in wideband mode; if two bands are in wideband
 118 #      mode, change hybrid selection to select on nb and modify bw=
 119 if ( $wide == 1 || $wide == 4 ) then 
 120     if ($nb == 2 || $nb == 5) then
 121       bwsel vis=$vis nspect=6 bw=500,$bw,0 out=all.hyb
 122     else
 123       bwsel vis=$vis nspect=6 bw=500,0,$bw out=all.hyb      
 124     endif
 125     endif
 126 if ( $wide == 2 || $wide == 5 ) then
 127     if ($nb == 1 || $nb == 4) then
 128       bwsel vis=$vis nspect=6 bw=$bw,500,0 out=all.hyb
 129     else
 130       bwsel vis=$vis nspect=6 bw=0,500,$bw out=all.hyb      
 131     endif
 132     endif    
 133 if ( $wide == 3 || $wide == 6 ) then
 134     if ($nb == 1 || $nb == 4) then
 135       bwsel vis=$vis nspect=6 bw=$bw,0,500 out=all.hyb
 136     else
 137       bwsel vis=$vis nspect=6 bw=0,$bw,500 out=all.hyb      
 138     endif    
 139     endif
 140 set test = `uvio vis=all.hyb | grep -i source | awk '{if (NR==1) print $4}'`
 141 if ($test == "") then
 142   echo
 143   echo "FATAL!  There appears to be no valid data in all.hyb"
 144   echo "This is likely to be because wide_array[$i] = $wide is not valid"
 145   echo "(i.e. band $wide is not really wideband), or one of the other "
 146   echo "bands is not really narrowband.  Use uvindex to sort this out"
 147   exit
 148 endif
 149 
 150 echo "**** Be sure that bands are found by inspecting uvlist output!"
 151 echo "**** If no frequency info is found, that bwsel parameters are wrong"
 152 uvlist vis=all.hyb options=spectra
 153 
 154 # Now we need to select single bands to process in this pass
 155 # Select by source and band
 156 # First get the two bands in all-wideband mode
 157 # Note that we use super-wideband calibrated file for the wide mode
 158 rm -rf $cal.win$nb* $cal.win$wide* $cal.wide.win$wide* $cal.wide.win$nb*
 159 rm -rf $cal.hyb.win$nb* $cal.hyb.win$wide* noise.nb.win$nb*
 160 uvcat vis=$cal.wide out=$cal.wide.win$wide "select=-auto,source($cal),win($wide)" \
 161 	options=nocal,nopass
 162 uvcat vis=$cal.wide out=$cal.wide.win$nb "select=-auto,source($cal),win($nb)" \
 163 	options=nocal,nopass
 164 
 165 # Now select hybrid wideband band
 166 uvcat vis=all.hyb out=$cal.hyb.win$wide.0 "select=-auto,source($cal),win($wide)" \
 167 	options=nocal,nopass
 168 # Now select the hybrid and all-narrowband narrow bands
 169 # nb bands require extra step (applying noise source)
 170 # we did not bother with noise source for wideband
 171 uvcat vis=all.hyb out=$cal.hyb.win$nb.00 "select=-auto,source($cal),win($nb)" \
 172 	options=nocal,nopass
 173 uvcat vis=all.nb out=$cal.nb.win$nb.00 "select=-auto,source($cal),win($nb)" \
 174 	options=nocal,nopass  
 175 
 176 # copy wideband passband determined from all-wideband mode to hybrid wideband
 177 gpcopy vis=$cal.wide.0   out=$cal.hyb.win$wide.0 options=nocal,nopol
 178 uvcat vis=$cal.hyb.win$wide.0  out=$cal.hyb.win$wide   options=nocal
 179 
 180 # get the noise source data.  Use the noise source data obtained in all
 181 # narrowband mode, and assume it also can be applied to hybrid narrowband
 182 
 183 if ($sideband == "USB" || $sideband == "usb" ) then
 184   echo " **** PROCESSING USB"
 185   rm -r noise.lsb noise.usb
 186   @ lsbnb = $nb - 3
 187   uvcat vis=all.nb out=noise.lsb "select=-auto,source(NOISE),win($lsbnb)" \
 188         options=nocal,nopass
 189   uvcat vis=all.nb out=noise.usb "select=-auto,source(NOISE),win($nb)" \
 190         options=nocal,nopass
 191   set sdf = `uvio vis=noise.usb | grep sdf | grep DATA | awk '{print $5}'`
 192   set sfreq = `uvio vis=noise.usb | grep sfreq | grep DATA | awk '{if (NR==1) print $5}'`
 193   uvcal vis=noise.lsb out=noise.nb.win$nb.00 options=conjugate
 194   puthd in=noise.nb.win$nb.00/sfreq value=$sfreq type=d
 195   puthd in=noise.nb.win$nb.00/sdf value=$sdf type=d
 196 else
 197   uvcat vis=all.nb out=noise.nb.win$nb.00 "select=-auto,source(NOISE),win($nb)" \
 198         options=nocal,nopass
 199 endif
 200 
 201 # For narrowband windows, first do a passband cal using noise source
 202 mfcal vis=noise.nb.win$nb.00 refant=$refant
 203 echo "**** Passband cal using noise source"
 204 gpplt vis=noise.nb.win$nb.00 device=bpnoise.nb.win$nb.00.ps/ps options=bandpass yaxis=phase nxy=4,4 \
 205         yrange=-90,90
 206 gv bpnoise.nb.win$nb.00.ps
 207 
 208 # Copy noise passband to astronomical all-narrowband and hybrid narrowbands, 
 209 # and apply
 210 gpcopy vis=noise.nb.win$nb.00 out=$cal.nb.win$nb.00 options=nocal,nopol
 211 gpcopy vis=noise.nb.win$nb.00 out=$cal.hyb.win$nb.00 options=nocal,nopol
 212 uvcat vis=$cal.nb.win$nb.00 out=$cal.nb.win$nb.0 options=nocal
 213 uvcat vis=$cal.hyb.win$nb.00 out=$cal.hyb.win$nb.0 options=nocal
 214 
 215 # use smamfcal with 1st order polynomial to
 216 # get passband on hybrid narrowband and copy to all narrowband
 217 smamfcal vis=$cal.hyb.win$nb.0 interval=$calint refant=$refant edge=$edge options=opolyfit \
 218           polyfit=$order
 219 echo "**** Hybrid narrowband passband on $cal.hyb.win$nb.0 "
 220 gpplt vis=$cal.hyb.win$nb.0 options=bandpass yaxis=phase nxy=4,4 yrange=-90,90 \
 221     device=bp$cal.hyb.win$nb.0.ps/ps
 222 gv bp$cal.hyb.win$nb.0.ps
 223 
 224 # Copy narrowband passband from hybrid to all-narrowband mode
 225 gpcopy vis=$cal.hyb.win$nb.0    out=$cal.nb.win$nb.0 options=nocal,nopol
 226 
 227 #Check that all-narrowband passband is flat
 228 rm -r test.pass
 229 uvcat vis=$cal.nb.win$nb.0 out=test.pass
 230 mfcal vis=test.pass refant=$refant
 231 echo "**** Narrowband passband (should be flat!)  on $cal.hyb.win$nb.0 "
 232 gpplt vis=test.pass options=bandpass yaxis=phase nxy=4,4 yrange=-90,90 \
 233       device=bptest.ps/ps
 234 gv bptest.ps
 235 
 236 # Apply astronomical narrowband passband to hybrid and all-narrowband
 237 uvcat vis=$cal.hyb.win$nb.0    out=$cal.hyb.win$nb     options=nocal
 238 uvcat vis=$cal.nb.win$nb.0    out=$cal.nb.win$nb     options=nocal
 239 
 240 # Selfcal on hybrid wideband to remove temporal variations 
 241 # prior to band offset calibration
 242 selfcal vis=$cal.hyb.win$wide line=channel,$wideline \
 243      interval=$calint options=phase refant=$refant
 244 
 245 # Copy selfcal solution over to narrow hybrid band and apply
 246 copyhd in=$cal.hyb.win$wide out=$cal.hyb.win$nb items=gains,ngains,nsols,interval
 247 uvcat vis=$cal.hyb.win$nb out=$cal.hyb.win$nb.a
 248 
 249 # Selfcal on narrow band of hybrid to determine band offset
 250 selfcal vis=$cal.hyb.win$nb.a line=channel,$narrowline \
 251     interval=9999 options=phase refant=$refant
 252 echo "**** Band offset between hybrid-narrowband $cal.hyb.win$nb.a"
 253 echo "****  and hybrid-wideband $cal.hyb.win$nb"
 254 gplist vis=$cal.hyb.win$nb.a options=phase
 255 # Also copy band offset to text file
 256 gplist vis=$cal.hyb.win$nb.a options=phase >! mnband_offset.$cal.hybwin$nb.txt
 257 
 258 # Test by applying to calibrator observed in all-narrowband mode
 259 copyhd in=$cal.hyb.win$nb.a out=$cal.nb.win$nb items=gains,ngains,nsols,interval
 260 uvcat vis=$cal.nb.win$nb out=$cal.nb.win$nb.a
 261 
 262 # Remove antenna phase gain using super-wideband
 263 rm -r $cal.wide.sw
 264 uvcat vis=$cal.wide out=$cal.wide.sw select='win('$superwidewin')'
 265 selfcal vis=$cal.wide.sw line=channel,$superwidechan \
 266     interval=9999 options=phase refant=$refant
 267 # Copy super-wideband gain to narrowband and apply
 268 copyhd in=$cal.wide.sw out=$cal.nb.win$nb.a items=gains,ngains,nsols,interval
 269 uvcat vis=$cal.nb.win$nb.a out=$cal.nb.win$nb.a.sc
 270 
 271 # Selfcal to check that phases are roughly zero
 272 # to within amount expected given temporal variations over interval
 273 # between superwideband and all-narrowband observerations
 274 selfcal vis=$cal.nb.win$nb.a.sc line=channel,$narrowline \
 275      interval=9999 options=phase refant=$refant
 276 
 277 # List gains, which should be near zero except for temporal variations
 278 # over interval between wideband and narrow band observations of cal
 279 echo "**** Phase offset between super-wideband $cal.wide.sw "
 280 echo "**** and all-narrow narrow band $cal.nb.win$nb.a.sc "
 281 echo "**** Check that phases are near zero, limited by atmospheric flucatuations"
 282 gplist  vis=$cal.nb.win$nb.a.sc options=phase 
 283 
 284 # Now apply calibrations to source data
 285 rm -r  $source.win$nb* $source.win$nb.bcal
 286 # First select source data
 287 uvcat vis=all.nb out=$source.win$nb.00 \
 288    "select=-auto,source($source),win($nb)"  options=nocal,nopass
 289 # Copy and apply noise passband to source
 290 gpcopy vis=noise.nb.win$nb.00 out=$source.win$nb.00 options=nocal,nopol
 291 uvcat vis=$source.win$nb.00 out=$source.win$nb.0 options=nocal
 292 # Copy and apply astronomical passband
 293 gpcopy vis=$cal.hyb.win$nb.0 out=$source.win$nb.0 options=nocal,nopol
 294 uvcat vis=$source.win$nb.0 out=$source.win$nb options=nocal
 295 # Copy band offset to source
 296 copyhd in=$cal.hyb.win$nb.a out=$source.win$nb items=gains,ngains,nsols,interval
 297 rm -r $source.win_$i
 298 # Apply band offset using smachunkglue naming convention
 299 uvcat vis=$source.win$nb out=$source.win_$i
 300 
 301 # end nb loop
 302 end
 303 
 304 # glue together 3 bands
 305 set nblength = $#nb_array
 306 
 307 
 308 if ($nblength == 2) then
 309   set cfile=$source.$nb_array[1]$nb_array[2]
 310   rm -r $cfile
 311   smachunkglue vis=$source.win nfiles=$nblength out=$cfile
 312   uvflag vis=$cfile line=channel,$badchan1 flagval=flag
 313 else if ($nblength == 3) then
 314   set cfile=$source.$nb_array[1]$nb_array[2]$nb_array[3]
 315   rm -r $cfile
 316   smachunkglue vis=$source.win nfiles=$nblength out=$cfile
 317   # flag bad overlap channels
 318   uvflag vis=$cfile line=channel,$badchan1 flagval=flag
 319   uvflag vis=$cfile line=channel,$badchan2 flagval=flag
 320 else
 321   set cfile=$source.$nb_array[1]
 322   rm -r $cfile  
 323   uvcat vis=$source.win out=$cfile
 324 endif
 325 
 326 # put in restfreq
 327 puthd in=$cfile/restfreq type=double value=$restfreq
 328 
 329 # copy super-wideband gains to source
 330 copyhd in=$viscal.v.wide.sw out=$cfile items=gains,ngains,nsols,interval
 331 
 332 echo "Calibrated source file: $cfile"



Peter
2009-10-05