Blame view

src/idl/dustem_compute_polsed.pro 6.22 KB
3f93c873   Ilyes Choubani   correcting "compu...
1
2
3
4
5
6
FUNCTION dustem_compute_polsed,p_dim,st,$
P_spec=P_spec,SP_spec=SP_spec,$
dustem_polfrac=dustem_polfrac,$
out_st=out_st,$
dustem_sed=dustem_sed,$
_extra=extra
427f1205   Jean-Michel Glorian   version 4.2 merged
7

f133c4ae   Jean-Philippe Bernard   improved help a bit
8

427f1205   Jean-Michel Glorian   version 4.2 merged
9
;+
f133c4ae   Jean-Philippe Bernard   improved help a bit
10
11
12
;==========JPB
;THIS HELP IS NOT UP TO DATE 
;===========
427f1205   Jean-Michel Glorian   version 4.2 merged
13
14
15
16
17
18
19
20
21
22
23
; NAME:
;    dustem_compute_polsed
; PURPOSE:
;    Computes an SED from a given Dustem spectrum
; CATEGORY:
;    Dustem
; CALLING SEQUENCE:
;    sed=dustem_compute_polsed(p_dim[,st=][,_extra=][,/help])
; INPUTS:
;    p_dim      = parameter values
; OPTIONAL INPUT PARAMETERS:
5f04fa07   Ilyes Choubani   general update
24
;    st        = Dustem structure
427f1205   Jean-Michel Glorian   version 4.2 merged
25
; OUTPUTS:
83b3ddee   Jean-Philippe Bernard   modified with Ily...
26
27
28
;    sed         : computed SED for filters in !dustem_data
;    dustem_qsed : SED in Q
;    dustem_used : SED in U
427f1205   Jean-Michel Glorian   version 4.2 merged
29
; OPTIONAL OUTPUT PARAMETERS:
5f04fa07   Ilyes Choubani   general update
30
;    st        = Dustem output structure
427f1205   Jean-Michel Glorian   version 4.2 merged
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
; ACCEPTED KEY-WORDS:
;    help      = If set, print this help
; COMMON BLOCKS:
;    None
; SIDE EFFECTS:
;    None
; RESTRICTIONS:
;    The dustem idl wrapper must be installed
; PROCEDURE:
;    None
; EXAMPLES
;    
; MODIFICATION HISTORY:
;    Written by J.-Ph. Bernard
;    see evolution details on the dustem cvs maintained at CESR
;    Contact J.-Ph. Bernard (Jean-Philippe.Bernard@cesr.fr) in case of problems.
427f1205   Jean-Michel Glorian   version 4.2 merged
47

5f04fa07   Ilyes Choubani   general update
48

427f1205   Jean-Michel Glorian   version 4.2 merged
49
50
51
52
53
54
IF keyword_set(help) THEN BEGIN
  doc_library,'dustem_compute_polsed'
  dustem_polsed=0.
  goto,the_end
ENDIF

5f04fa07   Ilyes Choubani   general update
55
IF not keyword_set(st) THEN BEGIN
07372e26   Ilyes Choubani   Corrected huge pl...
56
57
  dustem_activate_plugins,p_dim/(*(*!dustem_fit).param_init_values),st
  ;st=dustem_run(p_dim)
427f1205   Jean-Michel Glorian   version 4.2 merged
58
ENDIF
452c334e   Ilyes Choubani   Implementation Of...
59

5f04fa07   Ilyes Choubani   general update
60
61
If keyword_set(result) THEN result=st
fact = 1.e4*(*!dustem_HCD)/(4.*!pi)/(3.e8/1.e-6/(st.polsed).wav)*1.e20/1.e7
759a527d   Ilyes Choubani   general update
62

3c479f24   Ilyes Choubani   Allowing to fix p...
63
64
P_spec = st.polsed.em_tot*fact ;This is Polarized intensity P
stI = st.sed.em_tot*fact    ;This is Total intensity I
ba82c5cf   Ilyes Choubani   improved with mod...
65
out=0.
5f04fa07   Ilyes Choubani   general update
66
Nwaves=(size(P_spec))[1]
83b3ddee   Jean-Philippe Bernard   modified with Ily...
67

5f04fa07   Ilyes Choubani   general update
68
frac=P_spec/stI
ba82c5cf   Ilyes Choubani   improved with mod...
69
70
71
tes=where(finite(frac) eq 0)
frac(tes)=0.

afde94a3   Ilyes Choubani   general update
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
;This block was added to generate the polarization fraction spectrum with the plugins contributions. 
;smallp (polfrac) is naturally not an additive quantity.



;NB: if plugins that replace the total emission given by the fortran executable exist, 
;the need to add a block with a 'REPLPACE_SED' scope as for the 'REPLACE_POLSED' below, may arise.

