def find_hbonds(parsed, ifgatoms): ifgsele = parsed.select('chain X and resnum 1 and name %s'%(' '.join(ifgatoms))) # find any hbond donors acc_hyd_don_list = [] ifgdon = ifgsele.select('element O N') if ifgdon is not None: for donor in ifgdon.iterAtoms(): hyds = pr.Contacts(parsed)(1.1, donor.getCoords()).select('element H D') if hyds is not None: for hyd in hyds.iterAtoms(): acceptors = pr.Contacts(parsed)(2.5, hyd.getCoords()).select('element O N \ and not (chain X and resnum 1)') if acceptors is not None: for acceptor in acceptors.iterAtoms(): acc_hyd_don_list.append([acceptor, hyd, donor]) # find any hbond acceptors ifgacc = ifgsele.select('element O or (resname HIS and sidechain and element N)') if ifgacc is not None: for acceptor in ifgacc.iterAtoms(): hyds = pr.Contacts(parsed)(2.5, acceptor.getCoords()).select('element H D') if hyds is not None: for hyd in hyds.iterAtoms(): donors = pr.Contacts(parsed)(1.1, hyd.getCoords()).select('element O N \ and not (chain X and resnum 1)') if donors is not None: for donor in donors.iterAtoms(): acc_hyd_don_list.append([acceptor,hyd,donor]) hbond_list = check_hbond_angles(acc_hyd_don_list) return hbond_list
def prody_contacts(**kwargs): """Identify contacts of a target structure with one or more ligands. Contacting atoms (or extended subset of atoms, such as residues) are outputted in PDB file format. :arg target: target PDB identifier or filename :arg ligand: ligand PDB identifier(s) or filename(s) :arg select: atom selection string for target structure :arg radius: contact radius (Å), default is ``4.0`` :arg extend: output same ``'residue'``, ``'chain'``, or ``'segment'`` along with contacting atoms :arg prefix: prefix for output file, default is *target* filename :arg suffix: output filename suffix, default is *ligand* filename""" import prody LOGGER = prody.LOGGER target = prody.parsePDB(kwargs['target']) title = kwargs.get('prefix') or target.getTitle() selstr = kwargs.get('select') if selstr: target = target.select(selstr) contacts = prody.Contacts(target) suffix = kwargs.get('suffix', '_contacts') extend = kwargs.get('extend') radius = float(kwargs.get('radius', 4.0)) ligands = kwargs.get('ligand') if len(ligands) > 1: outfn = lambda fn: title + suffix + '_' + fn + '.pdb' else: outfn = lambda fn: title + suffix + '.pdb' for pdb in ligands: ligand = prody.parsePDB(pdb) sel = contacts(radius, ligand) if sel: LOGGER.info('{0} atoms from {1} contact {2}.'.format( len(sel), pdb, str(target))) if extend: sel = target.select('same ' + extend + ' as sel', sel=sel) LOGGER.info('Selection is extended to {0} atoms of the same ' '{1}(s).'.format(len(sel), extend)) pdbfn = outfn(ligand.getTitle()) LOGGER.info('Writing contacts into ' + pdbfn) prody.writePDB(pdbfn, sel)
def __init__(self, comb, pdb_acc_code, chain, **kwargs): """ :comb: arg: instance of cls Comb with attributes pdbchain_dict, ifg_selection_info :pdb_acc_code: type: str: 4 character pdb accession code :param kwargs: path_to_pdb path_to_dssp """ #search for acc code in input_dir_pdb from comb object. assert isinstance(pdb_acc_code, str), 'PDB accession code needs to be a string' pdb_file = [ file.name for file in os.scandir(comb.input_dir_pdb) if pdb_acc_code in file.name ] try: if pdb_file: pdb_file = pdb_file[0] self.prody_pdb = pr.parsePDB(comb.input_dir_pdb + pdb_file, altloc='A', model=1) elif 'path_to_pdb' in kwargs: self.prody_pdb = pr.parsePDB(kwargs.get('path_to_pdb'), altloc='A', model=1) else: # NEED TO UPDATE: note if going to fetch pdb, it should be sent through Reduce first... try: os.mkdir(comb.input_dir_pdb + 'raw') os.mkdir(comb.input_dir_pdb + 'reduce') except: pass pr.fetchPDB(pdb_acc_code, compressed=False, folder=comb.input_dir_pdb + 'raw') os.system(comb.path_to_reduce + comb.reduce + ' -FLIP -Quiet -DB ' + comb.path_to_reduce + 'reduce_wwPDB_het_dict.txt ' + comb.input_dir_pdb + 'raw/' + pdb_acc_code.lower() + '.pdb > ' + comb.input_dir_pdb + 'reduce/' + pdb_acc_code.lower() + 'H.pdb') self.prody_pdb = pr.parsePDB(comb.input_dir_pdb + 'reduce/' + pdb_acc_code.lower() + 'H.pdb', altloc='A', model=1) except NameError: raise NameError( 'ParsePDB instance needs a pdb file path or a valid pdb accession code.' ) self.pdb_acc_code = pdb_acc_code.lower() self.pdb_chain = chain if len(self.prody_pdb) == len(self.prody_pdb.select('icode _')) \ and self.prody_pdb.select('protein and chain ' + self.pdb_chain) is not None: self.contacts = pr.Contacts(self.prody_pdb) self.set_bonds() if pdb_file: self.fs_struct = freesasa.Structure(comb.input_dir_pdb + pdb_file) elif 'path_to_pdb' in kwargs: self.fs_struct = freesasa.Structure(kwargs.get('path_to_pdb')) else: path = comb.input_dir_pdb + 'reduce/' self.fs_struct = freesasa.Structure(path + next( file.name for file in os.scandir(path) if self.pdb_acc_code in file.name)) self.fs_result = freesasa.calc(self.fs_struct) self.fs_result_cb_3A = self.freesasa_cb(probe_radius=3) self.fs_result_cb_4A = self.freesasa_cb(probe_radius=4) self.fs_result_cb_5A = self.freesasa_cb(probe_radius=5) self.prody_pdb_bb_cb_atom_ind = self.prody_pdb.select( 'protein and (backbone or name CB) ' 'and not element H D').getIndices() dssp_file = [ file.name for file in os.scandir(comb.input_dir_dssp) if pdb_acc_code in file.name ] if dssp_file: dssp_file = dssp_file[0] self.dssp = pr.parseDSSP(comb.input_dir_dssp + dssp_file, self.prody_pdb) elif 'path_to_dssp' in kwargs: self.dssp = pr.parseDSSP(kwargs.get('path_to_dssp'), self.prody_pdb) else: if pdb_file: pr.execDSSP(comb.input_dir_pdb + pdb_file, outputdir=comb.input_dir_dssp) elif 'path_to_pdb' in kwargs: pr.execDSSP(kwargs.get('path_to_pdb'), outputdir=comb.input_dir_dssp) else: path = comb.input_dir_pdb + 'reduce/' + next( file.name for file in os.scandir(comb.input_dir_pdb + 'reduce') if pdb_acc_code in file.name) pr.execDSSP(path, outputdir=comb.input_dir_dssp) self.dssp = pr.parseDSSP( comb.input_dir_dssp + next(file.name for file in os.scandir(comb.input_dir_dssp) if pdb_acc_code in file.name), self.prody_pdb) self.possible_ifgs = self.find_possible_ifgs(comb) else: self.possible_ifgs = None # valence and hydrogen bond data for vandermers and iFGs of ParsedPDB protein instance # iFG specific: self._ifg_pdb_info = [] self._ifg_atom_density = [] self._ifg_contact_water = [] self._ifg_contact_ligand = [] self._ifg_contact_metal = [] # vdM specific: self._vdm_pdb_info = [] self._vdm_sasa_info = [] self._ifg_contact_vdm = [] self._ifg_hbond_vdm = [] self._ifg_hbond_water = [] self._ifg_hbond_ligand = [] self._ifg_ca_hbond_vdm = []
translation = [float(x) for x in line.split('\t')[3:6]] translation = getTranslation(translation) score = float(line.split('\t')[-1]) decoylig.setCoords(decoylig.getCoords() - lig_init_cent) # apply rotation t = prody.Transformation(rotation, np.zeros(3)) t.apply(decoylig) decoylig.setCoords(decoylig.getCoords() + translation + rec_init_cent) mobile = rec + decoylig decoy_contacts_rec = prody.Contacts(rec) decoy_contacts_rec = decoy_contacts_rec.select(4, decoylig) decoy_contacts_lig = prody.Contacts(decoylig) decoy_contacts_lig = decoy_contacts_lig.select(4, rec) #lig_contact_atoms = prody.matchChains( lig, decoy_contacts_lig, overlap=0.01, subset='all' )[0][0] interface_resnums += (list(set(decoy_contacts_rec.getResnums()))) l_interface_resnums += (list(set(decoy_contacts_lig.getResnums()))) interface_residue_pairs.append([ set(decoy_contacts_rec.getResnums()), set(decoy_contacts_lig.getResnums()), score ]) crec = set(decoy_contacts_rec.getResnums()) clig = set(decoy_contacts_lig.getResnums()) for r in crec: rec_dict[r]['score'] += score
def __init__(self, comb, pdb_acc_code, chain, **kwargs): """ :comb: arg: instance of cls Comb with attributes pdbchain_dict, ifg_selection_info :pdb_acc_code: type: str: 4 character pdb accession code :param kwargs: path_to_pdb path_to_dssp """ #search for acc code in input_dir_pdb from comb object. assert isinstance(pdb_acc_code, str), 'PDB accession code needs to be a string' pdb_file = [ file.name for file in os.scandir(comb.input_dir_pdb) if pdb_acc_code in file.name ] try: if pdb_file: pdb_file = pdb_file[0] self.prody_pdb = pr.parsePDB(comb.input_dir_pdb + pdb_file, altloc='A', model=1) elif 'path_to_pdb' in kwargs: self.prody_pdb = pr.parsePDB(kwargs.get('path_to_pdb'), altloc='A', model=1) else: try: os.mkdir(comb.input_dir_pdb + 'raw') os.mkdir(comb.input_dir_pdb + 'reduce') except: pass pr.fetchPDB(pdb_acc_code, compressed=False, folder=comb.input_dir_pdb + 'raw') os.system(comb.path_to_reduce + comb.reduce + ' -FLIP -Quiet -DB ' + comb.path_to_reduce + 'reduce_wwPDB_het_dict.txt ' + comb.input_dir_pdb + 'raw/' + pdb_acc_code.lower() + '.pdb > ' + comb.input_dir_pdb + 'reduce/' + pdb_acc_code.lower() + 'H.pdb') self.prody_pdb = pr.parsePDB(comb.input_dir_pdb + 'reduce/' + pdb_acc_code.lower() + 'H.pdb', altloc='A', model=1) except NameError: raise NameError( 'ParsePDB instance needs a pdb file path or a valid pdb accession code.' ) self.pdb_acc_code = pdb_acc_code.lower() self.pdb_chain = chain if len(self.prody_pdb) == len(self.prody_pdb.select('icode _')) \ and self.prody_pdb.select('protein and chain ' + self.pdb_chain) is not None: self.contacts = pr.Contacts(self.prody_pdb) self.set_bonds() if pdb_file: self.fs_struct = freesasa.Structure(comb.input_dir_pdb + pdb_file) elif 'path_to_pdb' in kwargs: self.fs_struct = freesasa.Structure(kwargs.get('path_to_pdb')) else: path = comb.input_dir_pdb + 'reduce/' self.fs_struct = freesasa.Structure(path + next( file.name for file in os.scandir(path) if self.pdb_acc_code in file.name)) self.fs_result = freesasa.calc(self.fs_struct) self.fs_result_cb_3A = self.freesasa_cb(probe_radius=3) self.fs_result_cb_4A = self.freesasa_cb(probe_radius=4) self.fs_result_cb_5A = self.freesasa_cb(probe_radius=5) self.prody_pdb_bb_cb_atom_ind = self.prody_pdb.select( 'protein and (backbone or name CB) ' 'and not element H D').getIndices() dssp_file = [ file.name for file in os.scandir(comb.input_dir_dssp) if pdb_acc_code in file.name ] if dssp_file: dssp_file = dssp_file[0] self.parse_dssp(dssp_file, comb) if comb.query_path: self.possible_ifgs = self.find_possible_ifgs_rmsd( comb, rmsd_threshold=comb.rmsd_threshold) else: self.possible_ifgs = self.find_possible_ifgs(comb) else: self.possible_ifgs = None self.alphahull = self.set_alphahull() self.segnames = sorted(np.unique(self.prody_pdb.getSegnames())) self._ifg_pdb_info = [] self._ifg_atom_density = [] self._ifg_contact_water = [] self._ifg_contact_ligand = [] self._ifg_contact_metal = [] # vdM specific: self._vdm_pdb_info = [] self._vdm_sasa_info = [] self._ifg_contact_vdm = [] self._ifg_hbond_vdm = [] self._ifg_hbond_water = [] self._ifg_hbond_ligand = [] self._ifg_ca_hbond_vdm = []