dustem_fit_sed_readme.pro 11.9 KB
PRO dustem_fit_sed_readme,postcript=postcript,mode=mode,help=help

;This Readme describes how to fit SEDs with dustem
;It runs on the SED stored into the file sample_SED.xcat
;in this directory. Remember that the goal here is not necessarily to
;obtain a good fit in the end, but to illustrate the method.
;The provided SED has only photometric data points from SPITZER
;IRAC and MIPS and IRAS. No spectrum data points.
;SPECTRUM data points can be included and the corresponding filter
;filed must read SPECTRUM. Note that its is note necessary
;to use the .xcat file format, and data SED can be provided
;manually, but the observation structure must have the structure shown below.
;Obviously, the dustem package must have been installed succesfully (see
;dustem_cvs_readme.txt for install instructions).

;+
; NAME:
;    dustem_fit_sed_readme
; PURPOSE:
;    This is an example of how to fit SEDs with the dustem wrapper.
;    It is meant to be an example to follow when writing your own
;    programs using the dustem IDL wrapper.
;    It is not meant to reproduce the result in Compiegne et al 2010
;    The SED used here is in sample_SED.xcat
; CATEGORY:
;    Dustem
; CALLING SEQUENCE:
;    dustem_fit_sed_readme,postcript=postcript,mode=mode,help=help
; INPUTS:
;    None
; OPTIONAL INPUT PARAMETERS:
;    None
; OUTPUTS:
;    None
; OPTIONAL OUTPUT PARAMETERS:
;    None
; ACCEPTED KEY-WORDS:
;    mode = Selects one of the dust mixture used by dustem
;           'COMPIEGNE_ETAL2010' from Compiegne et al 2010 (default)
;           'DBP90' from Desert et al 1990
;           'DL01' from Draine & Li 2001
;           'DL07' from Draine & Li 2007
;    postcript = if set plot is done in DUSTEM/Docs/Figures/Last_dustem_fit.ps
;    help      = If set print this help
; COMMON BLOCKS:
;    None
; SIDE EFFECTS:
;    None
; RESTRICTIONS:
;    The dustem fortran code must be installed
;    The dustem idl wrapper must be installed
; PROCEDURE:
;    None
; EXAMPLES
;    dustem_fit_sed_readme,mode='COMPIEGNE_ETAL2010'
; MODIFICATION HISTORY:
;    Written by J.P. Bernard April 1st 2011
;    see evolution details on the dustem cvs maintained at CESR
;    Contact J.-Ph. Bernard (Jean-Philippe.Bernard@cesr.fr) in case of problems.
;-

IF keyword_set(help) THEN BEGIN
  doc_library,'dustem_fit_sed_readme'
  goto,the_end
ENDIF

IF keyword_set(mode) THEN BEGIN
  use_mode=strupcase(mode)
ENDIF ELSE BEGIN
  use_mode='COMPIEGNE_ETAL2010'    ;Default is last dustem model
ENDELSE

;dbp=1
;=== initialise dustem
;dustem_init,/wrap
;dustem_init
dustem_init,mode=use_mode
!dustem_verbose=1
!dustem_show_plot=1

;=== Read sample SED
;;dir=getenv('DUSTEM_SOFT_DIR')+'/src/'
;dir=!dustem_wrap_soft_dir+'/Data/SEDs/'
;file=dir+'sample_SED.xcat'
;spec=read_xcat(file,/silent)
;=== Composite SED from Compiegne et al 2010, gathered by C. Bot
;dir=getenv('DUSTEM_SOFT_DIR')+'/src/dustem3.8_web/SEDs/'
dir=!dustem_wrap_soft_dir+'/Data/SEDs/'
file=dir+'Gal_composite_spectrum.xcat'
;file=dir+'Gal_composite_spectrum_wAKARI.xcat'
;stop
spec=read_xcat(file,/silent)
ind=where(spec.error EQ 0.,count)
IF count NE 0 THEN spec(ind).error=0.2*spec(ind).spec
ind=where(spec.instru EQ 'FIRAS',count)
IF count NE 0 THEN spec(ind).error=0.2*spec(ind).spec
;=== Draine Model SED for U=1. by C. Bot
;;dir=getenv('DUSTEM_SOFT_DIR')+'/src/dustem3.8_web/SEDs/'
;dir=!dustem_wrap_soft_dir+'/Data/SEDs/'
;file=dir+'SED_DraineModel_U1.0.xcat'
;spec=read_xcat(file,/silent)
;=== Fake SED made from Dustem outputs
;spec=dustem_compute_sed(p_dim,st=st,cont=cont,_extra=extra)

