;+
; NAME:
;	CW_SCANSOURCE
;
; PURPOSE:
;	Widget permettant de faire un scan manuel d'une serie d'images
;
; CATEGORY:
;	RH_2D, recherche de positions
;
; CALLING SEQUENCE:
;	CW_SCANSOURCE, Fichimg, Index, GROUP=Group
;
; INPUTS:
;	Fichimg:	fichier contenant les images
;	Index:		index de la premiere image
;
; KEYWORD PARAMETERS:
;	GROUP:	Identificateur de la widget appelante
;
; COMMON BLOCKS:
;	VISU_2D,str_visu
;	FICRH,str_fic
;	INFO2D, str_inf2d
;	LIMIT,str_lim
;	OPTPOSI, str_opt
;
; MODIFICATION HISTORY:
; 	Written by:	C. Renié 06/1998
;	3/5/1999: utilisation de READ_NRHIM au lieu de mrdfits
;	modif de l'affichage des axes en pixels (20/07/01)
;-

PRO CW_SCANSOURCE_Event, Event
COMMON FIELDscansource, FIELD1, FIELD2, FIELD3, FIELD4, FIELD5, $
FIELD41, FIELD42, FIELD43, FIELD44, FIELD45, FIELD46, FIELD47, FIELD48, $
FIELD16, FIELD17, FIELD18, FIELD19, BUTSTART, BUTZOOM, BUTPROFI
COMMON DATAscansource, fichier, Idimg, facteur, niveau, nbmax, compteur, imag, imgorig, coord
COMMON VISU_2D,str_visu
COMMON FICRH,str_fic
COMMON INFO2D, str_inf2d
COMMON LIMIT,str_lim
COMMON OPTPOSI, str_opt

  WIDGET_CONTROL,Event.Id,GET_UVALUE=Ev

  flag=0

  CASE Ev OF 

  'BUTSTART': BEGIN
	IF (compteur EQ 0) THEN BEGIN
		WIDGET_CONTROL, BUTZOOM, SENSITIVE=1
		WIDGET_CONTROL, BUTPROFI, SENSITIVE=1
		WIDGET_CONTROL, BUTSTART, SET_VALUE='NEXT'
		nbmax=str_opt.Nbmax & facteur=str_opt.Facteur & fmax=str_opt.fmax
		READ_NRHIM, fichier, '00:00:00', str_inf2d, imag, str_im, INDIC=Idimg
		imag = imag(str_lim.Xd:str_lim.Xf, str_lim.Yd:str_lim.Yf)
		WIDGET_CONTROL, FIELD2, SET_VALUE=str_im.time
		maxtab=MAX(imag,i)
		niveau=maxtab*fmax/100.0
	ENDIF
	
	; recherche de la valeur et de la position du max
	sz = SIZE(imag)
	dimx = sz(1)*facteur
	dimy = sz(2)*facteur
	imgtrv = CONGRID(imag, dimx, dimy, CUBIC=-0.5)
	maxtab=MAX(imgtrv,i)
	xmax=i MOD dimx
	ymax=i/dimx
	
	; recherche des 8 distances
	di = FLTARR(10)
	points = INTARR(8,2)
	TRV_DIST, imgtrv, xmax, ymax, di, points, str_opt.seuil
	di(8)=di(0)
	di(9)=di(1)

	; recherche de l'ellipse a mi-hauteur
	gra = FLTARR(8)
	grb = FLTARR(8)
	tet = FLTARR(8)
	DET_ELLIP, di, gra, grb, tet
	naire=0
	aire=1.E20
	FOR i=0,7 DO BEGIN
		IF ((gra(i)*grb(i)) GT 0.0) THEN BEGIN
			IF (aire GT (!PI*SQRT(1/(gra(i)*grb(i))))) THEN BEGIN
				aire=(!PI*SQRT(1/(gra(i)*grb(i))))
				naire=i
			ENDIF
		ENDIF
	ENDFOR
	
	;Affichage des resultats
	idx = xmax/facteur + str_lim.Xd
	idy = ymax/facteur + str_lim.Yd
	axea = gra(naire)*(facteur^2)
	axeb = grb(naire)*(facteur^2)
	incl = tet(naire)
	dib = di/facteur
	str_gauss = {GAUSS}
	str_gauss.max = maxtab
	str_gauss.xmax = idx & str_gauss.ymax = idy
	str_gauss.gra = axea & str_gauss.grb = axeb & str_gauss.tet = incl
	flux = cp_fluxpos_nrh2(str_gauss, str_inf2d.Ray, str_inf2d.Freq, dimx, dimy)
	IF coord EQ 0 THEN BEGIN	; affichage en coordonnees helio
		Xd = ind_rs(0, str_inf2d.Xcen, str_inf2d.Ray)
		Yd = ind_rs(0, str_inf2d.Ycen, str_inf2d.Ray)
		idx=ind_rs(idx, str_inf2d.Xcen, str_inf2d.Ray)
		idy=ind_rs(idy, str_inf2d.Ycen, str_inf2d.Ray)
		xa=COS(incl)/SQRT(axea)
		ya=SIN(ABS(incl)/SQRT(axea))
		xa = ind_rs(xa, str_inf2d.Xcen, str_inf2d.Ray) - Xd
		ya = ind_rs(ya, str_inf2d.Ycen, str_inf2d.Ray) - Yd
		xb=COS(incl)/SQRT(axeb)
		yb=SIN(ABS(incl)/SQRT(axeb))
		xb = ind_rs(xb, str_inf2d.Xcen, str_inf2d.Ray) - Xd
		yb = ind_rs(yb, str_inf2d.Ycen, str_inf2d.Ray) - Yd
		axea = SQRT(xa^2 + ya^2)
		axeb = SQRT(xb^2 + yb^2)
		dib(0) = ind_rs(dib(0), str_inf2d.Xcen, str_inf2d.Ray) - Xd
		xdi = ind_rs(dib(1)/SQRT(2), str_inf2d.Xcen, str_inf2d.Ray) - Xd
		ydi = ind_rs(dib(1)/SQRT(2), str_inf2d.Ycen, str_inf2d.Ray) - Yd
		dib(1) = SQRT(xdi^2 + ydi^2)
		dib(2) = ind_rs(dib(2), str_inf2d.Ycen, str_inf2d.Ray) - Yd
		xdi = ind_rs(dib(3)/SQRT(2), str_inf2d.Xcen, str_inf2d.Ray) - Xd
		ydi = ind_rs(dib(3)/SQRT(2), str_inf2d.Ycen, str_inf2d.Ray) - Yd
		dib(3) = SQRT(xdi^2 + ydi^2)
		dib(4) = ind_rs(dib(4), str_inf2d.Xcen, str_inf2d.Ray) - Xd
		xdi = ind_rs(dib(5)/SQRT(2), str_inf2d.Xcen, str_inf2d.Ray) - Xd
		ydi = ind_rs(dib(5)/SQRT(2), str_inf2d.Ycen, str_inf2d.Ray) - Yd
		dib(5) = SQRT(xdi^2 + ydi^2)
		dib(6) = ind_rs(dib(6), str_inf2d.Ycen, str_inf2d.Ray) - Yd
		xdi = ind_rs(dib(7)/SQRT(2), str_inf2d.Xcen, str_inf2d.Ray) - Xd
		ydi = ind_rs(dib(7)/SQRT(2), str_inf2d.Ycen, str_inf2d.Ray) - Yd
		dib(7) = SQRT(xdi^2 + ydi^2)
	ENDIF ELSE BEGIN
		axea = 1/SQRT(axea) & axeb = 1/SQRT(axeb)
	ENDELSE

	WIDGET_CONTROL, FIELD3, SET_VALUE=flux
	WIDGET_CONTROL, FIELD4, SET_VALUE=idx
	WIDGET_CONTROL, FIELD5, SET_VALUE=idy
	WIDGET_CONTROL, FIELD41, SET_VALUE=dib(0)
	WIDGET_CONTROL, FIELD42, SET_VALUE=dib(1)
	WIDGET_CONTROL, FIELD43, SET_VALUE=dib(2)
	WIDGET_CONTROL, FIELD44, SET_VALUE=dib(3)
	WIDGET_CONTROL, FIELD45, SET_VALUE=dib(4)
	WIDGET_CONTROL, FIELD46, SET_VALUE=dib(5)
	WIDGET_CONTROL, FIELD47, SET_VALUE=dib(6)
	WIDGET_CONTROL, FIELD48, SET_VALUE=dib(7)
	WIDGET_CONTROL, FIELD16, SET_VALUE=naire
	WIDGET_CONTROL, FIELD17, SET_VALUE=axea
	WIDGET_CONTROL, FIELD18, SET_VALUE=axeb
	WIDGET_CONTROL, FIELD19, SET_VALUE=incl*!RADEG

	;calcul du nb de pixels en x et y en fonction de la region selectionnee
	interpx= Fix(str_visu.dim /( str_lim.Xf-str_lim.Xd))
	interpy= Fix(str_visu.dim /( str_lim.Yf-str_lim.Yd))
	interp= interpx
	if interpx gt interpy then interp = interpy
	nbpx = (str_lim.Xf-str_lim.Xd+1)*interp
	nbpy = (str_lim.Yf-str_lim.Yd+1)*interp
	; affichage de l'image en 3d
	imgaff = REBIN(imag, nbpx, nbpy)
	WINDOW, /FREE, XSIZE=str_visu.dim, YSIZE=str_visu.dim
	SURFR, AZ=az
	SHADE_SURF, imgaff, XSTYLE=4, YSTYLE=4, ZSTYLE=1, AZ=az, MIN_VALUE=0.0, ZRANGE=[0, MAX(imag)]
	WINDOW, /FREE, XSIZE=str_visu.dim, YSIZE=str_visu.dim
	TVSCL, imgaff
	AFF_DIST, (di/facteur)*interp, (xmax/facteur)*interp, (ymax/facteur)*interp, COLOR=2
	PLOTS, (points(*,0)/facteur)*interp, (points(*,1)/facteur)*interp, /DEVICE, COLOR=2
	TVELLIPSE, interp/(facteur*SQRT(grb(naire))), interp/(facteur*SQRT(gra(naire))), $
	(xmax/facteur)*interp, (ymax/facteur)*interp, tet(naire)*!RADEG+90, COLOR=2

	; soustraction de la gaussienne
	tab_sous = FLTARR(dimx, dimy)
	temp = {GAUSS}
	temp.max = maxtab
	temp.xmax = xmax & temp.ymax = ymax
	temp.gra = gra(naire) & temp.grb = grb(naire) & temp.tet = tet(naire)
	calc_volgauss, temp, dimx, dimy, tab_sous
	imgtrv = imgtrv - tab_sous
	imgorig = imag
	imag = CONGRID(imgtrv, dimx/facteur, dimy/facteur, CUBIC=-0.5)
	compteur = compteur+1
	maxtab=MAX(imag,i)
	IF (maxtab LT niveau) OR (compteur EQ nbmax) THEN BEGIN
		WIDGET_CONTROL, BUTSTART, SET_VALUE='START'
		compteur = 0
	ENDIF
	END
      'BUTRESET': BEGIN
	WIDGET_CONTROL, BUTSTART, SET_VALUE='START
	compteur = 0
	END
      'BUTPROFI': BEGIN
	;calcul du nb de pixels en x et y en fonction de la region selectionnee
	interpx= Fix(str_visu.dim /( str_lim.Xf-str_lim.Xd))
	interpy= Fix(str_visu.dim /( str_lim.Yf-str_lim.Yd))
	interp= interpx
	if interpx gt interpy then interp = interpy
	nbpx = (str_lim.Xf-str_lim.Xd+1)*interp
	nbpy = (str_lim.Yf-str_lim.Yd+1)*interp
	imgaff = REBIN(imgorig, nbpx, nbpy)
	;PROFILCR1, imgaff
	PROFILES, imgaff
	END
      'BUTZOOM': ZOOM, /INTERP
      'LSTFORMA': coord = event.index	; format des coordonnees helio ou en pixel
      'BUTDONE': BEGIN
	WHILE !D.WINDOW NE -1 DO WDELETE, !D.WINDOW
	WIDGET_CONTROL, Event.Top, /DESTROY
	END

  'FIELD2': BEGIN		; on change l'heure
      	;WIDGET_CONTROL, FIELD2, GET_VALUE=temps
      	;temps=temps(0)
	temps = Event.Value
	IF (HMS(temps) GE HMS(str_inf2d.Hd)) AND (HMS(temps) LE HMS(str_inf2d.Hf)) THEN BEGIN
		Idimg = TIME_IND_NRH(fichier, temps)
      		WIDGET_CONTROL, FIELD1, SET_VALUE=Idimg+1
	ENDIF ELSE rep = DIALOG_MESSAGE('Time out of range', /ERROR)
      END
  'FIELD1': BEGIN		; on change l'index de l'image
      	;WIDGET_CONTROL, FIELD1, GET_VALUE=Idimg
	;Idimg = Idimg-1
	Idimg = Event.Value-1
	IF (Idimg LT str_inf2d.nim) AND (Idimg GE 0) THEN BEGIN
		READ_NRHIM, fichier, '00:00:00', str_inf2d, temp, str_im, INDIC=Idimg
		WIDGET_CONTROL, FIELD2, SET_VALUE=str_im.time
	ENDIF ELSE BEGIN
		rep = DIALOG_MESSAGE('Index of image out of range', /ERROR)
		Idimg = 0
	ENDELSE
      END
  'BUTPLUS': BEGIN
	IF (Idimg+1) LT str_inf2d.nim THEN BEGIN
		Idimg = Idimg+1
		WIDGET_CONTROL, FIELD1, SET_VALUE=Idimg+1
		READ_NRHIM, fichier, '00:00:00', str_inf2d, temp, str_im, INDIC=Idimg
		WIDGET_CONTROL, FIELD2, SET_VALUE=str_im.time
	ENDIF ELSE rep = DIALOG_MESSAGE('No more images', /ERROR)
	END
  ENDCASE
	
