Blame view

src/idl/dustem_fit_intensity_example.pro 13.9 KB
a1839067   Jean-Philippe Bernard   First commit
1
2
3
4
5
PRO dustem_fit_intensity_example,model=model $
                                ,sed_file=sed_file $
                                ,Nitermax=Nitermax $
                                ,postscript=postscript $
                                ,fits_save_and_restore=fits_save_and_restore $
a6bd0451   Annie Hughes   made prettier for...
6
7
8
                                 ,help=help $
                                 ,wait=wait $
                                 ,verbose=verbose
a1839067   Jean-Philippe Bernard   First commit
9

a1839067   Jean-Philippe Bernard   First commit
10
11
12
;+
; NAME:
;    dustem_fit_intensity_example  
a6bd0451   Annie Hughes   made prettier for...
13
;
8561c935   Annie Hughes   minor change
14
15
16
17
; PURPOSE:
; This routine is an example of how to fit an observational SED
; (StokesI only) with DustEM and DustEMWrap. The objective is to
; illustrate how to use DustEMWrap and not to do science -- the fit
04ff3e4d   Annie Hughes   added comments an...
18
; obtained by running this example is likely to be poor.
a6bd0451   Annie Hughes   made prettier for...
19
;  
8561c935   Annie Hughes   minor change
20
21
22
23
24
25
26
27
; For this example, the code uses the SED in the file example_SED_1.xcat,
; which is distributed in the Data/EXAMPLE_OBSDATA/ directory 
;
; 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.
a6bd0451   Annie Hughes   made prettier for...
28
;
a1839067   Jean-Philippe Bernard   First commit
29
30
; CATEGORY:
;    DustEMWrap, Distributed, High-Level, User Example
8561c935   Annie Hughes   minor change
31
;
a1839067   Jean-Philippe Bernard   First commit
32
; CALLING SEQUENCE:
04ff3e4d   Annie Hughes   added comments an...
33
;    dustem_fit_intensity_example[,model=][sed_file=][,postscript=][,Nitermax=][,fits_save_and_restore=][,/help,/wait,/verbose]
8561c935   Annie Hughes   minor change
34
;
a1839067   Jean-Philippe Bernard   First commit
35
36
; INPUTS:
;    None
8561c935   Annie Hughes   minor change
37
;
a1839067   Jean-Philippe Bernard   First commit
38
39
; OPTIONAL INPUT PARAMETERS:
;    None
8561c935   Annie Hughes   minor change
40
;
a1839067   Jean-Philippe Bernard   First commit
41
42
; OUTPUTS:
;    None
8561c935   Annie Hughes   minor change
43
;
a1839067   Jean-Philippe Bernard   First commit
44
; OPTIONAL OUTPUT PARAMETERS:
a6bd0451   Annie Hughes   made prettier for...
45
;    Plots, results structure in binary FITS table format
8561c935   Annie Hughes   minor change
46
;
a1839067   Jean-Philippe Bernard   First commit
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
; ACCEPTED KEY-WORDS:
;    model = specifies the interstellar dust mixture used by DustEM
;           'MC10' model from Compiegne et al 2010 (default)
;           'DBP90' model from Desert et al 1990
;           'DL01' model from Draine & Li 2001
;           'WD01_RV5p5B' model from Weingartner & Draine 2002 with Rv=5.5
;           'DL07' model from Draine & Li 2007
;           'J13' model from Jones et al 2013, as updated in
;                 Koehler et al 2014
;           'G17_ModelA' model A from Guillet et al (2018). Includes
;                 polarisation. See Tables 2 and 3 of that paper for details.
;           'G17_ModelB' model B from Guillet et al (2018)
;           'G17_ModelC' model C from Guillet et al (2018)
;           'G17_ModelD' model A from Guillet et al (2018)
;    sed_file = string naming the path to text file in .xcat format that
;          describes the observational SED. If not set, the file
04ff3e4d   Annie Hughes   added comments an...
63
;          'Data/EXAMPLE_OBSDATA/example_SED_1.xcat' is used.  
a1839067   Jean-Philippe Bernard   First commit
64
;    postscript = if set, final plot is saved as postscript in the
a6bd0451   Annie Hughes   made prettier for...
65
;                 current working directory
a1839067   Jean-Philippe Bernard   First commit
66
;    Nitermax = maximum number of fit iterations. Default is 5.
a6bd0451   Annie Hughes   made prettier for...
67
68
69
;    fits_save_and_restore = if set, save the fit results in a binary
;               FITS file. The code then restore this file and plots
;               the results using the saved results information.
a1839067   Jean-Philippe Bernard   First commit
70
;    help      = if set, print this help
a6bd0451   Annie Hughes   made prettier for...
71
72
73
;    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
8561c935   Annie Hughes   minor change
74
;
a1839067   Jean-Philippe Bernard   First commit
75
76
; COMMON BLOCKS:
;    None
8561c935   Annie Hughes   minor change
77
;
a1839067   Jean-Philippe Bernard   First commit
78
79
; SIDE EFFECTS:
;    None
8561c935   Annie Hughes   minor change
80
;
a1839067   Jean-Philippe Bernard   First commit
81
82
83
; RESTRICTIONS:
;    The DustEM fortran code must be installed
;    The DustEMWrap IDL code must be installed
8561c935   Annie Hughes   minor change
84
;
a1839067   Jean-Philippe Bernard   First commit
85
86
; PROCEDURES AND SUBROUTINES USED:
;    *** COMMENT AH --> is this really NONE? ****
8561c935   Annie Hughes   minor change
87
;
a1839067   Jean-Philippe Bernard   First commit
88
89
90
; EXAMPLES
;    dustem_fit_intensity_example
;    dustem_fit_intensity_example,Nitermax=1,fits_save_and_restore='/tmp/mysavefile.fits'
16adf9ea   Jean-Philippe Bernard   improved
91
;    dustem_fit_intensity_example,model='DBP90'
8561c935   Annie Hughes   minor change
92
;
a1839067   Jean-Philippe Bernard   First commit
93
94
95
96
97
98
99
100
101
102
103
104
105
106
; MODIFICATION HISTORY:
;    Written by JPB Apr-2011
;    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_example'
  goto,the_end