;=== Set which parameters you want to fit
;CASE getenv('DUSTEM_WHICH') OF
CASE !dustem_which OF
  'WEB3p8':BEGIN
;=== This is to use Desert model
;=== must have done dustem_init,/DBP90
    CASE use_mode OF
      'DBP90':BEGIN
         pd = [ $
             '(*!dustem_params).G0', $      ;G0
             '(*!dustem_params).grains(0).mdust_o_mh',$  ;PAH0 mass fraction
             '(*!dustem_params).grains(1).mdust_o_mh',$     ;PAH1 mass fraction
             '(*!dustem_params).grains(2).mdust_o_mh', $    ;amCBEx
             'dustem_create_continuum_2']                ;Intensity of NIR continuum
        iv =   [1.0, 4.3e-4, 4.7e-4,6.4e-3,0.001]
;        iv =   [4.3e-4, 4.7e-4,6.4e-3,0.001]
        Npar=n_elements(pd)
        ulimed=replicate(0,Npar)
        llimed=replicate(1,Npar)
        llims=replicate(0.,Npar)
        ;=== Fixed parameters
;        fpd=['(*!dustem_params).G0'] ;Fixed parameter description
;        fiv=[1.5]
;        dustem_init_fixed_params,fpd,fiv
     END
      'DL01':BEGIN
         pd = [ $
             '(*!dustem_params).G0', $      ;G0
             '(*!dustem_params).grains(0).mdust_o_mh',$  ;PAH0 mass fraction
             '(*!dustem_params).grains(1).mdust_o_mh',$     ;PAH1 mass fraction
             '(*!dustem_params).grains(2).mdust_o_mh', $    ;Gra
             '(*!dustem_params).grains(3).mdust_o_mh', $    ;Gra
             '(*!dustem_params).grains(4).mdust_o_mh', $    ;aSil
             'dustem_create_continuum_2']                ;Intensity of NIR continuum
        iv =   [1.0,5.4e-4, 5.4e-4,1.8e-4,2.33e-3,8.27e-3,0.001]
;        iv =   [5.4e-4, 5.4e-4,1.8e-4,2.33e-3,8.27e-3,0.001]
        Npar=n_elements(pd)
        ulimed=replicate(0,Npar)
        llimed=replicate(1,Npar)
        llims=replicate(0.,Npar)
        ;=== Fixed parameters
;        fpd=['(*!dustem_params).G0'] ;Fixed parameter description
;        fiv=[1.0]
;        dustem_init_fixed_params,fpd,fiv
      END
      'DL07':BEGIN
         pd = [ $
             '(*!dustem_params).G0', $      ;G0
             '(*!dustem_params).grains(0).mdust_o_mh',$  ;PAH0 mass fraction
             '(*!dustem_params).grains(1).mdust_o_mh',$     ;PAH1 mass fraction
             '(*!dustem_params).grains(2).mdust_o_mh', $    ;Gra
             '(*!dustem_params).grains(3).mdust_o_mh', $    ;Gra
             '(*!dustem_params).grains(4).mdust_o_mh', $    ;aSil
             'dustem_create_continuum_2']                ;Intensity of NIR continuum
        iv =   [1.0,5.4e-4, 5.4e-4,1.8e-4,2.33e-3,8.27e-3,0.001]
