Source code for vermouth.processors.tune_cystein_bridges
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2018 University of Groningen
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Provides processors that can add and remove cystein bridges.
"""
import functools
from ..selectors import proto_multi_templates
from .processor import Processor
from .add_molecule_edges import AddMoleculeEdgesAtDistance
from .. import edge_tuning
UNIVERSAL_BRIDGE_TEMPLATE = [{'resname': 'CYS', 'atomname': 'SG'}, ]
[docs]
def remove_cystein_bridge_edges(molecule, templates=UNIVERSAL_BRIDGE_TEMPLATE): # pylint: disable=dangerous-default-value
"""
Remove all the edges that correspond to cystein bridges from a molecule.
Cystein bridge edges link an atom from a cystein side chain to the same
atom on an other cystein. Selecting the correct atom is done with a list
of template node dictionaries. A template node dictionary functions in the
same way as node matching in links. An atom that can be involved in a
cystein bridge must match at least one of the templates of the list.
The default template list selects the 'SG' bead of the residue 'CYS':
``[{'resname': 'CYS', 'atomname': 'SG'}, ]``.
A template is a dictionary that defines the key:value pairs that must be
matched in the atoms. Values can be instances of
:class:`~vermouth.molecule.LinkPredicate`.
Parameters
----------
molecule: networkx.Graph
Molecule to modify in-place.
templates: list[dict]
A list of templates; selected atom must match at least one.
"""
selector = functools.partial(proto_multi_templates, templates=templates)
edge_tuning.prune_edges_with_selectors(molecule, selector)
[docs]
class RemoveCysteinBridgeEdges(Processor):
"""
Processor removing edges corresponding to cystein bridges.
The edge for a cystein bridge is an edge between two atoms that match at
least one template from a list of templates.
Parameters
----------
template: list[dict]
List of node templates.
"""
def __init__(self, template=UNIVERSAL_BRIDGE_TEMPLATE): # pylint: disable=dangerous-default-value
self.template = template
[docs]
def run_molecule(self, molecule):
remove_cystein_bridge_edges(molecule, self.template)
return molecule
[docs]
class AddCysteinBridgesThreshold(AddMoleculeEdgesAtDistance):
"""
Add edges corresponding to cystein bridges on a distance criterion.
The edge for a cystein bridge is an edge between two atoms that match at
least one template from a list of templates if the two ends of the edge are
closer than a given distance.
Parameters
----------
threshold: float
Distance in nanometers under which to consider an edge.
template: list[dict]
List of node templates.
"""
def __init__(self, threshold, # pylint: disable=dangerous-default-value
template=UNIVERSAL_BRIDGE_TEMPLATE, attribute='position'):
super().__init__(
threshold,
templates_from=template,
templates_to=template,
attribute=attribute,
)