Blame view

src/idl/dustem_fit_polarisation_example.pro 8.5 KB
5d34557b   Jean-Philippe Bernard   First commit
1
PRO dustem_fit_polarisation_example,model=model $
04ff3e4d   Annie Hughes   added comments an...
2
3
4
5
6
7
8
                                    ,sed_file=sed_file $
                                    ,Nitermax=Nitermax $
                                    ,postscript=postscript $
                                    ,fits_save_and_restore=fits_save_and_restore $
                                    ,help=help $
                                    ,wait=wait $
                                    ,verbose=verbose
50bb5343   Annie Hughes   minor changes to ...
9
  ;+
5d34557b   Jean-Philippe Bernard   First commit
10
11
; NAME:
;    dustem_fit_polarisation_example  
04ff3e4d   Annie Hughes   added comments an...
12
;
5d34557b   Jean-Philippe Bernard   First commit
13
; PURPOSE:
04ff3e4d   Annie Hughes   added comments an...
14
15
;    This is an example of how to fit observational SEDs (with
;    measurements in Stokes IQU) using DustEMWrap.
5d34557b   Jean-Philippe Bernard   First commit
16
17
;    It is intended as an example to follow when writing your own
;    programs to analyse data with DustEMWrap.
04ff3e4d   Annie Hughes   added comments an...
18
;
5d34557b   Jean-Philippe Bernard   First commit
19
20
; CATEGORY:
;    DustEMWrap, Distributed, High-Level, User Example
04ff3e4d   Annie Hughes   added comments an...
21
;
5d34557b   Jean-Philippe Bernard   First commit
22
; CALLING SEQUENCE:
04ff3e4d   Annie Hughes   added comments an...
23
24
;    dustem_fit_polarisation_example[,model=][sed_file=][,postscript=][,Nitermax=][,fits_save_and_restore=][,/help,/wait,/verbose]
;
5d34557b   Jean-Philippe Bernard   First commit
25
26
; INPUTS:
;    None
04ff3e4d   Annie Hughes   added comments an...
27
;
5d34557b   Jean-Philippe Bernard   First commit
28
29
; OPTIONAL INPUT PARAMETERS:
;    None
04ff3e4d   Annie Hughes   added comments an...
30
;
5d34557b   Jean-Philippe Bernard   First commit
31
32
; OUTPUTS:
;    None
04ff3e4d   Annie Hughes   added comments an...
33
;
5d34557b   Jean-Philippe Bernard   First commit
34
; OPTIONAL OUTPUT PARAMETERS:
04ff3e4d   Annie Hughes   added comments an...
35
36
;    Plots, Results save structure in binary FITS table format
;
5d34557b   Jean-Philippe Bernard   First commit
37
38
; ACCEPTED KEY-WORDS:
;    model = specifies the interstellar dust mixture used by DustEM
50bb5343   Annie Hughes   minor changes to ...
39
;           'G17_ModelA' model A from Guillet et al (2018). See Tables 2 and 3 of that paper for details.
5d34557b   Jean-Philippe Bernard   First commit
40
41
;           'G17_ModelB' model B from Guillet et al (2018)
;           'G17_ModelC' model C from Guillet et al (2018)
04ff3e4d   Annie Hughes   added comments an...
42
;           'G17_ModelD' model A from Guillet et al (2018). Default.
5d34557b   Jean-Philippe Bernard   First commit
43
44
;    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...
45
;          'Data/EXAMPLE_OBSDATA/example_SED_3.xcat' is used.  
5d34557b   Jean-Philippe Bernard   First commit
46
47
48
49
50
;    postscript = if set, final plot is saved as postscript in the
;                current working directory
;    Nitermax = maximum number of fit iterations. Default is 5.
;    fits_save_and_restore = if set, saves results in a fits file, restore the file and plot restored results
;    help      = if set, print this help
04ff3e4d   Annie Hughes   added comments an...
51
52
53
54
;    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

