
;+ ***********************************************************************
; NAME:
;	MENUBCKGRD
;
; PURPOSE:
;	Cette procedure contient les WIDGETS pour le calcul de soustraction 
;	d'une image BACKGROUND sur des images 1 dimension
;	"Button" BACKGROUND du menu principal
;
; CATEGORY:
;	NRH1 Menu
;
; CALLING SEQUENCE:
;	MENUBCKGRD
;
; INPUTS:
;	Non
;
; KEYWORD PARAMETERS:
;	Non
;
; OUTPUTS:
;	Non
;
; COMMON BLOCKS:
;	NRH1_GLOBAL
;	NRH1_HELIO
;
; MODIFICATION HISTORY: (bonmartin@obspm.fr)
;	03/12/98 adapte du logiciel XHELIO
;-*******************************************************************
PRO MENUBCKGRD_EVENT, ev


ON_ERROR,2
common NRH1_GLOBAL,nomfich,fichinfo
common NRH1_HELIO,mainstruct
common NRH1_com_bck, a, bckscan	; Mise en memoire du tableau d'images apres
;				soustraction du fond et du profil soustrait

; on charge les variables locales a isophote
stash = WIDGET_INFO ( ev.top, /CHILD )
WIDGET_CONTROL, stash, GET_UVALUE = state



; ***** Lecture du fichier d'images *****

IF (ev.id EQ state.infiles) THEN BEGIN
	WIDGET_CONTROL, state.infiles, GET_VALUE = fichier
	err = newlitentete(1,fichier,file)
	IF (err EQ 1) THEN RETURN
;*** Nom du fichier de sortie a partir du nom du fichier d'entree
	nslash = RSTRPOS(fichier,'/')
	OUTFICH = STRMID(fichier, 0, nslash) + '/bck_'  + $
		 STRMID(fichier, nslash+1, STRLEN(fichier)-nslash)

; Modification pour fichier images FITS
		S= STR_SEP(Outfich, '.')
		Sz= SIZE(s)
		IF S(1) EQ 'fts' THEN $
 		    IF Mainstruct.array EQ 0 THEN Outfich = S(0)+'.few'$
			ELSE Outfich = S(0)+'.fns'

	WIDGET_CONTROL, state.outfiles, SET_VALUE = outfich

	WIDGET_CONTROL, state.maxvalue, SET_VALUE = file.valmax
	hdeb=MSH(file.heurdeb)
	hfin=MSH(file.heurfin)
	WIDGET_CONTROL, state.heures, SET_VALUE = [hdeb,hfin]
	WIDGET_CONTROL, state.back_heures, SET_VALUE = [MSH(0), MSH(0)]
	ftest=FINDFILE (outfich, COUNT=nfs)
	IF nfs NE 0 THEN BEGIN
	message=["Output file already exists: " + outfich + ".", $
		"Change name(s) if you don't want to overwrite it."]
	txt = WIDGET_MESSAGE(message, /INFORMATION, TITLE = 'Output file')
	ENDIF
ENDIF


; Pour les fichiers FITS choix EW NS
IF Ev.id EQ State.Id_ewns THEN $
	Mainstruct.array = ev.value

IF (ev.id EQ state.base_bckgr) THEN BEGIN
ENDIF
;-----------------------------------------------------------------------------
; ***** Action demandee par bouton de controle *****

IF ( ev.id EQ state.bgroup_control ) THEN BEGIN
  ; ******** update ********* on recupere les variables globales
    IF ( ev.value EQ 0 ) THEN BEGIN
	WIDGET_CONTROL, state.infiles, GET_VALUE = fichier
	err = newlitentete(1,fichier,file)
	IF (err EQ 1) THEN RETURN
 	hdeb=MSH(file.heurdeb)
	hfin=MSH(file.heurfin)
	WIDGET_CONTROL, state.heures, SET_VALUE = [hdeb,hfin]
	WIDGET_CONTROL, state.back_heures, SET_VALUE = [msh(0),msh(0)]
     ENDIF
  ; ******* quit *********
     IF ( ev.value EQ 1 ) THEN BEGIN
         WIDGET_CONTROL, stash, SET_UVALUE = state
         WIDGET_CONTROL, ev.top,/DESTROY
         RETURN
     ENDIF
  ; ******* soustraction background *********
    IF ( ev.value EQ 2 ) THEN BEGIN
      ; *******   On recupere  toutes les valeurs des widgets *********

        WIDGET_CONTROL,state.maxvalue, GET_value = maxvalue
        WIDGET_CONTROL, state.heures, GET_VALUE = heures
        WIDGET_CONTROL, state.back_heures, GET_VALUE = bck_heures
	WIDGET_CONTROL, state.back_heures, GET_VALUE = test
	IF MSH(test(1)) NE 0 THEN BEGIN
		verif_heures, file, HEURES=test, numix1, numix2
		WIDGET_CONTROL, state.back_heures, SET_VALUE = test
	ENDIF
        WIDGET_CONTROL, state.infiles, GET_VALUE = fichier      
         err = newlec1d(2,a,sa,FICHIER=fichier)
        IF (err EQ 1) THEN RETURN
