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).
 ------------------------------------------------------------------------------
RO cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms
RO cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms
image = image[*,*,im_parms.frame]
image = image[*,*,im_parms.frame]
Check for accepted pixels.
F N_ELEMENTS( pidxcum ) GT 1 THEN BEGIN
  ;Compute sky average and sky sigma.
  ;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
  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
  FLERR=fluxerr, MAG=mag, ERR=magerr, XCEN=xcen, YCEN=ycen
  state.pnskcum   = flux
  state.pnskercum = fluxerr
  state.magcum    = mag
  state.magercum  = magerr
NDIF 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
NDELSE
NDELSE
Check for new batch of pixels.
F 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.
NDIF ELSE BEGIN
  state.skav    = 0.0
  state.sksi    = 0.0
  state.pnsk    = 0.0
  state.pnsker  = 0.0
NDELSE
NDELSE
Check for combined set of pixels (pidxcum plus pidx).
F N_ELEMENTS( pidxall ) GT 1 THEN BEGIN
  state.skpxall = N_ELEMENTS( pidxall )
  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
  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
  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
NDIF 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
NDELSE
NDELSE
ND
ND
ND
 ------------------------------------------------------------------------------
 Procedure cw_cpmgr_disp
 ------------------------------------------------------------------------------
RO cw_cpmgr_disp, state, image, im_parms, ph_parms, INIT=in_init
RO cw_cpmgr_disp, state, image, im_parms, ph_parms, INIT=in_init
image = image[*,*,im_parms.frame]
image = image[*,*,im_parms.frame]
F KEYWORD_SET( in_init ) THEN BEGIN
  area = 0.0
  pcounts = 0.0
NDIF ELSE BEGIN
  area = !pi * ph_parms.radius * ph_parms.radius
  boxm, timage, state.objx, state.objy, 5, 5, xmax, ymax
  pcounts = timage[ xmax, ymax ]
NDELSE
NDELSE
Compute the sky noise ratio.
igphotsky = area * state.sksiall * ph_parms.gain
hotons = state.pnskall * im_parms.exptime
arphotobj = photons + sigphotsky * sigphotsky
F varphotobj NE 0 THEN BEGIN
  sknfrac = sigphotsky * sigphotsky / varphotobj
NDIF ELSE BEGIN
  sknfrac = 0.0
NDELSE
NDELSE
F state.ncli LT 0 THEN ncli=0 ELSE ncli=state.ncli
F state.ncli LT 0 THEN ncli=0 ELSE ncli=state.ncli
Build the text array used for the numeric display.
ext =[ 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)' ) ]
               state.magercum, FORMAT='(A,F9.4,A,F7.4)' ) ]
IDGET_CONTROL, state.statsid, SET_VALUE=text
IDGET_CONTROL, state.statsid, SET_VALUE=text
ND
ND
ND
 ------------------------------------------------------------------------------
 Procedure cw_cpmgr_svl
 ------------------------------------------------------------------------------
