
;+ ***********************************************************************
; NAME:
;	INTGCOMP_NRH2
;
; PURPOSE:
;	Cette procedure integre les images contenues dans un fichier FITS
;	type NRH2d et cree un nouveau fichier FITS
;
; CATEGORY:
;	FICHIERS NRH
;
; CALLING SEQUENCE:
;	INTGCOMP_NRH2, FILE, CADENCE, REPERT=repert, INDICE=indice
;
; INPUTS:
;	FILE	Nom du fichier a integrer
;
;	CADENCE	Cadence du fichier integre en secondes	
;
; KEYWORD PARAMETERS:
;	REPERT	Nom du repertoire d'ecriture
;
;	INDICE	a entrer dans le nom du fichier, si indice est abscent
;		la valeur de la cadence sur un digit est entree dans le
;		nom de fichier
;
;	STOKESV	si present, les donnees stokesI et stokesV sont integrees
;		sinon seul Stokesi est integre
;
;	HDEB	heure de debut en hh:mn:ss.cent
;
;	HFIN	heure de fin en hh:mn:ss.cent
;
; OUTPUTS:
;	Describe any outputs here
;
; COMMON BLOCKS:
;
; PROCEDURE:
;	You can describe the foobar superfloatation method being used here.
;	You might not need this section for your routine.
;
; EXAMPLE:
;	INTGCOMP_NRH2, Str_fic.file, 2.5, INDICE=2, HDEB='11:30:00'
;
; MODIFICATION HISTORY:
;	Ecrit par: J Bonmartin le 16/03/98 (bonmartin@obspm.fr)
;		Revision de la logique de temps le 04/07/01 (JB)
;-*******************************************************************

PRO INTGCOMP_NRH2, FILE, CADENCE, REPERT=repert, INDICE=indice, $
		STOKESV = Stokesv, HDEB = Hdeb, HFIN = Hfin

STK = 0
IF KEYWORD_SET (STOKESV) THEN STK = Stokesv

INDIC = Indice
IF (NOT KEYWORD_SET(INDICE)) THEN Indic = cadence

WHILE Indice GT 10 DO Indice = indice/10

DECOMP = STR_SEP(File, '/')
FILI = Decomp[ ((size(decomp)) (1)) -1]
	CINT=strcompress(string(fix(indice)),/Remove_all)
FILI = MOD_NRHFILE( Fili, $ 
		DIVERS= STRMID(Cint, STRLEN(CINT)-1,1))

; Lecture du Header primaire
	HD1 = HEADFITS(File)

; Gestion des heures
        IM1 =MRDFITS(file,1,header,RANGE=[0,0],/SILENT)
	TDEB = Im1.time
	IF KEYWORD_SET (Hdeb) THEN BEGIN
		TDEB = HMS(Hdeb)
		IF Tdeb LT Im1.time THEN Tdeb = Im1.time
		Fili = MOD_NRHFILE(Fili, HEURE = MSH(Tdeb) )
	END
	HDOBS = MSH(Tdeb)
	STRPUT, HDOBS, '.', 8
	DATE_OBS = FXPAR(Hd1, 'DATE_OBS')
	STRPUT, DATE_OBS, HDOBS, 11
	
	TFIN = HMS(STRMID(FXPAR(Header,'DATE_END'),11,12))
	IF KEYWORD_SET (Hfin) THEN Tfin = HMS(Hfin)
	HFOBS = MSH(Tfin)
	STRPUT, HFOBS, '.', 8
	DATE_END = FXPAR(Hd1, 'DATE_END')
	STRPUT, DATE_END, HFOBS, 11

IF NOT KEYWORD_SET (REPERT) Then Repert= ''
FILS = repert + Fili

; Controle de fichiers
;	r= FINDFILE(repert)
;	If R(0) EQ '' THEN BEGIN
;	    r=widget_message('Directory no found for write')
;	    Return
;	end
	r= FINDFILE(Fils)
	If R(0) NE '' THEN BEGIN
	    r=dialog_message('One old file will be scratched',/Question)
        	If r eq 'No' THEN Return
	end

; Header primaire

	FXADDPAR, Hd1, 'DATE_OBS', Date_obs
	FXADDPAR, Hd1, 'DATE_END', Date_end  
	FXADDPAR, Hd1, 'FILENAME', Fili
	DATE = BIN_DATE (SYSTIME())
	FXADDPAR, HD1, 'DATE', FORM_DATE()
	FXADDPAR, Hd1, 'ORIGIN', 'intgcomp_nrh2.pro'

;  Initialisations
	NIMLU = FXPAR(Header,'NAXIS2')	; Nombre d'images dans le fichier
	CIMLU = 1			;Compteur d'images lues
	CADLU = FXPAR(Header,'EXPTIME')	; Cadence des images lues
	NUMLU = 0
	IF Cadence LT Cadlu THEN BEGIN
		r=widget_message('Initial integration time ='+string(cadlu)+ $
			'Integration NO possible')
		Return
		END 
	NBAI= FIX(Cadence/ Cadlu)	; Nombre d'images a integrer
		Cadence = Nbai * Cadlu
	TIME = Im1.time + LONG((Cadence - Cadlu) *500) ; 1000/2 pour les ms
	DIFFER = 1			; Ecriture de la premiere image
	NUMS = LONG(0)			; Numero d'image de sortie
	NUME = LONG(0)			; Numero d'enregistrement d'image
	RAI = NBAI			; Reste a integrer