;        *******  Soustraction du fond   *******
	bckhrs = [hms(bck_heures(0)),hms(bck_heures(1))]
	IF bckhrs(1) GT 0 THEN BEGIN
		lun=2
		sbtrbckgrd, a, lun, HEURES=bck_heures, bckscan, message
		IF message NE ' ' THEN  $
		WIDGET_CONTROL, state.txt_message, SET_VALUE=message, /APPEND
	ENDIF
    ENDIF

  ; ******* Trace du background *********
    IF ( ev.value EQ 3 ) THEN BEGIN
	win=get_window(1,4,TITLE='Background scan')
	plot, bckscan(*,0), xtitle = "Channel", ytitle = "Amplitude"
	oplot, bckscan(*,1), LINESTYLE=3
    ENDIF

    IF ( ev.value EQ 4 ) THEN BEGIN
      ; *******   write file *********
	WIDGET_CONTROL, state.infiles, GET_VALUE = infich
	err = newlitentete(1,infich,file)
	IF (err EQ 1) THEN RETURN
	lun=10
	LECDESCR, lun, infich, longrec, dfixe, mot_cle, valcle, comment
	CLOSE, lun
	IF dfixe.facbloc(1) GT 1 THEN vmin = MIN(a(*,*,0), MAX=vmax) ELSE $
		vmin = MIN(a(*,*), MAX=vmax)
	dfixe.valmin = vmin
	dfixe.valmax=vmax
	WIDGET_CONTROL, state.outfiles, GET_VALUE = outfich

	OPENW, 11, outfich
	ECRDESCD,11,longrec/4,dfixe,mot_cle,valcle,comment
	nprofs = dfixe.nbpix(1) / dfixe.facbloc(1); Nbre de profils


; Modification pour fichier images FITS
		S= STR_SEP(Infich, '.')
		Sz= SIZE(s)

     IF S(1) EQ 'fts' THEN BEGIN
	   IHMS = Dfixe.Heurdeb - Dfixe.paspix1

	   FOR i = 0, nprofs -1 DO BEGIN
		Ihms = Ihms+ Dfixe.paspix1
		IF File.texte.val(4) EQ 'I+V'  THEN BEGIN
			WRITEU, 11, ihms, a(*,i,0)
			WRITEU, 11, ihms, a(*,i,1)
		ENDIF ELSE BEGIN
			WRITEU, 11, ihms, a(*,i)
		ENDELSE		
	   ENDFOR
      ENDIF ELSE BEGIN
		
	OPENR, lun, infich
		; Saut du descripteur de infich
	rec1 = BYTARR(longrec)
	FOR k=1, dfixe.nblocs DO READU, lun, rec1
	ihms=0l
	aux = FLTARR(dfixe.nbpix(0))
	FOR i = 0, nprofs -1 DO BEGIN
		READU, lun, ihms, aux
		IF dfixe.facbloc(1) GT 1 THEN BEGIN
			WRITEU, 11, ihms, a(*,i,0)
			READU, lun, ihms, aux
			WRITEU, 11, ihms, a(*,i,1)
		ENDIF ELSE BEGIN
			WRITEU, 11, ihms, a(*,i)
		ENDELSE
	ENDFOR
	CLOSE, lun
     ENDELSE
	CLOSE, 11
	message = ["Background subtracted images written to file", outfich]
	WIDGET_CONTROL, state.txt_message, SET_VALUE=message, /APPEND
    ENDIF
ENDIF

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

IF ( ev.id EQ state.heures ) THEN BEGIN
	mainstruct.heures = ev.value
ENDIF


; on sauve les modifications
WIDGET_CONTROL, stash, SET_UVALUE = state
END




PRO MENUBCKGRD
;          
;                             les variables globales (mainstruct)
;          Utilisations des fenetres 5,6,7,8 pour les affichages 
;          (mainstruct.windows(5:8))

