Blame view

src/idl/dustem_plugin_modify_dust_polx.pro 3.35 KB
ff75b39d   Ilyes Choubani   minor update
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
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
       
01612ee4   Ilyes Choubani   General update: I...
41

ff75b39d   Ilyes Choubani   minor update
42
IF keyword_set(scope) THEN BEGIN
91e991b5   Ilyes Choubani   Applying correcti...
43
    
ff75b39d   Ilyes Choubani   minor update
44
    out=0.
91e991b5   Ilyes Choubani   Applying correcti...
45
    GOTO, the_end
ff75b39d   Ilyes Choubani   minor update
46
47
48
ENDIF 

IF keyword_set(paramtag) THEN BEGIN
91e991b5   Ilyes Choubani   Applying correcti...
49
    
ff75b39d   Ilyes Choubani   minor update
50
    out=0.
91e991b5   Ilyes Choubani   Applying correcti...
51
    GOTO, the_end
ff75b39d   Ilyes Choubani   minor update
52
53
ENDIF 

01612ee4   Ilyes Choubani   General update: I...
54
55
56
;Retrieving this system variable (dustem output) 
IF isa(!dustem_current) then st=*!dustem_current else out=0 & goto, the_end

ff75b39d   Ilyes Choubani   minor update
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
;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

ff75b39d   Ilyes Choubani   minor update
109
110
111
112

RETURN, out

the_end:
91e991b5   Ilyes Choubani   Applying correcti...
113
114
115
scope='REPLACE_POLEXT'
paramtag=['p','Psi (deg)']

ff75b39d   Ilyes Choubani   minor update
116
117

END