; -----------------------------------------------------------------
;                     rh_malcrondclean_im_2d
;                     issu de rh_malcrond_im_2d
; -----------------------------------------------------------------
; En entree,
;	harm     = harmoniques 2D		complex(576 ou 648)
;	heur     = heure 			intarr(4)
;	freq     = frequence en Mhz	float
;	np       = taille de l'image
;	larg     = nb de rayons solaires
;       correl   = tableau entfi.corel
; KEYWORDs:
;       t_b      = 1-image en unites de flux  2-image en Kelvins
;                  par defaut t_b = 1   
; Procedures appelantes :
;   film/film2d.pro
;   image_2d/rh_im_2dsel.pro elle-meme appelee par 
;                                          - animation/cre_2m.pro
;                                          - bass2000/cre_gif1.pro
;                                          - image_2d/image_2d.pro
;   movie/cre_movie.pro
; Renvoie l'image calculee  fltarr(np,np)
; MODIFICATIONS: 
; 03 sep 08  : ajout de l'argt correl. Calcule l'image en utilisant au
; mieux tous les harmoniques y compris anti_alias a l'aide du tableau correl
; 04 juin 18 : ajout du mot cle T_B pour appel par RH_IMCUBE
; 05 juin 09 : version avec clean -ajout des argts mode_clean et ch_pol
;              pour appel de rh_clean
; -----------------------------------------------------------------

FUNCTION rh_malcrondclean_im_2d, mode_clean, ch_pol, harm_N, heur, $
                                 freq, np, larg, correl, t_b= t_b

    npi = 128            ;
    ie0_ew = 1           ; Utilisation des harm de E0 avec E2, E1, H1 a
                         ;   H16.

;     CALCUL DE L'IMAGE INTERFEROMETRIQUE
        i_stop = 0     ; 1 pour arret controle
