3 #include <fwk/CentralConfig.h>
5 #include <sdet/SDetector.h>
6 #include <sevt/SEvent.h>
7 #include <sevt/EventTrigger.h>
9 #include <utl/String.h>
17 namespace SdBaselineFinderOG {
26 return isUUB ? 120: 40;
35 return isUUB ? 600 : 200;
46 fDecreaseLGFlatPieceTolerance = bool(topB.GetChild(
"decreaseLGFlatPieceTolerance"));
47 fApplyBackwardFlatPieceCheck = bool(topB.GetChild(
"applyBackwardFlatPieceCheck"));
50 info <<
"Parameters:\n"
51 "applyBackwardFlatPieceCheck: " << fApplyBackwardFlatPieceCheck <<
"\n"
52 "decreaseLGFlatPieceTolerance: " << fDecreaseLGFlatPieceTolerance;
64 auto& sEvent =
event.GetSEvent();
66 for (
auto& station : sEvent.StationsRange()) {
68 if (!station.HasTriggerData() ||
69 !station.HasCalibData() ||
70 !station.HasGPSData())
73 const auto& trig = station.GetTriggerData();
74 if (trig.IsRandom() ||
75 (trig.GetErrorCode() & 0xff) ||
76 station.GetCalibData().GetVersion() > 32000)
80 if (sEvent.HasTrigger()) {
81 const int trigSecond = sEvent.GetTrigger().GetTime().GetGPSSecond();
82 const int timeDiff = int(station.GetGPSData().GetSecond()) - trigSecond;
83 if (
abs(timeDiff) > 1)
87 if (!ComputeBaselines(station)) {
103 if (!pmtRec.HasFADCBaseline(gain))
105 auto& baseline = pmtRec.GetFADCBaseline(gain);
107 for (
int i = 0, n = baseline.GetSize(); i < n; ++i)
108 baseline[i] = onlineBaseline;
113 SdBaselineFinder::ComputeBaselines(
Station& station)
130 const auto& dStation = det::Detector::GetInstance().GetSDetector().GetStation(station);
139 const int traceLength = trace.
GetSize();
150 const int saturationValue = dStation.GetSaturationValue();
153 bool seenSaturation =
false;
154 bool hitsZero =
false;
164 const int startValue = trace[startBin];
167 while (stopBin < traceLength) {
168 if (
abs(startValue - trace[stopBin]) > sigma)
173 if (startValue >= saturationValue) {
174 if (!startBin && stopBin == traceLength) {
177 seenSaturation =
true;
179 warn <<
"Station " << station.
GetId() <<
", PMT " << pmt.
GetId() <<
", "
181 <<
" gain (saturated): Whole trace saturated.";
190 seenSaturation =
true;
193 if (!startValue && seenSaturation) {
196 startBin = stopBin = traceLength;
199 if (stopBin-startBin < minLength) {
206 if (fApplyBackwardFlatPieceCheck) {
208 const int reverseStartValue =
209 accumulate(&trace[startBin], &trace[stopBin], 0) / (stopBin - startBin);
210 int reverseBin = stopBin - 1;
211 while (reverseBin > startBin) {
212 if (
abs(reverseStartValue - trace[reverseBin]) > sigma)
217 if (reverseBin == startBin) {
232 }
while (stopBin < traceLength);
235 if (!flatPieces.empty() &&
242 warn <<
"Station " << station.
GetId() <<
", PMT " << pmt.
GetId() <<
", "
244 "No useful baseline found in the first "
249 }
while (flatPieces.empty() && sigma <= saturationValue);
251 if (flatPieces.empty()) {
252 MakeFlatBaseline(pmt, gain);
254 pmtRec.SetFADCSaturatedBins(-1, gain);
256 warn <<
"Station " << station.
GetId() <<
", PMT " << pmt.
GetId() <<
", "
258 << (seenSaturation ?
" (saturated):" :
":")
259 <<
"No baseline found; using LS value.";
265 vector<double> flatPieceMean;
266 flatPieceMean.reserve(flatPieces.size());
267 double meanErrorMaxPiece = 0;
268 int maxPieceLength = 0;
269 for (
const auto& fp : flatPieces) {
271 for_each(&trace[fp.first], &trace[fp.second], Accumulator::SampleStandardDeviation());
272 flatPieceMean.push_back(sigma.GetAverage());
273 if (sigma.GetN() > maxPieceLength) {
274 maxPieceLength = sigma.GetN();
275 meanErrorMaxPiece = sigma.GetStandardDeviation();
280 flatPieceMean.back() = 0;
282 pmtRec.SetFADCBaselineError(meanErrorMaxPiece, gain);
284 if (sigma > 3 && !seenSaturation) {
286 warn <<
"Station " << station.
GetId() <<
", PMT " << pmt.
GetId() <<
", "
288 "Noisy baseline, sigma = " << sigma <<
", RMS = " << meanErrorMaxPiece;
292 pmtRec.SetFADCBaselineWindow(sigma, gain);
294 if (!pmtRec.HasFADCBaseline(gain))
295 pmtRec.MakeFADCBaseline(gain);
296 auto& baseline = pmtRec.GetFADCBaseline(gain);
300 const double recoveryFactor = 0.000158;
302 double previousBaseline = flatPieceMean[0];
307 for (
int i = flatPieces[0].first - 1; i >= 0; --i) {
308 const double signal = trace[i] - previousBaseline;
311 baseline[i] = previousBaseline + charge * recoveryFactor;
316 for (
unsigned int i = flatPieces[0].first; i < flatPieces[0].second; ++i)
317 baseline[i] = previousBaseline;
320 const unsigned int nPieces = flatPieces.size();
321 for (
unsigned int p = 1;
p < nPieces; ++
p) {
322 const double nextBaseline = flatPieceMean[
p];
323 const int start = flatPieces[
p-1].second;
324 const int stop = flatPieces[
p].first;
325 const int holeLength = stop - start;
326 const double deltaBaselinePerBin = (nextBaseline - previousBaseline) / holeLength;
329 for (
int i = start ; i < stop; ++i) {
330 const double base = previousBaseline + (i - start) * deltaBaselinePerBin;
331 const double signal = trace[i] - base;
335 const double totalCharge = charge;
336 if (totalCharge / holeLength < 2) {
338 for (
int i = start ; i < stop; ++i)
339 baseline[i] = previousBaseline + (i - start) * deltaBaselinePerBin;
341 const double deltaBaselinePerCharge = (nextBaseline - previousBaseline) / totalCharge;
344 for (
int i = start ; i < stop; ++i) {
345 const double base = previousBaseline + (i - start) * deltaBaselinePerBin;
346 const double signal = trace[i] - base;
348 charge += trace[i] - base;
349 baseline[i] = previousBaseline + charge * deltaBaselinePerCharge;
353 for (
unsigned int i = stop; i < flatPieces[
p].second; ++i)
354 baseline[i] = nextBaseline;
355 previousBaseline = nextBaseline;
361 for (
int i = flatPieces[nPieces-1].
second; i < traceLength; ++i) {
362 const double signal = trace[i] - previousBaseline;
365 baseline[i] = previousBaseline - charge * recoveryFactor;
370 pmtRec.SetFADCSaturatedBins(-1, gain);
376 traceLength == int(dStation.GetFADCTraceLength())) {
377 const int registersStart = int(dStation.GetFADCTraceLength()) - 8;
378 for (
int i = registersStart; i < int(dStation.GetFADCTraceLength()); ++i)
379 baseline[i] = trace[i];
int GetId() const
Get the station Id.
bool HasRecData() const
Check for existenc of PMT reconstructed data object.
class to hold data at PMT level
PMTCalibData & GetCalibData()
Get object containing PMT calibration data.
PMTRecData & GetRecData()
Get object containing PMT reconstructed data.
#define INFO(message)
Macro for logging informational messages.
void Init()
Initialise the registry.
void MakeFADCBaseline(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain)
unsigned int GetId() const
Return Id of the PMT.
void MakeRecData()
Make PMT reconstructed data object.
FlatPieceCollection & GetBaselineFlatPieces(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain)
class to hold data at Station level
bool HasFADCTrace(const StationConstants::SignalComponent source=StationConstants::eTotal) const
Check if a FADC trace exists. Trace source may be specified.
constexpr int MinLength(const bool isUUB)
double abs(const SVector< n, T > &v)
constexpr unsigned int UsefulBins(const bool isUUB)
#define WARNING(message)
Macro for logging warning messages.
utl::TraceI & GetFADCTrace(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain, const StationConstants::SignalComponent source=StationConstants::eTotal)
double GetBaseline(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain) const
ResultFlag
Flag returned by module methods to the RunController.
static CentralConfig * GetInstance()
Use this the first time you get an instance of central configuration.
std::pair< unsigned int, unsigned int > Piece
pieces of relative FADC flatnes in format [first, second)
utl::Branch GetTopBranch(const std::string &id)
Get top branch for moduleConfigLink with given id (XML files)