计算Python中的元素符号

时间:2016-11-08 09:58:14

标签: python python-2.7 counter bioinformatics

我是一名生物学家,我在编程方面颇有新意,但现在我正努力改进;我的背景不是信息学。

我陷入了困境。

我们有关于分子的一些信息;以ATOM开头的每一行代表整个分子的一个原子。例如,前两行:

ATOM      1  N   ARG A   1       0.609  18.920  11.647  1.00 18.79           N

ATOM      2  CA  ARG A   1       0.149  17.722  10.984  1.00 13.68           C

我们应该计算不同原子的数量;更好地说,例如,每一行的最后一项(CN。)

我们已经有了驱动我们并提取最后一项的功能,但我在这一点上非常困难,因为我们应该编写代码,好像我们不知道我们会找到哪些原子(虽然我们知道,因为我们有完整的列表,我们有NCOS

我们的代码:

def count_atom(molecule):

    number_atoms = dict()
    lines = molecule.split(os.linesep)
    for line in lines:
        if line.startswith('ATOM'):
            atom = line[77].strip()
        print atom


    return number_atoms

results= count_atoms(molecule)

molecule代表整个列表。

5 个答案:

答案 0 :(得分:2)

希望我理解你,但你想计算字符串最后一个字符的出现次数吗?

CC -o binary -B direct -z origin -std=c++11 object_files.o -Lblah/lib -R\$ORIGIN/../lib -lotherlib -L/usr/sfw/lib -R/usr/sfw/lib -lcrypto -lsocket
unused $ADDVERS specification from file '/opt/developerstudio12.5/lib/compilers/CC-gcc/gcc_version.map' for object 'libgcc_s.so'
version(s):
        GCC_4.2.0

输出:

molecule = '''ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Se
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Pu
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Pu
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C'''

def count_atoms(molecule):
    number_atoms = dict()
    lines = molecule.split(os.linesep)
    for line in lines:
        if line.startswith('ATOM'):
            atom = line.split()[-1].strip()
            if number_atoms.get(atom):
                number_atoms[atom] += 1
            else:
                number_atoms.update({atom: 1})
    return number_atoms

print(count_atoms(molecule))

答案 1 :(得分:1)

欢迎使用Python!

Python有许多有用的模块来处理常见问题。

要解决您的问题,您可以从Counter

导入collections
from collections import Counter

>>> molecule = '''ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N
    ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C
    ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C'''
>>> Counter(line.split()[-1] for line in molecule.splitlines())
Counter({'C': 2, 'N': 1})

line.split()[-1]获取该行的最后一个单词,以防您的元素具有较长的化学符号,splitlines()将这些行彼此分开。

Counter可以相互添加和减去,这可能对您有用:

>>> mycount = Counter(line.split()[-1] for line in molecule.splitlines())
>>> mycount + mycount
Counter({'C': 4, 'N': 2})

这不仅可以获得不同原子的数量,还可以获得整个分子中出现的数量。 可以通过len)的Counter来检索不同原子的数量:

>>> len(Counter(line.split()[-1] for line in molecule.splitlines()))
2

更详细的例子:

molecule = '''ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N
ATOM 2 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C
ATOM 3 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Se
ATOM 4 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Pu
ATOM 5 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 Pu
ATOM 6 CA ARG A 1 0.149 17.722 10.984 1.00 13.68 C'''
>>> Counter(line.split()[-1] for line in molecule.splitlines())
Counter({'C': 2, 'N': 1, 'Pu': 2, 'Se': 1})
>>> len(Counter(line.split()[-1] for line in molecule.splitlines()))
4

答案 2 :(得分:1)

尽管所有答案在Python方面都是正确的,但我们有来自PDB file

的行

记录格式

COLUMNS        DATA  TYPE    FIELD        DEFINITION
-------------------------------------------------------------------------------------
 1 -  6        Record name   "ATOM  "
[...]
77 - 78        LString(2)    element      Element symbol, right-justified.
[...]

对于存在于大量蛋白质结构中的SE lenium等元素,需要考虑两个字符[77-78],否则它将变为S ulfur或E

如果您不想自己处理整个解析问题,可以将BioPython's PDB模块与上述任何解决方案结合使用。

from Bio.PDB import PDBParser
from collections import Counter
parser = PDBParser()
structure = parser.get_structure('PHA-L', '1fat.pdb')

atoms = list()
for model in structure:
    for chain in model:
        for residue in chain:
            for atom in residue:
                atoms.append(atom.element)

print(Counter(atoms))
  

Counter({'C': 4570, 'O': 1463, 'N': 1207, 'MN': 4, 'CA': 4})

答案 3 :(得分:0)

由于您的示例中的行长度不同,因此尝试按索引访问数据不是一个好主意,就像您在atom = line[77].strip()中所做的那样

正如你所说,区分原子的信息是最后一个字符。因此,您可以使用列表中的最后一项索引表示法访问最后一个字符。

>>> data = "ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N"
>>> print(data[-1])
N

答案 4 :(得分:0)

lines = ['ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N', 'ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 C', 'ATOM 1 N ARG A 1 0.609 18.920 11.647 1.00 18.79 N']

all_elements = {l.split()[-1]  for l in lines}    
counts = {element: 0 for element in all_elements}
for line in lines: 
    counts[line.split()[-1]] += 1
counts
{'C': 1, 'N': 2}

这是你如何计算每个元素的原子数,如果你只需要元素数,你可以只使用len(counts)