2 #include <utl/TraceAlgorithm.h>
3 #include <utl/ErrorLogger.h>
4 #include <utl/AugerUnits.h>
5 #include <utl/Deprecator.h>
19 const unsigned int bin1,
const unsigned int bin2)
24 return *min_element(&trace[bin1], &trace[bin2] + 1);
31 const unsigned int bin1,
const unsigned int bin2)
36 return *max_element(&trace[bin1], &trace[bin2] + 1);
43 const unsigned int bin1,
const unsigned int bin2)
48 return Sum(trace, bin1, bin2) / (bin2 + 1 - bin1);
57 return accumulate(v.begin(), v.end(), T(0)) /
double(v.size());
64 const unsigned int bin1,
const unsigned int bin2,
65 const unsigned int sortAlgorithmLimit)
71 vector<T> workingSet(&trace[bin1], &trace[bin2+1]);
74 if (bin2 - bin1 <= sortAlgorithmLimit) {
75 const size_t half = workingSet.size() / 2;
77 partial_sort(workingSet.begin(), workingSet.begin() + half + 1, workingSet.end());
81 if (workingSet.size() & 1)
82 return workingSet[half];
84 return 0.5*(workingSet[half - 1] + workingSet[half]);
88 double mean =
Mean(workingSet);
91 double delta = 0.5 * workingSet.size();
99 for (
const auto& value : workingSet) {
101 lowerSet.push_back(value);
103 upperSet.push_back(value);
107 if (delta < lowerSet.size()) {
110 swap(workingSet, lowerSet);
111 mean =
Mean(workingSet);
113 if (mean == *max_element(workingSet.begin(), workingSet.end())) {
120 delta -= lowerSet.size();
121 swap(workingSet, upperSet);
122 mean =
Mean(workingSet);
129 median = 0.5*(*min_element(workingSet.begin(), workingSet.end()) +
130 *max_element(lowerSet.begin(), lowerSet.end()));
134 if (mean == *min_element(workingSet.begin(), workingSet.end()) ||
136 median = *min_element(workingSet.begin(), workingSet.end());
153 const unsigned int bin1,
const unsigned int bin2)
155 utl::Deprecator::GetInstance().Deprecated(
156 "TraceAlgorithm::RMS()",
158 "use TraceAlgorithm::RootMeanSquare() or TraceAlgorithm::StandardDeviation() "
159 "depending on what you actually want"
165 const double mean =
Mean(trace, bin1, bin2);
167 for (
unsigned int i = bin1; i <= bin2; ++i) {
168 const double diff = trace[i] - mean;
169 squares += diff * diff;
172 return sqrt(squares / (bin2 - bin1 + 1
U));
179 const unsigned int bin1,
const unsigned int bin2)
185 for (
unsigned int i = bin1; i <= bin2; ++i) {
186 squares += trace[i]*trace[i];
189 return sqrt(squares / (bin2 - bin1 + 1
U));
196 const unsigned int bin1,
const unsigned int bin2)
201 const double mean =
Mean(trace, bin1, bin2);
203 for (
unsigned int i = bin1; i <= bin2; ++i) {
204 const double diff = trace[i] - mean;
205 squares += diff * diff;
208 return sqrt(squares / (bin2 - bin1 + 1
U));
215 const unsigned int bin1,
const unsigned int bin2)
220 return accumulate(&trace[bin1], &trace[bin2] + 1, T(0));
227 const unsigned int bin1,
const unsigned int bin2)
235 for (
unsigned int i = bin1; i <= bin2; ++i) {
236 const double value = trace[i];
238 moment += value * (i + 0.5);
248 const unsigned int bin1,
const unsigned int bin2)
251 ostringstream errorMsg;
252 errorMsg <<
" Trace stops at " << trace.
GetStop()
253 <<
" while evaluation requested between " << bin1
260 ostringstream errorMsg;
261 errorMsg <<
"second bin specified can not be smaller than first: bin1 = "
262 << bin1 <<
", bin2 = " << bin2;
274 const unsigned int bin1,
const unsigned int bin2)
282 const double shapeParameterTime = 600 *
nanosecond;
283 const unsigned int shapeParameterBin =
284 bin1 + (
unsigned int)(shapeParameterTime / binSize);
286 if (shapeParameterBin < bin2) {
287 const double sumLate = Sum(trace, shapeParameterBin, bin2);
288 const double sumEarly = Sum(trace, bin1, shapeParameterBin);
289 return sumLate / sumEarly;
305 const unsigned int bin1,
const unsigned int bin2,
311 const double sum = Sum(trace, bin1, bin2);
313 cerr <<
"Pmt trace seems wrong, signal negative (" << sum
318 const double signal = sum * percent / 100.;
320 double sumContent = 0;
321 double sumContentPrev = 0;
323 for (i = bin1; i <= bin2; ++i) {
324 sumContentPrev = sumContent;
325 sumContent += trace[i];
326 if (sumContent >= signal)
330 return ((signal - sumContent) / (sumContent - sumContentPrev) + i + 0.5) *
338 const unsigned int bin1,
const unsigned int bin2)
344 TimeAtRelativeSignalX(trace, bin1, bin2, 50.) -
345 TimeAtRelativeSignalX(trace, bin1, bin2, 10.);
352 const unsigned int bin1,
const unsigned int bin2)
358 TimeAtRelativeSignalX(trace, bin1, bin2, 90.) -
359 TimeAtRelativeSignalX(trace, bin1, bin2, 50.);
368 const unsigned int bin1,
const unsigned int bin2);
373 const unsigned int bin1,
const unsigned int bin2);
378 const unsigned int bin1,
const unsigned int bin2);
383 const unsigned int bin1,
const unsigned int bin2,
384 const unsigned int SortAlgorithmLimit);
389 const unsigned int bin1,
const unsigned int bin2);
394 const unsigned int bin1,
const unsigned int bin2);
399 const unsigned int bin1,
const unsigned int bin2);
404 const unsigned int bin1,
const unsigned int bin2);
409 const unsigned int bin1,
const unsigned int bin2);
414 const unsigned int bin1,
const unsigned int bin2);
419 const unsigned int bin1,
const unsigned int bin2,
425 const unsigned int bin1,
const unsigned int bin2);
430 const unsigned int bin1,
const unsigned int bin2);
435 const unsigned int bin1,
const unsigned int bin2);
440 const unsigned int bin1,
const unsigned int bin2);
445 const unsigned int bin1,
const unsigned int bin2);
450 const unsigned int bin1,
const unsigned int bin2,
451 const unsigned int sortAlgorithmLimit);
456 const unsigned int bin1,
const unsigned int bin2);
461 const unsigned int bin1,
const unsigned int bin2);
466 const unsigned int bin1,
const unsigned int bin2);
471 const unsigned int bin1,
const unsigned int bin2);
476 const unsigned int bin1,
const unsigned int bin2);
481 const unsigned int bin1,
const unsigned int bin2);
486 const unsigned int bin1,
const unsigned int bin2,
492 const unsigned int bin1,
const unsigned int bin2);
497 const unsigned int bin1,
const unsigned int bin2);
static double Max(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2)
Evaluate the maximum of trace between bin1 and bin2.
static double ShapeParameter(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2)
Evaluate the shape parameter between bin1 and bin2.
SizeType GetStop() const
Get valid data stop bin.
void swap(utl::TabulatedFunction &t1, utl::TabulatedFunction &t2)
static double Mean(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2)
Evaluate the mean of trace between bin1 and bin2.
static double FallTime(const Trace< T > &trace, unsigned int bin1, unsigned int bin2)
double GetBinning() const
size of one slot
static double Median(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2, const unsigned int sortAlgorithmLimit=40)
Evaluate the median of trace between bin1 and bin2.
static bool BoundsOk(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2)
constexpr double nanosecond
static double RMS(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2)
static double RootMeanSquare(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2)
Evaluate the RootMeanSquare of trace between bin1 and bin2.
static double Centroid(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2)
static double StandardDeviation(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2)
Evaluate the StandardDeviation of trace between bin1 and bin2.
Template class for a FADC data or calibrated data container. Use the typedefs (TraceD, TraceI, etc.) defined in Trace-fwd.h.
Exception thrown when trying to access invalid bounds in Trace.
static double RiseTime(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2)
double Mean(const std::vector< double > &v)
static double Min(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2)
Evaluate the minimum of trace between bin1 and bin2.
#define ERROR(message)
Macro for logging error messages.
static double Sum(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2)
Evaluate the sum of bins bin1 thru bin2.
static double TimeAtRelativeSignalX(const Trace< T > &trace, const unsigned int bin1, const unsigned int bin2, const double percent)