Blame view

src/idl/dustem_fit_polarization_example.pro 8.55 KB
01637b5c   Annie Hughes   first commit afte...
1
2
3
4
PRO dustem_fit_polarization_example,model=model $
                                    ,sed_file=sed_file $
                                    ,Nitermax=Nitermax $
                                    ,postscript=postscript $
6735604d   Annie Hughes   making FITS read ...
5
                                    ,fits_save=fits_save $
01637b5c   Annie Hughes   first commit afte...
6
                                    ,help=help $
e431104b   Annie Hughes   general updates f...
7
                                    ,noobj=noobj $
01637b5c   Annie Hughes   first commit afte...
8
9
                                    ,wait=wait $
                                    ,verbose=verbose
824ab304   Annie Hughes   updated help
10
;+
01637b5c   Annie Hughes   first commit afte...
11
12
13
14
15
16
17
18
19
20
21
22
23
; NAME:
;    dustem_fit_polarization_example  
;
; PURPOSE:
;    This is an example of how to fit observational SEDs (with
;    measurements in Stokes IQU) using DustEMWrap.
;    It is intended as an example to follow when writing your own
;    programs to analyse data with DustEMWrap.
;
; CATEGORY:
;    DustEMWrap, Distributed, High-Level, User Example
;
; CALLING SEQUENCE:
6735604d   Annie Hughes   making FITS read ...
24
;    dustem_fit_polarization_example[,model=][sed_file=][,postscript=][,Nitermax=][,fits_save=][,/help,/wait,/verbose]
01637b5c   Annie Hughes   first commit afte...
25
26
27
28
29
30
31
32
33
34
35
36
37
38
;
; INPUTS:
;    None
;
; OPTIONAL INPUT PARAMETERS:
;    None
;
; OUTPUTS:
;    None
;
; OPTIONAL OUTPUT PARAMETERS:
;    Plots, Results save structure in binary FITS table format
;
; ACCEPTED KEY-WORDS:
6735604d   Annie Hughes   making FITS read ...
39
40
41
;    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.
01637b5c   Annie Hughes   first commit afte...
42
43
44
;    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_3.xcat' is used.  
e431104b   Annie Hughes   general updates f...
45
;    postscript = if set, final plot is saved as postscript file
01637b5c   Annie Hughes   first commit afte...
46
;    Nitermax = maximum number of fit iterations. Default is 5.
e431104b   Annie Hughes   general updates f...
47
;    fits_save = if set, saves results in a FITS file.
01637b5c   Annie Hughes   first commit afte...
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
;    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

; 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:
01637b5c   Annie Hughes   first commit afte...
64
65
66
;
; EXAMPLES
;    dustem_fit_polarization_example
6735604d   Annie Hughes   making FITS read ...
67
;    dustem_fit_polarization_example,Nitermax=1,fits_save='/tmp/mysavefile.fits'
01637b5c   Annie Hughes   first commit afte...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
;    dustem_fit_polarization_example,model='DBP90'
;
; 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_polarization_example'
  goto,the_end
END

IF keyword_set(model) THEN BEGIN
  use_model=strupcase(model)
ENDIF ELSE BEGIN
  use_model='G17_MODELD'    ;Default is one of the Guillet et al (2017) models since they treat dust polarization properties
ENDELSE

6735604d   Annie Hughes   making FITS read ...
87
88
89
exists=dustem_test_model_exists(use_model,/pol)
if exists ne 1 then $
   message,'Unknown/non-polarized dust model: '+use_model
01637b5c   Annie Hughes   first commit afte...
90
91
92
93
94
95
96
97
98
99
100
101
102

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

;; ;=== AN EXAMPLE FOR G17_MODELA/B/C/D
;; ;=== Here we fit the dust abundances of the model, the dust
;; ;=== polarization and a plug-in:
;; ;=== (i) synchrotron emission (also polarized)
97d6b02a   Annie Hughes   changed llims to ...
103
104
105
106
107
108
;; ;=== The free parameters in the fit are lower-bounded at
;; ;=== ~zero. The synchrotron parameters are constrained betweem
;; ;=== upper and lower bounds
;; ;=== The intensity of the dust-heating radiation field and the
;; ;=== spectral index of the CRE energy spectrum are fixed.

