Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 97 additions & 3 deletions fr3d/classifiers/NA_pairwise_interactions.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
from time import time
import urllib

import pandas as pd

# import the version of urlretrieve appropriate to the Python version
if sys.version_info[0] < 3:
from urllib import urlretrieve as urlretrieve
Expand Down Expand Up @@ -3063,6 +3065,44 @@ def write_unit_data_file(PDB,unit_data_path,structure):

print(" Wrote unit data file %s" % filename)

def write_output_df(interaction_to_list_of_tuples,categories,category_to_interactions):
"""
Write interactions according to category, and within each
category, write by annotation.
Other than that, the interactions are listed in no particular order.
"""

if "near" in categories:
true_near = ["","n"]
else:
true_near = [""]

# loop over types of output files requested
rows = []
for category in categories:
if category == "near":
continue
# loop over all interactions found in this category
for interaction in sorted(category_to_interactions[category]):
if category == 'basepair':
# capitalize base edges to simplify
inter = interaction.replace("w","W").replace("s","S").replace("h","H")
else:
inter = interaction

# if this category has a restricted list of interactions to output
if len(categories[category]) == 0 or inter in categories[category] or ("near" in categories and "n" in interaction and inter.replace('n','') in categories[category]):
for a,b,c in interaction_to_list_of_tuples[interaction]:
rows.append({'category': category,
'source': a,
'interaction': inter,
'target': b,
'crossing': c
})
return pd.DataFrame(rows)




def write_txt_output_file(outputNAPairwiseInteractions,pdbid,interaction_to_list_of_tuples,categories,category_to_interactions):
"""
Expand Down Expand Up @@ -3096,7 +3136,7 @@ def write_txt_output_file(outputNAPairwiseInteractions,pdbid,interaction_to_list
for a,b,c in interaction_to_list_of_tuples[interaction]:
f.write("%s\t%s\t%s\t%s\n" % (a,inter,b,c))

def write_ebi_json_output_file(outputNAPairwiseInteractions,pdbid,interaction_to_list_of_tuples,categories,category_to_interactions,chain,unit_id_to_sequence_position,modified):
def write_ebi_json_output_file(outputNAPairwiseInteractions,pdbid,interaction_to_list_of_tuples,categories,category_to_interactions,chain,unit_id_to_sequence_position,modified, dump=True):
"""
For each chain, write interactions according to category,
and within each category, write by annotation.
Expand Down Expand Up @@ -3146,11 +3186,65 @@ def write_ebi_json_output_file(outputNAPairwiseInteractions,pdbid,interaction_to

#print(json.dumps(output))

with open(filename,'w') as f:
f.write(json.dumps(output))
if dump:
with open(filename,'w') as f:
f.write(json.dumps(output))
else:
return output


#=======================================================================

def generatePairwiseAnnotation_import(inputPath, category):
""" Importable version of pairwise annotator.
:param inputPath: path to input cif file
:param category: list of desired annotations

:returns dict: dictionary with annotations
"""

# dictionary to control what specific annotations are output, in a file named for the key
# empty list means to output all interactions in that category
# non-empty list specifies which interactions to output in that category
categories = {}

Leontis_Westhof_basepairs = ['cWW', 'cSS', 'cHH', 'cHS', 'cHW', 'cSH', 'cSW', 'cWH', 'cWS', 'tSS', 'tHH', 'tHS', 'tHW', 'tSH', 'tSW', 'tWH', 'tWS', 'tWW']

if category:
for category in category.split(","):
categories[category] = []
else:
# default is to annotate and write just "true" basepairs
categories['basepair'] = Leontis_Westhof_basepairs

if 'basepair_detail' in categories:
categories['basepair'] = Leontis_Westhof_basepairs + ['cWB','cBW'] # bifurcated pairs
elif 'basepair' in categories:
categories['basepair'] = Leontis_Westhof_basepairs
else:
categories['basepair'] = ['cWW'] # only annotate cWW, for crossing number

# process additional arguments as PDB files

# annotate each PDB file
timerData = myTimer("start")
failed_structures = []
counter = 0

# restrict dictionary of cutoffs to just the basepairs needed here
focused_basepair_cutoffs = focus_basepair_cutoffs(nt_nt_cutoffs,categories['basepair'])
ideal_hydrogen_bonds = load_ideal_basepair_hydrogen_bonds()

from fr3d.cif.reader import Cif
with open(inputPath, read_mode) as raw:
structure = Cif(raw).structure()

chains = []
pdbid = ""
interaction_to_list_of_tuples, category_to_interactions, timerData, pair_to_data = annotate_nt_nt_in_structure(structure,categories,focused_basepair_cutoffs,ideal_hydrogen_bonds,chains,timerData)

return write_output_df(interaction_to_list_of_tuples,categories,category_to_interactions)

def generatePairwiseAnnotation(entry_id, chain_id, inputPath, outputNAPairwiseInteractions, category, output_format):

if isinstance(entry_id,str):
Expand Down
3 changes: 2 additions & 1 deletion fr3d/data/mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@
def create_modified_nucleotide_to_parent_mappings():
# Read in mapping file from the folder where this program is installed
current_path,current_program = os.path.split(os.path.abspath(__file__))
filename = os.path.join(current_path,"atom_mappings_refined.txt")
# filename = os.path.join(current_path,"atom_mappings_refined.txt")
filename = os.path.join(current_path,"atom_mappings.txt")

#print('mapping.py is being run in path %s' % current_path)
#print('mapping.py is trying to open %s' % filename)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[build-system]
requires = ["setuptools", "setuptools-scm"]
requires = ["setuptools==68.2.2", "setuptools-scm"]
build-backend = "setuptools.build_meta"

[project]
Expand Down
1 change: 1 addition & 0 deletions requirements-python-2-7.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ subprocess32==3.5.4
typing==3.7.4.1
virtualenv==20.0.18
zipp==1.2.0
pandas
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
version='0.0.1',
packages=find_packages(include=['fr3d', 'fr3d.*']),
include_package_data=True,
url='',
license='LICENSE.txt',
url='',
install_requires=["numpy", "scipy", "mmcif-pdbx; python_version >= '3.0'"],
description='Python implementation of FR3D',
long_description="",
Expand Down