
; ---------------------------------------------------------------------
;                                 rh_open
; ---------------------------------------------------------------------
; Ouvre un fichier RH et definit le common RH (cf rh_common.inc)
; Le keyword MONO ou SEL definit le mode de lecture.
; ---------------------------------------------------------------------
; 
; CALLING SEQUENCE: 
;       status = rh_open(fichier) 
; 
; INPUTS:
;	fichier : nom du fichier a ouvrir 
;
; OUTPUTS: 
;       status : = 1 lecture correcte
;	         = 0 erreur 
;                   !ERROR contient le code de l'erreur
;	            !SYSERR_STRING contient le message d'erreur
;
; KEYWORD:
;	MONO  : lecture acquisition par acquisition
;	        sinon par jeu de frequences
;	SEL   : lecture par jeu, mais selection d'une frequence 
;	        non polar ou polar
;	MALAX : initialise malax
;
; COMMON BLOCKS: 
;	common RH
; HISTORY
;       Mars 2002 : operation antennes anti_alias
;                   44 antennes ---> 48 antennes
;                   576 correlations ---> 576 + 4*18 = 648
;                   correlations
;       Mars 2003 : les structures nommees sFI et entFI sont
;       remplacees par des structures anonymes, ce qui leur permet de 
;       changer de definition au cours d'une session IDL ( avec ou sans 
;       antennes anti-alias )
;       pour menu_rh : appel de rh_init_initmalax.pro quand /malax
;       Oct. 2003 : Ajout de l'heure (hr,mn) du phasage dans entcor
;                   La reference de la source passe de 6 octets a 2 octets
;                   l'heure occupe 2 integer*2
;          Pour verifier faire help,entfi.entcor,/str ( 368/400 octets sans 
;          /avec antennes anti-alias)
;          print,'>', string(entfi.entcor(0).ref(*)),'<'
;          > 3C405<   -->  > 3< 
;          les sources sont : Cy Ca Hy ou Vi
;       Octobre 2003   : lecture des donnees 3D
;       Septembre 2005 : saut des num de freq >0 du debut de fichier 
;       dans les fichiers suite quand lecture par paquets de freq
;       (non-MONO)et donnees sans compression.
; 08/02/2007 : suppression du dernier evenements sans compression
;              remplacé par la configuration du recepteur (80 octets)
; 14/02/2011 : Adaptation de rh_open.pro pour fichiers visibilites
;       fits (A Bouteille)  entfi.rep =1 pour fichiers fits
; -----------------------------------------------------------------------------

FUNCTION rh_open, fichier, MONO = MONO, SEL=SEL, MALAX=MALAX

@rh_common.inc

; Fichier natif ou fichier fits ?

   CHAMP = Str_sep( Fichier, '.')
   EXTEN = Champ((size(champ))(1)-1)
   print,'rh_open',champ,exten

; fichier FITS
   if exten eq 'fts' then begin
       status = rh_open_fits(fichier, MONO = MONO, SEL=SEL, MALAX=MALAX)
       return, status
   endif

ON_IOERROR, ERR
status = 0

; PREPARATION ANTIALIASING
; Selection du nombre d'antennes, du nombre de correlations
; Ajout de nbant, nbcorel a la fin de entFi
 u = 0
 typ = 0
 val = 0
 cod = 0
 openr, u, fichier, /Get_Lun
 lgent=0L
 readu,u,lgent
 point_lun, u, 10L
 readu, u, typ
 readu, u, cod
 point_lun, u, 18L 
 readu, u, val
 IF typ GT 255 THEN val = swap_endian(val)
 IF typ GT 255 THEN lgent = swap_endian(lgent)
 point_lun, u, lgent + 2L
 ; lecture du numero de la 1ere frequence du fichier (cas 2d)
 nof_0 = 0
 readu, u, nof_0
 IF typ GT 255 THEN nof_0 = swap_endian(nof_0)

print,' numero 1ere frequence lue : ', nof_0
;stop

; print, val
 close, u
 free_lun,u
  CASE val/4 OF 
  11 : BEGIN
            nbant1 = 44L
            nbcorel1 = 576L
        END
  576 : BEGIN
            nbant1 = 44L
            nbcorel1 = 576L
        END
  12 : BEGIN
            nbant1 = 48L 	; = 44 + 4
            nbcorel1 = 648L	; = 576 + 4 x 18
        END
  648 : BEGIN
            nbant1 = 48L 	; = 44 + 4
            nbcorel1 = 648L	; = 576 + 4 x 18
        END
  90  : BEGIN                   ; 1D 
            nbant1 = 44L
            nbcorel1 = 90L
        END
  126  : BEGIN                  ; 1D avec NS45-NS (2 barrettes)
            nbant1 = 44L
            nbcorel1 = 126L
        END
  ELSE : BEGIN
            print,' Not a NRH native file : ', fichier, val/4
