dustem_plugin_phangs_stellar_continuum.pro 9.47 KB
FUNCTION dustem_plugin_phangs_stellar_continuum,key=key $
                                			   			 ,val=val $
                                			   			 ,scope=scope $
                                			   			 ,paramtag=paramtag $
                                			   			 ,age_values=age_values $
                                			   			 ,metalicity_values=metalicity_values $
                                			   			 ,paramdefault=paramdefault $
;                                			   			 ,object_distance=object_distance $    ;not used
                                			   			 ,Voronoi_Npix=Voronoi_Npix $
                                			   			 ,help=help
;+
; NAME:
;    dustem_plugin_phangs_stellar_continuum
; PURPOSE:
;    DustEMWrap plugin to add EMILES stellar template emission to Dustemwrap SEDs
; CATEGORY:
;    DustEM, Distributed, Mid-Level, Plugin
; CALLING SEQUENCE:
;    stellar_continuum=dustem_plugin_phangs_stellar_continuum([,key=][,val=][,scope=][,paramtag=][paramdefault=][,/help])
; INPUTS:
;    None
; OPTIONAL INPUT PARAMETERS:
;    key  = input parameter number
;					  First parameter: Amplitude factor for the emission
;           Second parameter: E(B-V) for extinction to stars applied to the template, as used in Phangs
;           Following 13*6 parameters are weights by which to multiply the MILES templates [Msun/pc^2]
;    val  = corresponding input parameter value
; OUTPUTS:
;    stellar_continuum = stellar continuum spectrum resampled on dustem wavelengths [MJy/sr]
; OPTIONAL OUTPUT PARAMETERS:
;    scope = if set, return the scope of the plugin
;    paramdefault = default values of parameters
;    paramtag = if set, return the return plugin parameter names as strings
; ACCEPTED KEY-WORDS:
;    help                  = if set, print this help
;    method                = SSP used. can be EMILES or CB19. default='EMILES'
; COMMON BLOCKS:
;    None
; SIDE EFFECTS:
;    None
; RESTRICTIONS:
;    The DustEMWrap IDL code must be installed
; PROCEDURE:
;    This is a DustEMWrap plugin for phangs
;    It differs from dustem_plugin_emiles_stellar_continuum.pro only by the way the extinction is applied to the output spectrum
; EXAMPLES
;    dustem_init
;    vec=dustem_plugin_phangs_stellar_continuum(scope=scope)
; MODIFICATION HISTORY:
;    Written by JPB June 2023
;    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_phangs_stellar_continuum'
  output=0.
  goto,the_end
ENDIF

IF keyword_set(scope) THEN BEGIN
    scope='ADD_SED' 
    out=0
    goto, the_scope
ENDIF 

;use_method='EMILES'
use_method='CB19'

age_values=[0.03, 0.05, 0.08, 0.15, 0.25, 0.40, 0.60, 1.0, 1.75, 3.0, 5.0, 8.5, 13.5]
metalicity_values=[-1.48630, -0.961400, -0.351200, +0.0600000, +0.255900, +0.397100]

;==== This does not work because the info files has many more entries than there are available ssps.
;age_values=age_values_emiles
;metalicity_values=met_values_emiles
;This does not work either
;st_templates=read_muse_templates_info(age_values=age_values,metalicity_values=metalicity_values,Nbins=Nbins,Nage=Nage,NZ=Nmetalicity,bins=bins)
;print,age_values
;     0.030000000     0.050000000     0.080000000      0.15000000      0.25000000      0.40000000      0.60000000       1.0000000       1.7500000       3.0000000       5.0000000       8.5000000       13.500000
;print,metalicity_values
;     -1.49000    -0.960000    -0.350000    0.0600000     0.260000     0.400000

;stop

Nage=n_elements(age_values)
Nmetalicity=n_elements(metalicity_values)
Nparam=Nage*Nmetalicity+2    ;+2 is for Amplitude and E(B-V)

;==== define parameter tags
IF keyword_set(paramtag) THEN BEGIN
	paramtag=strarr(Nparam)
	paramtag[0]='Amplitude'
	paramtag[1]='E(B-V)'
	FOR i=2L,Nparam-1 DO BEGIN
		ij=index2ij([i-2],[Nage,Nmetalicity])
		paramtag[i]='Age'+strtrim(ij[0,0],2)+'Met'+strtrim(ij[0,1],2)
	ENDFOR
	GOTO,the_paramtag