;        iv =   [5.4e-4, 5.4e-4,1.8e-4,2.33e-3,8.27e-3,0.001]
        Npar=n_elements(pd)
        ulimed=replicate(0,Npar)
        llimed=replicate(1,Npar)
        llims=replicate(0.,Npar)
        ;=== Fixed parameters
;        fpd=['(*!dustem_params).G0'] ;Fixed parameter description
;        fiv=[1.0]
;        dustem_init_fixed_params,fpd,fiv
      END
      'COMPIEGNE_ETAL2010':BEGIN
;     PUTTING G0 last DOES NOT WORK BECAUSE OF ORDER ISSUE
        pd = [ $
             '(*!dustem_params).G0', $      ;G0
             '(*!dustem_params).grains(1).mdust_o_mh',$     ;PAH1 mass fraction
             '(*!dustem_params).grains(0).mdust_o_mh',$  ;PAH0 mass fraction
             '(*!dustem_params).grains(2).mdust_o_mh', $    ;amCBEx
             '(*!dustem_params).grains(3).mdust_o_mh', $    ;amCBEx
             '(*!dustem_params).grains(4).mdust_o_mh', $      ;aSil
             'dustem_create_continuum_2']                ;Intensity of NIR continuum
        iv =   [1.0, 7.8e-4, 7.8e-4,1.65e-4,1.45e-3,7.8e-3,0.001]
;        iv =   [7.8e-4, 7.7e-4,1.65e-4,1.45e-3,7.8e-3,0.001]
        Npar=n_elements(pd)
        ulimed=replicate(0,Npar)
        llimed=replicate(1,Npar)
        llims=replicate(0.,Npar)
        ;=== Fixed parameters
;        fpd=['(*!dustem_params).G0'] ;Fixed parameter description
;        fiv=[1.0]
;        dustem_init_fixed_params,fpd,fiv
      END
    ENDCASE
  END
  ELSE: BEGIN
     pd = ['(*!dustem_params).grains(0).propmass',$  ;PAH mass fraction
        '(*!dustem_params).grains(1).propmass',$  ;VSG mass fraction
        '(*!dustem_params).grains(2).propmass',$  ;BG mass fraction
        'dustem_create_continuum_2', $            ;Intensity of NIR continuum
        'dustem_create_isrf_1']                   ;ISRF scaling factor
    ;=== set initial value of parameters you want to fit
    iv =   [7e-5, 8e-4,6.6e-3,0.001,4.]
    ;in this example, we enforce parameters to be >0 and Xisrf >3
    ;Caution, initial values must be within limits ...
    Npar=n_elements(pd)
    ulimed=replicate(0,Npar)
    llimed=replicate(1,Npar)
    llims=replicate(0.,Npar)
  END
ENDCASE


;=== SET THE OBSERVATION STRUCTURE

st=dustem_set_data(sed=spec)

;VG : dustem_set_data turned into a function to be used indifferently for sed, ext, polext
;dustem_set_data,spec
;defsysv, '!dustem_data', {sed:ptr_new()}    ;Data to fit

;== SET THE FITTED PARAMETERS
dustem_init_parinfo,pd,iv,up_limited=ulimed,lo_limited=llimed,up_limits=ulims,lo_limits=llims
;stop
;dustem_sort_params
;hprint,*(*!dustem_fit).param_descs
;hprint,*(*!dustem_fit).param_init_values
;hprint,*(*!dustem_fit).param_func
;=== RUN fit
tol=1.e-14
;tol=1.e-2
;Nitermax=20               ;maximum number of iteration. This is the criterium which will stop the fit procedure
Nitermax=2               ;maximum number of iteration. This is the criterium which will stop the fit procedure

loadct,13
!y.range=[1e-4,10]              ;This is to ajust plot range from outside the routine
t1=systime(0,/sec)
res=dustem_mpfit_data(tol=tol,Nitermax=Nitermax,gtol=gtol)
;res=dustem_mpfit_sed(tol=tol,Nitermax=Nitermax) ;,func_name=func_name,cf_min=cf_min)
t2=systime(0,/sec)

