Ejemplo n.º 1
0
Archivo: util.py Proyecto: mdw771/xecat
def parser(compounds):

    comp = xraylib.CompoundParser(compounds)
    stoic_allowed = range(10)
    stoic_allowed = map(str, stoic_allowed)
    stoic_allowed.append('.')
    _compounds = list(compounds)
    elements = comp['Elements']
    stoic = []
    for i in elements:
        symb = xraylib.AtomicNumberToSymbol(i)
        ind = compounds.find(symb) + len(symb)
        if ind >= len(_compounds):
            stoic.append(1.0)
        else:
            if _compounds[ind] not in stoic_allowed:
                stoic.append(1.0)
            else:
                temp = []
                while _compounds[ind] in stoic_allowed:
                    temp.append(_compounds[ind])
                    ind += 1
                    if ind >= len(_compounds):
                        break
                temp = ''.join(temp)
                stoic.append(float(temp))
    mw = np.sum(
        np.asarray(stoic) * np.asarray(map(xraylib.AtomicWeight, elements)))

    return elements, stoic, mw
Ejemplo n.º 2
0
def parse_compound(compund):
    '''
    Parse chemical formula
    '''
    import xraylib

    return xraylib.CompoundParser(compund)
Ejemplo n.º 3
0
 def test_H2SO4(self):
     cd = xraylib.CompoundParser('H2SO4')
     self.assertEqual(cd['nElements'], 3)
     self.assertEqual(cd['molarMass'], 98.09)
     self.assertEqual(cd['nAtomsAll'], 7.0)
     self.assertEqual(cd['Elements'], (1, 8, 16))
     self.assertAlmostEqual(
         cd['massFractions'],
         (0.02059333265368539, 0.6524620246712203, 0.32694464267509427))
     self.assertAlmostEqual(cd['nAtoms'], (2.0, 4.0, 1.0))
Ejemplo n.º 4
0
 def setUpClass(cls):
     if not XmiMsim.Job.is_suspend_available():
         raise 
     XmiMsim.init_hdf5()
     cls.cd = xrl.CompoundParser(cls.COMPOUND)
     if cls.cd is None:
         raise
     cls.data_file = os.environ['HDF5_DATA_DIR'] + "/xmimsimdata-" + cls.COMPOUND + ".h5"
     logging.debug("data_file: {}".format(cls.data_file))
     if XmiMsim.db(cls.data_file, cls.cd['Elements']) is not 1:
         raise
Ejemplo n.º 5
0
def validate_str(*s):
    boo = []
    for i in s:
        try:                
            if xraylib.SymbolToAtomicNumber(i) != 0:
                boo.append(True)
            elif xraylib.CompoundParser(i):                    
                boo.append(True)
            else:
                boo.append(False)
        except:
            return False
    return all(boo)          
Ejemplo n.º 6
0
    def getMaterialDensity(cls, material_formula):
        if material_formula is None: return 0.0
        if str(material_formula.strip()) == "": return 0.0

        try:
            compoundData = xraylib.CompoundParser(material_formula)

            if compoundData["nElements"] == 1:
                return xraylib.ElementDensity(compoundData["Elements"][0])
            else:
                return 0.0
        except:
            return 0.0
Ejemplo n.º 7
0
def parse_compound_formula(compound_formula):
    r"""
    Parses the chemical formula of a compound and returns the dictionary,
    which contains element name, atomic number, number of atoms and mass fraction
    in the compound.

    Parameters
    ----------

    compound_formula: str
        chemical formula of the compound in the form ``FeO2``, ``CO2`` or ``Fe``.
        Element names must start with capital letter.

    Returns
    -------

        dictionary of dictionaries, data on each element in the compound: key -
        sybolic element name, value - a dictionary that contains ``AtomicNumber``,
        ``nAtoms`` and ``massFraction`` of the element. The elements are sorted
        in the order of growing atomic number.

    Raises
    ------

        RuntimeError is raised if compound formula cannot be parsed
    """

    if LooseVersion(xraylib.__version__) < LooseVersion("4.0.0"):
        xraylib.SetErrorMessages(
            0)  # This is supposed to stop XRayLib from printing
        #                              internal error messages, but it doesn't work

    try:
        compound_data = xraylib.CompoundParser(compound_formula)
    except (SystemError, ValueError):
        msg = f"Invalid chemical formula '{compound_formula}' is passed, parsing failed"
        raise RuntimeError(msg)

    # Now create more manageable structure
    compound_dict = {}
    for e_an, e_mf, e_na in zip(compound_data["Elements"],
                                compound_data["massFractions"],
                                compound_data["nAtoms"]):
        e_name = xraylib.AtomicNumberToSymbol(e_an)
        compound_dict[e_name] = {
            "AtomicNumber": e_an,
            "nAtoms": e_na,
            "massFraction": e_mf
        }

    return compound_dict