scopes=tag_names((*!dustem_plugin)) 
IF scopes[0] NE 'NONE' THEN BEGIN
;IF ptr_valid(!dustem_plugin) THEN BEGIN
  for i=0L,n_tags(*!dustem_plugin)-1 do begin
    if total(strsplit((*(*!dustem_plugin).(i).scope),'+',/extract) eq 'ADD_SED') then stI+=(*(*!dustem_plugin).(i).spec)[*,0]
  endfor
ENDIF

3ff9cac3   Ilyes Choubani   general update
88

759a527d   Ilyes Choubani   general update
89
IF scopes[0] NE 'NONE' THEN BEGIN
ba82c5cf   Ilyes Choubani   improved with mod...
90

3c479f24   Ilyes Choubani   Allowing to fix p...
91
    FOR i=0L,n_tags(*!dustem_plugin)-1 DO BEGIN   
ba82c5cf   Ilyes Choubani   improved with mod...
92
        
3c479f24   Ilyes Choubani   Allowing to fix p...
93
        IF total(strsplit((*(*!dustem_plugin).(i).scope),'+',/extract) EQ 'REPLACE_POLSED') THEN BEGIN
5f04fa07   Ilyes Choubani   general update
94
            
3c479f24   Ilyes Choubani   Allowing to fix p...
95
96
            Q_spec=(*(*!dustem_plugin).(i).spec)[*,1]
            U_spec=(*(*!dustem_plugin).(i).spec)[*,2]
afde94a3   Ilyes Choubani   general update
97
            ;make sure sti hasn't been replaced. But this is not happening in the near future
5f04fa07   Ilyes Choubani   general update
98
99
            
        ENDIF 
68598bce   Ilyes Choubani   reducing number o...
100
        
5f04fa07   Ilyes Choubani   general update
101
    ENDFOR    
ba82c5cf   Ilyes Choubani   improved with mod...
102
    
887b421b   Ilyes Choubani   correcting some c...
103
104
ENDIF
    
5f04fa07   Ilyes Choubani   general update
105
    IF ~isa(Q_spec) && ~isa(U_spec) THEN BEGIN
07372e26   Ilyes Choubani   Corrected huge pl...
106
        polar_ippsi2iqu,stI,Q_spec,U_spec,frac,replicate(!dustem_psi,Nwaves) ;the user needs to set this pointer somewhere
5f04fa07   Ilyes Choubani   general update
107
108
        SP_spec = frac 
    ENDIF
887b421b   Ilyes Choubani   correcting some c...
109
110
111

IF scopes[0] NE 'NONE' THEN BEGIN    
       
3c479f24   Ilyes Choubani   Allowing to fix p...
112
    FOR i=0L,n_tags(*!dustem_plugin)-1 DO BEGIN
ba82c5cf   Ilyes Choubani   improved with mod...
113
        
3c479f24   Ilyes Choubani   Allowing to fix p...
114
        IF total(strsplit((*(*!dustem_plugin).(i).scope),'+',/extract) EQ 'ADD_POLSED') THEN BEGIN
5f04fa07   Ilyes Choubani   general update
115
        
3c479f24   Ilyes Choubani   Allowing to fix p...
116
117
            Q_spec+=(*(*!dustem_plugin).(i).spec)[*,1]
            U_spec+=(*(*!dustem_plugin).(i).spec)[*,2]
5f04fa07   Ilyes Choubani   general update
118
119
120
121
            
        ENDIF
      
    ENDFOR
ba82c5cf   Ilyes Choubani   improved with mod...
122
    
759a527d   Ilyes Choubani   general update
123
ENDIF
452c334e   Ilyes Choubani   Implementation Of...
124

887b421b   Ilyes Choubani   correcting some c...
125
P_spec=sqrt(Q_spec^2+U_spec^2)
afde94a3   Ilyes Choubani   general update
126
127
SP_spec=P_spec/Sti

887b421b   Ilyes Choubani   correcting some c...
128

0068116a   Ilyes Choubani   General update + ...
129
dustem_polsed = (*(*!dustem_data).qsed).values * 0.
86e5c5c1   Ilyes Choubani   General update + ...
130

5f04fa07   Ilyes Choubani   general update
131
132
    
if not isarray(P_spec) THEN stop ;I don't understand this test. The only thing it can indicate is a problem with the dust parameters or the fortran executable. But in my opinion these tests would be  
452c334e   Ilyes Choubani   Implementation Of...
133

83b3ddee   Jean-Philippe Bernard   modified with Ily...
134

427f1205   Jean-Michel Glorian   version 4.2 merged
135
136
137
138
139
140
IF !dustem_do_cc NE 0 AND !dustem_never_do_cc EQ 0 THEN BEGIN
  message,'DOING color correction calculations',/info
