NAME:
a0was2examples - Accessing was (wapp) fits files.
The wapp run in spectral line mode creates fits files. This is a
different file format than the one used by the interim correlator.
A set of routines has been written to access the fits files and map
them into the same data structure as the interim correlator.
After this mapping, the normal corget,corplot,corxxx routines can be
used to process the data.
There are a few routines that are unique to this data format. They
begin with wasxxx: Wideband Arecibo Spectrometer (the prefix wapp was
already in use for the wapp pulsar data). These routines that
users should access are:
wasopen() - open a file
wasclose() - close a file
waslist() - list a scan summary of file
washdr() - return the fits headers (only works on most recent
fits header version).
Some corxxx routines have been rewritten to process the was data.
These are documented here at corxxx(). I have tried to make the
functionality the same. If in doubt, read the documentation here to
see if there is anything different from the interrim correlator verion.
This documentation is for the verion that writes all of the
wapp data into a single datafile.
Running idl:
To process the was datasets:
idl
@phil (or whatever you need to add your base directory)
@wasinit ..initialize for was data. This calls @corinit and then
adds the ./was2 directory path in front of the ./Cor2
directory path. Any corxxx() files in ./was2 will override
the files with the same name in ./Cor2.
note: wasinit() is now the same as the old wasinit2().
-----------------------------------------------------
NOTE: These routines use the goddard binary fits table routines to
access the file. At AO they are in the directory:
/pkg/rsi/idl/lib/locallib/astron/pro/fits_bintable. If you download
the AO idl routines, you will also need to get a copy of the
goddard routines and add the fits_bintable directory to the path.
-----------------------------------------------------
; open the file
;
file='/share/pserverf.sda3/wappdata/wapp.20040118.a1849.0010.fits'
istat=wasopen(file,desc)
;
; list contents of the file
;
waslist,desc
;
; read a recod
;
istat=corget(desc,b)
; there is a new corplot keyword: sbc=123 that would plot
; sbc 1,2, and 3. This serves the same functionality as the m=
; keyword but it is easier to use.
corplot,b
;
; read a scan
;
istat=corinpscan(desc,b,scan=401867463L,maxrec=600)
; position to a scan in the file
;
istat=posscan(desc,401868066)
;
; process on,off position switched data.
;
istat=corposonoff(desc,b,scan=scan,/han)
;
; read 1 or more raw fits headers into a structure
; it reads by rows so you need to ask for numberOfRec*rowsPerRecs
; to get all the data in a scan.
; eg the the scan has 600 recs but we read 600*2*4 headers
; since there are 2 IFs per sbc and 4 sbc per measuremetns
istat=washdr(desc,h,scan=401864155L,numhdr=600*8)
;
; close the file when done. After calling this you must reopen
; the file with wasopen() to access it.
;
wasclose,desc
SOME NOTES (20aug04) ;
1. All wapp data is now in a single file
2. Things that i have used and i thing work:
corget,corinpscan,corplot,corgetm, corimgdisp() works
3. Some things that are not yet ready:
The velocities may still need some work
cormapping does not yet work. We need to add the mapping parameters
to the fits header.
4. Some header values are not moved from the fits file to the
old interim correlator data structure. If a corxxx routine
fails it may be because the header info is not yet there.
6. Let me know things that you find that don't work (phil@naic.edu).
You can also look at http://www.naic.edu/~phil
--> software documenation
--> Using single dish fits header for wapp spectral line data..
toward the bottom of this page is a list of the current things
we are working on in the header.
(See /pkg/rsi/local/libao/phil/was2/a9was2examples.pro)
NAME:
alfachkday - check a days set of files
SYNTAX: nfiles=alfachkday(projid,yymmdd,savI,imglist=imglist,pol=pol,$
bychn=bychn,$
savDat=savDat,usecurs=usecurs,nopltrms=nopltrms,$
rmslist=rmslist,vrms=vrms,nolut=nolut,dir=dir)
ARGS:
projid: string project id to use eg 'a2010';
yymmdd: long day (ast) to search for
KEYWORDS:
imglist: long sbc of boards to display in image. To display sbc 1,2,3,4
set imglist=1234 (The sbc numbers are 1 based). def=1
pol: long the pol to display in image 1=polA, 2=polB. Default=1
bychn: if set then display rms,image by channel number. The default
is by frequency.
savDat: if set then save the rms's and savI in a save file
called yymmdd.sav in the current directory.
useCurs: if set then stop after every image wait for the
user to click on the cursor position. This time, freq
will be stored in the savI for this image.
nopltrms: if set then don't bother to plot the rms's for each
scan.
rmslist :long the sbc to display in the rms plots. To display sbc
3,4,5 use rmslist=345 (the sbc are 1 based).
vrms :float vertical scan max for rms plot (min is 0). Units are
rms/mean by channel.
nolut : if set then don't load the grey scale lookup table before
starting. by default a linear ramp is installed.
dir : use this directory rather than /proj/projid/ This may be
needed if the files have not been moved to proj/projid yet.
RETURNS:
nfiles: long number of files we processed.
savI[nfile]: {} struture holding info on each scan
CURSFRQ FLOAT 1420.59 ; from cursor
CURSJD DOUBLE 2453454.7 ; from cursor
SCAN LONG 508400209
FNAME STRING '/proj/a2010/wapp.20050325.a2010.0000.fits'
NOTES STRING '' ; user entered
If savdat set : save,savI,brmsAr[],file='050326.sav' if yymmdd=050326
this data will be saved in the current directory.
DESCRIPTION:
alfachkday will scan for all of the fits files for a particualr day
with the specified project id. It will then input the first scan of each
file, compute the rms/mean by channel and display it. It will then
compute an image of the specified sbc/pol and display it. If /usecurs
is set then:
1.the program will wait for the user to click the cursor on a position
in the image. It will record the frequency, time of this position.
2.it will then prompt the user for a single line of notes for this
image.
It then proceeds to the next file.
If /savDat is specified then the rms/mean for all of the scans as well
as the savI structure is stored to disc as yymmdd.sav
(See /pkg/rsi/local/libao/phil/was2/alfachkday.pro)
NAME:
arch_getalfaradec - get alfa ra/dec from the archive.
SYNTAX: npts=arch_getalfaradec,yyyymmdd1,yyyymmdd2,raHr,decDeg,$
projid=projid,procname=procname,srcname=srcname,$
numrecs=numrecs,scanRange=scanRange,$
slar=slar,slfilear=slfilear,indAr=indAr,scanAr=scanAr,$
sym=sym,plotit=plotit,verb=verb,gt12=gt12
ARGS:
yyyymmdd1: long first date to include in data search eg.. 20040903
yyyymmdd2: long last date to include in the data search.
KEYWORDS:
Keywords to limit the data set:
projid: string limit the data to scans taken with this project
idea. An example would be 'a1943'
procname: string limit the data to scans taken by this pattern/procedure.
Some example names are: 'onoff','cal','smartf','basket',
'fixedaz','spiderAn' (n=0,6),'crossAn' (n=0,6),
'driftmap','driftalt','driftch'
srcname: string limit the data to this source name.
numrecs: long limit the data to scans that have this many records.
This can be used to exclude partial scans.
scanrange[2]:long limit the data to scans that are between
scanrange[0] le scan le scanrange[1]
Keywords for plotting/printing:
plotit: If set then plot the ra,dec values as they are read in.
It replots the data on each block of scans processed.
The last block of scans is always plotted in red.
sym : int The symbol to used for plotting. The default is
2 (*). other symbols are 1(+), 3(.), 4(triangle).
gt12 : If set then force plotted data to be greater than
twelve hours. Values less than 12 hours are incremented
by 24. This is only for the plotted data. Use this
when you have data that spans a range like: 22 to 2 hours.
verb : If set then print scans and number of records as they
are processed (one block at a time).
batch : int By default the routine processes one scan at a time.
You can set batch to a larger value (say 10) and it
will read in and process 10 scans at at time. This
will speed up processing if you have the plotit option
set. /plotit replots all points done adding the new
one just processed. If the batch is set to 10 then
the replots will happen every 10 scans rather than
every scan.
RETURNS:
rahr[7,npts]: dbl The ra in hours for the 7 beams and Npts points.
decDeg[7,npts]: dbl The declination in degrees for the beams and Npts points.
scanAr[npts]: long The scan numbers for the npts.
slar[m] :{slar} The slar for the date range and projid.
slfilear[j] :{slfilear} The filename array for the date range and projid.
indar[npts] : long The indices into slar for the data that
matches all of the criteria specified.
DESCRIPTION:
arch_getalfaradec will search the was2 archive at the observatory
and find all of the scans that match the criteria specified by the
user. The scans must match all of these criteria to be included (logical and).
The matching scans are then input batch scans at a time (the default
for batch is 1). This data is passed to wasalfacmpradec to compute the
ra/dec position for the 7 alfa beams for each of the data samples. The
ra/dec position is for the center of each data sample.
The computed ra,decs are optionally
plotted on the screen as they are processed (the user should set the
horizontal/vertical scale with hor ver if they want to exclude some
outliers in the plots).
When done processing, the ra and dec arrays are returned to the
caller. The slar and slfilear can optionally be returned thru the
respective keywords. The indar holding the indices into slar[] for the scans
that matched the criteria is also returned.
EXAMPLES:
Find all of the basket weave scans taken by a1943 between 03sep04
and 06sep04 on NGC7469. Limit the scans to complete strips of 60 records.
Return only scans after scan number 424767055L (the previous scans of the
day had some problems).
yymmdd1=20040903
yymmdd2=20040906
srcname='NGC7469'
projid='a1943'
numrecs=60
procname='basket'
scanrange=[424767055L,500000000L]
npnts=arch_getalfaradec(yymmdd1,yymmdd2,raAr,decAr,projid=projid,$
procname=procname,srcname=srcname,numrecs=numrecs,$
scanrange=scanrange,slar=slar,slfilear=slfilear,$
indar=indar,scanar=scanar,sym=2,/plotit,/verb,/gt12)
; now plot out the ra,decs with a different color for each beam.
ldcolph
sym=2
hor,min(rahr),max(rahr)
ver,min(decdeg),max(decdeg)
plot,[0,1],[0,1],/nodata
for i=0,6 do $
oplot,rahr[i,*],decdeg[i,*],color=colph[i+1],psym=sym
; plot the average az,za for each scan we found
plot,slar[indar].azavg,slar[indar].zaavg,psym=2
; look at what else is available in slar
help,slar,/st
SEE ALSO:
wasalfcmpradec (was2 routines)
alfabmpos (gen/pnt idl pointing routines
arch_getdata (was2)
NOTE:
You need to run this routine at the AO observatory (since the data
archive does not exist at remote sites).
(See /pkg/rsi/local/libao/phil/was2/arch_getalfaradec.pro)
NAME:
arch_getdata - get cor data using the archive tbl arrays
SYNTAX: n=arch_getdata(slAr,slfileAr,indAr,b,type=type,incompat=incompat,
han=han,missing=missing,hdronly=hdronly)
ARGS:
slAr[l] : {slwas} returned by arch_gettbl
slFileAr[m] : {slInd} returned by arch_gettbl
indAr[] : long indices into slar to return
KEYWORDS:
type : int 0 first rec (hdr and data) of each scan1
: 1 hdrs from first rec of each scan
: 2 all recs each scan (hdr and data)
: 3 average rec (hdr and data) each scan
: 4 all hdrs from scan
hdronly : if set, then type 0,2,3 will return a data
struct with only b.n.h and b.h.hf no data will
be returned. For was data, types 1,4 don't
work since there are .h and .hf header
entries.
RETURNS:
n : int number of elements in b
b : depending on type it can be {corget} or {hdr}
slind[n]: long the index into slar for each element returned in b.
incompat[p] long indices in indAr that were not returned because the
datatype differs from that of the first record
missing[m] long indices in indAr that were not in the file location
that the database had recorded.
DESCRIPTION:
After using arch_gettbl() and possibly where(), call this routine
to read the header and data from disc. What you get back is determined by
the keyword type and ind. The number of elements in b[] can be greater
than the number of indices in ind[] (eg you asked for all of the records
of the scans, or you are returning just headers). The slind keyword
array has the same number of elements as b. It contains the index into
slAr for each elements of b.
EXAMPLES
;get all data for jan02->apr02 cband
nscans=arch_gettbl(20040101,20040430,slAr,slFileAr,rcv=9)
; get note.. corfindpat does not yet work with was data..
;
NOTE:
When returning just headers, each header of each board is returned
as a separate entry in b[]. Use slind to figure out which scan each
belongs to.
(See /pkg/rsi/local/libao/phil/was2/arch_getdata.pro)
NAME:
arch_getonoff - get on/off -1 data from archive
SYNTAX: nfound=arch_getonoff(slAr,slfileAr,indar,bout,infoAr,$
incompat=incompat,han=han,scljy=scljy,verbose=verbose)
ARGS:
slAr[n] : {sl} or {corsl} returned by arch_gettbl
slFileAr[m] : {slInd} returned by arch_gettbl
indar[] : long indices into slar for scans to return
KEYWORDS: (for corposonoff)
han: if set then hanning smooth
scljy: if set then scale to jy using gain curve for date of scan.
if not set then return in Kelvins.
verbose:if set then call correcinfo for each scan we process
RETURNS:
nfound : long number of on/off-1 returned in bout
infoAr[2,n]: long info on each on/off -1 found. Values are:
info[0,n] status of the returned on/off's
1 - on/off -1 returned as requested.
2 - on/off -1 but only the off was in ind[]. This could
occur if you asked for all the scans within the radius
of some ra/dec and the off fell within the radius
but not the on. You might then look for a negative
going galaxy in the on/off-1.
<0- no cal was found so the units are Tsys.
returnes -1 or -2
info[1,n] this is the index into indar[] where this on/off
was found (could be the on or the off).
bout[n] : on/off-1 scaled to jy, K, or tsys (see info[]). There is
one elemetn for each on/off pair found
incompat[p] long indices in indAr that were not returned because the
datatype differs from that of the first on/off pair.
Since bout[] is an array, each element must have the same
format (eg. number of boards, lags/sbc, etc..).
DESCRIPTION:
After using arch_gettbl() and possibly where(), call this routine
to process all of the on,off position switch records included in the
subset slar[ind]. It will search for all of the on or offs in ind[] and
process them via corposonoff(). If only an ON or an OFF is found in ind[]
it will still try to process the pair. By default it will use the cal
to return the data in kelvins. The /scljy will return the data in janskies.
If no cal scan is found, then the data is returned in units of Tsys.
The infoar[2,*] returns information on the returned data. The first
index tells the format of the data, the second index is the ptr into
slar where the onPos was found.
EXAMPLES
;get all data for jan02->apr02 cband
nscans=arch_gettbl(020101,020430,slAr,slFileAr,rcv=9)
; select all the on/off pairs
pattype= 1 ; on/off position with cal on,off
nfound=corfindpat(slar,indar,pattype=pattype
n=arch_getonoff(slar,slfilear,indar,b,type=3,incompat=incompat)
NOTE:
The routine expects to find the on,off, and cals in the slar. You should
pass the entire slar with indar as the thing that does the subsetting.
Don't pass a subset of slar into this routine: eg..
arch_gettbl(010101,011230,slar,slfilear,rcv=6)
ra =131215.1
dec=101112.
dist=cmpcordist(ra,dec,slar=slar)
; find all points within 30 arcminutes of ra,dec from projid a1199
; ..wrong..
ind=where(dist[2,*] lt 30.,count)
slarn=slar[ind]
ind=where(slarn.projid eq 'a1199',count)
npts=arch_getonoff(slarn,slfilear,ind,/scljy)
; .. correct:
ind=where((dist[2,*] lt 30.) and (slar.projid eq 'a1199'),count)
npts=arch_getonoff(slar,slfilear,ind,/scljy)
(See /pkg/rsi/local/libao/phil/was2/arch_getonoff.pro)
NAME:
arch_gettbl - input table of scans from cor archive
SYNTAX: nscans=arch_gettbl(yymmdd1,yymmdd2,slAr,slfileAr,rcvnum=rcvnum,
freq=freq,proj=proj)
ARGS:
yyyymmdd1 : long year,month,day of first day to get (ast)
yyyymmdd2 : long year,month,day of last day to get (ast)
KEYWORDS:
rcvnum : long .. receiver number to extract:
1=327,2=430,3=610,5=lbw,6=lbn,7=sbw,8=sbw,9=cb,$
10=xb,12=sbn,100=430ch
freq[2] : float Require cfr of band to be between freq[0] and freq[1]
in Mhz. At least 1 sbc of scan must match this.
proj : string project number to match (eg. 'a1473')
RETURNS:
slAr[count] : {sl} or {corsl} scanlist array for each scan
slFileAr[n] : {slInd} one entry per file found
nscans : long number of scans found
DESCRIPTION:
This routine will scan the was archive and return a table
(an array of scanlist structures) for all scans in the archive that meet
the requested criteria. Two arrays are returned:
1. slAr[] holds 1 entry per scan
2. slfileAr[m] holds 1 entry per file found.
Each slAr entry is an {sl} or {corsl} structure that contains:
a={slwas ,$
scan : 0L, $; scannumber this entry
rowStart : 0L, $; row in fits file start of scan 0 based.
fileindex : 0L, $; lets you point to a filename array
stat : 0B ,$; not used yet..
rcvnum : 0B ,$; receiver number 1-16, 17=alfa
numfrq : 0B ,$; number of freq,cor boards used this scan
rectype : 0B ,$;1-calon,2-caloff,3-posOn,4-posOff
numrecs : 0L ,$; number of groups(records in scan)
freq : fltarr(8),$;topocentric freqMhz center each subband
julday : 0.D,$; julian day start of scan
srcname : ' ',$;source name (max 12 long)
procname : ' ',$;procedure name used.
stepName : ' ',$;name of step in procedure this scan
projId : '' ,$; from the filename
patId : 0L ,$; groups scans beloging to a known pattern
secsPerrec : 0. ,$; seconds integration per record
channels : intarr(8),$; number output channels each sbc
bw : fltarr(8),$; bandwidth used Mhz
backendmode: strarr(8),$; lag config each sbc
lag0 : fltarr(2,8),$; lag 0 power ratio (scan average)
blanking : 0B ,$; 0 or 1
azavg : 0. ,$; actual encoder azimuth average of scan
zaavg : 0. ,$; actual encoder za average of scan
encTmSt : 0. , $; secs Midnite ast when encoders read
; start of scan
raHrReq : 0.D,$; requested ra , start of scan J2000
decDReq : 0.D,$; requested dec, start of scan J2000.
; Delta end-start real angle for requested position
raDelta : 0. ,$; delta ra last-first recs. Amins real angle
decDelta : 0. ,$; delta dec (last-frist)Arcminutes real angle
pntErrAsec : 0. ,$; avg great circle pnt error
; alfa related
alfaAngle: 0. , $; alfa rotation angle used in deg
alfaCen : 0B $; alfa pixel that is centered on ra/dec position
}
You can use the slAr and slFileAr to then access the actual data files
without having to search through the file.
EXAMPLES
The following examples will read the scanlist array for all the data
beteen sep04 and dec04. The examples will then select different pieces
of information that are in this scanlist array. The final step will
extract some of the actual datascans.
;get tbl for all data for sep04->oct04.
nscans=arch_gettbl(20040901,20041201,slAr,slFileAr)
; work with this scanlist dataset..
; make a list of the unique source names
srcnames=slar[uniq(slar.srcname,sort(slar.srcname))].srcname
print,srcnames
;
; find all of the on/off position switch data for cband (rcv=9)
;; not yet... n=corfindpat(slar,indar,pattype=1,rcv=9)
; find source NGC2264
indar=where(slar.srcname eq 'NGC2264',count)
now extract the scan averaged data. It will extract all data scans
that match the dataformat of the first entry of indar[0] (see arch_getdata().
n=arch_getdata(slar,slfilear,indar,b,type=3,/han,incompat=incompat)
SEE ALSO:getsl, arch_getdata,corfindpat.
(See /pkg/rsi/local/libao/phil/was2/arch_gettbl.pro)
NAME:
arch_summary - print summary info of arhive list.
SYNTAX: arch_summary,slar,logfile=logfile,append=append
ARGS:
slar[n]: {wassl} slar input from arch_gettbl
KEYWORDS:
logfile: string file name to write the data. If append keyword is
set the append to file rather than overwriting.
DESCRIPTION:
Output a 1 line summary for every scan in the slar. If logfile is
supplied then output to this file. The file will be overwritten unless
the append keyword is set.
proj scan srcname procNm step rcv recs ra dec
a1946xsssssssssxllllllllllllxppppppppppxsssssssxrrxnnnnxhh:mm:ssxdd:mm:ss
12345 123456789 123456789012 1234567890 1234567 12 1234 12345678 12345678
(See /pkg/rsi/local/libao/phil/was2/arch_summary.pro)
NAME:
coracftospcpol - convert acf to spectra for polarization data.
SYNTAX: istat=coracftospcpol(acf,spc)
ARGS:
acf[m]: {corget} array of corget structures hold acf data (from the
wapps).
RETURNS:
spc[m]: {corget} array of corget structures holding computed
specra.
DESCRIPTION:
Convert acfs to spectra for polarization data taken on the wapps.
You can pass in a single or an array of corget records.
The processing is:
1. The wapp data has already had the bias removed and it has been
normalized to the number of multiplies.
2. Do the 3 level correction (this does not yet work for 9 level data).
Use the routine cor3lvlstokes in the gen/ directory.
3. compute the spectra for the auto correlations and the cross correlation.
4. compute spc[].ibrd.d[*,0]= I = (polA + polB)/ (pwrA+pwrB)
spc[].ibrd.d[*,1]= Q = (polA - polB)/ (pwrA+pwrB)
spc[].ibrd.d[*,2]= U = real(ccfSpectra)/sqrt(pwrA*pwrB)
spc[].ibrd.d[*,3]= V = -img(ccfSpectra)/sqrt(pwrA*pwrB)
where ibrd is b1,b2,b3, or b4.
The spectra are normalized to the total power (I). To convert back to
power units use the lag0pwrratios[2] in the header
spc.[].ibrd.h.cor.lag0pwrratio[2] [0] is polA power, [1] is polB
power in units of Optimum/Measured power.
(See /pkg/rsi/local/libao/phil/was2/coracftospcpol.pro)
NAME: corhcalrec- check if an input rec is a cal rec. SYNTAX: istat=corhcalrec(hdr) ARGS : hdr - header from 1 of the boards RETURNS: istat- 0 not a cal rec, 1-on, 2-off DESCRIPTION: Check if a record input is part of a cal record. EXAMPLE: corget(lun,b) istat=corhcalrec(b.b1.h)
(See /pkg/rsi/local/libao/phil/was2/corhquery.pro)
NAME:
corhcalval - return the pol A/B cal values for a sbc.
SYNTAX: stat=corhcalval(hdr,calval,date=date,swappol=swappol)
ARGS:
hdr: {hdr} header for board to check
KEYWORDS:
date[2]: intarray [year,dayNum] if provided, then compute the calvalues
that were valid at this epoch.
swappol: if set then swap the pola,polb cal values. This can
be used to correct for the 1320 hipass cable switch
problem or the use of a xfer switch in the iflo.
RETURNS:
calval[2]: float .. calValues in deg K for polA,polB
stat: int .. -1 error, 1 got the values ok.
DESCRIPTION:
Return the cal values in degrees K for the requested sbc. This
routine always returns 2 values (polA then polB) even if the header
is for a board that uses only one polarization.
The calvalues for the receiver in use are looked up and then the
values are interpolated to the observing frequency.
EXAMPLE:
input a correlator record and then get the calvalues for the
3rd correlator board:
print,corget(lun,b)
istat=corhcalval(b.b3.h,calval)
.. calval[2] now has the cal values in degrees K for polA and polB.
NOTE:
Some cals have measurements at a limited range of frequencies (in some
cases only 1 frequency). If the frequency is outside the range of measured
frequencies, then the closest measured calvalue is used (there is no
extrapolation).
The year daynum from the header is used to determine which set of
calvalue measurements to use (if the receiver has multiple timestamped
sets).
This routine computes the frequency of the sbc from hdr and then calls
calget().
SEE ALSO:
gen/calget gen/calval.pro, gen/calinpdata.pro
(See /pkg/rsi/local/libao/phil/was2/corhquery.pro)
NAME:
corhcfrrest - return the rest freq of band center.
SYNTAX: cfr=corhcfrrest(hdr)
ARGS:
hdr: {hdr} .. header for board to check
RETURNS:
cfr: double .. rest center freq of band in Mhz
DESCRIPTION:
Return the rf rest frequency for the band center of the requested board.
EXAMPLE:
get the rest freq of the 3nd board: cfrMhz=corhcfrrest(b.b3.h)
(See /pkg/rsi/local/libao/phil/was2/corhquery.pro)
NAME:
corhcfrtop - return the topocentric freq of band center.
SYNTAX: cfr=corhcfrtop(hdr)
ARGS:
hdr: {hdr} .. header for board to check
RETURNS:
cfr: double .. center freq of band in Mhz
DESCRIPTION:
Return the topocentric rf center of the band for the requested board.
hdr can be an array of hdrs but they must all come from the same
board. eg b[].b1.h
EXAMPLE:
get the freq of the 2nd board: cfrMhz=corhcfrtop(b.b2.h)
(See /pkg/rsi/local/libao/phil/was2/corhquery.pro)
NAME:
corhdnyquist - check if rec taken in double nyquist mode
SYNTAX: istat=corhdnyquist(hdr)
ARGS : hdr{} - header from 1 of the boards of the record
RETURNS: istat- 0 not taken in double nyquist mode.
1 taken in double nyquist mode.
DESCRIPTION:
Check if a record was taken in double nyquist mode.
EXAMPLE:
corget(lun,b)
istat=corhdnyquist(b.b1.h)
(See /pkg/rsi/local/libao/phil/was2/corhquery.pro)
NAME:
corhflipped - check if current data is flipped in freq.
SYNTAX: stat=corhflipped(corhdr)
ARGS:
corhdr[]: {corhdr} to check.
RETURNS: istat- 0 increasing frq, 1- decreasing freq order.
if corhdr[] is an array then istat will be an array of ints.
DESCRIPTION:
Check if the correlator data for this sbc is stored in increasing
or decreasing frequency order (even or odd number of high side lo's).
EXAMPLE:
check first board: istat=corhflipped(b.b1.h.cor)
(See /pkg/rsi/local/libao/phil/was2/corhquery.pro)
NAME:
corhgainget - return the gain given a header
SYNTAX: stat=corhgainget(hdr,gainval,date=date,az=az,za=za,onlyza=onlyza)
ARGS:
hdr[n]: {hdr} header for board to check
KEYWORDS:
date[2]: intarray [year,dayNum] if provided, then compute the gain value
at this epoch.
az[n]: fltarray If provided, use this for the azimuth value rather than
the header values
za[n]: fltarray If provided, use this for the zenith angle values rather
than the header values
onlyza: If set then return the za dependence (average of az)
RETURNS:
gainval: float .. gainvalue in K/Jy
stat: int -1 --> error, no data returned
0 --> requested freq is outside freq range of fits.
Return gain of the closed frequency.
1 --> frequency interpolated gain value returned.
DESCRIPTION:
Return the telescope gain value in K/Jy for the requested sbc.
The gain fits for the receiver in use are input and then the
values are interpolated to the az, za and observing frequency.
If hdr[] is an array then the following restrictions are:
1. each element must be from the same receiver and at the same
frequency (eg. all the records from a single scan).
2. If the az,za keywords are provided, they must be dimensioned the same
as hdr
EXAMPLE:
input a correlator record and then get the gain value for the
3rd correlator board:
print,corget(lun,b)
istat=corhgainget(b.b3.h,gain)
.. gain now has the gain value in K/Jy
input an entire scan and compute the gain for all
records of 1 sbc. assume 300 records..
print,corinpscan(lun,bar)
istat=corhgainget(bar.b3.h,gain)
gain is now a array of 300 records
NOTE:
Some receivers have measurements at a limited range of frequencies (in some
cases only 1 frequency). If the frequency is outside the range of measured
frequencies, then the closest measured gain is used (there is no
extrapolation in frequency).
The year daynum from the header is used to determine which set of
gain fits to use (if the receiver has multiple timestamped sets).
This routine takes the az,za, date, and frequency from the
header and then calls gainget().
If you input an array of corget recs , then they must all be from the
same sbc.
SEE ALSO:
gen/gainget gen/gaininpdata.pro
(See /pkg/rsi/local/libao/phil/was2/corhquery.pro)
NAME:
corhstokes - check if record taken in stokes mode
SYNTAX: istat=corhstokes(hdr)
ARGS : hdr{} - header from 1 of the boards of the record
RETURNS: istat- 0 not taken in stokes mode. 1-->taken in stokes mode
DESCRIPTION:
Check if a record was taken stokes (polarization) mode.
EXAMPLE:
corget(lun,b)
istat=corhstokes(b.b1.h)
(See /pkg/rsi/local/libao/phil/was2/corhquery.pro)
NAME:
corsubset - make a copy of data keeping only specified boards
SYNTAX: bret=corsubset(b,brd,pol=pol)
ARGS: b[m]: {corget} original structure
brd[]: int brd's to keep.. count 1,2,3,4
RETURNS:
bret[m] : {corget} return subset data here
if an illegal brd is requested then '' is returned.
You can check this with keyword_set(bret) eq 0.
KEYWORDS:
pol : if set then just return first polarization.
This is used by coravg...
DESCRIPTION:
corsubset will create a subset of a correlator data structure
keeping only the specified boards. It will also update
some header locations so the header will reflect the data.
The input structure can be a single structure or an array of structures.
EXAMPLE:
..Keep boards 1 and 3 of all the records of the data structure.
print,corinpscan(lun,bsum,b,/sum)
b13=corsubset(b,[1,3]) ; all the records
b13sum=corsubset(bsum,[1,3]); the summary record
(See /pkg/rsi/local/libao/phil/was2/corsubset.pro)
NAME:
getsl - scan a wapp fits file and return the scan list.
SYNTAX: sl=getsl(desc)
ARGS:
desc: {} assigned to open file
default: 5000L
RETURNS:
sl[nscans]:{sl} holds scan list info
DESCRIPTION
This routine reads a wapp fits file and returns an array of scanlist
structures.
This array contains summary information for each scan of the file:
sl.scan - long scan number for this scan
sl.bytepos - unsigned long for start of this scan
for fits data this is the starting row of the
scan in the file, not the byte offset.
sl.stat - .. not used yet..
sl.rcvnum - byte receiver number 1-16
note: ch is rcvnum 100
sl.numfrq - byte .. number of freq,cor boards used this scan
sl.rectype - byte 1 -calon
2 -caloff
3 -onoff on pos
4 -onoff off pos
5 -coron (stdon) (track just on position)
6 -cormap1 (radecmap)
7 -cormapdec (decramap)
8 -cordrift (driftmap)
9 -corcrossch (spidera0 thru a7)
10 -x111auto (rfi monitoring)
11 -one murrays on with calon/off at the null
12 -onoffbml murrays on, off and cal at null
20 -spidera0
21 -spidera1
22 -spidera2
23 -spidera3
24 -spidera4
25 -spidera5
26 -spidera6
25 -wappcrossmap
26 -wapphexmap
27 -altdriftmap
28 -fixedazdrift
29 -basketweave
30 -CROSSA0
31 -CROSSA1
32 -CROSSA2
33 -CROSSA3
34 -CROSSA4
35 -CROSSA5
36 -CROSSA6
40 -dps On-T
41 -dps Off-T
42 -dps On-B
43 -dps Off-B
sl.numrecs - long .. number of groups(records in scan)
sl.freq[4] float- topocentric frequency center each subband
sl.julday double- julian date start of scan
sl.srcname string - source name (max 12 long)
sl.procname string - procedure name used.
Some routines can use the sl structure to perform random access to
files (bypassing the need to search for a scan). The sl[] array can
also be used with the where() command to rapidly extract subsets of a
file.
EXAMPLE:
openr,lun,'/share/olcor/corfile.02nov00.x101.1',/get_lun
sl=getsl(lun)
1. process all of the lband wide data in a file:
ind=where(sl.rcvnum eq 5,count)
for i=0,n_elements(ind)-1
print,corinpscan(lun,b,scan=sl[ind[i]].scan,sl=sl)
.. process
endfor
2. Find all of the on/off patterns in a file. Make sure that the
number of records in the on equals the number in the off.
indon=where(sl.rectype eq 3 ,count)
if count le 0 then goto,nopairs
; make sure an off follows the on and has the same number of records..
; (actually this will fail if the last rec of the file is an on since
; indon+1 will go beyond the end of the sl array..)
ind= where((sl[indon+1].rectype eq 4) and $
(sl[indon].numrecs eq sl[indon+1].numrecs),count)
if count le 0 then goto,nopairs
indon=indon[ind]
3. plot all of the cal on/off records in a file with cormon().
ind=where(sl.rectype le 2)
cormon,lun,sl=sl[ind]
Note this will not work with files > 2gigabytes since it is
using a 32 bit integer.
(See /pkg/rsi/local/libao/phil/was2/getsl.pro)
NAME:
posscan - position to a scan/record on disc
SYNTAX: istat=posscan(lun,scan,rec,retstdhdr=retstdhdr,sl=sl)
ARGS:
lun: int .. logical unit assigned to open file
scan: long.. scan number 0--> whatever scan fits .. current or next
full scan number --> position to scan,
no rewinding allowed
rec: long grp number within scan.
0 or not included--> next record available
number --> record of current scan
keywords
retstdhdr: if valid variable, return standard header here..
(only if we positioned successfully)
skip : int .. skip this many scans forward. should use with
scan=0.
sl[]: {sl} returned from getsl routine. If provided
then routine will position directly to the scan requested.
The routine will not backup from the current position. If it finds
an increasing scan/rec number then it returns -1
returns: 1 positioned ok
0 not found
-1 found increasing scan number
-2 scan not in scanloc array
iook - 1 ok, 0 i/oerror, -1 bad headerid
(See /pkg/rsi/local/libao/phil/was2/posscan.pro)
NAME:
sl_mkarchive - create scan list for archive
SYNTAX: nscans=sl_mkarchive(listfile,slAr,slFileAr,logfile=logfile,$
verbose=verbose)
ARGS:
listfile: string. filename holding names of files to scan
(one per line). semi-colon as the first char is a comment.
RETURNS:
slAr[nscans] {sl} One large scanlist array for all the files
slfileAr[m]: {slInd} One entry per file showing where each file starts/
stops in slAr.
nscans : long number of scans found
KEYWORDS:
verbose: If set then print each file as we process it.
logfile: string name of file to write progress messages. by default
messages only go to stdout.
DESCRIPTION:
sl_mkarchive is given a list of spectral line fits files. It scans
each of these files and extracts information to put into an archive record.
There is on archive record per scan. This information is then stored
on disc in an idl save file format (usually by month). The routine
arch_gettbl() can then be used to read this information in and process it.
The archive record consists of:
scan : 0L, $; scannumber this entry
rowStart : 0L, $; row in fits file start of scan 0 based.
fileindex : 0L, $; lets you point to a filename array
stat : 0B ,$; not used yet..
rcvnum : 0B ,$; receiver number 1-16, 17=alfa
numfrq : 0B ,$; number of freq,cor boards used this scan
rectype : 0B ,$;1-calon,2-caloff,3-posOn,4-posOff
numrecs : 0L ,$; number of groups(records in scan)
freq : fltarr(8),$;topocentric freqMhz center each subband
julday : 0.D,$; julian day start of scan
srcname : ' ',$;source name (max 12 long)
procname : ' ',$;procedure name used.
stepName : ' ',$;name of step in procedure this scan
projId : '' ,$; from the filename
patId : 0L ,$; groups scans beloging to a known pattern
secsPerrec : 0. ,$; seconds integration per record
channels : intarr(8),$; number output channels each sbc
bw : fltarr(8),$; bandwidth used Mhz
backendmode: strarr(8),$; lag config each sbc
lag0 : fltarr(2,8),$; lag 0 power ratio (scan average)
blanking : 0B ,$; 0 or 1
azavg : 0. ,$; actual encoder azimuth average of scan
zaavg : 0. ,$; actual encoder za average of scan
encTmSt : 0. , $; secs Midnite ast when encoders read
; start of scan
raHrReq : 0.D,$; requested ra , start of scan J2000
decDReq : 0.D,$; requested dec, start of scan J2000.
; Delta end-start real angle for requested position
raDelta : 0. ,$; delta ra last-first recs. Amins real angle
decDelta : 0. ,$; delta dec (last-frist)Arcminutes real angle
pntErrAsec : 0. ,$; avg great circle pnt error
; alfa related
alfaAngle: 0. , $; alfa rotation angle used in deg
alfaCen : 0B $; alfa pixel that is centered on ra/dec position
The routine sl_mkarchive is run monthly and the info is stored in
files by month. This routine can then be run to create the slar data
for the was
EXAMPLE:
The monthly processing would look like:
;
;1. create listfile from corflist.sc 010101 010131 excl.dat outside of idl.
;2. make the slAr, slFileAr and save it
nscans=sl_mkarchive(listfile,slAr,slfilear)
save,sl,slar,file='/share/megs/phil/x101/archive/was/f010101_010131.sav'
;
SEE ALSO:sl_mkarchive,arch_gettbl,arch_getdata
(See /pkg/rsi/local/libao/phil/was2/sl_mkarchive.pro)
NAME:
wasalfacmpradec - compute ra/dec for alfa using wasdata
SYNTAX: wasalfacmpradec,b,raHr,decDeg
ARGS:
b[n] {wasget} - data as returned from corget(). It is ok to use the
/hdronly keyword to corget() to speed up i/o.
RETURNS:
rahr[7,n]: double ra in hours for the n samples. The first dimension
has the 7 beams 0 thru 6
decDeg[7,n]: double declination in degrees for the n sampled points.
The first dimension has the 7 beams 0 thru 6
DESCRIPTION:
Compute the ra,dec J2000 for the alfa beams using the data structures
read from the fits files via corget, corinpscan,corgetm etc.. To
compute the ra/dec the routine does the following:
1. Grab the encoder az,za, and encoder timestamps.
2. Get the daynumber, year from the scan number
3. compute the julian day timestamp for the az,za timestamps.
4. search thru each scan looking for midnite crossings. If there is
a midnite crossing (ast) then increment the jd for this stretch.
5. For each scan do the following:
a. Get the julian dates for the data samples from the header
location mjd_obs (converting to jd). Increment these values
by (recIntegrationSecs*.5)/86400D to get the time stamps at the center
of each integration.
b. interpolate the az,za values sampled at encoder time to the
az za at the data sample time.
c. call alfabmpos,az,za,juldayData to get the ra,dec for the alfa
beams for the data positions/times.
return these values as the ra,dec of the beam positions.
The data is returned as:
rahr[7,n]
decDeg[7,n]
Where the first index runs over the 7 pixels of alfa. The second index is
for the data samples.
It is ok if the b[] array contains more than one scan. The routine
searchs for the start of each scan in the b[] array. It is also ok
to pass in a b[] array that contains only the headers (see corget(),
corinpscan(), arch_getdata() /hdronly keyword). This can speed up the
i/o if you are only interested in the positions and not the spectra.
EXAMPLE:
1. input a scan and compute the beam positions.
print,corinpscan(desc,b)
wasalfacmpradec,b,rahr,decdeg
2.use arch_getalfaradec to input a set of scans
yyyymmdd1=20040903
yyyymmdd2=20040906
projid='a1943'
procname='basket'
numrecs=60
npnts=arch_getalfaradec(yyyymmdd1,yyyymmdd2,raHr,decDeg,projid=projid,$
procname=procname,slar=slar,slfilear=slfilear,indar=indar,$
/plotit,/verb,/gt12)
SEE ALSO
alfabmpos (in pointing related idl routines).
arch_getalfaradec() (in wapp spectral line routines).
(See /pkg/rsi/local/libao/phil/was2/wasalfacmpradec.pro)
NAME:
wasalfaplotcross - plot alfa cross data
SYNTAX: alfaplotcross,(baz,bza,proj=proj,auto=auto,two=two)
ARGS:
baz[60] : {corget} az strip data
bza[60] : {corget} az strip data
KEYWORDS:
proj : string projid.
auto : if set then autoscale each plot
two : if set then two cols by 4 rows..default ,1 by 8.
cs : float charsize keyword for labels. def: 1.7
RETURNS:
DESCRIPTION:
plot alfa cross total power by beam. There will a separate plot window
for each beam. A single beam will have 120 points (az,za points) for pol
a (black or white) and polB in Red.
Dashed red lines will be plotted at the center of the azimuth and
za strips. A dashed green line will be plotted at at the start of the
za strip.
(See /pkg/rsi/local/libao/phil/was2/wasalfaplotcross.pro)
NAME:
wasalignrec - align the row to the start of a record
SYNTAX: istat=wasalignrec(desc,aligndown=aligndown,scanInd=scanInd,$
recInd=recInd)
ARGS:
desc:{wasdesc} was descriptor returned from wasopen()
KEYWORDS:
aligndown: If the current pointer is in the middle of a
record, the routine will round up to the next record. If the
aligndown keyword is set, then the routine will round down
to the closest record.
RETURNS:
istat: int 1 ok, 0 eof, -1 error.
scanInd: long index into desc.scanI[] for the current position (0 based)
recInd: long the record number within the current scan (0 based)
DESCRIPTION:
The fits data is stored in a fits binary table by row. There are
multiple rows for a single integration (rec). This routine will
guarantee that the next read position will be positioned at the
start of a record.
(See /pkg/rsi/local/libao/phil/was2/wasalignrec.pro)
NAME:
wasclose - close a was file for i/o
SYNTAX: wasclose,desc,all=all
ARGS:
desc: {wasdescr} - descriptor to close (returned by wasopen)
KEYWORDS:
all: if set then close all open descriptors.
DESCRIPTION:
Files opened with wasopen() need to be closed with wasclose() so that
the resources are freed up.
EXAMPLE:
filename='/share/wapp11/wapp1.20040121.a1849.0004.fits'
istat=wasopen(filename,desc)
.. process the data in the file
wasclose,desc .. this closes the file when done with the processing.
(See /pkg/rsi/local/libao/phil/was2/wasclose.pro)
NAME:
wasfnamemk - make a fits filename.
SYNTAX: istat=wasfnamemk(nmpars,filename)
ARGS:
nmpars: {} structure returned from wasfnamepars
RETURNS:
istat: int 1 - fits filename returned in filename
0 - nmpars does not contain a valid filename
DESCRIPTION:
Create a fits filename from the structure returned from wasfnamepars().
Example:
filename='/share/wappdata/wapp.20050807.a2004.0001.fits'
istat=wasfnamepars(filename,nmpars)
; change the sequence number to 0.
nmpars.seqnum=0
; make the new filename
istat=wasfnamemk(nmpars,filename0)
print,filename0
(See /pkg/rsi/local/libao/phil/was2/wasfnamemk.pro)
NAME:
wasfnamepars - parse a fits filename.
SYNTAX: istat=wasfnamepars(filename,nmpars)
ARGS:
filename: string fits filename
RETURNS:
istat: int 1 - fits filename format is ok.
0 - filename is not a standard was fits filename
nmpars: {} return structure with filename parsed into
variables.
DESCRIPTION:
Parse a spectral line was file into its component parts. The
returned structure contains:
help,nmpars,/st
DIR STRING '/share/wappdata/',;dir with trailing '/'
;(or blank if no dir in filename)
WAPP STRING 'wapp'
DATE STRING '20050709'
PROJID STRING 'a2004'
SEQNUM LONG 6
FITS STRING 'fits'
(See /pkg/rsi/local/libao/phil/was2/wasfnamepars.pro)
NAME:
wasftochdr - convert fits hdr to cor header
SYNTAX: istat=wasftochdr(desc,h,hf=hf,nrows=nrows,pol=pol,iscan=iscan)
ARGS:
desc:{wasdesc} was descriptor returned from wasopen()
RETURNS:
istat: int 1 ok, 0 eof, -1 error.
h: {corhdr} correlator header
hf:{washdr} was hdr extension..
nrows: long number of rows to advance desc.curpos if you
want to update the position.
pol[2,nbrds]: long codes the pol type polA=1, polB=2 for each
spectra on each board.
iscan : long index into desc.scanI[] for this scans data.
DESCRIPTION:
Read in fits header for the current group and convert it
to a correlator header. If the file is not positioned at
the start of a group, then move forward to the start of the
next group.
NOTE: this routine does not update the position in the file.
You are left pointing at the input position.
current data being loaded into b1.h from fits header:
tointerimHdr from fitsHdr
--------------------
STD
h.std.hdrMarker
h.std.hdrlen ..
h.std.reclen ..
h.std.sec.xxx ..
h.std.grpTotRecs desc.scanI.nbrds
h.std.time fits.crval5 convert to ast secs
h.std.scannumber fits.SCAN_NUMBER
h.std.grpNum desc.scanI.rowsInRec, curpos,
h.std.grpCurRec 1..nbrds .. used for dop offsets
h.std.azttd fits.ENC_AZIMUTH
h.std.grttd fits.ENC_ELEVATIO
h.std.chttd fits.ENC_ALTEL
h.std.posTmMs fits.ENC_TIME
h.std.grpTotRecs desc.scanI.nbrds
h.std.grpTotRecs desc.scanI.nbrds
--------------------
COR
h.cor.numbrdsused desc.scanI.nbrds
h.cor.numSbcOut desc.scanI.nsbc
h.cor.lagsbcout desc.scanI.nlags
h.cor.boardId desc.scanI.brdNum
h.cor.calon desc.scanI.brdNum
h.cor.caloff desc.scanI.brdNum
h.cor.lagconfig fits.BACKENDMODE with translations..
h.cor.bwnum fits.BANDWID 0=100 MHZ
h.cor.lag0pwrratio fits.TOT_POWER
h.cor.attndb desc.scanI.corattn
h.cor.state.flipped fits.UPPERSB ..1 --> flipped
--------------------
IFLO
h.iflo.if1.st1.rfnum fits.rfnum
h.iflo.if1.st1.ifnum fits.ifnum
h.iflo.if1.st1.hybrdIn fits.hybrid
h.iflo.if1.st1.lo1Hsd ...
h.iflo.if1.st1.lbwLinPol fits.LBWHYB
h.iflo.if1.st1.syn1RfOn ...
h.iflo.if1.st1.syn2RfOn ...
h.iflo.if1.st1.lbFbA ...
h.iflo.if1.st1.lbFbB ...
h.iflo.if1.st1.useFiber ...
h.iflo.if1.st2.calRcvMux ...
h.iflo.if1.st2.calType fits.CALTYPE
h.iflo.if1.st2.ac1PwrSw ...
h.iflo.if1.st2.ac2PwrSw ...
h.iflo.if1.st2.zmNormal ...
h.iflo.if1.st2.sbShClosed...
h.iflo.if1.st2.lo2Hsd ...
h.iflo.if1.lo1 FITS.SYN1
IF2
h.iflo.if2.synfreq FITS.SYNFRQ
h.iflo.if2.st .ifInpFreq .. not in fits header
h.iflo.if2.st4.mixerCfrq .. FITS.MIXER 0,1,2,3 750,1250,1500,1750 MIXER CFR
--------------------
DOP
h.iflo.dop.stat.copCorAllBands ...
h.iflo.dop.stat.velCrdSys fits.CTYPE1
h.iflo.dop.stat.velType ...
h.iflo.dop.velObsProj fits.velocity,fits.RESTFREQ,fits.crval1
velObsProj=(1D + velocity[0]/c - (restFreq[0]/crval1[0]))*c
sign of velocity in fits hdr wrong??
h.iflo.dop.freqOffsets .. force to 0,0,0,0 since bandcfr changes each brd.
h.iflo.dop.freqBCRest .. fits.RESTFREQ
h.iflo.dop.velOrZ .. fits.VELOCITY.. does not check for z.
h.iflo.dop.factor .. fits.crval1/fit.restFreq
--------------------
PNT
h.pnt.stat.grMaster Hardcode to 1.
h.pnt.m.rajcumrd .. warning time stamp not provided.
h.pnt.m.decjcumrd probably close to h.std.posTmMs
h.pnt.r.azttd .. same as in h.std.azttd...
h.pnt.r.grttd
h.pnt.r.chttd
h.pnt.r.agctmstamp
h.pnt.r.secMid .. fit.off_time which come from pnt time stamp
h.pnt.r.geovelproj .. if fitsversion >= 1. fraction of c
h.pnt.r.heliovelproj .. if fitsversion >= 1. fraction of c
--------------------
PROC
h.proc.srcname fits.OBJECT
h.proc.procname fits.OBSMODE with name translation new to old
h.proc.car
onoff car[0] cal fits.OBS_NAME with name translation new to old
spider car[0] stripnum: fits.OBS_NAME translate 1,2,3,4
h.proc.iar
onoff iar[1] fits.OBS_NAME onoff: 1,0 for cal
spider iar[1] secsStrip: fits.exposure*fits.total_pattern
iar[2] recsstrip: fits.total_pattern
iar[3] stripsPattern : hardcoded to 4
h.proc.dar
spider dar[1] azoffset:fits.croff2,fits.rate_ra,fits.enc_time,
fits.rate_dur,fits.crval5 and some computations
spider dar[2] zaoffset:fits.croff3,fits.rate_dec,fits.enc_time,
fits.rate_dur,fits.crval5 and some computations
spider dar[3] rateAz :fits.rate_ra
spider dar[4] rateZa :fits.rate_dec
--------------------
PROC
-
history
25jun04 - if frontend = alfa, force rfnum to be 17
13jul04 - check for eof by row.
18jul04 - added if2.. mixer
09aug04 - added rajcumrd decjcumrd
12aug04 - for spider scans with alfa include the pixel number in iar[5]
taken from the pattern name .
14aug04 - for spider scans load iar[0] with a beamwidth.Use stripLen/6.
20aug04 - added iscan keyword to return to user
26oct04 - version 1 of hf header
lst - same for all
equinox - same for all boards. 2000.0
crval2a - true ra pointing this beam on sky .changes for each beam
crval3a - true dec pointing this beam on sky. changes each beam
crval2b - true az pointing this beam on sky . changes each beam
crval3b - true za pointing this beam on sky . changes each beam
crval2c - raj ant pointing without rx offset. same for all
crval3c - decj ant pointing without rx offset. same for all
crval2g - true galactic l pointing this beam on sky. change each beam
crval3g - true galactic b pointing this beam on sky. change each beam
date_obs- observation date. same for all beams
bandwid - bandwidth hz. changes for each pixel(if not alfa)
crval1v - requested velocity (could change each spectra?)
crpix1v - ref pixel for velocity : different
cunit1v - units of crval1v : same for all
ctyp1v - units for velocity coord system : same for all
specsys - velocity frame : same for all
croff2b - true az off to commanded map center:different
croff3b - true za off to commanded map : different
13nov04 - looks like cr1valv is m/sec. for dop computation i was
using km/sec
13nov04 -
clean up standard header so we can write out the rms files.
need hdrlen,reclen, hdrmarker
28jan05 - changes for fitfiles version .9
cdelt1 can now be neg if flipped. use abs().
crval2a went hours->secs. go back to hours here..
crval2c went hours->secs. go back to hours here..
crval5 went hours->secs. go back to hours here..
crval3b went za->elevation. back to za
ctype1,specsysv values for heliocent, geocent changed.
total_pattern-> totsubscan.. use colI index
encTm changed to utc seconds.. back to ast millisecs
off_time switched to utc.. back to ast.
change name ctype1 to specsys.. as a variable here..
02feb05 - changes for fitfiles version .92
0. use desc.fitsVersion instead of crval2a -1 to decide on versionHf
change version -> versionHf.. just local variable
1. check where crval2,3 comes from
2. equinox changes meaning .92.. make same as before
3. use colI for crval2a,3a now
4. lst -> secs .. back to hours
5. croff2,3,2b,3b.. now come from colI.
croff2 also went hours to degrees. go back..
6. colI.raJ,decJ got renames to reqRaJ,reqDecJ
--> NOTE hf.crval2c,3c was radians. switch back to
hr,deg. This was same as pnt.h.r.raJCumRd
7. cunit1v now from desc.coli.cunit1v,
8. ctype1v now comes from coli.ctype1v
9. hf.crpix1v set to -1 since it was garbage and version 1.0
has deleted it.
10. include heliocentric, geocentric if fitsVers >= 1.
30apr05 -
the 28jan05 encTm change multiplied the time in secs
by .001 to get millisecs. It should have multiplied by
1000.
06feb10 -
load hdr.std.date yyyydddd .. this had not been used
need it for 2010 since ydddxxxxx from scan is not confused
with the yr
24mar11 -
if fits version >= 1.0 the use vel_bary for h.dop.velobsproj
also update corfrq to use this value when outputing vel array
(See /pkg/rsi/local/libao/phil/was2/wasftochdr.pro)
NAME:
wasget - read a group of was data records.
SYNTAX: istat=wasget(desc,b,scan=scan,han=han,hdronly=hdronly,$
stktospc=stktospc)
ARGS:
desc:{wasdesc} was descriptor returned from wasopen()
hdronly: If set then return the b descriptor with only the
headers. No data is returned. The datastruture will not
contain the b.b1.d[nlags,npol] entry.
RETURNS:
istat: int 1 ok, 0 eof, -1 error.
b: {wasget} data structure holding data. If the hdronly keyword is
set then the b datastructure will only contain the
headers.
DESCRIPTION:
This is the lowlevel routine that reads the data from the fits file.
This routine in normally not called by users. The user interface to the
data in the file is via corget(). corget() will call this routine
automatically when it is passed a wasDescriptor rather than a
logical unit number(lun).
18jan04 - added h.dop. set it so that it is doppler update
each sbc even if it is not being done. We will load the
correct frequency, velocity into the header so that this
will be true.
19jan04 - force returned data to always be in increasing freq order.
for now key off of flipped keyword (until cdelta1 is fixed).
02feb04 - switch to use wasftochdr() to get/convert the header.
14jul04 - if pol data then acf's, do not flip data
20aug04 - added iscan call to wasftochdr.
use indar to return the data arrays independant of the order
they are stored on disc.
06sep04 - added hdronly keyword
12dec04 - add option to convert stokes acf to spectra
(See /pkg/rsi/local/libao/phil/was2/wasget.pro)
NAME:
washdr - read a was fits header
SYNTAX: istat=washdr(desc,h,scan=scan,rec=rec,numhdr=numhdr,inc=inc)
ARGS:
desc:{wasdesc} was descriptor returned from wasopen()
scan: long scan number default is current position in file
rec: long record number of scan, default is current record
inc: if set then increment position in file after reading
the default is to do do no increment.
numhdr: number of headers to read. default is 1
RETURNS:
istat: int 1 ok, 0 eof,-1 bad (could not find scan or rec)
h: {wasfhdr} was fits header
DESCRIPTION:
This routine will read the fits headers on disc into a data structure.
By default the header from the current row position is input. Multiple
rows can be read with the numhdr keyword. You can position in the file
before reading by using the scan, rec keywords. After the i/o the file
is left positioned at the original position (on entry to this routine). The
inc keyword will position the file after the last header read (be careful
since integrations or records may contain multiple rows in the file).
Remember that a single integration (1 second) is made up of multiple
headers or rows. For alfa it could be 8 pixels*2pol=16 headers/rec.
WARNING:
This routine now uses mrdfits with a row range. It reads the header and
spectral data for the requested number of headers in one call. Before
returning it deletes the spectral data. So you need to be careful about
reading a large number of headers (say 1000's) at once. As a rule of thumb,
try and keep the number of headers read in 1 call to less than the number
of rows in a typical scan (say 300*16). It is ok to create large arrays of
these headers after the call, since the spectral data gets removed.
(See /pkg/rsi/local/libao/phil/was2/washdr.pro)
NAME:
waslist - list contents of a was data file
SYNTAX: waslist,lun,recperpage
ARGS:
desc: {wasdesc} was descriptor returned by wasopen
recperpage: lines per page before wait for response. def:30
DESCRIPTION:
List the hdr contents of a fits data file. A single line summary is
printed for each scan found in the file. The routine will print 30 lines
at a time before prompting the user to continue. This can be changed with
the recperpage keyword.
The listing contains:
SOURCE SCAN RA DEC C GRPS NIF NLAG PatNm TopFrq RCV
Where :
label : fits keyword
SOURCE: OBJECT
RA: CRVAL2
DEC: CRVAL3
C: ? coordinate system for ra,dec. not yet implemented
GRPS: OBS_NUM number of integrations in scan. Use last obs_num of scan
and switch to make it 1 based.
NIF: NIFS number of IFs this integration 1,2, 4 for stokes.
NLAG: LAGS_IN number of channels in spectrum.
PatNm: PATTERN_NAME name of dataking pattern used to take the data.
TopFrq: CRVAL1 topocentric frequency at reference pixel (Mhz).
Rcv: RFNUM id number for reciever (lbw is 5).
NOTE:
Listing the file does not change the position of where the next read will
occur in the file.
(See /pkg/rsi/local/libao/phil/was2/waslist.pro)
NAME:
wasopen - open a was fits files for i/o
SYNTAX: istat=wasopen(filename,desc)
ARGS:
filename: string filename to open
KEYWORDS:
all: if the keyword is set, open all files that were taken at
this time. In this case filename should be the name
of one of the files.
RETURNS:
istat: int 0 couldn't open file
1 file opened successfully
desc: {wasdescr} - descriptor holding info for file i/o.
DESCRIPTION:
Open a was (wapp) spectral line fits file. Load
the descriptor with the scan info for the entire file. This
descriptor will be passed to the wasxxx corxxx routines to do the
file i/o. This descriptor replaces the standard lun that is
used for the interim correlator data.
The descriptor contains:
help,desc,/st
LUN LONG 0 .. idl lun
FILENAME STRING '/share/wapp11/a9999_wapp1_0027.fits' ..filename
TOTSCANS LONG 1 .. total scans in file (obs scans not pattern)
TOTRECS LONG 1 .. total recs (integ) in file
TOTROWS LONG 7216 .. total number of rows in bintable
CURPOS LONG 1 .. position for next read 0 based (row-1)
SCANIND LONG 1 .. scan index for next read 0 based
colI struct .. column number in table for various info
onlI struct .. info to process online files.
onLine long .. true if file is growing (hole exists)
fitsversion float 1 .. fits file version number
SCANI STRUCT Array[totscans] .. scan info
------------------------------
help,desc.scanI,/st
SCAN LONG 327939505 .. this scan number
SCANpat LONG 327939505 .. pattern scan number updates each pattern
nbrds long 1 .. number of wapps used
nlags intarr(MAXBRDS) .. lags sbc per board
brdNum bytarr(MAXBRDS) .. brd number 1..7
nsbc bytarr(MAXBRDS) .. number sbc this board 1,2,4
level bytarr(MAXBRDS) .. 3 or 9 level
pol bytarr(4,MAXBRDS) .. pol id for each sbc of each board
corrattn bytarr(4,MAXBRDS) .. 0 to 15 each pol each board
1,2,3,4 or 0 not used.
rowsinrec long 0 .. rows in 1 rec
rowsinscan LONG 0 .. number of recs (rows) this scan
multiple recs per observation.
recsInScan long 0 .. records in scan
cumRecStart long .. cumulative rec number in file start this scn
rowStartInd long 0 .. rowIndex for start of this scan
cumRecStartInd lONG 0 .. cum rec index for start of this scan
-------------------------------
help,desc.colI .. column numbers for various info
scan long .. col that scan info in
grp long .. col that scan info in
az long .. col for az encoder
el long .. col for main elevatio encoder
elAlt long .. col for alternate za encoder
enctm long .. col for the encoder time.
patnam long .. col for the pattern name.
flip long .. col for the flip spectra
WAPPMASK LONG 65
CTYPE1 LONG 20
JD LONG 21
RESTFREQ LONG 14
VELOCITY LONG 15
EXAMPLE:
filenm='/share/wapp11/wapp1.20040118.a1849.0010.fits'
istat=wasopen(filenm,desc)
waslist,desc ; list scan summary
istat=corget(desc,b) ; read a record
corplot,b ; plot it
istat=corinpscan(desc,b,scan=401864155,maxrecs=600) ; input a scan
wasclose,desc ; when done.
MOD HISTORY:
03feb04: added patNm to scanI.
26oct04: added coli.crval2a
03dec04: pol mode input_id, crval4 wrong.. patch so input_id
works.
28jan05: changes for version .9 cimafits
1. grab fitsVersion stuff in desc.
2. projId fitsVersoin .9 comes from projid was obs_id
3. cdelt1 is now signed. (see wasftochdr)
4. crval2a,crval2c hours -> seconds.
5. crval5a hours to secs
6. crval2b -> azimuth, crval3b -> elevation
7. curTol -> curErr
8. specsys-> specsysv, changed names of velocity coord sys.
9. obs_name -> scantype..
10. pattern_scan-> pattern_id
11. scan_number -> scan_id
12. pattern_number -> subscan
13. total_pattern -> total_subscans
14. don't bother to read in grpnum here.. it's not used
02feb05 < pjp004 fitsVersion .92
For now i will keep the outputs in .hf same as before
when things stabilize i'll update them to be the same defs as the
fits file.
There are 2 versions.. desc.fitsVersion which is the fits file
version, and hf.version which is the version of the hf header.
1. new desc.fitsVersion: first two made up by me
0.0 - before changes 26oct04.. no crval2a,2b,2c,...etc
0.5 - 26oct04 to 3feb05.. crval2a,2b,2c... actual
these are actually in the header
.9 - not really released..
.92- 03feb05 to .. crval2a-> crval2 etc.. t
2. use desc.fitsVersion ge .5 rather than colI.crval2a > -1 to test
for 24oct04 changes
3. check for where equinox comes from. keep same as old format
4. crval2a,3a got switched .92. switch back for now.
5. crval2c,3c -> req_raj,req_decj ..switch back for now..
this goes via raJ,decJ
6. rajbmNm, coli.rajbm .. not used get rid of it.. was just crval2a
7. croff2,3 2b,3b got moved to different names. move back.
8. in desc. change colI.raj,decj to reqRaJ reqDecJ
9. velocity has now moved to req_vel. there is also a
req_vel_unit to tell if it is m/s or z. This needs to be added
later.
10. specsysv now back to specsys.. get rid of specsys
11. cunit1v -> req_vel_unit. create colI. and go backto cunit1v
12. ctype1v -> req_vel_type.. include colI.ctype1v..
04feb05 - add totCols to desc. this is the total number of cols
in a row for this file
30may05 - few of the print,errmsg lines had print,errms .. corrected..
probably from a global edit..
(See /pkg/rsi/local/libao/phil/was2/wasopen.pro)
NAME:
waspos - position to a scan/record in a was fits file
SYNTAX: istat=waspos(desc,scan,rec)
ARGS:
desc: {wasdesc} .. was descriptor
scan: long.. scan number 0--> current scan or whateverr scan fits
full scan number --> position to scan
rec: long grp number within scan.
0 or not included--> next record available
number --> record of current scan
RETURNS: 1 positioned ok
-2 requested scan/rec not found
DESCRIPTION:
Position to a scan/record in a was fits file. The algorithm is:
1. position to start of scannumber. If scannumber is zero then remain
in current scan.
2. if record is provided then position to record within current scan. If
record is not provided then position to next record in file.
(See /pkg/rsi/local/libao/phil/was2/waspos.pro)
NAME:
wasprojfiles - find the files belonging to a project id
SYNTAX: istat=wasprojfiles(proj,fileInfo,yymmdd1=yymmdd1,yymmdd2=yymmdd2,$
minsize=minsize,dir=dir)
ARGS:
proj: string proj name to search for
KEYWORDS:
yymmdd1: long limit files to those starting on or after this date
(yymmdd1 included)
yymmdd2: long limit files to those starting on or before this date
(yymmdd2 included)
minsize: long minimum size in bytes for file to return. default is
100000 bytes. file less than this usually have no
data (just a header).
dir : string directory name to search instead of /proj/projid..
handy to usr dir=/share/wappdata
RETURNS:
istat: number of files found
fileinfo[istat]: array of file info structures containing the name
and size of the file
DESCRIPTION:
Search through the wapp fits directories looking for files that
belong to a particular project. Return an array of stuctures containing
the filename and file size.
(See /pkg/rsi/local/libao/phil/was2/wasprojfiles.pro)
NAME:
waspwr - return power information for a number of recs
SYNTAX: nrecs=waspwr(desc,reqrecs,pwra,lasthdr)
ARGS:
desc - descriptor opened via wasopen.
reqrecs - requested records to return
RETURNS:
pwra - returns an array pwra[nrecs] of {corpwr} struct
nrecs - number of recs found, 0 if at eof, -1 if hdr alignment/io error
DESCRIPTION:
Return the total power information for the requested number of
records. The data is returned in the array pwra. Each element of the
array contains:
pwra[i].scan - scan number
pwra[i].rec - record number
pwra[i].time - seconds from midnight end of record.
pwra[i].nbrds- number of boards in use
pwra[i].az - az (deg) end of this record.
pwra[i].za - za (deg) end of this record.
pwra[i].azErr- az (asecs great circle) end of this record.
pwra[i].zaErr- za (asecs great circle) end of this record.
pwra[i].pwr[2,4] - total power info. first index in pol1,pol2
2nd index are 4 correlator boards.
There will only be valid data in the first pwra[i].nbrds entries of
pwra.
In pwra[i].[i,j], i=0,1 will be pola, polb if two polarizations were
recorded in the board. If only one polarization was recorded on the
board, then i=0 holds the data (either pola,polB) and i=1 has no data.
(See /pkg/rsi/local/libao/phil/was2/waspwr.pro)
NAME:
wasscanfiles - get info on each scan of requested files
SYNTAX: istat=wasscanfiles(projId,scanI,yymmdd1=yymmdd1,yymmdd2=yymmdd2,$
minsize=minsize,dir=dir,verb=verb)
ARGS:
proj: string proj name to search for
KEYWORDS:
yymmdd1: long limit files to those starting on or after this date
(yymmdd1 included)
yymmdd2: long limit files to those starting on or before this date
(yymmdd2 included)
minsize: long minimum size in bytes for file to return. default is
100000 bytes. file less than this usually have no
data (just a header).
dir : string directory name to search instead of /proj/projid..
handy to usr dir=/share/wappdata
verb : if set the print out each scaninfo as it is processed
RETURNS:
nscans: number of scans found
scanInfo[istat]: array of scanInfo structures (see below).
DESCRIPTION:
Search through the wapp fits directories looking for files that
belong to a particular project. For each file found scan the file
looking for info on each scan in the file. Use yymmdd1,2 to limit the
search to a date range.
By default this searches the offline /proj/projid directory.
If you want to search the online files, set dir='/share/wappdata' in the
call.
For each can found, scanI[] contains:
FNAME STRING '/share/wappdata/wapp.20081017.a2350.0000.fits'
BNAME STRING 'wapp.20081017.a2350.0000.fits'
FSIZE ULONG 148424896
SCAN LONG 829100053
RCVNUM LONG 9
RECTYPE LONG 3
NUMRECS LONG 60
NUMFRQ LONG 8
FREQ FLOAT Array[8]
JULDAY DOUBLE 2454756.276
SRCNAME STRING 'CRL618BP'
PROCNAME STRING 'onoff'
OBSNAME STRING 'ON'
(See /pkg/rsi/local/libao/phil/was2/wasscanfiles.pro)