Ejemplo n.º 8
0
def get_application_data(data, **kwargs):
    if data['method'] == 'validate_material':
        name = data['material_name']
        try:
            xraylib.CompoundParser(str(name))
            return {
                'material_name': name,
            }
        except Exception:
            return {
                'error': 'invalid material name',
            }
    raise RuntimeError('unknown application data method: {}'.format(
        data['method']))
Ejemplo n.º 9
0
 def el_select(self):
     Z = self.el_cb.currentIndex()
     if Z > 0:
         self.nist_cb.setCurrentIndex(0)
         self.cp_le.setText("")
         if self.name == "bet": self.chkbox_luxelht.setChecked(False)
         self.mat = xrl.CompoundParser(xrl.AtomicNumberToSymbol(Z))
         self.mat['name'] = xrl.AtomicNumberToSymbol(Z)
         self.apply_mat_thickness()
         self.mat['density'] = xrl.ElementDensity(Z)
         self.mat_dens_le.setText(str(self.mat['density']))
         self.apply_mat_density()
     else:
         self.mat = {}
Ejemplo n.º 10
0
 def apply_mat_cp(self):
     if self.cp_le.text() == "":
         self.mat = {}
         return
     try:
         self.nist_cb.setCurrentIndex(0)
         self.el_cb.setCurrentIndex(0)
         if self.name == "bet": self.chkbox_luxelht.setChecked(False)
         self.mat = xrl.CompoundParser(self.cp_le.text())
         self.mat['name'] = self.cp_le.text()
         self.apply_mat_thickness()
         self.apply_mat_density()
     except:
         self.mat = {}
Ejemplo n.º 11
0
def material_refraction(energy, compound, rho):
    """    
    Calculate complex refrative index of the material taking
    into account it's density. 

    Args:
        compound (str): compound chemical formula
        rho (float): density in g / cm3
        energy (numpy.array): energy in KeV   

    Returns:
        float: refraction index in [1/mm]
    """

    import xraylib

    cmp = xraylib.CompoundParser(compound)

    # Compute ration of Z and A:
    z = (numpy.array(cmp['Elements']))
    a = [xraylib.AtomicWeight(x) for x in cmp['Elements']]

    za = ((z / a) * numpy.array(cmp['massFractions'])).sum()

    # Electron density of the material:
    Na = phys_const['Na']
    rho_e = rho * za * Na

    # Attenuation:
    mu = mass_attenuation(energy, compound)

    # Phase:
    wavelength = 2 * numpy.pi * \
        (phys_const['h_bar_ev'] * phys_const['c']) / energy * 10

    # TODO: check this against phantoms.m:
    phi = rho_e * phys_const['re'] * wavelength

    # Refraction index (per mm)
    return rho * (mu / 2 - 1j * phi) / 10
Ejemplo n.º 12
0
 def test_good_compounds(self):
     self.assertIsInstance(xraylib.CompoundParser("C19H29COOH"), dict)
     self.assertIsInstance(xraylib.CompoundParser("C12H10"), dict)
     self.assertIsInstance(xraylib.CompoundParser("C12H6O2"), dict)
     self.assertIsInstance(xraylib.CompoundParser("C6H5Br"), dict)
     self.assertIsInstance(xraylib.CompoundParser("C3H4OH(COOH)3"), dict)
     self.assertIsInstance(xraylib.CompoundParser("HOCH2CH2OH"), dict)
     self.assertIsInstance(xraylib.CompoundParser("C5H11NO2"), dict)
     self.assertIsInstance(xraylib.CompoundParser("CH3CH(CH3)CH3"), dict)
     self.assertIsInstance(xraylib.CompoundParser("NH2CH(C4H5N2)COOH"),
                           dict)
     self.assertIsInstance(xraylib.CompoundParser("H2O"), dict)
     self.assertIsInstance(xraylib.CompoundParser("Ca5(PO4)3F"), dict)
     self.assertIsInstance(xraylib.CompoundParser("Ca5(PO4)3OH"), dict)
     self.assertIsInstance(xraylib.CompoundParser("Ca5.522(PO4.48)3OH"),
                           dict)
     self.assertIsInstance(xraylib.CompoundParser("Ca5.522(PO.448)3OH"),
                           dict)
Ejemplo n.º 13
0
 def test_bad_compounds(self):
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("CuI2ww")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("0C")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("2O")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("13Li")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("2(NO3)")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("H(2)")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Ba(12)")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Cr(5)3")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Pb(13)2")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Au(22)11")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Au11(H3PO4)2)")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Au11(H3PO4))2")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Au(11(H3PO4))2")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Ca5.522(PO.44.8)3OH")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Ba[12]")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Auu1")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("AuL1")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser(None)
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("  ")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("\t")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("\n")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Au L1")
     with self.assertRaises(ValueError):
         xraylib.CompoundParser("Au\tFe")
     with self.assertRaises(TypeError):
         xraylib.CompoundParser(26)