;Preparation des tableaux
	SOMMI = FLTARR((size(IM1.stokesi))(1),(size(IM1.stokesi))(2))
					; Sommation des valeurs
	SOMMI(*,*) = 0.0
	IMAGI = FLTARR((size(IM1.stokesi))(1),(size(IM1.stokesi))(2))
	IF Stk EQ 1 THEN BEGIN
	   SOMMV = FLTARR((size(IM1.stokesv))(1),(size(IM1.stokesv))(2))
					; Sommation des valeurs
	   SOMMV(*,*) = 0.0
	   IMAGV = FLTARR((size(IM1.stokesv))(1),(size(IM1.stokesv))(2))
	END

;  Preparartion et enregistrement du header du fichier de sortie
	IF Stk EQ 0 AND FXPAR(Header,'TFIELDS') EQ 4 THEN BEGIN
		SXADDPAR, Header, 'TFIELDS', 3	; limitation a stockesi
		Noctets= 4+4 + (size(im1.stokesi))(1) *$
					(size(im1.stokesi))(2)* 4
		SXADDPAR, Header, 'NAXIS1', Noctets
		SXADDPAR, HD1, 'PHYSPAR', 'STOKESI'
		SXDELPAR, Header, 'TFORM4'
		SXDELPAR, Header, 'TTYPE4'
		SXDELPAR, Header, 'TDIM4'
	END

	SXADDPAR, Header, 'EXPTIME', Cadence
	SXADDPAR, Header, 'TIMESTEP', Cadence
	SXADDPAR, Header, 'TIM_STR', MSH(Tdeb)
 
	WRITEFITS, FILS, 0, HD1		;Ecriture du Header primaire

	FXBHMAKE, Hb, 1			;uniquement pour initialisation
	FXBCREATE, Unit, Fils, Header

;  Calculs Jusqu' a la fin du fichier ou l'heure de fin
WHILE IM1.TIME LT TFIN DO BEGIN		; 
	IM0 = IM1
        IM1 =MRDFITS(file,1,h,RANGE=[Cimlu,Cimlu],/Silent)
	Cimlu = Cimlu +1
	TIME = Im0.time 
	NBLU = Im1.numim - Im0.numim	; Nombre d'images disponibles

   IF IM0.time GE Tdeb THEN BEGIN	;si heure de debut atteinte
	WHILE Nblu GE Rai DO BEGIN	; Il y a suffisament d'images
		Nums =Nums+1
		Time = Time + FIX(Cadlu * 1000 * Rai) ;Hdeb Image +1
		Nblu = Nblu - rai

		IF DIffer NE 0 THEN BEGIN	; On energistre une image
			nume=nume+1
	TIME = time- LONG((Cadence + Cadlu) *500) ; 1000/2 pour les ms
			FXBWRITE, Unit, Time, 1, Nume
			FXBWRITE, Unit, LONG(Nums), 2, Nume
			Imagi(*,*) = (Sommi(*,*) + $
					Im0.stokesi(*,*) * Rai) / float(nbai) 
			FXBWRITE, Unit, Imagi, 3, Nume
		   IF Stk EQ 1 THEN BEGIN
			Imagv(*,*) = (Sommv(*,*) + $
					Im0.stokesv(*,*) * Rai) / float(nbai)
			FXBWRITE, Unit, Imagv, 4, Nume
		    END
			Rai = NBAI
			Differ = 0
		ENDIF

		SOMMI(*,*) = 0.0
		IF Stk EQ 1 THEN SOMMV(*,*) = 0.0
	END
	IF Nblu NE 0 THEN BEGIN	; Il n'y a pas suffisammment d'images
		Differ = 1
		Sommi(*,*) = Sommi(*,*) + Im0.stokesi(*,*) * Nblu
		IF Stk EQ 1 THEN $
			Sommv(*,*) = Sommv(*,*) + Im0.stokesv(*,*) * Nblu
		Time = time + FIX(Cadlu *1000 *nblu)
		Rai = Rai - Nblu
	END
   ENDIF
END

	NUME = NUME+1
	FXBWRITE, Unit, Im1.Time, 1, Nume
	FXBWRITE, Unit, (Nums+Rai/Nbai), 2, Nume
	FXBWRITE, Unit, Im1.stokesi, 3, Nume
	IF Stk EQ 1 THEN $
			FXBWRITE, Unit, Im1.stokesv, 4, Nume
	FXBFINISH, Unit

;   Modification du Header
	SXADDPAR, Header, 'NAXIS2', NUME
	SXADDPAR, Header, 'TIM_END', msh(Im1.time)
	MODFITS, Fils, 0, Header, EXTEN_NO = 1

END