dustem_set_data.pro 11.6 KB
FUNCTION dustem_set_data,st_sed_fit=st_sed_fit,st_sed_show=st_sed_show,st_ext_fit=st_ext_fit,st_ext_show=st_ext_show,rchi2_weight=rchi2_weight,f_HI=f_HI,help=help


;update the help


;+
; NAME:
;    dustem_set_data
; PURPOSE:
;    Initializes the dustem data structure (!dustem_data)
; CATEGORY:
;    Dustem
; CALLING SEQUENCE:
;    dustem_set_data(data_sed=data_sed,data_ext=data_ext,[/help])
; INPUTS:
;    spec: array of structures containing a SED
; OPTIONAL INPUT PARAMETERS:
;    None
; OUTPUTS:
;    None
; OPTIONAL OUTPUT PARAMETERS:
;    None
; ACCEPTED KEY-WORDS:
;    help      = If set print this help
; COMMON BLOCKS:
;    None
; SIDE EFFECTS:
;    initializes !dustem_data
;    wavelengths are forced to be the central filter wavelength for
;    photometric data
; RESTRICTIONS:
;    The dustem idl wrapper must be installed
; PROCEDURE:
;    None
; EXAMPLES
;    dustem_init
;    dir=getenv('DUSTEM_SOFT_DIR')+'/src/dustem3.8_web/SEDs/'
;    file=dir+'Gal_composite_spectrum.xcat'
;    spec=read_xcat(file,/silent)
;    dustem_set_data,spec
; MODIFICATION HISTORY:
;    Written by J.-Ph. Bernard
;    see evolution details on the dustem cvs maintained at CESR
;    Contact J.-Ph. Bernard (Jean-Philippe.Bernard@cesr.fr) in case of problems.
; 
;    V. Guillet (2012) : dustem_set_data is turned into a function which can be used 
;                        indifferently for sed, ext, polext
;    I. Choubani (2022): Introducing the dustem_check_data procedure where the new format outlined by the latest release is taken into account.
;    This function uses two main input structures: DATA_SED and DATA_EXT. Polarization data is included within each. 
;-


IF keyword_set(help) THEN BEGIN
  doc_library,'dustem_set_data'
  goto,the_end
ENDIF

;Cleaninig data/showing structure 
for i=0L,n_tags(!dustem_data)-1 do begin
    !dustem_data.(i) = ptr_new()
    !dustem_show.(i) = ptr_new()
endfor

xx=dustem_check_data(data_sed=st_sed_fit,data_ext=st_ext_fit,sed=sed,ext=ext,polext=polext,polsed=polsed,polfrac=polfrac,psi_em=psi_em,qsed=qsed,used=used,qext=qext,uext=uext,psi_ext=psi_ext)    

;outputs whatever the input structure has, into organized seperate structures formatted for the fitting process.

;If SED/EXT data is present in the structure it is fitted automatically. 
;If the user wished to not fit it they will have to null the corresponding fields in the input fitting structure. 
IF isa(sed) THEN !dustem_data.sed = ptr_new(sed)
IF isa(ext) THEN !dustem_data.ext = ptr_new(ext)

 
;####################
;OLD VARIABLE. KEPT IT.
; If f_HI is specified, multiply the data by f_HI
If keyword_set(f_HI) and ptr_valid(!dustem_data.sed) then begin
    if f_HI gt 0 then (*!dustem_data.sed).values *= f_HI else f_HI = 1.
endif else f_HI = 1.
if keyword_set(f_HI) and ptr_valid(!dustem_data.ext) then begin
    if f_HI gt 0 then (*!dustem_data.ext).values *= f_HI else f_HI = 1.
endif else f_HI = 1.
defsysv,'!dustem_f_HI',f_HI
;####################

