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