Blame view

src/idl/dustem_fit_intensity_mbb_example.pro 9.67 KB
ce9a64c1   Jean-Philippe Bernard   first commit
1
PRO dustem_fit_intensity_mbb_example,model=model $
3355c5a8   Jean-Philippe Bernard   modified for chai...
2
3
4
                                    ,sed_file=sed_file $
                                    ,Nitermax=Nitermax $
                                    ,postscript=postscript $
6735604d   Annie Hughes   making FITS read ...
5
                                    ,fits_save=fits_save $
e431104b   Annie Hughes   general updates f...
6
                                    ,noobj=noobj $
3355c5a8   Jean-Philippe Bernard   modified for chai...
7
8
9
                                    ,help=help $
                                    ,wait=wait $
                                    ,verbose=verbose
ce9a64c1   Jean-Philippe Bernard   first commit
10
11
12
13
14
15
16

;+
; NAME:
;    dustem_fit_intensity_mbb_example  
;
; PURPOSE:
; This routine is an example of how to fit an observational SED
b71e81d2   Annie Hughes   Tidied up for use...
17
; (StokesI only) with DustEM and DustEMWrap.
ce9a64c1   Jean-Philippe Bernard   first commit
18
19
20
21
;  
; For this example, the code uses the SED in the file example_SED_1.xcat,
; which is distributed in the Data/EXAMPLE_OBSDATA/ directory 
;
b71e81d2   Annie Hughes   Tidied up for use...
22
23
24
25
; In addition, this example uses the plugin dustem_plugin_mbbdy.pro to
; fit the FIR part of the spectrum using a modified black-body rather
; than a physical ISM dust model for the big grain population.
;  
ce9a64c1   Jean-Philippe Bernard   first commit
26
27
28
29
30
31
32
33
34
35
; The example SED has Stokes I photometric data points from
; IRAC, MIPS and IRAS. Examples illustrating running DustEMWrap to
; fit spectral data, polarisation data and extinction data
; are provided in other _example routines in the src/idl/
; directory. See the DustEMWrap User Guide for more information.
;
; CATEGORY:
;    DustEMWrap, Distributed, High-Level, User Example
;
; CALLING SEQUENCE:
6735604d   Annie Hughes   making FITS read ...
36
;    dustem_fit_intensity_mbb_example[,model=][sed_file=][,postscript=][,Nitermax=][,fits_save=][,/help,/wait,/verbose]
ce9a64c1   Jean-Philippe Bernard   first commit
37
38
39
40
41
42
43
44
45
46
47
48
49
50
;
; INPUTS:
;    None
;
; OPTIONAL INPUT PARAMETERS:
;    None
;
; OUTPUTS:
;    None
;
; OPTIONAL OUTPUT PARAMETERS:
;    Plots, results structure in binary FITS table format
;
; ACCEPTED KEY-WORDS:
6735604d   Annie Hughes   making FITS read ...
51
52
53
;    model = specifies the interstellar dust mixture used by
;            DustEM. See userguide or dustem_test_model_exists.pro
;            for more details about available models in current release.
ce9a64c1   Jean-Philippe Bernard   first commit
54
55
56
;    sed_file = string naming the path to text file in .xcat format that
;          describes the observational SED. If not set, the file
;          'Data/EXAMPLE_OBSDATA/example_SED_1.xcat' is used.  
e431104b   Annie Hughes   general updates f...
57
;    postscript = if set, final plot is saved as postscript 
ce9a64c1   Jean-Philippe Bernard   first commit
58
;    Nitermax = maximum number of fit iterations. Default is 5.
6735604d   Annie Hughes   making FITS read ...
59
60
;    fits_save = if set, save the fit results in a binary
;               FITS file. 
ce9a64c1   Jean-Philippe Bernard   first commit
61
62
63
64
;    help      = if set, print this help
;    wait      = if set, wait this many seconds between each step of
;                the code (for illustration purposes)
;    verbose      = if set, subroutines will run in verbose mode
e431104b   Annie Hughes   general updates f...
65
;    noobj     = if set, runs with no object graphics
ce9a64c1   Jean-Philippe Bernard   first commit
66
67
68
69
70
71
72
73
74
75
76
77
;
; COMMON BLOCKS:
;    None
;
; SIDE EFFECTS:
;    None
;
; RESTRICTIONS:
;    The DustEM fortran code must be installed
;    The DustEMWrap IDL code must be installed
;
; PROCEDURES AND SUBROUTINES USED:
19bec14b   Annie Hughes   removed stop
78
;    
ce9a64c1   Jean-Philippe Bernard   first commit
79
80
81
;
; EXAMPLES
;    dustem_fit_intensity_mbb_example
6735604d   Annie Hughes   making FITS read ...
82
;    dustem_fit_intensity_mbb_example,Nitermax=1,fits_save='/tmp/mysavefile.fits'
ce9a64c1   Jean-Philippe Bernard   first commit
83
84
85
;    dustem_fit_intensity_mbb_example,model='DBP90'
;
; MODIFICATION HISTORY:
97d6b02a   Annie Hughes   changed llims to ...
86
;    Written by AH Apr-2022
ce9a64c1   Jean-Philippe Bernard   first commit
87
88
89
90
91
92
93
94
95
96
97
98
;    Evolution details on the DustEMWrap gitlab.
;    See http://dustemwrap.irap.omp.eu/ for FAQ and help.  
;-