common NRH1_HELIO,mainstruct

Title = "BACKGROUND SUBTRACTION"
;         initialisation du button group
column = 2  
nb=4          
;Choix_Qualifiers = intarr(nb) ; pour les entrees du button group
;FOR i = 0, nb-1 DO Choix_Qualifiers(i) = 0
;Qualifiers = ['INTENS','POLAR','TEK','NOERASE']
;Choix_Qualifiers(0)=1

loadct,12

;infiles = lonarr ( 1 ) 
;outfiles=infiles

base = WIDGET_BASE (TITLE = title,/FRAME,/COLUMN, XOFFSET = 200,$
                                                  YOFFSET = 200 )
base_file = WIDGET_BASE ( base,/COLUMN,/FRAME )
base_zone = WIDGET_BASE(base,/ROW,/FRAME)       

base_param = WIDGET_BASE (base,COLUMN=2,/FRAME )


base_qualifiers = WIDGET_BASE ( base,/ROW,/FRAME )
;base_menu = WIDGET_BASE ( base_qualifiers )
;base_menu2 = WIDGET_BASE ( base_qualifiers )

infich=mainstruct.ewfile
infiles= CW_pickfile_nrh(base_file, TITLE = '1D images (input) :', $
              VALUE = infich, FILTER = '*.[e,.n,.f]*')
Id_ewns = CW_BGROUP(base_file,['E-W','N-S'],$
	COLUMN=2, /EXCLUSIVE,SET_VALUE = Mainstruct.array) 


pos = RSTRPOS(infich, '/')
len = STRLEN(infich)
outfich = STRMID(infich, 0, pos+1) + 'bck_' + STRMID(infich, pos+1, len-pos)
outfiles= CW_pickfile_nrh(base_file, TITLE = '1D images (output):', $
	VALUE = outfich)

; Lecture de l'entete du fichier

err = newlitentete(1,infich,file)
IF err EQ 0 THEN BEGIN
   valmax=file.valmax
   canal= $
     [fix(file.valorg(0)),fix(file.valorg(0)+file.paspix(0)*file.nbpix(0)-1)]
   heure=[string(msh(file.heurdeb)),string(msh(file.heurfin))]
   deltat = file.paspix(1)

ENDIF ELSE BEGIN
   valmax=0
   deltat = 0
   canal=[-512,512]
   heure=['00:00:00','00:00:00']
ENDELSE
bck_heure=['00:00:00','00:00:00']

;Groupe de saisie des horaires de debut et de fin de visualisation
base_heures = WIDGET_BASE (base_zone, /COLUMN)
label_hr = WIDGET_LABEL(base_heures, VALUE = "Plot time:")
heures = CX_HEURES (base_heures,VALUE=heure)

base_bckgr = WIDGET_BASE (base_zone, /COLUMN)
label_hr = WIDGET_LABEL(base_bckgr, VALUE = "Background time:")
back_heures = CX_HEURES (base_bckgr,VALUE=bck_heure)

; Affichage du maximum d'amplitude et de l'intervalle de temps
base_maxtim = WIDGET_BASE(base_qualifiers, /COLUMN)
maxvalue = CW_FIELD(base_maxtim, TITLE="Max. value : ",VALUE=valmax, $
                 /INTEGER,/RETURN_EVENT,XSIZE=8)


bgroup_control = CW_BGROUP ( base, ['UPDATE','QUIT','COMPUTE','PLOT BCKGR', $
		'WRITE'], /ROW, SPACE = 12 )

txt_message = WIDGET_TEXT( base, VALUE = ' ', YSIZE=3, /SCROLL)


state = { $
        bgroup_control:bgroup_control , $
	infiles:infiles, outfiles:outfiles, $
	txt_message:txt_message, $
          xrange:[0L,0L],yrange:[0L,0L],pastempo:0L,$
          debutemp:0L, maxvalue:maxvalue,$
          heures:heures, Id_ewns: Id_ewns,$
	base_bckgr:base_bckgr,back_heures:back_heures $
	}

WIDGET_CONTROL, WIDGET_INFO ( base, /CHILD ), SET_UVALUE = state 

WIDGET_CONTROL, base ,/REALIZE

XMANAGER,'MENUBCKGRD', base,GROUP_LEADER = mainstruct.root, /NO_BLOCK

;    rajouter sous idl 4.0
;WIDGET_CONTROL,menu,SET_LIST_SELECT=0,
;              
END


 

