Blame view

src/idl/dustem_fit_polarization_example.pro 8.46 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
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                                    ,help=help $
                                    ,wait=wait $
                                    ,verbose=verbose
  ;+
; 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 ...
23
;    dustem_fit_polarization_example[,model=][sed_file=][,postscript=][,Nitermax=][,fits_save=][,/help,/wait,/verbose]
01637b5c   Annie Hughes   first commit afte...
24
25
26
27
28
29
30
31
32
33
34
35
36
37
;
; 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 ...
38
39
40
;    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...
41
42
43
44
45
46
;    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.  
;    postscript = if set, final plot is saved as postscript in the
;                current working directory
;    Nitermax = maximum number of fit iterations. Default is 5.
6735604d   Annie Hughes   making FITS read ...
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
144
145
146
147
148
149
150
151
152
153
!dustem_nocatch=1

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



;== SET INITIAL VALUES AND LIMITS OF THE PARAMETERS THAT WILL BE
;== ADJUSTED DURING THE FIT
01637b5c   Annie Hughes   first commit afte...
160
161
162
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...
163
;number of iterations has already been specified in the beginning of the code.
01637b5c   Annie Hughes   first commit afte...
164
165
tol=1.e-16
xtol=1.e-16
b08a2626   Ilyes Choubani   correcting number...
166
use_Nitermax=5; an initialization
01637b5c   Annie Hughes   first commit afte...
167
168
169
170
IF keyword_set(Nitermax) THEN use_Nitermax=Nitermax

xrange=[1.,2.e4]
yrange=[1e-4,1.e3]
dc84fd94   Ilyes Choubani   Small corrections...
171
172
173
174
;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...
175
176
177
178

loadct,13
t1=systime(0,/sec)
title='FIT POLARIZATION EXAMPLE'
97d6b02a   Annie Hughes   changed llims to ...
179
180
181
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...
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
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
    dir_ps='./'
    set_plot,'PS'
    ps_file=dir_ps+postscript
    device,filename=ps_file,/color
ENDIF
9ded3be9   Ilyes Choubani   Display update. F...
197

134c5e51   Jean-Philippe Bernard   modfied to be abl...
198
IF !dustem_noobj THEN BEGIN 
9ded3be9   Ilyes Choubani   Display update. F...
199
  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...
200
ENDIF ELSE BEGIN
9ded3be9   Ilyes Choubani   Display update. F...
201
  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...
202
ENDELSE
9ded3be9   Ilyes Choubani   Display update. F...
203

01637b5c   Annie Hughes   first commit afte...
204
205
206
207
208
209
210
211
212
213
214
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

6735604d   Annie Hughes   making FITS read ...
215
216
217
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...
218
219
;=== 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 ...
220
221
222
223
224

   
  ;;  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...
225
  
6735604d   Annie Hughes   making FITS read ...
226
  ;; ;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...
227
  
6735604d   Annie Hughes   making FITS read ...
228
229
230
231
232
233
234
235
  ;; 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...
236
237
238
239
240
241
     wait,wait
  end
ENDIF

message,'Finished dustem_polarization_example',/info

7fb01a01   Jean-Philippe Bernard   modified to get a...
242
;stop
01637b5c   Annie Hughes   first commit afte...
243
244
245
246

the_end:

END