#!/usr/bin/env python# -*- coding: utf-8 -*-## This file is part of the `pypath` python module## Copyright 2014-2023# EMBL, EMBL-EBI, Uniklinik RWTH Aachen, Heidelberg University## Authors: see the file `README.rst`# Contact: Dénes Türei (turei.denes@gmail.com)## Distributed under the GPLv3 License.# See accompanying file LICENSE.txt or copy at# https://www.gnu.org/licenses/gpl-3.0.html## Website: https://pypath.omnipathdb.org/#importosimportpickleimportpypath.resources.urlsasurlsimportpypath.share.curlascurlimportpypath.share.commonascommonimportpypath.inputs.pfamaspfam_inputimportpypath.inputs.pdbaspdb_inputimportpypath.inputs.uniprot_dbasuniprot_dbimportpypath.utils.pdbaspdb_utilsimportpypath.share.cacheascacheimportpypath.internals.interaasinteraimportpypath.share.progressasprogress
[docs]defget_3did_ddi(residues=False,ddi_flat=None,organism=9606):ifddi_flatisNone:c=curl.Curl(urls.urls['3did_ddi']['url'],silent=False)data=c.resulttmpfile='3did_flat_tmp'ifdataisNone:returnNonewithopen(tmpfile,'w')asf:f.write(data)lnum=data.count('\n')deldataelse:tmpfile=ddi_flatu_pfam,pfam_u=pfam_input.pfam_uniprot(organism=organism)u_pdb,pdb_u=pdb_input.pdb_chains()ifpfam_uisNoneorpdb_uisNone:returnNoneddi={}interfaces={}pdblist={}ddi_collect=Falsecon_collect=Falsewithopen(tmpfile,'r')asf:prg=progress.Progress(lnum,'Reading data',33)forlinf:prg.step()ifl.startswith('#=')andcon_collect:interfaces[(uniprot1,uniprot2,pdb)].append(this_interface)con_collect=Falseifl.startswith('#=ID'):# new domain pair: attach previous to results:ifddi_collect:foru1inuniprots1:foru2inuniprots2:ifu1!=u2andlen(pdblist)>0:if(u1,u2)notinddi:ddi[(u1,u2)]={}if(pfam1,pfam2)notinddi[(u1,u2)]:ddi[(u1,u2)][(pfam1,pfam2)]={'pdbs':pdblist}ddi_collect=Falsepdblist={}l=l.split('\t')pfam1=l[3].split('(')[1].split('.')[0]pfam2=l[4].split('.')[0]uniprots1=[]ifpfam1notinpfam_uelsepfam_u[pfam1]uniprots2=[]ifpfam2notinpfam_uelsepfam_u[pfam2]iflen(set(uniprots1)|set(uniprots2))>1:ddi_collect=Trueelifl.startswith('#=3D'):l=l.split('\t')pdb=l[1]chain1=l[2].split(':')[0]chain2=l[3].split(':')[0]if(pdbinpdb_uandchain1inpdb_u[pdb]andchain2inpdb_u[pdb]):uniprot1=pdb_u[pdb][chain1]['uniprot']uniprot2=pdb_u[pdb][chain2]['uniprot']ifuniprot1!=uniprot2:ifpdbnotinpdblist:pdblist[pdb]=[]pdblist[pdb]=common.add_to_list(pdblist[pdb],(uniprot1,uniprot2),)ifresidues:ifchain1!=chain2:if(pdb_u[pdb][chain1]['offset']isnotNoneandpdb_u[pdb][chain2]['offset']isnotNoneandpdb_u[pdb][chain1]['uniprot']!=pdb_u[pdb][chain2]['uniprot']):con_collect=Trueoffset1=pdb_u[pdb][chain1]['offset']offset2=pdb_u[pdb][chain2]['offset']this_interface=intera.Interface(uniprot1,uniprot2,source='3DID',pdb=pdb,)key=(uniprot1,uniprot2,pdb)ifkeynotininterfaces:interfaces[key]=[]else:con_collect=Falseelifnotresiduesornotcon_collect:continueelse:l=l.split('\t')iflen(l)>3:rnum1=int(common.non_digit.sub('',l[2]))+offset1rnum2=int(common.non_digit.sub('',l[3]))+offset2this_interface.add_residues((rnum1,l[0],uniprot1),(rnum2,l[1],uniprot2),)prg.terminate()prg=progress.Progress(len(ddi),'Processing interfaces',99)ifresidues:foru,v1initeritems(ddi):prg.step()ford,v2initeritems(v1):forpinv2['pdbs'].keys():key=(u[0],u[1],p)ifkeyininterfaces:ddi[u][d]['interfaces']=interfaces[key]prg.terminate()ifddi_flatisNone:os.remove(tmpfile)ifresidues:returnddi,interfaceselse:returnddi