FUNCTION SXTKaySea, idx, item, op, val, op2=op2, val2=val2, $ op3=op3, val3=val3 ; ------------------------------------------------------------ ; ------------------------------------------------------------ ; ON_ERROR, 2 ;force a return from caller if error occurs Print, 'SXTKaySea Search for >>' , item, ' ', op, ' ', val ; Define the OPERATIONAL-tag-name list for valid keyed searches: taglist = ['IMG_MAX','PERCENTD','OBSREGION','SHAPE_CMD','FOV_CENTER', $ 'EXPMODE','MBE','ASPDR','SHUT','XRAY','OPT', $ 'CAD','COMP','NROIS','RES'] ntaglist = N_Elements(taglist) ; Notes: ; 1) ASPDR, SHUT, XRAY, OPT are from 'PERIPH' ; 2) EXPMODE, MBE are from 'EXPLEVMODE' ; 3) cad, comp,nRoIs, res are from 'ImgParam' ; SXT tag-field list (not used yet): sxt = ['entry_type','time','day','DP_mode','DP_rate', $ 'pfi_ffi','periph','ExpLevMode','imgparam', $ 'ObsRegion','seq_table','shape_cmd','FOV_Center', $ 'Img_Max','Img_Avg','percentD'] ; check item name for type of processing: item = STRUPCASE(item) ck = WHERE(item eq taglist) IF (ck(0) eq -1) THEN BEGIN Print, '**** Requested Search Tag Not SUPPORTED at this time ****' PRINT, '**************', item , '*******************' RETURN, -1 ;set no match flag ENDIF CASE item OF 'IMG_MAX': BEGIN val = FIX(val) CASE op OF '<': ret = WHERE(idx.img_max lt val) '>': ret = WHERE(idx.img_max gt val) '=': ret = WHERE(idx.img_max eq val) ELSE: BEGIN print, '**** not a valid operator ****' return, -1 END ENDCASE END 'PERCENTD': BEGIN val = FIX(val) CASE op OF '<': ret = WHERE(idx.percentd lt val) '>': ret = WHERE(idx.percentd gt val) '=': ret = WHERE(idx.percentd eq val) ELSE: BEGIN print, '**** not a valid operator ****' return, -1 END ENDCASE END 'OBSREGION': BEGIN val = FIX(val) CASE op OF '<': ret = WHERE(idx.ObsRegion lt val) '>': ret = WHERE(idx.ObsRegion gt val) '=': ret = WHERE(idx.ObsRegion eq val) ELSE: BEGIN print, '**** not a valid operator ****' return, -1 END ENDCASE END 'SHAPE_CMD': BEGIN ; Using op check val: IF (val eq '*') THEN BEGIN ; Return all indices: nidx = N_Elements(idx) ;# of elements ret = INDGEN(nidx) ENDIF ELSE BEGIN val = FIX(val) CASE op OF '<': ret = WHERE(idx.Shape_Cmd(0) lt val) '>': ret = WHERE(idx.Shape_Cmd(0) gt val) '=': ret = WHERE(idx.Shape_Cmd(0) eq val) ELSE: BEGIN print, '**** not a valid operator ****' return, -1 END ENDCASE ENDELSE ; Using op2 check val2: IF (val2 eq '*') THEN BEGIN ; Return all indices: nidx = N_Elements(idx) ;# of elements ret2 = INDGEN(nidx) ENDIF ELSE BEGIN val2 = FIX(val2) CASE op2 OF '<': ret2 = WHERE(idx.Shape_Cmd(1) lt val2) '>': ret2 = WHERE(idx.Shape_Cmd(1) gt val2) '=': ret2 = WHERE(idx.Shape_Cmd(1) eq val2) ELSE: BEGIN print, '**** not a valid operator ****' return, -1 END ENDCASE ENDELSE ; Merge ret and ret2: nret2 = N_Elements(ret2) ;number of elements IF (nret2 GT 0) THEN BEGIN both = ret2 ;initialize FOR i=0, nret2-1 DO BEGIN both(i) = WHERE( ret eq ret2(i) ) ;same index ENDFOR iboth = WHERE(both ne -1) ;delete invalid matches IF (iboth(0) ne -1) THEN BEGIN ret = ret( both(iboth) ) ;remap index-ptr ENDIF ELSE BEGIN ret=iboth ENDELSE ENDIF END 'FOV_CENTER': BEGIN print,'start FOV-center: val, val2, val3 ' help,val,val2,val3 IF (NOT N_Elements(val3)) THEN BEGIN ;undefined op3 = '=' ;default value of oper val3= '180' ;3arcmin ENDIF CASE val3 OF ;handle west,east,n and s 'E': val3='112' 'W': val3='112' 'NA': val3='150' 'SA': val3='150' ELSE: ENDCASE val3= FIX(val3) print,'FOV-center: val, val2, val3 ' help,val,val2,val3 IF (val eq '*') THEN BEGIN ;get all ret = INDGEN(N_ELEMENTS(idx)) ENDIF ELSE BEGIN ;select val = FIX(val) ;convert to integer CASE op OF '<': ret = WHERE(idx.FOV_Center(0) lt val) '>': ret = WHERE(idx.FOV_Center(0) gt val) '=': ret = WHERE((idx.FOV_Center(0) gt val-val3) $ AND (idx.FOV_Center(0) lt val+val3)) ELSE: BEGIN print, '**** not a valid operator ****' return, -1 END ENDCASE ENDELSE IF (val2 eq '*') THEN BEGIN ;get all ret2 = INDGEN(N_ELEMENTS(idx)) ENDIF ELSE BEGIN ;select val2= FIX(val2) CASE op2 OF '<': ret2 = WHERE(idx.FOV_Center(1) lt val2) '>': ret2 = WHERE(idx.FOV_Center(1) gt val2) '=': ret2 = WHERE((idx.FOV_Center(1) gt val2-val3) $ AND (idx.FOV_Center(1) lt val2+val3)) ELSE: BEGIN print, '**** not a valid operator ****' return, -1 END ENDCASE ENDELSE stop,'ck ret2 values ' ; Merge ret and ret2: nret2 = N_Elements(ret2) ;number of elements IF (nret2 GT 0) THEN BEGIN both = ret2 ;initialize FOR i=0, nret2-1 DO BEGIN both(i) = WHERE( ret eq ret2(i) ) ;same index ENDFOR iboth = WHERE(both ne -1) ;delete invalid matches IF (iboth(0) ne -1) THEN BEGIN ret = ret( both(iboth) ) ;remap index-ptr ENDIF ELSE BEGIN ret=iboth ENDELSE ENDIF END 'EXPMODE': BEGIN ;*** Begin ExpLevMode *** val = STRUPCASE(val) seaval = ReqExpVal(expMode=val) expmode= MskExpLev(idx.ExpLevMode,/expMode) ret = WHERE(expmode eq seaval(0)) END 'MBE': BEGIN val = BYTE(fix(val)) ;convert to byte value seaval = ReqExpVal(expLev=val) explev = MskExpLev(idx.ExpLevMode,/expLev) ret = WHERE(explev eq seaval(0)) END 'ASPDR': BEGIN ;*** Begin Periph *** val = STRUPCASE(val) IF (val eq 'OPEN') THEN BEGIN seaval = ReqPerVal(aspdr=val) aspdr = MskPer(idx.periph,/aspdr) ret = WHERE(aspdr eq seaval(0)) ENDIF ELSE BEGIN seaval = ReqPerVal() ;door closed aspdr = MskPer(idx.periph,/aspdr) ret = WHERE(aspdr eq seaval(0)) ENDELSE END 'SHUT': BEGIN ;*** periph *** val = STRUPCASE(val) IF (val eq 'OPEN') THEN BEGIN seaval = ReqPerVal(shut=val) shutter = MskPer(idx.periph,/shut) ret = WHERE(shutter eq seaval(0)) ENDIF ELSE BEGIN seaval = ReqPerVal() ;frame-Transfer shutter = MskPer(idx.periph,/shut) ret = WHERE(shutter eq seaval(0)) ENDELSE END 'XRAY': BEGIN ;*** periph *** val = STRUPCASE(val) seaval = ReqPerVal(xray=val) xray = MskPer(idx.periph,/xray) ret = WHERE(xray eq seaval(0)) END 'OPT': BEGIN ;*** periph *** val = STRUPCASE(val) seaval = ReqPerVal(opt=val) opt = MskPer(idx.periph,/opt) ret = WHERE(opt eq seaval(0)) END 'CAD': BEGIN ;*** ImgParam *** val = STRUPCASE(val) seaval = ReqImgVal(cad=val) cad = MskImg(idx.ImgParam,/cad) ret = WHERE(cad eq seaval(0)) END 'COMP': BEGIN ;*** ImgParam *** val = STRUPCASE(val) seaval = ReqImgVal(comp=val) comp = MskImg(idx.ImgParam,/comp) ret = WHERE(comp eq seaval(0)) END 'RES': BEGIN ;*** ImgParam *** val = STRUPCASE(val) seaval = ReqImgVal(res=val) res = MskImg(idx.ImgParam,/res) ret = WHERE(res eq seaval(0)) END 'NROIS': BEGIN ;*** ImgParam *** val = STRUPCASE(val) seaval = ReqImgVal(nrois=val) nrois = MskImg(idx.ImgParam,/nrois) ret = WHERE(nrois eq seaval(0)) END ELSE: BEGIN END ENDCASE RETURN, ret END