From 750b5457306e9f6b706e296b0985f541938446a9 Mon Sep 17 00:00:00 2001 From: vedina Date: Tue, 19 Nov 2024 11:02:45 +0200 Subject: [PATCH] final nonmonotonic handling --- .../protocols/calibration/xcalibration.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/ramanchada2/protocols/calibration/xcalibration.py b/src/ramanchada2/protocols/calibration/xcalibration.py index fc67b0bc..2a103668 100644 --- a/src/ramanchada2/protocols/calibration/xcalibration.py +++ b/src/ramanchada2/protocols/calibration/xcalibration.py @@ -78,13 +78,20 @@ def process( elif isinstance(self.model, CustomCubicSplineInterpolator): new_spe.x = self.model(new_spe.x) - if not np.all(np.diff(new_spe.x) > 0): - if self.nonmonotonic == "nan": + + if np.any(np.diff(new_spe.x[np.isfinite(new_spe.x)]) <= 0): + if self.nonmonotonic == "error": + raise ValueError("Non-monotonic values detected (mode={})",self.nonmonotonic) + elif self.nonmonotonic == "nan": + # this is a patch, mostly intended at extrapolation new_spe.x = np.asarray(new_spe.x, dtype=float) is_nonmonotonic = np.diff(new_spe.x, prepend=new_spe.x[0]) <= 0 new_spe.x[is_nonmonotonic] = np.nan - elif self.nonmonotonic == "error": - raise ValueError("Non-monotonic values detected") + # we don't necessary ensure monotonicity by setting nans + if np.any(np.diff(new_spe.x[np.isfinite(new_spe.x)]) <= 0): + raise ValueError("Non-monotonic values detected (mode={})",self.nonmonotonic) + + # else ignore if convert_back: return self.convert_units(new_spe, self.model_units, spe_units)