
;+ ***********************************************************************
; NAME:
;	DECOMP1D
;
; PURPOSE:
;     PROCEDURE DE DECOMPOSITION D'UN PROFIL RH UNIDIMENSIONNEL 
;  EN SOURCES ELEMENTAIRES (INTENSITE OU POLARISATION).
;
; CATEGORY:
;	NRH1 Positions
;
; CALLING SEQUENCE:
;	DECOMP1D, Xcoor, Imagex, Gliss, Poids,
;			fitparam, dfitparam, sumgauss, npos
;
; INPUTS:
;       XCOOR ..... Tableau des canaux
;
;       IMAGEX .... Image unidimensionnelle a tracer
;                                  (Tableau 1D)
;	 GLISS ...... Nombre de canaux sur lequel la moyenne
;					glissante est calculee
;
;	 POIDS ...... Poids minimum d'une source a retenir (->
;					SIGRMN)
;        
;
; KEYWORD PARAMETERS:
;	 POLAR........Le profil contient l'intensite V
;        SIMPLE ..... Ajustement d'une Gaussienne
;        CONST, DROITE, PARABOLE ... Gaussienn + cst., droite 
;			                  ou parabole
;	NPOS ....... Nbre maximum d'iterations
;
; OUTPUTS:
;	FITPARAM .... Tableau des parametres ajustes: 
;					amplitude, canal, FWHM (Dim. 3xNPOS)
;	DFITPARAM ... Erreur statistique des parametres
;	SUMGAUSS .... Somme des Gaussiennes ajustees
;	NPOS ........ Nombre de sources identifiees
;
; COMMON BLOCKS:
;	Non
;
; PROCEDURE:
; METHODE: CALCUL D'UNE MOYENNE GLISSANTE SUR gliss CANAUX, IDENTIFICATION
;  DES POINTS QUI DEPASSENT LA MOYENNE GLISSANTE DE sigma * L'ECART-TYPE,
;  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.	
;
; EXAMPLE:
;	Please provide a simple example here
;
; MODIFICATION HISTORY: (bonmartin@obspm.fr)
;	16/11/98	adapte du logiciel XHELIO
;-*******************************************************************


PRO decomp1d, xcoor, imagex, gliss, poids, POLAR=polar, $
	SIMPLE=simple, CONST=const, DROITE=droite, PARABOLE = parabole, $
	fitparam, dfitparam, sumgauss, npos

;* ---------------------------- *
;*	Test de la syntaxe      *   à revoir !!!!!!
;* ---------------------------- *
;
IF N_PARAMS() LE 1 THEN BEGIN

   print,$
    "Syntaxe: decomp1d, Tableau de canaux, tableau d'intensites, " $
	, "nbre de points pour moyenne glissante, nbre d'ecarts-types, " $
	, "[POLAR=polar, SIMPLE=simple, CONST=const, DROITE=droite, "$
	, " PARABOLE = parabole], fitparam, dfitparam, sumgauss, npos "
 
ENDIF

;----------------------------------------------
; Decomposition en sources Gaussiennes
;----------------------------------------------

dx = xcoor(1) - xcoor(0)
width = FIX(gliss/dx + 0.1) + 1; nbre de points de la moyenne glissante
IF 2*(width/2) EQ width THEN width = width + 1	; nbre impair de points
gliss = (width-1)*dx

IF KEYWORD_SET(SIMPLE) THEN text1 = ' (Gaussian)'
IF KEYWORD_SET(CONST) THEN text1 = ' (Gaussian + constant)'
IF KEYWORD_SET(DROITE) THEN text1 = ' (Gaussian + straight line)'
IF KEYWORD_SET(PARABOLE) THEN text1 = ' (Gaussian + parabola)'

sumgauss = imagex & sumgauss(*) = 0.
imx_scn = 0 & ipos = 0

; Determination et soustraction iteratives des sources isolees

fitparam = fltarr(3, npos) & dfitparam = fltarr(3, npos)
nextit:
	maximage = MAX(imagex, MIN = minimage)

	IF KEYWORD_SET(polar) THEN BEGIN
		IF(maximage+minimage LT 0.) THEN imagex = -imagex
	ENDIF

	sigrmn, imagex, width, poids, mscan, imx_scn
	IF(imx_scn GE 0) THEN BEGIN
		imax = imx_scn
		sigmaa= 0.
		gauss_rh, xcoor, imagex, imax, imin0, imin1, coeff,$
				 sigmaa, gsfctn, SIMPLE=simple, CONST=const,$
				 DROITE=droite, PARABOLE = parabole
		mings = MIN(gsfctn, MAX = maxgs)
		IF(coeff(2) LE 0 OR mings EQ maxgs) THEN BEGIN
			imx_scn = -1
		ENDIF ELSE BEGIN
			fitparam(0, ipos) = coeff(0)	;	amplitude
			dfitparam(0, ipos) = sigmaa(0)
			fitparam(1, ipos) = coeff(1)	;	canal
			dfitparam(1, ipos) = sigmaa(1)
			fitparam(2, ipos) = 2.35482*coeff(2) ;	FWHM
			dfitparam(2, ipos) = 2.35482*sigmaa(2)	

			IF (KEYWORD_SET(polar) EQ 1 AND maximage $
				+ minimage LT 0) THEN BEGIN
				fitparam(0, ipos) = -coeff(0)
				imagex = -imagex
				gsfctn = -gsfctn
				mscan = -mscan
			ENDIF
			ipos = ipos+1

			sumgauss = sumgauss + gsfctn
			imagex = imagex - gsfctn
			IF(ipos LT npos) THEN goto, nextit
		ENDELSE
	ENDIF

npos = ipos
 
END