RO cw_cpmgr_svl, id, value
RO cw_cpmgr_svl, id, value
The 'value' is defined to be a structure: {x:0, y:0}
The 'value' is defined to be a structure: {x:0, y:0}
tash = WIDGET_INFO( id, /CHILD )
IDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY
IDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY
Open access to the pixel buffers.
IDGET_CONTROL, state.pidxptr, GET_UVALUE=pidx, /NO_COPY
IDGET_CONTROL, state.pidxcumptr, GET_UVALUE=pidxcum, /NO_COPY
IDGET_CONTROL, state.pidxallptr, GET_UVALUE=pidxall, /NO_COPY
IDGET_CONTROL, state.pidxallptr, GET_UVALUE=pidxall, /NO_COPY
Open access to the image and photometry parameters.
IDGET_CONTROL, state.imageptr, GET_UVALUE=image, /NO_COPY
IDGET_CONTROL, state.imparmsptr, GET_UVALUE=im_parms, /NO_COPY
IDGET_CONTROL, state.phparmsptr, GET_UVALUE=ph_parms, /NO_COPY
IDGET_CONTROL, state.phparmsptr, GET_UVALUE=ph_parms, /NO_COPY
rame = im_parms.frame
rame = im_parms.frame
tate.ncli = state.ncli + 1
tate.ncli = state.ncli + 1
ASE state.ncli OF
  0 : BEGIN
     ;This should be the object.
     ;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
     XCEN=xcen, YCEN=ycen
     state.pnskall   = flux
     state.pnskerall = fluxerr
     state.magall    = mag
     state.magerall  = magerr
     state.objx = xcen
     state.objy = ycen
     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
  END
  1: BEGIN
     ;This is the first sky batch.
     state.skyx = value.x
     state.skyy = value.y
     state.skyy = value.y
     getannul, image[*,*,frame], value.x, value.y, 0, ph_parms.radius, px, pidx
     getannul, image[*,*,frame], value.x, value.y, 0, ph_parms.radius, px, pidx
     pidxcum = 0
     pidx    = pidx
     pidxall = 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
  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
        WIDGET_CONTROL, state.dlistid, SET_VALUE=t, /APPEND
        pidxcum = pidxall
     ENDIF
     ENDIF
     state.skyx = value.x
     state.skyy = value.y
        
     getannul, image[*,*,frame], value.x, value.y, 0, ph_parms.radius, px, pidx
     getannul, image[*,*,frame], value.x, value.y, 0, ph_parms.radius, px, pidx
     a = [ pidxcum, pidx ]
     pidxall = a[ uniq( a, sort( a ) ) ]
     pidx = pidx
     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
NDCASE
NDCASE
Sensitize some buttons.
IDGET_CONTROL, state.newid, SENSITIVE=1
IDGET_CONTROL, state.clearid, SENSITIVE=1
IDGET_CONTROL, state.dlastid, SENSITIVE=1
IDGET_CONTROL, state.doneid, SENSITIVE=1
IDGET_CONTROL, state.doneid, SENSITIVE=1
Close access to the pixel buffers.
IDGET_CONTROL, state.pidxptr, SET_UVALUE=pidx, /NO_COPY
IDGET_CONTROL, state.pidxcumptr, SET_UVALUE=pidxcum, /NO_COPY
IDGET_CONTROL, state.pidxallptr, SET_UVALUE=pidxall, /NO_COPY
IDGET_CONTROL, state.pidxallptr, SET_UVALUE=pidxall, /NO_COPY
Close access to the image and photometry parameters.
IDGET_CONTROL, state.imageptr, SET_UVALUE=image, /NO_COPY
IDGET_CONTROL, state.imparmsptr, SET_UVALUE=im_parms, /NO_COPY
IDGET_CONTROL, state.phparmsptr, SET_UVALUE=ph_parms, /NO_COPY
IDGET_CONTROL, state.phparmsptr, SET_UVALUE=ph_parms, /NO_COPY
IDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY
ND
ND
ND
 ------------------------------------------------------------------------------
 Procedure cw_cpmgr_eve
 Event handler.
 ------------------------------------------------------------------------------
