;+ ; NAME: ; cw_cpmgr ; PURPOSE: (one line) ; Interactive sky selection for faint comet photometry (from itool). ; DESCRIPTION: ; ; CATEGORY: ; Compound Widgets ; CALLING SEQUENCE: ; id = cw_cpmgr( parent ) ; INPUTS: ; parent : Widget id of parent. ; OPTIONAL INPUT PARAMETERS: ; ; KEYWORD PARAMETERS: ; ; OUTPUTS: ; ; COMMON BLOCKS: ; ; SIDE EFFECTS: ; ; RESTRICTIONS: ; ; PROCEDURE: ; ; MODIFICATION HISTORY: ; Written by Doug Loucks, Lowell Observatory, January, 1994. ; 8/19/1994, DWL, Converted to compound widget. No common blocks. ; 96/01/16, MWB, Cosmetic modification to button labels plus protection ; on Dismiss button if there is a pending operation. ; ; ------------------------------------------------------------------------------ ; Procedure cw_cpmgr_ac1 ; This procedure computes the sky values for each of the sets of pixels ; (accepted : pidxcum, new set : pidx, and the sum of these : pidxall). ; ------------------------------------------------------------------------------ PRO cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms timage = image[*,*,im_parms.frame] ;Check for accepted pixels. IF N_ELEMENTS( pidxcum ) GT 1 THEN BEGIN ;Compute sky average and sky sigma. robomean, timage[ pidxcum ], 3.0, 0.5, skavcum, avgdev, $ stddev, var, skew, kurt, nsky, pcum, STDMEAN=sksicum state.skavcum = skavcum state.sksicum = sksicum ;Compute object flux and magnitude. basphote, ph_parms.gain, timage, im_parms.exptime, $ state.objx, state.objy, ph_parms.radius, $ state.skavcum, -state.sksicum, /NOLOG, /SILENT, FLUX=flux, $ FLERR=fluxerr, MAG=mag, ERR=magerr, XCEN=xcen, YCEN=ycen state.pnskcum = flux state.pnskercum = fluxerr state.magcum = mag state.magercum = magerr ENDIF ELSE BEGIN state.skavcum = 0.0 state.sksicum = 0.0 state.pnskcum = 0.0 state.pnskercum = 0.0 state.magcum = 99.9999 state.magercum = 0.0 ENDELSE ;Check for new batch of pixels. IF N_ELEMENTS( pidx ) GT 1 THEN BEGIN ;Compute sky average and sky sigma. robomean, timage[ pidx ], 3.0, 0.5, skav, avgdev, $ stddev, var, skew, kurt, nsky, pix, STDMEAN=sksi state.skav = skav ;New set. state.sksi = sksi ;New set. ENDIF ELSE BEGIN state.skav = 0.0 state.sksi = 0.0 state.pnsk = 0.0 state.pnsker = 0.0 ENDELSE ;Check for combined set of pixels (pidxcum plus pidx). IF N_ELEMENTS( pidxall ) GT 1 THEN BEGIN state.skpxall = N_ELEMENTS( pidxall ) ;Compute sky average and sky sigma. robomean, timage[ pidxall ], 3.0, 0.5, skavall, avgdev, $ stddev, var, skew, kurt, nsky, pall, STDMEAN=sksiall state.skavall = skavall state.sksiall = sksiall state.skpxuall = nsky ;Compute object flux and magnitude. basphote, ph_parms.gain, timage, im_parms.exptime, $ state.objx, state.objy, ph_parms.radius, $ state.skavall, -state.sksiall, /NOLOG, /SILENT, FLUX=flux, $ FLERR=fluxerr, MAG=mag, ERR=magerr, XCEN=xcen, YCEN=ycen state.objx = xcen state.objy = ycen state.pnskall = flux state.pnskerall = fluxerr state.magall = mag state.magerall = magerr ;Plot a histogram from the combined set of pixels. mindat = MIN( pall, MAX=maxdat ) binsiz = ( maxdat - mindat ) / 40.0 IF binsiz GT 0 THEN BEGIN h = HISTOGRAM( float(pall), BINSIZE=binsiz, MIN=mindat, MAX=maxdat ) idx = FINDGEN( N_ELEMENTS( h ) ) * binsiz + mindat xtrm = [0.,max(h)] curwin = !d.window WIDGET_CONTROL, state.drawid, GET_VALUE=dwin WSET, dwin PLOT, idx, h, PSYM=10, TITLE='(Clipped) HISTOGRAM', $ XTITLE='SIGNAL', YSTYLE=11, XMARGIN=[4,3], YMARGIN=[4,3], $ YRANGE=xtrm AXIS, YAXIS=1, YSTYLE=3, YRANGE=xtrm/total(h)*100.0, YTITLE='N' WSET, curwin ENDIF ENDIF ELSE BEGIN state.skpxall = 0 state.skpxuall = 0 state.skavall = 0.0 state.sksiall = 0.0 state.pnskall = 0.0 state.pnskerall = 0.0 state.magall = 99.9999 state.magerall = 0.0 curwin = !d.window WIDGET_CONTROL, state.drawid, GET_VALUE=dwin WSET, dwin ERASE WSET, curwin ENDELSE END ; ------------------------------------------------------------------------------ ; Procedure cw_cpmgr_disp ; ------------------------------------------------------------------------------ PRO cw_cpmgr_disp, state, image, im_parms, ph_parms, INIT=in_init timage = image[*,*,im_parms.frame] IF KEYWORD_SET( in_init ) THEN BEGIN area = 0.0 pcounts = 0.0 ENDIF ELSE BEGIN area = !pi * ph_parms.radius * ph_parms.radius boxm, timage, state.objx, state.objy, 5, 5, xmax, ymax pcounts = timage[ xmax, ymax ] ENDELSE ;Compute the sky noise ratio. sigphotsky = area * state.sksiall * ph_parms.gain photons = state.pnskall * im_parms.exptime varphotobj = photons + sigphotsky * sigphotsky IF varphotobj NE 0 THEN BEGIN sknfrac = sigphotsky * sigphotsky / varphotobj ENDIF ELSE BEGIN sknfrac = 0.0 ENDELSE IF state.ncli LT 0 THEN ncli=0 ELSE ncli=state.ncli ;Build the text array used for the numeric display. text =[ STRING( 'Num spots', ncli, ' ', 'Sky pix total', $ state.skpxall, FORMAT='(A,I5,A,A,I7)' ), $ STRING( 'Obj pos x', state.objx, ' ', ' used', $ state.skpxuall, FORMAT='(A,F9.3,A,A,I7)' ), $ STRING( ' y', state.objy, ' ', 'Sky noise ratio', $ sknfrac, FORMAT='(A,F9.3,A,A,F6.3)' ), $ '', $ STRING( 'Peak counts', pcounts, ' (', pcounts-state.skavcum, $ ' above sky)', FORMAT='(A,I7,A,I5,A)' ), $ STRING( 'Object+sky ', $ (state.pnskall+state.skavall)/ph_parms.gain, ' +- ', $ (state.pnskerall+state.sksiall)/ph_parms.gain, $ ' cts/s', FORMAT='(A,F10.2,A,F8.2,A)' ), $ '', $ STRING( 'Object all', state.pnskall/ph_parms.gain, ' +- ', $ state.pnskerall/ph_parms.gain, ' cts/s', $ FORMAT='(A,F9.2,A,F8.2,A)' ), $ STRING( ' w/o last', state.pnskcum/ph_parms.gain, ' +- ', $ state.pnskercum/ph_parms.gain, ' cts/s', $ FORMAT='(A,F9.2,A,F8.2,A)' ), $ '', $ STRING( 'Sky w/o last', state.skavcum, ' +- ', $ state.sksicum, ' cts', $ FORMAT='(A,F9.2,A,F8.2,A)' ), $ STRING( ' new set', state.skav, ' +- ', $ state.sksi, ' cts/pix', $ FORMAT='(A,F9.2,A,F8.2,A)' ), $ '', $ STRING( 'Mag all', state.magall, ' +- ', $ state.magerall, FORMAT='(A,F9.4,A,F7.4)' ), $ STRING( ' w/o last', state.magcum, ' +- ', $ state.magercum, FORMAT='(A,F9.4,A,F7.4)' ) ] WIDGET_CONTROL, state.statsid, SET_VALUE=text END ; ------------------------------------------------------------------------------ ; Procedure cw_cpmgr_svl ; ------------------------------------------------------------------------------ PRO cw_cpmgr_svl, id, value ;The 'value' is defined to be a structure: {x:0, y:0} stash = WIDGET_INFO( id, /CHILD ) WIDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY ;Open access to the pixel buffers. WIDGET_CONTROL, state.pidxptr, GET_UVALUE=pidx, /NO_COPY WIDGET_CONTROL, state.pidxcumptr, GET_UVALUE=pidxcum, /NO_COPY WIDGET_CONTROL, state.pidxallptr, GET_UVALUE=pidxall, /NO_COPY ;Open access to the image and photometry parameters. WIDGET_CONTROL, state.imageptr, GET_UVALUE=image, /NO_COPY WIDGET_CONTROL, state.imparmsptr, GET_UVALUE=im_parms, /NO_COPY WIDGET_CONTROL, state.phparmsptr, GET_UVALUE=ph_parms, /NO_COPY frame = im_parms.frame state.ncli = state.ncli + 1 CASE state.ncli OF 0 : BEGIN ;This should be the object. basphote, ph_parms.gain, image[*,*,frame], im_parms.exptime, $ value.x, value.y, ph_parms.radius, 0.0, 0.0, $ /NOLOG, /SILENT, FLUX=flux, FLERR=fluxerr, MAG=mag, ERR=magerr, $ XCEN=xcen, YCEN=ycen state.pnskall = flux state.pnskerall = fluxerr state.magall = mag state.magerall = magerr state.objx = xcen state.objy = ycen cw_cpmgr_disp, state, image, im_parms, ph_parms WIDGET_CONTROL, state.newid, SENSITIVE=1 WIDGET_CONTROL, state.doneid, SENSITIVE=1 END 1: BEGIN ;This is the first sky batch. state.skyx = value.x state.skyy = value.y getannul, image[*,*,frame], value.x, value.y, 0, ph_parms.radius, px, pidx pidxcum = 0 ; pidx = pidx pidxall = pidx cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms cw_cpmgr_disp, state, image, im_parms, ph_parms END ELSE : BEGIN ;Additional sky spots. IF N_ELEMENTS( pidx ) GT 1 THEN BEGIN t = STRING( state.ncli-1, state.skyx, state.skyy, $ state.skav, state.sksi, state.skavall, $ state.sksiall, FORMAT='(I5,I5,I5,1X,G10.6,G10.6,G12.7,G12.7)' ) WIDGET_CONTROL, state.dlistid, SET_VALUE=t, /APPEND pidxcum = pidxall ENDIF state.skyx = value.x state.skyy = value.y getannul, image[*,*,frame], value.x, value.y, 0, ph_parms.radius, px, pidx a = [ pidxcum, pidx ] pidxall = a[ uniq( a, sort( a ) ) ] pidx = pidx cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms cw_cpmgr_disp, state, image, im_parms, ph_parms WIDGET_CONTROL, state.dlastid, SENSITIVE=1 END ENDCASE ;Sensitize some buttons. WIDGET_CONTROL, state.newid, SENSITIVE=1 WIDGET_CONTROL, state.clearid, SENSITIVE=1 WIDGET_CONTROL, state.dlastid, SENSITIVE=1 WIDGET_CONTROL, state.doneid, SENSITIVE=1 ;Close access to the pixel buffers. WIDGET_CONTROL, state.pidxptr, SET_UVALUE=pidx, /NO_COPY WIDGET_CONTROL, state.pidxcumptr, SET_UVALUE=pidxcum, /NO_COPY WIDGET_CONTROL, state.pidxallptr, SET_UVALUE=pidxall, /NO_COPY ;Close access to the image and photometry parameters. WIDGET_CONTROL, state.imageptr, SET_UVALUE=image, /NO_COPY WIDGET_CONTROL, state.imparmsptr, SET_UVALUE=im_parms, /NO_COPY WIDGET_CONTROL, state.phparmsptr, SET_UVALUE=ph_parms, /NO_COPY WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY END ; ------------------------------------------------------------------------------ ; Procedure cw_cpmgr_eve ; Event handler. ; ------------------------------------------------------------------------------ PRO cw_cpmgr_eve, event stash = WIDGET_INFO( event.handler, /CHILD ) WIDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY ;Open access to the image and photometry parameters. WIDGET_CONTROL, state.imageptr, GET_UVALUE=image, /NO_COPY WIDGET_CONTROL, state.imparmsptr, GET_UVALUE=im_parms, /NO_COPY WIDGET_CONTROL, state.phparmsptr, GET_UVALUE=ph_parms, /NO_COPY ;Open access to the pixel buffers. WIDGET_CONTROL, state.pidxptr, GET_UVALUE=pidx, /NO_COPY WIDGET_CONTROL, state.pidxcumptr, GET_UVALUE=pidxcum, /NO_COPY WIDGET_CONTROL, state.pidxallptr, GET_UVALUE=pidxall, /NO_COPY CASE event.id OF state.dismissid : BEGIN IF state.ncli NE -1 THEN BEGIN t = [ $ 'You have a pending photometric extraction. If you choose to', $ 'proceed this pending operation will be cancelled. If you do', $ 'not want to lose the pending measurement, then select cancel', $ 'and finish the measurement by clicking Done/Save. Once you', $ 'have done this, then click Dismiss again.' ] con = qannounc( t, TITLE='Comet Photometry Dismiss Confirmation', $ FALSE='Cancel this request', $ TRUE='Ok, delete pending measurement', $ XSIZE=62, YSIZE=5 ) ENDIF ELSE BEGIN con=1 ENDELSE ; Proceed if okay IF con THEN BEGIN state.ncli = -1 state.objx = 0.0 state.objy = 0.0 pidx = 0 pidxcum = 0 pidxall = 0 cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms cw_cpmgr_disp, state, image, im_parms, ph_parms, /INIT WIDGET_CONTROL, state.newid, SENSITIVE=0 WIDGET_CONTROL, state.clearid, SENSITIVE=0 WIDGET_CONTROL, state.doneid, SENSITIVE=0 WIDGET_CONTROL, state.dlastid, SENSITIVE=0 WIDGET_CONTROL, state.dlistid, SET_VALUE='' ;Hide the widget. WIDGET_CONTROL, event.top, MAP=0 ;Clear active flag. WIDGET_CONTROL, event.top, GET_UVALUE=status, /NO_COPY status.active = 0B WIDGET_CONTROL, event.top, SET_UVALUE=status, /NO_COPY ENDIF END state.newid : BEGIN WIDGET_CONTROL, event.id, SENSITIVE=0 state.ncli = -1 state.objx = 0.0 state.objy = 0.0 pidx = 0 pidxcum = 0 pidxall = 0 cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms cw_cpmgr_disp, state, image, im_parms, ph_parms, /INIT WIDGET_CONTROL, state.clearid, SENSITIVE=0 WIDGET_CONTROL, state.doneid, SENSITIVE=0 WIDGET_CONTROL, state.dlastid, SENSITIVE=0 WIDGET_CONTROL, state.dlistid, SET_VALUE='' END state.clearid : BEGIN WIDGET_CONTROL, event.id, SENSITIVE=0 state.ncli = 0 pidx = 0 pidxcum = 0 pidxall = 0 cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms basphote, ph_parms.gain, image[*,*,im_parms.frame], im_parms.exptime, $ state.objx, state.objy, ph_parms.radius, 0.0, 0.0, $ /NOLOG, /SILENT, FLUX=flux, FLERR=fluxerr, MAG=mag, ERR=magerr, $ XCEN=xcen, YCEN=ycen state.pnskall = flux state.pnskerall = fluxerr state.magall = mag state.magerall = magerr state.objx = xcen state.objy = ycen cw_cpmgr_disp, state, image, im_parms, ph_parms, /INIT WIDGET_CONTROL, state.dlastid, SENSITIVE=0 WIDGET_CONTROL, state.dlistid, SET_VALUE='' END state.dlastid : BEGIN WIDGET_CONTROL, event.id, SENSITIVE=0 state.ncli = state.ncli - 1 pidx = 0 IF state.ncli EQ 0 THEN BEGIN pidxcum = 0 pidxall = 0 cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms basphote, ph_parms.gain, image[*,*,im_parms.frame], im_parms.exptime, $ state.objx, state.objy, ph_parms.radius, 0.0, 0.0, $ /NOLOG, /SILENT, FLUX=flux, FLERR=fluxerr, MAG=mag, ERR=magerr, $ XCEN=xcen, YCEN=ycen state.pnskall = flux state.pnskerall = fluxerr state.magall = mag state.magerall = magerr state.objx = xcen state.objy = ycen cw_cpmgr_disp, state, image, im_parms, ph_parms, /INIT WIDGET_CONTROL, state.clearid, SENSITIVE=0 ENDIF ELSE BEGIN pidxall = pidxcum cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms cw_cpmgr_disp, state, image, im_parms, ph_parms ENDELSE END state.doneid : BEGIN ;Do the photometry. objnum = ph_parms.objnum basphote, ph_parms.gain, image[*,*,im_parms.frame], im_parms.exptime, $ state.objx, state.objy, ph_parms.radius, state.skavall, $ -state.sksiall, ph_parms.logfile, objnum, $ AIRMASS=im_parms.airmass, /ALTLOG, $ BOXMRAD=ph_parms.boxmrad, EXACT=ph_parms.exact, $ NAME=im_parms.object, NOMEXT=ph_parms.nomext, FILTER=im_parms.filter, $ FNAME=im_parms.imfile, JD=im_parms.jd, PSCALE=ph_parms.pscale, $ ZPOINT=ph_parms.zpoint ph_parms.objnum = objnum state.ncli = -1 state.objx = 0.0 state.objy = 0.0 pidx = 0 pidxcum = 0 pidxall = 0 cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms cw_cpmgr_disp, state, image, im_parms, ph_parms, /INIT ;De-sensitize some widgets. WIDGET_CONTROL, state.newid, SENSITIVE=0 WIDGET_CONTROL, state.clearid, SENSITIVE=0 WIDGET_CONTROL, state.dlastid, SENSITIVE=0 WIDGET_CONTROL, event.id, SENSITIVE=0 WIDGET_CONTROL, state.dlistid, SET_VALUE='' END ELSE : BEGIN MESSAGE, 'Unknown event:', /INFO HELP, event, /STRUCTURE END ENDCASE ;Close access to the pixel buffers. WIDGET_CONTROL, state.pidxptr, SET_UVALUE=pidx, /NO_COPY WIDGET_CONTROL, state.pidxcumptr, SET_UVALUE=pidxcum, /NO_COPY WIDGET_CONTROL, state.pidxallptr, SET_UVALUE=pidxall, /NO_COPY ;Close access to the image and photometry parameters. WIDGET_CONTROL, state.imageptr, SET_UVALUE=image, /NO_COPY WIDGET_CONTROL, state.imparmsptr, SET_UVALUE=im_parms, /NO_COPY WIDGET_CONTROL, state.phparmsptr, SET_UVALUE=ph_parms, /NO_COPY WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY END ; ------------------------------------------------------------------------------ ; Function cw_cpmgr ; ------------------------------------------------------------------------------ FUNCTION cw_cpmgr, parent, IMAGEPTR=imageptr, IMPARMSPTR=imparmsptr, $ PHPARMSPTR=phparmsptr, UVALUE=uvalue bel = STRING( 7B ) IF NOT KEYWORD_SET( imageptr ) THEN BEGIN MESSAGE, 'Error. Keyword IMAGEPTR must be specified.' + bel, /INFO RETURN, 0 ENDIF IF NOT KEYWORD_SET( imparmsptr ) THEN BEGIN MESSAGE, 'Error. Keyword IMPARMSPTR must be specified.' + bel, /INFO RETURN, 0 ENDIF IF NOT KEYWORD_SET( phparmsptr ) THEN BEGIN MESSAGE, 'Error. Keyword PHPARMSPTR must be specified.' + bel, /INFO RETURN, 0 ENDIF ;Define the state control structure. state = { $ clearid:0L, $ dismissid:0L, $ dlastid:0L, $ dlistid:0L, $ doneid:0L, $ drawid:0L, $ dwin:0L, $ imageptr:imageptr, $ imparmsptr:imparmsptr, $ magall:99.9999, $ magcum:99.9999, $ magerall:0.0, $ magercum:0.0, $ mainbase:0L, $ newid:0L, $ ncli:-1L, $ objx:0.0, $ objy:0.0, $ phparmsptr:phparmsptr, $ pidxptr:0L, pidxallptr:0L, pidxcumptr:0L, $ pnsk:0.0, pnskcum:0.0, pnskall:0.0, $ pnsker:0.0, pnskercum:0.0, pnskerall:0.0, $ skyx:0, skyy:0, $ skpxcum:0L, skpxall:0L, $ skpxucum:0L, skpxuall:0L, $ skav:0.0, skavcum:0.0, skavall:0.0, $ sksi:0.0, sksicum:0.0, sksiall:0.0, $ statsid:0L $ } ;Create the main base IF KEYWORD_SET( uvalue ) THEN BEGIN mainbase = WIDGET_BASE( parent, COLUMN=1, EVENT_PRO='cw_cpmgr_eve', $ PRO_SET_VALUE='cw_cpmgr_svl', UVALUE=uvalue ) ENDIF ELSE BEGIN mainbase = WIDGET_BASE( parent, COLUMN=1, EVENT_PRO='cw_cpmgr_eve', $ PRO_SET_VALUE='cw_cpmgr_svl' ) ENDELSE ;Row 1, Buttons. rb = WIDGET_BASE( mainbase, /ROW, /FRAME ) state.dismissid = WIDGET_BUTTON( rb, VALUE='Dismiss' ) state.newid = WIDGET_BUTTON( rb, VALUE='Start Over' ) WIDGET_CONTROL, state.newid, SENSITIVE=0 state.clearid = WIDGET_BUTTON( rb, VALUE='Clear All Skys' ) WIDGET_CONTROL, state.clearid, SENSITIVE=0 state.dlastid = WIDGET_BUTTON( rb, VALUE='Delete Last Sky' ) WIDGET_CONTROL, state.dlastid, SENSITIVE=0 state.doneid = WIDGET_BUTTON( rb, VALUE='Done/Save' ) WIDGET_CONTROL, state.doneid, SENSITIVE=0 ;Stats and histogram section. rb = WIDGET_BASE( mainbase, /ROW, /FRAME, UVALUE=0 ) cb1 = WIDGET_BASE( rb, /COLUMN, UVALUE=0 ) cb2 = WIDGET_BASE( rb, /COLUMN, UVALUE=0 ) ; ;Use these bases to store the pixel arrays. state.pidxptr = rb state.pidxallptr = cb1 state.pidxcumptr = cb2 ; tb = cb1 state.statsid = WIDGET_TEXT( tb, VALUE='', XSIZE=42, YSIZE=15 ) ; tb = cb2 state.drawid = WIDGET_DRAW( tb, XSIZE=200, YSIZE=200 ) ;Scrollable text widget for display of accepted data. ;First, do the label for the columns. rb = WIDGET_BASE( mainbase, /ROW ) ; 1 2 3 4 5 6 ; 12345678901234567890123456789012345678901234567890123456789012345 displist = ' spot x y average sigma cum avg cum sig' l1 = WIDGET_LABEL( rb, VALUE=displist ) state.dlistid = WIDGET_TEXT( mainbase, VALUE='', /SCROLL, XSIZE=60, YSIZE=4 ) ;Initialize the display text widget. WIDGET_CONTROL, state.imageptr, GET_UVALUE=image, /NO_COPY WIDGET_CONTROL, state.imparmsptr, GET_UVALUE=im_parms, /NO_COPY WIDGET_CONTROL, state.phparmsptr, GET_UVALUE=ph_parms, /NO_COPY cw_cpmgr_disp, state, image, im_parms, ph_parms, /INIT WIDGET_CONTROL, state.imageptr, SET_UVALUE=image, /NO_COPY WIDGET_CONTROL, state.imparmsptr, SET_UVALUE=im_parms, /NO_COPY WIDGET_CONTROL, state.phparmsptr, SET_UVALUE=ph_parms, /NO_COPY stash = WIDGET_INFO( mainbase, /CHILD ) WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY RETURN, mainbase END