mirror of
https://github.com/jertubiana/ScanNet.git
synced 2026-06-04 13:44:22 +08:00
595 lines
13 KiB
Python
595 lines
13 KiB
Python
import numpy as np
|
|
from numba import types
|
|
from numba.typed import List,Dict
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
list_atoms_types = ['C', 'O', 'N', 'S'] # H
|
|
VanDerWaalsRadii = np.array([1.70, 1.52, 1.55, 1.80]) # 1.20
|
|
|
|
atom_mass = np.array(
|
|
[
|
|
12, # C
|
|
16, # O
|
|
14, # N
|
|
32 # S
|
|
]
|
|
)
|
|
|
|
|
|
atom_type_to_index = dict([(list_atoms_types[i], i)
|
|
for i in range(len(list_atoms_types))])
|
|
|
|
|
|
list_atoms = ['C', 'CA', 'CB', 'CD', 'CD1', 'CD2', 'CE', 'CE1', 'CE2', 'CE3',
|
|
'CG', 'CG1', 'CG2', 'CH2', 'CZ', 'CZ2', 'CZ3', 'N', 'ND1', 'ND2',
|
|
'NE', 'NE1', 'NE2', 'NH1', 'NH2', 'NZ', 'O', 'OD1', 'OD2', 'OE1',
|
|
'OE2', 'OG', 'OG1', 'OH', 'OXT', 'SD', 'SE', 'SG']
|
|
|
|
atom_to_index = dict([(list_atoms[i], i) for i in range(len(list_atoms))])
|
|
atom_to_index['OT1'] = atom_to_index['O']
|
|
atom_to_index['OT2'] = atom_to_index['OXT']
|
|
|
|
index_to_type = np.zeros(38,dtype=np.int)
|
|
for atom,index in atom_to_index.items():
|
|
index_to_type[index] = list_atoms_types.index(atom[0])
|
|
|
|
atom_type_mass = np.zeros( 38 )
|
|
for atom,index in atom_to_index.items():
|
|
atom_type_mass[index] = atom_mass[index_to_type[index]]
|
|
|
|
'''
|
|
No exotic amino acids supported yet.
|
|
'''
|
|
|
|
list_aa = [
|
|
'A',
|
|
'C',
|
|
'D',
|
|
'E',
|
|
'F',
|
|
'G',
|
|
'H',
|
|
'I',
|
|
'K',
|
|
'L',
|
|
'M',
|
|
'N',
|
|
'P',
|
|
'Q',
|
|
'R',
|
|
'S',
|
|
'T',
|
|
'V',
|
|
'W',
|
|
'Y'
|
|
|
|
]
|
|
|
|
residue_dictionary = {'CYS': 'C', 'ASP': 'D', 'SER': 'S', 'GLN': 'Q', 'LYS': 'K',
|
|
'ILE': 'I', 'PRO': 'P', 'THR': 'T', 'PHE': 'F', 'ASN': 'N',
|
|
'GLY': 'G', 'HIS': 'H', 'HSD':'H','HSE':'H',
|
|
'LEU': 'L', 'ARG': 'R', 'TRP': 'W',
|
|
'ALA': 'A', 'VAL': 'V', 'GLU': 'E', 'TYR': 'Y', 'MET': 'M',
|
|
'MSE': 'M',
|
|
'PTR':'Y',
|
|
'TYS':'Y',
|
|
'SEP':'S',
|
|
'TPO':'T',
|
|
'HIP':'H',
|
|
}
|
|
|
|
hetresidue_field = [' '] + ['H_%s'%name for name in residue_dictionary.keys()]
|
|
|
|
aa_to_index = dict([(list_aa[i],i) for i in range(20)])
|
|
|
|
'''
|
|
!!!! Non-exhaustive, only included the first two bonds.
|
|
'''
|
|
|
|
dictionary_covalent_bonds = {
|
|
'A':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT':['C',None],
|
|
'CB': ['CA', None]
|
|
},
|
|
'C':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'SG'],
|
|
'SG': ['CB', None]
|
|
},
|
|
'D':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'OD1'],
|
|
'OD1': ['CG', None],
|
|
'OD2': ['CG', None],
|
|
},
|
|
'E':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'CD'],
|
|
'CD': ['CG', 'OE1'],
|
|
'OE1': ['CD', None],
|
|
'OE2': ['CD', None]
|
|
},
|
|
'F':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'CD1'],
|
|
'CD1': ['CG', 'CE1'],
|
|
'CE1': ['CD1', 'CZ'],
|
|
'CZ': ['CE1', 'CE2'],
|
|
'CE2': ['CD2', 'CZ'],
|
|
'CD2': ['CG', 'CE2']
|
|
},
|
|
'G':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
},
|
|
'H':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'ND1'],
|
|
'ND1': ['CG', 'CE1'],
|
|
'CE1': ['ND1', 'NE2'],
|
|
'NE2': ['CE1', 'CD2'],
|
|
'CD2': ['NE2', 'CG']
|
|
},
|
|
'I':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG1'],
|
|
'CG1': ['CB', 'CD1'],
|
|
'CG2': ['CB', None],
|
|
'CD1':['CG1',None]
|
|
},
|
|
'K':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'CD'],
|
|
'CD': ['CG', 'CE'],
|
|
'CE': ['CD', 'NZ'],
|
|
'NZ': ['CE', None],
|
|
},
|
|
'L':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'CD1'],
|
|
'CD1': ['CG', None],
|
|
'CD2': ['CG', None]
|
|
},
|
|
'M':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'SD'],
|
|
'SD': ['CG', 'CE'],
|
|
'CE':['SD',None]
|
|
},
|
|
'N':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'OD1'],
|
|
'OD1': ['CG', None],
|
|
'ND2': ['CG', None]
|
|
},
|
|
'P':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'CD'],
|
|
'CD': ['CG', 'N']
|
|
},
|
|
'Q':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'CD'],
|
|
'CD': ['CG', 'OE1'],
|
|
'OE1': ['CD', None],
|
|
'NE2': ['CD', None]
|
|
},
|
|
'R':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'CD'],
|
|
'CD': ['CG', 'NE'],
|
|
'NE': ['CD', 'CZ'],
|
|
'CZ': ['NE', 'NH1'],
|
|
'NH1': ['CZ', None],
|
|
'NH2': ['CZ', None]
|
|
},
|
|
'S':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'OG'],
|
|
'OG': ['CB', None],
|
|
},
|
|
'T':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'OG1'],
|
|
'OG1': ['CB', None],
|
|
'CG2': ['CB', None]
|
|
},
|
|
'V':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG1'],
|
|
'CG1': ['CB', None],
|
|
'CG2': ['CB', None],
|
|
},
|
|
'W':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'CD1'],
|
|
'CD1': ['CG', 'NE1'],
|
|
'NE1': ['CD1', 'CE2'],
|
|
'CD2': ['CG', 'CE2'],
|
|
'CE2': ['CD2', 'CZ2'],
|
|
'CZ2': ['CE2', 'CH2'],
|
|
'CH2': ['CZ2', 'CZ3'],
|
|
'CZ3': ['CH2', 'CE3'],
|
|
'CE3': ['CZ3', 'CD2']
|
|
},
|
|
'Y':{
|
|
'C': ['CA', 'N'],
|
|
'CA': ['N', 'C'],
|
|
'N': ['C', 'CA'],
|
|
'O': ['C', None],
|
|
'OXT': ['C', None],
|
|
'CB': ['CA', 'CG'],
|
|
'CG': ['CB', 'CD1'],
|
|
'CD1': ['CG', 'CE1'],
|
|
'CE1': ['CD1', 'CZ'],
|
|
'CZ': ['CE1', 'CE2'],
|
|
'CE2': ['CD2', 'CZ'],
|
|
'CD2': ['CG', 'CE2'],
|
|
'OH': ['CZ', None]
|
|
}
|
|
}
|
|
|
|
|
|
dictionary_covalent_bonds_numba = Dict.empty(
|
|
key_type=types.unicode_type,
|
|
value_type=types.int32[:],
|
|
)
|
|
|
|
for aa,atom_covalent_bonds in dictionary_covalent_bonds.items():
|
|
for atom,bonds in atom_covalent_bonds.items():
|
|
bonds_num = -1 * np.ones(3,dtype=np.int32)
|
|
for l,bond in enumerate(bonds):
|
|
if bond is not None:
|
|
bonds_num[l] = atom_to_index[bond]
|
|
dictionary_covalent_bonds_numba['%s_%s'%(aa, atom_to_index[atom] )] = bonds_num
|
|
|
|
|
|
|
|
list_atom_valencies = [
|
|
'C',
|
|
'CH',
|
|
'CH2',
|
|
'CH3',
|
|
'CPi',
|
|
'O',
|
|
'OH',
|
|
'N',
|
|
'NH',
|
|
'NH2',
|
|
'S',
|
|
'SH'
|
|
]
|
|
|
|
dictionary_atom_valencies = {
|
|
'A': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'CB': 'CH3',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'N': 'NH'
|
|
},
|
|
'C': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'CB': 'CH2',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'N': 'NH',
|
|
'SG': 'SH'
|
|
},
|
|
'D': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'CB': 'CH2',
|
|
'CG': 'C',
|
|
'O': 'O',
|
|
'OD1': 'O',
|
|
'OD2': 'OH',
|
|
'OXT': 'OH',
|
|
'N': 'NH',
|
|
},
|
|
'E': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'CB': 'CH2',
|
|
'CG': 'CH',
|
|
'CD': 'C',
|
|
'O': 'O',
|
|
'OE1': 'O',
|
|
'OE2': 'OH',
|
|
'OXT': 'OH',
|
|
'N': 'NH',
|
|
},
|
|
'F': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'CB': 'CH2',
|
|
'CG': 'CPi',
|
|
'CD1': 'CPi',
|
|
'CD2': 'CPi',
|
|
'CE1': 'CPi',
|
|
'CE2': 'CPi',
|
|
'CZ': 'CPi',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
},
|
|
'G': {
|
|
'C': 'C',
|
|
'CA': 'CH2',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH'
|
|
},
|
|
'H': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'CB': 'CH2',
|
|
'CG': 'CPi',
|
|
'CE1': 'CPi',
|
|
'CD2': 'CPi',
|
|
'N': 'NH',
|
|
'ND1': 'N',
|
|
'ND2': 'NH2', # Supprimer cette ligne pour la prochaine mise a jour.
|
|
# 'NE2': 'NH2', # Mettre cette ligne pour la prochaine mise a jour.
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
},
|
|
'I': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'CB': 'CH',
|
|
'CG1': 'CH2',
|
|
'CG2': 'CH3',
|
|
'CD1': 'CH3',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH'
|
|
},
|
|
'K': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH2',
|
|
'CG': 'CH2',
|
|
'CD': 'CH2',
|
|
'CE': 'CH2',
|
|
'NZ': 'NH2'
|
|
},
|
|
'L': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH2',
|
|
'CG': 'CH',
|
|
'CD1': 'CH3',
|
|
'CD2': 'CH3',
|
|
},
|
|
'M': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH2',
|
|
'CG': 'CH2',
|
|
'SD': 'S',
|
|
'CE': 'CH3'
|
|
},
|
|
'N': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH2',
|
|
'CG': 'C',
|
|
'OD1': 'O',
|
|
'ND2': 'NH2'
|
|
},
|
|
'P': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'N',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH2',
|
|
'CG': 'CH2',
|
|
'CD': 'CH2'
|
|
},
|
|
'Q': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH2',
|
|
'CG': 'CH2',
|
|
'CD': 'C',
|
|
'OE1': 'O',
|
|
'NE2': 'NH2'
|
|
},
|
|
'R': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH2',
|
|
'CG': 'CH2',
|
|
'CD': 'CH2',
|
|
'NE': 'NH',
|
|
'CZ': 'C',
|
|
'NH1': 'NH',
|
|
'NH2': 'NH2'
|
|
},
|
|
'S': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH2',
|
|
'OG': 'OH',
|
|
},
|
|
'T': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH',
|
|
'OG1': 'OH',
|
|
'CG2': 'CH3'
|
|
},
|
|
'V': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH',
|
|
'CG1': 'CH3',
|
|
'CG2': 'CH3',
|
|
},
|
|
'W': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH2',
|
|
'CG': 'CPi',
|
|
'CD1': 'CPi',
|
|
'NE1': 'NH',
|
|
'CD2': 'CPi',
|
|
'CE2': 'CPi',
|
|
'CZ2': 'CPi',
|
|
'CH2': 'CPi',
|
|
'CZ3': 'CPi',
|
|
'CE3': 'CPi'
|
|
},
|
|
'Y': {
|
|
'C': 'C',
|
|
'CA': 'CH',
|
|
'N': 'NH',
|
|
'O': 'O',
|
|
'OXT': 'OH',
|
|
'CB': 'CH2',
|
|
'CG': 'CPi',
|
|
'CD1': 'CPi',
|
|
'CE1': 'CPi',
|
|
'CZ': 'CPi',
|
|
'CE2': 'CPi',
|
|
'CD2': 'CPi',
|
|
'OH': 'OH'
|
|
}
|
|
|
|
}
|
|
|
|
|
|
index_to_valency = np.zeros([20, 38], dtype=np.int)
|
|
for k, aa in enumerate(list_aa):
|
|
for key, value in dictionary_atom_valencies[aa].items():
|
|
i = list_atoms.index(key)
|
|
j = list_atom_valencies.index(value)
|
|
index_to_valency[k, i] = j
|