END


; DO NOT REMOVE THIS COMMENT: END MAIN1
; CODE MODIFICATIONS MADE BELOW THIS COMMENT WILL BE LOST.



PRO cw_scansource, fich, index, GROUP=Group
COMMON FIELDscansource, FIELD1, FIELD2, FIELD3, FIELD4, FIELD5, $
FIELD41, FIELD42, FIELD43, FIELD44, FIELD45, FIELD46, FIELD47, FIELD48, $
FIELD16, FIELD17, FIELD18, FIELD19, BUTSTART, BUTZOOM, BUTPROFI
COMMON DATAscansource, fichier, Idimg, facteur, niveau, nbmax, compteur, imag, imgorig, coord
COMMON VISU_2D,str_visu
COMMON FICRH,str_fic
COMMON INFO2D, str_inf2d
COMMON LIMIT,str_lim

  IF N_ELEMENTS(Group) EQ 0 THEN GROUP=0

  junk   = { CW_PDMENU_S, flags:0, name:'' }

  fichier = fich
  Idimg = index
  coord = 0

  CW_SCANSOURCE = WIDGET_BASE(GROUP_LEADER=Group, $
      COLUMN=1, $
      MAP=1, $
      TITLE='Details', $
      UVALUE='CW_SCANSOURCE')

  BASE2 = WIDGET_BASE(CW_SCANSOURCE, $
      ROW=1, $
      FRAME=1, $
      MAP=1, $
      TITLE='BMENU', $
      UVALUE='BASE2')
  BUTSTART = WIDGET_BUTTON(BASE2, VALUE = 'START', UVALUE='BUTSTART')
  BUTRESET = WIDGET_BUTTON(BASE2, VALUE = 'RESET', UVALUE='BUTRESET')
  BUTPROFI = WIDGET_BUTTON(BASE2, VALUE = 'PROFILE', UVALUE='BUTPROFI')
  BUTZOOM = WIDGET_BUTTON(BASE2, VALUE = 'ZOOM', UVALUE='BUTZOOM')
  LSTFORMA = WIDGET_DROPLIST(BASE2, VALUE=['Helio', 'Pixel'], UVALUE='LSTFORMA')
  BUTPLUS = WIDGET_BUTTON(BASE2, VALUE = 'Next image', UVALUE='BUTPLUS')
  BUTDONE = WIDGET_BUTTON(BASE2, VALUE = 'DONE', UVALUE='BUTDONE')

  FieldVal195 = [ 'hh:mm:ss' ]
  FIELD2 = CW_FIELD( CW_SCANSOURCE,VALUE=FieldVal195, $
      ROW=1, $
      STRING=1, $
      TITLE='Time:', $
      RETURN_EVENTS=1, $
      UVALUE='FIELD2')

  FIELD1 = CW_FIELD( CW_SCANSOURCE,VALUE='0', $
      ROW=1, $
      INTEGER=1, $
      TITLE='Index:', $
      RETURN_EVENTS=1, $
      UVALUE='FIELD1')

  FieldVal264 = [ '0.0' ]
  FIELD3 = CW_FIELD( CW_SCANSOURCE,VALUE=FieldVal264, $
      ROW=1, $
      FLOAT=1, $
      TITLE='Max. Flux:', $
      UVALUE='FIELD3')

  FieldVal336 = [ '0' ]
  FIELD4 = CW_FIELD( CW_SCANSOURCE,VALUE=FieldVal336, $
      ROW=1, $
      FLOAT=1, $
      TITLE='X of Max:', $
      UVALUE='FIELD4')

  FieldVal411 = [ '0' ]
  FIELD5 = CW_FIELD( CW_SCANSOURCE,VALUE=FieldVal411, $
      ROW=1, $
      FLOAT=1, $
      TITLE='Y of Max:', $
      UVALUE='FIELD5')

  LABEL7 = WIDGET_LABEL( CW_SCANSOURCE, $
      FRAME=1, $
      UVALUE='LABEL7', $
      VALUE='Distances')

  BASE49 = WIDGET_BASE(CW_SCANSOURCE, $
      COLUMN=2, $
      FRAME=1, $
      MAP=1, $
      TITLE='BDIST', $
      UVALUE='BASE49')

  FieldVal2114 = [ '0' ]
  FIELD41 = CW_FIELD( BASE49,VALUE=FieldVal2114, $
      ROW=1, $
      FLOAT=1, $
      TITLE='D0', $
      UVALUE='FIELD41')

  FieldVal2116 = [ '0' ]
  FIELD42 = CW_FIELD( BASE49,VALUE=FieldVal2116, $
      ROW=1, $
      FLOAT=1, $
      TITLE='D1', $
      UVALUE='FIELD42')

  FieldVal2118 = [ '0' ]
  FIELD43 = CW_FIELD( BASE49,VALUE=FieldVal2118, $
      ROW=1, $
      FLOAT=1, $
      TITLE='D2', $
      UVALUE='FIELD43')

  FieldVal2120 = [ '0' ]
  FIELD44 = CW_FIELD( BASE49,VALUE=FieldVal2120, $
      ROW=1, $
      FLOAT=1, $
      TITLE='D3', $
      UVALUE='FIELD44')

  FieldVal2122 = [ '0' ]
  FIELD45 = CW_FIELD( BASE49,VALUE=FieldVal2122, $
      ROW=1, $
      FLOAT=1, $
      TITLE='D4', $
      UVALUE='FIELD45')

  FieldVal2124 = [ '0' ]
  FIELD46 = CW_FIELD( BASE49,VALUE=FieldVal2124, $
      ROW=1, $
      FLOAT=1, $
      TITLE='D5', $
      UVALUE='FIELD46')

  FieldVal2126 = [ '0' ]
  FIELD47 = CW_FIELD( BASE49,VALUE=FieldVal2126, $
      ROW=1, $
      FLOAT=1, $
      TITLE='D6', $
      UVALUE='FIELD47')

  FieldVal2128 = [ '0' ]
  FIELD48 = CW_FIELD( BASE49,VALUE=FieldVal2128, $
      ROW=1, $
      FLOAT=1, $
      TITLE='D7', $
      UVALUE='FIELD48')


  LABEL16 = WIDGET_LABEL( CW_SCANSOURCE, $
      FRAME=1, $
      UVALUE='LABEL16', $
      VALUE='Ellipse')

  FIELD16 = CW_FIELD( CW_SCANSOURCE,VALUE='0', $
      ROW=1, $
      INTEGER=1, $
      TITLE='Number:', $
      UVALUE='FIELD16')

  FieldVal1285 = [ '0' ]
  FIELD17 = CW_FIELD( CW_SCANSOURCE,VALUE=FieldVal1285, $
      ROW=1, $
      FLOAT=1, $
      TITLE='Axe A:', $
      UVALUE='FIELD17')

  FieldVal1350 = [ '0' ]
  FIELD18 = CW_FIELD( CW_SCANSOURCE,VALUE=FieldVal1350, $
      ROW=1, $
      FLOAT=1, $
      TITLE='Axe B:', $
      UVALUE='FIELD18')

  FIELD19 = CW_FIELD( CW_SCANSOURCE,VALUE='0', $
      ROW=1, $
      FLOAT=1, $
      TITLE='Theta:', $
      UVALUE='FIELD19')

  WIDGET_CONTROL, CW_SCANSOURCE, /REALIZE

  READ_NRHIM, fichier, '00:00:00', str_inf2d, imag, str_im, INDIC=Idimg
  imag = imag(str_lim.Xd:str_lim.Xf, str_lim.Yd:str_lim.Yf)
  imgorig = imag
  WIDGET_CONTROL, FIELD2, SET_VALUE=str_im.time
  WIDGET_CONTROL, FIELD1, SET_VALUE=Idimg+1
  compteur = 0
  WIDGET_CONTROL, BUTZOOM, SENSITIVE=0
  WIDGET_CONTROL, BUTPROFI, SENSITIVE=0

  XMANAGER, 'CW_SCANSOURCE', CW_SCANSOURCE, /NO_BLOCK
END
