class Fix_PQR: ''' Add metal atom to PDB2PQR output ''' def __init__(self, original_pdb, pqr_file, metal): self.ori_pdb = Read(original_pdb)[0] self.pqr = Read(pqr_file)[0] self.metal = metal self.new_pdb = pqr_file.split('.')[0] + '.pdb' if self.metal: zn = self.ori_pdb.allAtoms.get(lambda x: x.element == 'Zn') # remove hydrogens added to HYS residues near ZN atoms close_atoms = self.pqr.closerThan(zn[0].coords, self.pqr.allAtoms, 2.3) # FIXME: only take the first atoms in list for a in close_atoms: if a.element == 'H': # print a.name for b in a.bonds: at2 = b.atom1 if at2 == a: at2 = b.atom2 at2.bonds.remove(b) a.bonds.remove(b) a.parent.remove(a) del a self.pqr.allAtoms = self.pqr.chains.residues.atoms + zn writer = PdbWriter() writer.write(self.new_pdb, self.pqr.allAtoms, records=['ATOM', 'HETATM'])
class Fix_PQR: ''' Add metal atom to PDB2PQR output ''' def __init__(self, original_pdb, pqr_file, metals): self.ori_pdb = Read(original_pdb)[0] self.pqr = Read(pqr_file)[0] self.metals = metals self.new_pdb = pqr_file.split('.')[0] + '.pdb' uniq_list = {} # to avoid redundancy if self.metals: for met in self.metals: ele = met[1][:3].strip().lower() if ele not in uniq_list.keys(): uniq_list[ele] = met[2] else: continue met_atoms = self.ori_pdb.allAtoms.get( lambda x: x.element.lower() in uniq_list) for atm in met_atoms: atm.charge = uniq_list[atm.element.lower()] print 'atoms charge', atm.element, uniq_list[ atm.element.lower()] for met_atm in met_atoms: close_atoms = self.pqr.closerThan(met_atm.coords, self.pqr.allAtoms, 2.8) for a in close_atoms: if a.element == 'H': for b in a.bonds: at2 = b.atom1 if at2 == a: at2 = b.atom2 at2.bonds.remove(b) a.bonds.remove(b) a.parent.remove(a) del a self.pqr.allAtoms = self.pqr.chains.residues.atoms self.pqr.allAtoms = self.pqr.chains.residues.atoms + met_atoms writer = PdbWriter() writer.write(self.new_pdb, self.pqr.allAtoms, records=['ATOM', 'HETATM'])