;+ ; ; NAME: ; SUMER_SERIAL ; PURPOSE: ; Construct a single data structure from a set of SUMER files ; CALLING SEQUENCE: ; data_str = SUMER_SERIAL(files) ; INPUTS : ; FILES an array of file names ; OUPUTS: ; DATA_STR a data structure defined in the same as in SUMER_FITS ; KEYWORDS: ; REFORMAT if set, the detector plane setup ogf data ; are reformatted. ; ; HISTORY: ; J. Chae 1998 September introduce FLAG, REFORMAT keyword ;- function sumer_serial, files1, flag=flag, reformat=reformat files=files1 flag=-1 ; Initiall setting of 'failure' ; Existence Check nf = n_elements(files) if nf ge 1 then for k=0, nf-1 do if not file_exist(files(k)) then begin tmp = widget_message(/error, 'The SUMER file: '+files(k) $ +' is not available!') return,-1 end ; Compatability Check: ; Step 1. Compare Study name and Observing Sequence h0 = headfits(files(0)) study_name0 = strtrim(fxpar(h0, 'STUDY_NM'),2) obs_seq0=strtrim(fxpar(h0, 'OBS_SEQ'),2) for k=0, nf -1 do begin if strtrim(fxpar(headfits(files(k)), 'STUDY_NM'),2) ne study_name0 $ then begin tmp = widget_message(/error,$ 'The files are from different study names!') return,-1 endif if strtrim(fxpar(headfits(files(k)), 'OBS_SEQ'),2) ne obs_seq0 $ then begin tmp = widget_message(/error,$ 'The files are from different observing sequences!') return,-1 endif endfor ; Step 2. Raster Type Check if strlowcase(strtrim(fxpar(h0, 'RASTYPE'),2)) eq 'spectral' then begin tmp = widget_message (['SUMER_SERIAL can not be used in spectral scan data']$ , /error) return,-1 endif files=files1 nf = n_elements(files) d0=sumer_fits(files(0)) if d0.dim(2) ge 2 then data =total(d0.data, 3)/d0.amp/d0.dim(2) $ else data = d0.data/ d0.amp oldpos = sumer_ll_pos(d0.refpixels, d0.sumpixels) dim = [d0.dim(0), d0.dim(1), d0.dim(3)] newpos=oldpos if keyword_set(reformat) then sumer_reformat, data, $ oldpos, dim, newpos nw=dim(0) ny=dim(1) nline=dim(2) refpixels = [nw/2+(nw mod 2)-1, ny/2+(nw mod 2)-1, 1]#replicate(1, nline) sumpixels = intarr(3, nline) sumpixels(0:1, *) = newpos+refpixels(0:1, *) sumpixels(2, *)=1 deltas=fltarr(3, nline) for l=0,nline-1 do deltas(0:1,l)=d0.deltas(0:1,0) for l=0,nline-1 do deltas(2,l)=d0.deltas(2,0) refpos=fltarr(3,nline) for l =0, nline-1 do $ refpos(*, l)=d0.refpos(*,0)+d0.deltas(*,0) $ *(sumpixels(*,l)-d0.sumpixels(*,0)) tmp =fltarr(1024, 360) ff = d0.file del_time = d0.del_time for f=0, nf-1 do begin exten=0 repeat begin exten=exten+1 d0=sumer_fits(files(f), exten=exten) nx0 = d0.dim(2) data0=fltarr(nw, ny, nx0, nline) for x=0, nx0-1 do begin tmp=tmp*0 for l= d0.dim(3)-1, 0, -1 do $ tmp(oldpos(0,l):oldpos(0,l)+d0.dim(0)-1, $ oldpos(1,l):oldpos(1,l)+d0.dim(1)-1) = d0.data(*,*, x, l)/d0.amp for nl=0, nline-1 do $ data0(*, *,x, nl) = $ tmp(newpos(0,nl):newpos(0, nl)+nw-1, newpos(1, nl):newpos(1, nl)+ny-1) endfor if f eq 0 and exten eq 1 then begin h = d0.h bh=d0.bh ff = d0.file del_time = d0.del_time solar_x = d0.solar_x solar_y = d0.solar_y data=data0 exptime=fxpar(d0.h, 'EXPTIME') start_time0 = sumer_time( fxpar(d0.h, 'DATE_OBS'), day0) endif else begin ff=[ff, d0.file] start_time = sumer_time( fxpar(d0.h, 'DATE_OBS'), day)+86400.d*(day-day0) gap = start_time-start_time0 del_time = [[del_time], [d0.del_time+gap]] solar_x =[[solar_x], [d0.solar_x]] solar_y =[[solar_y], [d0.solar_y]] data = [[[data]], [[data0]]] endelse fxaddpar, h, 'HISTORY', 'Compiled from '+d0.file endrep until exten eq d0.next endfor dim =[n_elements(data(*,0,0,0)), n_elements(data(0,*,0,0)), $ n_elements(data(0,0,*,0)), n_elements(data(0,0,0,*))] amp = 1.; (30000. / max(abs(data)))>1 data=data*amp data_names= 'W_'+strtrim(string(refpos(0,*), format='(f7.2)'),2) data_str = {file:ff, h:h, bh:bh, data:data, amp:float(amp), $ sum_status:d0.sum_status, $ del_time:del_time, exptime:exptime, $ solar_x:solar_x, $ solar_y:solar_y, next:d0.next, extension:d0.extension, dim:dim, $ ndata:nline, data_names:data_names, descr:d0.descr, $ refpixels:refpixels,sumpixels:sumpixels, refpos:refpos, deltas:deltas} flag=1 return, data_str end