Skip to content

Commit 3745398

Browse files
committed
Fall back to hybridisation check when geometric check fails.
1 parent d1a0e9e commit 3745398

1 file changed

Lines changed: 34 additions & 6 deletions

File tree

src/somd2/runner/_samplers/_terminal_flip.py

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ def detect_terminal_groups(system, flip_angle=None):
202202

203203
num_atoms = mol.num_atoms()
204204
seen_bonds = set()
205+
rdmol = None # lazily initialised if geometric detection fails
205206

206207
for i in range(num_atoms):
207208
atom_i_idx = _Mol.AtomIdx(i)
@@ -263,12 +264,39 @@ def detect_terminal_groups(system, flip_angle=None):
263264
group_angle = _round_to_symmetry_angle(raw)
264265

265266
if group_angle is None:
266-
_logger.warning(
267-
f"Terminal group at pivot atom {j} has no recognised "
268-
f"rotational symmetry (raw angle = {raw:.1f}{_degree_sym}). "
269-
"Skipping group."
270-
)
271-
continue
267+
# Geometric detection failed; fall back to hybridization.
268+
try:
269+
if rdmol is None:
270+
from sire.convert import to_rdkit as _to_rdkit
271+
from rdkit.Chem import HybridizationType as _HybType
272+
273+
rdmol = _to_rdkit(mol)
274+
hyb = rdmol.GetAtomWithIdx(j).GetHybridization()
275+
if hyb == _HybType.SP2:
276+
group_angle = 180.0
277+
elif hyb == _HybType.SP3:
278+
group_angle = 120.0
279+
else:
280+
_logger.warning(
281+
f"Terminal group at pivot atom {j}: geometric "
282+
f"detection gave unrecognised angle "
283+
f"({raw:.1f}{_degree_sym}) and hybridization "
284+
f"({hyb}) has no defined flip angle. Skipping."
285+
)
286+
continue
287+
_logger.warning(
288+
f"Terminal group at pivot atom {j}: geometric "
289+
f"detection gave unrecognised angle "
290+
f"({raw:.1f}{_degree_sym}), using hybridization-based "
291+
f"angle {group_angle}{_degree_sym} (pivot is {hyb.name})."
292+
)
293+
except Exception as e:
294+
_logger.warning(
295+
f"Terminal group at pivot atom {j} has no recognised "
296+
f"rotational symmetry (raw angle = {raw:.1f}{_degree_sym}) "
297+
f"and hybridization fallback failed: {e}. Skipping."
298+
)
299+
continue
272300

273301
_logger.debug(
274302
f"Terminal group at pivot atom {j}: auto-detected flip "

0 commit comments

Comments
 (0)