Ejemplo n.º 14
0
    xraylib.LineEnergy(20, xraylib.KA_LINE)))
print("Fe partial photoionization cs of L3 at 6.0 keV: {}".format(
    xraylib.CS_Photo_Partial(26, xraylib.L3_SHELL, 6.0)))
print("Zr L1 edge energy: {}".format(xraylib.EdgeEnergy(40, xraylib.L1_SHELL)))
print("Pb Lalpha XRF production cs at 20.0 keV (jump approx): {}".format(
    xraylib.CS_FluorLine(82, xraylib.LA_LINE, 20.0)))
print("Pb Lalpha XRF production cs at 20.0 keV (Kissel): {}".format(
    xraylib.CS_FluorLine_Kissel(82, xraylib.LA_LINE, 20.0)))
print("Bi M1N2 radiative rate: {}".format(
    xraylib.RadRate(83, xraylib.M1N2_LINE)))
print("U M3O3 Fluorescence Line Energy: {}".format(
    xraylib.LineEnergy(92, xraylib.M3O3_LINE)))
print("Ca(HCO3)2 Rayleigh cs at 10.0 keV: {}".format(
    xraylib.CS_Rayl_CP("Ca(HCO3)2", 10.0)))

cdtest = xraylib.CompoundParser("Ca(HCO3)2")
print(
    "Ca(HCO3)2 contains {} atoms, {} elements and has a molar mass of {} g/mol"
    .format(cdtest['nAtomsAll'], cdtest['nElements'], cdtest['molarMass']))
for i in range(cdtest['nElements']):
    print("Element {}: %lf %% and {} atoms".format(
        cdtest['Elements'][i], cdtest['massFractions'][i] * 100.0,
        cdtest['nAtoms'][i]))

cdtest = xraylib.CompoundParser("SiO2")
print("SiO2 contains {} atoms, {} elements and has a molar mass of {} g/mol".
      format(cdtest['nAtomsAll'], cdtest['nElements'], cdtest['molarMass']))
for i in range(cdtest['nElements']):
    print("Element {}: %lf %% and {} atoms".format(
        cdtest['Elements'][i], cdtest['massFractions'][i] * 100.0,
        cdtest['nAtoms'][i]))
def prerefl():
    """
     Preprocessor for mirrors - python+xraylib version

     -""" 
  
    # retrieve physical constants needed
    codata = scipy.constants.codata.physical_constants
    codata_c, tmp1, tmp2 = codata["speed of light in vacuum"]
    codata_h, tmp1, tmp2 = codata["Planck constant"]
    codata_ec, tmp1, tmp2 = codata["elementary charge"]
    # or hard code them 
    # In [174]: print("codata_c = %20.11e \n" % codata_c )
    # codata_c =    2.99792458000e+08 
    # In [175]: print("codata_h = %20.11e \n" % codata_h )
    # codata_h =    6.62606930000e-34 
    # In [176]: print("codata_ec = %20.11e \n" % codata_ec )
    # codata_ec =    1.60217653000e-19

    tocm = codata_h*codata_c/codata_ec*1e2

    # input section
    print("prerefl: Preprocessor for mirrors - python+xraylib version")
    iMaterial = raw_input("Enter material expression (symbol,formula): ")
    density = raw_input("Density [ g/cm3 ] ?") 
    density = float(density)

    estart = raw_input("Enter starting photon energy: ") 
    estart = float(estart)

    efinal = raw_input("Enter end photon energy: ") 
    efinal = float(efinal)

    estep = raw_input("Enter step photon energy:") 
    estep = float(estep)

    out_file  = raw_input("Output file : ")

    twopi = math.pi*2
    npoint = int( (efinal-estart)/estep + 1 )
    depth0 = density/2.0
    qmin = estart/tocm*twopi
    qmax = efinal/tocm*twopi
    qstep = estep/tocm*twopi

    f = open(out_file, 'wb')
    f.write( ("%20.11e "*4+"\n") % tuple([qmin,qmax,qstep,depth0]) )
    f.write("%i \n" % int(npoint))
    for i in range(npoint):
       energy = (estart+estep*i)*1e-3
       tmp = 2e0*(1e0-xraylib.Refractive_Index_Re(iMaterial,energy,density))
       f.write("%e \n" % tmp)
    for i in range(npoint):
       energy = (estart+estep*i)*1e-3
       tmp2 = 2e0*(xraylib.Refractive_Index_Im(iMaterial,energy,density))
       f.write("%e \n" % tmp2)
    print("File written to disk: %s" % out_file)
    f.close()

    # test (not needed)
    itest = 0
    if itest:
       cdtest = xraylib.CompoundParser(iMaterial)
       print "    ",iMaterial," contains %i atoms and %i elements"% (cdtest['nAtomsAll'], cdtest['nElements'])
       for i in range(cdtest['nElements']):
          print "    Element %i: %lf %%" % (cdtest['Elements'][i],cdtest['massFractions'][i]*100.0)
       print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
       print qmin,qmax,qstep,depth0
       print npoint
       for i in range(npoint):
          energy = (estart+estep*i)*1e-3
          qq = qmin+qstep*i
          print energy,qq, \
              2e0*(1e0-xraylib.Refractive_Index_Re(iMaterial,energy,density)),\
              2e0*(xraylib.Refractive_Index_Im(iMaterial,energy,density))
       print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"

    return None
