@@ -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