Exemple #1
0
    def test_get_mol_wt(self):
        dna1 = core.DnaSpeciesType(id='dna6', sequence_path=self.sequence_path)
        gene1 = eukaryote_schema.GeneLocus(polymer=dna1, start=1, end=6)
        rna1 = eukaryote_schema.PreRnaSpeciesType(gene=gene1)

        exon1 = eukaryote_schema.ExonLocus(start=1, end=1)
        transcript1 = eukaryote_schema.TranscriptSpeciesType(rna=rna1,
                                                             exons=[exon1])
        exp_mol_wt = \
            + Bio.SeqUtils.molecular_weight(transcript1.get_seq()) \
            - (transcript1.get_len() + 1) * mendeleev.element('H').atomic_weight
        self.assertAlmostEqual(transcript1.get_mol_wt(), exp_mol_wt, places=1)

        exon2 = eukaryote_schema.ExonLocus(start=3, end=3)
        transcript2 = eukaryote_schema.TranscriptSpeciesType(rna=rna1,
                                                             exons=[exon2])
        exp_mol_wt = \
            + Bio.SeqUtils.molecular_weight(transcript2.get_seq()) \
            - (transcript2.get_len() + 1) * mendeleev.element('H').atomic_weight
        self.assertAlmostEqual(transcript2.get_mol_wt(), exp_mol_wt, places=1)

        exon3 = eukaryote_schema.ExonLocus(start=5, end=5)
        transcript3 = eukaryote_schema.TranscriptSpeciesType(rna=rna1,
                                                             exons=[exon3])
        exp_mol_wt = \
            + Bio.SeqUtils.molecular_weight(transcript3.get_seq()) \
            - (transcript3.get_len() + 1) * mendeleev.element('H').atomic_weight
        self.assertAlmostEqual(transcript3.get_mol_wt(), exp_mol_wt, places=1)
Exemple #2
0
    def get_atomic_properties(self, atoms):
        """Get the properties of all atoms in the molecule

        Arguments:
            atoms {list} -- atoms and xyz position
        """

        # loop over all atoms
        for a in atoms:
            atom_data = a.split()
            self.atoms.append(atom_data[0])
            x, y, z = float(atom_data[1]), float(atom_data[2]), float(
                atom_data[3])

            conv2bohr = 1
            if self.unit == 'angs':
                conv2bohr = 1.88973
            self.atom_coords.append(
                [x * conv2bohr, y * conv2bohr, z * conv2bohr])

            self.atomic_number.append(element(atom_data[0]).atomic_number)
            self.atomic_nelec.append(element(atom_data[0]).electrons)
            self.nelec += element(atom_data[0]).electrons

        # size of the system
        self.natom = len(self.atoms)
        assert self.nelec % 2 == 0, "Only systems with equal up/down electrons allowed so far"
        self.nup = math.ceil(self.nelec / 2)
        self.ndown = math.floor(self.nelec / 2)
Exemple #3
0
def get_average_vdw_radii(site0, site1):
    vdw0 = element(site0.species_string).vdw_radius
    vdw1 = element(site1.species_string).vdw_radius

    vdw = (vdw0 + vdw1) / 200

    return vdw
Exemple #4
0
def formatting(e1, e2):
    e1, e2 = mdv.element(e1), mdv.element(e2)
    return '\t{}[{} {}] + [{} {}]'.format(
        getScoreFormat((e1.atomic_number,
                        e2.atomic_number)) if config['showScore'] else '',
        e1.symbol if not config['fullPrint'] else e1.name, e1.atomic_number,
        e2.symbol if not config['fullPrint'] else e2.name, e2.atomic_number)