Ejemplo n.º 16
0
def Reflectivity_coated(E,
                        theta,
                        sub_mat,
                        coat_mat,
                        coat_thickness,
                        f1f2data='default',
                        f1f2interp='linear'):
    E = np.asarray(E, dtype=np.float64)
    scalar_E = False
    if E.ndim == 0:
        E = E[None]
        scalar_E = True

    sub_Z = xl.SymbolToAtomicNumber(sub_mat)
    if f1f2data == 'default':
        f1f2_sub = get_Ef1f2(sub_Z)
    else:
        f1f2_sub = get_Ef1f2(sub_Z, datafile=f1f2data)
    if f1f2interp == 'linear':
        f1_sub = interp1d(f1f2_sub[:, 0], f1f2_sub[:, 1])(E)
        f2_sub = interp1d(f1f2_sub[:, 0], f1f2_sub[:, 2])(E)
    else:
        f1_sub = loglog_negy_interp1d(f1f2_sub[:, 0], f1f2_sub[:, 1], E)
        f2_sub = loglog_negy_interp1d(f1f2_sub[:, 0], f1f2_sub[:, 2], E)
    rho_sub = xt.Density[sub_mat] * 1.e6  # g/cm3 --> g/m3
    n_rho_sub = rho_sub / xt.AtomicMass[sub_mat] * NA  # Atoms per m3

    coat = xl.CompoundParser(coat_mat)
    f1_coat = np.zeros_like(E)
    f2_coat = np.zeros_like(E)
    for i in range(coat['nElements']):
        if f1f2data == 'default':
            f1f2_coat = get_Ef1f2(coat['Elements'][i])
        else:
            f1f2_coat = get_Ef1f2(coat['Elements'][i], datafile=f1f2data)
        if f1f2interp == 'linear':
            f1_coat += interp1d(f1f2_coat[:, 0],
                                f1f2_coat[:, 1])(E) * coat['nAtoms'][i]
            f2_coat += interp1d(f1f2_coat[:, 0],
                                f1f2_coat[:, 2])(E) * coat['nAtoms'][i]
        else:
            f1_coat += loglog_negy_interp1d(f1f2_coat[:, 0], f1f2_coat[:, 1],
                                            E) * coat['nAtoms'][i]
            f2_coat += loglog_negy_interp1d(f1f2_coat[:, 0], f1f2_coat[:, 2],
                                            E) * coat['nAtoms'][i]

    rho_coat = xt.Density[coat_mat] * 1.e6  # g/cm3 --> g/m3
    n_rho_coat = rho_coat / coat['molarMass'] * NA  # Atoms per m3

    lamda = h * c / (E * eV) + 0j
    K = 2 * np.pi / lamda
    ah = r_e * lamda**2 / np.pi

    Chi_sub = ah * n_rho_sub * (-f1_sub + f2_sub * 1j)
    Chi_coat = ah * n_rho_coat * (-f1_coat + f2_coat * 1j)
    K_z0 = K * np.sqrt(np.sin(theta)**2 + Chi_sub)
    K_z1 = K * np.sqrt(np.sin(theta)**2 + Chi_coat)
    K_z2 = K * np.sin(theta)
    C1 = np.exp(1j * K_z1 * coat_thickness / 2)
    C2 = np.exp(1j * K_z2 * 1 / 2)
    R1 = (K_z1 - K_z0) / (K_z0 + K_z1) * C1**2  # R1 = r11_0
    r11_2 = (K_z1 - K_z2) / (K_z2 + K_z1) * C1**2
    r22_1 = (K_z2 - K_z1) / (K_z1 + K_z2) * C2**2
    t12 = 2 * K_z2 / (K_z1 + K_z2) * C1 * C2
    t21 = 2 * K_z1 / (K_z2 + K_z1) * C1 * C2
    R2 = r22_1 + t21 * t12 * R1 / (1. - r11_2 * R1)
    R = np.abs(R2)**2

    if scalar_E:
        return np.squeeze(R)
    return R
Ejemplo n.º 17
0
#python 2 compatibility
if sys.version_info[0] < 3:
    input = raw_input

