Skip to content

Commit

Permalink
Major update preparing 1.0 release
Browse files Browse the repository at this point in the history
  • Loading branch information
Old-Shatterhand committed Oct 14, 2024
1 parent 5a6120c commit 65cae41
Show file tree
Hide file tree
Showing 26 changed files with 2,357 additions and 1,055 deletions.
2 changes: 1 addition & 1 deletion examples/filtering.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -467,4 +467,4 @@
},
"nbformat": 4,
"nbformat_minor": 0
}
}
41 changes: 1 addition & 40 deletions examples/visualization.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -77,45 +77,6 @@
"Image(glycan.save_dot(\"files/viz_2.dot\", horizontal=True).create_png())"
]
},
{
"cell_type": "markdown",
"source": [
"## SNFG Visualization\n",
"\n",
"GlyLES can also be used to visualize glycans using the symbols from the SNFG standard.\n",
"\n",
"To better fit the visualization to your needs, there are some parameter, you can tune to adapt the visualization to your needs. This includes width and height of the whole image, border-size of the symbols, and line width of the edges between the symbols."
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 3,
"outputs": [
{
"data": {
"text/plain": "<PIL.Image.Image image mode=RGB size=1500x450>",
"image/png": "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\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(glycan.create_snfg_img(\"files/viz_snfg.png\", width=300, height=100))"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
Expand Down Expand Up @@ -182,4 +143,4 @@
},
"nbformat": 4,
"nbformat_minor": 1
}
}
3 changes: 3 additions & 0 deletions glyles/glycans/factory/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
from glyles.glycans.utils import Config, Enantiomer, Lactole
from glyles.grammar.GlycanLexer import GlycanLexer

if not hasattr(GlycanLexer, "MOD"):
GlycanLexer.MOD = GlycanLexer.QMARK + 1


class MonomerFactory:
"""
Expand Down
6 changes: 3 additions & 3 deletions glyles/glycans/factory/factory_o.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ def check_for_acid(start, structure, adjacency, a_type):
Returns:
bool flag indicating if the carbon atom has an acid group
"""
oxys = [int(x) for x in np.where((adjacency[start] != 0) & (a_type == 8))[0]]
oxys = [int(x) for x in np.where(np.array(adjacency[start] != 0) & (a_type == 8))[0]]
if len(oxys) != 2:
return False
if (structure.GetBondBetweenAtoms(int(start), oxys[0]).GetBondType() == BondType.SINGLE and
Expand All @@ -216,7 +216,7 @@ def check_for_acid(start, structure, adjacency, a_type):


def check_for_co_double(carbon, structure, adjacency, a_type):
oxys = [int(x) for x in np.where((adjacency[carbon] != 0) & (a_type == 8))[0]]
oxys = [int(x) for x in np.where(np.array(adjacency[carbon] != 0) & (a_type == 8))[0]]
return sum(structure.GetBondBetweenAtoms(int(carbon), o).GetBondType() == BondType.DOUBLE for o in oxys) == 1


Expand All @@ -232,4 +232,4 @@ def check_for_aldehyd(start, adjacency, a_type):
Returns:
bool flag indicating if the carbon atom has an aldehyd group
"""
return len(np.where((adjacency[start] == 1) & (a_type == 8))[0]) != 0
return len(np.where(np.array(adjacency[start] == 1) & (a_type == 8))[0]) != 0
18 changes: 9 additions & 9 deletions glyles/glycans/mono/enum_c.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def enumerate_carbon(monomer):
# then iterate over all those carbons and enumerate them beginning at C1
for c_id in range(1, next_c_id):
c_index = int(np.where(monomer.x[:, 1] == c_id)[0])
candidates = np.where((monomer.adjacency[c_index, :] != 0) & (monomer.x[:, 1] == 0))[0]
candidates = np.where(np.array(monomer.adjacency[c_index, :] != 0) & (monomer.x[:, 1] == 0))[0]
if candidates.size != 0:
for candidate in list(candidates):
if sum(monomer.adjacency[candidate, :]) > 1:
Expand All @@ -51,7 +51,7 @@ def enumerate_side_chain(monomer, parent, atom, next_c_id):
next_c_id += 1

# identify children
candidates = np.where((monomer.adjacency[atom, :] != 0) & (monomer.x[:, 1] == 0))[0].tolist()
candidates = np.where(np.array(monomer.adjacency[atom, :] != 0) & (monomer.x[:, 1] == 0))[0].tolist()
if parent in candidates:
candidates.remove(parent)

Expand Down Expand Up @@ -85,7 +85,7 @@ def enumerate_c_atoms(monomer, c_atoms, ringo):
stack = stack[:-1]
c_tree.add_node(c_id, p_id)

children = np.where((monomer.adjacency[c_id, :] == 1) & (monomer.x[:, 0] == 6) & (monomer.x[:, 3] == 1))[0]
children = np.where(np.array(monomer.adjacency[c_id, :] == 1) & (monomer.x[:, 0] == 6) & (monomer.x[:, 3] == 1))[0]
for c in children:
if int(c) not in c_tree.nodes:
stack.append((c_id, int(c)))
Expand All @@ -105,9 +105,9 @@ def enumerate_c_atoms(monomer, c_atoms, ringo):
(monomer.x[:, 3] == 1)).squeeze().size > 0, \
np.argwhere((monomer.adjacency[end, :] == 1) & np.in1d(monomer.x[:, 0], [7, 8]) & (monomer.x[:, 2] != 1) &
(monomer.x[:, 3] == 1)).squeeze().size > 0"""
start_o_conn = np.argwhere((monomer.adjacency[start, :] == 1) & np.in1d(monomer.x[:, 0], [7, 8]) &
start_o_conn = np.argwhere(np.array(monomer.adjacency[start, :] == 1) & np.in1d(monomer.x[:, 0], [7, 8]) &
(monomer.x[:, 2] != 1)).squeeze().size > 0
end_o_conn = np.argwhere((monomer.adjacency[end, :] == 1) & np.in1d(monomer.x[:, 0], [7, 8]) &
end_o_conn = np.argwhere(np.array(monomer.adjacency[end, :] == 1) & np.in1d(monomer.x[:, 0], [7, 8]) &
(monomer.x[:, 2] != 1)).squeeze().size > 0

# decide on c1
Expand Down Expand Up @@ -168,18 +168,18 @@ def equidistant(monomer, start, end):
Bool indicating that the start id is the C1 atom
"""
# determine first carbon atom in the ring
c_start_candidates = np.where((monomer.adjacency[start, :] == 1) &
c_start_candidates = np.where(np.array(monomer.adjacency[start, :] == 1) &
(monomer.x[:, 0] == 6) & (monomer.x[:, 2] & 0b1))[0]
c_end_candidates = np.where((monomer.adjacency[end, :] == 1) & (monomer.x[:, 0] == 6) & (monomer.x[:, 2] & 0b1))[0]
c_end_candidates = np.where(np.array(monomer.adjacency[end, :] == 1) & (monomer.x[:, 0] == 6) & (monomer.x[:, 2] & 0b1))[0]

if c_start_candidates.size == 1 and c_end_candidates.size == 1:
start_ring_c = int(c_start_candidates)
end_ring_c = int(c_end_candidates)

# check if those ring carbons have an attached oxygen
start_ring_c_o_candidates = np.where((monomer.adjacency[start_ring_c, :] == 1) &
start_ring_c_o_candidates = np.where(np.array(monomer.adjacency[start_ring_c, :] == 1) &
np.in1d(monomer.x[:, 0], [7, 8]) & (monomer.x[:, 2] != 1))[0]
end_ring_c_o_candidates = np.where((monomer.adjacency[end_ring_c, :] == 1) &
end_ring_c_o_candidates = np.where(np.array(monomer.adjacency[end_ring_c, :] == 1) &
np.in1d(monomer.x[:, 0], [7, 8]) & (monomer.x[:, 2] != 1))[0]

if start_ring_c_o_candidates.size == 1 and end_ring_c_o_candidates.size == 1:
Expand Down
14 changes: 7 additions & 7 deletions glyles/glycans/mono/monomer.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
from glyles.glycans.utils import Config, find_isomorphism_nx
from glyles.grammar.GlycanLexer import GlycanLexer

if not hasattr(GlycanLexer, "MOD"):
GlycanLexer.MOD = GlycanLexer.QMARK + 1


class Monomer:

Expand Down Expand Up @@ -281,9 +284,6 @@ def mark(self, position, o_atom, n_atom):
position (int): id of the carbon atom whose oxygen atom will from the binding
o_atom (Tuple[int, str, str]): atom to replace the binding oxygen with
n_atom (Tuple[int, str, str]): atom to replace the binding nitrogen with
Returns:
Nothing
"""
idx = self.find_oxygen(position)
idx = self.__check_root_id(idx)
Expand Down Expand Up @@ -329,21 +329,21 @@ def __check_root_id(self, root_id):
(self.x[root_id, 0] == 7 and sum(self.adjacency[:, root_id]) <= 2):
return int(root_id)

neighbors = list(np.where((self.adjacency[:, root_id] != 0) & (self.x[:, 2] != 1))[0])
neighbors = list(np.where(np.array(self.adjacency[:, root_id] != 0) & (self.x[:, 2] != 1))[0])
candidate = None
seen = set()

while len(neighbors) != 0:
n = neighbors.pop(0)
if self.x[n, 0] not in {7, 8}:
neighbors += [k for k in np.where((self.adjacency[:, n] != 0) & (self.x[:, 2] != 1))[0] if
neighbors += [k for k in np.where(np.array(self.adjacency[:, n] != 0) & (self.x[:, 2] != 1))[0] if
k not in seen]
else:
if self.x[n, 0] == 8 and sum(self.adjacency[:, n]) == 1:
return int(n)
if self.x[n, 0] == 7 and sum(self.adjacency[:, n]) <= 2 and candidate is None:
candidate = n
neighbors += [k for k in np.where((self.adjacency[:, n] != 0) & (self.x[:, 2] != 1))[0] if
neighbors += [k for k in np.where(np.array(self.adjacency[:, n] != 0) & (self.x[:, 2] != 1))[0] if
k not in seen]
seen.add(n)

Expand Down Expand Up @@ -447,7 +447,7 @@ def find_oxygen(self, binding_c_id=-1, position=None):
multiple = False
for check in [8, 7]:
# then find the candidates. There should be exactly one element in the resulting array
candidates = np.argwhere((self.adjacency[position, :] == 1) &
candidates = np.argwhere(np.array(self.adjacency[position, :] == 1) &
(self.x[:, 0] == check) & (self.x[:, 2] != 1)).squeeze()
if candidates.size == 1:
return int(candidates)
Expand Down
Loading

0 comments on commit 65cae41

Please sign in to comment.