;******************************************************************
;		FICHIER 		: TRACESERIEPROF.PRO
;  
;	     	DERNIERE MODIFICATION 	: 1 DECEMBRE 1997
;******************************************************************
;
; Modifications:
;	1/12/97:Cadrage des traces SHADE et SURFACE; ecriture explicite 
;		des heures (KLK)

;******************************************************************
PRO LoadSerieIntens, Tabl_X, imageX, heure_deb, heure_fin, lun

  COMMON NRH1_GLOBAL,nomfich,FichInfo  
  dt = fichinfo(lun).paspix(1)
  heuredeb=Fichinfo(lun).Heurdeb
  numdeb=Indice(heuredeb,heure_deb,dt)
  numfin=Indice(heuredeb,heure_fin,dt)
  s=SIZE(tabl_X)
  IF s(1) EQ 3 THEN tempo1=REFORM(Tabl_x(*,*,0)) $ ; prend tabl. intensite
  ELSE tempo1 = Tabl_x
  imageX=FLTARR(Fichinfo(lun).nbpix(0),numfin-numdeb)
  imageX=tempo1(*,numdeb:numfin)
END

;********************************************************************
PRO LoadSeriePolar, Tabl_X, imageX, heure_deb, heure_fin, lun

  COMMON NRH1_GLOBAL,nomfich,FichInfo
  dt = fichinfo(lun).paspix(1)
  heuredeb=fichinfo(lun).heurdeb
  numdeb=Indice(heuredeb,heure_deb,dt)
  numfin=Indice(heuredeb,heure_fin,dt)
  s=SIZE(tabl_X)
  IF s(1) EQ 3 THEN tempo1=REFORM(Tabl_x(*,*,1)) $ ; prend tabl. intensite
  ELSE tempo1 = Tabl_x
  imageX=FLTARR(Fichinfo(lun).nbpix(0),numfin-numdeb)
  imageX=tempo1(*,numdeb:numfin)
END

;*********************************************************************
PRO serialise, lun,Tabl_X, imageX, heure_deb, heure_fin, $
               cnldeb,cnlfin, canaldeb,$
               step,win,$
               CANAUX=canaux,$
               freq,type,label

  COMMON NRH1_GLOBAL,nomfich,FichInfo
  
  freq=motcle(lun,'FREQ')
  label=motcle(lun,'LABEL')
  type=motcle(lun,'TYPE')
  
  dt = fichinfo(lun).paspix(1)
  heuredeb=fichinfo(lun).heurdeb
  dx = fichinfo(lun).paspix(0)
  cdeb = fix(fichinfo(lun).valorg(0))
  
  numdeb=Indice(heuredeb,heure_deb,dt)
  numfin=Indice(heuredeb,heure_fin,dt)

  s=SIZE(tabl_X)
  IF s(1) EQ 3 THEN tempo1=REFORM(Tabl_x(*,*,0)) $ ; prend tabl. intens
  ELSE tempo1 = Tabl_x
  imageX=FLTARR(Fichinfo(lun).nbpix(0),numfin-numdeb)
  tab_serie=FLTARR(Fichinfo(lun).nbpix(0),numfin-numdeb)
  imageX=tempo1(*,numdeb:numfin)
  tab_serie=imageX
 
  step=float(step)
  step=step/10

  pas=MEDIAN(imageX)
  pas=pas*step

  ycoor=intarr(numfin-numdeb+1)
  FOR i=1, (numfin-numdeb) DO BEGIN
      tab_serie(*,i-1)=imageX(*,i-1)+pas*i
      ycoor(i-1)=tab_serie(0,i-1)
  ENDFOR