;=== With FXD Model
;Final parameters :    0.00012425071   0.00022732277    0.0021897348   0.00047272697       4.4916225
;Iter      6   CHI-SQUARE =       76.345245          DOF = 6
;=== With MC Model
;Final parameters :    0.00012292305   0.00020672300    0.0020245400   0.00076911024       4.9751991
;Iter      6   CHI-SQUARE =       76.047516          DOF = 6
;=== With LV Model
;Final parameters :    0.00013302325    0.0010706767    0.0039392709   0.00074149811       4.7549752
;Iter     10   CHI-SQUARE =       90.478020          DOF = 6
;=== With LV Model using GRAIN_DBP.DAT
;Iter      7   CHI-SQUARE =       117.27229          DOF = 6
;Final parameters :    0.00011163016   0.00015163894    0.0017526653   0.00096639410       5.8391213

;stop

;=== SAVE FIT RESULTS
;file_out=getenv('DUSTEM_RES')+'DUSTEM_fit_example.sav'
file_out=!dustem_res+'DUSTEM_fit_example.sav'
dustem_save_sed_fit,file_out

;=== Plot best fit
yr=[1e-4,10]
xr=[1,2000]
tit='DUSTEM Example'
ytit=textoidl('I_\nu (MJy/sr) for N_H=10^{20} H/cm^2')
xtit=textoidl('\lambda (\mum)')
errors=(*(*!dustem_fit).current_param_errors)*(*(*!dustem_fit).param_init_values)
chi2=(*!dustem_fit).chi2
rchi2=(*!dustem_fit).rchi2

loadct,13
dustem_sed_plot,(*(*!dustem_fit).current_param_values), $
                ytit=ytit,xtit=xtit,title=tit,yr=yr,xr=xr,/ysty,/xsty, $
                res=res,errors=errors,chi2=chi2,rchi2=rchi2

;stop

;======================================
;====You can exit IDL here and re-enter
;======================================
window,1

;=== RESTORE FIT RESULTS
;=== initialise dustem
dustem_init,mode=mode
;file=getenv('DUSTEM_RES')+'DUSTEM_fit_example.sav'
file=!dustem_res+'DUSTEM_fit_example.sav'
dustem_restore_sed_fit,file

;=== recover best fit values
;ind=where(*!dustem_fit_chi2 EQ min(*!dustem_fit_chi2))
;res=(*!dustem_fit_params);
res=*(*!dustem_fit).current_param_values
chi2=(*!dustem_fit).chi2
rchi2=(*!dustem_fit).rchi2
;model_sed=*!dustem_fit_sed
;errors=*!dustem_fit_params_error;
errors=*(*!dustem_fit).current_param_errors

;=== Plot best fit
yr=[1e-4,10]
xr=[1,2000]
tit='DUSTEM Example (Saved)'
ytit=textoidl('I_\nu (MJy/sr) for N_H=10^{20} H/cm^2')
xtit=textoidl('\lambda (\mum)')

loadct,13
IF keyword_set(postcript) THEN BEGIN
  set_plot,'PS'
;  ps_file=getenv('DUSTEM_SOFT_DIR')+'/Docs/Figures/'+'Last_dustem_fit.ps'
  ps_file=!dustem_wrap_soft_dir+'/Docs/Figures/'+'Last_dustem_fit.ps'
  device,filename=ps_file,/color
ENDIF
;dustem_sed_plot,(*!dustem_fit_params),ytit=ytit,xtit=xtit,title=tit,yr=yr,xr=xr,/ysty,/xsty,res=res,errors=errors,chi2=chi2,rchi2=rchi2
dustem_sed_plot,*(*!dustem_fit).current_param_values,ytit=ytit,xtit=xtit,title=tit,yr=yr,xr=xr,/ysty,/xsty,res=res,errors=errors,chi2=chi2,rchi2=rchi2
IF keyword_set(postcript) THEN BEGIN
  device,/close
  set_plot,'X'
  message,'wrote '+ps_file,/info
ENDIF

message,'dustem_mpfit_sed executed in '+strtrim(t2-t1,2)+' sec',/info

the_end:

END