;+ ; $Id: sccxeditframex.pro,v 1.24 2017/01/03 14:35:08 mcnutt Exp $ ; Project : SOHO -LASCO/EIT ; ; Name : XEDITFRAME ; ; Purpose : This tool allows the user to edit a particular image "on the ; fly," while the WRUNMOVIEM procedure is running, using a widget ; interface. ; ; Use : XEDITFRAME, in, out, [moviev] ; ; Arguments : InImg - The input, or original image ; FinalImg - The output, or final image ; moviev - a structure generated by the WRUNMOVIE3 program, ; containing information about the movie. If moviev ; is not provided, then certain features of the program, ; such as referencing images by "Current frame", will ; not be supported. ; ; Calls : LASCO_READFITS, POINT_FILTER, GET_FILENAME ; GETSUPERBASENAME (currently included in xeditframe.pro) ; ; Comments : ; The field widgets require the user to press RETURN in order for changes ; to take effect. ; Much of the "overhead" in this program is for the "Undo" feature, ; which necessitates extra bookkeeping. ; ; The resulting image is = (Primary)*Normalization - (Base), which is then ; clipped at saturation points (cutoffs) provided by the user. ; ; "Super Base Frame" should probably be changed to a term easily ; recognized by LASCO team members. Procedure GETSUPERBASENAME ; needs to be extended significantly. ; ; "Remove Stars" currently operates on both primage & base images ; simultaneously, and only does so when the "Remove Stars" button is ; pressed. For example, if primary and base images are loaded and ; "remove stars" is selected, and then a different primary image is loaded, ; remove stars will need to be run again -- but then the base image will ; have been operated on TWICE. ; ; On the "Primary Image" and "Base Image" buttons: If you want to ; "re-select" a given button (i.e. load the original image again even ; though "Original Image" is already selected), you need to click ; on a different option (e.g. "None") and then click back to the selection ; you want. ; ; Side effects : XEDITFRAME disables all other widgets (e.g. WRUNMOVIEM's interface) ; until it is finished. ; ; Category : Image Processing ; ; Written : Scott Hawley, NRL Jan 09, 1996 (from editframe.pro, SHH Jul 12, 1996) ; ; $Log: sccxeditframex.pro,v $ ; Revision 1.24 2017/01/03 14:35:08 mcnutt ; Use select_windows instead of set_plot ; ; Revision 1.23 2015/01/29 13:14:33 hutting ; added base select n- x option ; ; Revision 1.22 2013/02/28 15:29:17 nathan ; change position of widget ; ; Revision 1.21 2013/02/27 23:00:53 nathan ; Removed rect as criteria for rot() because rect is 0 if correction is LT 1 deg ; ; Revision 1.20 2012/11/01 15:45:11 nathan ; oops ; ; Revision 1.19 2012/11/01 15:40:32 nathan ; for rotate image, change OR to AND, reduce min to .01 deg ; ; Revision 1.18 2012/09/12 22:07:57 nathan ; print more roll info and do rot() if difference gt 0.1 deg ; ; Revision 1.17 2012/01/25 17:40:28 nathan ; do not rely on rectify in MVI header to do rot() ; ; Revision 1.16 2011/07/18 18:38:55 nathan ; use crota not RECT to rotate fixed image ; ; Revision 1.15 2011/05/20 14:48:57 nathan ; adjust widget labels ; ; Revision 1.14 2011/05/19 23:05:26 nathan ; Rename common com_seditframe to not conflict with xeditframe.pro; make display ; of suggested norm factor and norm factor the same; add button to apply suggested ; norm factor; remove norm factor scroll bar so norm factor could use /ALL_EVENTS ; ; Revision 1.13 2011/05/18 21:33:11 nathan ; Save some settings between instances and change default togglebuttons; add ; PRO setexpfac; limb is 2pix wide ; ; Revision 1.12 2011/04/05 22:00:09 nathan ; add pre-bin point_filter button; default no draw_limb ; ; Revision 1.11 2011/04/04 22:39:24 nathan ; add Exptime correction option; allow adjust of point_filter parameters ; ; Revision 1.10 2011/04/01 16:59:25 nathan ; Rotate image after difference by RECT in mvi file header; use lz_from_ql.pro ; to get LASCO filename; use sccfindfits.pro to get SECCHI filename; use ; SECCHI_PREP for SECCHI images; obtain sunc with get_sun_center.pro ; ; Revision 1.9 2010/12/09 14:32:27 mcnutt ; corrected limb and logo ; ; Revision 1.8 2010/05/14 19:21:40 nathan ; update normlabel ; ; Revision 1.7 2010/05/14 18:49:29 nathan ; bytscl images before display; remove help,count ; ; Revision 1.6 2010/05/14 17:53:49 mcnutt ; calls to loadimg to include issoho and added slider for normalization ; ; Revision 1.5 2010/05/14 16:13:17 mcnutt ; read in lasco fits and adds lasco logo ; ; Revision 1.4 2008/06/25 18:31:03 mcnutt ; calculates the positions of earth soho and other stereo sc ; ; Revision 1.3 2008/05/16 17:45:57 mcnutt ; now uses Zbuffer for output img, can redraw logo, limb and time stamp to match scc_mkmframe ; ; Revision 1.2 2008/05/09 16:16:34 mcnutt ; changed edit pro to sccxeditframex and added retain=2 ; ; Revision 1.1 2007/08/17 17:31:38 nathan ; moved from dev/movie ; ; Revision 1.1 2007/08/17 16:25:58 herbst ; Started converting from LASCO to SECCHI ; ; Revision 1.1 2007/05/30 18:16:26 nathan ; Copied from Neils linux_files/xeditframe.pro ; ; Modified : N. Rich 971211 Change EDIT_GETFILENAME function to use ; GET_FILENAME procedure--retrieves final data ; if it exists ; 03.09.23, NRich - If moviev.rect THEN rotate image ; 5/30/07, NRich - Renamed xeditframex.pro; modified to work with wrunmoviemx.pro ; Version : ; ; @(#)xeditframe.pro 1.7 09/24/03 :NRL Solar Physics ; ;- ;_______________________________________________________________________________ FUNCTION CROP_TO_EQ,inimg ; cuts a 1024x1024 image into the shape used in an "equatorial" picture RETURN, inimg(*,224:224+576-1) END FUNCTION EDIT_LOADIMG,filename,hsize,vsize,gaps,issoho,h, PFILTER=pfilter common com_seditframe,EditVars,Backup,nomoviev,moviev IF (N_ELEMENTS(filename) EQ 0) THEN BEGIN filename='' READ,'Enter filename of image (RETURN to cancel): ',filename ENDIF IF (filename EQ '') THEN RETURN,-1 IF file_exist(filename) THEN BEGIN if issoho then begin big=FLOAT(LASCO_READFITS(filename,h)) temp=size(big) bighsize=temp(1) bigvsize=temp(2) IF ((hsize mod 512) eq 0) and ((vsize mod 288) eq 0) and $ ((bighsize eq 1024) and (bigvsize eq 1024)) THEN BEGIN MESSAGE,'Automatically cropping image.',/CONT big=CROP_TO_EQ(big) ENDIF bias = OFFSET_BIAS(h) big = big - bias ENDIF ELSE BEGIN secchi_prep,filename,h,big, /NOCALFAC, /calimg_off, /update_hdr_off, $ /exptime_off, /nowarp, /FULL, saturation_limit=16384 endelse IF keyword_set(PFILTER) THEN BEGIN print,'Doing point_filter on un-binned image' pfv=EditVars.pfval point_filter,big,pfv[0],pfv[1],pfv[2],tmp,pts big=tmp ENDIF img=REBIN(big,hsize,vsize) gaps=FIX(img le 1) c=get_sun_center(h,full=hsize, ROLL=origroll, /degrees) editvars.crota=origroll editvars.sunc=[c.xcen,c.ycen] IF editvars.arcs EQ 0 THEN editvars.arcs=h.cdelt1 RETURN,img ENDIF ELSE BEGIN PRINT,'Error: File "',filename,'" not found.' gaps=INTARR(hsize,vsize) RETURN,FLTARR(hsize,vsize) ENDELSE END PRO SWAPXY,x,y tmp=x x=y y=tmp RETURN end FUNCTION FLOAT2STR,num,FORMAT=format IF (not KEYWORD_SET(format)) THEN format='(g10.3)' RETURN, STRCOMPRESS(STRING(num,FORMAT=format),/REMOVE_ALL) END FUNCTION EDIT_GETFILENAME,moviev,index,issoho if issoho then begin hdr=moviev.img_hdrs(index) filename=lz_from_ql(time=hdr.DATE_OBS+' '+hdr.time_obs,cam=hdr.detector) endif else begin hdr=moviev.img_hdrs(index) fname=hdr.filename filename=sccfindfits(fname) IF filename EQ '' THEN BEGIN strput,fname,'??',16 filename = sccfindfits(fname) ENDIF endelse RETURN,filename END FUNCTION GETSUPERBASENAME,month,day,year,camera ; This function is supposed to return a filename corresponding to a "super base frame" ; or daily/monthly minimum image. It should take the information given and go ; searching for the file, and the return the filename. filename='/net/corona/cplex3/monthly/3m_clcl_960703.fts' filename='' RETURN,filename END FUNCTION EDIT_GETSUPERBASENAME,moviev,index hdr=moviev.img_hdrs(index) date=hdr.date_obs year=FIX(strmid(date,2,2)) mon=FIX(strmid(date,5,2)) day=FIX(strmid(date,8,2)) filename=GETSUPERBASENAME(mon,day,year,hdr.detector) RETURN,filename END PRO EDIT_SHOWIMAGES common com_seditframe common com_wid_editframe, editframebase, groupleader, $ primbuttons,primfilenamelabel,basebuttons,basefilenamelabel,basefilenametime,$ togglebuttons, MaxCutLabel,MaxCutField,MinCutLabel,MinCutField,$ KernelField,NormLabel,NormField, donebutton, undobutton,cancelbutton,$ rwindow,pwindow,bwindow,hprim,hbase,pfwidgets,basefile,primfile, baseimg0, primimg0 IF (EditVars.mincutval ge Editvars.maxcutval) THEN BEGIN ; Protect against contrast probs MESSAGE,'Invalid contrast parameters. Min='+FLOAT2STR(EditVars.mincutval)+', Max='+$ FLOAT2STR(EditVars.maxcutval),/CONT RETURN ENDIF primimg=EditVars.primimg baseimg=EditVars.baseimg result=(primimg*EditVars.primfac*EditVars.normval)-(baseimg*EditVars.basefac) maxmin,result EditVars.normsuggest=MEDIAN(baseimg*EditVars.basefac)/MEDIAN(primimg*EditVars.primfac) IF (EditVars.togglevals(0)) THEN BEGIN ; if "fix data gaps" selected missing=where(EditVars.gaps NE 0,count) help,missing IF (count ne 0) THEN result[missing]=0.0 ENDIF ; ROTATE image around sun center rect=moviev.rect fitsrota=editvars.crota mvirota =moviev.rolls[moviev.current] help,rect,fitsrota,mvirota ;IF (rect NE 0 and rect NE 360) and IF abs(fitsrota-mvirota) GT 0.01 THEN BEGIN cx=editvars.sunc[0] cy=editvars.sunc[1] message,'Rotating result '+trim(-editvars.crota)+' degrees CW around '+trim(cx)+','+trim(cy),/info EditVars.Result =rot(result,-editvars.crota,1,cx,cy,/pivot,/interp,missing=0) ENDIF ELSE BEGIN message,'Not rotating result '+trim(-editvars.crota)+' deg.',/info EditVars.result=result ENDELSE ; winsave2=!D.WINDOW device,get_visual_depth=depth tmp = size(EditVars.result) true = (tmp[0] eq 3) ? 1 : 0 set_plot,'z' device,set_resolution=[EditVars.hsize,EditVars.vsize] r_result = (depth gt 8 ) ? bytscl(EditVars.result,EditVars.mincutval,EditVars.maxcutval) : $ byte( ((EditVars.result > EditVars.mincutval < EditVars.maxcutval)- $ EditVars.mincutval)*(!D.N_COLORS-1)/(EditVars.maxcutval-EditVars.mincutval)) $ < (!D.N_COLORS-1) IF (EditVars.togglevals(3))THEN IF EditVars.issoho eq 0 THEN r_result = SCC_ADD_LOGO(temporary(r_result)) ELSE r_result = ADD_LASCO_LOGO(temporary(r_result)) tv,r_result IF (EditVars.togglevals(1)) THEN begin xouts=10 & youts=10 ; XYOUTS, xouts, youts, EditVars.date_obs+' '+strmid(EditVars.time_obs,0,8),/DEVICE, CHARSIZE=EditVars.charsz XYOUTS, xouts, youts, strmid(EditVars.date_obs,0,19),/DEVICE, CHARSIZE=EditVars.charsz cyouts=youts+ EditVars.charsz*10 + 5 XYOUTS, xouts, cyouts, strupcase(EditVars.camt), /DEVICE, CHARSIZE=EditVars.charsz endif IF (EditVars.togglevals(4)) THEN begin solr=EditVars.solr r_sun=solr/EditVars.arcs TVCIRCLE, r_sun, EditVars.sunc(0), EditVars.sunc(1), COLOR=255, THICK=2 endif r_result=tvrd () EditVars.result=r_result select_windows ;set_plot,'x' b_result = (depth gt 8) ? bytscl(baseimg,EditVars.mincutval,EditVars.maxcutval) : $ byte( ((baseimg > EditVars.mincutval < EditVars.maxcutval)- $ EditVars.mincutval)*(!D.N_COLORS-1)/(EditVars.maxcutval-EditVars.mincutval)) $ < (!D.N_COLORS-1) p_result = (depth gt 8) ? bytscl(primimg,EditVars.mincutval,EditVars.maxcutval) : $ byte( ((primimg > EditVars.mincutval < EditVars.maxcutval)- $ EditVars.mincutval)*(!D.N_COLORS-1)/(EditVars.maxcutval-EditVars.mincutval)) $ < (!D.N_COLORS-1) WSET,rwindow tv,r_result;,true=true WSET,pwindow tv,p_result;,true=true WSET,bwindow tv,b_result;,true=true WSET,winsave2 ;PRO EDIT_UPDATEWIDGETS ; only updates a few widgets. ;common com_seditframe ;common com_wid_editframe maxcutvalsuggest=MAX(result) WIDGET_CONTROL,MaxCutLabel,SET_VALUE='Cutoff Max ('+FLOAT2STR(maxcutvalsuggest)+')' mincutvalsuggest=MIN(result) WIDGET_CONTROL,MinCutLabel,SET_VALUE='Cutoff Min ('+FLOAT2STR(mincutvalsuggest)+')' WIDGET_CONTROL,NormLabel,SET_VALUE='('+string(EditVars.normsuggest,FORMAT='(f7.5)')+')' ; RETURN ;END RETURN END PRO EDIT_UPDATEWIDGETS ; only updates a few widgets. common com_seditframe common com_wid_editframe maxcutvalsuggest=MAX(EditVars.result) WIDGET_CONTROL,MaxCutLabel,SET_VALUE='Cutoff Max ('+FLOAT2STR(maxcutvalsuggest)+')' mincutvalsuggest=MIN(EditVars.result) WIDGET_CONTROL,MinCutLabel,SET_VALUE='Cutoff Min ('+FLOAT2STR(mincutvalsuggest)+')' WIDGET_CONTROL,NormLabel,SET_VALUE='('+$ string(EditVars.normsuggest,FORMAT='(f7.5)')+')' RETURN END PRO SETEXPFAC, eventvalue common com_seditframe common com_wid_editframe doexpcorr=editvars.togglevals[2] IF tag_exist(hbase,'EXPTIME') THEN EditVars.basefac=1/hbase.exptime IF tag_exist(hprim,'EXPTIME') THEN EditVars.primfac=1/hprim.exptime IF EditVars.issoho THEN BEGIN IF editvars.primfilename NE backup.primfilename and datatype(hprim) EQ 'STC' THEN BEGIN IF (GET_EXP_FACTOR(hprim,efac,bias) NE 0) THEN BEGIN PRINT, 'Exposure factor not found or ignored for '+hprim.date_obs+' '+hprim.time_obs efac = 1. ENDIF EditVars.primfac=EditVars.primfac/efac ENDIF IF editvars.basefilename NE backup.basefilename and datatype(hbase) EQ 'STC' THEN BEGIN IF (GET_EXP_FACTOR(hbase,efac,bias) NE 0) THEN BEGIN PRINT, 'Exposure factor not found or ignored for '+hbase.date_obs+' '+hbase.time_obs efac = 1. ENDIF EditVars.basefac=EditVars.basefac/efac ENDIF endif IF ~(doexpcorr) THEN BEGIN EditVars.basefac=1. EditVars.primfac=1. ENDIF IF (Eventvalue ne 4) THEN BEGIN ; Anything except Super Base Frame EditVars.maxcutval=100*Editvars.primfac EditVars.mincutval=-100*Editvars.primfac MESSAGE,'Automatically adjusting contrast to '+ $ strtrim(EditVars.mincutval)+', '+strtrim(EditVars.maxcutval),/CONT ENDIF ELSE BEGIN EditVars.maxcutval=1000*Editvars.primfac EditVars.mincutval=0 MESSAGE,'Automatically adjusting contrast to 0, '+trim(editvars.maxcutval),/CONT EditVars.normsuggest=1.0 ENDELSE WIDGET_CONTROL,MaxCutField,SET_VALUE=FLOAT2STR(EditVars.maxcutval) WIDGET_CONTROL,MinCutField,SET_VALUE=FLOAT2STR(EditVars.mincutval) END PRO EDITFRAME_EV, Event common com_seditframe common com_wid_editframe WIDGET_CONTROL,Event.Id,GET_UVALUE=Ev if datatype(EV) ne 'STR' then Ev=Event.value If (Ev ne 'Undo') THEN Backup=EditVars filename='' basechange=0 ; if base image is changes will be set to 1 noupdate=0 ; Trivial changes to menu will set noupdate to 1, ; which tells the program not to bother updating everyting error=0 eventval=0 CASE Ev OF 'primbuttons': BEGIN error=0 EditVars.primbuttonval=Event.value CASE Event.Value OF 0: BEGIN EditVars.primimg=EditVars.InImg EditVars.primfilename=' < No File > ' WIDGET_CONTROL,primfilenamelabel,SET_VALUE=EditVars.primfilename END 1: IF (nomoviev) THEN BEGIN MESSAGE,'No frame information available.',/CONT error=1 ENDIF $ ELSE filename=EDIT_GETFILENAME(moviev,moviev.current,EditVars.issoho) 2: filename=PICKFILE(TITLE='Select FITS File') ; DON'T USE FILTER KEYWORD. IT MALFUNCTIONS ELSE: BEGIN MESSAGE,'Unknown button pressed',/CONT error=1 END ENDCASE if (filename EQ '') THEN error=1 IF (not error) THEN BEGIN EditVars.primimg=EDIT_LOADIMG(filename,EditVars.hsize,EditVars.vsize,temp,EditVars.issoho,h) hprim=h primimg0=EditVars.primimg primfile=filename help,moviev.rect IF moviev.rect NE 0 and moviev.rect NE 360 THEN BEGIN message,'Will rotate result '+trim(moviev.rect)+' deg.',/info ;EditVars.primimg = ROTATE(EditVars.primimg,2) ;temp = ROTATE(temp,2) ENDIF ;if moviev.rect then stop EditVars.primgaps=temp EditVars.gaps=EditVars.basegaps or EditVars.primgaps parts = str_sep(filename,'/') filename = parts(n_elements(parts)-1) EditVars.primfilename=filename WIDGET_CONTROL,primfilenamelabel,SET_VALUE=EditVars.primfilename IF (editvars.togglevals[2]) THEN setexpfac, event.value ENDIF ELSE IF (Event.value ne 0) THEN BEGIN EditVars.primbuttonval=Backup.primbuttonval WIDGET_CONTROL,primbuttons,SET_VALUE=EditVars.primbuttonval ENDIF END 'togglebuttons': BEGIN WIDGET_CONTROL,togglebuttons,GET_VALUE=togglevals EditVars.togglevals=togglevals doexpcorr=editvars.togglevals[2] IF (doexpcorr NE backup.togglevals[2]) THEN BEGIN ; Get exptime correction here, but apply it in EDIT_SHOWIMAGES. setexpfac,event.value endif END 'binbut': BEGIN WIDGET_CONTROL,pfwidgets[3],GET_VALUE=temp EditVars.pfval[3]=temp ;print,EditVars.pfval return END 'dopf': BEGIN WIDGET_CONTROL,pfwidgets[0],GET_VALUE=temp EditVars.pfval[0]=temp WIDGET_CONTROL,pfwidgets[1],GET_VALUE=temp EditVars.pfval[1]=temp WIDGET_CONTROL,pfwidgets[2],GET_VALUE=temp EditVars.pfval[2]=temp IF (EditVars.pfval[3]) THEN BEGIN pfv=EditVars.pfval point_filter,baseimg0,pfv[0],pfv[1],pfv[2],tmp,pts EditVars.baseimg=tmp point_filter,primimg0,pfv[0],pfv[1],pfv[2],tmp,pts EditVars.primimg=tmp ENDIF ELSE BEGIN EditVars.primimg=EDIT_LOADIMG(primfile,EditVars.hsize,EditVars.vsize,temp,EditVars.issoho,h,/pfilter) EditVars.baseimg=EDIT_LOADIMG(basefile,EditVars.hsize,EditVars.vsize,temp,EditVars.issoho,h,/pfilter) ENDELSE END 'Done': BEGIN ; WSET,rwindow ; device,get_visual_depth=depth ; if(depth gt 8) then begin ;; ------------------------------------ ;; --- HACKS BY HPW AND NRS 9/6/05 (to transfer date/time) ---; ; image = bytscl(EditVars.result,EditVars.mincutval,EditVars.maxcutval) ; wdef,0,im=image ; tv,image ; IF (EditVars.togglevals(1)) THEN XYOUTS, 10, 10, EditVars.date_obs+' '+strmid(EditVars.time_obs,0,8),/DEVICE, CHARSIZE=1.5 ;; --- ; EditVars.result = tvrd() ; wdelete,0 ;; ------------------------------------ ;;EditVars.result = bytscl(EditVars.result,EditVars.mincutval,EditVars.maxcutval) ; endif else $ ; EditVars.result=TVRD(0,0,EditVars.hsize,EditVars.vsize) EditVars.doneexit=1 WDELETE,rwindow WDELETE,pwindow WDELETE,bwindow WIDGET_CONTROL, event.top, /DESTROY WIDGET_CONTROL, groupleader, /DESTROY END 'basebuttons': BEGIN eventval=Event.Value basechange=1 IF (nomoviev) and (Event.Value ge 1) and (Event.Value le 3) THEN BEGIN MESSAGE,'No frame information available.',/CONT error=1 ENDIF $ ELSE CASE Event.Value OF 0: BEGIN ; None EditVars.baseimg=fltarr(EditVars.hsize,EditVars.vsize) EditVars.basefilename=' < No File > ' WIDGET_CONTROL,basefilenamelabel,SET_VALUE=EditVars.basefilename WIDGET_CONTROL,basefilenametime,SET_VALUE=' < No Time > ' EditVars.normsuggest=1.0 basefiletime=' ' END 1: BEGIN filename=EDIT_GETFILENAME(moviev,0,EditVars.issoho) ; Zeroth frame if strlen(moviev.img_hdrs[0].date_obs) lt 11 then $ basefiletime=moviev.img_hdrs[0].date_obs+'T'+moviev.img_hdrs[0].time_obs else $ basefiletime=moviev.img_hdrs[0].date_obs WIDGET_CONTROL,EditVars.basenval,SET_VALUE=moviev.current END 2: IF (moviev.current lt 1) THEN BEGIN ; Previous frame MESSAGE,'No previous frame.',/CONT error=1 ENDIF ELSE begin filename=EDIT_GETFILENAME(moviev,moviev.current-1,EditVars.issoho) if strlen(moviev.img_hdrs[moviev.current-1].date_obs) lt 11 then $ basefiletime=moviev.img_hdrs[moviev.current-1].date_obs+'T'+moviev.img_hdrs[moviev.current-1].time_obs else $ basefiletime=moviev.img_hdrs[moviev.current-1].date_obs WIDGET_CONTROL,EditVars.basenval,SET_VALUE=1 ENDELSE ; 3: IF (moviev.current lt 2) THEN BEGIN ; MESSAGE,'No image exists two frames prior to current frame.',/CONT ; error=1 ; ENDIF $ ; ELSE BEGIN ; filename=EDIT_GETFILENAME(moviev,moviev.current-2,EditVars.issoho) ; if strlen(moviev.img_hdrs[moviev.current-2].date_obs) lt 11 then $ ; basefiletime=moviev.img_hdrs[moviev.current-2].date_obs+'T'+moviev.img_hdrs[moviev.current-2].time_obs else $ ; basefiletime=moviev.img_hdrs[moviev.current-2].date_obs ; WIDGET_CONTROL,EditVars.basenval,SET_VALUE=2 ; ENDELSE 3: BEGIN filename=EDIT_GETSUPERBASENAME(moviev,moviev.current) if strlen(moviev.img_hdrs[moviev.current].date_obs) lt 11 then $ basefiletime=moviev.img_hdrs[moviev.current].date_obs+'T'+moviev.img_hdrs[moviev.current].time_obs else $ basefiletime=moviev.img_hdrs[moviev.current].date_obs END 4: filename=PICKFILE(TITLE='Select FITS File') ELSE: MESSAGE,'Unknown button pressed',/CONT ENDCASE END 'NEXT': BEGIN basechange=1 WIDGET_CONTROL,EditVars.basenval,GET_VALUE=basenv basenv=basenv+1 IF (moviev.current-basenv lt 0) THEN BEGIN MESSAGE,'No image exists '+string(basenv)+' frames prior to current frame.',/CONT basenv=moviev.current WIDGET_CONTROL,EditVars.basenval,SET_VALUE=basenv error=1 ENDIF $ ELSE BEGIN filename=EDIT_GETFILENAME(moviev,moviev.current-basenv,EditVars.issoho) if strlen(moviev.img_hdrs[moviev.current-basenv].date_obs) lt 11 then $ basefiletime=moviev.img_hdrs[moviev.current-basenv].date_obs+'T'+moviev.img_hdrs[moviev.current-basenv].time_obs else $ basefiletime=moviev.img_hdrs[moviev.current-basenv].date_obs WIDGET_CONTROL,EditVars.basenval,SET_VALUE=basenv ENDELSE END 'PREV': BEGIN basechange=1 WIDGET_CONTROL,EditVars.basenval,GET_VALUE=basenv basenv=basenv-1 IF (moviev.current-basenv gt n_elements(moviev.frames)-1) THEN BEGIN MESSAGE,'No image exists '+string(basenv)+' frames after to current frame.',/CONT basenv= ((n_elements(moviev.frames)-moviev.current)-1)*(-1) WIDGET_CONTROL,EditVars.basenval,SET_VALUE=basenv error=1 ENDIF $ ELSE BEGIN filename=EDIT_GETFILENAME(moviev,moviev.current-basenv,EditVars.issoho) if strlen(moviev.img_hdrs[moviev.current-basenv].date_obs) lt 11 then $ basefiletime=moviev.img_hdrs[moviev.current-basenv].date_obs+'T'+moviev.img_hdrs[moviev.current-basenv].time_obs else $ basefiletime=moviev.img_hdrs[moviev.current-basenv].date_obs WIDGET_CONTROL,EditVars.basenval,SET_VALUE=basenv ENDELSE END 'BASENSEL': BEGIN basechange=1 WIDGET_CONTROL,EditVars.basenval,GET_VALUE=basenv IF (moviev.current-basenv lt 0) THEN BEGIN MESSAGE,'No image exists '+string(basenv)+' frames prior to current frame.',/CONT basenv=moviev.current WIDGET_CONTROL,EditVars.basenval,SET_VALUE=basenv ; error=1 ENDIF IF (moviev.current-basenv gt n_elements(moviev.frames)-1) THEN BEGIN MESSAGE,'No image exists '+string(basenv)+' frames after to current frame.',/CONT basenv= ((n_elements(moviev.frames)-moviev.current)-1)*(-1) WIDGET_CONTROL,EditVars.basenval,SET_VALUE=basenv ; error=1 ENDIF filename=EDIT_GETFILENAME(moviev,moviev.current-basenv,EditVars.issoho) if strlen(moviev.img_hdrs[moviev.current-basenv].date_obs) lt 11 then $ basefiletime=moviev.img_hdrs[moviev.current-basenv].date_obs+'T'+moviev.img_hdrs[moviev.current-basenv].time_obs else $ basefiletime=moviev.img_hdrs[moviev.current-basenv].date_obs WIDGET_CONTROL,EditVars.basenval,SET_VALUE=basenv END 'DoSugVal': BEGIN ; apply suggested expfac EditVars.normval=EditVars.normsuggest WIDGET_CONTROL,NormField,SET_VALUE=EditVars.normsuggest END 'NormField': BEGIN ; If (Event.type eq 3) THEN noupdate=1 ; Only useful if /ALL_EVENTS set in widget declaration WIDGET_CONTROL,NormField,GET_VALUE=temp EditVars.normval=temp(0) END 'MaxCutField': BEGIN ; If (Event.type eq 3) THEN noupdate=1 WIDGET_CONTROL,MaxCutField,GET_VALUE=temp EditVars.maxcutval=temp(0) END 'MinCutField': BEGIN ; If (Event.type eq 3) THEN noupdate=1 WIDGET_CONTROL,MinCutField,GET_VALUE=temp EditVars.mincutval=temp(0) END 'KernelField': BEGIN ; If (Event.type eq 3) THEN noupdate=1 EditVars.kernelval=Event.Value IF (EditVars.kernelval GT 2) THEN BEGIN EditVars.primimg=EditVars.primimg-smooth(EditVars.primimg,EditVars.kernelval) EditVars.baseimg=EditVars.baseimg-smooth(EditVars.baseimg,EditVars.kernelval) ENDIF END 'charField': BEGIN EditVars.charsz=Event.Value END 'Undo': BEGIN SWAPxy,EditVars,Backup ; reset all the widget values accordingly WIDGET_CONTROL,primbuttons,SET_VALUE=EditVars.primbuttonval WIDGET_CONTROL,primfilenamelabel,SET_VALUE=EditVars.primfilename WIDGET_CONTROL,basebuttons,SET_VALUE=EditVars.basebuttonval WIDGET_CONTROL,basefilenamelabel,SET_VALUE=EditVars.basefilename WIDGET_CONTROL,basefiletimelabel,SET_VALUE=basefiletime WIDGET_CONTROL,togglebuttons,SET_VALUE=EditVars.togglevals WIDGET_CONTROL,MaxCutField,SET_VALUE=FLOAT2STR(EditVars.maxcutval) WIDGET_CONTROL,MinCutField,SET_VALUE=FLOAT2STR(EditVars.mincutval) WIDGET_CONTROL,KernelField,SET_VALUE=EditVars.kernelval WIDGET_CONTROL,NormField,SET_VALUE=string(EditVars.normval,format='(f7.5)') END 'Quit': BEGIN WDELETE,rwindow WDELETE,pwindow WDELETE,bwindow WIDGET_CONTROL, event.top, /DESTROY WIDGET_CONTROL, groupleader, /DESTROY END ELSE: MESSAGE, "Event User Value Not Found",/CONT ENDCASE IF (basechange eq 1) THEN BEGIN if (filename eq '') THEN error=1 IF (not error) THEN BEGIN EditVars.basebuttonval=Eventval EditVars.baseimg=EDIT_LOADIMG(filename,EditVars.hsize,EditVars.vsize,temp,EditVars.issoho,h) hbase=h baseimg0=EditVars.baseimg basefile=filename help,moviev.rect ;IF moviev.rect EQ 180 THEN BEGIN ; EditVars.baseimg = ROTATE(EditVars.baseimg,2) ; temp = ROTATE(temp,2) ;ENDIF EditVars.basegaps=temp EditVars.gaps=EditVars.basegaps or EditVars.primgaps EditVars.normsuggest=MEDIAN(EditVars.baseimg)/MEDIAN(EditVars.primimg) parts = str_sep(filename,'/') filename = parts(n_elements(parts)-1) EditVars.basefilename=filename WIDGET_CONTROL,basefilenamelabel,SET_VALUE=EditVars.basefilename WIDGET_CONTROL,basefilenametime,SET_VALUE=basefiletime IF (editvars.togglevals[2]) THEN setexpfac, eventval ENDIF IF (Ev eq 'basebuttons') THEN BEGIN IF (Event.value ne 0) and (error eq 1) THEN BEGIN EditVars.basebuttonval=Backup.basebuttonval WIDGET_CONTROL,basebuttons,SET_VALUE=EditVars.basebuttonval ENDIF ENDIF ENDIF IF ((Ev ne 'Quit') and (Ev ne 'Done')) and (noupdate eq 0) THEN BEGIN IF EditVars.solr EQ 0 and (EditVars.togglevals[4]) THEN $ message,'Sorry, solar radius is undefined.',/info ELSE $ EDIT_SHOWIMAGES ;EDIT_UPDATEWIDGETS ENDIF END PRO EDIT_DEFINEWIDGETS common com_seditframe common com_wid_editframe ;junk = { CW_PDMENU_S, flags:0, name:'' } ; ??? IDL's "wided" wrote this line. groupleader = Widget_Base(Map=0) Widget_Control, groupleader, /Realize EditFrameBase = WIDGET_BASE(/COLUMN, TITLE='Edit Frame',group_leader=groupleader,/modal,XOFFSET=moviev.basexoff(0), YOFFSET=moviev.baseyoff(0) ) EDITFrameRowBase = WIDGET_BASE(EditFrameBase,/ROW) LeftBase = WIDGET_BASE(EditFrameRowBase,/COLUMN,/MAP,TITLE='First Third', $ UVALUE='LeftBase') BASE5 = WIDGET_BASE(LeftBase,/COLUMN,FRAME=1,/MAP,TITLE='Primary Image', $ UVALUE='BASE5') LABEL6 = WIDGET_LABEL( BASE5, UVALUE='LABEL6', VALUE='Primary Image') Btns125 = ['Current Movie Frame','Original Image','Pick Filename' ] primbuttons = CW_BGROUP( BASE5, Btns125, /COLUMN, EXCLUSIVE=1, $ UVALUE='primbuttons', SET_VALUE=EditVars.primbuttonval) primfilenamelabel = WIDGET_LABEL( BASE5, UVALUE='primfilenamelabel', $ VALUE=EditVars.primfilename) Btns128 = ['Fix Data Gaps' , 'Time Stamp','Exp Correction', 'Add Logo', 'Add limb'] ; Might want to make "remove stars" a regular button rather than part of CW_BGROUP togglebuttons = CW_BGROUP( LeftBase, Btns128, /COLUMN, NONEXCLUSIVE=1, $ UVALUE='togglebuttons',SET_VALUE=EditVars.togglevals) ; ; Middle column ; MiddleBase = WIDGET_BASE(EditFrameRowBase, /COLUMN, /MAP, TITLE='Second Third', $ UVALUE='MiddleBase') BASE46 = WIDGET_BASE(MiddleBase, /COLUMN, FRAME=1, /MAP, TITLE='Base Image', $ UVALUE='BASE46') ; BASE12 = WIDGET_BASE(BASE46, /ROW, /MAP, UVALUE='BASE12') LABEL44 = WIDGET_LABEL( BASE46, UVALUE='LABEL44', VALUE='Base Image') Btns135 = ['None','Zeroth Frame','Previous Image',$ ;'Two Frames Prior', $ 'Super Base Frame','Pick Filename' ] basebuttons = CW_BGROUP( BASE46, Btns135, /COLUMN, EXCLUSIVE=1, $ UVALUE='basebuttons', SET_VALUE=EditVars.basebuttonval) BASE12 = WIDGET_BASE(BASE46, /ROW) LABEL12 = WIDGET_LABEL( BASE12, VALUE='Base Frame = n-') tmp = CW_BGROUP(BASE12, ['<'], /ROW, BUTTON_UVALUE = ['PREV']) EditVars.basenval = CW_FIELD(BASE12,title='', /RETURN_EVENTS,value='0',xsize=3,UVALUE='BASENSEL') tmp = CW_BGROUP(BASE12, ['>'], /ROW, BUTTON_UVALUE = ['NEXT']) basefilenamelabel = WIDGET_LABEL( BASE46, $ UVALUE='basefilenamelabel', VALUE=EditVars.basefilename) basefilenametime = WIDGET_LABEL( BASE46, $ UVALUE='basefilenametime', VALUE=' ') pfbase = WIDGET_BASE(middleBase, row=2, FRAME=1, /MAP, UVALUE='pfbase') ;pflabel = WIDGET_LABEL( UnsharpBase, UVALUE='pflabel', VALUE=' Unsharp Mask',YSIZE=15) pfwidgets=intarr(4) pfwidgets[0] = CW_FIELD( pfbase,VALUE=EditVars.pfval[0], /INTEGER, /RETURN_EVENTS,$ TITLE='Width',/column, UVALUE='pf0', XSIZE=3) pfwidgets[1] = CW_FIELD( pfbase,VALUE=EditVars.pfval[1], /INTEGER, /RETURN_EVENTS,$ TITLE='Thres',/column, UVALUE='pf1', XSIZE=3) pfwidgets[2] = CW_FIELD( pfbase,VALUE=EditVars.pfval[2], /INTEGER, /RETURN_EVENTS,$ TITLE='Itera',/column, UVALUE='pf2', XSIZE=3) pfwidgets[3] = CW_BGROUP(pfbase, [' '],LABEL_TOP='Bin',/nonexclusive, $ UVALUE='binbut',set_value=EditVars.pfval[3]) pfb = WIDGET_BUTTON(pfbase,UVALUE='dopf', VALUE=' Do Point_Filter ') dum = WIDGET_LABEL(pfbase,UVALUE='nothing', VALUE='') dum = WIDGET_LABEL(pfbase,UVALUE='nothing', VALUE='') dum = WIDGET_LABEL(pfbase,UVALUE='nothing', VALUE='') ; undobutton = WIDGET_BUTTON( LeftBase, UVALUE='Undo', VALUE='Undo Last Change') ; cancelbutton = WIDGET_BUTTON( MiddleBase, UVALUE='Quit', VALUE='Quit (Don''t Save)') RightBase = WIDGET_BASE(EditFrameRowBase, /COLUMN, /MAP, $ TITLE='Third Third (Options)', UVALUE='RightBase') ContrastBase = WIDGET_BASE(RightBase, /COLUMN, FRAME=1, /MAP, $ TITLE='Contrast Base', UVALUE='ContrastBase') ContrastLabel = WIDGET_LABEL(ContrastBase,VALUE='Adjust Contrast',YSIZE=15) MaxCutBase = WIDGET_BASE(ContrastBase,/ROW,/MAP) ; All the "field" widgets will only return events when the user presses RETURN. This was ; done deliberately, so that the program isn't constantly updating the images while ; the user is trying to type. To make the fields return events for all actions in the ; field, add the keyword /ALL_EVENTS. ; NOTE: WIDGETLABEL & WIDGET_TEXT are used instead of the ordinary CW_FIELD because ; CW_FIELD won't allow one to dynamically assign the "title" of the field. device,get_visual_depth=depth maxcutvalsuggest=(depth gt 8) ? 256 : FLOAT(!D.N_COLORS) ; 24-bit color check MaxCutLabel=WIDGET_LABEL(MaxCutBase,VALUE='Cutoff Max ('+FLOAT2STR(maxcutvalsuggest)+')',$ /ALIGN_RIGHT, YSIZE=30) maxcutval=(depth gt 8) ? 256 : FLOAT(!D.N_COLORS) ; 24-bit color check MaxCutField=WIDGET_TEXT(MaxCutBase,/EDITABLE,UVALUE='MaxCutField',$ VALUE=FLOAT2STR(EditVars.maxcutval), XSIZE=5) MinCutBase = WIDGET_BASE(ContrastBase,/ROW,/MAP) mincutvalsuggest=FLOAT(0) MinCutLabel=WIDGET_LABEL(MinCutBase,VALUE='Cutoff Min ('+FLOAT2STR(mincutvalsuggest)+')',$ /ALIGN_RIGHT, YSIZE=30) mincutval=0. MinCutField=WIDGET_TEXT(MinCutBase,/EDITABLE,UVALUE='MinCutField',$ VALUE=FLOAT2STR(EditVars.mincutval), XSIZE=5) UnsharpBase = WIDGET_BASE(RightBase, /COLUMN, FRAME=1, /MAP, $ TITLE='Unsharp Mask Base', UVALUE='UnsharpBase') LABEL54 = WIDGET_LABEL( UnsharpBase, UVALUE='LABEL54', $ VALUE=' Unsharp Mask',YSIZE=15) KernelField = CW_FIELD( UnsharpBase,VALUE=EditVars.kernelval, /ROW, /INTEGER, /RETURN_EVENTS,$ TITLE=' Kernel Size', UVALUE='KernelField', XSIZE=3) NormBase0 = WIDGET_BASE(RightBase, /column, FRAME=1, /MAP, TITLE='Normalization Base', UVALUE='NormBase') NormBase = WIDGET_BASE(NormBase0,/row) normval=1.0 NormLabel = WIDGET_LABEL( NormBase, UVALUE='NormTopLabel', VALUE=' ('+string(EditVars.normsuggest,format='(f7.5)')+')') dosuggestbutton = WIDGET_BUTTON( Normbase, UVALUE='DoSugVal', VALUE=' Apply ') NormBase2= WIDGET_BASE(NormBase0,/row) ; NormLabel = WIDGET_LABEL( NormBase2, UVALUE='NormLabel', YSIZE=30,$ ; VALUE= ' ('+FLOAT2STR(EditVars.normsuggest)+') ',/ALIGN_RIGHT) NormField = CW_FIELD(NormBase2,VALUE=string(EditVars.normval,format='(f7.5)'), /ALL_EVENTS, $ UVALUE='NormField',XSIZE=9, TITLE='Expfac:') ;NormField = CW_FSLIDER (NormBase2, VALUE=EditVars.normval, UVALUE='NormField', $ ; /DRAG, MIN=EditVars.normval-0.5, MAX=EditVars.normval+.5,format='(f7.5)', $ ; /edit,scroll=0.1,double=0) ;widget_control, NormField, set_val=EditVars.normval charBase= WIDGET_BASE(RightBase,/COLUMN, FRAME=1, /MAP, $ TITLE='char Base', UVALUE='charBase') charField = CW_FIELD( charBase,VALUE=EditVars.charsz, /ALL_EVENTS,$ TITLE='Charsize = ', UVALUE='charField', XSIZE=6) bottomrow = WIDGET_BASE( EditFrameBase,/ROW) undobutton = WIDGET_BUTTON( bottomrow, UVALUE='Undo', VALUE='Undo Last Change') cancelbutton = WIDGET_BUTTON(bottomrow, UVALUE='Quit', VALUE='Quit (Don''t Save)') donebutton = WIDGET_BUTTON( bottomrow, UVALUE='Done', VALUE='Done') WIDGET_CONTROL, editframebase, /REALIZE ; make widgets appear on screen XMANAGER, 'xeditframe', EditFrameBase, EVENT_HANDLER='editframe_ev';,$ ; GROUP_LEADER=GROUP , /MODAL ; /MODAL freezes all other widgets until RETURN END PRO SCCXEDITFRAMEX, InImg, FinalImg,Inmoviev, GROUP=Group common com_seditframe common com_wid_editframe winsave=!D.WINDOW IF (XRegistered("xeditframe") NE 0) THEN RETURN ; IF N_ELEMENTS(Group) EQ 0 THEN GROUP=0 ;??? IDL's "wided" wrote this ;** Initialize variables IF (N_ELEMENTS(Inmoviev) ne 0) THEN BEGIN hdr=Inmoviev.img_hdrs(Inmoviev.current) date_obs=hdr.date_obs+' '+hdr.time_obs nomoviev=0 moviev=Inmoviev det=hdr.detector;+'-'+strmid(hdr.filename,strpos(hdr.filename,'.f')-1,1) dindx=where(['C2','C3','EIT'] EQ det,issoho) if issoho then camt=det else camt=det+'-'+strmid(hdr.filename,strpos(hdr.filename,'.f')-1,1) sunc=[hdr.xcen,hdr.ycen] arcs=hdr.cdelt1 solr=hdr.rsun crota=hdr.crota ENDIF $ ELSE BEGIN date_obs='' time_obs='' nomoviev=1 sunc=[0.0,0.0] arcs=0.0 solr=0.0 crota=0.0 END IF (N_ELEMENTS(InImg) eq 0) THEN InImg=dist(100,100) tmp=size(InImg) if(tmp[0] eq 3) then begin hsize=tmp(2) vsize=tmp(3) endif else begin hsize=tmp(1) vsize=tmp(2) endelse primimg=double(InImg) result=primimg doneexit=0 baseimg=FLTARR(hsize,vsize) primgaps=INTARR(hsize,vsize) basegaps=primgaps gaps=basegaps OR primgaps help,gaps window,XSIZE=hsize,YSIZE=vsize,retain=2,TITLE='Edit Frame: Base Image',/FREE,XPOS=1100-hsize,YPOS=0 bwindow=!D.WINDOW window,XSIZE=hsize,YSIZE=vsize,retain=2,TITLE='Edit Frame: Primary Image',/FREE,XPOS=1100-hsize,YPOS=300 pwindow=!D.WINDOW window,XSIZE=hsize,YSIZE=vsize,retain=2,TITLE='Edit Frame: Result Image',/FREE,XPOS=1100-hsize,YPOS=700 rwindow=!D.WINDOW setdefaults=1 IF datatype(EditVars) EQ 'STC' THEN if arcs EQ editvars.arcs THEN setdefaults=0 IF issoho THEN nofile=' < No File > ' ELSE nofile=' < No File > ' IF setdefaults THEN BEGIN ; ; Set Defaults ; togglevals=[1,1,1,0,1] pfvals=[5,7,3,1] ;maxcutvalsuggest=(depth gt 8 ) ? 256 : FLOAT(!D.N_COLORS) ;mincutvalsuggest=FLOAT(0) kernelval=0 charsz=1.0 ENDIF ELSE BEGIN togglevals =editvars.togglevals pfvals =editvars.pfval kernelval =editvars.kernelval charsz =editvars.charsz ENDELSE normsuggest=1.0 normval=1.0 mincutval=0. device,get_visual_depth=depth maxcutval=(depth gt 8) ? 256 : FLOAT(!D.N_COLORS) basebuttonval=0 primbuttonval=0 primfile=nofile basefile=nofile basenval=0 ;stop EditVars={$ primimg:primimg,$ baseimg:baseimg,$ result:result,$ InImg:InImg,$ gaps:gaps,$ primgaps:primgaps,$ basegaps:basegaps,$ hsize:hsize,$ vsize:vsize,$ ;nomoviev:nomoviev,$ date_obs:date_obs,$ ; time_obs:time_obs,$ pfval:pfvals, $ primbuttonval:primbuttonval,$ basebuttonval:basebuttonval,$ basenval:basenval,$ primfilename:primfile,$ basefilename:basefile,$ togglevals:togglevals,$ maxcutval:float(maxcutval),$ mincutval:float(mincutval),$ kernelval:kernelval,$ normsuggest:normsuggest,$ normval:normval,$ basefac:1., $ primfac:1., $ camt:camt,$ sunc:sunc,$ arcs:arcs,$ solr:solr,$ crota:crota,$ issoho:issoho,$ charsz:charsz,$ doneexit:doneexit} EditVars.doneexit=0 ;Edit_ShowImages EDIT_DEFINEWIDGETS IF (EditVars.doneexit) THEN FinalImg=EditVars.result $; If "Done" was used instead of "Quit" ELSE FinalImg=InImg IF (winsave GT -1) THEN WSET,winsave END