IF keyword_set(help) THEN BEGIN
  doc_library,'dustem_fit_intensity_mbb_example'
  goto,the_end
END

IF keyword_set(model) THEN BEGIN
  use_model=strupcase(model)
ENDIF ELSE BEGIN
97d6b02a   Annie Hughes   changed llims to ...
99
  use_model='MC10'    ;Default is the MC10 model
ce9a64c1   Jean-Philippe Bernard   first commit
100
ENDELSE
6735604d   Annie Hughes   making FITS read ...
101
102
103
exists=dustem_test_model_exists(use_model)
if exists ne 1 then $
   message,'Unknown dust model'
ce9a64c1   Jean-Philippe Bernard   first commit
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124

use_polarization=0   ; initialize Dustemwrap in no polarization mode 
use_window=2          ; default graphics window number to use for plotting the results
use_verbose=0
if keyword_set(verbose) then use_verbose=1
use_Nitermax=5        ; maximum number of iterations for the fit
IF keyword_set(Nitermax) THEN use_Nitermax=Nitermax

dustem_define_la_common

;=== Set the (model-dependent) parameters that you want to fit (pd),
;=== their initial values (iv)
;=== and whether they are bounded (ulimed,llimed,llims,ulims).
;=== Fixed parameters (fpd) and their values (fiv) are also set here.
;=== Refer to the DustEM and DustEMWrap User guides for an explanation
;=== of the physical meaning of dust model and plug-in parameters, and
;=== how to specify them.

;=== Examples are provided for some of the dust models. 
;=== To try them, uncomment the model that you want to try and re-run

97d6b02a   Annie Hughes   changed llims to ...
125
;=== AN EXAMPLE FOR MC10
b71e81d2   Annie Hughes   Tidied up for use...
126
;=== Here we fit the
ce9a64c1   Jean-Philippe Bernard   first commit
127
;=== intensity of the dust-heating radiation field as well as several plug-ins:
b71e81d2   Annie Hughes   Tidied up for use...
128
129
;=== (i) a modified black body  (initial values correspond to a
;          blackbody peaking in the far-infrared)
ce9a64c1   Jean-Philippe Bernard   first commit
130
;=== The free parameters are all lower-bounded at zero.
b71e81d2   Annie Hughes   Tidied up for use...
131
132
133
134
;=== We invoke the MC10 dust model, and fit the abundances of the PAH components. The BG 
;=== components are fixed to ~zero since we want to fit this part of the
;=== observed SED by a MBB.
;use_model='MC10' ; you should specify this when you run the routine!
ce9a64c1   Jean-Philippe Bernard   first commit
135
136
137

pd = [ $
     '(*!dustem_params).G0', $                           ;G0
b71e81d2   Annie Hughes   Tidied up for use...
138
139
     '(*!dustem_params).grains(0).mdust_o_mh',$          ;PAH0 mass fraction
     '(*!dustem_params).grains(1).mdust_o_mh',$          ;PAH1 mass fraction
ce9a64c1   Jean-Philippe Bernard   first commit
140
141
     'dustem_plugin_mbbdy_1', $                          ;Amplitude of mBB
     'dustem_plugin_mbbdy_2', $                          ;T of mBB
b71e81d2   Annie Hughes   Tidied up for use...
142
143
144
145
     'dustem_plugin_mbbdy_3']                            ;Emissivity index of mBB

iv =   [1.8, 7.8e-4, 7.8e-4, 4.e-5, 22., 1.8]

ce9a64c1   Jean-Philippe Bernard   first commit
146
147
148
Npar=n_elements(pd)
ulimed=replicate(0,Npar)
llimed=replicate(1,Npar) 
97d6b02a   Annie Hughes   changed llims to ...
149
llims=replicate(1.e-15,Npar)
ce9a64c1   Jean-Philippe Bernard   first commit
150

ce9a64c1   Jean-Philippe Bernard   first commit
151
152

fpd = [ $
b71e81d2   Annie Hughes   Tidied up for use...
153
154
155
156
     '(*!dustem_params).grains(2).mdust_o_mh',$          ;amCBEx
     '(*!dustem_params).grains(3).mdust_o_mh',$          ;amCBEx
     '(*!dustem_params).grains(4).mdust_o_mh']           ;aSilx

