示例#1
0
 def get_dens(self):
     """Gets estimated layer density from user.
     Could make this a calc from xtal struct in future...
     """
     user_alert('Layer Density:\nUsed solely to convert thicknesses in '
                'ug/cm^2 to Angstroms; has no effect on the results.')
     rho = get_nums('Approximate density (g/cm^3):', 25, 0)
     return rho
示例#2
0
    def setup_vars(self):
        """Get element data"""

        # Get element data from tables or calculation
        # Electron shell e.g. K, L1, M1, N1
        self.shell = self.get_shell()

        with open('atomic_data.txt', 'r') as data_file:
            for row in data_file:
                data = row.split("\t")
                if int(data[0]) == 0:
                    cols = data
                if self.z == int(data[0]):

                    # Element Mass
                    self.mass = float(data[cols.index('Mass')])

                    edge = float(data[cols.index(self.shell)])
                    # Absorption Edge [KeV]
                    self.edge = edge if edge > 0.0 else 50000.0

                    # Coster-Kronig Coefficients
                    # self.ck = float(
                    #        data[cols.index(get_options('ck (c12, c13, c23):',
                    #                                    ('c12', 'c13', 'c23'),
                    #                                    casesen = 'Lower'
                    #                                    ))])

                    xray = float(data[cols.index(self.line)])
                    # X-Ray Emmision Line Energy [KeV]
                    if xray > 0.0:
                        self.xray = xray
                    else:
                        50000.0
                        user_alert('X-Ray emmision line not valid for'
                                   'element %s\n X-Ray energy set to 50MeV.'
                                   '\nPlease select another line to prevent'
                                   'anomalous calculations!' %self.name)
        # Fluorescence Yields
        self.omega = self.get_omega()
        # Number of electrons in the ionized shell.
        self.znl = self.get_znl()
        # JUMP Ratios
        self.rjump = self.get_rjump()
        # EFFective Fluorescence YieLD
        self.effyld = self.get_effyld()
        # TRaNSition PROBability of line after shell ionization
        self.trnsprob = self.get_trnsprob()
示例#3
0
    def user_input(self, volt):

        z, name = get_options('Please enter Element Symbol:',
                              'els', count=True)
        # make sure the selected line is valid
        while True:
            line = get_options('Please enter Element X-Ray Line '
                               '(Ka, Lg2, etc.):', 'lines')
            xray = get_data(z, line)
            if xray > 0:
                break
            user_alert('Invalid line for this element; try again:')
        opt = self.get_opt()
        if volt is None:
            volt = get_nums('Accelerating voltage for this element?:',
                            50, 0)
        return name, line, z, volt, opt
示例#4
0
def Mac(el1, el2):
    """Calculation of Mass the Absorption Coefficient of an impinging X-Ray
    from el1 on el2.
    This calc needs to be checked.  See above refs"""

    if  el1.z == 5 and el2.z == 40:
        """ B xray interacting with Zr ???  weird"""
        xmu = 8270.0
        iflag = 2
    ie = ""
    cutoff = 0
    xray = el1.xray
    z = el2.z
    mass = el2.mass
    # calculate 'c' parameter
    if xray > get_data(z, 'K'):
        if z < 6:
            c = -2.87536e-4 + 1.808599e-3 * z
        else:
            c = (5.253e-3 +
                 1.33257e-3 * z +
                 -7.5937e-5 * z**2 +
                 1.69357e-6 * z**3 +
                 -1.3975e-8 * z**4)
    elif xray < get_data(z, 'L3'):
        c = (-9.24e-5 +
             1.41478e-4 * z +
             -5.24999e-6 * z**2 +
             9.85296e-8 * z**3 +
             -9.07306e-10 * z**4 +
             3.19254e-12 * z**5)
        if xray > get_data(z, 'L1'):
            c = c
        elif xray > get_data(z, 'L2'):
            c = c * 0.858
        else:
            c = c*(0.8933 - z*8.29e-3 + z**2*6.38e-5)
    elif xray > get_data(z, 'M1'):
        if z < 30:
            c = (1.889757e-2 +
                 -1.8517159e-3 * z +
                 6.9602789e-5 * z**2 +
                 -1.1641145e-6 * z**3 +
                 7.2773258e-9 * z**4)
        else:
            c = (3.0039e-3 +
                 -1.73663566e-4 * z +
                 4.0424792e-6 * z**2 +
                 -4.0585911e-8 * z**3 +
                 1.497763e-10 * z**4)
    elif xray > get_data(z, 'M5'):
        c1 = (7.7708e-5 +
              -7.83544e-6 * z +
              2.209365e-7 * z**2 +
              -1.29086e-9 * z**3)
        c2 = (1.406 +
              0.0162 * z +
              -6.561e-4 * z**2 +
              4.865e-6 * z**3)
        c3 = (0.584 +
              0.01955 * z +
              -1.285e-4 * z**2)
        c4 = (1.082 +
              1.366e-3 * z)
        c5 = (1.6442 +
              -0.0480 * z +
              4.0664e-4 * z**2)
        if xray > get_data(z, 'M2'):
            c = c1*c2*c3
        elif xray > get_data(z, 'M3'):
            c = c1*c2*c4
        elif xray > get_data(z, 'M4'):
            c = c1*c2*0.95
        else:  # M5
            ie = 'M5'
            c = c1*c2*c5
    else:
        c = 1.08*(4.3156e-3 +
                  -1.4653e-4 * z +
                  1.707073e-6 * z**2 +
                  -6.69827e-9 * z**3)
        if xray < get_data(z, 'N1'):
            cutoff = ((0.252*z - 31.1812)*z + 1042.)/1000.0
            ie = 'N1'

