PRO RH_RONDCUBE, tab_image, tab_image_helio, SIZE= size,   $
	       N_SOLAR_RADIUS= n_sol_rd, TB= tb
;+ ***********************************************************************
; NAME:
;	RH_RONDCUBE
; PURPOSE:
;        Cette procedure calcule l'image heliographique finale (soleil rond) 
;	 par interpolation de l'image interferometrique,
; CATEGORY:
;	Traitement de fichiers NRH
; CALLING SEQUENCE:
;	RH_RONDCUBE, Tab_Image, tab_image_helio, SIZE= size,
;                (structure remplie par RH_RDCUBE)
; INPUTS:
; tab_image : structure, cube d'images interfero.
;
; OUTPUTS:
; tab_image_helio : structure, cube d'images heliog.
;                (structure definie ici); 
; KEYWORDS:
; SIZE	: taille en X et en Y de l'image  (128, 256 ou 512)
;    par defaut 128 
; N_SOLAR_RADIUS : largeur de l'image en rayons solaires ( 4 6 8 or 10)
;    par defaut 4
; TB	: tb=0 amplitude en sfu    
;	  tb=1 amplitude temperature de brillance
;         par defaut tb=1
; EXAMPLE:
;IDL>	rh_rondcube,tab_image, tab_image_helio, SIZE = 256,   $
;                        N_SOLAR_RADIUS = 6, TB = 1
;IDL>	help,tab_image
;        TAB_IMAGE       STRUCT    = -> IMAGNP Array[11]
;IDL>	help,tab_image,/struc
;       ** Structure IMAGNP, 4 tags, length=65548:
;	   TIME            LONG          31293050
;	   NSCAN           LONG                 0
;	   FREQ            FLOAT           236.600
;	   STOKESI         FLOAT     Array[128, 128]
;
; MODIFICATION HISTORY:
; 2004 juillet	-Ecrit par: A. Bouteille 
;-*******************************************************************
; la structure entfi a ete remplie par rh_rdcube
    @rh_common.inc
;
    if n_params() lt 2 then BEGIN
        print,' ***ERROR*** RH_RONDCUBE : Insufficient number of parameters.'
	print,'    input parameter : - Image Inferfero(required)'
        print,'    ouput parameter : - Image Heliog.(required)'
	print,'    KEYWORDS (optional) : '
        print,'      SIZE   : taille en X et en Y de l''image 128, 256 ou 512'
        print,'               par defaut 128 '
        print,'      N_SOLAR_RADIUS : largeur de l''image en rayons solaires '
        print,'                       ( 4 6 8 or 10) par defaut 4 '
        print,'      TB     : tb=0 amplitude en sfu'    
        print,'               tb=1 amplitude temperature de brillance'
        print,'               par defaut tb=1'
        return
    endif   

    nbscan = n_elements(tab_image)
    freq = tab_image(0).freq
    npi = (size(tab_image(0).stokesi))(1)
; la taille de l'image sortante est egale a celle de l'image interfero.
; ou egale a size si le mot cle SIZE est defini 
    np = npi
    if n_elements(size) ne 0 then begin
	if size ne 128 and size ne 256 and size ne 512 then begin
	    print,' SIZE must be egal to 128,256 or 512'
	    print,' Calculations are made with SIZE=',npi
	    size=npi 
	endif 
        np = size
    endif
    larg=4
    if keyword_set(n_sol_rd) then begin
	if n_sol_rd ne 4 and n_sol_rd ne 6 and n_sol_rd ne 8 $
           and n_sol_rd ne 10 then begin
	    print,' N_SOLAR_RADIUS must be egal to 4 6 8 or 10 '
	    print,' Calculations are made with N_SOLAR_RADIUS = 4'
	    n_sol_rd=4
	endif
	larg=n_sol_rd
    endif
    tb_set = 0
    if n_elements(tb)ne 0 then begin
        if tb ne 0 and tb ne 1 then begin
            print,' TB must be equal to 0 or 1'
	    print,' Calculations are made with TB=0'
            tb=0
        endif
        tb_set = tb
    endif
;
    tag_n = tag_names(tab_image)
    ipol=0
    if tag_n(n_elements(tag_n)-1) eq 'STOKESV' then ipol=1

    if ipol eq 0 then begin
        image_helio = { time:0L, nscan:0L, freq:0.0, $
                             stokesi:fltarr(np,np)}
    end else begin
        image_helio = { time:0L, nscan:0L, freq:0.0, $
                             stokesi:fltarr(np,np), $
                             stokesv:fltarr(np,np)}
    endelse
    tab_image_helio = replicate(image_helio, nbscan)
; init de malax
    hmer= fltarr(3)
    hmer(0:2)= float(entFi.mer(0:2))
    hmer(2)=hmer(2)+float(entFi.mer(3))/100.
    dec= fltarr(3)
    dec(0:2)= float(entFi.dec(0:2))
    dec(2)=dec(2)+float(entFi.dec(3))/100.
    sref=string(entFi.ref)
    init_malax, entFi.dat, hmer, dec, sref