c0a8c00d   Annie Hughes   better help
157
fiv =   [1.e-12,1.e-12,1.e-12]
ce9a64c1   Jean-Philippe Bernard   first commit
158
159
160
161
162
163
164

if keyword_set(wait) then begin
   message,'Finished setting dust model and plug-in parameters: '+use_model,/info
   wait,wait
end

;== INITIALISE DUSTEM
a84e0595   Jean-Philippe Bernard   modified plugin s...
165
dustem_init,model=use_model,polarization=use_polarization,/show_plots
ce9a64c1   Jean-Philippe Bernard   first commit
166
167
!dustem_nocatch=1
!dustem_verbose=use_verbose
e431104b   Annie Hughes   general updates f...
168
IF keyword_set(noobj) THEN !dustem_noobj=1
ce9a64c1   Jean-Philippe Bernard   first commit
169
170
171
172


;=== READ EXAMPLE SED DATA
dir=!dustem_wrap_soft_dir+'/Data/EXAMPLE_OBSDATA/'
b71e81d2   Annie Hughes   Tidied up for use...
173
file=dir+'example_SED_4.xcat'
ce9a64c1   Jean-Philippe Bernard   first commit
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
IF keyword_set(sed_file) THEN file=sed_file
sed=read_xcat(file,/silent)

if keyword_set(wait) then begin
   message,'Finished reading SED data: '+file,/info
   wait,wait
end

;;=== ADJUST THE UNCERTAINTIES (FOR ILLUSTRATION)
ind=where(sed.sigmaII LT (0.2*sed.StokesI)^2,count)
IF count NE 0 THEN sed[ind].sigmaII=(0.2*sed[ind].StokesI)^2

;== SET THE OBSERVATIONAL STRUCTURE
;== sed is passed twice -- the first occurrence is the SED that you
;== wish to fit, the second occurrence is the SED that you wish to visualise. 
88872c38   Ilyes Choubani   small update. Cha...
189
dustem_set_data,m_fit=sed,m_show=sed
ce9a64c1   Jean-Philippe Bernard   first commit
190
191

;== SET INITIAL VALUES AND LIMITS OF THE PARAMETERS THAT WILL BE
b71e81d2   Annie Hughes   Tidied up for use...
192
193
194
dustem_init_params,use_model,pd,iv,fpd=fpd,fiv=fiv $
                   ,ulimed=ulimed,llimed=llimed,ulims=ulims,llims=llims $
                   ,polarization=use_polarization
ce9a64c1   Jean-Philippe Bernard   first commit
195
196
197
198
199
200
201
202
203
204
205
206

if keyword_set(wait) then begin
   message,'Finished initializing DustEMWrap, including plugins and fixed parameters',/info
   wait,wait
end

;=== INFORMATION TO RUN THE FIT
tol=1.e-16     ;fit tolerence

;=== INFORMATION TO MAKE THE PLOT
yr=[1.00e-4,1.00E2] ; y-axis limits
xr=[1.00E0,6.00e4] ; x-axis limits
b71e81d2   Annie Hughes   Tidied up for use...
207
tit='MBB FIT EXAMPLE' ; plot title
ce9a64c1   Jean-Philippe Bernard   first commit
208
209
ytit=textoidl('I_\nu (MJy/sr) for N_H=10^{20} H/cm^2') ; y-axis title
xtit=textoidl('\lambda (\mum)') ; x-axis title
ce9a64c1   Jean-Philippe Bernard   first commit
210
211
212
213
214
215

;===  RUN THE FIT
t1=systime(0,/sec)
res=dustem_mpfit_data(tol=tol,Nitermax=use_Nitermax,gtol=gtol $
                      ,/xlog,/ylog,xr=xr,yr=yr,xtit=xtit,ytit=ytit,title=tit $
                      ,legend_xpos=legend_xpos,legend_ypos=legend_ypos $
dc84fd94   Ilyes Choubani   Small corrections...
216
                      ,errors=errors,chi2=chi2,rchi2=rchi2,show_plot=show_plot)
ce9a64c1   Jean-Philippe Bernard   first commit
217
218
t2=systime(0,/sec)

134c5e51   Jean-Philippe Bernard   modfied to be abl...
219
IF keyword_set(wait) THEN BEGIN
ce9a64c1   Jean-Philippe Bernard   first commit
220
221
222
   message,'Finished running DustEMWrap, using Niters: '+strtrim(string(use_Nitermax),2),/info
   message,'Time taken [sec]: '+sigfig(t2-t1,2,/sci),/info
   wait,wait
134c5e51   Jean-Philippe Bernard   modfied to be abl...
223
ENDIF
ce9a64c1   Jean-Philippe Bernard   first commit
224
225
226