print('----------------------------------')
print('**  XAS SAMPLE OPTIMIZER v.' + _VERSION + '  **')
print('----------------------------------')

#Ask for user input
input_str = {}
input_str['compound'] = input('Compound: ')
input_str['absorption_edge'] = input('Absorption edge (e.g. Cu-K, U-L3): ')
photons_per_second = float(
    input('Incident photon flux (background subtracted) (ph/s): '))

compound = xrl.CompoundParser(input_str['compound'])

#convert the absorption edge string to energy
edge_element, edge_shell = input_str['absorption_edge'].split('-')

edge_energy = xrl.EdgeEnergy(xrl.SymbolToAtomicNumber(edge_element),
                             _SHELL_MACROS[edge_shell])

#calculate the mass attenuation coefficient below and above edge
murho = [0, 0]

for i in range(compound['nElements']):
    murho[0] = murho[0] + compound['massFractions'][i] * xrl.CS_Total(
        compound['Elements'][i], edge_energy - 0.001)
    murho[1] = murho[1] + compound['massFractions'][i] * xrl.CS_Total(
        compound['Elements'][i], edge_energy + 0.001)
Ejemplo n.º 18
0
 def funcWrapped(Id, *args, **kwargs):
     Id = xraylib.CompoundParser(Id)
     out = func(np.asarray(Id['Elements']), *args, **kwargs)
     return np.sum(out, 0)
