From 55edf364d7b08e663039d1c3f707f41c7efb19f4 Mon Sep 17 00:00:00 2001 From: Alon Grinberg Dana Date: Mon, 27 Apr 2026 09:29:43 +0300 Subject: [PATCH] Determine TS multiplicity from XYZ if given Test added --- arc/species/species.py | 7 ++++++- arc/species/species_test.py | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/arc/species/species.py b/arc/species/species.py index bcad349be1..0ac0c6f66c 100644 --- a/arc/species/species.py +++ b/arc/species/species.py @@ -932,7 +932,12 @@ def from_dict(self, species_dict): if self.bond_corrections: self.long_thermo_description += f'Bond corrections: {self.bond_corrections}\n' if self.multiplicity is None: - self.multiplicity = self.mol.multiplicity + if self.is_ts and self.get_xyz(generate=False): + self.determine_multiplicity_from_xyz() + logger.debug(f'TS species {self.label}: using xyz-based multiplicity ' + f'{self.multiplicity} (ignored mol.multiplicity)') + else: + self.multiplicity = self.mol.multiplicity if self.charge is None: self.charge = self.mol.get_net_charge() if 'conformers' in species_dict: diff --git a/arc/species/species_test.py b/arc/species/species_test.py index 63d2747117..5bfb9a2671 100644 --- a/arc/species/species_test.py +++ b/arc/species/species_test.py @@ -2188,6 +2188,29 @@ def test_determine_multiplicity(self): ch_ts = ARCSpecies(label='C--H-TS', xyz='C 0 0 0\nH 1 2 5', is_ts=True) self.assertEqual(ch_ts.multiplicity, 2) + ts_1_xyz = """H -2.99394700 1.00970200 0.09451400 + O -4.10192200 0.13578500 -0.05953100 + H -4.43761000 -0.35213100 0.70859500 + C -2.22272000 0.16048700 -0.01004900 + O -1.59892700 -0.79618100 0.08758500""" + ts_1_spc = ARCSpecies(label='TS1', is_ts=True, xyz=ts_1_xyz) + self.assertEqual(ts_1_spc.multiplicity, 1) + + ts_1_spc_from_dict = ARCSpecies(species_dict={'label': 'TS1', 'is_ts': True, 'xyz': ts_1_xyz}) + self.assertEqual(ts_1_spc_from_dict.multiplicity, 1) + + # Test a known doublet TS from a Gaussian output file (NH3 + H = NH2 + H2). + # Verify that xyz-based electron counting (11 electrons → mult 2) wins over mol.multiplicity. + ts_doublet_path = os.path.join(ARC_TESTING_PATH, 'freq', 'TS_NH3+H=NH2+H2.out') + ts_doublet = ARCSpecies(label='TS_NH3+H', is_ts=True, xyz=ts_doublet_path) + self.assertIsNotNone(ts_doublet.mol) + self.assertEqual(ts_doublet.multiplicity, 2) + # Simulate a mol that incorrectly perceives multiplicity as 1, and verify xyz detection still gives 2. + ts_doublet.multiplicity = None + ts_doublet.mol.multiplicity = 1 + ts_doublet.determine_multiplicity_from_xyz() + self.assertEqual(ts_doublet.multiplicity, 2) + def test_cluster_tsgs(self): """Test the cluster_tsgs() method.""" xyz_1 = """N 0.9177905887 0.5194617797 0.0000000000