;NOTA BENE: The user is bound to fit Q and U together.
if !run_pol then begin
    
    if keyword_set(st_sed_fit) then begin
    
        teststks = isa(qsed) and isa(used)
    
        IF (not teststks)  then message, 'Stokes parameters are not set correctly. Please check the input structure. Aborting...'
    
        ;EMISSION 
        if teststks then nowfitting = 'QSED and USED' 
        
        message, 'Polarization component(s) to fit: '+nowfitting ,/continue

        IF isa(qsed) THEN BEGIN        
            !dustem_data.qsed = ptr_new(qsed)
            if keyword_set(f_HI) then if f_HI gt 0 then $
          	(*!dustem_data.qsed).values *= f_HI
        ENDIF    
        if isa(used) then BEGIN
            !dustem_data.used = ptr_new(used)
            if keyword_set(f_HI) then if f_HI gt 0 then $
          	(*!dustem_data.used).values *= f_HI
        ENDIF
    endif
    
    if keyword_set(st_ext_fit) then begin
        ;Two tests that determine what the user will eventually fit
        
        testexstks = isa(qext) and isa(uext)
        testpexstks = (isa(qext) and isa(uext) and isa(polext))
        
        IF (not testexstks and not isa(polext)) then message, 'Extinction stokes parameters/Polarization data is not set correctly. Please check the input structure. Aborting...'
        
        IF testpexstks THEN $
        message, 'Presence of both extinction polarization and stokes parameter values. Fitting structure is not correctly filtered. Aborting...'
        
        ;EXTINCTION - allowed for the default fitting of both because I do not know if the same formalism should be applied to the extinction data because it also implies deviding extinction data into two components. 
        if testexstks then nowfitting = 'QEXT and UEXT' else begin ;Serkowski is default
            if isa(polext) then nowfitting = 'POLEXT'      
        endelse
        
        message, 'Extinction polarization component(s) to fit: '+nowfitting ,/continue
        if isa(polext) then BEGIN        
            !dustem_data.polext = ptr_new(polext)
            if keyword_set(f_HI) then if f_HI gt 0 then $
           	(*!dustem_data.polext).values *= f_HI
        ENDIF
        IF isa(qext) THEN BEGIN        
            !dustem_data.qext = ptr_new(qext)
            if keyword_set(f_HI) then if f_HI gt 0 then $
           	(*!dustem_data.qext).values *= f_HI
        ENDIF
        if isa(uext) then BEGIN 
            !dustem_data.uext = ptr_new(uext)
            if keyword_set(f_HI) then if f_HI gt 0 then $
           	(*!dustem_data.uext).values *= f_HI
        ENDIF
    endif
endif


if not keyword_set(st_sed_show) then st_sed_show=st_sed_fit

;Setting of the structure that will be displayed
yy=dustem_check_data(data_sed=st_sed_show,data_ext=st_ext_show,sed=sed,ext=ext,polext=polext,polsed=polsed,polfrac=polfrac,qsed=qsed,used=used,qext=qext,uext=uext)

IF isa(sed) THEN !dustem_show.sed = ptr_new(sed)
IF isa(ext) THEN !dustem_show.ext = ptr_new(ext)

  
;####################
;OLD VARIABLE. KEPT IT.
; If f_HI is specified, multiply the data by f_HI
If keyword_set(f_HI) and ptr_valid(!dustem_show.sed) then begin
    if f_HI gt 0 then (*!dustem_show.sed).values *= f_HI else f_HI = 1.
endif else f_HI = 1.
if keyword_set(f_HI) and ptr_valid(!dustem_show.ext) then begin
    if f_HI gt 0 then (*!dustem_show.ext).values *= f_HI else f_HI = 1.
endif else f_HI = 1.
defsysv,'!dustem_f_HI',f_HI
;####################