Ejemplo n.º 19
0
def index():
    form = Xraylib_Request()
    version = xraylib.__version__

    # Populates select fields
    form.function.choices = form.function.choices + cs_tup + dcs_tup
    form.transition.siegbahn.choices = trans_S_tup
    form.shell.choices = shell_tup
    form.nistcomp.choices = nist_tup
    form.rad_nuc.choices = rad_name_tup

    if request.method == 'POST':
        # Get user input
        select_input = request.form.get('function')
        examples = request.form.get('examples')

        notation = request.form.get('transition-notation')
        siegbahn = request.form.get('transition-siegbahn')
        iupac1 = request.form.get('transition-iupac1')
        iupac2 = request.form.get('transition-iupac2')

        ex_shell = request.form.get('augtrans-ex_shell')
        trans_shell = request.form.get('augtrans-trans_shell')
        aug_shell = request.form.get('augtrans-aug_shell')

        cktrans = request.form.get('cktrans')
        nistcomp = request.form.get('nistcomp')
        rad_nuc = request.form.get('rad_nuc')
        shell = request.form.get('shell')

        int_z = request.form['int_z']
        float_q = request.form['float_q']
        comp = request.form['comp']
        int_z_or_comp = request.form['int_z_or_comp']
        energy = request.form['energy']
        theta = request.form['theta']
        phi = request.form['phi']
        density = request.form['density']
        pz = request.form['pz']

        # Turns user input => valid args for calc_output
        trans = iupac1 + iupac2 + '_LINE'
        augtrans = ex_shell + '_' + trans_shell + aug_shell + '_AUGER'

        if select_input == 'AtomicWeight' or select_input == 'ElementDensity':
            if validate_int(int_z) or validate_str(int_z):
                examples = code_example(form.examples.choices, select_input,
                                        int_z)
                output = calc_output(select_input, int_z)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       units=getattr(Request_Units,
                                                     select_input + '_u'),
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'FF_Rayl' or select_input == 'SF_Compt':
            if validate_int(
                    int_z) or validate_str(int_z) and validate_float(float_q):
                examples = code_example(form.examples.choices, select_input,
                                        int_z, float_q)
                output = calc_output(select_input, int_z, float_q)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'AugerRate':
            if validate_int(int_z) or validate_str(int_z):
                examples = code_example(form.examples.choices, select_input,
                                        int_z, augtrans)
                output = calc_output(select_input, int_z, augtrans)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'LineEnergy' or select_input == 'RadRate':
            if notation == 'IUPAC':
                if validate_int(int_z) or validate_str(int_z):
                    examples = code_example(form.examples.choices,
                                            select_input, int_z, trans)
                    output = calc_output(select_input, int_z, trans)

                    if select_input == 'LineEnergy':
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               output=output,
                                               units=Request_Units.Energy_u,
                                               code_examples=examples)
                    else:
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               output=output,
                                               code_examples=examples)
                else:
                    return render_template('index.html',
                                           form=form,
                                           version=version,
                                           error=Request_Error.error)

            elif notation == 'Siegbahn':
                if validate_int(int_z) or validate_str(int_z):
                    examples = code_example(form.examples.choices,
                                            select_input, int_z, siegbahn)
                    output = calc_output(select_input, int_z, siegbahn)
                    print(output)

                    if select_input == 'LineEnergy':
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               output=output,
                                               units=Request_Units.Energy_u,
                                               code_examples=examples)
                    else:
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               output=output,
                                               code_examples=examples)

                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

            elif notation == 'All':
                if validate_int(int_z) or validate_str(int_z):
                    output = all_trans(trans_I_tup, select_input, int_z)

                    if select_input == 'LineEnergy':
                        #needs units
                        #output = dict(out, Line = 'Energies')
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               output=output,
                                               units=Request_Units.Energy_u)
                    else:
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               output=output)
                else:
                    return render_template('index.html',
                                           form=form,
                                           version=version,
                                           error=Request_Error.error)
            else:
                return render_template('index.html', error=Request_Error.error)

        elif (select_input == 'EdgeEnergy' or select_input == 'JumpFactor'
              or select_input == 'FluorYield' or select_input == 'AugerYield'
              or select_input == 'AtomicLevelWidth'
              or select_input == 'ElectronConfig'):
            if validate_int(int_z) or validate_str(int_z):
                examples = code_example(form.examples.choices, select_input,
                                        int_z, shell)
                output = calc_output(select_input, int_z, shell)
                if select_input == 'EdgeEnergy' or select_input == 'AtomicLevelWidth':
                    return render_template('index.html',
                                           form=form,
                                           version=version,
                                           output=output,
                                           units=Request_Units.Energy_u,
                                           code_examples=examples)
                elif select_input == 'ElectronConfig':
                    return render_template(
                        'index.html',
                        form=form,
                        version=version,
                        output=output,
                        units=Request_Units.ElectronConfig_u,
                        code_examples=examples)
                else:
                    return render_template('index.html',
                                           form=form,
                                           version=version,
                                           output=output,
                                           code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'CS_Photo_Partial':
            if validate_int(
                    int_z) or validate_str(int_z) and validate_float(energy):
                output = calc_output(select_input, int_z, shell, energy)
                examples = code_example(form.examples.choices, select_input,
                                        int_z, shell, energy)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       units=Request_Units.CS_u,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'CS_KN':
            if validate_float(energy) and energy != '0':
                output = calc_output(select_input, energy)
                examples = code_example(form.examples.choices, select_input,
                                        energy)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       units=Request_Units.CS_u,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input.startswith('CS_FluorLine'):
            if validate_float(energy):
                if notation == 'IUPAC':
                    if validate_int(int_z) or validate_str(int_z):
                        examples = code_example(form.examples.choices,
                                                select_input, int_z, trans,
                                                energy)
                        output = calc_output(select_input, int_z, trans,
                                             energy)
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               output=output,
                                               units=Request_Units.CS_u,
                                               code_examples=examples)
                    else:
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               error=Request_Error.error)
                elif notation == 'Siegbahn':
                    if validate_int(int_z) or validate_str(int_z):
                        examples = code_example(form.examples.choices,
                                                select_input, int_z, siegbahn,
                                                energy)
                        output = calc_output(select_input, int_z, siegbahn,
                                             energy)
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               output=output,
                                               units=Request_Units.CS_u,
                                               code_examples=examples)
                    else:
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               error=Request_Error.error)
                elif notation == 'All':
                    if validate_int(int_z) or validate_str(int_z):
                        output = all_trans_xrf(form.transition.iupac.choices,
                                               select_input, int_z, energy)
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               output=output,
                                               units=Request_Units.CS_u)
                    else:
                        return render_template('index.html',
                                               form=form,
                                               version=version,
                                               error=Request_Error.error)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input.startswith('CS_'):
            if validate_float(energy) and validate_int(
                    int_z_or_comp) or validate_str(int_z_or_comp):
                examples = code_example(form.examples.choices, select_input,
                                        int_z_or_comp, energy)
                output = calc_output(select_input, int_z_or_comp, energy)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       units=Request_Units.CS_u,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'DCS_Thoms':
            if validate_float(theta):
                output = calc_output(select_input, theta)
                examples = code_example(form.examples.choices, select_input,
                                        theta)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       units=Request_Units.DCS_u,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'DCS_KN' or select_input == 'ComptonEnergy':
            if validate_float(energy, theta):
                output = calc_output(select_input, energy, theta)
                examples = code_example(form.examples.choices, select_input,
                                        energy, theta)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       units=Request_Units.DCS_u,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input.startswith('DCS_'):
            if validate_float(energy, theta) and validate_int(
                    int_z_or_comp) or validate_str(int_z_or_comp):
                output = calc_output(select_input, int_z_or_comp, energy,
                                     theta)
                examples = code_example(form.examples.choices, select_input,
                                        int_z_or_comp, energy, theta)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       units=Request_Units.DCS_u,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'DCSP_KN':
            if validate_float(energy, theta, phi):
                output = calc_output(select_input, energy, theta, phi)
                examples = code_example(form.examples.choices, select_input,
                                        energy, theta, phi)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       units=Request_Units.DCS_u,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'DCSP_Thoms':
            if validate_float(theta, phi):
                output = calc_output(select_input, theta, phi)
                examples = code_example(form.examples.choices, select_input,
                                        theta, phi)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       units=Request_Units.DCS_u,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input.startswith('DCSP_'):
            if validate_float(energy, theta, phi) and validate_int(
                    int_z_or_comp) or validate_str(int_z_or_comp):
                output = calc_output(select_input, int_z_or_comp, energy,
                                     theta, phi)
                examples = code_example(form.examples.choices, select_input,
                                        int_z_or_comp, energy, theta, phi)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       units=Request_Units.DCS_u,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input.startswith('Fi'):
            if validate_int(
                    int_z) or validate_str(int_z) and validate_float(energy):
                output = calc_output(select_input, int_z, energy)
                examples = code_example(form.examples.choices, select_input,
                                        int_z, energy)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'CosKronTransProb':
            if validate_int(int_z) or validate_str(int_z):
                output = calc_output(select_input, int_z, cktrans)
                examples = code_example(form.examples.choices, select_input,
                                        int_z, cktrans)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'ComptonProfile':
            if validate_float(pz) and validate_int(int_z) or validate_str(
                    int_z):

                output = calc_output(select_input, int_z, pz)
                examples = code_example(form.examples.choices, select_input,
                                        int_z, pz)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'ComptonProfile_Partial':
            if validate_float(pz) and validate_int(int_z) or validate_str(
                    int_z):
                output = calc_output(select_input, int_z, shell, pz)
                examples = code_example(form.examples.choices, select_input,
                                        int_z, shell, pz)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'MomentTransf':
            if validate_float(energy, theta) == True:
                output = calc_output(select_input, energy, theta)
                examples = code_example(form.examples.choices, select_input,
                                        energy, theta)
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       output=output,
                                       code_examples=examples)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'Refractive_Index':

            # Special Case: Refractive_Index input needs to be const char compound
            if validate_float(energy, density) and validate_int(
                    int_z_or_comp) or validate_str(int_z_or_comp):
                try:
                    output = xraylib.Refractive_Index(
                        xraylib.AtomicNumberToSymbol(int(int_z_or_comp),
                                                     float(energy),
                                                     float(density)))
                    examples = code_example(form.examples.choices,
                                            select_input, int_z_or_comp,
                                            energy, density)
                    return render_template('index.html',
                                           form=form,
                                           version=version,
                                           output=output,
                                           code_examples=examples)
                except:
                    output = xraylib.Refractive_Index(int_z_or_comp,
                                                      float(energy),
                                                      float(density))
                    examples = code_example(form.examples.choices,
                                            select_input, int_z_or_comp,
                                            energy, density)
                    return render_template('index.html',
                                           form=form,
                                           version=version,
                                           output=output,
                                           code_examples=examples)
                else:
                    return render_template('index.html',
                                           form=form,
                                           version=version,
                                           error=Request_Error.error)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'CompoundParser':
            # Special Case: CompoundParser input needs to be const char compound
            if validate_str(comp):
                try:
                    out = xraylib.CompoundParser(str(comp))

                    # Format output
                    w_fracts = out['massFractions']
                    w_pers = [str(round(i * 100, 2)) + ' %' for i in w_fracts]
                    z = out['Elements']
                    sym = [
                        '<sub>' + str(i) + '</sub>' +
                        str(xraylib.AtomicNumberToSymbol(i)) for i in z
                    ]
                    mmass = str(out['molarMass']) + ' g mol<sup>-1</sup>'

                    output = {
                        'Elements': sym,
                        'Weight Fraction': w_pers,
                        'Number of Atoms': out['nAtoms'],
                        ' Molar Mass': mmass
                    }
                    examples = code_example(form.examples.choices,
                                            select_input, comp)
                    return render_template('index.html',
                                           form=form,
                                           version=version,
                                           output=output,
                                           code_examples=examples,
                                           units=Request_Units.per_u)
                except:
                    return render_template('index.html',
                                           form=form,
                                           version=version,
                                           error=Request_Error.error)
            else:
                return render_template('index.html',
                                       form=form,
                                       version=version,
                                       error=Request_Error.error)

        elif select_input == 'GetRadioNuclideDataList':
            output = xraylib.GetRadioNuclideDataList()
            output.insert(0, '<b> Radionuclides: </b>')
            output = '<br/>'.join(output)
            examples = code_example(form.examples.choices, select_input)
            return render_template('index.html',
                                   form=form,
                                   version=version,
                                   output=output,
                                   code_examples=examples)

        elif select_input == 'GetRadioNuclideDataByIndex':
            out = calc_output(select_input, rad_nuc)
            print(out)
            # Format output
            line_nos = out['XrayLines']
            x_energy = [xraylib.LineEnergy(out['Z_xray'], i) for i in line_nos]

            output = {
                'X-ray Energies': x_energy,
                'Disintegrations s<sup>-1</sup>': out['XrayIntensities'],
                'Gamma-ray Energy': out['GammaEnergies'],
                'Disintegrations s<sup>-1</sup> ': out['GammaIntensities']
            }
            examples = code_example(form.examples.choices,
                                    'GetRadioNuclideDataByName', rad_nuc)

            return render_template('index.html',
                                   form=form,
                                   version=version,
                                   output=output,
                                   code_examples=examples)

        elif select_input == 'GetCompoundDataNISTList':
            output = xraylib.GetCompoundDataNISTList()
            output.insert(0, '<b> NIST Compounds: </b>')
            output = '<br/>'.join(output)
            examples = code_example(form.examples.choices, select_input)
            return render_template('index.html',
                                   form=form,
                                   version=version,
                                   output=output,
                                   code_examples=examples)

        elif select_input == 'GetCompoundDataNISTByIndex':
            out = calc_output(select_input, nistcomp)

            # Format output
            w_fracts = out['massFractions']
            w_pers = [str(round(i * 100, 2)) + ' %' for i in w_fracts]
            z = out['Elements']
            sym = [
                '<sub>' + str(i) + '</sub>' +
                str(xraylib.AtomicNumberToSymbol(i)) for i in z
            ]
            density = str(out['density']) + ' g cm<sup>-3</sup>'

            output = {
                'Elements': sym,
                'Weight Fraction': w_pers,
                ' Density': density
            }
            examples = code_example(form.examples.choices,
                                    'GetCompoundDataNISTByName', nistcomp)
            return render_template('index.html',
                                   form=form,
                                   version=version,
                                   output=output,
                                   code_examples=examples)

    return render_template('index.html', form=form, version=version)
