Пример #1
0
def reflectdata(formula, rho, angle, rough, polar, e1, e2, de, fname):
    """mirror reflectivity data as file"""
    en_array = energy_array(e1, e2, de)
    angle = float(angle)
    rho = float(rho)
    rough = float(rough)
    reflectivity = xraydb.mirror_reflectivity(formula,
                                              0.001 * angle,
                                              en_array,
                                              rho,
                                              roughness=rough,
                                              polarization=polar)

    _del, _bet, _ = xraydb.xray_delta_beta(formula, rho, en_array)
    ang_crit = 1000 * (np.pi / 2 - np.arcsin(1 - _del - 1j * _bet)).real

    header = (' X-ray reflectivity data from xrayweb  %s ' % time.ctime(),
              ' Material.formula   : %s ' % formula,
              ' Material.density   : %.4f gr/cm^3 ' % rho,
              ' Material.angle     : %.4f mrad ' % angle,
              ' Material.roughness : %.4f Ang ' % rough,
              ' Material.polarization: %s ' % polar, ' Column.1: energy (eV)',
              ' Column.2: reflectivity', ' Column.3: critical_angle (mrad)')

    arr_names = ('energy       ', 'reflectivity ', 'crit_angle    ')
    txt = make_asciifile(header, arr_names, (en_array, reflectivity, ang_crit))
    return Response(txt, mimetype='text/plain')
Пример #2
0
def reflectdata(formula, rho, angle, rough, polar, e1, e2, estep):
    """mirror reflectivity data as file"""
    en_array = np.arange(float(e1), float(e2)+float(estep), float(estep))
    angle = float(angle)
    rho   = float(rho)
    rough = float(rough)
    reflectivity = xraydb.mirror_reflectivity(formula, 0.001*angle, en_array, rho,
                                              roughness=rough, polarization=polar)

    _del, _bet, _ = xraydb.xray_delta_beta(formula, rho, en_array)
    ang_crit = 1000*(np.pi/2 - np.arcsin(1 - _del - 1j*_bet)).real
    
    header = (' X-ray reflectivity data from xrayweb  %s ' % time.ctime(),
              ' Material.formula   : %s ' % formula,
              ' Material.density   : %.4f gr/cm^3 ' % rho,
              ' Material.angle     : %.4f mrad ' % angle,
              ' Material.roughness : %.4f Ang ' % rough,
              ' Material.polarization: %s ' % polar,
              ' Column.1: energy (eV)',
              ' Column.2: reflectivity',
              ' Column.3: crit_angle (mrad)')

    arr_names = ('energy       ', 'reflectivity ', 'crit_angle    ')

    txt = make_asciifile(header, arr_names, (en_array, reflectivity, ang_crit))

    fname = 'xrayweb_reflect_%s_%s.txt' % (formula,
                                          time.strftime('%Y%h%d_%H%M%S'))
    return Response(txt, mimetype='text/plain',
                    headers={"Content-Disposition":
                             "attachment;filename=%s" % fname})
