; ---------------------------------------------------------------------
;                                 rh_open
; ---------------------------------------------------------------------
; Ouvre un fichier RH et definit le common RH 
; 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 evenement 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 begin
     val = swap_endian(val)
     lgent = swap_endian(lgent)
  endif
  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

  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
     1128 : begin
        nbant1 = 48L
        nbcorel1 = 1128L
     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),		$   
           heure:intarr(2),        $  
           coeff_gain:0,		$
           gain_np:intarr(nbant1),	$
           gain_p:intarr(nbant1),	$
           phase_np:intarr(nbant1),	$
           phase_p:intarr(nbant1) },10)

  if nbcorel1 ne 1128 then $
     entFI = {     lgent:0L,		$ 
                   obsolete:0L,   	        $      
                   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) $
             } $
  else  entFI = {     lgent:0L,		$ 
                      obsolete:0L,   	        $      
                      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),	$
                      pzant: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) $
                }

;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 = nbcorel1
; 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
  if val/4 ne 1128 then begin
     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
  endif else  sFI.tFI(*,*) = 2 

;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

  aFI = ASSOC(u, bFI, entFI.lgent) 

;Nombre max d'acq
  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

;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

; 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