ENDIF ELSE BEGIN
  message,'SKIPPING color correction calculations',/info
ENDELSE

0068116a   Ilyes Choubani   General update + ...
141
ind_polsed=where((*(*!dustem_data).qsed).filt_names NE 'SPECTRUM',count_polsed)  
452c334e   Ilyes Choubani   Implementation Of...
142
  
266ae799   Ilyes Choubani   General update
143
IF count_polsed NE 0 THEN BEGIN
0068116a   Ilyes Choubani   General update + ...
144
  filter_names=((*(*!dustem_data).qsed).filt_names)(ind_polsed)
5f04fa07   Ilyes Choubani   general update
145
  spolsed=dustem_cc(st.polsed.wav,P_spec,filter_names,cc=cc)
83b3ddee   Jean-Philippe Bernard   modified with Ily...
146
  dustem_polsed[ind_polsed]=spolsed
427f1205   Jean-Michel Glorian   version 4.2 merged
147
148
ENDIF

266ae799   Ilyes Choubani   General update
149

266ae799   Ilyes Choubani   General update
150
;For spectrum data points, interpolate in log-log.
427f1205   Jean-Michel Glorian   version 4.2 merged
151
152
;Linear interpolation leads to wrong values, in particular where few
;wavelengths points exist in the model (long wavelengths).
3c479f24   Ilyes Choubani   Allowing to fix p...
153
;I believe this to be automatic because the provided dustem spectra are already sampled on a log-log grid.
266ae799   Ilyes Choubani   General update
154

0068116a   Ilyes Choubani   General update + ...
155
156
ind_spec=where((*(*!dustem_data).qsed).filt_names EQ 'SPECTRUM',count_spec) 
IF count_spec NE 0 THEN dustem_polsed(ind_spec)=interpol(P_spec,st.polsed.wav,(((*(*!dustem_data).qsed).wav)(ind_spec)))
86e5c5c1   Ilyes Choubani   General update + ...
157

5f04fa07   Ilyes Choubani   general update
158
out_st=st
427f1205   Jean-Michel Glorian   version 4.2 merged
159

fcb6eade   Ilyes Choubani   general update - ...
160
161
;GENERATING THE INTERPOLATES FOR POLFRAC (dustem_polfrac)
if !run_lin then begin
67bd858a   Ilyes Choubani   Replication of th...
162
163
164
    
    if not keyword_set(dustem_sed) then dustem_sed = dustem_compute_sed(p_dim,st,SED_spec)
          		
fcb6eade   Ilyes Choubani   general update - ...
165
166
167
168
169
170
171
172
173
174
175
    If n_elements(dustem_sed) ne n_elements(dustem_polsed) then begin                            
        if n_elements(dustem_sed) gt n_elements(dustem_polsed) then begin 
      
            dustem_polsed_x = dustem_polsed
            dustem_sed_x = dustem_polsed ;meaning dustem_sed needs to be modified
      
            nwaves = n_elements(dustem_polsed)
      
      
              for i=0L,nwaves-1 do begin
      
0068116a   Ilyes Choubani   General update + ...
176
                  j=where((*(*!dustem_data).sed).wav EQ (*(*!dustem_data).polfrac).wav(i),testwav)
fcb6eade   Ilyes Choubani   general update - ...
177
178
179
180
181
182
183
184
185
186
187
188
                  if testwav ne 0 then dustem_sed_x(i) = dustem_sed(j(0))                                    
      
              endfor
      
        endif ELSE begin
        
            dustem_polsed_x = dustem_sed
            dustem_sed_x = dustem_sed ;meaning dustem_polsed needs to be modified
        
            nwaves = n_elements(dustem_sed)
        
            for i=0L,nwaves-1 do begin
0068116a   Ilyes Choubani   General update + ...
189
                j=where((*(*!dustem_data).sed).wav EQ (*(*!dustem_data).polfrac).wav(i),testwav)
fcb6eade   Ilyes Choubani   general update - ...
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
                if testwav ne 0 then dustem_polsed_x(i) = dustem_polsed(j(0))                                    
            endfor
          
        
        ENDELSE
    
    endif ELSE BEGIN
        
        dustem_polsed_x = dustem_polsed 
        dustem_sed_x = dustem_sed
    
    ENDELSE
    
    dustem_polfrac = dustem_polsed_x/dustem_sed_x 
	       
ENDIF

452c334e   Ilyes Choubani   Implementation Of...
207

427f1205   Jean-Michel Glorian   version 4.2 merged
208
209
210
211
212
213
214
;clean pointers
heap_gc

the_end:

RETURN,dustem_polsed

759a527d   Ilyes Choubani   general update
215
END