xcoor = cdeb + findgen(fichinfo(lun).nbpix(0))*dx	; Tableau d'Abscisses: canaux
              
  yrange=[min(tab_serie)-pas,max(tab_serie)+pas]

  IF (!P.MULTI(1) NE 0) THEN Taille=0.4 ELSE Taille=0.6

   titre = string(type) + '  ' + string(fichinfo(lun).date) + '  ' + $
	string(freq)
  soustitre = 'Canal ' + string(label)

  plot, xcoor,tab_serie(*,0),$
         /NODATA, YRANGE=yrange, XRANGE=canaux, xstyle=1,ystyle=1,$
        TITLE = Titre, SUBTITLE = soustitre,$
        CHARSIZE=Taille,XMARGIN=[12,12],YMARGIN=[5,2]
  IF (!P.MULTI(1)+!P.MULTI(2)) NE 0 THEN BEGIN
   !P.MULTI(0)=!P.MULTI(0)+1
  ENDIF
  FOR i=0, (numfin-numdeb-1) DO BEGIN

     plot, xcoor,tab_serie(*,i),$
            /NOERASE, xstyle=5, ystyle=5, yrange=yrange, XRANGE=canaux, $
		XMARGIN=[12,12],YMARGIN=[5,2], CHARSIZE=Taille            
  ENDFOR

   hcoor=strarr(numfin-numdeb+1)
   FOR i=0,numfin-numdeb DO BEGIN
      j=heure_deb+i*dt
      hcoor(i)=MSH(j)
   ENDFOR

   if ((numfin-numdeb) GT 10) THEN $
   modulo=fix((numfin-numdeb)/10) ELSE $
   modulo=1

   FOR i=0,numfin-numdeb DO BEGIN
	IF (i MOD modulo) EQ 0 THEN $
		XYOUTS, cnlfin+0.01*(cnlfin-cnldeb), ycoor(i), $
			strcompress(hcoor(i)), /DATA, CHARSIZE=Taille
   ENDFOR
END



PRO TraceSerieProf, tabl_X, lun, $
                    HEURES=heures, $
                    CANAUX=canaux, $
                    STEP=step,$
                    LASER=laser, TEK=tek, $
                    INTENSITE=intensite, POLAR=polar, $
                    WIN=win, $
                    CLASSIC=classic, SURFACE=surface, SHADE=shade, $
                    AX=ax,AZ=az

;-------------------------------------------------
; CE MODULE PERMET D'AFFICHER
; UNE SERIE DE PROFILS SOUS TROIS MODES DIFFERENTS
; CLASSIC, SURFACE, SHADE, DECRITS CI DESSOUS
;-------------------------------------------------

;-----------------------------------------------------
; PARAMETRES DU MODULE
;-----------------------------------------------------
;	tabl_X		: Tableau de l'image a afficher	
;	lun		: Numero d'unite logique du fichier
;	HEURES		: Tableau une dimension, deux elements,
;			  contennant les heures de debut et de
;			  specifies par l'utilisateur 
;	CANAUX		: Tableau une dimension, deux elements, 
;			  canaux de debut et de fin de visualisation
;	CLASSIC		: Representation d'une serie de profils superoses
;			  et decales les uns par rapport aux autres
;	SURFACE		: Serie de profils, meme type de visualisation que CLASSIC
;			  mais : Tous ce qui se trouve derriere un profil est cache
;			  La serie obtenue est orientable dans l'espace
;	SHADE		: Representation spacio-temporelle d'une serie de profils
;			  sous forme d'une surface lissee texturee, orientable
;			  dans l'espace  
;	STEP		: Distance entre les profils pour la visualisation en
;			  mode CLASSIC 
;	AX		: Orientation de l'axe des X pour les representations 
;			  SURFACE et SHADE
;	AZ		: Idem que AX pour l'axe des Z

;------------------------------------
; STRUCTURE GLOBALE DE L'APPLICATION
; CONTENU DANS LE PROGRAMME PRINCIPAL 
; DE LA PLATE-FORME
;------------------------------------
COMMON NRH1_GLOBAL,nomfich,fichinfo

;---------------------------------------------
; MEMORISATION DES INFORMATIONS SUR LE FICHIER
;---------------------------------------------
file=fichinfo(lun)
freq = MOTCLE(lun,'FREQ')
label = MOTCLE(lun,'LABEL')
type = MOTCLE(lun,'TYPE')
Heuredeb=file.Heurdeb
Heurefin=file.HeurFin
dt = file.paspix(1)
dx = file.paspix(0)
canaldeb=fix(file.valorg(0))
canalfin=fix(file.valorg(0)+(file.nbpix(0)-1)*dx)


;-----------------------------------------
;    Test sur le nombre de parametres
;-----------------------------------------
message=STRARR(3)
message(0)='ERREUR DANS LE NOMBRE DE PARAMETRES...'
message(1)='Syntaxe : SERIE, Variable_Sortie_X, Structure_X [+Keywords]'
message(2)='Consultez l''aide de Serie.pro dans le fichier Serie.txt'