01637b5c   Annie Hughes   first commit afte...
109
110
111
112
pd = [ $
     '(*!dustem_params).grains(0).mdust_o_mh',$          ;PAH0 mass fraction
     '(*!dustem_params).grains(1).mdust_o_mh',$          ;amorphous carbon mass fraction   
     '(*!dustem_params).grains(2).mdust_o_mh', $         ;amorphous silicate mass fraction
fd152fd2   Annie Hughes   cosmetic changes ...
113
     'dustem_plugin_modify_dust_pol_2',  $               ;Dust polarization angle
01637b5c   Annie Hughes   first commit afte...
114
115
116
117
     'dustem_plugin_synchrotron_2', $                    ;Synchrotron amplitude at 10 mm
     'dustem_plugin_synchrotron_3', $                    ;Synchrotron polarization fraction
     'dustem_plugin_synchrotron_4'  $                    ;Synchrotron polarization angle
     ]                   
fd152fd2   Annie Hughes   cosmetic changes ...
118
iv=[7.2e-4,7.2e-4,8.5e-4,-10.,0.015,0.25,35.]
01637b5c   Annie Hughes   first commit afte...
119
120
121
122
123

Npar=n_elements(pd)
ulimed=[0,0,0,0,1,1,1]
llimed=[1,1,1,0,1,1,1]
ulims=[0,0,0,0,0.02,0.5,60.]
97d6b02a   Annie Hughes   changed llims to ...
124
llims=[1.e-15,1.e-15,1.e-15,0,0.005,0.05,30.]
01637b5c   Annie Hughes   first commit afte...
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141

fpd=[ '(*!dustem_params).G0' , $ ; intensity of the dust-heating radiation field
      'dustem_plugin_synchrotron_1']  ;Synchrotron CR spectral index
fiv=[1.0,3.0]                       
use_polarization=1

;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


;== INITIALISE DUSTEM
;dustem_init,mode=use_model,grain_keywords=['logn-chrg-spin','?','plaw-pol'],polarization=1
dustem_init,model=use_model,pol=use_polarization
!dustem_verbose=1
dc84fd94   Ilyes Choubani   Small corrections...
142
;!dustem_show_plot=1
01637b5c   Annie Hughes   first commit afte...
143
!dustem_nocatch=1
e431104b   Annie Hughes   general updates f...
144
IF keyword_set(noobj) THEN !dustem_noobj=1
01637b5c   Annie Hughes   first commit afte...
145
146
147
148
149
150
151
152
153
154

;=== 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)

;== 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...
155
dustem_set_data,m_fit=sed,m_show=sed
01637b5c   Annie Hughes   first commit afte...
156
157
158
159
160



;== SET INITIAL VALUES AND LIMITS OF THE PARAMETERS THAT WILL BE
;== ADJUSTED DURING THE FIT
01637b5c   Annie Hughes   first commit afte...
161
162
163
dustem_init_params,use_model,pd,iv,fpd=fpd,fiv=fiv,ulimed=ulimed,llimed=llimed,ulims=ulims,llims=llims,pol=use_polarization

;=== RUN fit
b08a2626   Ilyes Choubani   correcting number...
164
;number of iterations has already been specified in the beginning of the code.
01637b5c   Annie Hughes   first commit afte...
165
166
tol=1.e-16
xtol=1.e-16
b08a2626   Ilyes Choubani   correcting number...
167
use_Nitermax=5; an initialization
01637b5c   Annie Hughes   first commit afte...
168
169
170
171
IF keyword_set(Nitermax) THEN use_Nitermax=Nitermax

xrange=[1.,2.e4]
yrange=[1e-4,1.e3]
dc84fd94   Ilyes Choubani   Small corrections...
172
173
174
175
;Set show_plot to 0 to hide plot
;Commented or set to 1 is the same since !dustem_show_plot (existing sysvar) is initialized to 1 in dustem_init
;show_plot = 0 

01637b5c   Annie Hughes   first commit afte...
176
177
178
179