; 
; boucle de calcul des images
    n_scan = 0L
    tab_image_helio.freq=tab_image.freq
    tab_image_helio.time=tab_image.time
    tab_image_helio.nscan=tab_image.nscan
    for i=0,nbscan-1 do begin
        time=tab_image(i).time
        sec= time/1000
        heur=sec/3600
        minu=sec/60-heur*60
        seco=sec-(heur*3600+minu*60)
        ms=time-3600000*heur-60000*minu-seco*1000
        heure=intarr(4)
        heure(0)=heur & heure(1)=minu & heure(2)=seco & heure(3)=ms/10

;     Calcul de la maille elementaire interferometrique et de son angle solide.
	RH_MAILLE_3,  npi,     freq,   heure, $		; entree
		      maille,  domega	    		; sortie
	    ; entree: npi	nbre de pts sur l'image interferometrique.
	    ;	      frequence (MHz),
	    ;	      heure (h, m, s, c).
	    ;	      common MALAX, contenant entre autres new (defini par ie0,
	    ;			     ie1, ie2) et nns (toujours 64).
	    ; sortie: maille = [x0, y0, x1, y1, x2, y2] contient les coord 
	    ;		   heliographiques en RS des points M0 (r=0, s=0), 
	    ;		   M1 (r=1, s=0), M2 (r=0, s=1) definissant la maille 
	    ;		   interferometrique MI.
	    ;		 Un pavage de npi*npi  MI  recouvre le champ de l'image
	    ;		   interferometrique calculee par fft en EW et NS. Ce
	    ;		   champ peut etre double du champ interferometrique
	    ;		   stricto sensu si ie0_ew = ie0_ns = 0.
	    ;		 Rappel : npi est fige egal a 128 dans DPATCHFITS 
	    ;		          depuis jul 01.
	    ;	      domega, angle solide sous-tendu par la maille (sterad).


;     Calcul de la grille des coordonnees interferometriques correspondant a
	    ; une grille heliographique carree et calcul du drapeau de limita-
	    ; tion du champ "champ" dans le calcul de l'image.
        n_period = 1
	RH_GRILLE,  npi,  np,  maille,  n_period,  larg,   freq, $ ; entree. 
		    rg,   sg,  champ				   ; sortie.
	    ; larg est la largeur totale (Rs) du champ couvert par la grille 
	    ;   heliographique a mailles carrees (dans laquelle le soleil est 
	    ;   rond). A ne pas confondre avec la largeur du champ interfero-
	    ;   metrique.
	    ; rg et sg sont fltarr(np, np) contenant les coord interferome-
	    ;   triques non entieres correspondant aux noeuds de la grille 
	    ;   des coordonnees heliographiques `a maille carree sur laquelle 
	    ;   on calcule l'image du soleil.
	    ; Rappel: 
	    ;   Les indices interferometriques r et s varient sur [0, npi] sur
	    ;     un champ interferometrique. Si une image periodisee ils 
	    ;     varient sur [0,  n_period*npi].   
	    ;   rg et sg peuvent varier sur un domaine plus etroit ou plus 
	    ;      large selon que le champ "larg" choisi par l'utilisateur
	    ;	   est plus petit ou plus grand que le champ interferometrique
	    ;	   eventuellement periodise.
	    ; champ est un intarr(np, np), comme rg et sg, et qui vaut zero la
	    ;     ou rg et sg correspondent a des points exterieurs au champ 
	    ;     interferometrique eventuellement periodise.
	    ;   Avant le 8 sept 99 "champ" valait aussi zero pour r < rmax du 
	    ;	  centre solaire (rmax defini dans RH_GRILLE). C'est une de-
	    ;	  louiserie abandonnee.

; CALCUL DE L'IMAGE HELIOGRAPHIQUE FINALE (soleil rond) par:
	; interpolation de l'image interferometrique,

	im_2d     = interpolate (tab_image(i).stokesi    ,  rg,  sg,  miss=0)

; NORMALISATION DE L'IMAGE HELIOGRAPHIQUE :
	; - pour une image en unites de flux, le flux (en sfu) sera la 
	;     somme des points de l'image.
        ; - pour une image en temperature de brillance l'image sera en Kelvins.
;    t_b = 1           ; unites de flux. Flux en sfu.
;    t_b = 2           ; unites temperarture de brillance. Flux en
;    Kelvins.
        t_b = tb_set+1
        RH_NORM_IM,  larg,  np,  domega,  freq,  t_b, $	; entree
	      anorm					; sortie
	; Rappel: - domega angle solide sous-tendu par la maille interfero,
	;	     calcule par RH_MAILLE_3.
	;	  - np et larg servent a calculer l'angle solide de la maille 
	;		heliographique.
	; Le commentaire justifiant le calcul de anorm est en fin de 
	;   RH_NORM_IM.
        tab_image_helio(i).stokesi = anorm * im_2d
; FIN DE NORMALISATION
        if ipol eq 1 then begin
            im_2d_p   = interpolate (tab_image(i).stokesv  ,  rg,  sg,  miss=0)
            tab_image_helio(i).stokesv = anorm * im_2d_p
        endif
    endfor
  RETURN

END

