Ejemplo n.º 1
0
def element(elem=None):
    edges = atomic = lines = {}
    if elem is not None:
        atomic = {
            'n': xraydb.atomic_number(elem),
            'mass': xraydb.atomic_mass(elem),
            'density': xraydb.atomic_density(elem)
        }
        _edges = xraydb.xray_edges(elem)
        _lines = xraydb.xray_lines(elem)
        lines = OrderedDict()
        for k in sorted(_lines.keys()):
            en, inten, init, final = _lines[k]  # XrayLine
            lines[k] = XrayLine(energy=f'{en:.1f}',
                                intensity=f'{inten:.5f}',
                                initial_level=init,
                                final_level=final)
        edges = OrderedDict()
        for k in sorted(_edges.keys()):
            en, fy, jump = _edges[k]  # XrayEdge
            edges[k] = XrayEdge(energy=f'{en:.1f}',
                                fyield=f'{fy:.5f}',
                                jump_ratio=f'{jump:.3f}')

    return render_template('elements.html',
                           edges=edges,
                           elem=elem,
                           atomic=atomic,
                           lines=lines,
                           materials_dict=materials_dict)
Ejemplo n.º 2
0
def test_emission_lines():
    cu_lines = xray_lines('Cu')
    for lname in ('Ka3', 'Ka2', 'Ka1', 'Kb3', 'Kb1', 'Kb5', 'Lb4', 'Lb3', 'Ln',
                  'Lb1', 'Ll', 'La2', 'La1'):
        assert (lname in cu_lines)

    assert cu_lines['Ka1'].energy > 8045.0
    assert cu_lines['Ka1'].energy < 8047.0
    assert cu_lines['Ka1'].initial_level == 'K'
    assert cu_lines['Ka1'].final_level == 'L3'
Ejemplo n.º 3
0
def darwinwidth(elem=None):
    edges = atomic = lines = {}
    if elem is not None:
        edges= xraydb.xray_edges(elem)
        atomic= {'n': xraydb.atomic_number(elem),
                 'mass': xraydb.atomic_mass(elem),
                 'density': xraydb.atomic_density(elem)}
        lines= xraydb.xray_lines(elem)
    return render_template('darwinwidth.html', edges=edges, elem=elem,
                           atomic=atomic, lines=lines, materials_dict=materials_dict)
Ejemplo n.º 4
0
def find_xray_line(z, edge):
    """
    Finds most intense X-ray emission line energy for a given element and edge.
    """
    intensity = 0
    line      = ''
    for key, value in xray_lines(z).items() :
        if value.initial_level == edge.upper():
            if value.intensity > intensity:
                intensity = value.intensity
                line      = key
    return xray_line(z, line[:-1])
Ejemplo n.º 5
0
def element(elem=None):
    edges = atomic = lines = {}
    if elem is not None:
        atomic= {'n': xraydb.atomic_number(elem),
                 'mass': xraydb.atomic_mass(elem),
                 'density': xraydb.atomic_density(elem)}
        _edges= xraydb.xray_edges(elem)
        _lines= xraydb.xray_lines(elem)
        lines = OrderedDict()
        for k in sorted(_lines.keys()):
            lines[k] = _lines[k]

        edges = OrderedDict()
        for k in sorted(_edges.keys()):
            edges[k] = _edges[k]
    return render_template('elements.html', edges=edges, elem=elem,
                           atomic=atomic, lines=lines, materials_dict=materials_dict)
Ejemplo n.º 6
0
def MakeFLlinesDictionary(sample_size, sample_size_l, element_name,
                          fl_lines_xdb, fl_lines, probe_energy, an_lib,
                          det_energy_u, n_det_energy_bins):
    voxel_size = sample_size_l / sample_size
    FL_dic = {'element': element_name}
    fl_cs_ls = xlib_np.CS_FluorLine_Kissel_Cascade(
        np.array([an_lib[element_name]]), fl_lines, probe_energy)
    i = 0
    detected_fl_unit_concentration = np.zeros((n_det_energy_bins * 2))
    det_energy_list_full = np.linspace(
        -det_energy_u + det_energy_u / n_det_energy_bins, det_energy_u,
        n_det_energy_bins * 2)
    for name, line in xdb.xray_lines(element_name).items():
        if name in set(fl_lines_xdb):
            idx_nearest, value_nearest = find_nearest(det_energy_list_full,
                                                      line[0])
            detected_fl_unit_concentration[idx_nearest] += fl_cs_ls[0, i][0]
            i += 1
    FL_dic['detected_fl_unit'] = detected_fl_unit_concentration * voxel_size
    return FL_dic