RO cw_cpmgr_eve, event
RO cw_cpmgr_eve, event
tash = WIDGET_INFO( event.handler, /CHILD )
IDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY
IDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY
Open access to the image and photometry parameters.
IDGET_CONTROL, state.imageptr, GET_UVALUE=image, /NO_COPY
IDGET_CONTROL, state.imparmsptr, GET_UVALUE=im_parms, /NO_COPY
IDGET_CONTROL, state.phparmsptr, GET_UVALUE=ph_parms, /NO_COPY
IDGET_CONTROL, state.phparmsptr, GET_UVALUE=ph_parms, /NO_COPY
Open access to the pixel buffers.
IDGET_CONTROL, state.pidxptr, GET_UVALUE=pidx, /NO_COPY
IDGET_CONTROL, state.pidxcumptr, GET_UVALUE=pidxcum, /NO_COPY
IDGET_CONTROL, state.pidxallptr, GET_UVALUE=pidxall, /NO_COPY
IDGET_CONTROL, state.pidxallptr, GET_UVALUE=pidxall, /NO_COPY
ASE 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
     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=''
        WIDGET_CONTROL, state.dlistid, SET_VALUE=''
        ;Hide the widget.
        WIDGET_CONTROL, event.top, MAP=0
        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
  END
  state.newid : BEGIN
     WIDGET_CONTROL, event.id, SENSITIVE=0
     state.ncli = -1
     state.objx = 0.0
     state.objy = 0.0
     state.objy = 0.0
     pidx    = 0
     pidxcum = 0
     pidxall = 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
     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
  END
  state.clearid : BEGIN
     WIDGET_CONTROL, event.id, SENSITIVE=0
     state.ncli = 0
     state.ncli = 0
     pidx    = 0
     pidxcum = 0
     pidxall = 0
     cw_cpmgr_ac1, state, pidx, pidxall, pidxcum, image, im_parms, ph_parms
     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
     XCEN=xcen, YCEN=ycen
     state.pnskall   = flux
     state.pnskerall = fluxerr
     state.magall    = mag
     state.magerall  = magerr
     state.objx = xcen
     state.objy = ycen
     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
  END
  state.dlastid : BEGIN
     WIDGET_CONTROL, event.id, SENSITIVE=0
     state.ncli = state.ncli - 1
     state.ncli = state.ncli - 1
     pidx = 0
     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
        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
        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
  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
     ph_parms.objnum = objnum
     state.ncli = -1
     state.objx = 0.0
     state.objy = 0.0
     state.objy = 0.0
     pidx    = 0
     pidxcum = 0
     pidxall = 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
     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
  END
  ELSE : BEGIN
     MESSAGE, 'Unknown event:', /INFO
     HELP, event, /STRUCTURE
  END
NDCASE
NDCASE
Close access to the pixel buffers.
IDGET_CONTROL, state.pidxptr, SET_UVALUE=pidx, /NO_COPY
IDGET_CONTROL, state.pidxcumptr, SET_UVALUE=pidxcum, /NO_COPY
IDGET_CONTROL, state.pidxallptr, SET_UVALUE=pidxall, /NO_COPY
IDGET_CONTROL, state.pidxallptr, SET_UVALUE=pidxall, /NO_COPY
Close access to the image and photometry parameters.
IDGET_CONTROL, state.imageptr, SET_UVALUE=image, /NO_COPY
IDGET_CONTROL, state.imparmsptr, SET_UVALUE=im_parms, /NO_COPY
IDGET_CONTROL, state.phparmsptr, SET_UVALUE=ph_parms, /NO_COPY
IDGET_CONTROL, state.phparmsptr, SET_UVALUE=ph_parms, /NO_COPY
IDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY
ND
ND
 ------------------------------------------------------------------------------
 Function cw_cpmgr
 ------------------------------------------------------------------------------
UNCTION cw_cpmgr, parent, IMAGEPTR=imageptr, IMPARMSPTR=imparmsptr, $
        PHPARMSPTR=phparmsptr, UVALUE=uvalue
el = STRING( 7B )
el = STRING( 7B )
F NOT KEYWORD_SET( imageptr ) THEN BEGIN
  MESSAGE, 'Error. Keyword IMAGEPTR must be specified.' + bel, /INFO
  RETURN, 0
NDIF
NDIF
F NOT KEYWORD_SET( imparmsptr ) THEN BEGIN
  MESSAGE, 'Error. Keyword IMPARMSPTR must be specified.' + bel, /INFO
  RETURN, 0
NDIF
NDIF
F NOT KEYWORD_SET( phparmsptr ) THEN BEGIN
  MESSAGE, 'Error. Keyword PHPARMSPTR must be specified.' + bel, /INFO
  RETURN, 0