END

IF keyword_set(model) THEN BEGIN
  use_model=strupcase(model)
ENDIF ELSE BEGIN
9f66a93f   Annie Hughes   changed philosoph...
107
  use_model='DBP90'    ;Default is the DBP90 model
a1839067   Jean-Philippe Bernard   First commit
108
109
ENDELSE

04ff3e4d   Annie Hughes   added comments an...
110
111
112
113
114
115
116
117
118
known_mdls=['MC10','DBP90','DL01','WD01_RV5P5B','DL07','J13','G17_MODELA','G17_MODELB','G17_MODELC','G17_MODELD'] 
test_model = where(known_mdls eq use_model,ct)
if ct eq 0 then begin
   message,'ISM dust model '+use_model+' unknown',/continue
   message,'Known models are MC10,DBP90,DL01,WD01_RV5P5B,DL07,J13,G17_MODELA,G17_MODELB,G17_MODELC,G17_MODELD',/continue
   stop
end


a6bd0451   Annie Hughes   made prettier for...
119
120
121
122
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
8561c935   Annie Hughes   minor change
123
124
use_Nitermax=5        ; maximum number of iterations for the fit
IF keyword_set(Nitermax) THEN use_Nitermax=Nitermax
a1839067   Jean-Philippe Bernard   First commit
125

04ff3e4d   Annie Hughes   added comments an...
126
127
128
dustem_define_la_common

;=== Set the (model-dependent) parameters that you want to fit (pd),
8561c935   Annie Hughes   minor change
129
130
;=== their initial values (iv)
;=== and whether they are bounded (ulimed,llimed,llims,ulims).
04ff3e4d   Annie Hughes   added comments an...
131
;=== Fixed parameters (fpd) and their values (fiv) are also set here.
8561c935   Annie Hughes   minor change
132
;=== Refer to the DustEM and DustEMWrap User guides for an explanation
04ff3e4d   Annie Hughes   added comments an...
133
134
135
136
137
138
;=== 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

9f66a93f   Annie Hughes   changed philosoph...
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
;=== AN EXAMPLE FOR DBP90
;=== Here we fit the dust abundances of the DBP90 model, the
;=== intensity of the dust-heating radiation field as well as several plug-ins:
;=== (i) continuum due to a blackbody  
;=== (ii) free-free emission
;=== (iii) synchrotron emission
;=== The free parameters are all lower-bounded at zero.
;use_model='DBP90' ; you should specify this !
pd = [ $
     '(*!dustem_params).G0', $                           ;G0
     '(*!dustem_params).grains(0).mdust_o_mh',$          ;PAH0 mass fraction
     '(*!dustem_params).grains(1).mdust_o_mh',$          ;VSG mass fraction
     '(*!dustem_params).grains(2).mdust_o_mh', $         ;BG mass fraction
     'dustem_plugin_continuum_1', $                      ;Temperature of BB
     'dustem_plugin_continuum_2', $                      ;Intensity of BB continuum
     'dustem_plugin_freefree_1', $                       ;Ionized gas temperature
     'dustem_plugin_freefree_2', $                       ;Free-free amplitude
     'dustem_plugin_synchrotron_1', $                    ;Spectral index of CREs
     'dustem_plugin_synchrotron_2']                      ;Synchrotron amplitude at 10 mm

