80 lines
3.0 KiB
Python
80 lines
3.0 KiB
Python
import sys
|
|
#import collections
|
|
|
|
|
|
# custom imports
|
|
from atom import *
|
|
|
|
class PDBFile:
|
|
|
|
def getContent(self, filename):
|
|
with open(filename) as f:
|
|
return(f.readlines())
|
|
|
|
def getHeader(self):
|
|
#Metadata = collections.namedtuple("Metadata", ["header", "compound", "source", "author"])
|
|
Metadata = {}
|
|
for line in self.rawLines:
|
|
# no need to continue if meta are complete
|
|
if(len(Metadata) <4):
|
|
if(line[0:10] == "HEADER "):
|
|
Metadata['header']=line
|
|
elif(line[0:10] == "COMPND 2"):
|
|
Metadata['compound']=line
|
|
elif(line[0:10] == "SOURCE 2"):
|
|
Metadata['source']=line
|
|
elif(line[0:10] == "AUTHOR "):
|
|
Metadata['author']=line
|
|
else:
|
|
# if meta are complete, stop parsing
|
|
break
|
|
return(Metadata)
|
|
|
|
def getAtoms(self):
|
|
self.ATOMS = []
|
|
self.RESIDUES = []
|
|
tempAtoms = []
|
|
for line in self.rawLines:
|
|
if line.startswith("ATOM" or "HETATM"):
|
|
atom = Atom(ATOM_ID = int(line[6:11].strip()),
|
|
ATOM_NAME = line[12:16].strip(),
|
|
ALT_LOCAT = line[16:17].strip(),
|
|
RES_NAME = line[17:20].strip(),
|
|
CHAIN_ID = line[21:22].strip(),
|
|
RES_SEQ_NB = int(line[22:26].strip()),
|
|
RES_INSER_CODE = line[26:27].strip(),
|
|
COORD_X = float(line[30:38].strip()),
|
|
COORD_Y = float(line[38:46].strip()),
|
|
COORD_Z = float(line[46:54].strip()),
|
|
OCCUPANCY = float(line[54:60].strip()),
|
|
TEMP_FACT = float(line[60:66].strip()),
|
|
ELEM_SYMBOL = line[76:78].strip(),
|
|
ATOM_CHARGE = line[78:80].strip())
|
|
self.ATOMS.append(atom)
|
|
# get the current indice of atom
|
|
i = self.ATOMS.index(atom)
|
|
# if this is a brand new residue
|
|
if(len(self.ATOMS)>1
|
|
and atom.RES_SEQ_NB != self.ATOMS[i-1].RES_SEQ_NB):
|
|
self.RESIDUES.append(Residue(tempAtoms))
|
|
tempAtoms=[]
|
|
tempAtoms.append(atom)
|
|
# last residue
|
|
self.RESIDUES.append(Residue(tempAtoms))
|
|
|
|
def __init__(self, filename):
|
|
self.rawLines = self.getContent(filename)
|
|
self.Metadata = self.getHeader()
|
|
self.getAtoms()
|
|
for elem in self.Metadata :
|
|
print(self.Metadata[elem], end="")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if(len(sys.argv)<2):
|
|
print("Not enough arguments! Run with --help to learn more about proper"
|
|
"call structure and parameters.")
|
|
else:
|
|
pdbFile = PDBFile(sys.argv[1])
|
|
print(pdbFile.RESIDUES[0].ATOMS["N"].COORD_X)
|