	pro xdeg_pol_event, ev

common xdeg_pol, I, V, P, sI, sV, ID, data


	if ev.ID eq ID.Draw then begin
wset, ID.Win
widget_control, ID.Label, set_val=	$
  string(data.xykf*ev.x, data.xykf*ev.y, I(ev.x, ev.y), V(ev.x, ev.y), P(ev.x, ev.y), $
  format="(i3, ', ', i3, ', ', 'I: ', g9.3, ' V: ', g10.3, ' V/I: ', g10.3)")

return
	endif

widget_control, ev.id, get_uval=uv, /hour

	CASE uv OF

'Done':	begin
widget_control, ev.top, /destr
	end

'Colors': xloadct, /modal

'Stokes I':	begin
wset, ID.Win
tvscl, (I > 0)^0.5
	end

'Stokes V':	begin
wset, ID.Win
tvscl, (V > 0)^0.5 - (-V > 0)^0.5
	end

'Degree of polarization':	begin
if (size(P))(0) ne 2 then return
wset, ID.Win
tvscl, (P > 0)^0.5 - (-P > 0)^0.5
	end

'db':	begin
widget_control, ID.db, get_val=tmp
data.db=-abs(float(tmp(0)))
widget_control, ID.db, set_val=string(-data.db, format='(f4.1)')
	end


'threshold':	begin
widget_control, ID.threshold, get_val=tmp
data.threshold=float(tmp(0))
widget_control, ID.threshold, set_val=string(data.threshold, format='(g9.3)')
		end


'Level':	begin
widget_control, ID.Level, get_val=tmp
data.Level=float(tmp(0))
widget_control, ID.Level, set_val=string(data.Level, format='(g9.3)')
		end

'Index':	begin
widget_control, ID.Index, get_val=tmp
data.ind=fix(tmp(0))>0<data.nn
widget_control, ID.Index, set_val=string(data.ind, format='(i3)')
		end

'Filter':	begin
widget_control, ID.Filter, get_val=tmp
data.Filter=fix(tmp(0)) ne 0
widget_control, ID.Filter, set_val=string(data.Filter, format='(i1)')

		end

'Width':	begin
widget_control, ID.Width, get_val=tmp
data.Width=fix(tmp(0))>3
widget_control, ID.Width, set_val=string(data.Width, format='(i1)')
		end

'EXECUTE':	begin
widget_control, ID.Filter, get_val=tmp
data.Filter=fix(tmp(0)) ne 0
widget_control, ID.Filter, set_val=string(data.Filter, format='(i1)')

widget_control, ID.Level, get_val=tmp
data.Level=float(tmp(0))>0
widget_control, ID.Level, set_val=string(data.Level, format='(g9.3)')

widget_control, ID.threshold, get_val=tmp
data.threshold=float(tmp(0))
widget_control, ID.threshold, set_val=string(data.threshold, format='(g9.3)')

widget_control, ID.db, get_val=tmp
data.db=-abs(float(tmp(0)))
widget_control, ID.db, set_val=string(-data.db, format='(f4.1)')

widget_control, ID.Width, get_val=tmp
data.Width=fix(tmp(0))>3
widget_control, ID.Width, set_val=string(data.Width, format='(i1)')
tmp=0

if ID.Index eq 0 then goto,skp
widget_control, ID.Index, get_val=tmp
data.ind=fix(tmp(0))>0<data.nn
widget_control, ID.Index, set_val=string(data.ind, format='(i3)')

skp:wset, ID.Win
I=congrid(SI(*,*,data.ind),data.x1s,data.y1s,/interp)
V=congrid(SV(*,*,data.ind),data.x1s,data.y1s,/interp)
p=deg_pol(i, v, threshold=data.threshold, range=data.db, filter=data.filter, $
width=data.width, min=data.level)

tvscl, (P > 0)^0.5 - (-P > 0)^0.5
		end

	ELSE:

	ENDCASE

empty

	end

	function xdeg_pol, Stokes_I, Stokes_V, xysize=xysize

common xdeg_pol, I, V, P, sI, sV, ID, data

ID={draw:0L, Win:0L, Label:0L, db:0L, Level:0L, width:0L, Threshold:0L, Filter:0L, Index:0L}