iv =   [1.0, 1.2e-4, 8.7e-4, 4.4e-4, 1000.,0.001,7500.,0.004, 2.7,0.01]
Npar=n_elements(pd)
ulimed=replicate(0,Npar)
llimed=replicate(1,Npar) 
llims=replicate(0.,Npar)
fpd=[] & fiv=[]
04ff3e4d   Annie Hughes   added comments an...
165
166


9f66a93f   Annie Hughes   changed philosoph...
167
;; ;=== AN EXAMPLE FOR DL01 (or DL07 or WD01_RV5P5B)
04ff3e4d   Annie Hughes   added comments an...
168
169
170
;; ;=== Here we fit the dust abundances of the model. The
;; ;=== intensity of the dust-heating radiation field is fixed to 1.2*G0.
;; ;=== The free parameters are all lower-bounded at zero.
9f66a93f   Annie Hughes   changed philosoph...
171
;; use_model='DL01' ; you should specify this !
04ff3e4d   Annie Hughes   added comments an...
172
173
174
175
176
;; pd = [ $
;;         '(*!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
9f66a93f   Annie Hughes   changed philosoph...
177
;;         '(*!dustem_params).grains(4).mdust_o_mh']      ;aSil
04ff3e4d   Annie Hughes   added comments an...
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
;;    iv =   [5.4e-4, 5.4e-4,1.8e-4,2.33e-3,8.27e-3]
;;    Npar=n_elements(pd)
;;    ulimed=replicate(0,Npar)
;;    llimed=replicate(1,Npar)
;;    llims=replicate(0.,Npar)
;;    fpd=['(*!dustem_params).G0']
;;    fiv=[1.2]


;; ;=== AN EXAMPLE FOR MC10
;; ;=== Here we fit the dust abundances of the MC10 model, the
;; ;=== intensity of the dust-heating radiation field as well as a plug-in:
;; ;===  (i) continuum due to a blackbody 
;; ;=== The intensity of the dust-heating radiation field is fixed to
;; ;=== 1.5*G0 and the tmperature of the blackbody is fixed to 1200K
;; ;=== The free parameters in the fit are lower-bounded at zero.
9f66a93f   Annie Hughes   changed philosoph...
194
;; use_model='MC10' ; you should specify this !
04ff3e4d   Annie Hughes   added comments an...
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
   ;; pd = [ $
   ;;      '(*!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_params).grains(3).mdust_o_mh' $       ;amCBEx
   ;;      ,'(*!dustem_params).grains(4).mdust_o_mh' $       ;aSilx
   ;;      ,'dustem_plugin_continuum_2' $                    ;Intensity at peak of the continuum
   ;;      ]
   ;; iv =   [ 7.8e-4, 7.8e-4, 1.65e-4, 1.45e-3, 6.7e-3, 0.003]
   ;; Npar=n_elements(pd)
   ;; ulimed=replicate(0,Npar)
   ;; llimed=replicate(1,Npar)
   ;; llims=replicate(0.,Npar)
   ;; fpd=[ $
   ;;     '(*!dustem_params).G0'   $ ; ISRF intensity (multiplicative factor x G0)
   ;;     ,'dustem_plugin_continuum_1' $ ;temperature of blackbody the produces the continuum 
   ;;     ]
   ;; fiv=[1.5, 1200.]