#      calculate 'n' parameter
    if xray > get_data(z, 'K'):
        if z < 6:
            n = (3.34745 +
                 0.02652873 * z +
                 -0.01273815 * z**2)
        else:
            n = (3.112 +
                 -0.0121 * z)
    elif xray > get_data(z, 'L3'):
        n = (2.7575 +
             1.889e-3 * z +
             -4.982e-5 * z**2)
    elif xray > get_data(z, 'M1'):
        n = (0.5385 +
             0.084597 * z +
             -1.08246e-3 * z**2 +
             4.4509e-6 * z**3)
    elif xray > get_data(z, 'M5'):
        n = 3.0 - 0.004*z
    else:
        n = 0.3736 + 0.02401*z

#      calculate 'a' parameter
    if xray > get_data(z, 'K'):
        if z < 6:
            a = (24.4545 +
                 155.6055 * z +
                 -14.15422 * z**2)
        else:
            a = (47.0 * z +
                 6.52 * z**2 +
                 -0.152624 * z**3)
    elif xray > get_data(z, 'L3'):
        a = (17.8096 * z +
             0.067429 * z**2 +
             0.01253775 * z**3 +
             -1.16286e-4 * z**4)
    elif xray > get_data(z, 'M1'):
        a = (10.2575657 * z +
             -0.822863477 * z**2 +
             2.63199611e-2 * z**3 +
             -1.8641019e-4 * z**4)
    elif xray > get_data(z, 'M5'):
        a = (4.62 * z +
             -0.04 * z**2)
    else:
        a = (19.64 * z +
             -0.61239 * z**2 +
             5.39309e-3 * z**3)

#      calculate 'b' parameter
    if xray > get_data(z, 'K'):
        if z < 6:
            b = -103. + 18.2*z
        else:
            b = 0.
    elif xray > get_data(z, 'L3'):
        b = 0.
    elif xray > get_data(z, 'M1'):
        if z < 61:
            b = (5.654 * z +
                 -0.536839169 * z**2 +
                 0.018972278 * z**3 +
                 -1.683474e-4 * z**4)
        else:
            b = (-1232.4022 * z +
                 51.114164 * z**2 +
                 -0.699473097 * z**3 +
                 3.1779619e-3 * z**4)
    elif xray > get_data(z, 'M5'):
        b = (2.51 +
             (-0.052) * z +
             3.78e-4 * z**2) * get_data(z, 'M4') * 1000.
    else:
        b = -113. + 4.5*z

    if xray > get_data(z, 'N1'):
        qq = (-xray*1000.+b)/a
        if qq > 88.:
            qq = 88.
        elif qq < -88.:
            qq = -88.

        xmu = c * z**4 / mass * ((12.397 / xray)**n) * (1. - np.exp(qq))
        if xmu < 0.0:
            mess = '!!!   negative  mac    !!!'
    else:
        xmu = (((12.397 / xray)**n) * c * z**4 / mass * (xray - cutoff) /
               (1.08 * get_data(z, 'N1')))
    if xray < 1.1 * cutoff:
        mess = '!!!  Ec<1.1xcutoff     !!!'
    elif xray - cutoff < 0.02 and xray - cutoff > -0.005:
        mess = '!!!  close to edge     !!!'
    else:
        mess = 'Good!!'
    if ie == 'M5':
        mess += '!!!M4>Ec>M5 edge & Zab<70!!!'
        if el2.mass >= 70:
            mess = 'Good!!'
    if ie == 'N1':
        mess += '!!!  Ec below M5 edge  !!!'
    if xmu < 0.0 and ie == 'N1':
        mess = '!!!neg. mac & Ec<M5edge!!!'
    user_alert(mess + '\nemiter=%s %s; absorber=%s; mu=%.4g'
               % (el1.name, el1.line, el2.name, xmu))

    if xmu <= 0.0:
        xmu1 = xmu
        xmu = get_nums('MAC is negative; Enter a value for this MAC :')
        user_alert('emiter=%s %s; absorber=%s;'
                   'mu changed from %.4g to %.4g'
                   % (el1.name, el1.line, el2.name, xmu1, xmu))
    return xmu