Ejemplo n.º 20
0
 def parse_compound(compund):
     return xraylib.CompoundParser(compund)
Ejemplo n.º 21
0
    def prerefl(cls, interactive=True, SYMBOL="SiC", DENSITY=3.217, FILE="prerefl.dat", E_MIN=100.0, E_MAX=20000.0,
                E_STEP=100.0):
        """
         Preprocessor for mirrors - python+xraylib version

         -"""

        # retrieve physical constants needed
        import scipy
        import xraylib

        import scipy.constants as codata

        tocm = codata.h * codata.c / codata.e * 1e2

        if interactive:
            # input section
            print("prerefl: Preprocessor for mirrors - python+xraylib version")
            iMaterial = input("Enter material expression (symbol,formula): ")
            density = input("Density [ g/cm3 ] ?")
            density = float(density)

            estart = input("Enter starting photon energy: ")
            estart = float(estart)

            efinal = input("Enter end photon energy: ")
            efinal = float(efinal)

            estep = input("Enter step photon energy:")
            estep = float(estep)

            out_file = input("Output file : ")
        else:
            iMaterial = SYMBOL
            density = DENSITY
            estart = E_MIN
            efinal = E_MAX
            estep = E_STEP
            out_file = FILE

        twopi = numpy.pi * 2
        npoint = int((efinal - estart) / estep + 1)
        depth0 = density / 2.0
        qmin = estart / tocm * twopi
        qmax = efinal / tocm * twopi
        qstep = estep / tocm * twopi

        f = open(out_file, 'wt')
        f.write(("%20.11e " * 4 + "\n") % tuple([qmin, qmax, qstep, depth0]))
        f.write("%i \n" % int(npoint))
        for i in range(npoint):
            energy = (estart + estep * i) * 1e-3
            tmp = 2e0 * (1e0 - xraylib.Refractive_Index_Re(iMaterial, energy, density))
            f.write("%e \n" % tmp)
        for i in range(npoint):
            energy = (estart + estep * i) * 1e-3
            tmp2 = 2e0 * (xraylib.Refractive_Index_Im(iMaterial, energy, density))
            f.write("%e \n" % tmp2)
        print("File written to disk: %s" % out_file)
        f.close()

        # test (not needed)
        itest = 0
        if itest:
            cdtest = xraylib.CompoundParser(iMaterial)
            print("    ", iMaterial, " contains %i atoms and %i elements" % (cdtest['nAtomsAll'], cdtest['nElements']))
            for i in range(cdtest['nElements']):
                print("    Element %i: %lf %%" % (cdtest['Elements'][i], cdtest['massFractions'][i] * 100.0))
            print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
            print(qmin, qmax, qstep, depth0)
            print(npoint)
            for i in range(npoint):
                energy = (estart + estep * i) * 1e-3
                qq = qmin + qstep * i
                print(energy, qq, \
                      2e0 * (1e0 - xraylib.Refractive_Index_Re(iMaterial, energy, density)), \
                      2e0 * (xraylib.Refractive_Index_Im(iMaterial, energy, density)))
            print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")

        return None