IF N_PARAMS() LT 2 THEN $
PRINT, message

;----------------------------------------
;   Tests sur la validite des heures
;   de debut et de fin de visualisation
;----------------------------------------

; On teste la presence de l'heure de debut
; le cas echeant on lui donne l'heure de debut du fichier

IF NOT KEYWORD_SET(heures) THEN BEGIN
  heure_deb=heuredeb 
  heure_fin=heurefin
ENDIF ELSE BEGIN 
  heure_deb=HMS(heures(0))
  heure_fin=HMS(heures(1)) 
ENDELSE
IF (heure_fin LT heure_deb) THEN BEGIN
   print,'Heure de fin plus petite que heure de debut'
   tempo=heure_deb
   heure_deb=heure_fin
   heure_fin=tempo
ENDIF

IF (heure_deb LT heuredeb) THEN BEGIN
   PRINT, 'Heure de debut non conforme'
   heure_deb=heuredeb
ENDIF

IF (heure_fin GT heurefin) THEN BEGIN
   PRINT, 'Heure de fin non conforme'
   heure_fin=heurefin
ENDIF


;-----------------------------------------------------
; TEST SUR LA VALIDITE DES CANAUX PASSES AU PROGHRAMME
;-----------------------------------------------------
IF NOT KEYWORD_SET(canaux) THEN BEGIN
  cnldeb=canaldeb 
  cnlfin=canalfin
ENDIF ELSE BEGIN
  cnldeb=canaux(0)
  cnlfin=canaux(1) 
ENDELSE

IF (cnldeb GE cnlfin) THEN BEGIN
   print,'CANAL DEB > OR = THAN CANAL FIN'
   return
ENDIF
  

;-----------------------------------------------
;	TEST SUR LA TACHE A EFFECTUER
;-----------------------------------------------
IF ((NOT KEYWORD_SET(classic)) AND $
    (NOT KEYWORD_SET(surface)) AND (NOT KEYWORD_SET(shade))) THEN $
classic=1

IF ((NOT KEYWORD_SET(INTENS)) AND (NOT KEYWORD_SET(POLAR))) THEN $
intens=1

;-----------------------------------------------
;	Fin des tests sur les horaires
;-----------------------------------------------

;	Numerotation des fenetres
;-----------------------------------
IF (NOT KEYWORD_SET(win)) THEN BEGIN
  win = 1
ENDIF

IF KEYWORD_SET(INTENS) THEN BEGIN
	LoadSerieIntens, Tabl_X, imageX, heure_deb, heure_fin, lun
	titre = 'Stokes I'
ENDIF
IF KEYWORD_SET(POLAR) THEN BEGIN
	LoadSeriePolar, Tabl_X, imageX, heure_deb, heure_fin, lun
	titre = 'Stokes V'
ENDIF

IF NOT KEYWORD_SET(step) THEN step=1

;------------------------------------------
; LANCEMENT DE LA VISUALISATION PAR DEFAUT
; : LE MODE CLASSIC
;------------------------------------------


IF KEYWORD_SET(classic) THEN $
serialise, lun,tabl_x, image_serie, heure_deb, heure_fin, $
           cnldeb,cnlfin,canaldeb,$
           step,win, $
           CANAUX=canaux

;----------------------------------------------------------------
; CALCUL DES RANGES EN X ET Y POUR LES DEUX AUTRES MODES
; DE REPRESENTATION : LES REPRESENTATION EN MODE SURFACE ET SHADE
;----------------------------------------------------------------

; Extraction de la partie du tableau qui sera affichee
	step = 0
	tab_entree = tabl_x
	NRH1_EXTRACT, tab_entree, tab_sortie, Heuredeb, dt, canaldeb, dx, $
	HEURES=heures, CANAUX=canaux, STEP=step
	tempo = tab_sortie(*,*,0)
	dimtempo = SIZE(tempo)
	nbcan = dimtempo(1)
	nbinst = dimtempo(2)
	xcoor=canaux(0) + FINDGEN(nbcan)*dx
	ycoor = heuredeb + indgen(nbinst)*dt
	milsec_axis, ycoor, tickv, tickl, ticks

;   numdeb=indice(heuredeb,heure_deb,dt)
;   numfin=indice(heuredeb,heure_fin,dt)
   hcoor=strarr(nbinst)
   FOR i=0,nbinst-1 DO BEGIN
      j=heure_deb+i*dt
      hcoor(i)=MSH(j)
   ENDFOR
  

