From ff63e114d2e95a5f5b38e75d59bec1384a41db08 Mon Sep 17 00:00:00 2001 From: "Robert B. Young" Date: Tue, 3 Mar 2026 11:26:06 +1030 Subject: [PATCH] Fix MolecularFormula._calc_kmd ignoring kendrick_rounding_method --- .../calc/MolecularFormulaCalc.py | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/corems/molecular_formula/calc/MolecularFormulaCalc.py b/corems/molecular_formula/calc/MolecularFormulaCalc.py index a1de8c71..cd5600cd 100644 --- a/corems/molecular_formula/calc/MolecularFormulaCalc.py +++ b/corems/molecular_formula/calc/MolecularFormulaCalc.py @@ -5,7 +5,7 @@ import warnings import IsoSpecPy -from numpy import array, exp, isnan, nextafter, power +from numpy import array, ceil, exp, floor, isnan, nextafter, power, rint # this is to handle both versions of IsoSpecPy, 2.0.2 and 2.2.2 # TODO in a future release remove support for legacy isospecpy @@ -711,13 +711,30 @@ def _calc_kmd(self, dict_base): tuple The tuple of the KMD, Kendrick mass, and nominal Kendrick mass. """ + if hasattr(self, "_mspeak_parent") and self._mspeak_parent: + kendrick_rounding_method = ( + self._mspeak_parent._ms_parent.mspeaks_settings.kendrick_rounding_method + ) + else: + kendrick_rounding_method = MSParameters.ms_peak.kendrick_rounding_method + mass = 0 for atom in dict_base.keys(): mass = mass + Atoms.atomic_masses.get(atom) * dict_base.get(atom) kendrick_mass = (int(mass) / mass) * self.mz_calc - nominal_km = int(kendrick_mass) + if kendrick_rounding_method == "ceil": + nominal_km = ceil(kendrick_mass) + elif kendrick_rounding_method == "round": + nominal_km = rint(kendrick_mass) + elif kendrick_rounding_method == "floor": + nominal_km = floor(kendrick_mass) + else: + raise Exception( + "%s method was not implemented, please refer to corems.ms_peak.calc.MSPeakCalc Class" + % kendrick_rounding_method + ) kmd = (nominal_km - kendrick_mass) * 100