Пример #3
0
def test_delta_beta():

    delta = np.array([2.31879798e-05, 2.30263614e-05, 2.28655690e-05,
                      2.27055461e-05, 2.25462258e-05, 2.23875379e-05,
                      2.22294125e-05, 2.20717621e-05, 2.19144854e-05,
                      2.17574831e-05, 2.16006447e-05, 2.14438386e-05,
                      2.12869338e-05, 2.11297790e-05, 2.09721149e-05,
                      2.08136556e-05, 2.06541214e-05, 2.04932245e-05,
                      2.03306727e-05, 2.01661788e-05, 1.99990853e-05,
                      1.98278335e-05, 1.96507644e-05, 1.94662663e-05,
                      1.92728472e-05, 1.90690943e-05, 1.88535304e-05,
                      1.86137126e-05, 1.83166396e-05, 1.79263695e-05,
                      1.72644728e-05, 1.68846677e-05, 1.75514931e-05,
                      1.77905451e-05, 1.79131927e-05, 1.79732450e-05,
                      1.79928595e-05, 1.79928689e-05, 1.79824646e-05,
                      1.79627078e-05, 1.79344673e-05, 1.78986834e-05,
                      1.78566159e-05, 1.78095782e-05, 1.77588480e-05,
                      1.77052893e-05, 1.76492014e-05, 1.75908356e-05,
                      1.75304432e-05, 1.74683253e-05, 1.74048109e-05])

    beta = np.array([4.15330456e-07, 4.10533886e-07, 4.05807206e-07,
                     4.01142710e-07, 3.96544748e-07, 3.92013242e-07,
                     3.87546123e-07, 3.83142560e-07, 3.78802101e-07,
                     3.74526554e-07, 3.70319235e-07, 3.66171556e-07,
                     3.62082498e-07, 3.58040827e-07, 3.54055453e-07,
                     3.50126039e-07, 3.46263146e-07, 3.42462535e-07,
                     3.38714592e-07, 3.35014122e-07, 3.31343582e-07,
                     3.27723749e-07, 3.24153777e-07, 3.20645679e-07,
                     3.17190186e-07, 3.13781696e-07, 3.10416648e-07,
                     3.07089178e-07, 3.03806706e-07, 3.00558985e-07,
                     2.97367605e-07, 2.10914637e-06, 2.08861169e-06,
                     2.06826314e-06, 2.04838399e-06, 2.02875052e-06,
                     2.00935901e-06, 1.99017262e-06, 1.97120233e-06,
                     1.95246442e-06, 1.93395484e-06, 1.91563532e-06,
                     1.89753871e-06, 1.87966170e-06, 1.86198608e-06,
                     1.84449823e-06, 1.82722124e-06, 1.81015203e-06,
                     1.79327486e-06, 1.77659378e-06, 1.76011187e-06])

    atten = np.array([0.00365468, 0.00368604, 0.00371757, 0.00374933,
                      0.00378128, 0.0038134 , 0.0038457 , 0.00387818,
                      0.00391084, 0.00394364, 0.00397654, 0.00400961,
                      0.00404286, 0.0040764 , 0.00411013, 0.00414403,
                      0.00417797, 0.00421199, 0.00424618, 0.0042806 ,
                      0.00431548, 0.00435053, 0.00438577, 0.00442101,
                      0.00445637, 0.00449191, 0.00452767, 0.00456372,
                      0.00459996, 0.00463653, 0.00467309, 0.00065701,
                      0.00066161, 0.00066625, 0.00067084, 0.00067545,
                      0.00068008, 0.00068474, 0.00068943, 0.00069413,
                      0.00069886, 0.00070361, 0.00070839, 0.00071318,
                      0.000718, 0.00072285, 0.00072772, 0.0007326,
                      0.00073751, 0.00074245, 0.0007474 ])

    en = np.linspace(6500, 7500, 51)
    d, b, a = xray_delta_beta('Fe2O3', 5.25, en)

    assert_allclose(delta, d, rtol=0.005)
    assert_allclose(beta, b, rtol=0.005)
    assert_allclose(atten, a, rtol=0.005)
Пример #4
0
 def get_index(self,
               energy=8370.0,
               indexNat=0):  # x-ray energy in eV, relative density
     # MN replace...
     # temp=readf1f2a.get_delta(self.composition, self.density*self.relden, energy, indexNat)  # used to be fluo
     #self.delta=temp[0]
     #self.beta=temp[1]
     #self.la=temp[2]                     # in cm,
     #self.Nat=temp[3]
     delta, beta, la = xray_delta_beta(self.composition,
                                       self.density * self.relden, energy)
     self.delta, self.beta, self.la = delta, beta, la
     #la attenuation length cm, NumLayer for multiple layers
     self.trans = math.exp(-self.thickness * 1e8 / la)
     self.absrp = 1.0 - self.trans
Пример #5
0
def get_delta(energy, material=None, density=None):
    """
    Calculate delta for a given material at a given energy.

    Anomalous components of the index of refraction for a material, using the
    tabulated scattering components from Chantler.

    Parameters
    ----------
    energy : number
        x-ray energy in KeV
    material : str, optional
        Atomic symbol for element, defaults to 'Be'.
    density : float, optional
        Material density in g/cm^3

    Returns
    -------
    delta : float
        Real part of index of refraction

    Raises
    ------
    ValueError
        If an invalid symbol is provided for material.
    ZeroDivisionError
        When energy is 0.

    Examples
    --------
    >>> get_delta(energy=8, material='Au')
    4.728879989419882e-05
    """
    material = material or MATERIAL
    # xray_delta_beta returns (delta, beta, atlen), wehre delta : real part of
    # index of refraction, and takes x-ray energy in eV.
    if density is None:
        density = xdb.atomic_density(material)
    try:
        delta = xdb.xray_delta_beta(material,
                                    density=density,
                                    energy=energy * 1.0e3)[0]
    except Exception as ex:
        logger.error('Get Delta error: %s', ex)
        raise ex
    return delta