Ejemplo n.º 7
0
def test_xray_line():
    cuk = xray_line('Cu', 'K')
    assert_allclose(cuk.energy, 8039.626, rtol=0.001)
    assert_allclose(cuk.intensity, 0.8716833, rtol=0.001)
    assert cuk.final_level == 'L'

    cuka = xray_line('Cu', 'Ka1')
    assert_allclose(cuka.energy, 8046.3, rtol=0.001)
    assert_allclose(cuka.intensity, 0.5771, rtol=0.001)
    assert cuka.final_level == 'L3'

    ti_klines = xray_lines('Ti', 'K')
    for line in ('Ka1', 'Ka2', 'Ka3', 'Kb1', 'Kb3', 'Kb5'):
        assert ti_klines[line].initial_level == 'K'

    assert_allclose(ti_klines['Ka1'].energy, 4512.2, rtol=0.001)
    assert_allclose(ti_klines['Ka2'].energy, 4505.8, rtol=0.001)
    assert_allclose(ti_klines['Ka3'].energy, 4405.1, rtol=0.001)
    assert_allclose(ti_klines['Kb1'].energy, 4933.4, rtol=0.001)
    assert_allclose(ti_klines['Kb3'].energy, 4933.4, rtol=0.001)
    assert_allclose(ti_klines['Kb5'].energy, 4964.0, rtol=0.001)

    assert_allclose(ti_klines['Ka1'].intensity, 0.58455, rtol=0.001)
    assert_allclose(ti_klines['Ka2'].intensity, 0.29369, rtol=0.001)
    assert_allclose(ti_klines['Ka3'].intensity, 0.000235, rtol=0.01)
    assert_allclose(ti_klines['Kb1'].intensity, 0.07965, rtol=0.001)
    assert_allclose(ti_klines['Kb3'].intensity, 0.04126, rtol=0.001)
    assert_allclose(ti_klines['Kb5'].intensity, 0.000607, rtol=0.01)
    assert_allclose(ti_klines['Ka1'].intensity, 0.58455, rtol=0.001)

    assert ti_klines['Ka1'].final_level == 'L3'
    assert ti_klines['Ka2'].final_level == 'L2'
    assert ti_klines['Ka3'].final_level == 'L1'
    assert ti_klines['Kb1'].final_level == 'M3'
    assert ti_klines['Kb3'].final_level == 'M2'
    assert ti_klines['Kb5'].final_level == 'M4,5'
