dustem_plugin_modify_dust_polx.pro
3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
FUNCTION dustem_plugin_modify_dust_polx, key=key, val=val, scope=scope, paramtag=paramtag, help=help
;+
; NAME:
; dustem_plugin_modify_dust_polx
; PURPOSE:
; modifies stokes Q,U values for dust polarization in st according to the given keywords and values
; CATEGORY:
; DUSTEM Wrapper
; CALLING SEQUENCE:
; a=dustem_plugin_modify_dust_polx(st,[key=][val=][,scope=][,paramtag=][,/help])
; INPUTS:
; st = dustem structure
; OPTIONAL INPUT PARAMETERS:
; key = input parameter numbers (first = polarization fraction in %, default=1.%, second=polarization angle, default=0.)
; val = input parameter values
; OUTPUTS:
; out = array containing the stokes emission parameters associated to the dust/synchrotron component or a concatenated version for both
; OPTIONAL OUTPUT PARAMETERS:
; scope = if set, returns only the scope of the pluggin
; paramtag = if set, returns only the parameter tags
; ACCEPTED KEY-WORDS:
; help = if set, print this help
; COMMON BLOCKS:
; None
; SIDE EFFECTS:
; None
; RESTRICTIONS:
; The dustem fortran code must be installed
; The dustem idl wrapper must be installed
; PROCEDURE:
; This is a dustem plugin
;-
IF keyword_set(help) THEN BEGIN
doc_library,'dustem_plugin_modify_dust_polx'
out=0.
GOTO,the_end
ENDIF
IF keyword_set(scope) THEN BEGIN
out=0.
GOTO, the_end
ENDIF
IF keyword_set(paramtag) THEN BEGIN
out=0.
GOTO, the_end
ENDIF
;Retrieving this system variable (dustem output)
if ~isa(!dustem_current) then begin
out =0
goto, the_end
ENDIF else st=(*!dustem_current)
;below are the default values for the plugin parameters
smallp_fact=1. ;This is the default multiplicative factore to the dust polarization
psi=0. ;This is the default polarization angle
IF keyword_set(key) THEN BEGIN
ind1=where(key EQ 1,count1)
ind2=where(key EQ 2,count2)
IF count1 NE 0 THEN smallp_fact=val[ind1[0]] ; setting smallp from pd - this is another polarization fraction (constant) that is applied to the total dust emission
IF count2 NE 0 THEN psi=val[ind2[0]] & !dustem_psi_ext = psi ; setting psi from pd. !dustem_psi here helps for the plotting.
ENDIF
POLEXT_spec=((st.polext).ext_tot)* (*!dustem_HCD)/1.0e21 ;*fact ; This is the polarized emission P
EXT_spec=((st.ext).ext_tot)* (*!dustem_HCD)/1.0e21 ;*fact ; This is the total intensity emission I
Nwaves=(size(EXT_spec))[1]
IF !run_pol THEN BEGIN
;THIS FALSE CORRECT IT USING POLEXT_spec
;POLEXT_spec.abs_grain[2,*]
ind_ngtv_plxt = where (POLEXT_spec LT 0, ct_ngtv_plxt)
IF ct_ngtv_plxt NE 0 THEN (POLEXT_spec)[ind_ngtv_plxt] = 0.
ENDIF
;0/0 division in frac
;since we divide by I we only need to avoid its null indices
indx = where(EXT_spec ne 0, countx)
if countx ne 0 then frac_model = POLEXT_spec*0. & frac_model[indx] = POLEXT_spec[indx]/EXT_spec[indx] ;This is the polarization fraction in the model
frac_used=frac_model*smallp_fact
psi_used = replicate(psi,Nwaves)
polar_ippsi2iqu,EXT_spec,QEXT_spec,UEXT_spec,frac_used,psi_used
out=fltarr(Nwaves,3) ; modified this. This is the only plugin that has this number of outputs.
;degtorad = !pi/180
out[*,0]=EXT_spec
out[*,1]=QEXT_spec
out[*,2]=UEXT_spec
; out[*,3]=frac_used
; ;out[*,4]=0.5*atan(U,Q)/degtorad
; out[*,4]=psi_used
RETURN, out
the_end:
scope='REPLACE_POLEXT'
paramtag=['p','Psi (deg)']
END