NDIF
NDIF
Define the state control structure.
tate = { $
  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
F KEYWORD_SET( uvalue ) THEN BEGIN
  mainbase = WIDGET_BASE( parent, COLUMN=1, EVENT_PRO='cw_cpmgr_eve', $
             PRO_SET_VALUE='cw_cpmgr_svl', UVALUE=uvalue )
NDIF ELSE BEGIN
  mainbase = WIDGET_BASE( parent, COLUMN=1, EVENT_PRO='cw_cpmgr_eve', $
             PRO_SET_VALUE='cw_cpmgr_svl' )
NDELSE
NDELSE
Row 1, Buttons.
b = WIDGET_BASE( mainbase, /ROW, /FRAME )
tate.dismissid = WIDGET_BUTTON( rb, VALUE='Dismiss' )
tate.dismissid = WIDGET_BUTTON( rb, VALUE='Dismiss' )
tate.newid = WIDGET_BUTTON( rb, VALUE='Start Over' )
IDGET_CONTROL, state.newid, SENSITIVE=0
IDGET_CONTROL, state.newid, SENSITIVE=0
tate.clearid = WIDGET_BUTTON( rb, VALUE='Clear All Skys' )
IDGET_CONTROL, state.clearid, SENSITIVE=0
IDGET_CONTROL, state.clearid, SENSITIVE=0
tate.dlastid = WIDGET_BUTTON( rb, VALUE='Delete Last Sky' )
IDGET_CONTROL, state.dlastid, SENSITIVE=0
IDGET_CONTROL, state.dlastid, SENSITIVE=0
tate.doneid = WIDGET_BUTTON( rb, VALUE='Done/Save' )
IDGET_CONTROL, state.doneid, SENSITIVE=0
IDGET_CONTROL, state.doneid, SENSITIVE=0
Stats and histogram section.
b  = WIDGET_BASE( mainbase, /ROW, /FRAME, UVALUE=0 )
b1 = WIDGET_BASE( rb, /COLUMN, UVALUE=0 )
b2 = WIDGET_BASE( rb, /COLUMN, UVALUE=0 )

Use these bases to store the pixel arrays.
tate.pidxptr = rb
tate.pidxallptr = cb1
tate.pidxcumptr = cb2

b  = cb1
tate.statsid = WIDGET_TEXT( tb, VALUE='', XSIZE=42, YSIZE=15 )

b  = cb2
tate.drawid  = WIDGET_DRAW( tb, XSIZE=200, YSIZE=200 )
tate.drawid  = WIDGET_DRAW( tb, XSIZE=200, YSIZE=200 )
Scrollable text widget for display of accepted data.
First, do the label for the columns.
b  = WIDGET_BASE( mainbase, /ROW )
                    1         2         3         4         5         6
           12345678901234567890123456789012345678901234567890123456789012345
isplist = ' spot    x    y    average     sigma     cum avg     cum sig'
1  = WIDGET_LABEL( rb, VALUE=displist )
tate.dlistid = WIDGET_TEXT( mainbase, VALUE='', /SCROLL, XSIZE=60, YSIZE=4 )
tate.dlistid = WIDGET_TEXT( mainbase, VALUE='', /SCROLL, XSIZE=60, YSIZE=4 )
Initialize the display text widget.
IDGET_CONTROL, state.imageptr, GET_UVALUE=image, /NO_COPY
IDGET_CONTROL, state.imparmsptr, GET_UVALUE=im_parms, /NO_COPY
IDGET_CONTROL, state.phparmsptr, GET_UVALUE=ph_parms, /NO_COPY
w_cpmgr_disp, state, image, im_parms, ph_parms, /INIT
IDGET_CONTROL, state.imageptr, SET_UVALUE=image, /NO_COPY
IDGET_CONTROL, state.imparmsptr, SET_UVALUE=im_parms, /NO_COPY
IDGET_CONTROL, state.phparmsptr, SET_UVALUE=ph_parms, /NO_COPY
IDGET_CONTROL, state.phparmsptr, SET_UVALUE=ph_parms, /NO_COPY
tash = WIDGET_INFO( mainbase, /CHILD )
IDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY
IDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY
ETURN, mainbase
ND