;+ ; NAME: ; smei_hdr_get ; PURPOSE: ; Reads Fits binary tables containing all SMEI frame headers ; CATEGORY: ; ucsd/camera/idl/frm ; CALLING SEQUENCE: PRO smei_hdr_get, tt , $ source = source , $ destination = destination , $ camera = camera , $ mode = mode , $ get = get , $ time = time , $ hdr = hdr , $ one = one , $ two = two , $ three = three , $ four = four , $ five = five , $ six = six , $ seven = seven , $ dbname = dbname , $ dbsource = dbsource , $ count = count , $ silent = silent , $ exact = exact ;_extra = _extra ; INPUTS: ; tt array[2]; standard time structure ; indicates time range for which SMEI frame are to ; be processed ; OPTIONAL INPUT PARAMETERS: ; source=source scalar; type: string ; either a single Fits file containing frame headers in binary ; table form, or a directory where these files are located. ; If a directory is specified then the Fits files MUST contain ; frame headers organized in daily files ; destination=destination ; scalar; type: string ; only used if /write or /overwrite are set ; destination directory for Fits binary table file ; camera=camera scalar; type: integer (1,2,3) ; camera for which headers are to be extracted ; If not specified, camera 1 is used. ; mode=mode scalar; type: integer (0,1,2); default: none ; only frames for specified mode are extracted ; get=get scalar or array; type: string ; list of tag names of the {href=smei_frm_hdr=} structure ; to be extracted in the one,..,seven keywords ; (to get a list of valid entry, type 'smei_hdr_get' at ; the IDL prompt). ; dbsource=dbsource ; only used if output arg 'dbname' is requested ; passed to smei_filepath ; scalar; type: string; default: SMEIDB? ; location of SMEI data frames (usually SMEIDB? or SMEIDC?) ; OUTPUTS: ; time=time array; type: standard time structure ; OPTIONAL OUTPUT PARAMETERS: ; count=count scalar; type: integer ; if /write or /owerwrite SET: ; number of headers written into Fits binary table (all cameras ; combined, if more than one camera was processed). ; if /write and /overwrite NOT set: ; number of headers extracted from Fits binary tables ; hdr=hdr complete header ; ; one=one Extracted keywords in the order specified in 'get' ; two=two ; three=three ; four=four ; five=five ; six=six ; seven=seven ; ; dbname array; type: string ; list of fully-qualified frame file name in SMEI database ; specified in 'dbname'. ; INCLUDE: @compile_opt.pro ; On error, return to caller ; EXTERNAL: ; smei_frm_hdr ; CALLS: ; InitVar, IsType, CheckDir, IsTime, TimeGet, TimeSet ; TimeUnit, TimeOp, destroyvar, TimeLimits, hide_env, smei_filename ; smei_filepath ; SEE ALSO: ; smei_hdr_make ; PROCEDURE: ; MODIFICATION HISTORY: ; JUN-2005, Paul Hick (UCSD/CASS) ; FEB-2007, Paul Hick (UCSD/CASS) ; Bug fix(?). Variable mode was used in two different roles ; when dbname was set. ; SEP-2008, Paul Hick (UCSD/CASS; pphick@ucsd.edu) ; Added check for presence of requested "get" keyword. ; If not present, then an array of NaNs is returned. ;- InitVar, write , /key InitVar, overwrite, /key InitVar, silent , 0 InitVar, exact , /key time_present = arg_present(time ) dbname_present= arg_present(dbname) hdr_present = arg_present(hdr ) one_present = arg_present(one ) two_present = arg_present(two ) three_present = arg_present(three) four_present = arg_present(four ) five_present = arg_present(five ) six_present = arg_present(six ) seven_present = arg_present(seven) uday = TimeUnit(/day) usec = TimeUnit(/sec) empty_hdr = {smei_frm_hdr} count = 0 destroyvar, time, one, two, three, four destroyvar, five, six, seven, hdr, dbname tags = tag_names(empty_hdr) IF hdr_present THEN get = tags IF IsType(get,/undefined) THEN BEGIN IF NOT time_present AND NOT dbname_present THEN BEGIN message, /info, 'no tags specified in keyword "get"; choose from' message, /info, strjoin(tags,',') RETURN ENDIF ENDIF InitVar, source, filepath(root=getenv('SSWDB_SMEI'),subdir='cat','hdr') is_dir = CheckDir(source, /silent) IF NOT is_dir THEN is_file = file_search(source) NE '' ELSE is_file = 0 IF NOT is_dir AND NOT is_file THEN BEGIN message, /info, hide_env(source)+' does not exist' RETURN ENDIF CASE 1 OF is_file: BEGIN ; Extract from single input file IF silent LT 1 THEN message, /info, hide_env(source) fxbopen, iu, source, 'SMEI_FRM_HDRTABLE', hdr_table fxbread, iu, time , 'TIME' time = TimeSet(time) fxbread, iu, bad_data, 'BAD_DATA' bad_data = bad_data[0] count = n_elements(time) IF hdr_present THEN hdr = replicate(empty_hdr,count) FOR i=0,n_elements(get)-1 DO BEGIN n = where(strpos(tags,strupcase(get[i])) EQ 0, nget) IF nget EQ 0 THEN BEGIN message, /info, 'invalid "get" tag: '+get[i]+'; choose from' message, strjoin(tags,',') ENDIF IF nget GT 1 THEN $ message, /info, 'ambiguous tag: '+get[i]+' ('+strjoin(tags[n],',')+'), using '+tags[n[0]] errmsg = '' fxbread, iu, tmp, tags[n[0]],errmsg=errmsg ; If tags[n[0]] is not in Fits table, the set to ; array of "bad_data" ; This can currently (SEP-2008) happen for keywords ; DARK_AVE, SDARK003 and SDARK010 IF errmsg NE '' THEN BEGIN message, /info, errmsg tmp = replicate(bad_data,n_elements(time)) ENDIF SWITCH tags[n[0]] OF 'TIME' : BEGIN ; Convert string to structure tmp = TimeSet(tmp) break END 'PEDESTAL' : ; Set bad data to NaN 'DARK_MEAN' : 'DARK_CURRENT' : 'DARK_AVERAGE' : 'SDARK003' : 'SDARK010' : BEGIN bad = where(tmp EQ bad_data) IF bad[0] NE -1 THEN tmp[bad] = BadValue(tmp) break END ELSE: ENDSWITCH CASE hdr_present OF 0: BEGIN CASE i OF 0: IF one_present THEN one = tmp 1: IF two_present THEN two = tmp 2: IF three_present THEN three = tmp 3: IF four_present THEN four = tmp 4: IF five_present THEN five = tmp 5: IF six_present THEN six = tmp 6: IF seven_present THEN seven = tmp ENDCASE END 1: hdr.(i) = tmp ENDCASE ENDFOR IF dbname_present THEN BEGIN ; Set up fully-qualified frame names in SMEI database dbname = smei_filename(source,camera=tmp) fxbread, iu, modex, 'MODE' ; 'modex' was 'mode' dbname = filepath(root=smei_filepath(dbname,camera=tmp,source=dbsource), smei_filename(time,camera=tmp,mode=modex)) destroyvar, modex ; New ENDIF IF IsType(mode,/defined) THEN BEGIN fxbread, iu, tmp, 'MODE' n = where(tmp EQ mode, count) CASE count GT 0 OF 0: BEGIN destroyvar, time, one, two , three, four destroyvar, five, six, seven, hdr , dbname END 1: BEGIN time = time[n] CASE hdr_present OF 0: BEGIN IF IsType(one ,/defined) THEN IF size(one ,/n_dim) LE 1 THEN one = one [n] ELSE one = one [*,n] IF IsType(two ,/defined) THEN IF size(two ,/n_dim) LE 1 THEN two = two [n] ELSE two = two [*,n] IF IsType(three,/defined) THEN IF size(three,/n_dim) LE 1 THEN three = three[n] ELSE three = three[*,n] IF IsType(four ,/defined) THEN IF size(four ,/n_dim) LE 1 THEN four = four [n] ELSE four = four [*,n] IF IsType(five ,/defined) THEN IF size(five ,/n_dim) LE 1 THEN five = five [n] ELSE five = five [*,n] IF IsType(six ,/defined) THEN IF size(six ,/n_dim) LE 1 THEN six = six [n] ELSE six = six [*,n] IF IsType(seven,/defined) THEN IF size(seven,/n_dim) LE 1 THEN seven = seven[n] ELSE seven = seven[*,n] END 1: hdr = hdr[n] ENDCASE IF IsType(dbname, /defined) THEN dbname = dbname[n] END ENDCASE ENDIF fxbclose, iu END is_dir: BEGIN InitVar, camera, 1 CASE 1 OF IsType(tt,/undefined): BEGIN message, /info, 'no time range specified' RETURN END IsType(tt,/string ): tt = TimeSet(tt) ELSE: ENDCASE CASE 1 OF n_elements(tt) NE 1 : ut = tt[0:1] exact: ut = replicate(tt,2) ELSE : ut = TimeOp(/add, tt, TimeSet(/diff,day=[0,1])) ENDCASE trange = TimeLimits(ut, /bounds) t0 = TimeGet(trange[0], /bot, uday) t1 = TimeGet(trange[1], /bot, uday) ndays = TimeOp(/subtract,t1,t0,uday)+(TimeOp(/subtract,t1,trange[1],usec) NE 0) count = 0 FOR iday=0L,ndays-1 DO BEGIN ; Loop over all requested days tmp = TimeOp(/add, t0, TimeSet(/diff, iday, uday)) filename = filepath(root=source,'c'+strcompress(camera,/rem)+'hdr_'+TimeGet(tmp,/_ydoy,upto=uday,/scalar))+'.fts' CASE hdr_present OF 0: BEGIN smei_hdr_get, source=filename, mode=mode, time=tmp_time, $ dbname=tmp_dbname, dbsource=dbsource, get=get, $ one=tmp_one, two=tmp_two, three=tmp_three, four=tmp_four, $ five=tmp_five, six=tmp_six, seven=tmp_seven, count=n IF n GT 0 THEN BEGIN boost, time , tmp_time boost, one , tmp_one boost, two , tmp_two boost, three , tmp_three boost, four , tmp_four boost, five , tmp_five boost, six , tmp_six boost, seven , tmp_seven boost, dbname, tmp_dbname count = count+n ENDIF END 1: BEGIN smei_hdr_get, source=filename, mode=mode, time=tmp_time, $ dbname=tmp_dbname, dbsource=dbsource, hdr=tmp_hdr, count=n IF n GT 0 THEN BEGIN boost, hdr , tmp_hdr boost, time , tmp_time boost, dbname, tmp_dbname count = count+n ENDIF END ENDCASE ENDFOR END ENDCASE ;IF count GT 0 AND IsType(tt, /defined) THEN BEGIN IF count GT 0 AND IsType(ut, /defined) THEN BEGIN ;IF n_elements(tt) EQ 1 THEN $ ; ut = [tt, TimeOp(/add, tt, TimeSet(/diff,day=1))] ELSE ut = tt[0:1] n = where( TimeOp(/subtract,time,ut[0],usec) GE 0 AND TimeOp(/subtract,time,ut[1],usec) LE 0, count ) CASE count GT 0 OF 0: BEGIN destroyvar, time, one, two, three, four destroyvar, five, six, seven, hdr, dbname END 1: BEGIN time = time[n] CASE hdr_present OF 0: BEGIN IF IsType(one ,/defined) THEN IF size(one ,/n_dim) LE 1 THEN one = one [n] ELSE one = one [*,n] IF IsType(two ,/defined) THEN IF size(two ,/n_dim) LE 1 THEN two = two [n] ELSE two = two [*,n] IF IsType(three,/defined) THEN IF size(three,/n_dim) LE 1 THEN three = three[n] ELSE three = three[*,n] IF IsType(four ,/defined) THEN IF size(four ,/n_dim) LE 1 THEN four = four [n] ELSE four = four [*,n] IF IsType(five ,/defined) THEN IF size(five ,/n_dim) LE 1 THEN five = five [n] ELSE five = five [*,n] IF IsType(six ,/defined) THEN IF size(six ,/n_dim) LE 1 THEN six = six [n] ELSE six = six [*,n] IF IsType(seven,/defined) THEN IF size(seven,/n_dim) LE 1 THEN seven = seven[n] ELSE seven = seven[*,n] END 1: hdr = hdr[n] ENDCASE IF IsType(dbname,/defined) THEN IF size(dbname,/n_dim) LE 1 THEN dbname = dbname[n] ELSE dbname = dbname[*,n] END ENDCASE ENDIF RETURN & END