dustem_plugin_modify_dust_polx.pro 3.55 KB
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