Пример #6
0
def test_delta_beta():

    delta = np.array([
        2.31879798e-05, 2.30263614e-05, 2.28655690e-05, 2.27055461e-05,
        2.25462258e-05, 2.23875379e-05, 2.22294125e-05, 2.20717621e-05,
        2.19144854e-05, 2.17574831e-05, 2.16006447e-05, 2.14438386e-05,
        2.12869338e-05, 2.11297790e-05, 2.09721149e-05, 2.08136556e-05,
        2.06541214e-05, 2.04932245e-05, 2.03306727e-05, 2.01661788e-05,
        1.99990853e-05, 1.98278335e-05, 1.96507644e-05, 1.94662663e-05,
        1.92728472e-05, 1.90690943e-05, 1.88535304e-05, 1.86137126e-05,
        1.83166396e-05, 1.79263695e-05, 1.72644728e-05, 1.68846677e-05,
        1.75514931e-05, 1.77905451e-05, 1.79131927e-05, 1.79732450e-05,
        1.79928595e-05, 1.79928689e-05, 1.79824646e-05, 1.79627078e-05,
        1.79344673e-05, 1.78986834e-05, 1.78566159e-05, 1.78095782e-05,
        1.77588480e-05, 1.77052893e-05, 1.76492014e-05, 1.75908356e-05,
        1.75304432e-05, 1.74683253e-05, 1.74048109e-05
    ])

    beta = np.array([
        4.15330456e-07, 4.10533886e-07, 4.05807206e-07, 4.01142710e-07,
        3.96544748e-07, 3.92013242e-07, 3.87546123e-07, 3.83142560e-07,
        3.78802101e-07, 3.74526554e-07, 3.70319235e-07, 3.66171556e-07,
        3.62082498e-07, 3.58040827e-07, 3.54055453e-07, 3.50126039e-07,
        3.46263146e-07, 3.42462535e-07, 3.38714592e-07, 3.35014122e-07,
        3.31343582e-07, 3.27723749e-07, 3.24153777e-07, 3.20645679e-07,
        3.17190186e-07, 3.13781696e-07, 3.10416648e-07, 3.07089178e-07,
        3.03806706e-07, 3.00558985e-07, 2.97367605e-07, 2.10914637e-06,
        2.08861169e-06, 2.06826314e-06, 2.04838399e-06, 2.02875052e-06,
        2.00935901e-06, 1.99017262e-06, 1.97120233e-06, 1.95246442e-06,
        1.93395484e-06, 1.91563532e-06, 1.89753871e-06, 1.87966170e-06,
        1.86198608e-06, 1.84449823e-06, 1.82722124e-06, 1.81015203e-06,
        1.79327486e-06, 1.77659378e-06, 1.76011187e-06
    ])

    beta_photo = np.array([
        3.90526978e-07, 3.86063935e-07, 3.81665372e-07, 3.77336646e-07,
        3.73071089e-07, 3.68866519e-07, 3.64729098e-07, 3.60655470e-07,
        3.56639426e-07, 3.52684594e-07, 3.48796990e-07, 3.44963677e-07,
        3.41183740e-07, 3.37480438e-07, 3.33829590e-07, 3.30228863e-07,
        3.26702653e-07, 3.23242941e-07, 3.19829864e-07, 3.16477854e-07,
        3.13244987e-07, 3.10054443e-07, 3.06905547e-07, 3.03998036e-07,
        3.01199959e-07, 2.98435746e-07, 2.96106878e-07, 2.94958918e-07,
        2.93820876e-07, 2.93903973e-07, 3.11478882e-07, 2.10154368e-06,
        2.11105335e-06, 2.09391918e-06, 2.07224074e-06, 2.05084613e-06,
        2.02973085e-06, 2.00827838e-06, 1.98675441e-06, 1.96551940e-06,
        1.94456638e-06, 1.92374766e-06, 1.90320773e-06, 1.88294210e-06,
        1.86292819e-06, 1.84314908e-06, 1.82363251e-06, 1.80437431e-06,
        1.78600492e-06, 1.76816730e-06, 1.75055477e-06
    ])

    atten = np.array([
        0.00376372, 0.00379486, 0.00382616, 0.00385755, 0.00388909, 0.00392079,
        0.00395256, 0.00398442, 0.00401644, 0.00404858, 0.00408074, 0.00411306,
        0.00414555, 0.00417787, 0.00421033, 0.00424294, 0.0042754, 0.00430777,
        0.00434029, 0.00437275, 0.00440432, 0.00443603, 0.00446788, 0.00449701,
        0.00452518, 0.00455344, 0.00457579, 0.00458077, 0.00458572, 0.0045724,
        0.00431164, 0.00065601, 0.00065126, 0.00065474, 0.00065973, 0.00066474,
        0.00066978, 0.00067505, 0.00068046, 0.0006859, 0.00069138, 0.00069693,
        0.00070251, 0.00070812, 0.00071377, 0.00071946, 0.00072517, 0.00073092,
        0.00073644, 0.00074186, 0.0007473
    ])

    en = np.linspace(6500, 7500, 51)
    d, b, a = xray_delta_beta('Fe2O3', 5.25, en)

    assert_allclose(delta, d, rtol=0.005)
    assert_allclose(beta_photo, b, rtol=0.005)
    assert_allclose(atten, a, rtol=0.005)
