REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
TRestDetectorSignal.h
1
21
22#ifndef RestCore_TRestDetectorSignal
23#define RestCore_TRestDetectorSignal
24
25#include <TGraph.h>
26#include <TRestStringOutput.h>
27#include <TString.h>
28#include <TVector2.h>
29
30#include <iostream>
31
33 private:
34 Int_t GetMinIndex() const;
35 Int_t GetTimeIndex(Double_t t);
36
37 protected:
38 Int_t fSignalID = -1;
39
40 std::vector<Double_t> fSignalTime; // Vector with the time of the signal
41 std::vector<Double_t> fSignalCharge; // Vector with the charge of the signal
42
43 // TODO: remove this and use readout
44 std::string fName; // Name of the signal
45 std::string fType; // Type of the signal
46
47 public:
48 TGraph* fGraph;
49
50 std::vector<Int_t> fPointsOverThreshold;
51
52 void IncreaseAmplitude(const TVector2& p);
53 void SetPoint(const TVector2& p);
54
55 // TODO other objects should probably skip using GetMaxIndex directly
56 Int_t GetMaxIndex(Int_t from = 0, Int_t to = 0);
57
58 TVector2 GetMaxGauss();
59 TVector2 GetMaxLandau();
60 TVector2 GetMaxAget();
61
62 std::string GetSignalName() const { return fName; }
63 std::string GetSignalType() const { return fType; }
64
65 void SetSignalName(const std::string& name) { fName = name; }
66 void SetSignalType(const std::string& type) { fType = type; }
67
68 // Getters
69 TVector2 GetPoint(Int_t n) {
70 TVector2 vector2(GetTime(n), GetData(n));
71
72 return vector2;
73 }
74
75 inline Int_t GetSignalID() const { return fSignalID; }
76 inline Int_t GetID() const { return fSignalID; }
77
78 void IncreaseTimeBinBy(Int_t bin, Double_t data) {
79 if (bin >= GetNumberOfPoints()) {
80 std::cout << "Increase time bin: outside limits" << std::endl;
81 return;
82 }
83
84 fSignalCharge[bin] += data;
85 }
86
87 Int_t GetNumberOfPoints() const {
88 if (fSignalTime.size() != fSignalCharge.size()) {
89 RESTError << "WARNING, the two std::vector sizes did not match" << RESTendl;
90 exit(1);
91 }
92 return fSignalTime.size();
93 }
94
95 Double_t GetIntegralWithTime(Double_t startTime, Double_t endTime) const;
96 Double_t GetIntegral(Int_t startBin = 0, Int_t endBin = 0) const;
97
98 void Normalize(Double_t scale = 1.);
99
100 std::vector<Int_t> GetPointsOverThreshold() const { return fPointsOverThreshold; }
101
102 Double_t GetAverage(Int_t start = 0, Int_t end = 0);
103 Int_t GetMaxPeakWidth();
104 Double_t GetMaxPeakWithTime(Double_t startTime, Double_t endTime) const;
105
106 Double_t GetMaxPeakValue();
107 Double_t GetMinPeakValue();
108
109 Double_t GetMaxPeakTime(Int_t from = 0, Int_t to = 0);
110
111 Double_t GetMaxValue() { return GetMaxPeakValue(); }
112 Double_t GetMinValue() { return GetMinPeakValue(); }
113
114 Double_t GetMinTime() const;
115 Double_t GetMaxTime() const;
116
117 Double_t GetData(Int_t index) const { return fSignalCharge[index]; }
118 Double_t GetTime(Int_t index) const { return fSignalTime[index]; }
119
120 // Setters
121 void SetSignalID(Int_t sID) { fSignalID = sID; }
122 void SetID(Int_t sID) { fSignalID = sID; }
123
124 void NewPoint(Double_t time, Double_t data);
125 void IncreaseAmplitude(Double_t t, Double_t d);
126
127 void SetPoint(Double_t t, Double_t d);
128 void SetPoint(Int_t index, Double_t t, Double_t d);
129
130 Double_t GetStandardDeviation(Int_t startBin, Int_t endBin);
131 Double_t GetBaseLine(Int_t startBin, Int_t endBin);
132 Double_t GetBaseLineSigma(Int_t startBin, Int_t endBin, Double_t baseline = 0);
133
134 Double_t SubstractBaseline(Int_t startBin, Int_t endBin);
135 void AddOffset(Double_t offset);
136
137 void MultiplySignalBy(Double_t factor);
138 void ExponentialConvolution(Double_t fromTime, Double_t decayTime, Double_t offset = 0);
139 void SignalAddition(TRestDetectorSignal* inSgnl);
140
141 Bool_t isSorted();
142 void Sort();
143
144 void GetDifferentialSignal(TRestDetectorSignal* diffSgnl, Int_t smearPoints = 5);
145 void GetSignalDelayed(TRestDetectorSignal* delayedSignal, Int_t delay);
146 void GetSignalSmoothed(TRestDetectorSignal* smthSignal, Int_t averagingPoints = 3);
147
148 void GetWhiteNoiseSignal(TRestDetectorSignal* noiseSgnl, Double_t noiseLevel = 1.);
149 void GetSignalGaussianConvolution(TRestDetectorSignal* convSgnl, Double_t sigma = 100.,
150 Int_t nSigmas = 5);
151
152 void AddGaussianSignal(Double_t amp, Double_t sigma, Double_t time, Int_t N, Double_t fromTime,
153 Double_t toTime);
154
155 void Reset() {
156 fSignalTime.clear();
157 fSignalCharge.clear();
158 }
159
160 void WriteSignalToTextFile(const TString& filename);
161 void Print() const;
162
163 TGraph* GetGraph(Int_t color = 1);
164
165 // Constructor
167 // Destructor
169
170 ClassDef(TRestDetectorSignal, 4);
171};
172#endif
void IncreaseAmplitude(const TVector2 &p)
If the point already exists inside the detector signal event, the amplitude value will be added to th...
void SetPoint(const TVector2 &p)
If the point already exists inside the detector signal event, it will be overwritten....