Exemple #5
0
def drawBonds(coords):
	Bonds = []
	Bondslength = []
	for i in range(0, len(coords)):

		for j in range(i+1, len(coords)):

			if (i == j):
				continue

			(el1, x1, y1, z1) = (mendeleev.element(coords[i][0]), coords[i][1], coords[i][2], coords[i][3])
			(el2, x2, y2, z2) = (mendeleev.element(coords[j][0]), coords[j][1], coords[j][2], coords[j][3])
			name = coords[i][0] + str(i) + "-" + coords[j][0] + str(j)
			dist = math.sqrt((x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2)
			vdW = (el1.vdw_radius_bondi + el2.vdw_radius_bondi)/200
			loc = ((x2-x1)/2 + x1, (y2-y1)/2 + y2, (z2-z1)/2 + z2)
			bpy.ops.mesh.primitive_cylinder_add(radius=0.05, depth=dist, location=loc) 
			Bond = bpy.context.active_object
			Bond.rotation_mode = 'QUATERNION'
			Bond.data.materials.append(Materials[3])
			rotateCyl(Bond, Atoms[i], Atoms[j], dist)
			
			if (dist > vdW):

				Bond.hide_render = True
				Bond.hide = True

			Bonds.append(Bond)
			Bondslength.append(dist)
			
	return Bonds, Bondslength
Exemple #6
0
    def _get_atomic_properties(self, atoms):
        """Generates the atomic propeties of the molecule

        Args:
            atoms (str): atoms given in input
        """

        # loop over all atoms
        for a in atoms:
            atom_data = a.split()
            self.atoms.append(atom_data[0])
            x, y, z = float(atom_data[1]), float(atom_data[2]), float(
                atom_data[3])

            conv2bohr = 1
            if self.unit == 'angs':
                conv2bohr = 1.88973
            self.atom_coords.append(
                [x * conv2bohr, y * conv2bohr, z * conv2bohr])

            self.atomic_number.append(element(atom_data[0]).atomic_number)
            self.atomic_nelec.append(element(atom_data[0]).electrons)
            self.nelec += element(atom_data[0]).electrons

        # size of the system
        self.natom = len(self.atoms)
        if self.nelec % 2 != 0:
            raise ValueError("Only equal spin up/down supported.")
        self.nup = math.ceil(self.nelec / 2)
        self.ndown = math.floor(self.nelec / 2)

        # name of the system
        if self.name is None:
            self.name = self._get_mol_name(self.atoms)
        self.atoms = np.array(self.atoms)
Exemple #7
0
    def get_mode(self, mode_idx):
        """ Get (mode_idx + 1)-th mode in options['snf_out'].

        Parameters
        ----------
        mode_idx : :obj:`int`
            index of mode.

        Returns
        -------
        :obj:`pyiets.atoms.vibration.Mode`
            Mode object

        """
        wavenum, mode_vectors = self._get_mode_vectors(mode_idx)
        mode_vectors = np.array(mode_vectors,
                                dtype=np.float64).reshape(self.natoms, 3)
        isotope_masses = [
            np.float64(self.options['isotope_masses'][str(
                element(m).atomic_number)][str(
                    element(m).mass_number)]['mass'])
            for m in self.molecule.atoms
        ]
        mode = vib.Mode(vectors=mode_vectors,
                        atoms=self.molecule.atoms,
                        wavenumber=wavenum,
                        idx=mode_idx,
                        weighted=True,
                        isotope_masses=isotope_masses)
        return mode
Exemple #8
0
 def write(self, fname, digits=5):
     import mendeleev as md
     with open(fname, "w") as out:
         out.write(self.comment)
         out.write("{:5}{:12.6f}{:12.6f}{:12.6f}\n".format(
             len(self.geom.atoms),
             self.origin[0], self.origin[1], self.origin[2]))
         for i in range(3):
             out.write("{:5}{:12.6f}{:12.6f}{:12.6f}\n".format(
                 self.Np_vect[i],
                 self.Vect_M[i][0], self.Vect_M[i][1], self.Vect_M[i][2]))
         for i in range(len(self.geom.atoms)):
             out.write('{:5}{:12.6f}{:12.6f}{:12.6f}{:12.6f}\n'.format(
                 md.element(self.geom.atoms[i]).atomic_number,
                 md.element(self.geom.atoms[i]).atomic_number,
                 self.geom.inp_coords[i][0],
                 self.geom.inp_coords[i][1],
                 self.geom.inp_coords[i][2]))
         for x in range(self.Np_vect[0]):
             for y in range(self.Np_vect[1]):
                 for z in range(self.Np_vect[2]):
                     if (z+1) % 6 == 0 or z == self.Np_vect[2]-1:
                         out.write("{:{w}.{dd}e}\n".format(self.values[x][y][z],
                             w=8+digits, dd=digits))
                     else:
                         out.write("{:{w}.{dd}e}".format(self.values[x][y][z],
                             w=8+digits, dd=digits))
Exemple #9
0
    def system_features(self):
        """Computes system-specific features.
        :return: pd.DataFrame with features."""
        df = pd.DataFrame()

        # general
        df['natoms'] = [self.natoms]
        df['DFT_cohesive_energy'] = [self.cohesive_energy]

        # atom-wise
        ans = []
        evals = []
        for i, el in enumerate(self.composition.keys()):
            elid = element(el).atomic_number
            ans.append(elid)
            e_val = element(el).nvalence()
            evals.append(e_val)
            df['Z' + str(i)] = [elid]
            df['n' + str(i)] = self.composition[el]
            df['e_val' + str(i)] = [e_val]

        # mean
        df['Z_mean'] = [np.mean(ans)]
        df['e_val_mean'] = [np.mean(evals)]

        self._system_features = df
        return self._system_features
Exemple #10
0
    def test_get_mol_wt(self):
        dna1 = core.DnaSpeciesType(id='dna6', sequence_path=self.sequence_path)
        gene1 = eukaryote.GeneLocus(polymer=dna1, start=1, end=6)

        exon1 = eukaryote.GenericLocus(start=1, end=1)
        transcript1 = eukaryote.TranscriptSpeciesType(gene=gene1, exons=[exon1])
        exp_mol_wt = \
            + Bio.SeqUtils.molecular_weight(transcript1.get_seq()) \
            - (transcript1.get_len() + 1) * mendeleev.element('H').atomic_weight
        self.assertAlmostEqual(transcript1.get_mol_wt(), exp_mol_wt, places=1)

        exon2 = eukaryote.GenericLocus(start=3, end=3)
        transcript2 = eukaryote.TranscriptSpeciesType(gene=gene1, exons=[exon2])
        exp_mol_wt = \
            + Bio.SeqUtils.molecular_weight(transcript2.get_seq()) \
            - (transcript2.get_len() + 1) * mendeleev.element('H').atomic_weight
        self.assertAlmostEqual(transcript2.get_mol_wt(), exp_mol_wt, places=1)

        exon3 = eukaryote.GenericLocus(start=5, end=5)
        transcript3 = eukaryote.TranscriptSpeciesType(gene=gene1, exons=[exon3])
        exp_mol_wt = \
            + Bio.SeqUtils.molecular_weight(transcript3.get_seq()) \
            - (transcript3.get_len() + 1) * mendeleev.element('H').atomic_weight
        self.assertAlmostEqual(transcript3.get_mol_wt(), exp_mol_wt, places=1)

        # Test using input sequence
        test_trans = eukaryote.TranscriptSpeciesType()
        exp_mol_wt = \
            + Bio.SeqUtils.molecular_weight(transcript1.get_seq()) \
            - (transcript1.get_len() + 1) * mendeleev.element('H').atomic_weight
        self.assertAlmostEqual(test_trans.get_mol_wt(seq_input=Bio.Seq.Seq('A')), exp_mol_wt, places=1)
Exemple #11
0
def writeinput (mol, atom2basisset, fout, boption):

    fout.write("\'TYPE OF BASIS SET; 1 FOR GEOMETRIC, 2 FOR OPTIMIZED\'\n")
    fout.write("2\n")
    fout.write("\'NUMBER OF CENTERS\'\n" )
    fout.write(str(mol.get_num_of_atoms()) + "\n")

    totalelectrons = 0
    for a in mol.get_atoms():
        si = element(a.get_symbol())
        totalelectrons += si.electrons - a.get_charge()
    
    for i, a in enumerate(mol.get_atoms()):
        si = element(a.get_symbol())
        basisset = atom2basisset[a.get_symbol()]

        fout.write("\'COORDINATES FOR CENTER %5d \'\n"%(i+1)) 
        x = a.get_coordinates()[0] * boption.convertlengthunit
        y = a.get_coordinates()[1] * boption.convertlengthunit
        z = a.get_coordinates()[2] * boption.convertlengthunit
        fout.write("%12.8f %12.8f %12.8f\n"%(x,y,z))
        fout.write("\'Z, N, MAXL AND CHARGE FOR CENTER %5d \'\n"%(i+1)) 
        an = si.atomic_number
        aw = si.atomic_weight
        maxl = basisset["Dim"]
        fout.write("%d,%f,%d,%d\n"%(an, aw, maxl, a.get_charge()))
        fout.write("\'BASIS SET FOR CENTER %5d %s %s\'\n"%(i+1, a.get_symbol(),
            basisset["Basisname"]))
        for h, vs in zip(basisset["Header"], basisset["Values"]):
            fout.write(h + "\n")
            for v in vs:
                fout.write(v + "\n")

    fout.write("\'NUMBER OF CLOSED-SHELL ELECTRONS\'"+"\n")
    fout.write(str(totalelectrons) + ",0,0"+"\n")
    fout.write("\'SPECIFY CLOSED AND OPEN SHELLS AND COUPLING\'"+"\n")
    fout.write("0"+"\n")
    fout.write("\'ENTER 1 FOR NEW RUN AND 0 FOR RESTART\'"+"\n")
    fout.write(str(boption.restarton) + "\n")
    fout.write("\'LEVEL SHIFT FACTOR IN STAGE 0, 1, AND 2\'"+ "\n")
    fout.write("-2.0,-2.0,-2.0"+ "\n")
    fout.write("\'STARTING STAGE (0-2)\'"+ "\n")
    fout.write("2"+ "\n")
    fout.write("\'PRINT LEVEL FROM 1-2\'"+ "\n")
    fout.write("2"+ "\n")
    fout.write("\'DAMPING FACTOR AND RELATIVE TRESHOLD FOR INITIATION OF DAMPING\'"+ "\n")
    fout.write("0.10D0,1.0D-2"+ "\n")
    fout.write("\'ENTER NCORE, MACTVE,NACTVE\'"+ "\n")
    fout.write(str(totalelectrons) + ",0,0"+ "\n")
    fout.write("\'ENTER GRID QUALITY FROM 1 (COURSE) to 5 (FINE)\'"+ "\n")
    fout.write(str(boption.grid)+ "\n")
    fout.write("\'EX-POTENTIAL available: LDA,B88P86,HCTH93,BLYP'"+ "\n")
    fout.write(boption.functxc+ "\n")
    fout.write("\'Fitt 2=standard:fitt2 4=solo_poisson:fitt3 6=both:fitt2+fitt3, USEFITT\'"+ "\n")
    fout.write("2 " + str(boption.usefitt) + "\n")
    fout.write("\'scalapack\'"+ "\n")
    fout.write("2 2 32 2.0"+ "\n")
    fout.write("\'maxit\'"+ "\n")
    fout.write(str(boption.maxit) + "\n")
def get_atom_properties(atom_list):
    for atoms in atom_list:
        atomic_number = [element(atom).atomic_number for atom in atoms]
        atomic_volume = [element(atom).atomic_volume for atom in atoms]
        atomic_weight = [element(atom).atomic_weight for atom in atoms]
        all_atom_properties = list(
            zip(atomic_number, atomic_volume, atomic_weight))
        yield all_atom_properties
    def calculate_click(self):
        numRows = self.tableInput.rowCount()
        density = self.density_input.value()
        wavelength = self.wavelength_input.value()
        list_of_instances = []
        total_mass = 0
        passed = 0
        for row in range(numRows):
            elemInputItem = self.tableInput.item(row, 0)
            formulaUnitInputItem = self.tableInput.item(row, 1)
            try:
                elemInput = str(elemInputItem.text().strip(" "))
                print(elemInput)
                formulaUnitInput = float(formulaUnitInputItem.text())
                print(formulaUnitInput)
                if elemInput in self.scattering_dict:
                    elem_instance = ElementValues(elemInput, self.scattering_dict, formulaUnitInput)
                    list_of_instances.append(elem_instance)
                    total_mass += (formulaUnitInput * element(elem_instance.element).atomic_weight)
                    passed += 1
                else:
                    print("else raised")
                    self.totalAttBox.setText("ERROR: item not in dictionary")
            except:         # add TypeError??
                print("except raised")
                self.totalAttBox.setText("ERROR: input elements")

        self.tableOutput.setRowCount(len(list_of_instances))
        lin_att_total = 0
        for row, current_element in enumerate(list_of_instances):
            mendelem = element(current_element.element)  # use mendeleev package to get atomic info about element

            current_mass_fraction = (mendelem.atomic_weight * float(current_element.multiplier)) / total_mass

            current_number_density = (float(density) / mendelem.atomic_weight) * current_mass_fraction

            abs_x_section = (current_element.Absxs / 1.7980) * wavelength

            # matches NIST by multiplying only inc and abs by 0.6
            current_lin_att_fact = 0.6 * current_number_density * (current_element.Incxs + abs_x_section)
            lin_att_total += current_lin_att_fact

            table_outputs = [current_element.isotope, "{:f}".format(current_element.multiplier),
                             "{:f}".format(mendelem.atomic_weight), "{:f}".format(current_mass_fraction),
                             "{:f}".format(current_number_density), "{:f}".format(current_element.Cohxs),
                             "{:f}".format(current_element.Incxs), "{:f}".format(abs_x_section),
                             "{:f}".format(current_lin_att_fact)]

            for column, data in enumerate(table_outputs):
                self.tableOutput.setItem(row, column, QTableWidgetItem(data))
            self.tableOutput.resizeColumnsToContents()
            self.tableOutput.resizeRowsToContents()

        print(passed)
        if passed == numRows:
            self.totalAttBox.setText("{:f}".format(lin_att_total))
        else:
            pass
    def determine_protein_structure_from_aa(self, 
            polymer_id, count):
        """ Determine the empirical formula, molecular weight and charge of
            a protein based on the structural information of its metabolite
            amino acid monomers to ensure consistency with the pH

        Args:
            polymer_id (:obj:`str`): polymer ID
            count (:obj:`dict`): dictionary showing the count of each amino
                acid in the protein

        Returns:
            :obj:`wc_utils.util.chem.EmpiricalFormula`: protein empirical formula
            :obj:`float`: protein molecular weight
            :obj:`int`: protein charge
            :obj:`bool`: True if protein structure has been successfully determined
                from the metabolite monomer, else False             
        """                
        model = self.model
        amino_acid_id_conversion = self.options['amino_acid_id_conversion']
        
        total_empirical_formula = EmpiricalFormula()
        total_molecular_weight = 0
        total_charge = 0
        polymer_len = 0

        if not amino_acid_id_conversion:            
            return EmpiricalFormula(), 0, 0, False        
        
        for standard_id, met_id in amino_acid_id_conversion.items():
            if standard_id in count:
                monomer_species_type = model.species_types.get_one(id=met_id)
                if monomer_species_type:
                    total_empirical_formula += \
                        monomer_species_type.structure.empirical_formula * count[standard_id]
                    total_molecular_weight += \
                        monomer_species_type.structure.molecular_weight * count[standard_id]
                    total_charge += monomer_species_type.structure.charge * count[standard_id]
                    polymer_len += count[standard_id]    
                else:
                    return EmpiricalFormula(), 0, 0, False
            else:
                return EmpiricalFormula(), 0, 0, False        
        
        protein_empirical_formula = total_empirical_formula - \
            EmpiricalFormula('H{}O{}'.format(2 * (polymer_len - 1), polymer_len - 1))
        protein_molecular_weight = total_molecular_weight - \
            2 * (polymer_len - 1) * mendeleev.element('H').atomic_weight - \
            (polymer_len - 1) * mendeleev.element('O').atomic_weight 
        protein_charge = total_charge    
            
        model_species_type = model.species_types.get_one(id=polymer_id)
        if model_species_type:
            model_species_type.structure.empirical_formula = protein_empirical_formula
            model_species_type.structure.molecular_weight = protein_molecular_weight
            model_species_type.structure.charge = protein_charge
        
        return protein_empirical_formula, protein_molecular_weight, protein_charge, True        
Exemple #15
0
def drde(q, m_dm, sig0, tm='Si'):
    """
    The differential event rate of an expected WIMP.

    Parameters
    ----------
    q : array_like
        The recoil energies at which to calculate the dark matter differential
        event rate. Expected units are keV.
    m_dm : float
        The dark matter mass at which to calculate the expected differential
        event rate. Expected units are GeV.
    sig0 : float
        The dark matter cross section at which to calculate the expected differential
        event rate. Expected units are cm^2.
    tm : str, int, optional
        The target material of the detector. Must be passed as the atomic
        symbol. Can also pass a compound, but must be its chemical formula
        (e.g. sapphire is 'Al2O3'). Default value is 'Si'.

    Returns
    -------
    rate : ndarray
        The expected dark matter differential event rate for the inputted recoil energies,
        dark matter mass, and dark matter cross section. Units are events/keV/kg/day, 
        or "DRU".

    Notes
    -----
    The derivation of the expected dark matter differential event rate is done in Lewin and
    Smith's paper "Review of mathematics, numerical factors, and corrections dark matter experiments
    based on elastic nuclear recoil", which can be found here:
        - https://doi.org/10.1016/S0927-6505(96)00047-3

    The derivation by L&S is incomplete, see Eq. 22 of R. Schnee's paper "Introduction to Dark Matter
    Experiments", which includes the correct rate for `vmin` in the range (`vesc` - `ve`, `vesc` + `ve`)
        - https://arxiv.org/abs/1101.5205

    Another citation for this correction can be found in Savage, et. al.'s paper "Compatibility of
    DAMA/LIBRA dark matter detection with other searches", see Eq. 19. This is a different parameterization,
    but is the same solution.
        - https://doi.org/10.1088/1475-7516/2009/04/010

    """

    totalmassnum = sum(
        [mendeleev.element(t).mass_number * num for t, num in _mixed_tm(tm)])
    rate = sum([
        mendeleev.element(t).mass_number * num / totalmassnum * _drde(
            q,
            m_dm,
            sig0,
            t,
        ) for t, num in _mixed_tm(tm)
    ])

    return rate
 def __init__(self, molecule_map):
     self.molecule_map = molecule_map
     self.elements = {
         'H': element('H'),
         'C': element('C'),
         'N': element('N'),
         'O': element('O'),
         'F': element('F')
     }
Exemple #17
0
    def weight_pc(cls, wt_pc):
        wt_pc_2 = cls.check_pc(wt_pc)
        mol_pc = {}
        mol_tot = 0
        for m in wt_pc_2:
            mol_tot += wt_pc_2[m] / element(m).mass

        for m in wt_pc_2:
            mol_pc[m] = round(100 * (wt_pc_2[m] / element(m).mass) / mol_tot,
                              4)
        return cls(mol_pc)
Exemple #18
0
def plot_clementi_both(name, ax=None):
    """Plots Effective nuclear charge and shielding /% (Clementi) per orbital.

    Parameters
    ----------
    name : string
        String with the element symbol.
    ax : matplotlib.axes
        Axes for the plot (the default is None).

    Returns
    -------
    None
        Plot.

    """
    plot_param(ax)
    fontsize = 15
    linewidth = 4
    x = elem_data(name)['Orbital']
    y = elem_data(name)['Zef Clementi']
    ax.set_ylabel('Effective nuclear charge', size=fontsize, color='blue')
    ax.set_xlabel('Orbitals', size=fontsize)
    line1 = ax.plot(x,
                    y,
                    linewidth=linewidth,
                    label='Zef Clementi {0}'.format(element(name).symbol),
                    color='blue')
    ax.set_xticks = ([i for i in range(len(elem_data(name).index))])
    ax.set_yticks(np.linspace(0, round(ax.get_ybound()[1] + 1), 5))

    ax2 = ax.twinx()
    plot_param(ax2)
    y2 = elem_data(name)['% S Clementi']
    line2 = ax2.plot(x,
                     y2,
                     linewidth=linewidth,
                     linestyle='--',
                     label='Shielding % Clementi {0}'.format(
                         element(name).symbol),
                     color='red')
    ax2.set_ylabel('Shielding / %', size=fontsize, color='red')
    ax2.set_yticks(np.linspace(0, round(ax2.get_ybound()[1] + 1), 5))

    lines = line1 + line2
    labels = [l.get_label() for l in lines]

    ax2.legend(lines,
               labels,
               fontsize=fontsize - 1,
               loc='upper center',
               shadow=True,
               fancybox=True)
Exemple #19
0
def getElement(element):
    if re.match(r'\d+', element):
        element = int(element)
        if element >= 1 and element <= 118:
            return mdv.element(element)
        raise ValueError(f'Unknown Element Atomic Number \'{element}\'')
    elif re.match(r'\w{1,2}', element):
        try:
            return mdv.element(element.strip().title())
        except:
            raise ValueError(f'Unknown Element \'{element}\'')
    else:
        raise ValueError(f'Unknown Element Format \'{element}\'')
Exemple #20
0
def fetch_neutral_data() -> pd.DataFrame:
    """
    Get extensive set of data from multiple database tables as pandas.DataFrame
    """

    elements = fetch_table("elements")
    series = fetch_table("series")
    groups = fetch_table("groups")

    elements = pd.merge(
        elements,
        series,
        left_on="series_id",
        right_on="id",
        how="left",
        suffixes=("", "_series"),
    )
    elements = pd.merge(
        elements,
        groups,
        left_on="group_id",
        right_on="group_id",
        how="left",
        suffixes=("", "_group"),
    )

    elements.rename(columns={"color": "series_colors"}, inplace=True)

    for attr in ["hardness", "softness"]:
        elements[attr] = [
            getattr(element(row.symbol), attr)() for _, row in elements.iterrows()
        ]

    elements["mass"] = [
        element(row.symbol).mass_str() for _, row in elements.iterrows()
    ]

    elements.loc[:, "zeff_slater"] = elements.apply(
        lambda x: get_zeff(x["atomic_number"], method="slater"), axis=1
    )
    elements.loc[:, "zeff_clementi"] = elements.apply(
        lambda x: get_zeff(x["atomic_number"], method="clementi"), axis=1
    )

    ens = fetch_electronegativities()
    elements = pd.merge(elements, ens.reset_index(), on="atomic_number", how="left")

    ies = fetch_ionization_energies(degree=1)
    elements = pd.merge(elements, ies.reset_index(), on="atomic_number", how="left")

    return elements
 def get_mode(self, mode_idx):
     isotope_masses = [
         np.float64(self.options['isotope_masses'][str(
             element(m).atomic_number)][str(
                 element(m).mass_number)]['mass'])
         for m in self.molecule.atoms
     ]
     mode = vib.Mode(vectors=self.data.vibdisps[mode_idx],
                     atoms=self.molecule.atoms,
                     wavenumber=self.data.vibfreqs[mode_idx],
                     idx=mode_idx,
                     weighted=True,
                     isotope_masses=isotope_masses)
     return mode
Exemple #22
0
def atomic_number_symbol_dict():
    n_elements = 118
    an_symbol = {}
    for an in range(1, n_elements + 1):
        element = mendeleev.element(an)
        an_symbol[an] = element.symbol
    return an_symbol
Exemple #23
0
def orbitals(name):
    """Extracts n, l, and nl notation from electronic configuration info of
    Mendeleev package.

    Parameters
    ----------
    name : string
        Name or symbol for the chemical element.

    Returns
    -------
    lists
        Lists with orbital representation; quantrum principal number; orbital
        letter notation and quantum azimutal number.
    """
    elem = element(name)
    orbital_n = []
    orbital_l = []

    for k, v in elem.ec.conf.items():
        orbital_n.append(k[0])
        orbital_l.append(k[1])

    dict_l = {'s': 0, 'p': 1, 'd': 2, 'f': 3}
    orbital_l_num = []
    for i in orbital_l:
        if i in dict_l:
            orbital_l_num.append(dict_l[i])

    orbital = []
    for i in range(len(orbital_n)):
        orbital.append(str(orbital_n[i]) + orbital_l[i])

    return orbital, orbital_n, orbital_l, orbital_l_num
Exemple #24
0
def slater(name):
    """In quantum chemistry, Slater's rules provide numerical values for the
    effective nuclear charge concept. In a many-electron atom, each electron is
    said to experience less than the actual nuclear charge owing to shielding
    or screening by the other electrons.

    Parameters
    ----------
    name : string
        Name or symbol for the chemical element.

    Returns
    -------
    type list
        Three lists. The first one with the screening values, the second with
        the effective nuclear charge values and the third one with the
        screening percentage for each orbital of the electronic configuration
        of the element.

    """
    elem = element(name)
    slater_s = []
    zeff_slater = []

    for k, v in elem.ec.conf.items():
        slater_s.append(elem.ec.slater_screening(k[0], k[1]))
        zeff_slater.append(elem.atomic_number -
                           elem.ec.slater_screening(k[0], k[1]))

    slater_s_percent = [(i / elem.atomic_number) * 100 for i in slater_s]

    return slater_s, zeff_slater, slater_s_percent
Exemple #25
0
def plot_clementi_screening(name, ax=None, **kwargs):
    """Plots Shielding /% (Clementi) per orbital.

    Parameters
    ----------
    name : string
        String with the element symbol.
    ax : matplotlib.axes
        Axes for the plot (the default is None).
    **kwargs : string
        kwargs for plot parameters.

    Returns
    -------
    None
        Plot.

    """
    plot_param(ax)
    fontsize = 15
    linewidth = 4
    x = elem_data(name)['Orbital']
    y = elem_data(name)['% S Clementi']
    ax.set_ylabel('Shielding / %', size=fontsize)
    ax.set_xlabel('Orbitals', size=fontsize)
    ax.set_xticks = ([i for i in range(len(elem_data(name).index))])
    ax.set_yticks(np.arange(0, round(max(y)) + 5, 10.0))
    ax.plot(x,
            y,
            linewidth=linewidth,
            label='Shielding % Clementi {0}'.format(element(name).symbol),
            **kwargs)
    ax.legend(fontsize=fontsize - 2, loc='best', shadow=True, fancybox=True)
def create_dataframe():
    all_data = {}
    for number in range(1, 118 + 1):
        el = element(number)
        data = {
            # Group number
            'group': get_group(el),
            # Period number
            'period': get_period(el),
            # Pauling's electronegativity
            'electronegativity': el.en_pauling,
            # Cordero's covalent radius
            'covalent_radius': el.covalent_radius_cordero,
            # valence electrons
            'valence_electrons': el.nvalence(),
            # first ionization energy
            'first_ionization_energy': el.ionenergies.get(1),
            # electron affinity
            'electron_affinity': el.electron_affinity,
            # block
            'block': el.block,
            # atomic volume
            'atomic_volume': el.atomic_volume,
        }
        all_data[number] = data
    df = pd.DataFrame(all_data).transpose()

    # fill with mean
    df = df.fillna(df.mean())

    # log scale
    df['first_ionization_energy'] = np.log(df['first_ionization_energy'])
    df['atomic_volume'] = np.log(df['atomic_volume'])

    return df
Exemple #27
0
def readMatLabData(dataset, moleculeRow):
    mat_contents = sio.loadmat(dataset)

    masterAtomMatrix = mat_contents['Z']
    masterCartesianMatrix = mat_contents['R']

    masterAtomMatrix = np.array(masterAtomMatrix, dtype=object)
    masterCartesianMatrix = np.array(masterCartesianMatrix, dtype=object)
    #changes the heading rows in masterAtomMatrix to the actual atoms
    stopPoint1, stopPoint2 = None, None
    for i in range(len(masterAtomMatrix[0])):
        if masterAtomMatrix[moleculeRow, i] == float(0):
            stopPoint1 = i
            break
    nonZeros = masterAtomMatrix[moleculeRow, :stopPoint1]
    for i in range(len(nonZeros)):
        if nonZeros[i] == float(1):
            stopPoint2 = i
            break
    nonZerosAndNonOnes = nonZeros[:stopPoint2]
    nonZeros = sorted(nonZerosAndNonOnes) + [1.0] * (
        (len(nonZeros)) - stopPoint2)
    temp = nonZeros + [0.0] * ((len(masterAtomMatrix[0])) - stopPoint1)
    masterAtomMatrix[moleculeRow] = np.array(temp, dtype=object)
    for col in range(len(masterAtomMatrix[0])):
        atomicNumber = int(masterAtomMatrix[moleculeRow, col])
        if atomicNumber != 0:
            masterAtomMatrix[moleculeRow, col] = str(
                element(atomicNumber).symbol) + str(col + 1)
        else:
            pass
    return [masterAtomMatrix, masterCartesianMatrix]
Exemple #28
0
def max_electronegativity(chemical_formula):
    'returns the element symbol with the max electronegatvity'
    element_list = re.sub("[\.\(\)0-9]", '', chemical_formula).split()
    electronegativities = [
        chem.element(i).electronegativity() for i in element_list
    ]
    return element_list[electronegativities.index(max(electronegativities))]
def input_check(inpu):
    try:
        si = element(inpu)
    except:
        return ("False")
    else:
        return ("True")
def extract_xyz(xyz_data):
    # Extract atomic nums and coords from xyz data
    # remove the first two lines in the xyz file
    # (i.e. number of atom and optional comment)
    xyz_data = xyz_data.split('\n')[2:]

    # Extract the atomic nums and the coords
    atomic_symbols = []
    coords = []
    for line in xyz_data:
        line = line.strip()
        if not line:
            continue

        vals = line.split()[:4]

        if vals[0].isdigit():
            num = int(vals[0])
            atomic_symbols.append(element(num).symbol)
        else:
            atomic_symbols.append(vals[0])

        coords.append([float(x) for x in vals[1:]])

    return atomic_symbols, coords