Source code for biobuild.utils.auxiliary
"""
Utility and auxiliary functions
"""
import os
import re
import string
import pickle
# =================================================================
try:
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit import RDLogger
from rdkit.Chem import Draw
HAS_RDKIT = True
except ImportError:
AllChem = None
Chem = None
Draw = None
RDLogger = None
HAS_RDKIT = False
try:
from openbabel import pybel
HAS_PYBEL = True
except ImportError:
pybel = None
HAS_PYBEL = False
try:
import openmm.app as openmm
HAS_OPENMM = True
except ImportError:
openmm = None
HAS_OPENMM = False
# =================================================================
[docs]
def load_pickle(filename):
"""
Load an object from a pickle file
"""
with open(filename, "rb") as f:
return pickle.load(f)
[docs]
def save_pickle(obj, filename):
"""
Save an object to a pickle file
"""
with open(filename, "wb") as f:
pickle.dump(obj, f)
[docs]
def filename_to_id(filename):
"""
Extract the id from a filename
Parameters
----------
filename : str
The filename
Returns
-------
str
The id
"""
base, suffix = os.path.splitext(os.path.basename(filename))
return base
[docs]
def change_suffix(filename, suffix):
"""
Change the suffix of a filename
Parameters
----------
filename : str
The filename
suffix : str
The new suffix
Returns
-------
str
The filename with the new suffix
"""
base, _ = os.path.splitext(os.path.basename(filename))
if suffix[0] != ".":
suffix = "." + suffix
return base + suffix
[docs]
def chain_id_maker(cdx: int):
"""
Make a string chain id from a counting integer
Parameters
----------
cdx : int
The counting integer
Returns
-------
str
The chain id
"""
if cdx < 26:
return chr(cdx + 65)
else:
# recursive call
return chain_id_maker(cdx // 26 - 1) + chain_id_maker(cdx % 26)
[docs]
def remove_nonprintable(text):
"""
Remove non-printable characters from a string
Parameters
----------
text : str
The string
Returns
-------
str
The string without non-printable characters
"""
return "".join(filter(lambda x: x in string.printable, text))
[docs]
class DummyStructure:
"""
A dummy pdb structure
Used for the surface residue inference
Parameters
----------
residues : list of Bio.PDB.Residue.Residue
The residues to include in the structure
"""
def __init__(self, residues) -> None:
self.atoms = []
self.atoms.extend(a for r in residues for a in r.get_atoms())
self.residues = residues
self.chains = []
self.chains.extend(
r.get_parent() for r in residues if r.get_parent() not in self.chains
)
self.models = []
self.models.extend(
c.get_parent() for c in self.chains if c.get_parent() not in self.models
)
self.level = "S"
[docs]
def get_atoms(self):
return iter(self.atoms)
[docs]
def get_residues(self):
return iter(self.residues)
[docs]
def get_chains(self):
return iter(self.chains)
[docs]
def get_models(self):
return iter(self.models)
[docs]
class DummyBar:
"""
A dummy progress bar
"""
def __init__(self, *args, **kwargs) -> None:
pass
def __call__(self, *args, **kwargs) -> None:
pass
def __enter__(self):
return self
def __exit__(self, *args, **kwargs):
pass