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')
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})
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)
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
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
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)
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)