diff --git a/images/RecoverSignalProcess_addedAmplIntegral.png b/images/RecoverSignalProcess_addedAmplIntegral.png
new file mode 100644
index 00000000..d080e32e
Binary files /dev/null and b/images/RecoverSignalProcess_addedAmplIntegral.png differ
diff --git a/images/RecoverSignalProcess_eventRecovered.png b/images/RecoverSignalProcess_eventRecovered.png
new file mode 100644
index 00000000..d732025b
Binary files /dev/null and b/images/RecoverSignalProcess_eventRecovered.png differ
diff --git a/images/RecoverSignalProcess_signalFit.png b/images/RecoverSignalProcess_signalFit.png
new file mode 100644
index 00000000..ec95724e
Binary files /dev/null and b/images/RecoverSignalProcess_signalFit.png differ
diff --git a/images/RecoverSignalProcess_spectrumComparison.png b/images/RecoverSignalProcess_spectrumComparison.png
new file mode 100644
index 00000000..5ed5de60
Binary files /dev/null and b/images/RecoverSignalProcess_spectrumComparison.png differ
diff --git a/inc/TRestRawSignalRecoverSaturationProcess.h b/inc/TRestRawSignalRecoverSaturationProcess.h
new file mode 100644
index 00000000..db38a5cc
--- /dev/null
+++ b/inc/TRestRawSignalRecoverSaturationProcess.h
@@ -0,0 +1,100 @@
+/*************************************************************************
+ * This file is part of the REST software framework. *
+ * *
+ * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) *
+ * For more information see http://gifna.unizar.es/trex *
+ * *
+ * REST is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * REST is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have a copy of the GNU General Public License along with *
+ * REST in $REST_PATH/LICENSE. *
+ * If not, see http://www.gnu.org/licenses/. *
+ * For the list of contributors see $REST_PATH/CREDITS. *
+ *************************************************************************/
+
+#ifndef RESTProc_TRestRawSignalRecoverSaturationProcess
+#define RESTProc_TRestRawSignalRecoverSaturationProcess
+
+#include "TRestEventProcess.h"
+#include "TRestRawSignalEvent.h"
+
+/// This class recovers the saturated signals in a TRestRawSignalEvent using a fit to the AGET pulse.
+class TRestRawSignalRecoverSaturationProcess : public TRestEventProcess {
+ private:
+ /// A pointer to the specific TRestRawSignalEvent input event
+ TRestRawSignalEvent* fAnaEvent; //!
+
+ void Initialize() override;
+
+ /// Minimum number of saturated bins to consider a signal as saturated
+ Size_t fMinSaturatedBins; //<
+
+ /// Process all signals in the event
+ Bool_t fProcessAllSignals; //<
+
+ /// Number of bins to consider if the signal is not saturated
+ Size_t fNBinsIfNotSaturated; //<
+
+ /// Minimum value to consider a signal as saturated
+ Short_t fMinSaturationValue; //<
+
+ /// Range of bins to calculate the baseline and fix that parameter in the fit
+ TVector2 fBaseLineRange; //<
+
+ /// Range of bins to fit the signal
+ TVector2 fFitRange; //<
+
+ /// Wrapper of (pointThreshold, signalThreshold, pointsOverThreshold) params
+ TVector3 fInitPointsOverThreshold; //<
+
+ /// Canvas to draw the signals
+ TCanvas* fC; //!
+
+ public:
+ RESTValue GetInputEvent() const override { return fAnaEvent; }
+ RESTValue GetOutputEvent() const override { return fAnaEvent; }
+
+ void InitProcess() override;
+
+ const char* GetProcessName() const override { return "RawSignalRecoverSaturationProcess"; }
+
+ TRestEvent* ProcessEvent(TRestEvent* eventInput) override;
+
+ void EndProcess() override;
+
+ /// It prints out the process parameters stored in the metadata structure
+ void PrintMetadata() override {
+ BeginPrintProcess();
+
+ // Write here how to print the added process members and parameters.
+ std::string strProcessAllSignals = fProcessAllSignals ? "true" : "false";
+ RESTMetadata << "MinSaturatedBins: " << fMinSaturatedBins << RESTendl;
+ RESTMetadata << "ProcessAllSignals: " << strProcessAllSignals << RESTendl;
+ RESTMetadata << "NBinsIfNotSaturated: " << fNBinsIfNotSaturated << RESTendl;
+ RESTMetadata << "MinSaturationValue: " << fMinSaturationValue << RESTendl;
+ RESTMetadata << "BaseLineRange: (" << fBaseLineRange.X() << ", " << fBaseLineRange.Y() << ")"
+ << RESTendl;
+ RESTMetadata << "FitRange: (" << fFitRange.X() << ", " << fFitRange.Y() << ")" << RESTendl;
+ RESTMetadata << "InitPointsOverThreshold: (" << fInitPointsOverThreshold.X() << ", "
+ << fInitPointsOverThreshold.Y() << ", " << fInitPointsOverThreshold.Z() << ")"
+ << RESTendl;
+
+ EndPrintProcess();
+ }
+
+ TRestRawSignalRecoverSaturationProcess();
+ ~TRestRawSignalRecoverSaturationProcess();
+
+ // ROOT class definition helper. Increase the number in it every time
+ // you add/rename/remove the process parameters
+ ClassDefOverride(TRestRawSignalRecoverSaturationProcess, 1);
+};
+#endif
diff --git a/src/TRestRawSignalRecoverSaturationProcess.cxx b/src/TRestRawSignalRecoverSaturationProcess.cxx
new file mode 100644
index 00000000..ff9d47b9
--- /dev/null
+++ b/src/TRestRawSignalRecoverSaturationProcess.cxx
@@ -0,0 +1,427 @@
+/*************************************************************************
+ * This file is part of the REST software framework. *
+ * *
+ * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) *
+ * For more information see http://gifna.unizar.es/trex *
+ * *
+ * REST is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * REST is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have a copy of the GNU General Public License along with *
+ * REST in $REST_PATH/LICENSE. *
+ * If not, see http://www.gnu.org/licenses/. *
+ * For the list of contributors see $REST_PATH/CREDITS. *
+ *************************************************************************/
+
+/////////////////////////////////////////////////////////////////////////
+/// This class processes signals that have saturated the ADC, recovering
+/// lost information using a fit. If the fit is successful, the saturated
+/// points are replaced by the corresponding fit values.
+/// The process reconstructs the lost signal data due to ADC saturation,
+/// allowing further event analysis as if no saturation had occurred.
+/// For example, the following image compares the original to the recovered
+/// event and the ThresholdIntegral spectrum in TRestRawSignalAnalysisProcess
+/// before (red) and after (blue) applying TRestRawSignalRecoverSaturationProcess:
+///
+/// \image html RecoverSignalProcess_eventRecovered.png "Recovered Event" width=900px
+/// \image html RecoverSignalProcess_spectrumComparison.png "Spectrum Comparison" width=500px
+///
+///
+/// ### Fitting Function
+/// The fitting function is fixed (hardcoded) to the AGET response function
+/// (without the sine term) multiplied by a logistic function:
+///
+/// \code
+/// [0] + [1] * TMath::Exp(-3. * (x-[3])/[2]) *
+/// (x-[3])/[2] * (x-[3])/[2] * (x-[3])/[2] /
+/// (1 + TMath::Exp(-10000 * (x-[3])))
+///
+/// [0] = "Baseline"
+/// [1] = "Amplitude * e^{3}"
+/// [2] = "HalfWidth"
+/// [3] = "PulseStart"
+/// \endcode
+///
+///
+/// \image html RecoverSignalProcess_signalFit.png "Signal Fit" width=500px
+///
+/// ### Parameters
+/// Basic parameters of the process meant to configure the identification of saturated signals to process:
+/// - **minSaturatedBins**: Minimum number of saturated bins required to classify a signal as saturated
+/// (default: 3).
+/// - **minSaturationValue**: Threshold value for considering a signal as saturated (default: 0).
+/// - **processAllSignals**: If `false` (default), only saturated signals are processed.
+/// If `true`, all signals are processed.
+/// - **nBinsIfNotSaturated**: Number of bins treated as 'saturated' when processing all signals.
+/// Has no effect when `processAllSignals` is `false`. Default: 20.
+///
+/// Advanced parameters to configure the fitting process:
+/// - **fitRange**: Range of bins used for fitting. If not provided, the entire signal is used.
+/// Default: (-1, -1), meaning the whole signal is used.
+/// - **baseLineRange**: Range of bins used to calculate the baseline. If provided, the baseline
+/// will be fixed in the fit, improving speed and reliability.
+/// Default: (-1, -1), meaning no baseline calculation.
+/// - **initPointsOverThreshold**: Parameters used as input to `TRestRawSignal::InitializePointsOverThreshold`
+/// to improve amplitude and width estimation. These parameters are wrapped into a `TVector3`:
+/// (`pointThreshold`, `signalThreshold`, `pointsOverThreshold`).
+/// Default: (-1, -1, -1), meaning no initialization. \n
+/// - `pointThreshold`: Number of standard deviations above baseline fluctuations required
+/// to identify a point as over-threshold.
+/// - `signalThreshold`: Minimum required signal fluctuation, measured in standard deviations.
+/// - `pointsOverThreshold`: Minimum number of points over threshold needed to classify a signal as such.
+///
+///
+/// ### Observables
+/// The process adds the following observables to the event:
+/// - **addedAmplitude**: Sum of the extra amplitude (new amplitude - previous amplitude)
+/// from recovered saturated signals.
+/// - **addedIntegral**: Sum of the extra integral (sum of new value - previous value in saturated bins)
+/// from recovered signals.
+/// - **saturatedSignals**: Number of signals detected as saturated in the event.
+/// - **recoveredSignals**: Number of saturated signals successfully modified by the fitted pulse.
+/// Always ≤ `saturatedSignals`. If lower, it means the fit values were below the original
+/// signal values, so no replacements were made.
+///
+/// \image html RecoverSignalProcess_addedAmplIntegral.png "Added Amplitude and Integral" width=500px
+///
+/// ### Examples
+/// Example of usage with a minimal RML configuration:
+/// \code
+///