data={threshold:400, db:(-23.), level:0.005, filter:0, width:3, xykf:1., y1s:10, x1s:10, nn:0, ind:0}

Sz=size(Stokes_I)

	if Sz(0) lt 2 then begin
 message, 'Arrays must have 2 dimensions'
 return,0
	end

if Sz(0) eq 3 then data.nn=Sz(3)-1 else data.nn=0

	if not equiv(Sz, size(Stokes_V)) then  begin
message, 'Incompatible arrays'
return,0
	end

if n_elements(xysize) eq 0 then xys=400 else xys=xysize(0)

if xys lt 10 then xys=400

if Sz(1) ge Sz(2) then begin
 data.x1s=xys
 data.xykf=Sz(1)/float(xys)
 data.y1s=fix(float(data.x1s)/Sz(1)*Sz(2))
endif else begin
 data.y1s=xys
 data.xykf=Sz(2)/float(xys)
 data.x1s=fix(float(data.y1s)/Sz(2)*Sz(1))
end

sI=Stokes_I
sV=Stokes_V

I=congrid(SI(*,*,0),data.x1s,data.y1s,/interp)
V=congrid(SV(*,*,0),data.x1s,data.y1s,/interp)

mainbase=widget_base(tit='Degree of polarization', /colu)

menubase=widget_base(mainbase, /row)

rl_base=widget_base(mainbase, /row)

leftbase=widget_base(rl_base, /colu)

inputbase=widget_base(rl_base, /colu)

button=widget_button(menubase, val='Done', uval='Done')
button=widget_button(menubase, val='Colors', uval='Colors')
button=widget_button(menubase, val='Array', /menu)
	button1=widget_button(button, val='Stokes I', uval='Stokes I')
	button1=widget_button(button, val='Stokes V', uval='Stokes V')
	button1=widget_button(button, val='Degree of polarization', uval='Degree of polarization')

ID.Draw=widget_draw(leftbase, xs=data.x1s, ys=data.y1s, /motion)

ID.label=widget_label(leftbase, /fra, val=' ', /dynam)

button=widget_button(inputbase, val='EXECUTE', uval='EXECUTE')

label=widget_label(inputbase, val='dB:')
ID.db=widget_text(inputbase, val=string(-data.db, format='(f4.1)'), uval='db', /edit, /fra)

label=widget_label(inputbase, val='Thres.:')
ID.threshold=widget_text(inputbase, val=string(data.threshold, format='(g9.3)'), $
	uval='threshold', /edit, /fra)

label=widget_label(inputbase, val='Level:')
ID.Level=widget_text(inputbase, val=string(data.Level, format='(g9.3)'), $
	uval='Level', /edit, /fra)

label=widget_label(inputbase, val='Filter:')
ID.Filter=widget_text(inputbase, val=string(data.Filter, format='(i1)'), $
	uval='Filter', /edit, /fra)

label=widget_label(inputbase, val='Width:')
ID.Width=widget_text(inputbase, val=string(data.Width, format='(i1)'), $
	uval='Width', /edit, /fra)

if Sz(0) eq 3 then begin
 label=widget_label(inputbase, val=string(data.nn,format='("Array [0:",i3,"]")'))
 ID.Index=widget_text(inputbase, val=string(data.ind, format='(i1)'), $
	uval='Index', /edit, /fra)
end

widget_control, mainbase, /real, /hour

widget_control, ID.Draw, get_val=tmp

ID.Win=tmp

wset, ID.Win

p=deg_pol(i, v, threshold=data.threshold, range=data.db, filter=data.filter, $
width=data.width, min=data.level)

tvscl, (P > 0)^0.5 - (-P > 0)^0.5

empty

xmanager, 'xdeg_pol', mainbase, /modal
if Sz(0) eq 3 then begin
 p=Stokes_I
 for i=0,Sz(3)-1 do $
 p(*,*,i)=deg_pol(Stokes_I(*,*,i), Stokes_V(*,*,i), threshold=data.threshold,$
 range=data.db, filter=data.filter, width=data.width, min=data.level)
end else $
p=deg_pol(Stokes_I, Stokes_V, threshold=data.threshold, range=data.db, filter=data.filter, $
width=data.width, min=data.level)

return, p

	end
