#/==================================================================== #/== gbtsetup : command-line function to set up the whole system. #/==================================================================== #/== Usage: #/== gbtsetup( , , , , #/== , , , #/== , ) #/== #/== : Rcvr_342, Rcvr_450, Rcvr_600, Rcvr_800, #/== Rcvr1_2, Rcvr2_3, Rcvr4_6, Rcvr8_10, #/== Rcvr12_18, Rcvr18_22, Rcvr22_26, Rcvr40_52, Holography #/== For those receivers whose native polarization mode is #/== linear (PF, 1_2, 2_3, 4_6), the circular polarization #/== mode is selected by appending ':c' or ':circ' to the #/== receiver name. #/== #/== : frequency (in GHz) to be tracked by LO1. #/== #/== : dcr, sp, acs, spect, vlbi, radar, bcpm #/== #/== : the bandwidth in MHz per backend channel. #/== #/== : a glish record specifying the switching: #/== [ , , [freq1, freq2] ] #/== sw=[mode='tp', swper=1, df=[0.0, 0.0], cal='lo' ] #/== #/== : a glish record specifying the IF streams. #/== [ nif=#IFs, nb=#beams, pol='X:Y', #/== f=[ Freq1, Freq2, ... ], df=[ DF1, DF2, ...] ] #/== (all freqs in MHz) #/== #/== : a glish record specifying velocity tracking info: #/== vel=[ , , , tolerance ] #/== #/== : this glish record depends on the backend. #/== #/== : this is a list of the fiber paths to be avoided: #/== For example: [2, 7] #/== #/==================================================================== # convert bandwidth to band number for prime focus getpffilter := function(bw) { bb := '20M' nbw := as_integer(bw) if( nbw>81) bb := '240M' else if( nbw>40) bb := '80M' else if( nbw>20) bb := '40M' return bb; } # convert center freq and bandwidth to band number for Lband getlband := function(freq, bw) { bbw := as_integer(bw) ffr := as_integer(freq) bb1 := ffr - (bbw/2) bb2 := ffr + (bbw/2) print "getlband", bb1, bb2 if( bb1 < 1300) { if(bb2 > 1451) bnd := 1 # 1: 1100-1800 else bnd := 4 # 4: 1100-1450 } else if (bb1 < 1450) { if(bb2>1451) bnd := 1 # 1: 1100=1800 else bnd := 3 # 3: 1300-1450 } else if(bb1<1600) bnd := 1 else if( bb2>1750) bnd := 1 else bnd := 2 # 2: 1600-1750 return bnd; } # convert center freq and bandwidth to band number for Sband getsband := function(freq,bw) { bbw := as_integer(bw) ffr := as_integer(freq) bb1 := ffr - (bbw/2) bb2 := ffr + (bbw/2) bnd := 1 # 1: 1680-2650 MHz if((bb1>=2100)&&(bb2<=2400)) bnd := 2 # 2: 2100-2400 return bnd; } # convert center freq and bandwidth to band number for Cband getcband := function(freq,bw) { bbw := as_integer(bw) ffr := as_integer(freq) bb1 := ffr - (bbw/2) bb2 := ffr + (bbw/2) if((bb1>=4550)&&(bb2<=5250)) bnd := 2 # 4.55-5.25 else if((bb1>=5150)&&(bb2<=5850)) bnd := 3 # 5.15-5.85 else if((bb1>=3950)&&(bb2<=4650)) bnd := 1 # 3.95-4.65 else bnd := 4 # 3.90-5.90 return bnd; } #============================================================== # -------- master setup routine. ------------------------------ gbtsetup := function(rcvr0='Rcvr1_2', rfreq=1.4204, back='acs', bw=50.0, sw=[mode='tp', swper=1, df=[0.0, 0.0], cal='lo' ], frqtab=[nif=1, nb=1, pol='X:Y', f=[0.0, 0.0, 0.0, 0.0], df=[0,0,0,0] ], vel=[v=0.0, frame='bary', vdef='radio', tol=50], back_par=F, bad_fibers=[0,0,0,0], test=F ) #============================================================== { # parse receiver name to extract the pol code. polmode := 'lin' rr := split( rcvr0, ':') rcvr := rr[1] if(len(rr)>1) { ssrr := split( rcvr0[2], ''); if(ssrr[1]!='l') polmode := 'circ' } print "gbtsetup starts", rcvr, polmode, back, rfreq, bw, sw, ifs, vel, back_par, bad_fibers # Start by setting up the scan coordinator #---------------------------------------- #/== : dcr, sp, acs, spect, vlbi, radar, bcpm devs := ['ant', 'lo1', 'ifr', 'cnv', 'ifman', 'meas', 'dcr' ] ); # note: the names of the switching signal masters must be exactly # what the Scan Coordinator uses: these names just passed thru # by sc_setup() # if( (back == 'dcr' )||(back=='DCR')) { swmaster := 'DCR'; } else if( back == 'sp' ) { swmaster := 'SpectralProcessor' devs[len(devs)+1] := 'sp' } else if( (back == 'acs' )||(back=='spect')) { swmaster := 'Spectrometer' devs[len(devs)+1] := 'spect' } else if( back == 'vlbi' ) { swmaster := 'VLBA_DAR' devs[len(devs)+1] := 'vlbi' } else if( back == 'radar' ) { swmaster := 'DCR' devs[len(devs)+1] := 'radar' } else if( back == 'bcpm' ) { swmaster := 'DCR' devs[len(devs)+1] := 'bcpm' } else print "GBTsetup: Sorry, I do not understand backend: ", back; # add active surface for higher freq receivers if((rcvr=='Rcvr8_10')||(rcvr=='Rcvr12_18')||(rcvr=='Rcvr18_26') ||(rcvr=='Rcvr18_22')||(rcvr=='Rcvr22_26')||(rcvr=='Rcvr40_52)) devs[ len(devs)+1 ] := 'surf' # select appropriate blanking time for switch mode. if((sw.mode == 'tp') || (sw.mode == 'tp_nocal') || (sw.mode == 'bsw' )) sblank := 0.002; else sblank := 0.03; print "Setting up SC:", sw.mode, sw.per, sblank,swmaster, rcvr print "SC devs=", devs # we have all the info; go ahead and configure the SC. # include '/users/gbtops/include/gfuncs/SCsetup.g' # sc_setup( 'null', sw.mode, sw.swper, sblank, swmaster, rcvr, devs) # check the bad fiber array fb := [ 1,2,3,4,5,6,7,8 ] if(len(bad_fibers)>0) { for(ifib in 1:len(bad_fibers)) { if(bad_fibers[ifib]>0) { ifbb := bad_fibers[ifib] if(ifbb%2==0) fb[ifbb] -:= 1 else fb[ifbb] +:= 1 } } } #----------------------------------------------------------------- # Use the frqtab to find tuning freq and total front-end bandwidth #----------------------------------------------------------------- wdata := freqcalc( rfreq, bw, frqtab, vel ) ffreq := wdata.tuningfreq; tbw := wdata.totalbw; nbw := as_integer(tbw) #----------------------------------------------------------------- # now set up prime focus recievers primef := F; if(rcvr=='Rcvr_342') # 340 MHz { feed := 'f340' primef := T; afbank := 'B' dcrchan := [fb[5],fb[7]]; } else if(rcvr=='Rcvr_450') # 450 MHz { feed := 'f450' primef := T; afbank := 'B' dcrchan := [fb[5],fb[7]]; } else if(rcvr=='Rcvr_600') # 600 MHz { feed := 'f600' primef := T; afbank := 'A' dcrchan := [fb[1],fb[3]]; } else if(rcvr=='Rcvr_800') # 800 MHz { feed := 'f800' primef := T; afbank := 'A' dcrchan := [fb[1],fb[3]]; } # set transfer switch mode for 2-beam receivers. if((mode == 'bsw')||(mode=='bsw_nocal')) xxfer := 'ext' else xxfer := 'off' #----------------------------------------------------- if( primef==T) { # include '/users/gbtops/include/gfuncs/RCVPF_1setup.g' bbw := getpffilter(tbw); print "rcvrpf1_setup(", ffreq, feed, bbw, polmode, sw.cal, ")" # rcvrpf1_setup(ffreq, feed, bbw, polmode, sw.cal); iffiltr := 'all' } #----------------------------------------------------- else if(rcvr=='Rcvr1_2') # 1_2 GHz { # include '/users/gbtops/include/gfuncs/RCV1_2setup.g' lband := getlband(ffreq, tbw); if(nbw <= 20) iffiltr := '3/20' else if(nbw <= 80) iffiltr := '3/80' else if(nbw <= 320) iffiltr := '3/320' else iffiltr := '3/1280' afbank := 'A' dcrchan := [fb[1],fb[3]]; print "rcvr1_2_setup(", ffreq, lband, polmode, sw.cal, ")" # rcvr1_2_setup( ffreq, lband, polmode, sw.cal) } #----------------------------------------------------- else if(rcvr=='Rcvr2_3') # 2_3 GHz { # include '/users/gbtops/include/gfuncs/RCV2_3setup.g' sband := getsband(ffreq,tbw) if(nbw <= 80) iffiltr := '6/80' else if(nbw <= 320) iffiltr := '6/320' else iffiltr := '6/1280' afbank := 'B' dcrchan := [fb[5],fb[7]]; print "rcvr2_3_setup(", ffreq, sband, polmode, sw.cal, ")" # rcvr2_3_setup(ffreq, sband, polmode, sw.cal) } #----------------------------------------------------- else if(rcvr=='Rcvr4_6') # 4_6 GHz { # include '/users/gbtops/include/gfuncs/RCV4_6setup.g' cband := getcband(ffreq,tbw) if(nbw <= 20) iffiltr := '3/20' else if(nbw <= 80) iffiltr := '3/80' else if(nbw <= 320) iffiltr := '3/320' else iffiltr := '3/1280' afbank := 'A' dcrchan := [fb[2],fb[4]]; print "rcvr4_6_setup(", ffreq, cband, polmode, sw.cal, ")" # rcvr4_6_setup(ffreq, cband, polmode, sw.cal) } #----------------------------------------------------- else if(rcvr=='Rcvr8_10') # 8-10 GHz { # include '/users/gbtops/include/gfuncs/RCV8_10setup.g' if(nbw>500) bbw := 'wide' else bbw := 'narrow' if(nbw <= 20) iffiltr := '3/20' else if(nbw <= 80) iffiltr := '3/80' else if(nbw <= 320) iffiltr := '3/320' else iffiltr := '3/1280' afbank := 'B' dcrchan := [fb[6],fb[8]]; print "rcvr8_10_setup(", bbw, sw.cal, ")" # rcvr8_10_setup( bbw, sw.cal) } #----------------------------------------------------- #----------12-18 GHz receiver: else if(rcvr=='Rcvr12_18') # 12-15 GHz { # include '/users/gbtops/include/gfuncs/RCV12_18setup.g' nbw := as_integer(tbw) if(nbw <= 500) kuband := 'narrow' else kuband := 'wide' if(nbw <= 20) iffiltr := '3/20' else if(nbw <= 80) iffiltr := '3/80' else if(nbw <= 320) iffiltr := '3/320' else iffiltr := '3/1280' afbank := 'A' if(frqtab.nb==2) afbank := 'AB' dcrchan := [fb[2],fb[4],fb[6],fb[8]]; if((mode == 'bsw')||(mode=='bsw_nocal')) xxfer := 'ext' else xxfer := 'off' print "rcvr12_18setup(", kuband, sw.cal, xxfer, ")" # rcvr12_18setup( kuband, sw.cal, xxfer); } #----------------------------------------------------- else if(rcvr=='Rcvr18_22') # 18-22 GHz { # include '/users/gbtops/include/gfuncs/RCV18_26setup.g' if(nbw <= 80) iffiltr := '6/80' else if(nbw <= 320) iffiltr := '6/320' else iffiltr := '6/1280' afbank := 'A' if(frqtab.nb==2) afbank := 'AB' dcrchan := [fb[2],fb[4],fb[6],fb[8]]; print "Rcvr18_22setup(", sw.cal, xxfer, ")" # rcvr18_26setup( sw.cal, xxfer) } else if(rcvr=='Rcvr22_26') # 22-26 GHz { # include '/users/gbtops/include/gfuncs/RCV18_26setup.g' if(nbw <= 80) iffiltr := '6/80' else if(nbw <= 320) iffiltr := '6/320' else iffiltr := '6/1280' afbank := 'A' if(frqtab.nb==2) afbank := 'AB' dcrchan := [fb[2],fb[4],fb[6],fb[8]]; print "Rcvr22_26setup(", sw.cal, xxfer, ")" # rcvr18_26setup( sw.cal, xxfer) } else if(rcvr=='Rcvr40_52') # 40-50 GHz { # include '/users/gbtops/include/gfuncs/RCV40_50setup.g' if(nbw <= 80) iffiltr := '6/80' else if(nbw <= 320) iffiltr := '6/320' else iffiltr := '6/1280' afbank := 'A' if(frqtab.nb==2) afbank := 'AB' dcrchan := [fb[2],fb[4],fb[6],fb[8]]; print "Rcvr40_52setup(", sw.cal, xxfer, ")" # rcvr40_52setup( sw.cal, xxfer ) } else if((rcvr=='Holography')||(rcvr=='hol')) # Holography { print "Holography receiver: you are on your own!" } else { print "Did not recognize receiver name: ", rcvr exit; } # load the functions for the LO, IFrack, etc. # include '/users/gbtops/include/gfuncs/LOIFsetup.g' rrfreq := as_double(rfreq*1000.0); vvel := as_double(vel.v); # get the velocity frame if((vel.frame == 'lsrk')||(vel.frame == 'LSRK')||(vel.frame=='lsr') ||(vel.frame=='LSR')||(vel.frame=='KinematicalLSR')) vframe := 'KinematicalLSR' else if ((vel.frame == 'lsrd')||(vel.frame=='LSRD')) vframe := 'DynamicalLSR' else if ((vel.frame == 'gal')||(vel.frame=='GAL')) vframe := 'Galactocentric' else if ((vel.frame == 'bary')||(vel.frame=='BARY') ||vel.frame == 'helio')) vframe := 'Barycentric' else vframe := 'Topocentric' if(( vel.vdef=='opt')||(vel.vdef=='optical')) veldef := 'Optical' if(( vel.vdef=='rad')||(vel.vdef=='radio')) veldef := 'Radio' if(( vel.vdef=='rel')||(vel.vdef=='true')) veldef := 'Relativistic' print "lo1_setup(", rcvr, rrfreq, vvel, vframe, veldef, sw.mode, sw.df, ")" # lo1_setup( rcvr, rrreq, vvel, vframe, veldef, sw.mode, sw.df) print "ifr_setup(", rcvr, iffiltr, ")" # ifr_setup( rcvr, iffiltr) # set the switching signal selector: print "sss_setup(", back, ")"; # sss_setup( back); bback := back; # set different backend names for the spectrometer depending on bandwidth if((back=='acs')||(back=='spect')) { bback := '12M' if(bw > 13.0) bback := '50M' if(bw > 53.0) bback := '200M' if(bw > 300.0) bback := '800M' } # set the converter rack: if((back != 'dcr')&&(back!='DCR')) { print "cnv_setup(", rcvr, bback, ")"; cnv_setup( rcvr, bback); } # set the analog filter rack: # only needed if using the spectrometer if((back=='acs')||(back=='spect')) { print "afr_setup( afbank, ", bback, ")" # afr_setup( 'afbank', bback) } # always set up the DCR # include '/users/gbtops/include/gfuncs/DCRsetup.g' if((back!='dcr')&&(back!='DCR')) cycperint := 1.0/sw.swper; else cycperint := 1.0; if(cycperint < 1.0) cycperint := 1.0; print "DCR Setup:", dcrchan, sw.mode, sw.swper, sblank, swmaster # dcr_setup('A', dcrchan, sw.mode, sw.swper, sblank, swmaster, # cycperint ) # set up the back end if back_par != F if(back_par != F) { if((back=='acs')||(back=='spect')) { # include '/users/gbtops/include/gfuncs/SPECTsetup.g' print "ACS setup:", back_par.banks, bback, back_par.levels, back_par.nsamp, sw.mode, sw.swper, back_par.tint; # spect_setup( back_par.banks, back_par.band, back_par.levels, # back_par.nsamp, sw.mode, sw.swper, back_par.tint ) } } } #---- end of gbtsetup ---------------------------------------- #--------------------------------------------------------------- # frqtab=[nif=1, nb=1, pol='L:R', f=[0.0, 0.0, 0.0, 0.0], # df=[0,0,0,0] ] # vel=[v=0.0, frame='bary', vdef='radio'] #--------------------------------------------------------------- freqcalc := function( rfreq, bw, frqtab, vel ) { iftab := [=]; wintab := [=]; nftab := 1; minfreq := 1e6; maxfreq:= 0.0; ppols := split(pol,':'); npol := len(ppols); # number of channels is nif*nbeams*npol nifs := frqtab.nif if(nifs < 1) nifs := 1 if(nifs > 8) nifs := 8 nbem := frqtab.nb if(nbem < 1) nbem := 1 if(nbem > 2) nbem := 2 for( iif in 1:nifs ) { ff := frqtab.f[iif]; if( ff <= 10.0 ) ff := rfreq*1000.0; ff +:= frqtab.df[iif]; # leave out the doppler effect for now minfreq := min(minfreq, ff) maxfreq := max(maxfreq, ff) for( nnb in 1:nbem ) { for(ipol in 1:npol) { iftab.pol := ppols[ipol]; iftab.ibm := nnb; iftab.nif := iif; iftab.fsky := ff wintab[nftab] := iftab; print "Freq Table", nftab, iftab nftab +:= 1 } } } tunefreq := 0.5*(minfreq + maxfreq) totalbw := maxfreq - minfreq + bw; windata := [=] windata.tunefreq := tunefreq; windata.totalbw := totalbw windata.wintab := wintab; return windata; }