PRO THEMIS_IMAGER_METADATA__DEFINE
COMPILE_OPT HIDDEN
dummy = {themis_imager_metadata $
,site_uid:'' $
,imager_uid:'' $
,exposure_time_string:'' $
,exposure_time_cdf:0.0d0 $
,exposure_time_offset:0.0 $
,exposure_duration_request:0 $
,exposure_duration_actual:0.0 $
,ccd_offset:[0,0] $
,ccd_size:[0,0] $
,ccd_binning:[0,0] $
,comments:'' $
}
END
FUNCTION THEMIS_IMAGER_PNM_READFILE,lun,image,comments,DEBUG=debug
COMPILE_OPT HIDDEN
magicnumber= BYTARR(2)
READU,lun,magicnumber
CASE STRING(magicnumber) OF
'P1':type=1
'P2':type=2
'P3':type=3
'P4':type=4
'P5':type=5
'P6':type=6
ELSE: BEGIN
dprint,'Error- unrecognized filetype, magic number is: '+STRING(magicnumber)
RETURN,1
END
ENDCASE
line='' & comments='' & width=0 & height=0 & maxval=-1L & nvalues=0 & values=LONARR(3)
REPEAT BEGIN
READF,lun,line
poundpos= STRPOS(line,'#')
IF (poundpos EQ -1) THEN comment='' ELSE IF (poundpos EQ 0) THEN BEGIN
comment=line & line=''
ENDIF ELSE BEGIN
comment= STRMID(line,pos,999)
line= STRMID(line,0,pos)
ENDELSE
IF (STRLEN(comment) GT 0) THEN comments= comments + comment + STRING(13b)
IF (debug GE 2) THEN dprint, ' -',comment
line= STRCOMPRESS(STRTRIM(line,2))
IF (STRLEN(line) GT 0) THEN BEGIN
vals= STRSPLIT(line,' ',/EXTRACT)
nvals= N_ELEMENTS(vals)
values[nvalues]= vals[0:(nvals-1)<2]
nvalues= nvalues + nvals
ENDIF
ENDREP UNTIL (nvalues GE 3) OR EOF(lun)
IF EOF(lun) AND (nvalues NE 3) THEN BEGIN
dprint,'Error- end of file while reading header'
RETURN,1
ENDIF
width= values[0] & height= values[1] & maxvalue= values[2]
CASE type OF
2: BEGIN
IF (maxvalue GT 255) THEN image=UINTARR(width,height,/NOZERO) ELSE image=BYTARR(width,height,/NOZERO)
READF,lun,image
IF (height EQ 1) THEN image= REFORM(image,width,height)
END
3: BEGIN
IF (maxvalue GT 255) THEN image=UINTARR(3,width,height) ELSE image=BYTARR(3,width,height,/NOZERO)
READF,lun,image
IF (height EQ 1) THEN image= REFORM(image,3,width,height)
END
5: BEGIN
IF (maxvalue GT 255) THEN image=UINTARR(width,height,/NOZERO) ELSE image=BYTARR(width,height,/NOZERO)
READU,lun,image
BYTEORDER,image,/HTONS
IF (height EQ 1) THEN image= REFORM(image,width,height)
END
6: BEGIN
IF (maxvalue GT 255) THEN image=UINTARR(3,width,height,/NOZERO) ELSE image=BYTARR(3,width,height,/NOZERO)
READU,lun,image
BYTEORDER,image,/HTONS
IF (height EQ 1) THEN image= REFORM(image,3,width,height)
END
ELSE:MESSAGE,'Sorry, PNM image type '+STRING(type)+' not yet implemented'
ENDCASE
RETURN,0
END
FUNCTION THEMIS_IMAGER_PARSE_COMMENTS,comments,metadata,ALL_METADATA=all_metadata
COMPILE_OPT HIDDEN
metadata= {THEMIS_IMAGER_METADATA}
metadata.comments= comments
tmp= STRLOWCASE(comments)
timestring= (STREGEX(tmp,'"image request start" *([^#]+) utc',/SUBEXPR,/EXTRACT))[1]
metadata.exposure_time_string= (STRSPLIT(timestring,'.',/EXTRACT))[0]
year=0 & month=0 & day=0 & hour=0 & minute=0 & second=0 & fraction=""
READS,timestring,year,month,day,hour,minute,second,fraction,FORMAT='(I4,X,I2,X,I2,X,I2,X,I2,X,I2,X,A)'
metadata.exposure_time_offset= fraction/10.0^STRLEN(fraction)
CDF_EPOCH,epoch,year,month,day,hour,minute,second,/COMPUTE
metadata.exposure_time_cdf=epoch
IF KEYWORD_SET(ALL_METADATA) THEN BEGIN
metadata.site_uid= (STREGEX(tmp,'"site unique *id" ([a-z0-9-]+)',/SUBEXPR,/EXTRACT))[1]
metadata.imager_uid= (STREGEX(tmp,'"imager unique *id" ([a-z0-9-]+)',/SUBEXPR,/EXTRACT))[1]
exposure= STREGEX(tmp,'"exposure options"[^#]*',/EXTRACT)
metadata.ccd_size= (STREGEX(exposure,'width=([0-9]+).*height=([0-9]+)',/SUBEXPR,/EXTRACT))[1:2]
metadata.ccd_offset= (STREGEX(exposure,'xoffset=([0-9]+).*yoffset=([0-9]+)',/SUBEXPR,/EXTRACT))[1:2]
metadata.ccd_binning= (STREGEX(exposure,'xbin=([0-9]+).*ybin=([0-9]+)',/SUBEXPR,/EXTRACT))[1:2]
metadata.exposure_duration_request= (STREGEX(exposure,'msec=([0-9]+)',/SUBEXPR,/EXTRACT))[1]
metadata.exposure_duration_actual= (STREGEX(tmp,'"exposure.*plus.*readout" *([0-9\.]+) ms',/SUBEXPR,/EXTRACT))[1]
ENDIF
RETURN,0
END
PRO THM_ASI_IMAGER_READFILE,filename,images,metadata,COUNT=n_frames,DEBUG=debug,ALL_METADATA=all_metadata
IF (N_ELEMENTS(debug) EQ 0) THEN debug=0
time0= SYSTIME(1)
filenames='' & nfiles= 0
FOR indx=0,N_ELEMENTS(filename)-1 DO BEGIN
fname= FILE_SEARCH(filename[indx],COUNT=nf)
IF (nf GT 0) THEN filenames=[filenames,fname]
ENDFOR
nfiles= N_ELEMENTS(filenames)-1
IF (nfiles EQ 0) THEN BEGIN
dprint,'Error- files not found:'+filename[0]
n_frames=0
RETURN
ENDIF
filenames= filenames[1:nfiles]
filenames= filenames[SORT(filenames)]
IF (debug GT 0) THEN dprint, N_ELEMENTS(filenames),FORMAT='("found ",I," files")'
nchunk= 20 & nstart= (nchunk*nfiles)<2400
n_frames= 0 & n_bytes= 0
FOR indx=0,nfiles-1 DO BEGIN
IF (debug GT 0) THEN dprint, ' reading file: '+filenames[indx]
OPENR,lun,filenames[indx],/GET_LUN,COMPRESS=STREGEX(STRUPCASE(filenames[indx]),'.*\.GZ$',/BOOLEAN)
WHILE NOT EOF(lun) DO BEGIN
IF (debug GT 1) THEN dprint, ' -reading frame: '+STRING(n_frames)
IF THEMIS_IMAGER_PNM_READFILE(lun,image,comments,DEBUG=debug) THEN BREAK
IF THEMIS_IMAGER_PARSE_COMMENTS(comments,mdata,ALL_METADATA=all_metadata) THEN BREAK
IF (n_frames EQ 0) THEN BEGIN
isize= SIZE(image,/STR)
dimensions= isize.dimensions[0:isize.n_dimensions]
dimensions[isize.n_dimensions]= nstart
images= MAKE_ARRAY(dimensions,TYPE=isize.type,/NOZERO)
metadata= REPLICATE({THEMIS_IMAGER_METADATA},nstart)
dimensions[isize.n_dimensions]= nchunk
ENDIF ELSE IF (n_frames GE nstart) THEN BEGIN
images= [ [[images]], [[MAKE_ARRAY(dimensions,TYPE=isize.type,/NOZERO)]] ]
metadata= [metadata, REPLICATE({THEMIS_IMAGER_METADATA},nchunk)]
nstart= nstart+nchunk
ENDIF
IF (n_frames GT 0) THEN BEGIN
mdata.site_uid= metadata[n_frames-1].site_uid
mdata.imager_uid= metadata[n_frames-1].imager_uid
ENDIF
metadata[n_frames]= mdata
images[0,0,n_frames]= image
n_frames= n_frames+1
ENDWHILE
n_bytes= n_bytes + (FSTAT(lun)).cur_ptr
FREE_LUN,lun
ENDFOR
metadata= metadata[0:n_frames-1]
images= images[*,*,0:n_frames-1]
IF (debug GT 0) THEN BEGIN
dtime= (SYSTIME(1)-time0)>1 & prefix=''
IF (n_bytes GT 1024L*9) THEN BEGIN n_bytes=n_bytes/1024.0 & prefix='kilo' & ENDIF
IF (n_bytes GT 1024L*9) THEN BEGIN n_bytes=n_bytes/1024.0 & prefix='Mega' & ENDIF
IF (n_bytes GT 1024L*9) THEN BEGIN n_bytes=n_bytes/1024.0 & prefix='Giga' & ENDIF
infoline=STRING(n_bytes,prefix,dtime,8*n_bytes/dtime,prefix $
,FORMAT='(" read ",F6.1,X,A,"bytes in ",I," seconds: ",F7.1,X,A,"bits/second")')
DPRINT, STRCOMPRESS(infoline)
ENDIF
END