dustem_plugin_modify_dust_polx.pro
3.55 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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
FUNCTION dustem_plugin_modify_dust_polx, key=key, val=val, scope=scope, paramtag=paramtag, help=help
;+
; NAME:
; dustem_plugin_modify_dust_polx
;
; PURPOSE:
; modifies Extinction Stokes Q,U values for dust polarization in st according to the given keywords and values
;
; CATEGORY:
; DustEMWrap, Plugin, Mid-level, Distributed
;
; 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
;
; MODIFICATION HISTORY:
; Written by IC 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_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)
frac_model = POLEXT_spec*0.
if countx ne 0 then 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