
;+ ***********************************************************************
; NAME:
;	FOLLOWPOS1D
;
; PURPOSE:
;  PROCEDURE DE DECOMPOSITION DES PROFILS RH UNIDIMENSIONNELS EN SOURCES 
;  ELEMENTAIRES GAUSSIENNES (INTENSITE OU POLARISATION), 
;  A PARTIR D'UN TABLEAU CONTENANT DES IMAGES EN FONCTION DU TEMPS PROVENANT
;  DE LA FONCTION LEC1D (IMAGE 1D DU RH) (TABLEAUX DE 2D "INTENSITE/TEMPS" OU
;  3D "INTENSITE+POLARISATION/TEMPS"). 	
;
; CATEGORY:
;	NRH1 Positions
;
; CALLING SEQUENCE:
;	FOLLOWPOS1D, Tabl, Unit, Gliss, Poids, Npos,
;				Tabcoeff, Numd, Numf, Err
;
; INPUTS:
;                     TABL..... Tableau issu de LEC1D contenant les images
;                                  (2 dimensions) 
;                           		tabl_X(num_Canal,Temps)
;                                  		(3 Dim sinon )
;                           		tabl_X(Num_Canal,Temps,type)
;                                               type = 0 ---> Intensite
;                                               type = 1 ---> Polarisation
;
;                     UNIT .......  unite logique assignee au fichier
;
; KEYWORD PARAMETERS:
;
;		      TEMPS .....  Temps du profil de reference [ms]
;
;
;                     HEURES ...... Tableau une dimension, deux elements,
;                                   format : chaine de caractere hh:mm:ss:ms
; 
;                                    si on est en mode animation
;                     CANAUX ..... Tableau une dimension, deux elelments
;				   contient les canaux de 
;				   debut et de fin de visualisation 
;		      DELTACAN ... Ecart tolere entre les canaux des sources
;					de deux images successives
;		      GLISS ...... Nombre de canaux sur lequel la moyenne
;					glissante est calculee
;
;		      POIDS ...... Multiple de sigma au-dessus duquel un signal
;					est considere comme significatif
;
;		      NPOS ........Nbre max d'iterations pour decomposer 1 image
;                     POLAR........Trace d'un profil polarise
;
;		      SIMPLE ..... Ajustement d'une Gaussienne
;                     CONST, DROITE, PARABOLE ... Gaussienn + cst., droite 
;				                  ou parabole
;
; OUTPUTS:
;			TABCOEFF .... Tableau des coefficients ajustes
;			NUMD, NUMF .. Nos. prem. et derniere images analysees
;			ERR ........ Code d'erreur, =0 si pas d'erreur,
;					-1 si pas de source trouvee dans
;					l'intervalle initial
;
; COMMON BLOCKS:
;	NRH1_GLOBAL
;
; PROCEDURE:
;  METHODE: voir DECOMP1D.PRO.
;  AJUSTEMENT D'UNE GAUSSIENNE (OU D'UNE SOMME D'UNE GAUSSIENNE ET D'UN
;  POLYNOME D'ORDRE 0, 1 OU 2) A LA SOURCE AINSI IDENTIFIEE.
;
; MODIFICATION HISTORY:(bonmartin@obspm.fr)
;	Ecrit par: Ludwig KLEIN
;	20/11/98	adapte du logiciel XHELIO
;-*******************************************************************

PRO followpos1d,tabl_X, lun, gliss, poids, npos, Polar=Polar, TEMPS=temps, $
	HEURES=heures, CANAUX=canaux, DELTACAN=deltacan, $
	SIMPLE=simple, CONST=const, DROITE=droite, PARABOLE = parabole, $
	tabcoeff, numd, numf, ierr

;* ------------------------------------------- *
;*	Declaration des variables globales     *
;* ------------------------------------------- *
;            

COMMON NRH1_GLOBAL,nomfich,FichInfo      

;
; Memorisation des informations principales
; sur le fichier
;
file = fichinfo(lun)
heuredeb = file.Heurdeb
heurefin = file.HeurFin
dt = file.paspix(1)	; intervalle de temps
dx = file.paspix(0)	; intervalle de canaux
cdeb = file.valorg(0)
cfin = cdeb + (file.nbpix(0)-1)*dx

;
; --------------------------------------------
;       Determination des valeurs par defaut
; --------------------------------------------
IF (N_ELEMENTS(gliss) EQ 0) THEN gliss = 7
IF (N_ELEMENTS(poids) EQ 0) THEN poids = 0.6 
IF (poids LE 0 OR poids GT 1) THEN poids=0.6
;

; ---------------------------------- 
;	Transformation de l'heure     
;         en milliseconde            
;- ---------------------------------- 
IF NOT KEYWORD_SET(heures) THEN BEGIN
	hdebut=heuredeb
	hfinale=heurefin