stop
            goto, ERR
         END   
 ENDCASE
 
;Structure de la tete du fichier

  entCOR=replicate({                    $ 	; def table de correction
		frq:0,			$
		dat:intarr(3),		$
		ref:bytarr(2),		$    ; 2 caracteres au lieu de 6
                heure:intarr(2),        $    ; ajout heure du phasage(oct2003)
		coeff_gain:0,		$
		gain_np:intarr(nbant1),	$
		gain_p:intarr(nbant1),	$
		phase_np:intarr(nbant1),	$
		phase_p:intarr(nbant1) },10)

entFI = {       lgent:0L,		$ 	; def entete du fichier
		obsolete:0L,   	 	$       ; entfi.filesize supprime, obsolete car en octets il faudrait un long64 (0LL)
		lg:0,   	 	$
		typ:0,			$
		cod:0,	    		$
		rep:0,			$
		lgtet:0,		$
		nval:0,	       		$
		nval_2d:0,     		$
		nval_ew:0,     		$
		nval_ns:0,		$
		d_typ:bytarr(6),	$
		itg:0L, 		$
		dat:intarr(3),		$
		ref:bytarr(6),		$
		mer:intarr(4),		$
		dec:intarr(4),		$
		hg:0,			$
		hdeb:intarr(4),		$
		hfin:intarr(4),		$
		nf:0,	     		$
		frq:intarr(10),	        $
		trj:0,	       		$
		comp:0,			$
		cyclms:0,		$
		d_obs:bytarr(78),	$
		depew:0,		$
		dephew:0, 		$
		rotew:0,		$
		rotns:0,		$
		pxant:lonarr(nbant1),	$		
		pyant:lonarr(nbant1),	$
		corel:intarr(2,nbcorel1),	$	
		entCOR:entCOR,		$
		descrip:bytarr(80,2),   $
		activ:bytarr(80),	$
		pannes:bytarr(80,3),	$
		evenements:bytarr(80,14), $
		recepteur:bytarr(80),   $
		endian:0L,		$
		klumax:0L,              $
                dtu:0L,                 $
		nbant: 0L, 		$
		nbcorel: 0L, 		$
		g_recept:intarr(nbant1), $
		tab_gain:intarr(16,nbant1), $
		offset:intarr(nbant1) $
;		libre:lonarr(54) $
                }
;Lecture de la tete du fichier
  openr, u, fichier, /Get_Lun
  readu, u, entFI
  IF entFI.typ GT 255 THEN BEGIN
	entfi = swap_endian(entfi)
	entfi.endian = 1
  ENDIF ELSE BEGIN
	entfi.endian = 0
    ENDELSE

  if entfi.nf gt 10 or entfi.nf lt 0 then begin
      print,' RH_OPEN.PRO erreur fichier: ftp en ASCII?'
                  goto, ERR
              endif

; MODIF ANTIALIASING

  entFI.nbant = nbant1
  entFI.nbcorel = entFI.nval/4
; MODIF heure du phasage non definie pour les manip a 44 antennes
;***on met le cygne sur les vieilles manip (print,entfi.entcor(*).ref)
  if entFI.nbant eq 44 then begin
      entfi.entcor(0:entfi.nf-1).heure=[18,0]  ; pour rh_corr_antennes.pro
      entfi.entcor(0:entfi.nf-1).ref=byte('Cy')
  endif 

; MODIF ANTIALIASING : RECEPTEUR DE GAIN EW (0) OU NS (1)
  if entFI.nbant eq 44 then begin
    FOR k=0, 18 DO BEGIN
    	entfi.g_recept(k)=0
    endfor	
    FOR k=19, entfi.nbant-1 DO BEGIN
    	entfi.g_recept(k)=1
    endfor	

; MODIF ANTIALIASING : TABLE DES GAINS PAR ANTENNES
    FOR k=0, 15 DO BEGIN
    	entfi.tab_gain(k,*)=SQRT(2.^(k*1.))*100.
    endfor
  endif 

   entfi.dat(2) = rh_date100(entfi.dat(2),/full)
   status = 1

;Remplissage de sFI  ajout de SFI.size en long64 mars 2011
;  Passage aux fichiers bruts 5Go
  sFI = {	unit:0L,		$
		name:'',		$
		mode:0 ,		$
                size: 0LL ,            $
		tFI:intarr(4,entFI.nbcorel)	$
      }
  s = fstat(u)
	
