FUNCTION dustem_read_emiles_stellar_templates,age_values, $ metalicity_values, $ template_wav=template_wav, $ Mstars=Mstars, $ Mstarprems=Mstarprems, $ Ms_o_Lv=Ms_o_Lv, $ info_only=info_only, $ info_st=info_st, $ help=help ;+ ; NAME: ; dustem_read_emiles_stellar_templates ; PURPOSE: ; reads EMILES stellar population templates ; CATEGORY: ; DustEMWrap, Distributed, High-Level, User Example ; CALLING SEQUENCE: ; templates=dustem_read_emiles_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] ; Ms_o_Lv = Mass of stars / Lv [Msun/Lsun] ; 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_emiles_stellar_templates(age_values,Z_values) ; 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_emiles_stellar_templates' templates=-1 goto,the_end END ;dir_templates=!dustem_wrap_soft_dir+'/Data/SSPs/ssp_emiles-ch/' dir_templates=!phangs_data_dir+'/ISRF/SSPs/ssp_emiles-ch_extended/' ;dir_templates=!dustem_wrap_soft_dir+'/Data/SSPs/ssp_emiles-ch_extended/' ;read templates info file ;IMF slope Z Age Mtotal M(*+remn) M* Mremn Mgas M(*+remn)/Lv M*/Lv Mv unknown file=dir_templates+'templates_info.txt' format='A,F,F,F,F,F,F,F,F,F,F,F,F' readcol,file,imf,slope,z,age,Mtot,Mstar_rem,Mstar,Mremn,Mgas,Mstar_rem_o_Lv,Mstar_o_Lv,Mv,unknown,format=format one_st={imf:'',slope:0.,z:0.,age:0.,Mtot:0.,Mstar_rem:0.,Mstar:0.,Mremn:0.,Mgas:0.,Mstar_rem_o_Lv:0.,Mstar_o_Lv:0.,Mv:0.,unknown:0.} info_st=replicate(one_st,n_elements(imf)) info_st.imf=imf info_st.slope=slope info_st.z=z info_st.age=age info_st.mtot=Mtot info_st.Mstar_rem=Mstar_rem info_st.Mstar=Mstar info_st.Mremn=Mremn info_st.Mgas=Mgas info_st.Mstar_rem_o_Lv=Mstar_rem_o_Lv info_st.Mstar_o_Lv=Mstar_o_Lv info_st.Mv=Mv info_st.unknown=unknown IF keyword_set(info_only) THEN BEGIN templates=info_st goto,the_end ENDIF ;stop ;file name format is ssp_emiles-ch/Ech1.30Zp0.40T13.5000_iTp0.00_baseFe_linear_FWHM_variable.fits ;=== producing age and metalicity strings for file names age_values_4str=string(age_values,format='(F7.4)') FOR i=0L,n_elements(age_values_4str)-1 DO age_values_4str[i]=textoidl_str_replace(age_values_4str[i],' ','0') metalicity_values_4str=round(metalicity_values*100.)/100. ;This is the array for metalicity values in fits files names metalicity_values_4str=string(metalicity_values_4str,format='(F5.2)') FOR i=0L,n_elements(metalicity_values_4str)-1 DO metalicity_values_4str[i]=textoidl_str_replace(metalicity_values_4str[i],' ','p') FOR i=0L,n_elements(metalicity_values_4str)-1 DO metalicity_values_4str[i]=textoidl_str_replace(metalicity_values_4str[i],'-','m') ;print,age_values ;print,metalicity_values ;stop ;Ntemplates=n_elements(paramvalues)-1 Ntemplates=n_elements(age_values)*n_elements(metalicity_values) Nage=n_elements(age_values) Nmetalicity=n_elements(metalicity_values) templates=ptrarr(Ntemplates) ;file names are like: Ech1.30Zm0.35T00.2500_iTp0.00_baseFe_linear_FWHM_variable.fits file_start='Ech1.30' file_end='_iTp0.00_baseFe_linear_FWHM_variable.fits' ii=0L Nage_str=6 Nmet_str=4 Mstarprems=fltarr(Ntemplates) ;M*+remnant Mstars=fltarr(Ntemplates) ;M* Ms_o_Lv=fltarr(Ntemplates) ;M*/Lv files_not_found=[''] FOR i=1L,Ntemplates DO BEGIN zsign_str='p' ij=index2ij([i-1],[Nage,Nmetalicity]) iage=ij[0,0] imet=ij[0,1] age=age_values[iage] met=metalicity_values[imet] met_str=metalicity_values_4str[imet] age_str=age_values_4str[iage] message,'reading template for Age '+age_str+' Met '+met_str,/info file=dir_templates+file_start+'Z'+met_str+'T'+age_str+file_end fi=file_info(file) IF fi.exists THEN BEGIN message,'Reading SSP '+file,/info spec=readfits(file,h,2) templates[ii]=ptr_new(spec) make_axis,h,wavs ind=where(info_st.z EQ met AND info_st.age EQ age,count) IF count EQ 0 THEN BEGIN message,'age,met not found in template info',/continue stop ENDIF ELSE BEGIN Mstarprems[i-1]=info_st[ind[0]].Mstar_rem Mstars[i-1]=info_st[ind[0]].Mstar Ms_o_Lv[i-1]=info_st[ind[0]].Mstar_o_Lv ;stop ENDELSE ENDIF ELSE BEGIN message,'file not found '+file,/continue files_not_found=[files_not_found,file] ENDELSE ii=ii+1 ENDFOR IF n_elements(files_not_found) NE 1 THEN BEGIN files_not_found=files_not_found[1:*] message,strmid(n_elements(files_not_found),2)+' SSP files were not found :',/continue hprint,files_not_found stop ENDIF ;Nspec=n_elements(spec) ;print,min(wavs),max(wavs) ; 3500.2000 12000.250 angstroem2mic=1.e6/1.e10 template_wav=wavs*angstroem2mic ;mic ;do_interpol=1L ;IF do_interpol THEN BEGIN 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