5d34557b   Jean-Philippe Bernard   First commit
55
56
; COMMON BLOCKS:
;    None
04ff3e4d   Annie Hughes   added comments an...
57
;
5d34557b   Jean-Philippe Bernard   First commit
58
59
; SIDE EFFECTS:
;    None
04ff3e4d   Annie Hughes   added comments an...
60
;
5d34557b   Jean-Philippe Bernard   First commit
61
62
63
; RESTRICTIONS:
;    The DustEM fortran code must be installed
;    The DustEMWrap IDL code must be installed
04ff3e4d   Annie Hughes   added comments an...
64
;
5d34557b   Jean-Philippe Bernard   First commit
65
66
; PROCEDURES AND SUBROUTINES USED:
;    *** COMMENT AH --> is this really NONE? ****
04ff3e4d   Annie Hughes   added comments an...
67
;
5d34557b   Jean-Philippe Bernard   First commit
68
69
70
71
; EXAMPLES
;    dustem_fit_polarisation_example
;    dustem_fit_polarisation_example,Nitermax=1,fits_save_and_restore='/tmp/mysavefile.fits'
;    dustem_fit_polarisation_example,model='DBP90'
04ff3e4d   Annie Hughes   added comments an...
72
;
5d34557b   Jean-Philippe Bernard   First commit
73
74
75
76
77
78
79
80
81
82
83
84
85
86
; MODIFICATION HISTORY:
;    Written by JPB Apr-2022
;    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_polarisation_example'
  goto,the_end
END

IF keyword_set(model) THEN BEGIN
  use_model=strupcase(model)
ENDIF ELSE BEGIN
04ff3e4d   Annie Hughes   added comments an...
87
  use_model='G17_MODELD'    ;Default is one of the Guillet et al (2017) models since they treat dust polarisation properties
5d34557b   Jean-Philippe Bernard   First commit
88
89
ENDELSE