loadct,13
t1=systime(0,/sec)
title='FIT POLARIZATION EXAMPLE'
97d6b02a   Annie Hughes   changed llims to ...
180
181
182
res=dustem_mpfit_data(tol=tol,xtol=xtol,Nitermax=use_Nitermax,xrange=xrange,/xstyle,yrange=yrange $
                      ,/ysty,/ylog,/xlog,xtit='wavelength [mic]',ytit='Brightness []' $
                      ,title=title,show_plot=show_plot)
01637b5c   Annie Hughes   first commit afte...
183
184
185
186
187
188
189
190
191
192
t2=systime(0,/sec)

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
e431104b   Annie Hughes   general updates f...
193
194
;    dir_ps='./'
   mydevice=!d.name
01637b5c   Annie Hughes   first commit afte...
195
    set_plot,'PS'
e431104b   Annie Hughes   general updates f...
196
197
;    ps_file=dir_ps+postscript
    ps_file=postscript
01637b5c   Annie Hughes   first commit afte...
198
199
    device,filename=ps_file,/color
ENDIF
9ded3be9   Ilyes Choubani   Display update. F...
200

134c5e51   Jean-Philippe Bernard   modfied to be abl...
201
IF !dustem_noobj THEN BEGIN 
9ded3be9   Ilyes Choubani   Display update. F...
202
  dustemwrap_plot_noobj,(*(*!dustem_fit).CURRENT_PARAM_VALUES),st=dummy,xr=xr,/xstyle,yr=yr,/ysty,/ylog,/xlog,title=title+' (Final fit)'
134c5e51   Jean-Philippe Bernard   modfied to be abl...
203
ENDIF ELSE BEGIN
9ded3be9   Ilyes Choubani   Display update. F...
204
  dustemwrap_plot,(*(*!dustem_fit).CURRENT_PARAM_VALUES),st=dummy,xr=xr,/xstyle,yr=yr,/ysty,/ylog,/xlog,title=title+' (Final fit)'
134c5e51   Jean-Philippe Bernard   modfied to be abl...
205
ENDELSE
9ded3be9   Ilyes Choubani   Display update. F...
206

01637b5c   Annie Hughes   first commit afte...
207
IF keyword_set(postscript) THEN BEGIN
01637b5c   Annie Hughes   first commit afte...
208
  device,/close
e431104b   Annie Hughes   general updates f...
209
  set_plot,mydevice
01637b5c   Annie Hughes   first commit afte...
210
211
212
213
214
215
216
217
  message,'Wrote '+ps_file,/info
ENDIF

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

6735604d   Annie Hughes   making FITS read ...
218
219
220
IF keyword_set(fits_save) THEN BEGIN
   message,'Writing out results structure: '+fits_save,/info
   dustem_write_fits_table,filename=fits_save,help=help
01637b5c   Annie Hughes   first commit afte...
221
222
;=== 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 ...
223
224
225
226
227

   
  ;;  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
b08a2626   Ilyes Choubani   correcting number...
228
  
6735604d   Annie Hughes   making FITS read ...
229
  ;; ;If the user prefers non-OOP plotting then reset !dustem_noobj=1 here since dustem_init is called in reads_fits_table.
b08a2626   Ilyes Choubani   correcting number...
230
  
6735604d   Annie Hughes   making FITS read ...
231
232
233
234
235
236
237
238
  ;; IF !dustem_noobj THEN BEGIN 
  ;;   dustemwrap_plot_noobj,res,st=dustem_spectra_st,xr=xr,/xstyle,yr=yr,/ysty,/ylog,/xlog,title=title+' (From saved FITS file)'
  ;; ENDIF ELSE BEGIN
  ;;   dustemwrap_plot,res,st=dustem_spectra_st,xr=xr,/xstyle,yr=yr,/ysty,/ylog,/xlog,title=title+' (From saved FITS file)'
  ;; ENDELSE

   if keyword_set(wait) then begin
     message,'Saved the results as FITS in the file: '+fits_save,/info
01637b5c   Annie Hughes   first commit afte...
239
240
241
242
     wait,wait
  end
ENDIF

01637b5c   Annie Hughes   first commit afte...
243
244

the_end:
e431104b   Annie Hughes   general updates f...
245
message,'Finished dustem_polarization_example',/info
01637b5c   Annie Hughes   first commit afte...
246
247

END