;=== MAKE THE FINAL PLOT
IF keyword_set(postscript) THEN BEGIN
3355c5a8   Jean-Philippe Bernard   modified for chai...
227
    ;dir_ps='./'
e431104b   Annie Hughes   general updates f...
228
    mydevice=!d.name
ce9a64c1   Jean-Philippe Bernard   first commit
229
    set_plot,'PS'
3355c5a8   Jean-Philippe Bernard   modified for chai...
230
231
    ;ps_file=dir_ps+postscript
    ps_file=postscript
ce9a64c1   Jean-Philippe Bernard   first commit
232
    device,filename=ps_file,/color
e431104b   Annie Hughes   general updates f...
233
234
 ENDIF

134c5e51   Jean-Philippe Bernard   modfied to be abl...
235
IF !dustem_noobj THEN BEGIN 
83c68818   Jean-Philippe Bernard   corrected plot ke...
236
  dustemwrap_plot_noobj,*(*!dustem_fit).CURRENT_PARAM_VALUES,st=dummy,xr=xr,/xstyle,yr=yr,/ysty,/ylog,/xlog,title=tit+' (Final fit)'
134c5e51   Jean-Philippe Bernard   modfied to be abl...
237
ENDIF ELSE BEGIN
83c68818   Jean-Philippe Bernard   corrected plot ke...
238
  dustemwrap_plot,*(*!dustem_fit).CURRENT_PARAM_VALUES,st=dummy,xr=xr,/xstyle,yr=yr,/ysty,/ylog,/xlog,title=tit+' (Final fit)'
134c5e51   Jean-Philippe Bernard   modfied to be abl...
239
240
ENDELSE

ce9a64c1   Jean-Philippe Bernard   first commit
241
IF keyword_set(postscript) THEN BEGIN
3355c5a8   Jean-Philippe Bernard   modified for chai...
242
  set_plot,'X'
e431104b   Annie Hughes   general updates f...
243
  set_plot,mydevice
ce9a64c1   Jean-Philippe Bernard   first commit
244
245
246
  message,'Wrote '+ps_file,/info
ENDIF

134c5e51   Jean-Philippe Bernard   modfied to be abl...
247
IF keyword_set(wait) THEN BEGIN
ce9a64c1   Jean-Philippe Bernard   first commit
248
249
   message,'Made the plot of the final results',/info
   wait,wait
134c5e51   Jean-Philippe Bernard   modfied to be abl...
250
ENDIF
ce9a64c1   Jean-Philippe Bernard   first commit
251

6735604d   Annie Hughes   making FITS read ...
252
253
254
IF keyword_set(fits_save) THEN BEGIN
   message,'Writing out results structure: '+fits_save,/info
   dustem_write_fits_table,filename=fits_save,help=help
ce9a64c1   Jean-Philippe Bernard   first commit
255
256
;=== At this point, you could erase all dustem system variables, or exit idl... all the
;=== information needed to recover the results and remake the plots has been saved in the FITS table
6735604d   Annie Hughes   making FITS read ...
257
258
259
260
261
262
263
264
265
266

;;=== Moved following to the dustem_fitsio_example
   ;; dustem_read_fits_table,filename=fits_save,dustem_st=dustem_spectra_st
  ;; ;==== plot result taken from the saved fits table
  ;; res=*(*!dustem_fit).CURRENT_PARAM_VALUES
  ;; IF !dustem_noobj THEN BEGIN 
  ;;   dustemwrap_plot_noobj,res,st=dustem_spectra_st,xr=xr,/xstyle,yr=yr,/ysty,/ylog,/xlog,title=tit+' (From Saved FITS file)'
  ;; ENDIF ELSE BEGIN
  ;;   dustemwrap_plot,res,st=dustem_spectra_st,xr=xr,/xstyle,yr=yr,/ysty,/ylog,/xlog,title=tit+' (From Saved FITS file)'
  ;; ENDELSE
134c5e51   Jean-Philippe Bernard   modfied to be abl...
267
  IF keyword_set(wait) THEN BEGIN
6735604d   Annie Hughes   making FITS read ...
268
     message,'Saved the results as FITS in the file: '+fits_save,/info
ce9a64c1   Jean-Philippe Bernard   first commit
269
     wait,wait
134c5e51   Jean-Philippe Bernard   modfied to be abl...
270
  ENDIF
ce9a64c1   Jean-Philippe Bernard   first commit
271
272
ENDIF

ce9a64c1   Jean-Philippe Bernard   first commit
273
the_end:
6735604d   Annie Hughes   making FITS read ...
274
message,'Finished dustem_fit_intensity_mbb_example',/info
ce9a64c1   Jean-Philippe Bernard   first commit
275
276

END