;+ ; NAME: ; READ_3B_CATALOG ; ; PURPOSE: ; Reads the BATSE 3B Catalog data files 3b_grossc.* ; ; CATEGORY: ; BATSE Softare ; ; CALLING SEQUENCE: ; READ_3B_CATALOG, DATA [, HEADER} ; ; INPUTS: ; NONE ; ; KEYWORD PARAMETERS: ; DATA_DIR: Location of lowercase datafiles 3b_grossc.* ; If not supplied, current directory is assumed. ; ; OUTPUTS: ; DATA: Structure containing data that was read ; ; COMMON BLOCKS: ; NONE ; ; SIDE EFFECTS: ; NONE ; ; RESTRICTIONS: ; NONE ; ; DEPENDENCIES: ; READ_HEADER.PRO, WORDARRAY.PRO ; ; MODIFICATION HISTORY: ; Written, , June 1996. ;- ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FUNCTION READ_HEADER, FILE_LUN HEADER = '' LINE_FULL = '' WHILE (STRMID(LINE_FULL, 0, 3) NE '***') DO BEGIN READF, FILE_LUN, LINE_FULL HEADER = [HEADER, LINE_FULL] ENDWHILE RETURN, HEADER END ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;+ ; NAME: ; WORDARRAY ; PURPOSE: ; Convert text string or string array to 1-d array of words. ; CATEGORY: ; CALLING SEQUENCE: ; wordarray, instring, outlist ; INPUTS: ; instring = string or string array to process. in ; KEYWORD PARAMETERS: ; Keywords: ; IGNORE = character or array of characters. ; These characters are removed before processing. ; Ex: wordarray,in,out,ignore=',' ; wordarray,in,out,ignore=[',',';','(',')'] ; OUTPUTS: ; outlist = 1-d array of words in instring. out ; COMMON BLOCKS: ; NOTES: ; Notes: Words are assumed delimited by spaces and/or tabs ; Non-spaces/tabs are returned as part of the words. ; Spaces/tabs not needed at the front and end of the strings. ; MODIFICATION HISTORY: ; R. Sterner, 29 Nov, 1989 ; BLG --- Modified June 22,1991 to include tabs as delimiters ; R. Sterner, 11 Dec, 1992 --- fixed to handle pure white space. ; R. Sterner, 27 Jan, 1993 --- dropped reference to array. ; ; Copyright (C) 1989, Johns Hopkins University/Applied Physics Laboratory ; This software may be used, copied, or redistributed as long as it is not ; sold and this copyright notice is reproduced on each copy made. This ; routine is provided as is without any express or implied warranties ; whatsoever. Other limitations apply as described in the file disclaimer.txt. ;- pro wordarray, in0, out, ignore=ign, help=hlp if (n_params(0) lt 2) or keyword_set(hlp) then begin print,' Convert text string or string array to 1-d array of words.' print,' wordarray, instring, outlist' print,' instring = string or string array to process. in' print,' outlist = 1-d array of words in instring. out' print,' Keywords:' print,' IGNORE = character or array of characters.' print,' These characters are removed before processing.' print," Ex: wordarray,in,out,ignore=','" print," wordarray,in,out,ignore=[',',';','(',')']" print,' Notes: Words are assumed delimited by spaces and/or tabs' print,' Non-spaces/tabs are returned as part of the words.' print,' Spaces/tabs not needed at the front and end of the strings.' return endif in = in0 if n_elements(ign) gt 0 then begin rm = ign for i = 0L, n_elements(rm)-1L do in = repchr(in, rm(i)) endif t = ' ' + in + ' ' ; Force spaces on ends b = byte(t) ; Convert to byte array. w = where(b ne 0, count) ; Find non-null chars. if count gt 0 then b = b(w) ; Extract non-null characters. X = (B NE 32b) and (B NE 9b) ; non-space/tab chars. X = [0,X,0] ; tack 0s at ends. if total(x) eq 0 then begin ; All white space. out = '' return endif Y = (X-SHIFT(X,1)) EQ 1 ; look for transitions. Z = WHERE(SHIFT(Y,-1) EQ 1) Y2 = (X-SHIFT(X,-1)) EQ 1 Z2 = WHERE(SHIFT(Y2,1) EQ 1) NWDS = TOTAL(Y) ; Total words in IN. LOC = Z ; Word start positions. LEN = Z2 - Z - 1 ; Word lengths. out = bytarr(max(len), nwds) ; Set up output array. if nwds gt 1 then begin for i = 0L, nwds-1L do begin out(0,i) = b(loc(i):(loc(i)+len(i)-1L)) endfor out = string(out) endif else begin out(0) = b(loc(0):(loc(0)+len(0)-1L)) out = string(out) endelse END ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PRO READ_3B_CATALOG, DATA, HEADER, DATA_DIR = DATA_DIR IF (N_ELEMENTS(DATA_DIR) EQ 0) THEN DATA_DIR = '' MENU = ['CANCEL', $ 'Basic Table', $ 'CmaxCmin Table', $ 'Duration Table', $ 'Flux/Fluence', $ 'Trigger Efficiency', $ 'Comments'] TRY_AGAIN: FOR I=0, N_ELEMENTS(MENU)-1 DO BEGIN PRINT, ' ' + STRTRIM(I, 2) + '. ' + MENU(I) ENDFOR PRINT READ, 'Enter a selection number: ', READ_TABLE IF (READ_TABLE EQ 0) THEN RETURN IF ((READ_TABLE LT 1) OR (READ_TABLE GT N_ELEMENTS(MENU)-1)) THEN BEGIN PRINT, 'Invalid menu selection. PRINT GOTO, TRY_AGAIN ENDIF LINE_FULL = '' SELECTION = STRUPCASE(MENU(READ_TABLE)) CASE (SELECTION) OF 'BASIC TABLE': BEGIN DATA = {BASIC_TABLE, $ TRIGGER_NO: 0, CATALOG: STRING(REPLICATE(32B, 2)), $ OBJECT: STRING(REPLICATE(32B, 7)), $ TJD: 0, SEC: 0.0D, $ RA_2000: 0.0, DEC_2000: 0.0, $ L: 0.0, B: 0.0, $ LOC_ERR: 0.0, $ GEOCENTER_ANGLE: 0.0, $ OVERWRITE: STRING(REPLICATE(32B, 1)), $ OVERWRITTEN: STRING(REPLICATE(32B, 1))} DATA_IN = DATA PRINT, 'Reading 3B BASIC table' OPENR, FL, DATA_DIR + '3b_grossc.basic', /GET_LUN HEADER = READ_HEADER(FL) ; The BASIC table has an extra blank line :-( READF, FL, LINE_FULL ; Begin reading data ; Have to read it by strings, since some of the fields are ; strings; thus it is a slow read... READF, FL, LINE_FULL WORDARRAY, LINE_FULL, LINE DATA.TRIGGER_NO = FIX(LINE(0)) JUNK = STRING(REPLICATE(32B, 2)) STRPUT, JUNK, STRING(LINE(1)) DATA.CATALOG = JUNK JUNK = STRING(REPLICATE(32B, 7)) STRPUT, JUNK, STRING(LINE(2)) DATA.OBJECT = JUNK DATA.TJD = FIX(LINE(3)) DATA.SEC = DOUBLE(LINE(4)) DATA.RA_2000 = FLOAT(LINE(5)) DATA.DEC_2000 = FLOAT(LINE(6)) DATA.L = FLOAT(LINE(7)) DATA.B = FLOAT(LINE(8)) DATA.LOC_ERR = FLOAT(LINE(9)) DATA.GEOCENTER_ANGLE = FLOAT(LINE(10)) JUNK = STRING(REPLICATE(32B, 1)) STRPUT, JUNK, STRING(LINE(11)) DATA.OVERWRITE = JUNK JUNK = STRING(REPLICATE(32B, 1)) STRPUT, JUNK, STRING(LINE(12)) DATA.OVERWRITTEN = JUNK WHILE NOT EOF(FL) DO BEGIN READF, FL, LINE_FULL WORDARRAY, LINE_FULL, LINE DATA_IN.TRIGGER_NO = FIX(LINE(0)) JUNK = STRING(REPLICATE(32B, 2)) STRPUT, JUNK, STRING(LINE(1)) DATA_IN.CATALOG = JUNK JUNK = STRING(REPLICATE(32B, 7)) STRPUT, JUNK, STRING(LINE(2)) DATA_IN.OBJECT = JUNK DATA_IN.TJD = FIX(LINE(3)) DATA_IN.SEC = DOUBLE(LINE(4)) DATA_IN.RA_2000 = FLOAT(LINE(5)) DATA_IN.DEC_2000 = FLOAT(LINE(6)) DATA_IN.L = FLOAT(LINE(7)) DATA_IN.B = FLOAT(LINE(8)) DATA_IN.LOC_ERR = FLOAT(LINE(9)) DATA_IN.GEOCENTER_ANGLE = FLOAT(LINE(10)) JUNK = STRING(REPLICATE(32B, 1)) STRPUT, JUNK, STRING(LINE(11)) DATA_IN.OVERWRITE = JUNK JUNK = STRING(REPLICATE(32B, 1)) STRPUT, JUNK, STRING(LINE(12)) DATA_IN.OVERWRITTEN = JUNK DATA = [DATA, DATA_IN] ENDWHILE FREE_LUN, FL PRINT, STRTRIM(N_ELEMENTS(DATA), 2), ' events.' END 'CMAXCMIN TABLE': BEGIN DATA = {CMAXCMIN_TABLE, $ TRIGGER_NO: 0, $ CMAX_OVER_CMIN_64: 0.0, $ CMIN_64: 0, $ CMAX_OVER_CMIN_256: 0.0, $ CMIN_256: 0, $ CMAX_OVER_CMIN_1024: 0.0, $ CMIN_1024: 0} DATA_IN = DATA PRINT, 'Reading 3B CMAXMIN table' OPENR, FL, DATA_DIR + '3b_grossc.cmaxmin', /GET_LUN HEADER = READ_HEADER(FL) ; This table can be read in by structrures READF, FL, DATA WHILE NOT EOF(FL) DO BEGIN READF, FL, DATA_IN DATA = [DATA, DATA_IN] ENDWHILE FREE_LUN, FL PRINT, STRTRIM(N_ELEMENTS(DATA), 2), ' events.' END 'DURATION TABLE': BEGIN DATA = {DURATION_TABLE, $ TRIGGER_NO: 0, $ T50: 0.0, T50_ERR: 0.0, T50_START_TIME: 0.0, $ T90: 0.0, T90_ERR: 0.0, T90_START_TIME: 0.0} DATA_IN = DATA PRINT, 'Reading 3B DURATION table' OPENR, FL, DATA_DIR + '3b_grossc.duration', /GET_LUN HEADER = READ_HEADER(FL) ; This table can be read in by structrures READF, FL, DATA WHILE NOT EOF(FL) DO BEGIN READF, FL, DATA_IN DATA = [DATA, DATA_IN] ENDWHILE FREE_LUN, FL PRINT, STRTRIM(N_ELEMENTS(DATA), 2), ' events.' END 'FLUX/FLUENCE': BEGIN DATA = {FLUX_TABLE, $ TRIGGER_NO: 0, $ FLUENCE_CH1: 0.0, FLUENCE_CH1_ERR: 0.0, $ FLUENCE_CH2: 0.0, FLUENCE_CH2_ERR: 0.0, $ FLUENCE_CH3: 0.0, FLUENCE_CH3_ERR: 0.0, $ FLUENCE_CH4: 0.0, FLUENCE_CH4_ERR: 0.0, $ PEAK_FLUX_64: 0.0, PEAK_FLUX_64_ERR: 0.0, TIME_64: 0.0, $ PEAK_FLUX_256: 0.0, PEAK_FLUX_256_ERR: 0.0, TIME_256: 0.0, $ PEAK_FLUX_1024: 0.0, PEAK_FLUX_1024_ERR: 0.0, TIME_1024: 0.0} DATA_IN = DATA PRINT, 'Reading 3B FLUX table' OPENR, FL, DATA_DIR + '3b_grossc.flux', /GET_LUN HEADER = READ_HEADER(FL) ; This table can be read in by structrures READF, FL, DATA WHILE NOT EOF(FL) DO BEGIN READF, FL, DATA_IN DATA = [DATA, DATA_IN] ENDWHILE FREE_LUN, FL PRINT, STRTRIM(N_ELEMENTS(DATA), 2), ' events.' END 'TRIGGER EFFICIENCY': BEGIN PRINT, 'Reading 3B EFFICIENCY header' OPENR, FL, DATA_DIR + '3b_grossc.efficiency', /GET_LUN DATA = -1 HEADER = '' HEADER_IN = '' WHILE NOT EOF(FL) DO BEGIN READF, FL, HEADER_IN HEADER = [HEADER, HEADER_IN] ENDWHILE FREE_LUN, FL END 'COMMENTS': BEGIN DATA = {COMMENTS_TABLE, $ TRIGGER_NO: 0, $ FLAGS: '', $ COMMENTS: ''} DATA_IN = DATA PRINT, 'Reading 3B COMMENTS table' OPENR, FL, DATA_DIR + '3b_grossc.comments', /GET_LUN HEADER = READ_HEADER(FL) ; Begin reading data TRIG = 0 READF, FL, TRIG, LINE_FULL DATA.TRIGGER_NO = TRIG DATA.COMMENTS = STRTRIM(LINE_FULL, 2) WHILE NOT EOF(FL) DO BEGIN READF, FL, TRIG, LINE_FULL DATA_IN.TRIGGER_NO = TRIG DATA_IN.COMMENTS = STRTRIM(LINE_FULL, 2) DATA = [DATA, DATA_IN] ENDWHILE DATA.FLAGS = STRMID(DATA.COMMENTS, 0, 1) DATA.COMMENTS = STRTRIM(STRMID(DATA.COMMENTS, 1, 999), 2) FREE_LUN, FL END ELSE: BEGIN PRINT, 'READ_3B_CATALOG: Error in menu selection: ' + SELECTION RETURN END ENDCASE END