04ff3e4d   Annie Hughes   added comments an...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
known_mdls=['MC10','DBP90','DL01','WD01_RV5P5B','DL07','J13','G17_MODELA','G17_MODELB','G17_MODELC','G17_MODELD'] 
pol_mdls=['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
test_model = where(pol_mdls eq use_model,ct)
if ct eq 0 then begin
   message,'The only models with polarisation are G17_MODELA,G17_MODELB,G17_MODELC,G17_MODELD',/continue
   stop
end

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

5d34557b   Jean-Philippe Bernard   First commit
110
111
dustem_define_la_common

04ff3e4d   Annie Hughes   added comments an...
112
113
114
115
116
117
118
119
;; ;=== AN EXAMPLE FOR G17_MODELA/B/C/D
;; ;=== Here we fit the dust abundances of the model, the dust
;; ;=== polarisation and a plug-in:
;; ;=== (i) synchrotron emission (also polarized)
;; ;=== The free parameters in the fit are all lower-bounded at zero. The
;; ;=== intensity of the dust-heating radiation field is fixed to 1.0*G0.
pd = [ $
     '(*!dustem_params).grains(0).mdust_o_mh',$          ;PAH0 mass fraction
50bb5343   Annie Hughes   minor changes to ...
120
121
     '(*!dustem_params).grains(1).mdust_o_mh',$          ;amorphous carbon mass fraction   
     '(*!dustem_params).grains(2).mdust_o_mh', $         ;amorphous silicate mass fraction
04ff3e4d   Annie Hughes   added comments an...
122
123
124
125
126
     'dustem_plugin_modify_dust_pol_2',  $               ;This will set the polarization angle
     'dustem_plugin_synchrotron_2', $                    ;Synchrotron amplitude at 10 mm
     'dustem_plugin_synchrotron_3', $                    ;Synchrotron polarization fraction
     'dustem_plugin_synchrotron_4'  $                    ;Synchrotron polarization angle
     ]                   
50bb5343   Annie Hughes   minor changes to ...
127
128
129
130
131
;--- the SED in example_SED_3.xcat was created with the following
;    model parameters (pd_truth)
pd_truth=[7.8000E-04,7.8000E-04,7.8000E-04, 10. ,1.e-2, 0.3, 45.]
iv=pd_truth+[1.e-4,-1.e-4,1.e-4,-5.,0.,0.1,10] ; initialize DustEMWrap with values shifted from the true solution

04ff3e4d   Annie Hughes   added comments an...
132
133
134
135
136
137
138
139
140
141
142
143
Npar=n_elements(pd)
ulimed=replicate(0,Npar)
llimed=replicate(1,Npar)
llims=replicate(0.,Npar)
fpd=[ '(*!dustem_params).G0']  & fiv=[1.0]                       

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

5d34557b   Jean-Philippe Bernard   First commit
144

04ff3e4d   Annie Hughes   added comments an...
145
;== INITIALISE DUSTEM
50bb5343   Annie Hughes   minor changes to ...
146
;dustem_init,mode=use_model,grain_keywords=['logn-chrg-spin','?','plaw-pol'],polarization=1
c598f318   Annie Hughes   fpd to keyword
147
dustem_init,model=use_model,polarization=1
5d34557b   Jean-Philippe Bernard   First commit
148
149
150
151
!dustem_verbose=1
!dustem_show_plot=1
!dustem_nocatch=1

04ff3e4d   Annie Hughes   added comments an...
152
153
154
155
156
;=== READ EXAMPLE SED DATA
dir=!dustem_wrap_soft_dir+'/Data/EXAMPLE_OBSDATA/'
file=dir+'example_SED_3.xcat'
IF keyword_set(sed_file) THEN file=sed_file
sed=read_xcat(file,/silent)
5d34557b   Jean-Philippe Bernard   First commit
157

04ff3e4d   Annie Hughes   added comments an...
158
159
160
161
;== 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. 
dustem_set_data,sed,sed
45be2d61   Jean-Philippe Bernard   adding polarizati...
162

04ff3e4d   Annie Hughes   added comments an...
163
164
165
;== 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;,tied=tied
5d34557b   Jean-Philippe Bernard   First commit
166

04ff3e4d   Annie Hughes   added comments an...
167
;== INITIALIZE ANY PLUGINS
c598f318   Annie Hughes   fpd to keyword
168
dustem_init_plugins,pd,fpd
5d34557b   Jean-Philippe Bernard   First commit
169

04ff3e4d   Annie Hughes   added comments an...
170
171
;== INITIALIZE ANY FIXED PARAMETERS FOR PLUGINS
if Nfix gt 0 then dustem_init_fixed_params,fpd,fiv
5d34557b   Jean-Philippe Bernard   First commit
172

5d34557b   Jean-Philippe Bernard   First commit
173
174
175
176
;=== RUN fit
tol=1.e-16
xtol=1.e-16
Nitermax=30; just an initialization
5d34557b   Jean-Philippe Bernard   First commit
177
178
179
180
181

xrange=[1.,2.e4]
yrange=[1e-4,1.e3]

loadct,13
5d34557b   Jean-Philippe Bernard   First commit
182
t1=systime(0,/sec)
04ff3e4d   Annie Hughes   added comments an...
183
title='FIT POLARISATION EXAMPLE'    
5d34557b   Jean-Philippe Bernard   First commit
184
185
186
res=dustem_mpfit_data(tol=tol,xtol=xtol,Nitermax=Nitermax,xrange=xrange,/xstyle,yrange=yrange,/ysty,/ylog,/xlog,xtit='wavelength [mic]',ytit='Brightness []',title=title)
t2=systime(0,/sec)

04ff3e4d   Annie Hughes   added comments an...
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
if keyword_set(wait) then begin
   message,'Finished running DustEMWrap, using Niters: '+strtrim(string(use_Nitermax),2),/info
   message,'Time taken [sec]: '+sigfig(t2-t1,2,/sci),/info
   wait,wait
end

;=== MAKE THE FINAL PLOT
IF keyword_set(postscript) THEN BEGIN
    dir_ps='./'
    set_plot,'PS'
    ps_file=dir_ps+postscript
    device,filename=ps_file,/color
ENDIF
dustemwrap_plot,*(*!dustem_fit).CURRENT_PARAM_VALUES,dummy,xr=xr,/xstyle,yr=yr,/ysty,/ylog,/xlog,title=tit+' (Final fit)'
IF keyword_set(postscript) THEN BEGIN
  set_plot,'X'
  device,/close
  message,'Wrote '+ps_file,/info
ENDIF

if keyword_set(wait) then begin
   message,'Made the plot of the final results',/info
   wait,wait
end

IF keyword_set(fits_save_and_restore) THEN BEGIN
   message,'Writing out results structure: '+fits_save_and_restore,/info
   dustem_write_fits_table,filename=fits_save_and_restore,help=help
;=== 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
  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
  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
ENDIF

message,'Finished dustem_polarisation_example',/info

stop

5d34557b   Jean-Philippe Bernard   First commit
231
232
233
the_end:

END