pro ff_initial_event,event ;Author: Rick Pernak, NASA Goddard Space Flight Center widget_control,event.top,get_uvalue=ff_ptr ff = *ff_ptr dat = ff.dat ;make inputs widget_control,dat.date,get_value=date widget_control,dat.time1,get_value=time1 widget_control,dat.time2,get_value=time2 widget_control,dat.elo,get_value=en1 widget_control,dat.ehi,get_value=en2 widget_control,dat.xoff,get_value=xoff widget_control,dat.yoff,get_value=yoff ;make savefile name date = date+' ' split = strsplit(date,'-',/extract) name=strcompress(split[0]+split[1]+split[2],/rem) split = strsplit(time1,':',/extract) t1 = split[0]+split[1]+split[2] split = strsplit(time2,':',/extract) t2 = split[0]+split[1]+split[2] t = t1+'-'+t2 name = name+'_'+t sen1 = string(fix(en1)) & sen2 = string(fix(en2)) sen = 'E'+sen1+'-'+sen2 sen = strcompress(sen,/rem) vis_name = name+sen+'.sav' name = name+sen+'_ff.sav' ;make new time arrays for input t1 = date+time1 t2 = date+time2 time = [t1,t2] xyoffset = fix([xoff,yoff]) energy = [float(en1),float(en2)] det = dat.udet inputs={time:time,xyoffset:xyoffset,det:det,energy:energy} widget_control,dat.n,get_value=n n = (fix(n))[0] shape = dat.shape shape = strlowcase(shape) ;initialize "guess" structures for use in hsi_vis_fwdfit srcparm = {srctype:shape,srcflux:0.,srcx:0.,srcy:0.,srcfwhm:0.,eccen:0.,$ srcpa:0.,loop_angle:0.,albedo_ratio:0.,srcheight:0.} srcparm = replicate(srcparm,n) ;assign values to the guess structures, based on user input widget_control,ff.srcx1,get_value=srcx1 widget_control,ff.srcy1,get_value=srcy1 widget_control,ff.flux1,get_value=flux1 widget_control,ff.fwhm1,get_value=fwhm1 srcparm[0].srcx = double(srcx1) srcparm[0].srcy = double(srcy1) srcparm[0].srcflux = double(flux1) srcparm[0].srcfwhm = double(fwhm1) if shape ne 'circle' then begin widget_control,ff.eccen1,get_value=eccen1 widget_control,ff.srcpa1,get_value=srcpa1 srcparm[0].eccen = double(eccen1) srcparm[0].srcpa = double(srcpa1) if shape eq 'loop' then begin widget_control,ff.loop_angle1,get_value=loop_angle1 srcparm[0].loop_angle = double(loop_angle1) endif endif if n ge 2 then begin widget_control,ff.srcx2,get_value=srcx2 widget_control,ff.srcy2,get_value=srcy2 widget_control,ff.flux2,get_value=flux2 widget_control,ff.fwhm2,get_value=fwhm2 srcparm[1].srcx = double(srcx2) srcparm[1].srcy = double(srcy2) srcparm[1].srcflux = double(flux2) srcparm[1].srcfwhm = double(fwhm2) if shape ne 'circle' then begin widget_control,ff.eccen2,get_value=eccen2 widget_control,ff.srcpa2,get_value=srcpa2 srcparm[1].eccen = double(eccen2) srcparm[1].srcpa = double(srcpa2) if shape eq 'loop' then begin widget_control,ff.loop_angle2,get_value=loop_angle2 srcparm[1].loop_angle = double(loop_angle2) endif endif endif if n ge 3 then begin widget_control,ff.srcx3,get_value=srcx3 widget_control,ff.srcy3,get_value=srcy3 widget_control,ff.flux3,get_value=flux3 widget_control,ff.fwhm3,get_value=fwhm3 srcparm[2].srcx = double(srcx3) srcparm[2].srcy = double(srcy3) srcparm[2].srcflux = double(flux3) srcparm[2].srcfwhm = double(fwhm3) if shape ne 'circle' then begin widget_control,ff.eccen3,get_value=eccen3 widget_control,ff.srcpa3,get_value=srcpa3 srcparm[2].eccen = double(eccen3) srcparm[2].srcpa = double(srcpa3) if shape eq 'loop' then begin widget_control,ff.loop_angle3,get_value=loop_angle3 srcparm[2].loop_angle = double(loop_angle3) endif endif endif ;restore visibilties for forward fitting vise = *dat.vis_edit visc = *dat.vis_con ;hsi_vis_fwdfit,visc,/multi,srcin=srcparm,fitsstddev=fitstddev,srcout=temp ;FORWARD FIT, finally if shape eq 'circle' then begin if n eq 1 then begin hsi_vis_mpfit,visc,srcin=srcparm,/circle,srcout=visfit,syserr=0.10,$ noplotfit=0,qflag=1,id='mpfit',rchisq,fitstddev=sigma,/show endif else begin hsi_vis_mpfit,visc,srcin=srcparm,/multi,srcout=visfit,syserr=0.10,$ noplotfit=0,qflag=1,id='mpfit',rchisq,fitstddev=sigma,/show endelse endif else if shape eq 'ellipse' then begin ;forward fit only fits a single ellipse! (default) hsi_vis_mpfit,visc,srcin=srcparm,srcout=visfit,syserr=0.10,$ noplotfit=0,qflag=1,id='mpfit',rchisq,fitstddev=sigma,/show endif else begin hsi_vis_mpfit,visc,srcin=srcparm,/loop,srcout=visfit,syserr=0.10,$ noplotfit=0,qflag=1,id='mpfit',rchisq,fitstddev=sigma,/show endelse ;sigma = fitstddev save,visfit,sigma,srcparm,filename=name chi2_profile,visfit,visc ;calculate phase radius for usershell ; phz_x = visfit.srcx ; phz_y = visfit.srcy ; phz_dist = sqrt((phz_x[1]-phz_x[0])^2+(phz_y[1]-phz_y[0])^2) ; phz = phz_dist/2. ;calculate xyoffset for usershell ; xyoff = [mean(visfit.srcx),mean(visfit.srcy)] ; print,xyoff ;regenerate visibilities with phase radius and xyoffset ; vis = hsi_vis_usershell(save=vis_name,xy=xyoff,time=time,en=energy,det=det,$ ; phz=phz) ; vise = hsi_vis_edit(vis) ; visc = hsi_vis_combine(vise,/con) ; hsi_vis_fwdfit,visc,/show,/multi,srcout=visfit,srcin=visfit,maxiter=1500,$ ; fitstddev=fitstddev,phz=phz,xy=xy ;endif else begin ; hsi_vis_fwdfit,visc,srcout=visfit,srcin=srcparm,maxiter=1500,$ ; fitstddev=fitstddev ; hsi_vis_fwdfit,visc,/show,srcout=visfit,srcin=srcparm,maxiter=1500,$ ; fitstddev=fitstddev,phz=phz,xyoff=xyoff ;endelse ;store fit data, uncertainties, and user inputs *dat.visfit = visfit *dat.sigma = sigma *dat.visin = srcparm ff.dat = dat *ff_ptr = ff end pro ff_initial,event ;get data structure from ff_gui widget_control,event.top,get_uvalue=datptr dat = *datptr ;determine number of sources widget_control,dat.n,get_value=n n = fix(n) ;determine shape shape = dat.shape if (shape ne 'Circle') and (n gt 1) then begin box = dialog_message('Forward Fit can only fit to a single Elliptical Gaussian or Loop',$ dialog_parent=event.id) retall endif if (shape eq 'Circle') and (n gt 2) then begin box = dialog_message('Forward Fit can only fit a pair of Circular Gaussians',$ dialog_parent=event.id) retall endif ;create top level base for forward fitting device,get_screen_size=screen xpos=screen[0]/3. ypos=screen[1]/3. tlb_ff = widget_base(title='Initial Guesses for Forward Fitting',row=8,$ xoffset=xpos,yoffset=ypos,/base_align_center,tlb_frame_attr=1) main = widget_base(tlb_ff,column=n) ;create source parameter widgets source1 = widget_base(main,column=1) label = widget_label(source1,value='Source 1') base1 = widget_base(source1,row=7,/grid_layout) label = widget_label(base1,value='SRCX: ') srcx1 = widget_text(base1,value='815.01',xsize=7,/editable) label = widget_label(base1,value='SRCY: ') srcy1 = widget_text(base1,value='270.96',xsize=7,/editable) label = widget_label(base1,value='FWHM: ') fwhm1 = widget_text(base1,value='10',xsize=7,/editable) label = widget_label(base1,value='Flux: ') flux1 = widget_text(base1,value='695.24',xsize=7,/editable) if (shape eq 'Ellipse' or shape eq 'Loop') then begin label = widget_label(base1,value='Eccentricity: ') eccen1 = widget_text(base1,value='0.00',xsize=7,/editable) label = widget_label(base1,value='Position Angle: ') srcpa1 = widget_text(base1,value='00',xsize=7,/editable) if (shape eq 'Loop') then begin label = widget_label(base1,value='Loop Angle: ') loop_angle1 = widget_text(base1,value='00',xsize=7,/editable) endif else begin label = widget_label(base1,value='Loop Angle: ',sensitive=0) loop_angle1 = widget_text(base1,value='00',xsize=7,sensitive=0) endelse endif else begin label = widget_label(base1,value='Eccentricity: ',sensitive=0) eccen1 = widget_text(base1,value='0.00',xsize=7,/editable,sensitive=0) label = widget_label(base1,value='Position Angle: ',sensitive=0) srcpa1 = widget_text(base1,value='00',xsize=7,/editable,sensitive=0) label = widget_label(base1,value='Loop Angle: ',sensitive=0) loop_angle1 = widget_text(base1,value='00',xsize=7,/editable,sensitive=0) endelse ff_par = {srcx1:srcx1,srcy1:srcy1,flux1:flux1,fwhm1:fwhm1,$ eccen1:eccen1,srcpa1:srcpa1,loop_angle1:loop_angle1,dat:*datptr,$ visfit:ptr_new(/allocate_heap),sigma:ptr_new(/allocate_heap)} if (n ge 2) then begin source2 = widget_base(main,column=1) label = widget_label(source2,value='Source 2') base2 = widget_base(source2,row=7,/grid_layout) label = widget_label(base2,value='SRCX: ') srcx2 = widget_text(base2,value='820.23',xsize=7,/editable) label = widget_label(base2,value='SRCY: ') srcy2 = widget_text(base2,value='237.04',xsize=7,/editable) label = widget_label(base2,value='FWHM: ') fwhm2 = widget_text(base2,value='5',xsize=7,/editable) label = widget_label(base2,value='Flux: ') flux2 = widget_text(base2,value='569.36',xsize=7,/editable) if (shape eq 'Ellipse' or shape eq 'Loop') then begin label = widget_label(base2,value='Eccentricity: ') eccen2 = widget_text(base2,value='0.00',xsize=7,/editable) label = widget_label(base2,value='Position Angle: ') srcpa2 = widget_text(base2,value='00',xsize=7,/editable) if (shape eq 'Loop') then begin label = widget_label(base2,value='Loop Angle: ') loop_angle2 = widget_text(base2,value='00',xsize=7,/editable) endif else begin label = widget_label(base2,value='Loop Angle: ',sensitive=0) loop_angle2 = widget_text(base2,value='00',xsize=7,sensitive=0) endelse endif else begin label = widget_label(base2,value='Eccentricity: ',sensitive=0) eccen2 = widget_text(base2,value='0.00',xsize=7,/editable,sensitive=0) label = widget_label(base2,value='Position Angle: ',sensitive=0) srcpa2 = widget_text(base2,value='00',xsize=7,/editable,sensitive=0) label = widget_label(base2,value='Loop Angle: ',sensitive=0) loop_angle2 = widget_text(base2,value='00',xsize=7,/editable,sensitive=0) endelse ff_par = {srcx1:srcx1,srcx2:srcx2,srcy1:srcy1,srcy2:srcy2,$ flux1:flux1,flux2:flux2,fwhm1:fwhm1,fwhm2:fwhm2,$ eccen1:eccen1,eccen2:eccen2,srcpa1:srcpa1,$ srcpa2:srcpa2,loop_angle1:loop_angle1,$ loop_angle2:loop_angle2,dat:*datptr,$ visfit:ptr_new(/allocate_heap),sigma:ptr_new(/allocate_heap)} endif if (n eq 3) then begin source3 = widget_base(main,column=1) label = widget_label(source3,value='Source 3') base3 = widget_base(source3,row=7,/grid_layout) label = widget_label(base3,value='SRCX: ') srcx3 = widget_text(base3,value='000.00',xsize=7,/editable) label = widget_label(base3,value='SRCY: ') srcy3 = widget_text(base3,value='000.00',xsize=7,/editable) label = widget_label(base3,value='FWHM: ') fwhm3 = widget_text(base3,value='00',xsize=7,/editable) label = widget_label(base3,value='Flux: ') flux3 = widget_text(base3,value='000.00',xsize=7,/editable) if (shape ne 'Circle') then begin label = widget_label(base3,value='Eccentricity: ') eccen3 = widget_text(base3,value='0.00',xsize=7,/editable) label = widget_label(base3,value='Position Angle: ') srcpa3 = widget_text(base3,value='00',xsize=7,/editable) if (shape eq 'Loop') then begin label = widget_label(base3,value='Loop Angle: ') loop_angle3 = widget_text(base3,value='00',xsize=7,/editable) endif else begin label = widget_label(base3,value='Loop Angle: ',sensitive=0) loop_angle3 = widget_text(base3,value='00',xsize=7,sensitive=0) endelse endif else begin label = widget_label(base3,value='Eccentricity: ',sensitive=0) eccen3 = widget_text(base3,value='0.00',xsize=7,/editable,sensitive=0) label = widget_label(base3,value='Position Angle: ',sensitive=0) srcpa3 = widget_text(base3,value='00',xsize=7,/editable,sensitive=0) label = widget_label(base3,value='Loop Angle: ',sensitive=0) loop_angle3 = widget_text(base3,value='00',xsize=7,/editable,sensitive=0) endelse ff_par = {srcx1:srcx1,srcx2:srcx2,srcx3:srcx3,srcy1:srcy1,srcy2:srcy2,$ srcy3:srcy3,flux1:flux1,flux2:flux2,flux3:flux3,fwhm1:fwhm1,fwhm2:fwhm2,$ fwhm3:fwhm3,eccen1:eccen1,eccen2:eccen2,eccen3:eccen3,srcpa1:srcpa1,$ srcpa2:srcpa2,srcpa3:srcpa3,loop_angle1:loop_angle1,$ loop_angle2:loop_angle2,loop_angle3:loop_angle3,dat:*datptr,$ visfit:ptr_new(/allocate_heap),sigma:ptr_new(/allocate_heap)} endif ;very possible the ff_ptr is useless, the important data structure is dat ;created new ff_ptr because of new "Initial Guesses" window ;too lazy to delete it ff_ptr = ptr_new(ff_par) widget_control,tlb_ff,set_uvalue=ff_ptr ;make buttons buttons = widget_base(tlb_ff,row=1,/base_align_center) fit = widget_button(buttons,value='Fit Data',xsize=75) finish = widget_button(buttons,value='Done',event_pro='done_ff',xsize=75,$ uvalue=ff_ptr) mem = widget_button(buttons,value='MEM_NJIT Map',event_pro='ff_obj_mem_map') restore = widget_button(buttons,value='Restore Initial Guesses',$ event_pro='fit_restore',uvalue=ff_ptr) ;visualize widget_control,tlb_ff,/realize xmanager,'ff_initial',tlb_ff,/no_block ff = *ff_ptr *datptr = ff.dat end