Ejemplo n.º 8
0
    def __init__(self,
                 symbol,
                 xray_energy=None,
                 energy_min=1.5,
                 overlap_energy=None):
        self.symbol = symbol
        self.xray_energy = xray_energy
        self.mu = 1.0
        self.edges = ['K']
        self.fyields = {}
        if xray_energy is not None:
            self.mu = mu_elam(symbol, 1000 * xray_energy, kind='photo')

            self.edges = []
            for ename, xedge in xray_edges(self.symbol).items():
                if ename.lower() in ('k', 'l1', 'l2', 'l3', 'm5'):
                    edge_kev = 0.001 * xedge.energy
                    if (edge_kev < xray_energy and edge_kev > energy_min):
                        self.edges.append(ename)
                        self.fyields[ename] = xedge.fyield

        # currently, we consider only one edge per element
        if 'K' in self.edges:
            self.edges = ['K']
        if 'L3' in self.edges:
            tmp = []
            for ename in self.edges:
                if ename.lower().startswith('l'):
                    tmp.append(ename)
            self.edges = tmp

        # apply CK corrections to fluorescent yields
        if 'L3' in self.edges:
            nlines = 1.0
            ck13 = ck_probability(symbol, 'L1', 'L3')
            ck12 = ck_probability(symbol, 'L1', 'L2')
            ck23 = ck_probability(symbol, 'L2', 'L3')
            fy3 = self.fyields['L3']
            fy2 = self.fyields.get('L2', 0)
            fy1 = self.fyields.get('L1', 0)
            if 'L2' in self.edges:
                nlines = 2.0
                fy3 = fy3 + fy2 * ck23
                fy2 = fy2 * (1 - ck23)
                if 'L1' in self.edges:
                    nlines = 3.0
                    fy3 = fy3 + fy1 * (ck13 + ck12 * ck23)
                    fy2 = fy2 + fy1 * ck12
                    fy1 = fy1 * (1 - ck12 - ck13 - ck12 * ck23)
                    self.fyields['L1'] = fy1
                self.fyields['L2'] = fy2
            self.fyields['L3'] = fy3 / nlines
            self.fyields['L2'] = fy2 / nlines
            self.fyields['L1'] = fy1 / nlines

        # look up X-ray lines, keep track of very close lines
        # so that they can be consolidate
        # slightly confusing (and working with XrayLine energies in ev)
        self.lines = {}
        self.all_lines = {}
        energy0 = None
        for ename in self.edges:
            for key, xline in xray_lines(symbol, ename).items():
                self.all_lines[key] = xline
                if xline.intensity > 0.002:
                    self.lines[key] = xline
                    if energy0 is None:
                        energy0 = xline.energy

        if overlap_energy is None:
            if xray_energy is None: xray_energy = 10.0
            if energy0 is not None: xray_energy = energy0
            # note: at this point xray_energy is in keV
            overlap_energy = 5.0 * (2 + np.sqrt(5 + xray_energy))

        # collect lines from the same initial level that are close in energy
        nlines = len(self.lines)
        combos = [[] for k in range(nlines)]
        comboe = [-1 for k in range(nlines)]
        combol = [None for k in range(nlines)]
        for key, xline in self.lines.items():
            assigned = False
            for i, en in enumerate(comboe):
                if (abs(0.001 * xline.energy - en) < overlap_energy
                        and xline.initial_level == combol[i]):
                    combos[i].append(key)
                    assigned = True
                    break
            if not assigned:
                for k in range(nlines):
                    if comboe[k] < 0:
                        break
                combol[k] = xline.initial_level
                comboe[k] = xline.energy
                combos[k].append(key)

        # consolidate overlapping X-ray lines
        for comps in combos:
            if len(comps) > 0:
                key = comps[0]
                l0 = self.lines.pop(key)
                ilevel = l0.initial_level
                iweight = l0.intensity
                flevel = [l0.final_level]
                en = [l0.energy]
                wt = [l0.intensity]
                for other in comps[1:]:
                    lx = self.lines.pop(other)
                    if lx.intensity > iweight:
                        iweight = lx.intensity
                        ilevel = lx.initial_level
                    flevel.append(lx.final_level)
                    en.append(lx.energy)
                    wt.append(lx.intensity)
                wt = np.array(wt)
                en = np.array(en)
                flevel = ', '.join(flevel)
                if len(comps) > 1:
                    newkey = key.replace('1', '').replace('2',
                                                          '').replace('3', '')
                    newkey = newkey.replace('4',
                                            '').replace('5',
                                                        '').replace(',', '')
                    if newkey not in self.lines:
                        key = newkey
                self.lines[key] = XrayLine(energy=(en * wt).sum() / wt.sum(),
                                           intensity=wt.sum(),
                                           initial_level=ilevel,
                                           final_level=flevel)
Ejemplo n.º 9
0
def test_xray_lines_levels():
    assert len(xray_lines('Hg', excitation_energy=2800)) == 2
    assert len(xray_lines('Hg', excitation_energy=12000)) == 3
    assert len(xray_lines('Hg', excitation_energy=12500)) == 9
    assert len(xray_lines('Hg', excitation_energy=14300)) == 13
    assert len(xray_lines('Hg', excitation_energy=16000)) == 17
Ejemplo n.º 10
0
            '7 7 7', '8 0 0', '8 2 2', '8 4 0', '8 4 4', '8 6 2', '8 6 6',
            '8 8 0', '8 8 4', '8 8 8', '9 1 1', '9 3 1', '9 5 1', '9 5 3',
            '9 5 5', '9 7 1', '9 7 3', '9 7 5', '9 7 7', '9 9 1', '9 9 3',
            '9 9 5', '9 9 7', '9 9 9', '10 2 0', '10 4 2', '10 6 0', '10 6 4',
            '10 8 2', '10 10 0', '10 10 4', '10 10 8', '11 1 1', '11 3 1',
            '11 3 3', '11 5 1', '11 5 3', '11 5 5', '11 7 1', '11 7 3',
            '11 7 5', '11 7 7', '11 9 1', '11 9 3', '11 9 5', '11 9 7',
            '11 9 9', '11 11 1', '11 11 3', '11 11 5', '11 11 7', '11 11 9',
            '11 11 11')

emission_energies = {}
analyzer_lines = ('Ka1', 'Ka2', 'Ka3', 'Kb1', 'Kb3', 'Kb5', 'La1', 'La2',
                  'Lb1', 'Lb3')
for z in range(1, 96):
    atsym = xraydb.atomic_symbol(z)
    xlines = xraydb.xray_lines(z)
    for line in analyzer_lines:
        key = '%s_%s' % (atsym, line)
        en = xlines.get(line, None)
        if en is None:
            emission_energies[key] = '0'
        else:
            emission_energies[key] = '%.0f' % (en.energy)

emission_energies_json = json.dumps(emission_energies)

PY_TOP = """#!/usr/bin/env python
# this script requires Python3, numpy, matplotlib, and xraydb modules. Use:
#        pip install xraydb
import numpy as np
import matplotlib.pyplot as plt