REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
TRestDetectorSignalEvent.cxx
1
79
80#include "TRestDetectorSignalEvent.h"
81
82#include <TMath.h>
83
84using namespace std;
85
87
88TRestDetectorSignalEvent::TRestDetectorSignalEvent() {
89 // TRestDetectorSignalEvent default constructor
90 Initialize();
91}
92
93TRestDetectorSignalEvent::~TRestDetectorSignalEvent() {
94 // TRestDetectorSignalEvent destructor
95}
96
99 fSignal.clear();
100 fPad = nullptr;
101 fMinValue = std::numeric_limits<Double_t>::max();
102 fMaxValue = std::numeric_limits<Double_t>::min();
103 fMinTime = std::numeric_limits<Double_t>::max();
104 fMaxTime = std::numeric_limits<Double_t>::min();
105}
106
107void TRestDetectorSignalEvent::AddSignal(const TRestDetectorSignal& signal) {
108 if (signalIDExists(signal.GetSignalID())) {
109 cout << "Warning. Signal ID : " << signal.GetSignalID()
110 << " already exists. Signal will not be added to signal event" << endl;
111 return;
112 }
113
114 fSignal.emplace_back(signal);
115}
116
117void TRestDetectorSignalEvent::RemoveSignalWithId(Int_t sId) {
118 Int_t index = GetSignalIndex(sId);
119
120 if (index == -1) {
121 std::cout << "Warning. Signal ID : " << sId
122 << " does not exist. Signal will not be removed from signal event" << std::endl;
123 return;
124 }
125
126 fSignal.erase(fSignal.begin() + index);
127}
128
129Int_t TRestDetectorSignalEvent::GetSignalIndex(Int_t signalID) {
130 for (int i = 0; i < GetNumberOfSignals(); i++)
131 if (fSignal[i].GetSignalID() == signalID) return i;
132 return -1;
133}
134
135Double_t TRestDetectorSignalEvent::GetIntegral(Int_t startBin, Int_t endBin) {
136 Double_t sum = 0;
137
138 for (int i = 0; i < GetNumberOfSignals(); i++) sum += fSignal[i].GetIntegral(startBin, endBin);
139
140 return sum;
141}
142
143Double_t TRestDetectorSignalEvent::GetIntegralWithTime(Double_t startTime, Double_t endTime) {
144 Double_t sum = 0;
145 for (int n = 0; n < GetNumberOfSignals(); n++) sum += fSignal[n].GetIntegralWithTime(startTime, endTime);
146
147 return sum;
148}
149
150void TRestDetectorSignalEvent::AddChargeToSignal(Int_t signalID, Double_t time, Double_t charge) {
151 Int_t signalIndex = GetSignalIndex(signalID);
152 if (signalIndex == -1) {
153 signalIndex = GetNumberOfSignals();
154 TRestDetectorSignal signal;
155 signal.SetSignalID(signalID);
156 AddSignal(signal);
157 }
158
159 fSignal[signalIndex].IncreaseAmplitude(time, charge);
160}
161
162void TRestDetectorSignalEvent::PrintEvent() {
164
165 for (int i = 0; i < GetNumberOfSignals(); i++) {
166 const auto& signal = fSignal[i];
167 signal.Print();
168 }
169}
170
171// TODO: GetMaxTimeFast, GetMinTimeFast, GetMaxValueFast that return the value of fMinTime, fMaxTime, etc.
172void TRestDetectorSignalEvent::SetMaxAndMin() {
173 fMinValue = std::numeric_limits<Double_t>::max();
174 fMaxValue = std::numeric_limits<Double_t>::min();
175 fMinTime = std::numeric_limits<Double_t>::max();
176 fMaxTime = std::numeric_limits<Double_t>::min();
177
178 for (int s = 0; s < GetNumberOfSignals(); s++) {
179 if (fMinTime > fSignal[s].GetMinTime()) fMinTime = fSignal[s].GetMinTime();
180 if (fMaxTime < fSignal[s].GetMaxTime()) fMaxTime = fSignal[s].GetMaxTime();
181
182 if (fMinValue > fSignal[s].GetMinValue()) fMinValue = fSignal[s].GetMinValue();
183 if (fMaxValue < fSignal[s].GetMaxValue()) fMaxValue = fSignal[s].GetMaxValue();
184 }
185}
186
187Double_t TRestDetectorSignalEvent::GetMaxValue() {
188 SetMaxAndMin();
189 return fMaxValue;
190}
191
192Double_t TRestDetectorSignalEvent::GetMinValue() {
193 SetMaxAndMin();
194 return fMinValue;
195}
196
197Double_t TRestDetectorSignalEvent::GetMinTime() {
198 Double_t minTime = numeric_limits<Double_t>::max();
199 for (int s = 0; s < GetNumberOfSignals(); s++) {
200 if (minTime > fSignal[s].GetMinTime()) {
201 minTime = fSignal[s].GetMinTime();
202 }
203 }
204 return minTime;
205}
206
207Double_t TRestDetectorSignalEvent::GetMaxTime() {
208 Double_t maxTime = numeric_limits<Double_t>::min();
209 for (int s = 0; s < GetNumberOfSignals(); s++) {
210 if (maxTime < fSignal[s].GetMaxTime()) {
211 maxTime = fSignal[s].GetMaxTime();
212 }
213 }
214 return maxTime;
215}
216
217// Draw current event in a TPad
218TPad* TRestDetectorSignalEvent::DrawEvent(const TString& option) {
219 delete fPad;
220
221 int nSignals = this->GetNumberOfSignals();
222
223 if (nSignals == 0) {
224 cout << "Empty event " << endl;
225 return nullptr;
226 }
227
228 fMinValue = std::numeric_limits<Double_t>::max();
229 fMaxValue = std::numeric_limits<Double_t>::min();
230 fMinTime = std::numeric_limits<Double_t>::max();
231 fMaxTime = std::numeric_limits<Double_t>::min();
232
233 fPad = new TPad(this->GetName(), " ", 0, 0, 1, 1);
234 fPad->Draw();
235 fPad->cd();
236 fPad->DrawFrame(GetMinTime(), GetMinValue(), GetMaxTime(), GetMaxValue());
237
238 char title[256];
239 sprintf(title, "Event ID %d", this->GetID());
240
241 TMultiGraph* mg = new TMultiGraph();
242 mg->SetTitle(title);
243 mg->GetXaxis()->SetTitle("Time [us]");
244 mg->GetXaxis()->SetTitleOffset(1.1);
245 mg->GetYaxis()->SetTitle("Amplitude [a.u.]");
246 mg->GetYaxis()->SetTitleOffset(0.8);
247
248 mg->GetYaxis()->SetTitleSize(1.4 * mg->GetYaxis()->GetTitleSize());
249 mg->GetXaxis()->SetTitleSize(1.4 * mg->GetXaxis()->GetTitleSize());
250 mg->GetYaxis()->SetLabelSize(1.25 * mg->GetYaxis()->GetLabelSize());
251 mg->GetXaxis()->SetLabelSize(1.25 * mg->GetXaxis()->GetLabelSize());
252
253 for (int n = 0; n < nSignals; n++) {
254 TGraph* gr = fSignal[n].GetGraph(n + 1);
255 mg->Add(gr);
256 }
257
258 fPad->cd();
259 mg->Draw("");
260
261 return fPad;
262}
TPad * DrawEvent(const TString &option="")
Draw the event.
virtual void PrintEvent() const
Definition: TRestEvent.cxx:187
virtual void Initialize()=0
Definition: TRestEvent.cxx:73