;Mise a jour de la taille du fichier
  sFI.size = s.size
  sFI.unit = s.unit
  sFI.name = s.name
  sFI.mode = 1
  IF keyword_set(MONO) THEN sFI.mode = 0
  FOR k=0, entFI.nbcorel-1 DO BEGIN
      sFI.tFI(*,k) = 2
      IF entFI.corel(0,k) LT 19 AND entFI.corel(1,k) LT 19 THEN sFI.tFI(*,k)=0
      IF (entFI.corel(0,k) GE 19 AND entFI.corel(0,k)LT 44 ) AND $
         (entFI.corel(1,k) GE 19 AND entFI.corel(1,k)LT 44) THEN sFI.tFI(*,k)=1
  ENDFOR
  
;Structure decrivant une acquisition decodee
  nbgain=2
  IF entFI.typ EQ 2 then nbgain = 3
  luFI={ g:intarr(nbgain), pt:fltarr(4, entfi.nval/4)}
  IF NOT KEYWORD_SET(MONO) THEN luFI = replicate(luFI, entFI.nf)
  IF KEYWORD_SET(SEL) THEN luFI = { g:intarr(nbgain), $
                                    pt:fltarr(2, entfi.nval/4)}

;Association de la variable aFI au numero logique u

;Structure decrivant une acquisition brute
  CASE entFI.typ OF
     '1': bFI={ c:0, nof:0, h:intarr(4), g:intarr(2), $
                pt:intarr(4, entfi.nval/4)}
     '2': bFI={ c:0, nof:0, h:intarr(4), g:intarr(3), nul0:0, $
                pt:intarr(4,entfi.nval/4), $
                nul1:intarr(entFI.lg/2-entFI.nval-entfi.lgtet)}
     '3': bFI={ c:0, nul2:intarr(2), nof:0, h:intarr(4), g:intarr(2), $
                pt:intarr(4,entfi.nval/4), $
                nul1:intarr(entFI.lg/2-entFI.nval-entfi.lgtet)}
     '4': bFI={ c:0, nof:0, h:intarr(4), g:intarr(2), $
                pt:intarr(4,entfi.nval/4)}
  ENDCASE              

  IF NOT KEYWORD_SET(MONO) THEN bFI = replicate(bFI, entFI.nf)

;Pour lecture non-MONO (cad par paquets de entfi.nf frequences)
; et dans le cas de fichiers suite (fichiers 01Z 01ZZ etc)
; sans compression et de type 2d, en debut de fichier, il faut sauter les acq. 
; de frequence >0, pour commencer un paquet avec la freq 0.
  decal = 0
  if (nof_0 ne 0) and (entfi.comp eq 0) and (entfi.typ eq 2) and $
     (NOT KEYWORD_SET(MONO)) then begin
          decal = (entfi.nf - nof_0) * entfi.lg
          entfi.lgent = entfi.lgent + decal
      endif
;print,'decal,entfi.lgent',decal,entfi.lgent
;stop
  aFI = ASSOC(u, bFI, entFI.lgent) 

;Nombre max d'acq
;  klu = long((entFI.filesize-entfi.lgent)/long(entfi.lg))
   klu = long((sFI.size-entfi.lgent)/long(entfi.lg))
  entfi.klumax = klu
  IF NOT KEYWORD_SET(MONO) THEN entFI.klumax = klu/entFI.nf
  entFI.klumax = entFI.klumax-1L
;print,'entfi.klumax,klu',entfi.klumax,klu
;Heure de debut et de fin
  if (s.size le 10600)then begin
      print,' RH_OPEN : fichier entete seul, pas de donnees'
      status=0
      goto, ERR
  endif
  if (entfi.klumax eq -1)then begin
      print,' RH_OPEN : fichier entete seul, pas de donnees'
      status=0
      goto, ERR
  endif
;stop
; lecture de l'heure de debut et de fin
  entfi.hdeb = rh_readh(0L)
  entfi.hfin = rh_readh(entFI.klumax)

 print,'rh_open : ',entfi.dat, entfi.hdeb, entfi.hfin  
     
; Init Malax pour le calcul d'image
  IF KEYWORD_SET(MALAX) THEN rh_init_initmalax
  RETURN,status
ERR : 

   sFI = {     unit:0L,                $
               name:'',                $
               mode:0 ,                $
               size: 0LL ,            $
               tFI:intarr(4,648)       $
       }
  sFI.unit=u
  RETURN,status

END