ENDIF

paramdefault=dblarr(Nparam)
paramdefault[*]=0.D0         ;default parameter values is 0.

;==== decode key keyword. 
;stop
paramvalues=paramdefault
IF keyword_set(key) THEN BEGIN
  ind=where(key EQ 1,count)
  IF count NE 0 THEN paramvalues[0]=val[ind[0]]
  FOR i=1L,Nparam-1 DO BEGIN
  	ind=where(key EQ i+1,count)
  	IF count NE 0 THEN paramvalues[i]=val[ind[0]]
  ENDFOR
ENDIF

;==== initialize templates if not already present
defsysv,'!dustem_plugin_phangs_stellar_continuum',exist=exist
IF exist EQ 0 THEN BEGIN
	st={ssps:ptr_new(),wavs:ptr_new(),Mstars:ptr_new(),mstars_o_Lv:ptr_new(),Mstarprems:ptr_new()}
	defsysv,'!dustem_plugin_phangs_stellar_continuum',st
ENDIF
IF not ptr_valid(!dustem_plugin_phangs_stellar_continuum.ssps) THEN BEGIN
	message,'Initializing SSP templates',/info
	CASE use_method of
		'EMILES': BEGIN
			template_flux=dustem_read_emiles_stellar_templates(age_values,metalicity_values,template_wav=template_wav,Mstars=Mstars,Ms_o_Lv=Ms_o_Lv,Mstarprems=Mstarprems)
		END
		'CB19': BEGIN
			;== this is just to get the Mstars
			bidon=dustem_read_emiles_stellar_templates(age_values,metalicity_values,template_wav=template_wav,Mstars=Mstars,Ms_o_Lv=Ms_o_Lv,Mstarprems=Mstarprems)
			;== This is to read in the CB19 templates
			;== Note, templates are already interpolated on dustem wavelenghts (!)
			template_flux=dustem_read_cb19_stellar_templates(age_values=age_values,metalicity_values=metalicity_values,template_wav=template_wav);,Mstars=Mstars)
		END
	ENDCASE
	!dustem_plugin_phangs_stellar_continuum.ssps=ptr_new(template_flux)   ; in Lsun Msun^-1 A^-1
	!dustem_plugin_phangs_stellar_continuum.wavs=ptr_new(template_wav)
	!dustem_plugin_phangs_stellar_continuum.mstars=ptr_new(Mstars)
	!dustem_plugin_phangs_stellar_continuum.mstars_o_Lv=ptr_new(Ms_o_Lv)
	!dustem_plugin_phangs_stellar_continuum.mstarprems=ptr_new(Mstarprems)
ENDIF

;stop
use_Voronoi_Npix=1.   ;deg^2
IF keyword_set(Voronoi_Npix) THEN use_Voronoi_Npix=Voronoi_Npix
;use_object_distance=1.   ;MPc
;IF keyword_set(object_distance) THEN use_object_distance=object_distance

;bin_surface_pc2=use_bin_surface*!pi^2/180.^2*(use_object_distance*1.e6)^2   ;surface in pc^2
;Npixfact=(1./(0.2/60./60.))^2        ;how much Muse pixels of 0.2 arcsec in 1 deg^2
;bin_surface_Npixmuse=use_bin_surface*Npixfact