; Choix de la methode de resolution des systemes lineaires apparaissant dans
	; la determination de parametres aux moindres carres dans fit_quadric,
	; fit_cubic, fit_quartic (eux memes appelles par malc_im_1d et 
	; malc_im_2d (contenus dans CALIB_SUB) et SOUSTRAC_BASE. 
        i_sys_lin = 2		; 1 Cramer, 2 LU, 3 SVD.
        i_pave_plein = 0        ; 0 pave lacunaire 1 pave plein
        i_recentrage = 0 & k_max=0 &  l_max=0  
        n_bord  = 10	; hauteur des bandes N et S pour ajuster base dans
			;   RH_MALC_IM_2D. Usuel 10.
;        RH_BR_MALC_IM_2D,  harm_N,  correl,   npi, image
        RH_MALC_IM_2D, $
;     entree:
	i_stop,	i_sys_lin, ch_pol, $
	i_pave_plein,  i_recentrage,  k_max,  l_max,	$
	freq,  ie0_ew,  harm_N,  correl,  npi,  n_bord,		$
;     sortie: image et lobe theorique, centre Soleil en (npi/2,npi/2).
        k_max_auto,   l_max_auto,				$
	tf_l_th,  l_th,  tf_im,  im,  			$
	flux_total,  flux_compact,  uu,  vv
		;  uu, vv	coord de freq spatiales dans le plan (u, v),
		;		  ne servent qu'a des delouiseries.
		;  tf_l_th, tf_im_2d  sont centrees en milieu de tableau.
                                ;		ajoutes pour
                                ;		compatibilite le 13 mars 03.

;     Calcul de la maille elementaire interferometrique et de son angle solide.
	RH_MAILLE_3,  npi,     freq,   heur, $		; 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.

; Arguments supplementaires de RH_CLEAN                               
                x_dom           = 0.
                y_dom           = 0.
                dr_dom          = 1.
;		x_dom, y_dom,  coord (RS, >0 ou <0) centre du domaine de clean.
;		dr_dom,	       largeur totale (RS) du doamine de clean.
                i_ech_min       = 0
                i_ech_max       = 3
                a_in            = 0.85
                a_ex            = 1.15
                a_red_fil       = 1.
                itermax         = 400
                gain_iter       = 0.3
                jmax            = 2
                crit_arret      = [1, 1, 1, 0,   0, 0, 0]
                i_seuil         = [1,  1,  1,  1,  2]
                i_test_arret    = 0
                i_stop_image    = 0
                i_ecrete        = intarr(4)
                frac_ecr        = fltarr(4)
                tete_fich       = ' '
                fac_crois_res   = 1.2
;                coeff_seuil0    = fltarr(5)
;                coeff_seuil1    = fltarr(5)
;                coeff_seuil2    = fltarr(5)
                frac_flux       = 0.001
                i_lissage       = 2
                poids_c         = 0.7
                larg_2          = [20, 30]
 
    coeff_seuil = fltarr(3, 5)          ; coeff_seuil(0, *) est inutilise.
 
            ; Idem pour mode_clean = 1 ou 2 puisqu'on nettoie partout.
            ; Le coeff usuel en fin de ligne est 0.001 . Ajuster ce coeff pour
            ;   que le nbre d'iterations soit voisin de 150 ou 200.
            ; Le 1er indice de coeff_seuil correspond a i_seuil. Usuellement on
            ;   n'utilise donc que coeff_seuil(1, 0) et coeff_seuil(2, 1:3) .
    coeff_seuil(1, *) = [  3,   30,   40,   70,  100] * 0.0010  ; val max
    coeff_seuil(2, *) = [100,  100,  200,  200,  200] * 0.0010  ; val rms

; Calcul du tableau dom_c_i des indices des points de l'image interferometrique
	;   (domaine qui sera effectivement pris en compte dans le clean et
	;   etendu a toute l'image si mode_clean=1)
	; dom_c_i  comme  "domaine C interferometrique".
	RH_CALC_DOM_C, $
	    mode_clean,  x_dom,  y_dom,  dr_dom,	     $	; entree
	    npi, maille, $					; entree
	    dom_c_i						; sortie
		; Definition de dom_c_i suivant les valeure de mode_clean :
		; . 1 (clean usuel) : totalite de l'image interferometrique
		;       (npi*npi).
		; . 2 domaine de non restitution des composantes, recherchees 
		;	sur toute l'image.
		; . 3 domaine de suppression des composantes (debarasser l'ima-
		;	d'un centre intense).
		; . 4 domaine de nettoyage (amelioration de l'image d'un centre
		;	intense.
         dom_c = dom_c_i

; Calcul du tableau dom_a_i des indices des points de l'image interferometrique
	    ;   destines a visualiser le contour de dom_c defini dans DPNEW 
	    ;   (ce contour est toujours figure sur les traces de controle de 
	    ;   RH_CALC_IMAGE_HELIO par commodite, meme si mode_clean=1 et si 
	    ;   dom_c est ensuite etendu a toute l'image)
	    ; dom_a_i  comme "domaine annulaire interferometrique".
	mode = 2
	RH_CALC_DOM_C, $
	    mode,  x_dom,  y_dom,  dr_dom + 0.02,  $	; entree
	    npi,   maille, $				; entree
	    dom_ext					; sortie
	RH_CALC_DOM_C, $
	    mode,  x_dom,  y_dom,  dr_dom - 0.02, $	; entree
	    npi,   maille, $				; entree
	    dom_int					; sortie	
	flag_e = intarr(npi, npi)
	flag_i = intarr(npi, npi)
	flag_e(dom_ext) = 1
	flag_i(dom_int) = 1
	dom_a_i = where(flag_e ne flag_i)


image = im
if (mode_clean gt 0) then begin

    i_simul_soleil = 0
    objet_simule    = 0	; au lieu de fltarr(npi, npi) pour economie.
    tf_objet_simule = 0 ; -----------------------------------------
    RH_CLEAN, 							     $
    ; entree:
       ; donnees image
	   freq, ch_pol,					     $
	   i_simul_soleil,   i_pave_plein,  			     $
	   tf_objet_simule,  objet_simule,   			     $
	   tf_im,    im,     tf_l_th,   l_th,	     		     $
       ; clean
	   mode_clean,  dom_c,       dom_a,			     $  
	   i_ech_min,   i_ech_max ,  a_in,  a_ex,		     $
	   a_red_fil,   itermax,   gain_iter,   jmax,   crit_arret,  $
	   i_seuil,  coeff_seuil,  frac_flux,  fac_crois_res,	     $
	   i_test_arret,  i_lissage,   poids_c,  larg_2,	     $
    ; sortie
           tf_lobe_synt,  lobe_synt,  image, 			     $
	   objet_simule_lisse
endif 
;stop


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

	im_2d     = interpolate (image    ,  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.
; si le keyword T_B est absent, unites de flux
if n_elements(t_b) eq 0 then t_b=1
    if (t_b  eq  2) then begin
    RH_NORM_IM,  larg,  np,  domega,  freq, $	; 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.
    im_2d     = anorm * im_2d			; image -------------
    endif
; FIN DE NORMALISATION
  RETURN, im_2d

END