;
   titre = titre + '  ' + string(fichinfo(lun).date) + '  ' + string(freq)
   titre = STRCOMPRESS(titre)
   soustitre = STRLOWCASE(string(label))
   IF STRMID(soustitre, 0, 1) EQ 'e' THEN soustitre = 'East-west' ELSE $
	soustitre = 'South-north' 
   soustitre = soustitre + ' channel'
   ym = [6,6]
   xc_size = .9
   IF STRLOWCASE(!D.NAME) EQ 'ps' THEN BEGIN
	ym = [16,16]
	xc_size = 0.7
    ENDIF
    IF !P.MULTI(1) LT 2 AND !P.MULTI(2) LT 2 THEN xc_size=1.5*xc_size

IF KEYWORD_SET(surface) THEN BEGIN
   IF (!P.MULTI(1) NE 0) THEN Taille=0.4 ELSE Taille=0.6
   surface, tempo,xcoor,ycoor, xstyle=1,ystyle=1,zstyle=1, $
	AX=ax,AZ=az,HORIZONTAL=1,XMARGIN=[12,12],YMARGIN=ym,$
	XCHARSIZE=xc_size,YCHARSIZE=xc_size,ZCHARSIZE=xc_size,$
	YTICKV=tickv, YTICKS=ticks(0), YMINOR=ticks(1), YTICKNAME=tickl, $
	/SAVE
   surface, tempo,xcoor,ycoor, xstyle=1,ystyle=1,zstyle=1,$
	AX=ax,AZ=az,HORIZONTAL=1,XMARGIN=[12,12],YMARGIN=ym,$
	XCHARSIZE=xc_size,YCHARSIZE=xc_size,ZCHARSIZE=xc_size,$
	YTICKV=tickv, YTICKS=ticks(0), YMINOR=ticks(1), YTICKNAME=tickl, $
            TITLE=titre, SUBTITLE=soustitre, /NODATA, /NOERASE
   axe_x='AX = '+string(ax)
   axe_z='AZ = '+string(az)
   ;XYOUTS, [cnldeb-20,cnldeb-20,cnldeb-20,cnldeb-20],[12,11,10,9],$
   ;        ['Orientation du','graphique :',axe_x,$
   ;         axe_z],/DATA,CHARSIZE=.8
   ;XYOUTS, cnldeb-20,12,"Orientation !C du graphique !C"+axe_x+"!C"+axe_z,$
   ;        /DATA,CHARSIZE=.8
   ;------------------------
   ;	AFFICHAGE DES HEURES
   ;------------------------
   
   if (nbinst GT 10) THEN $
   modulo=fix(nbinst/10) ELSE $
   modulo=1

   FOR i=0,nbinst-1 DO BEGIN
       IF (i MOD modulo) EQ 0 THEN $
       XYOUTS,cnlfin+0.01*(cnlfin-cnldeb),ycoor(i),strcompress(hcoor(i)),$
              /DATA,CHARSIZE=Taille,$
              TEXT_AXES=0,/T3D
   ENDFOR
ENDIF

IF KEYWORD_SET(shade) THEN BEGIN

   IF (!P.MULTI(1) NE 0) THEN Taille=0.5 ELSE Taille=0.9
   shade_surf, tempo,xcoor,ycoor, $
	XCHARSIZE=xc_size,YCHARSIZE=xc_size,ZCHARSIZE=xc_size,$
	xstyle=1,ystyle=1,zstyle=1,$
	AX=ax,AZ=az,XMARGIN=[10,2], YMARGIN=ym, $
	TITLE = titre, SUBTITLE= soustitre, $
	YTICKV = tickv, YTICKS = ticks(0), YMINOR = ticks(1), YTICKNAME = tickl
   axe_x='AX = '+string(ax)
   axe_z='AZ = '+string(az)
   ;XYOUTS, [0,0,0,0],[45,30,15,0],$
   ;        ['Orientation du','graphique :',axe_x,$
   ;         axe_z],/DEVICE,CHARSIZE=Taille
ENDIF

IF KEYWORD_SET(classic) THEN BEGIN
  IF !P.MULTI(0) NE 0 THEN BEGIN
     !P.MULTI(0)=!P.MULTI(0)-1
  ENDIF
ENDIF

END

