Using The IDL DataMap Library With New Format Files
Overview
This tutorial shows you how to use the datamap.pro library to work with fitacf and rawacf files. Although the SuperDARN IDL libraries contain routines for reading and writing these files, you can also use the datamap.pro library to do this directly, and in some cases this may be a simpler approach.
This tutorial assumes that you already know how to work with DataMap files and are familiar with the concepts involved. The DataMap format is documentedhere, and a tutorial on using IDL to work with DataMap files is here. It also assumes that you know the variables stored in rawacf and fitacf files. The RFC#0008 describes the rawacf format and RFC#0009 describes the fitacf forma
Reading fitacf Files
The example program presented below does the simple task of reading records from a fitacf file and printing out the velocity measurements on the console:
pro readfitacf
; Open input file for reading
openr,unit,'test.fitacf',/get_lun
while DataMapRead(unit,sclvec,arrvec) ne -1 do begin
if (n_elements(sclvec) ne 0) then begin
yrid=DataMapFindScalar('time.yr',2,sclvec)
moid=DataMapFindScalar('time.mo',2,sclvec)
dyid=DataMapFindScalar('time.dy',2,sclvec)
hrid=DataMapFindScalar('time.hr',2,sclvec)
mtid=DataMapFindScalar('time.mt',2,sclvec)
scid=DataMapFindScalar('time.sc',2,sclvec)
usid=DataMapFindScalar('time.us',2,sclvec)
nrangid=DataMapFindScalar('nrang',2,sclvec)
endif
if (n_elements(arrvec) ne 0) then begin
slistid=DataMapFindArray('slist',2,arrvec)
vid=DataMapFindArray('v',4,arrvec)
endif
if (yrid eq -1) or (moid eq -1) or (dyid eq -1) or (hrid eq -1) $
or (mtid eq -1) or (scid eq -1) or (usid eq -1) or (nrangid eq -1) $
or (slistid eq -1) or (vid eq -1) then begin
print,'File is in the wrong format!'
stop
endif
; get the scalar values
yr=*sclvec[yrid].ptr
mo=*sclvec[moid].ptr
dy=*sclvec[dyid].ptr
hr=*sclvec[hrid].ptr
mt=*sclvec[mtid].ptr
sc=*sclvec[scid].ptr
us=*sclvec[usid].ptr
nrang=*sclvec[nrangid].ptr
; get the list of ranges
slist=*arrvec[slistid].ptr
v=fltarr(nrang)
; get the velocities and put them in the right elements of v
v[slist]=*arrvec[vid].ptr
print, yr,mo,dy,hr,mt,sc,us
print, nrang
print, v
s=DataMapFreeScalar(sclvec)
s=DataMapFreeArray(arrvec)
endwhile
free_lun,outp
end |
Download this program here:readfitacf.pro
The program extracts the velocity information and populates the array v. The problem with fitacf files is that depending on whether a good fit was obtained, a range may not be stored in the file. The array variable slist contains a list of the ranges that were stored. To correctly populate the velocity array we use the following:
slist=*arrvec[slistid].ptr
v=fltarr(nrang)
v[slist]=*arrvec[vid].ptr
|
Reading and Writing rawacf Files
The example program presented below reads records from a rawacf file, plotsthe ACF of the first valid range, scales the ACF's and writes them to an new rawacf file.
pro readrawacf
; Open input file for reading
sclname=['nrang','mplgs']
arrname=['slist','acfd']
scltype=[2,2]
arrtype=[2,4]
openr,inp,'input.rawacf',/get_lun
openw,out,'output.rawacf',/get_lun
while DataMapRead(inp,sclvec,arrvec) ne -1 do begin
sclid=[-1,-1]
arrid=[-1,-1]
if (n_elements(sclvec) ne 0) then begin
for n=0,n_elements(sclname)-1 do $
sclid[n]=DataMapFindScalar(sclname[n],scltype[n],sclvec)
endif
if (n_elements(arrvec) ne 0) then begin
for n=0,n_elements(arrname)-1 do $
arrid[n]=DataMapFindArray(arrname[n],arrtype[n],arrvec)
endif
q=where(sclid eq -1,count)
if (count ne 0) then begin
print,'File is in the wrong format!'
stop
endif
q=where(arrid eq -1,count)
if (count ne 0) then begin
print,'File is in the wrong format!'
stop
endif
nrang=*sclvec[sclid[0]].ptr
mplgs=*sclvec[sclid[1]].ptr
; get the list of ranges
slist=*arrvec[arrid[0]].ptr
acfd=fltarr(2,mplgs,nrang)
; get the velocities and put them in the right elements of v
acfd[*,*,slist]=*arrvec[arrid[1]].ptr
rng=slist[0]
plot,acfd[0,*,rng]
oplot, acfd[1,*,rng]
acfd=0.8*acfd
*arrvec[arrid[1]].ptr=acfd[*,*,slist]
s=DataMapWrite(out,sclvec,arrvec)
if (s eq -1) then begin
print, 'Error writing file'
stop
endif
s=DataMapFreeScalar(sclvec)
s=DataMapFreeArray(arrvec)
endwhile
free_lun,inpp
free_lun,outp
end
|
Download this program here:readrawacf.pro
This program uses a slightly simpler method of determing that the file contains the required information. As with the fitacf file, the variable slist contains the list of ranges that contain data. To correctly populate the velocity array we use the following:
slist=*arrvec[arrid[0]].ptr
acfd=fltarr(2,mplgs,nrang)
acfd[*,*,slist]=*arrvec[arrid[1]].ptr
|
When we have finished processing the data, we must perform the inverse mapping before writing the output file:
acfd=0.8*acfd
*arrvec[arrid[1]].ptr=acfd[*,*,slist]
s=DataMapWrite(out,sclvec,arrvec)
|
|