if !run_pol then begin
    
    if isa(st_sed_show) then begin ; because sometimes this keyword isn't set.
        
        teststks = isa(qsed) and isa(used)
        
        IF (not teststks and not isa(polsed)) or (not teststks and not isa(polfrac)) then message, 'Stokes parameters/Polarization data is not set correctly. Please check the input structure. Aborting...'
        
        if teststks and isa(polsed) and not (isa(polfrac)) and not(isa(psi_em)) then nowshowing = 'QSED, USED and POLSED'
        if teststks and isa(polsed) and not(isa(polfrac)) and isa(psi_em) then nowshowing = 'QSED, USED, POLSED and PSI_EM'
        if teststks and not(isa(polsed)) and isa(polfrac) and not(isa(psi_em)) then nowshowing = 'QSED, USED and POLFRAC'
        if teststks and not(isa(polsed)) and isa(polfrac) and isa(psi_em) then nowshowing = 'QSED, USED, POLFRAC and PSI_EM'
        if teststks and not(isa(polsed)) and not(isa(polfrac)) and not(isa(psi_em)) then nowshowing = 'QSED and USED'
        if teststks and isa(polsed) and isa(polfrac) and not(isa(psi_em)) then nowshowing = 'QSED, USED, POLSED and POLFRAC'
        if teststks and isa(polsed) and isa(polfrac) and isa(psi_em) then nowshowing = 'QSED, USED, POLFRAC, POLSED and PSI_EM'
        if teststks and not(isa(polsed)) and not(isa(polfrac)) and isa(psi_em) then nowshowing = 'QSED, USED and PSI_EM'
        

        message, 'Polarization component(s) to show: '+nowshowing ,/continue
        
        
        If isa(polsed) then BEGIN    ;Apply changes to !dustem_data here.      
            !dustem_show.polsed = ptr_new(polsed)
            if keyword_set(f_HI) then if f_HI gt 0 then $
           	(*!dustem_show.polsed).values *= f_HI
        ENDIF
        If isa(polfrac) then BEGIN        
            !dustem_show.polfrac = ptr_new(polfrac)
            if keyword_set(f_HI) then if f_HI gt 0 then $
           	(*!dustem_show.polfrac).values *= f_HI
        ENDIF
        IF isa(qsed) THEN BEGIN        
            !dustem_show.qsed = ptr_new(qsed)
            if keyword_set(f_HI) then if f_HI gt 0 then $
           	(*!dustem_show.qsed).values *= f_HI
        ENDIF    
        if isa(used) then BEGIN
            !dustem_show.used = ptr_new(used)
            if keyword_set(f_HI) then if f_HI gt 0 then $
           	(*!dustem_show.used).values *= f_HI
        ENDIF
        if isa(psi_em) then BEGIN
            !dustem_show.psi_em = ptr_new(psi_em)
            if keyword_set(f_HI) then if f_HI gt 0 then $
            (*!dustem_show.psi_em).values *= f_HI
        ENDIF        
    endif
    if isa(st_ext_show) then begin
        teststks = isa(qext) and isa(uext)
        
        IF (not teststks and not isa(polext)) then message, 'Extinction stokes parameters/Polarization data is not set correctly. Please check the input structure. Aborting...'
        
        if teststks and isa(polext) and not(isa(psi_ext)) then nowshowing = 'QEXT, UEXT and POLEXT'
        if teststks and isa(polext) and isa(psi_ext) then nowshowing = 'QEXT, UEXT, POLEXT and PSI_EXT'
        if teststks and not(isa(polext)) and isa(psi_ext) then nowshowing = 'QEXT,UEXT and PSI_EXT' 
        if teststks and not(isa(polext)) and not(isa(psi_ext)) then nowshowing = 'QEXT and UEXT'
        
        message, 'Polarization component(s) to show: '+nowshowing ,/continue
        
        ;EXTINCTION
        if isa(polext) then BEGIN        
            !dustem_show.polext = ptr_new(polext)
            if keyword_set(f_HI) then if f_HI gt 0 then $
           	(*!dustem_show.polext).values *= f_HI
        ENDIF
        IF isa(qext) THEN BEGIN        
            !dustem_show.qext = ptr_new(qext)
            if keyword_set(f_HI) then if f_HI gt 0 then $
           	(*!dustem_show.qext).values *= f_HI
        ENDIF
        if isa(uext) then BEGIN 
            !dustem_show.uext = ptr_new(uext)
            if keyword_set(f_HI) then if f_HI gt 0 then $
           	(*!dustem_show.uext).values *= f_HI
        ENDIF
        if isa(psi_ext) then BEGIN 
            !dustem_show.psi_ext = ptr_new(psi_ext)
            if keyword_set(f_HI) then if f_HI gt 0 then $
           	(*!dustem_show.psi_ext).values *= f_HI
        ENDIF
    endif
endif

IF keyword_set(rchi2_weight) THEN BEGIN
	!fit_rchi2_weight.sed     = rchi2_weight.sed
	!fit_rchi2_weight.ext     = rchi2_weight.ext
	
	IF !run_pol THEN BEGIN
    	;IF isa(polsed) THEN !fit_rchi2_weight.polsed  = rchi2_weight.polsed
    	;IF isa(polfrac) THEN !fit_rchi2_weight.polfrac = rchi2_weight.polfrac
    	IF isa(qsed) THEN !fit_rchi2_weight.qsed  = rchi2_weight.qsed
    	IF isa(used) THEN !fit_rchi2_weight.used  = rchi2_weight.used
    	
    	IF isa(polext) THEN !fit_rchi2_weight.polext  = rchi2_weight.polext
    	IF isa(qext) THEN !fit_rchi2_weight.qext  = rchi2_weight.qext
    	IF isa(uext) THEN !fit_rchi2_weight.uext  = rchi2_weight.uext
    ENDIF
    
ENDIF ELSE BEGIN

    !fit_rchi2_weight.sed=1.
    !fit_rchi2_weight.ext=1.
    
    If !run_pol THEN BEGIN
        ;IF isa(polsed) THEN !fit_rchi2_weight.polsed=1.
        ;IF isa(polfrac) THEN !fit_rchi2_weight.polfrac=1.
        IF isa(qsed) THEN !fit_rchi2_weight.qsed=1.
        IF isa(used) THEN !fit_rchi2_weight.used=1.
        IF isa(polext) THEN !fit_rchi2_weight.polext=1.
        IF isa(qext) THEN !fit_rchi2_weight.qext=1.
        IF isa(uext) THEN !fit_rchi2_weight.uext=1.
    ENDIF

ENDELSE


the_end:

;stop
return,0.





END