;+ ; Contains the hfr_data_timing function ; ; :Author: ; Baptiste Cecconi ; ; :History: ; 2009/05/31: Created ; ; 2009/05/31: Last Edit ;- ; ;+ ; hfr_data_timing is a function that <behavior desc here> ; ; :Uses: ; read_data_opmode ; ; :Returns: ; <return desc here> ; ; :Params: ; dd: in, required, type=sometype ; A parameter named dd ; hh: in, required, type=sometype ; A parameter named hh ; ; :Keywords: ; n2_file: in, optional, type=sometype ; A keyword named n2_file ; lis_file: in, optional, type=sometype ; A keyword named lis_file ; seconds_of_day: in, optional, type=sometype ; A keyword named seconds_of_day ; verbose: in, optional, type=sometype ; A keyword named verbose ;- function HFR_data_timing,dd,hh,n2_file=n2_file,lis_file=lis_file,$ seconds_of_day=seconds_of_day,verbose=verbose ; ------------------------------------------------------------------------------ ; Preliminary Constant Timings ; ------------------------------------------------------------------------------ tABC=[ [[273,264,242],[364,365.5,356],[399,395,378],[896,892,864]], $ [[546,530,504],[728,733,737],[798,792,782],[1690,1680,1660]], $ [[1089,1056,1008],[1456,1464.5,1474],[1596,1580,1560],[3280,3260,3220]], $ [[2180,2110,2003],[2905,2925,2945],[3192,3160,3120],[6420,6400,6340]] ] tABC=float(tABC) tH1_1=[[21.2,24.5,25.8,27.4,56.8],[36.4,42.8,45.7,49,98], $ [66.8,80,85.9,91.8,181],[128.3,154,165.5,178,347.4]] tH1_2=[[20.1,23.1,24.6,26.2,50.4],[34.7,41.9,41.45,47.5,90.2], $ [65.5,78.2,84.1,91.2,171.7],[125.9,153.6,163.3,175.7,336.7]] tH2_1=[[12.5,14.2,14.75,15.6,34.9],[20.2,23.5,24.9,26.4,55.5], $ [35.3,42,44.9,47.6,96.1],[65.7,79,84.8,90.5,178]] tH2_2=[[12.3,13.9,14.75,15.2,29.6],[20.3,23.4,25,26.2,50.3], $ [35.2,41.4,44.3,47.3,90.4],[66,78,84.5,89.5,172]] ; ------------------------------------------------------------------------------ ; ------------------------------------------------------------------------------ ; Checking input format ; ------------------------------------------------------------------------------ if keyword_set(verbose) then verbose=1b else verbose=0b if keyword_set(n2_file) then n2_in=1 else n2_in=0 if keyword_set(lis_file) then lis_in=1 else lis_in=0 if n2_in then begin dd = long(strmid(n2_file,9,7,/rev)) hh = fix(strmid(n2_file,1,/rev)) endif dd1 = dd hh1 = hh dd2 = dd hh2 = hh+1 if ~n2_in then begin p=make_file_list(dd1,hh1,dd2,hh2,level='n2') if ptr_valid(p) then begin n2_file = *p ptr_free,p endif else begin message,/info,'No N2 file available for this period.' message,/info,'Aborting.' return,-1 endelse endif if ~lis_in then begin p = make_file_list(dd1, hh1, dd2, hh2, level='lis') if ptr_valid(p) then begin lis_file = *p ptr_free,p endif else begin message,/info,'No LIS file available for this period.' message,/info,'Aborting.' return,-1 endelse endif ; ------------------------------------------------------------------------------ ; Loading Data ; ------------------------------------------------------------------------------ message,/info,'Loading N2 data...' read_data_binary,n2_file,n2,level='n2' message,/info,'Loading OpMode data...' read_data_opmode,dd1,hh1,dd2,hh2,opmode,time_list=time_list sweep_times = uniq_list(n2.t97,rev=rti) n_sweep = n_elements(sweep_times) sweep_nsample = lonarr(n_sweep) for i=0l,n_sweep-1l do sweep_nsample(i) = rti(i+1l)-rti(i) if keyword_set(seconds_of_day) then begin accurate_t97 = (n2.t97 mod 1.d0)*86400.d0 endif else begin accurate_t97 = n2.t97 endelse n_opmode = n_elements(opmode) n_sweep_filled = 0l n_sweep_errors = 0l for iopmode=0,n_opmode-1 do begin if verbose then begin message,/info,'----------------------------------------------------------------------------------------------------------------------' message,/info,'Mode: '+opmode(iopmode).lis message,/info,'----------------------------------------------------------------------------------------------------------------------' endif ABC = opmode(iopmode).abc HF1 = opmode(iopmode).hf1 HF2 = opmode(iopmode).hf2 nABC = ABC.nsteps * ABC.nfreqs * (ABC.df+1) nABC_rc = ABC.rc * nABC nHF1 = HF1.nsteps * HF1.nfreqs * (HF1.df+1) nHF1_rc = HF1.rc * nHF1 nHF2 = HF2.nsteps * HF2.nfreqs * (HF2.df+1) nHF2_rc = HF2.rc * nHF2 n_timing = opmode(iopmode).rc*(nABC_rc + nHF1_rc + nHF2_rc) if verbose then begin message,/info,' Global repeat count = '+string(opmode(iopmode).rc) message,/info,' Number of Sample in Sweep = '+string(n_timing) message,/info,'---- ABC' message,/info,' RepCnt = '+string(ABC.rc) message,/info,' Nsteps = '+string(ABC.nsteps) message,/info,' Nfreqs = '+string(ABC.nfreqs) message,/info,' IntegT = '+string(ABC.integ) message,/info,' DfMode = '+(['no','yes'])(ABC.df) message,/info,' NSampl = '+string(nABC_rc) message,/info,'---- HF1' message,/info,' RepCnt = '+string(HF1.rc) message,/info,' Nsteps = '+string(HF1.nsteps) message,/info,' Nfreqs = '+string(HF1.nfreqs) message,/info,' IntegT = '+string(HF1.integ) message,/info,' DfMode = '+(['no','yes'])(HF1.df) message,/info,' NSampl = '+string(nHF1_rc) message,/info,'---- HF2' message,/info,' RepCnt = '+string(HF2.rc) message,/info,' Nsteps = '+string(HF2.nsteps) message,/info,' Nfreqs = '+string(HF2.nfreqs) message,/info,' IntegT = '+string(HF2.integ) message,/info,' DfMode = '+(['no','yes'])(HF2.df) message,/info,' NSampl = '+string(nHF2_rc) message,/info,'----------------------------------------------------------------------------------------------------------------------' message,/info,' Building timing...' endif sweep_timing = dblarr(n_timing) i0 = 0l t0 = 0. for orc=0,opmode(iopmode).rc-1 do begin for irc=0,ABC.rc-1 do begin m=long(alog(ABC.integ/125.)/alog(2.)+0.5) j=long(alog(ABC.nfreqs/8.)/alog(2.)+0.5) if ABC.nant eq 1 then k=0 if ABC.nant eq 2 and (ABC.auto eq 1 or ABC.cross eq 1) then k=1 if ABC.nant eq 2 and (ABC.auto eq 1 and ABC.cross eq 1) then k=2 if ABC.df eq 1 then k=3 tmp_sweep_timing = (rebin(reform(tABC(j,k,m)*dindgen(ABC.nsteps)/3.,1,1,ABC.nsteps),ABC.df+1,ABC.nfreqs,ABC.nsteps))(*) i1 = i0+n_elements(tmp_sweep_timing) sweep_timing(i0:i1-1) = t0 + tmp_sweep_timing i0 = i1 t0 += tABC(j,k,m) endfor for irc=0,HF1.rc-1 do begin m=long(alog(HF1.integ/20.)/alog(2.)+0.5) if HF1.nant eq 1 then k=0 if HF1.nant eq 2 and (HF1.auto eq 0 and HF1.cross eq 0) then k=1 if HF1.nant eq 2 and (HF1.auto eq 1 or HF1.cross eq 1) then k=2 if HF1.nant eq 2 and (HF1.auto eq 1 and HF1.cross eq 1) then k=3 if HF1.df eq 1 then k=4 tmp_sweep_timing = fltarr(HF1.df+1,HF1.nfreqs) + 5.d-3 + (tH1_1(k,m) - tH1_2(k,m)) if HF1.df eq 1 then tmp_sweep_timing(1,*) = tmp_sweep_timing(1,*) + (tH1_2(k,m)-5.e-3)/2. tmp_sweep_timing = tmp_sweep_timing(*) i1 = i0+n_elements(tmp_sweep_timing) sweep_timing(i0:i1-1) = t0 + tmp_sweep_timing i0 = i1 t0 += tH1_1(k,m) for istep = 0,HF1.nsteps-2 do begin tmp_sweep_timing = fltarr(HF1.df+1,HF1.nfreqs) + 5.d-3 if HF1.df eq 1 then tmp_sweep_timing(1,*) = tmp_sweep_timing(1,*) + (tH1_2(k,m)-5.e-3)/2. tmp_sweep_timing = tmp_sweep_timing(*) i1 = i0+n_elements(tmp_sweep_timing) sweep_timing(i0:i1-1) = t0 + tmp_sweep_timing i0 = i1 t0 += tH1_2(k,m) endfor endfor for irc=0,HF2.rc-1 do begin m=long(alog(HF2.integ/10.)/alog(2.)+0.5) if HF2.nant eq 1 then k=0 if HF2.nant eq 2 and (HF2.auto eq 0 and HF2.cross eq 0) then k=1 if HF2.nant eq 2 and (HF2.auto eq 1 or HF2.cross eq 1) then k=2 if HF2.nant eq 2 and (HF2.auto eq 1 and HF2.cross eq 1) then k=3 if HF2.df eq 1 then k=4 tmp_sweep_timing = fltarr(HF2.df+1,HF2.nfreqs) + 5.d-3 + (tH2_1(k,m) - tH2_2(k,m)) if HF2.df eq 1 then tmp_sweep_timing(1,*) = tmp_sweep_timing(1,*) + (tH2_2(k,m)-5.e-3)/2. tmp_sweep_timing = tmp_sweep_timing(*) i1 = i0+n_elements(tmp_sweep_timing) sweep_timing(i0:i1-1) = t0 + tmp_sweep_timing i0 = i1 t0 += tH2_1(k,m) for istep = 0,HF2.nsteps-2 do begin tmp_sweep_timing = fltarr(HF2.df+1,HF2.nfreqs) + 5.d-3 if HF2.df eq 1 then tmp_sweep_timing(1,*) = tmp_sweep_timing(1,*) + (tH2_2(k,m)-5.e-3)/2. tmp_sweep_timing = tmp_sweep_timing(*) i1 = i0+n_elements(tmp_sweep_timing) sweep_timing(i0:i1-1) = t0 + tmp_sweep_timing i0 = i1 t0 += tH2_2(k,m) endfor endfor endfor if keyword_set(seconds_of_day) then sweep_timing /=1.d3 else sweep_timing /=86400.d3 if verbose then begin message,/info,' Filling timing data...' message,/info,' - sweep# n:data mode' endif nfill = 0l nerrs = 0l wopmode = where(time_list.opmode_index eq iopmode, cnt_opmode) for k_opmode=0,cnt_opmode-1 do begin wsweep = where(sweep_times ge time_list(wopmode(k_opmode)).t97_in and $ sweep_times lt time_list(wopmode(k_opmode)).t97_out, cnt_sweep) for k_sweep=0,cnt_sweep-1 do begin if verbose then message,/info,string(format='(" ",I8.8," ",I3.3," ",I3.3)',wsweep(k_sweep),sweep_nsample(wsweep(k_sweep)),i0) if sweep_nsample(wsweep(k_sweep)) ne i0 then begin nerrs++ if verobose then message,/info,'Warning: computed timing not consistent with data !' endif else begin accurate_t97(rti(rti(wsweep(k_sweep)):rti(wsweep(k_sweep)+1)-1)) += sweep_timing nfill++ endelse endfor endfor if verbose then begin if (nfill+nerrs) eq 0 then message,/info,' no data found for this mode.' else $ message,/info,' --- '+string(nfill)+' sweeps treated ('+string(nerrs)+' errors)' endif n_sweep_filled += nfill n_sweep_errors += nerrs endfor if verbose then begin message,/info,'----------------------------------------------------------------------------------------------------------------------' message,/info,' Final report: '+string(n_sweep_filled)+'/'+string(n_sweep)+' sweep treated ('+string(n_sweep_errors)+' errors)' message,/info,'----------------------------------------------------------------------------------------------------------------------' endif return, accurate_t97 end