dustem_read_cb19_stellar_templates.pro 5.01 KB
FUNCTION dustem_read_cb19_stellar_templates,age_values=age_values $
											,metalicity_values=metalicity_values $
											,template_wav=template_wav $
											,Mstars=Mstars $
											,info_only=info_only $
											,info_st=info_st $
											,help=help

;+
; NAME:
;    dustem_read_cb19_stellar_templates
; PURPOSE:
;    reads EMILES stellar population templates
; CATEGORY:
;    DustEMWrap, Distributed, High-Level, User Example
; CALLING SEQUENCE:
;    templates=dustem_read_cb19_stellar_templates([age_values=][,metalicity_values=][,template_waves=][,Mstars=][,/info_only][,info_st=][,/help])
; INPUTS:
;    age_values : array of age values
;    metalicity_values : array of metalicity values
; OPTIONAL INPUT PARAMETERS:
;    None
; OUTPUTS:
;    templates   : SSP templates (F_lambda) [Lsun Msun^-1 A^-1]
; OPTIONAL OUTPUT PARAMETERS:
;    template_wav  = common wavelength array for templates [Angstroem]
;    Mstars        = Mass of stars [Msun]
;    info_st       = info structure for the templates
; ACCEPTED KEY-WORDS:
;    info_only   : if set, read only the information structure
;    help        : if set, prints this help
; COMMON BLOCKS:
;    None
; SIDE EFFECTS:
;    None
; RESTRICTIONS:
;    The DustEM fortran code must be installed
;    The DustEMWrap IDL code must be installed
; PROCEDURES AND SUBROUTINES USED:
;    
; EXAMPLES
;    st=dustem_read_cb19_stellar_templates(age_values=age_values,metalicity_values=metalicity_values,template_wav=template_wav)
; 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_read_cb19_stellar_templates'
  templates=-1
  goto,the_end
END

;=== This is what we want
age_values_wanted=[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_wanted=[-1.48630, -0.961400, -0.351200, +0.0600000, +0.255900, +0.397100]
NagesWanted=n_elements(age_values_wanted)
NZWanted=n_elements(metalicity_values_wanted)

;=== This is what we have
Z=[0.0001, 0.0002, 0.0005, 0.001, 0.002, 0.004, 0.006, 0.008, 0.010, 0.014, 0.017, 0.020, 0.030, 0.040, 0.060]
;la métallicité solaire pour ce set étant: Z=0.01524, et donc ces modèles vont en gros de [Z/Zo]= -2.18 à +0.59
Z0=0.01524
Z=alog10(Z/Z0)
;print,Z
;     -2.18299     -1.88196     -1.48401     -1.18298    -0.881955    -0.580925    -0.404834    -0.279895    -0.182985   -0.0368569    0.0474640     0.118045     0.294136     0.419075     0.595166
NZ=n_elements(Z)

dir_templates=!phangs_data_dir+'/ISRF/SSPs/CB2019/CB19_Chabrier/Mu100/'
;dir_templates=!dustem_wrap_soft_dir+'/Data/SSPs/CB2019/CB19_Chabrier/Mu100/'
files=file_search(dir_templates+'*.fits')
Nfiles=n_elements(files)
;metalicities=fltarr(Nfiles)
;ffile=strarr(Nfiles)
;FOR i=0L,Nfiles-1 DO BEGIN
;	file=files[i]
;	pos=strposmulti(file,'/')
;	ffile[i]=strmid(file[i],pos[n_elements(pos)-1]+1,1000)
;	pos=strposmulti(ffile[i],'_')
;	metalicities[i]=float(strmid(ffile[i],pos[0]+2,pos[1]-pos[0]-2))
;	stop
;	;metalicities[i]=
;ENDFOR

;read one fits file for header infos
file=dir_templates+'cb2019_z001_chab_hr_xmilesi_ssp.fits'
d=mrdfits(file,1,h)
wavs=d.wavelength
tagnames=tag_names(d)
ages=tagnames[1:*]
Nages=n_elements(ages)
ages=strmid(ages,1,1000)
aages=fltarr(Nages)
FOR i=0L,Nages-1 DO BEGIN
	pos=strposmulti(ages[i],'P',count)
	IF count NE 0 THEN BEGIN
		aages[i]=float(textoidl_str_replace(ages[i],'P','.'))/1.e9   ;Gyr
	ENDIF
ENDFOR
ages=aages
Nages=n_elements(ages)

all_ssps=ptrarr(NZ,Nages)
FOR i=0L,Nfiles-1 DO BEGIN
    st=mrdfits(files[i],1,h)
    FOR j=0L,Nages-1 DO BEGIN
    	all_ssps[i,j]=ptr_new(st.(j+1))
    ENDFOR
ENDFOR

;interpolate on requested age an metalicities
Ntemplates=NagesWanted*NZWanted
templates=ptrarr(Ntemplates)
FOR i=0L,Ntemplates-1 DO BEGIN
	ij=index2ij([i],[NagesWanted,NZWanted])
	iage=ij[0,0]
	imet=ij[0,1]
	age=age_values_wanted[iage]
	met=metalicity_values_wanted[imet]
	;==== CAUTION, this is nearest neighbour interpolation
	dist_age=abs(age-ages)
	dist_Z=abs(met-Z)
	ind_age=where(dist_age EQ min(dist_age))
	ind_Z=where(dist_Z EQ min(dist_Z))
	templates[i]=all_ssps[ind_Z[0],ind_age[0]]
	;print,ind_age[0],ind_Z[0]
	;==== This is nearest neighbour on age and interpolation on Z
	ssps_used=all_ssps[*,ind_age[0]]
	xx=indgen(Nz)
  toto=interpol(xx,Z,met)
  u1=abs(toto-round(toto))
  u2=abs(toto-fix(toto))
  ;print,round(toto),toto,fix(toto)
  ;print,1.-u1,1.-u2
  templates[i]=ptr_new((*ssps_used[round(toto)])*(1.-u1) + (*ssps_used[fix(toto)])*(1.-u2))
	;stop
ENDFOR

age_values=age_values_wanted
metalicity_values=metalicity_values_wanted

;print,age_values
;print,metalicity_values

;stop

angstroem2mic=1.e6/1.e10
template_wav=wavs*angstroem2mic   ;mic

;do_interpol=1L

;IF do_interpol THEN BEGIN
	;stop
	lambir=dustem_get_wavelengths()
	FOR i=0L,Ntemplates-1 DO BEGIN
		;ind=where(lambir LE max(template_wav) AND lambir GE min(template_wav),count)
		templates[i]=ptr_new(interpol(*templates[i],template_wav,lambir))
	ENDFOR
	template_wav=lambir
;ENDIF

the_end:

RETURN,templates

END