ENDIF ELSE BEGIN
	hdebut=HMS(heures(0))
	hfinale=HMS(heures(1))
ENDELSE
hdeb=heures(0)
hfin=heures(1)

;-------------------------------------------
; Test sur la conformite des canaux specifies
;-------------------------------------------

IF NOT KEYWORD_SET(canaux) THEN BEGIN
	cnldeb=cdeb
	cnlfin=cfin
ENDIF ELSE BEGIN
	cnldeb=canaux(0)
	cnlfin=canaux(1)
ENDELSE
IF (cnldeb GE cnlfin) THEN BEGIN
	Mes = WIDGET_MESSAGE('CANAL DEB > OR = THAN CANAL FIN')
	RETURN
ENDIF
IF(cnldeb GT cdeb AND cnldeb LT cfin) THEN cnldeb=cdeb+FIX((cnldeb-cdeb)/dx)*dx
IF(cnlfin GT cdeb AND cnlfin LT cfin) THEN cnlfin=cfin+FIX((cnlfin-cfin)/dx)*dx
canaux = [cnldeb, cnlfin]

xcoor = cdeb + findgen(file.nbpix(0))*dx	; Tableau d'Abscisses: canaux

taille = SIZE(tabl_X) & npts = taille(2)
tab = FLTARR(3, npts)
num0 = indice(heuredeb,temps,dt, heurelue)

IF(KEYWORD_SET(polar)) THEN BEGIN
	LoadPolar, Tabl_x,imageX,num0,FichInfo,lun,ok
	IF (ok NE 1) THEN BEGIN
		Mes= WIDGET_MESSAGE("No Stokes V on this file")
		return
	ENDIF

ENDIF ELSE BEGIN
	LoadIntens,Tabl_x,imagex,num0,Fichinfo,lun
ENDELSE 

nposmax = npos	; Sauvetage la valeur de npos (qui sera modifiee dans decomp1d)
decomp1d, xcoor, imagex, gliss, poids, POLAR=polar, $
	SIMPLE=simple, CONST=const, DROITE=droite, PARABOLE = parabole, $
	fitparam, dfitparam, sumgauss, npos

icont = 0 & i = 0
WHILE (icont LT 1 AND i LT npos) DO BEGIN
	canal = fitparam(1,i)
	IF(canal GE canaux(0) AND canal LE canaux(1)) THEN BEGIN
		tab(*, num0) = fitparam(*,i)
		icont = icont + 1
	ENDIF
	i = i + 1
ENDWHILE
ierr = 0
IF(icont EQ 0) THEN ierr=-1
IF(ierr NE 0) THEN RETURN

; ---------------------------------------------------*
; Decomposition dses images precedentes et suivantes *
; ---------------------------------------------------*

num = num0 & pas = -1

; -----------------------------------------------------------------------------
NITER:
	canal = tab(1, num)
	num = num + pas
	IF(num LT 0 OR num GE npts) THEN GOTO, CONT

	IF(KEYWORD_SET(polar)) THEN $
		LoadPolar, Tabl_x,imageX,num,FichInfo,lun,ok $
		ELSE $
		LoadIntens,Tabl_x,imagex,num,Fichinfo,lun
		npos = nposmax	; Re-initialisation: npos = nbre max d'iter.
		decomp1d, xcoor, imagex, gliss, poids, POLAR=polar, $
			SIMPLE=simple, CONST=const, DROITE=droite, $
			PARABOLE = parabole, fitparam, dfitparam, $
			sumgauss, npos
		icont = 0
		FOR i=0, npos-1 DO BEGIN
			IF(ABS(canal- fitparam(1,i)) LE deltacan) THEN BEGIN
				icont = icont + 1
				IF(icont GT 1) THEN BEGIN
					IF(ABS(canal-fitparam(1,i)) LT $
						ABS(canal-tab(1,num))) THEN $
						tab(*, num) = fitparam(*,i)
					icont = 1
				ENDIF ELSE BEGIN
					tab(*, num) = fitparam(*,i)
				ENDELSE
			ENDIF
		ENDFOR
		IF(icont EQ 1) THEN GOTO, NITER

CONT:
		IF(pas LT 0) THEN BEGIN
			numd = num + 1
			IF(numd LT 0) THEN numd = 0
			pas = 1 & num = num0
			GOTO, NITER
		ENDIF ELSE BEGIN
			numf = num-1
			IF(numf GE npts) THEN numf = npts-1
		ENDELSE

; -----------------------------------------------------------------------------


	tabcoeff = tab(*, numd:numf)
	heures = [long(heuredeb+numd*dt), long(heuredeb+numf*dt)]


END