9f66a93f   Annie Hughes   changed philosoph...
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
;; ;=== AN EXAMPLE FOR J13
;; ;=== Here we fit the dust abundances of the MC10 model, the
;; ;=== intensity of the dust-heating radiation field as well as two plug-ins:
;; ;=== (i) free-free emission
;; ;=== (ii)continuum due to a blackbody 
;; ;=== The temperature of the blackbody is fixed to 1000K
;; ;=== The free parameters in the fit are all lower-bounded at zero.
;; use_model='J13' ; you should specify this !
;; pd = [ $
;;      '(*!dustem_params).G0' $                                   ;G0
;;      ,'(*!dustem_params).grains(0).mdust_o_mh'$                  ;CM20 -- power law size distribution
;;      ,'(*!dustem_params).grains(1).mdust_o_mh'$                 ;CM20 -- logN size distribution
;;      ,'(*!dustem_params).grains(2).mdust_o_mh' $                ;aPyM5
;;      ,'(*!dustem_params).grains(3).mdust_o_mh' $                ;aOlM5
;;      ,'dustem_plugin_freefree_1' $                              ;ionized gas temperature
;;      ,'dustem_plugin_freefree_2' $                              ;free-free amplitude
;;      ,'dustem_plugin_continuum_2']                              ;Intensity at peak of the BB continuum
;; iv =   [1.2,1.7e-3, 6.3e-4, 2.55e-3, 2.55e-3, 7500., 0.4, 0.001]         
;; Npar=n_elements(pd)
;; ulimed=replicate(0,Npar)
;; llimed=replicate(1,Npar)
;; llims=replicate(0.,Npar)
;; fpd=[ $
;;     'dustem_plugin_continuum_2'] ; Temperature of the BB
;; fiv=[1000.]                       
04ff3e4d   Annie Hughes   added comments an...
239
240


a6bd0451   Annie Hughes   made prettier for...
241
242
243
244
245
Nfix=n_elements(fpd)
if n_elements(fiv) ne Nfix then begin
   message,'Number of fixed parameters (fpd) does not equal number of initial values of fixed parameters (fiv)',/info
   stop
end
a1839067   Jean-Philippe Bernard   First commit
246

a6bd0451   Annie Hughes   made prettier for...
247
if keyword_set(wait) then begin
04ff3e4d   Annie Hughes   added comments an...
248
   message,'Finished setting dust model and plug-in parameters: '+use_model,/info
a6bd0451   Annie Hughes   made prettier for...
249
250
   wait,wait
end
a1839067   Jean-Philippe Bernard   First commit
251

a1839067   Jean-Philippe Bernard   First commit
252
;== INITIALISE DUSTEM
a6bd0451   Annie Hughes   made prettier for...
253
dustem_init,model=use_model,polarization=use_polarization
a1839067   Jean-Philippe Bernard   First commit
254
!dustem_nocatch=1
a6bd0451   Annie Hughes   made prettier for...
255
!dustem_verbose=use_verbose
a1839067   Jean-Philippe Bernard   First commit
256
257
258
!dustem_show_plot=1


a6bd0451   Annie Hughes   made prettier for...
259
;=== READ EXAMPLE SED DATA
a1839067   Jean-Philippe Bernard   First commit
260
dir=!dustem_wrap_soft_dir+'/Data/EXAMPLE_OBSDATA/'
9f66a93f   Annie Hughes   changed philosoph...
261
file=dir+'example_SED_1.xcat'
a1839067   Jean-Philippe Bernard   First commit
262
263
264
IF keyword_set(sed_file) THEN file=sed_file
sed=read_xcat(file,/silent)

a6bd0451   Annie Hughes   made prettier for...
265
266
267
268
269
270
271
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)
a1839067   Jean-Philippe Bernard   First commit
272
IF count NE 0 THEN sed[ind].sigmaII=(0.2*sed[ind].StokesI)^2
a1839067   Jean-Philippe Bernard   First commit
273
274

;== SET THE OBSERVATIONAL STRUCTURE
a6bd0451   Annie Hughes   made prettier for...
275
;== sed is passed twice -- the first occurrence is the SED that you
04ff3e4d   Annie Hughes   added comments an...
276
;== wish to fit, the second occurrence is the SED that you wish to visualise. 
80783331   Jean-Philippe Bernard   changed
277
dustem_set_data,sed,sed
a1839067   Jean-Philippe Bernard   First commit
278
279
280
281
282
283
284

;== SET INITIAL VALUES AND LIMITS OF THE PARAMETERS THAT WILL BE
;== ADJUSTED DURING THE FIT
dustem_init_parinfo,pd,iv,up_limited=ulimed,lo_limited=llimed,up_limits=ulims,lo_limits=llims

;== INITIALIZE ANY PLUGINS
dustem_init_plugins,pd,fpd 
a6bd0451   Annie Hughes   made prettier for...
285

a1839067   Jean-Philippe Bernard   First commit
286
;== INITIALIZE ANY FIXED PARAMETERS FOR PLUGINS
a6bd0451   Annie Hughes   made prettier for...
287
288
289
if Nfix gt 0 then dustem_init_fixed_params,fpd,fiv

if keyword_set(wait) then begin
04ff3e4d   Annie Hughes   added comments an...
290
   message,'Finished initializing DustEMWrap, including plugins and fixed parameters',/info