Пример #7
0
def reflectivity(material=None):
    message = []
    ref_plot = angc_plot = {}
    has_data = False
    de = '50'
    if request.method == 'POST':
        formula1 = request.form.get('formula1', 'None')
        density1 = request.form.get('density1', '')
        angle1 = request.form.get('angle1', '0')
        material1 = request.form.get('mats1', 'silicon')

        e1 = request.form.get('e1', '1000')
        e2 = request.form.get('e2', '50000')
        de = request.form.get('de', '50')
        mode = request.form.get('mode', 'Linear')
        roughness = request.form.get('roughness')
        polarization = request.form.get('polarization')

        if not xraydb.validate_formula(formula1):
            message.append("cannot interpret chemical formula")

        try:
            density = max(0, float(density1))
        except:
            message.append('Density must be a positive number.')

        if len(message) == 0:
            has_data = True
            en_array = energy_array(e1, e2, de)
            use_log = mode.lower() == 'log'

            ref_array = xraydb.mirror_reflectivity(formula1,
                                                   0.001 * float(angle1),
                                                   en_array,
                                                   density,
                                                   roughness=float(roughness),
                                                   polarization=polarization)
            title = "%s, %s mrad" % (formula1, angle1)
            ref_plot = make_plot(en_array,
                                 ref_array,
                                 title,
                                 formula1,
                                 yformat='.3f',
                                 ytitle='Reflectivity',
                                 ylog_scale=use_log)

            title = "%s Reflectivity, %s mrad" % (formula1, angle1)
            ref_plot = make_plot(en_array,
                                 ref_array,
                                 title,
                                 formula1,
                                 yformat='.3f',
                                 ytitle='Reflectivity',
                                 ylog_scale=use_log)

            _del, _bet, _ = xraydb.xray_delta_beta(formula1, density, en_array)
            ang_crit = 1000 * np.arccos(1 - _del - 1j * _bet).real

            title = "%s, Critical Angle" % (formula1)
            angc_plot = make_plot(en_array,
                                  ang_crit,
                                  title,
                                  formula1,
                                  ytitle='Critical Angle (mrad)',
                                  ylog_scale=use_log)

    else:
        request.form = {
            'mats1': 'silicon',
            'formula1': materials_['silicon'].formula,
            'density1': materials_['silicon'].density,
            'angle1': 2.5,
            'mats2': 'None',
            'formula2': '',
            'density2': '',
            'angle2': 2.5,
            'e1': 1000,
            'e2': 50000,
            'de': de,
            'polarization': 's',
            'roughness': '0',
            'mode': 'Linear'
        }

    return render_template('reflectivity.html',
                           message=message,
                           errors=len(message),
                           ref_plot=ref_plot,
                           angc_plot=angc_plot,
                           has_data=has_data,
                           matlist=mirror_mat,
                           de=int(de),
                           materials_dict=materials_dict)