FUNCTION dustem_set_data,m_fit=m_fit,m_show=m_show,x_fit=x_fit,x_show=x_show,rchi2_weight=rchi2_weight,f_HI=f_HI,help=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. ; Generation and setting of data sets that were not present in the initial xcat file but that the user wants to plot. ;- IF keyword_set(help) THEN BEGIN doc_library,'dustem_set_data' goto,the_end ENDIF ;Cleaninig fitting/showing structure(s) for i=0L,n_tags(!dustem_data)-1 do begin !dustem_data.(i) = ptr_new() !dustem_show.(i) = ptr_new() endfor ;#FITTING STRUCTURE xx=dustem_check_data(data_sed=m_fit,data_ext=x_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. ;FITTING STRUCTURE INITIALIZATION 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 ;#################### if !run_pol then begin if keyword_set(m_fit) then begin teststks = isa(qsed) and isa(used) IF ~teststks then message, 'Stokes parameters are not set correctly. Please check the input structure. Aborting...' ;☆EMISSION message, 'Polarization component(s) to fit: QSED and USED' ,/continue ;☆Mandatory presence in polar mode 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 ;☆Mandatory presence in polar mode 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 if isa(polsed) then BEGIN !dustem_data.polsed = ptr_new(polsed) if keyword_set(f_HI) then if f_HI gt 0 then $ (*!dustem_data.polsed).values *= f_HI ENDIF if isa(polfrac) then BEGIN !dustem_data.polfrac = ptr_new(polfrac) if keyword_set(f_HI) then if f_HI gt 0 then $ (*!dustem_data.polfrac).values *= f_HI ENDIF if isa(psi_em) then BEGIN !dustem_data.psi_em = ptr_new(psi_em) if keyword_set(f_HI) then if f_HI gt 0 then $ (*!dustem_data.psi_em).values *= f_HI ENDIF endif if keyword_set(x_fit) then begin ;Two tests that determine what the user will eventually fit testexstks = isa(qext) and isa(uext) IF ~testexstks then message, 'Extinction stokes parameters/Polarization data is not set correctly. Please check the input structure. 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. message, 'Extinction polarization component(s) to fit: QEXT and UEXT',/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 ;#SHOWING STRUCTURE if not keyword_set(m_show) then m_show=m_fit ;Setting of the structure that will be displayed yy=dustem_check_data(data_sed=m_show,data_ext=x_show,sed=sed,ext=ext,polext=polext,polsed=polsed,polfrac=polfrac,qsed=qsed,used=used,qext=qext,uext=uext,psi_em=psi_em,psi_ext=psi_ext) 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(m_show) then begin ; because sometimes this keyword isn't set. teststks = isa(qsed) and isa(used) IF (~teststks and ~isa(polsed)) or (~teststks and ~isa(polfrac)) then message, 'Stokes parameters/Polarization showing data is not set correctly. Please check the input structure. Aborting...' if teststks and isa(polsed) and ~(isa(polfrac)) and ~(isa(psi_em)) then nowshowing = 'QSED, USED and POLSED' if teststks and isa(polsed) and ~(isa(polfrac)) and isa(psi_em) then nowshowing = 'QSED, USED, POLSED and PSI_EM' if teststks and ~(isa(polsed)) and isa(polfrac) and ~(isa(psi_em)) then nowshowing = 'QSED, USED and POLFRAC' if teststks and ~(isa(polsed)) and isa(polfrac) and isa(psi_em) then nowshowing = 'QSED, USED, POLFRAC and PSI_EM' if teststks and ~(isa(polsed)) and ~(isa(polfrac)) and ~(isa(psi_em)) then nowshowing = 'QSED and USED' if teststks and isa(polsed) and isa(polfrac) and ~(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 ~(isa(polsed)) and ~(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(x_show) then begin teststks = isa(qext) and isa(uext) IF (~teststks) then message, 'Extinction stokes parameters/Polarization data is not set correctly. Please check the input structure. Aborting...' if teststks and isa(polext) and ~(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 ~(isa(polext)) and isa(psi_ext) then nowshowing = 'QEXT,UEXT and PSI_EXT' if teststks and ~(isa(polext)) and ~(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(qsed) THEN !fit_rchi2_weight.qsed = rchi2_weight.qsed IF isa(used) THEN !fit_rchi2_weight.used = rchi2_weight.used 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(qsed) THEN !fit_rchi2_weight.qsed=1. IF isa(used) THEN !fit_rchi2_weight.used=1. IF isa(qext) THEN !fit_rchi2_weight.qext=1. IF isa(uext) THEN !fit_rchi2_weight.uext=1. ENDIF ENDELSE ;Setting the data and wavelength tags in '!dustem_fit' ((*!dustem_fit).data)=ptr_new(!dustem_data) the_end: return,0. END