a6bd0451   Annie Hughes   made prettier for...
291
292
   wait,wait
end
a1839067   Jean-Philippe Bernard   First commit
293

a6bd0451   Annie Hughes   made prettier for...
294
;=== INFORMATION TO RUN THE FIT
a1839067   Jean-Philippe Bernard   First commit
295
tol=1.e-16     ;fit tolerence
a1839067   Jean-Philippe Bernard   First commit
296

a6bd0451   Annie Hughes   made prettier for...
297
298
299
;=== INFORMATION TO MAKE THE PLOT
yr=[1.00e-4,1.00E2] ; y-axis limits
xr=[1.00E0,6.00e4] ; x-axis limits
04ff3e4d   Annie Hughes   added comments an...
300
tit='FIT INTENSITY EXAMPLE' ; plot title
a6bd0451   Annie Hughes   made prettier for...
301
302
ytit=textoidl('I_\nu (MJy/sr) for N_H=10^{20} H/cm^2') ; y-axis title
xtit=textoidl('\lambda (\mum)') ; x-axis title
a1839067   Jean-Philippe Bernard   First commit
303

a6bd0451   Annie Hughes   made prettier for...
304
;===  RUN THE FIT
a1839067   Jean-Philippe Bernard   First commit
305
306
307
308
309
310
311
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 $
                      ,errors=errors,chi2=chi2,rchi2=rchi2)
t2=systime(0,/sec)

a6bd0451   Annie Hughes   made prettier for...
312
if keyword_set(wait) then begin
04ff3e4d   Annie Hughes   added comments an...
313
   message,'Finished running DustEMWrap, using Niters: '+strtrim(string(use_Nitermax),2),/info
a6bd0451   Annie Hughes   made prettier for...
314
315
316
   message,'Time taken [sec]: '+sigfig(t2-t1,2,/sci),/info
   wait,wait
end
8561c935   Annie Hughes   minor change
317

a6bd0451   Annie Hughes   made prettier for...
318
;=== MAKE THE FINAL PLOT
a1839067   Jean-Philippe Bernard   First commit
319
320
321
322
323
324
IF keyword_set(postscript) THEN BEGIN
    dir_ps='./'
    set_plot,'PS'
    ps_file=dir_ps+postscript
    device,filename=ps_file,/color
ENDIF
a6bd0451   Annie Hughes   made prettier for...
325
dustemwrap_plot,*(*!dustem_fit).CURRENT_PARAM_VALUES,dummy,xr=xr,/xstyle,yr=yr,/ysty,/ylog,/xlog,title=tit+' (Final fit)'
a1839067   Jean-Philippe Bernard   First commit
326
327
328
329
330
331
IF keyword_set(postscript) THEN BEGIN
  set_plot,'X'
  device,/close
  message,'Wrote '+ps_file,/info
ENDIF

a6bd0451   Annie Hughes   made prettier for...
332
333
334
335
336
if keyword_set(wait) then begin
   message,'Made the plot of the final results',/info
   wait,wait
end

a1839067   Jean-Philippe Bernard   First commit
337
IF keyword_set(fits_save_and_restore) THEN BEGIN
a6bd0451   Annie Hughes   made prettier for...
338
339
   message,'Writing out results structure: '+fits_save_and_restore,/info
   dustem_write_fits_table,filename=fits_save_and_restore,help=help
8561c935   Annie Hughes   minor change
340
341
;=== 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
a1839067   Jean-Philippe Bernard   First commit
342
343
344
  dustem_read_fits_table,filename=fits_save_and_restore,dustem_spectra_st=dustem_spectra_st
  ;==== plot result taken from the saved fits table
  res=*(*!dustem_fit).CURRENT_PARAM_VALUES
a6bd0451   Annie Hughes   made prettier for...
345
346
347
348
349
  dustemwrap_plot,res,dustem_spectra_st,xr=xr,/xstyle,yr=yr,/ysty,/ylog,/xlog,title=tit+' (From Saved FITS file)'
  if keyword_set(wait) then begin
     message,'Saved the results as FITS in the file: '+fits_save_and_restore+', and made a plot using the data in this file',/info
     wait,wait
  end
a1839067   Jean-Philippe Bernard   First commit
350
351
ENDIF

a6bd0451   Annie Hughes   made prettier for...
352
message,'Finished dustem_fit_intensity_example',/info
a1839067   Jean-Philippe Bernard   First commit
353

8561c935   Annie Hughes   minor change
354
355
stop

a1839067   Jean-Philippe Bernard   First commit
356
357
358
the_end:

END