lambir=dustem_get_wavelengths()
Nwavs=n_elements(lambir)
output=dblarr(Nwavs,3)
wavs=*!dustem_plugin_phangs_stellar_continuum.wavs
Mstars=*!dustem_plugin_phangs_stellar_continuum.mstars
Ms_o_Lv=*!dustem_plugin_phangs_stellar_continuum.mstars_o_Lv
Mstarprems=*!dustem_plugin_phangs_stellar_continuum.Mstarprems
;==== sum up the stellar spectrum
;stop
FOR i=2L,Nparam-1 DO BEGIN
	IF paramvalues[i] NE 0. THEN BEGIN
		;stop
		;only interpolate within the template wavelengths
		;ind=where(lambir LE max(wavs) AND lambir GE min(wavs),count)
		Mstar=Mstars[i-2]
		Mstarprem=Mstarprems[i-2]
		M_o_Lv=Ms_o_Lv[i-2]
		ssp=*(*!dustem_plugin_phangs_stellar_continuum.ssps)[i-2]
		;output[*,0]=output[*,0]+paramvalues[i]*Mstar*ssp
		;==== below is trying to remove Mstar
		;output[*,0]=output[*,0]+paramvalues[i]*ssp
		;==== below is trying to multiply weights by L/M
		;output[*,0]=output[*,0]+paramvalues[i]/M_o_Lv*ssp*use_bin_surface
		;output[*,0]=output[*,0]+paramvalues[i]/M_o_Lv*ssp/use_bin_surface
		;output[*,0]=output[*,0]+paramvalues[i]*ssp*Mstar/(bin_surface_pc2)
		;output[*,0]=output[*,0]+paramvalues[i]*ssp*Mstar/(bin_surface_Npixmuse)
;		output[*,0]=output[*,0]+paramvalues[i]*ssp*Mstar/(use_Voronoi_Npix)
		output[*,0]=output[*,0]+paramvalues[i]*ssp*Mstarprem/(use_Voronoi_Npix)
		message,'Mstar='+strtrim(Mstar,2)+' paramvalue='+strtrim(paramvalues[i],2),/info
	ENDIF
ENDFOR
output[*,0]=output[*,0]*paramvalues[0]
;cgplot,wavs*1.e4,output[*,0],xrange=[4750,7000]
;stop
;flux=output[*,0]
;no polarization for now
;output[*,1]=0.
;output[*,2]=0. 

;==== Caution:
;output is Flambda in Lsun/pc2/AA
;at this point, output is unredenned 
;==== must be transformed into MJy/sr
Lsun2ergs=3.828e33
pc2_to_cm2=(3.0857e18)^2
fact1=Lsun2ergs/pc2_to_cm2
NHref=*!DUSTEM_HCD   ;NH dustemwrap reference [H/cm^2]
fact2=lambir*1.e4      ;[AA] to go from F_lambda in ergs/s/cm2/AA to Fnu ergs/s/cm2
fact3=1./NHref         ;[cm2/H] to go from ergs/s/cm2 to ergs/s/H
fact4=1.e4*(*!dustem_HCD)/(4.*!pi)/(3.e8/1.e-6/lambir)*1.e20/1.e7   ;This goes from ergs/s/H to MJy/sr (see dustem_plot_dataset)
;fact=fact2*fact3*fact4
fact=fact1*fact2*fact3*fact4

;print,'flux(1mic)=',interpol(flux,lambir,1.),' ergs/s/cm2/AA'
;print,'fact2=',interpol(fact2,lambir,1.)
;print,'fact3=',fact3
;print,'fact4=',interpol(fact4,lambir,1.)
;print,'fact=',interpol(fact,lambir,1.)
;print,'flux(1mic)=',interpol(flux,lambir,1.)*interpol(fact,lambir,1.),' MJy/sr'

;goto,no_unred

;==== reden spectrum using Calzetti's extinction law (which is what Phangs does)
;cgplot,lambir,flux,/xlog,/ylog
;factor -1 is to reden, instead of unreden. factor 1e4 is to go from microns to Angstroem
;This uses the prescription of Calzetti et al 2000. It is applied from 912AA to 2.2 mic, no correction applied before and beyound that.
;Note that the supplied color excess should be that derived for the stellar  continuum, EBV(stars), which (in Calzetti 2000) is related to the 
;reddening derived from the gas, EBV(gas), via the Balmer decrement by EBV(stars) = 0.44*EBV(gas)
calz_unred, lambir*1.e4, output[*,0], -1.*paramvalues[1], flux_red, R_V = R_V
;Note: we could actually use our own dustemwrap extinction curve to do that.
output[*,0]=flux_red

no_unred:

output[*,0]=output[*,0]*fact
;output[*,1]=output[*,1]*fact
;output[*,2]=output[*,2]*fact

;print,'output=',interpol(output[*,0],lambir,1.),' MJy/sr'
;stop

the_scope:

the_paramtag:

the_end:
RETURN,output
  
END