def mass_absorption_coefficient(element, energies): """ Mass absorption coefficient (mu/rho) of a X-ray absorbed in a pure material. The mass absorption is retrieved from the database of Chantler2005 Parameters ---------- element: str The element symbol of the absorber, e.g. 'Al'. energies: float or list of float or str or list of str The energy or energies of the X-ray in keV, or the name of the X-rays, e.g. 'Al_Ka'. Return ------ mass absorption coefficient(s) in cm^2/g Examples -------- >>> hs.material.mass_absorption_coefficient( >>> element='Al', energies=['C_Ka','Al_Ka']) array([ 26330.38933818, 372.02616732]) See also -------- hs.material.mass_absorption_mixture Note ---- See http://physics.nist.gov/ffast Chantler, C.T., Olsen, K., Dragoset, R.A., Kishore, A.R., Kotochigova, S.A., and Zucker, D.S. (2005), X-Ray Form Factor, Attenuation and Scattering Tables (version 2.1). """ energies_db = np.array(ffast_mac[element].energies_keV) macs = np.array(ffast_mac[element].mass_absorption_coefficient_cm2g) energies = copy.copy(energies) if isinstance(energies, str): energies = utils_eds._get_energy_xray_line(energies) elif hasattr(energies, '__iter__'): for i, energy in enumerate(energies): if isinstance(energy, str): energies[i] = utils_eds._get_energy_xray_line(energy) index = np.searchsorted(energies_db, energies) mac_res = np.exp(np.log(macs[index - 1]) + np.log(macs[index] / macs[index - 1]) * (np.log(energies / energies_db[index - 1]) / np.log(energies_db[index] / energies_db[index - 1]))) return np.nan_to_num(mac_res)
def _get_line_energy(self, Xray_line, FWHM_MnKa=None): """ Get the line energy and the energy resolution of a Xray line. The return values are in the same units than the signal axis Parameters ---------- Xray_line : strings Valid element X-ray lines e.g. Fe_Kb FWHM_MnKa: {None, float, 'auto'} The energy resolution of the detector in eV if 'auto', used the one in 'self.metadata.Acquisition_instrument.SEM.Detector.EDS.energy_resolution_MnKa' Returns ------- float: the line energy, if FWHM_MnKa is None (float,float): the line energy and the energy resolution, if FWHM_MnKa is not None """ units_name = self.axes_manager.signal_axes[0].units if FWHM_MnKa == 'auto': if self.metadata.Signal.signal_type == 'EDS_SEM': FWHM_MnKa = self.metadata.Acquisition_instrument.SEM.\ Detector.EDS.energy_resolution_MnKa elif self.metadata.Signal.signal_type == 'EDS_TEM': FWHM_MnKa = self.metadata.Acquisition_instrument.TEM.\ Detector.EDS.energy_resolution_MnKa else: raise NotImplementedError( "This method only works for EDS_TEM or EDS_SEM signals. " "You can use `set_signal_type(\"EDS_TEM\")` or" "`set_signal_type(\"EDS_SEM\")` to convert to one of these" "signal types.") line_energy = utils_eds._get_energy_xray_line(Xray_line) if units_name == 'eV': line_energy *= 1000 if FWHM_MnKa is not None: line_FWHM = utils_eds.get_FWHM_at_Energy( FWHM_MnKa, line_energy / 1000) * 1000 elif units_name == 'keV': if FWHM_MnKa is not None: line_FWHM = utils_eds.get_FWHM_at_Energy(FWHM_MnKa, line_energy) else: raise ValueError( "%s is not a valid units for the energy axis. " "Only `eV` and `keV` are supported. " "If `s` is the variable containing this EDS spectrum:\n " ">>> s.axes_manager.signal_axes[0].units = \'keV\' \n" % units_name) if FWHM_MnKa is None: return line_energy else: return line_energy, line_FWHM
def _get_line_energy(self, Xray_line, FWHM_MnKa=None): """ Get the line energy and the energy resolution of a Xray line. The return values are in the same units than the signal axis Parameters ---------- Xray_line : strings Valid element X-ray lines e.g. Fe_Kb FWHM_MnKa: {None, float, 'auto'} The energy resolution of the detector in eV if 'auto', used the one in 'self.metadata.Acquisition_instrument.SEM.Detector.EDS.energy_resolution_MnKa' Returns ------- float: the line energy, if FWHM_MnKa is None (float,float): the line energy and the energy resolution, if FWHM_MnKa is not None """ units_name = self.axes_manager.signal_axes[0].units if FWHM_MnKa == 'auto': if self.metadata.Signal.signal_type == "EDS_SEM": FWHM_MnKa = self.metadata.Acquisition_instrument.SEM.\ Detector.EDS.energy_resolution_MnKa elif self.metadata.Signal.signal_type == "EDS_TEM": FWHM_MnKa = self.metadata.Acquisition_instrument.TEM.\ Detector.EDS.energy_resolution_MnKa else: raise NotImplementedError( "This method only works for EDS_TEM or EDS_SEM signals. " "You can use `set_signal_type(\"EDS_TEM\")` or" "`set_signal_type(\"EDS_SEM\")` to convert to one of these" "signal types.") line_energy = utils_eds._get_energy_xray_line(Xray_line) if units_name == 'eV': line_energy *= 1000 if FWHM_MnKa is not None: line_FWHM = utils_eds.get_FWHM_at_Energy( FWHM_MnKa, line_energy / 1000) * 1000 elif units_name == 'keV': if FWHM_MnKa is not None: line_FWHM = utils_eds.get_FWHM_at_Energy( FWHM_MnKa, line_energy) else: raise ValueError( "%s is not a valid units for the energy axis. " "Only `eV` and `keV` are supported. " "If `s` is the variable containing this EDS spectrum:\n " ">>> s.axes_manager.signal_axes[0].units = \'keV\' \n" % units_name) if FWHM_MnKa is None: return line_energy else: return line_energy, line_FWHM