REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
TRestRawSignalEvent.cxx
1/*************************************************************************
2 * This file is part of the REST software framework. *
3 * *
4 * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) *
5 * For more information see http://gifna.unizar.es/trex *
6 * *
7 * REST is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * REST is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have a copy of the GNU General Public License along with *
18 * REST in $REST_PATH/LICENSE. *
19 * If not, see http://www.gnu.org/licenses/. *
20 * For the list of contributors see $REST_PATH/CREDITS. *
21 *************************************************************************/
22
63
64#include "TRestRawSignalEvent.h"
65
66#include <TMath.h>
67
68#include "TRestStringHelper.h"
69
70using namespace std;
71
72ClassImp(TRestRawSignalEvent);
73
74TRestRawSignalEvent::TRestRawSignalEvent() {
75 // TRestRawSignalEvent default constructor
76 Initialize();
77}
78
79TRestRawSignalEvent::~TRestRawSignalEvent() {
80 // TRestRawSignalEvent destructor
81}
82
85 fSignal.clear();
86 fPad = nullptr;
87 gr = nullptr;
88
89 fMinValue = numeric_limits<Double_t>::max();
90 fMaxValue = numeric_limits<Double_t>::min();
91 fMinTime = numeric_limits<Double_t>::max();
92 fMaxTime = numeric_limits<Double_t>::min();
93}
94
95void TRestRawSignalEvent::AddSignal(TRestRawSignal& s) {
96 if (signalIDExists(s.GetSignalID())) {
97 cout << "Warning. Signal ID : " << s.GetSignalID()
98 << " already exists. Signal will not be added to signal event" << endl;
99 return;
100 }
101
102 s.CalculateBaseLine(fBaseLineRange.X(), fBaseLineRange.Y());
103 s.SetRange(fRange);
104
105 fSignal.emplace_back(s);
106}
107
108void TRestRawSignalEvent::RemoveSignalWithId(Int_t sId) {
109 Int_t index = GetSignalIndex(sId);
110
111 if (index == -1) {
112 cout << "Warning. Signal ID : " << sId
113 << " does not exist. Signal will not be removed from signal event" << endl;
114 return;
115 }
116
117 fSignal.erase(fSignal.begin() + index);
118}
119
120Int_t TRestRawSignalEvent::GetSignalIndex(Int_t signalID) {
121 for (int i = 0; i < GetNumberOfSignals(); i++)
122 if (fSignal[i].GetSignalID() == signalID) return i;
123 return -1;
124}
125
126Double_t TRestRawSignalEvent::GetIntegral() {
127 Double_t sum = 0;
128
129 for (int i = 0; i < GetNumberOfSignals(); i++) sum += fSignal[i].GetIntegral();
130
131 return sum;
132}
133
137 Double_t sum = 0;
138 for (int i = 0; i < GetNumberOfSignals(); i++) sum += fSignal[i].GetThresholdIntegral();
139 return sum;
140}
141
142TRestRawSignal* TRestRawSignalEvent::GetMaxSignal() {
143 if (GetNumberOfSignals() <= 0) return nullptr;
144
145 Double_t max = fSignal[0].GetIntegral();
146
147 Int_t sId = 0;
148 for (int i = 0; i < GetNumberOfSignals(); i++) {
149 Int_t integ = fSignal[i].GetIntegral();
150 if (max < integ) {
151 max = integ;
152 sId = i;
153 }
154 }
155
156 return &fSignal[sId];
157}
158
159Double_t TRestRawSignalEvent::GetSlopeIntegral() {
160 Double_t sum = 0;
161
162 for (int i = 0; i < GetNumberOfSignals(); i++) sum += fSignal[i].GetSlopeIntegral();
163
164 return sum;
165}
166
167Double_t TRestRawSignalEvent::GetRiseSlope() {
168 Double_t sum = 0;
169
170 Int_t n = 0;
171 for (int i = 0; i < GetNumberOfSignals(); i++) {
172 if (fSignal[i].GetThresholdIntegral() > 0) {
173 sum += fSignal[i].GetSlopeIntegral();
174 n++;
175 }
176 }
177
178 if (n == 0) return 0;
179
180 return sum / n;
181}
182
183Double_t TRestRawSignalEvent::GetRiseTime() {
184 Double_t sum = 0;
185
186 Int_t n = 0;
187 for (int i = 0; i < GetNumberOfSignals(); i++) {
188 if (fSignal[i].GetThresholdIntegral() > 0) {
189 sum += fSignal[i].GetRiseTime();
190 n++;
191 }
192 }
193
194 if (n == 0) return 0;
195
196 return sum / n;
197}
198
199Double_t TRestRawSignalEvent::GetTripleMaxIntegral() {
200 Double_t sum = 0;
201
202 for (int i = 0; i < GetNumberOfSignals(); i++)
203 if (fSignal[i].GetThresholdIntegral() > 0) sum += fSignal[i].GetTripleMaxIntegral();
204
205 return sum;
206}
207
208Double_t TRestRawSignalEvent::GetBaseLineAverage() {
209 Double_t baseLineMean = 0;
210
211 for (int signal = 0; signal < GetNumberOfSignals(); signal++) {
212 Double_t baseline = GetSignal(signal)->GetBaseLine();
213 baseLineMean += baseline;
214 }
215
216 return baseLineMean / GetNumberOfSignals();
217}
218
219Int_t TRestRawSignalEvent::GetLowestWidth(Double_t minPeakAmplitude) {
220 Int_t low = 10000000;
221
222 for (int signal = 0; signal < GetNumberOfSignals(); signal++) {
223 if (GetSignal(signal)->GetMaxPeakValue() > minPeakAmplitude) {
224 Int_t lW = GetSignal(signal)->GetMaxPeakWidth();
225 if (low > lW) low = lW;
226 }
227 }
228
229 return low;
230}
231
232Double_t TRestRawSignalEvent::GetAverageWidth(Double_t minPeakAmplitude) {
233 Double_t avg = 0;
234 Int_t n = 0;
235 for (int signal = 0; signal < GetNumberOfSignals(); signal++) {
236 if (GetSignal(signal)->GetMaxPeakValue() > minPeakAmplitude) {
237 avg += GetSignal(signal)->GetMaxPeakWidth();
238 n++;
239 }
240 }
241
242 if (n == 0)
243 return 0;
244 else
245 return avg / n;
246}
247
248Double_t TRestRawSignalEvent::GetLowAverageWidth(Int_t nSignals, Double_t minPeakAmplitude) {
249 std::vector<Double_t> widths;
250
251 for (int signal = 0; signal < GetNumberOfSignals(); signal++)
252 if (GetSignal(signal)->GetMaxPeakValue() > minPeakAmplitude)
253 widths.push_back(GetSignal(signal)->GetMaxPeakWidth());
254
255 if (widths.size() == 0) return 0;
256
257 std::sort(widths.begin(), widths.end());
258
259 Int_t nMax = nSignals;
260 if (widths.size() < (unsigned int)nSignals) nMax = widths.size();
261
262 Double_t avg = 0;
263 for (int n = 0; n < nMax; n++) avg += widths[n];
264
265 return avg / nSignals;
266}
267
268Double_t TRestRawSignalEvent::GetBaseLineSigmaAverage() {
269 Double_t baseLineSigmaMean = 0;
270
271 for (int signal = 0; signal < GetNumberOfSignals(); signal++) {
272 Double_t baselineSigma = GetSignal(signal)->GetBaseLineSigma();
273 baseLineSigmaMean += baselineSigma;
274 }
275
276 return baseLineSigmaMean / GetNumberOfSignals();
277}
278
284// void TRestRawSignalEvent::subtractBaselines() {
285// for (int signal = 0; signal < GetNumberOfSignals(); signal++)
286// GetSignal(signal)->subtractBaseline();
287//}
288
289void TRestRawSignalEvent::AddChargeToSignal(Int_t signalID, Int_t bin, Short_t value) {
290 Int_t signalIndex = GetSignalIndex(signalID);
291 if (signalIndex == -1) {
292 signalIndex = GetNumberOfSignals();
293
294 TRestRawSignal signal(512); // For the moment we use the default nBins=512
295 signal.SetSignalID(signalID);
296 AddSignal(signal);
297 }
298
299 fSignal[signalIndex].IncreaseBinBy(bin, value);
300}
301
302void TRestRawSignalEvent::PrintEvent() {
304
305 for (int i = 0; i < GetNumberOfSignals(); i++) {
306 cout << "================================================" << endl;
307 cout << "Signal ID : " << fSignal[i].GetSignalID() << endl;
308 cout << "Integral : " << fSignal[i].GetIntegral() << endl;
309 cout << "------------------------------------------------" << endl;
310 fSignal[i].Print();
311 cout << "================================================" << endl;
312 }
313}
314
315// TODO: GetMaxTimeFast, GetMinTimeFast, GetMaxValueFast that return the value
316// of fMinTime, fMaxTime, etc
317void TRestRawSignalEvent::SetMaxAndMin() {
318 fMinValue = numeric_limits<Double_t>::max();
319 fMaxValue = numeric_limits<Double_t>::min();
320 fMinTime = numeric_limits<Double_t>::max();
321 fMaxTime = numeric_limits<Double_t>::min();
322
323 for (int s = 0; s < GetNumberOfSignals(); s++) {
324 if (fMinValue > fSignal[s].GetMinValue()) {
325 fMinValue = fSignal[s].GetMinValue();
326 }
327 if (fMaxValue < fSignal[s].GetMaxValue()) {
328 fMaxValue = fSignal[s].GetMaxValue();
329 }
330 }
331
332 if (GetNumberOfSignals() > 0) {
333 fMaxTime = fSignal[0].GetNumberOfPoints();
334 }
335}
336
337Double_t TRestRawSignalEvent::GetMaxValue() {
338 SetMaxAndMin();
339 return fMaxValue;
340}
341
342Double_t TRestRawSignalEvent::GetMinValue() {
343 SetMaxAndMin();
344 return fMinValue;
345}
346
347Double_t TRestRawSignalEvent::GetMinTime() { return 0; }
348
349Double_t TRestRawSignalEvent::GetMaxTime() {
350 Double_t maxTime = 512;
351
352 if (GetNumberOfSignals() > 0) maxTime = fSignal[0].GetNumberOfPoints();
353
354 return maxTime;
355}
356
408TPad* TRestRawSignalEvent::DrawEvent(const TString& option) {
409 const int nSignals = GetNumberOfSignals();
410
411 if (fPad != nullptr) {
412 delete fPad;
413 fPad = nullptr;
414 }
415
416 if (nSignals == 0) {
417 cout << "Empty event " << endl;
418 return nullptr;
419 }
420
421 fMinValue = numeric_limits<Double_t>::max();
422 fMaxValue = numeric_limits<Double_t>::min();
423 fMinTime = numeric_limits<Double_t>::max();
424 fMaxTime = numeric_limits<Double_t>::min();
425
426 fPad = new TPad(GetName(), " ", 0, 0, 1, 1);
427 fPad->Draw();
428 fPad->cd();
429 // fPad->DrawFrame(0, GetMinValue() - 1, GetMaxTime() + 1, GetMaxValue() + 1);
430
431 char title[256];
432 vector<TString> optList = Vector_cast<string, TString>(TRestTools::GetOptions((string)option));
433
434 bool thresholdCheck = false;
435 bool baselineCheck = false;
436 bool sRangeID = false;
437 bool printIDs = false;
438
439 double signalTh = 0, pointTh = 0, nOver = 0;
440 int baseLineRangeInit = 0, baseLineRangeEnd = 0;
441 int sRangeInit = 0, sRangeEnd = 0;
442
443 for (const auto& opt : optList) {
444 std::string str = (std::string)opt;
445 // Read threshold option
446 if (str.find("onlyGoodSignals[") != string::npos) {
447 size_t startPos = str.find('[');
448 size_t endPos = str.find(']');
449 TString tmpStr = opt(startPos + 1, endPos - startPos - 1);
450 vector<TString> optList_2 = Vector_cast<string, TString>(Split((string)tmpStr, ","));
451
452 pointTh = StringToDouble((string)optList_2[0]);
453 signalTh = StringToDouble((string)optList_2[1]);
454 nOver = StringToDouble((string)optList_2[2]);
455
456 thresholdCheck = true;
457 }
458
459 // Read baseline option
460 if (str.find("baseLineRange[") != string::npos) {
461 size_t startPos2 = str.find('[');
462 size_t endPos2 = str.find(']');
463 TString tmpStr2 = opt(startPos2 + 1, endPos2 - startPos2 - 1);
464 vector<TString> optList_3 = Vector_cast<string, TString>(Split((string)tmpStr2, ","));
465
466 baseLineRangeInit = StringToInteger((string)optList_3[0]);
467 baseLineRangeEnd = StringToInteger((string)optList_3[1]);
468
469 baselineCheck = true;
470 }
471
472 // Read signal range ID option
473 if (str.find("signalRangeID[") != string::npos || str.find("ids[") != string::npos) {
474 size_t startPos3 = str.find('[');
475 size_t endPos3 = str.find(']');
476 TString tmpStr3 = opt(startPos3 + 1, endPos3 - startPos3 - 1);
477 vector<TString> optList_4;
478 if (str.find(',') != string::npos)
479 optList_4 = Vector_cast<string, TString>(Split((string)tmpStr3, ","));
480 else if (str.find('-') != string::npos)
481 optList_4 = Vector_cast<string, TString>(Split((string)tmpStr3, "-"));
482 else
483 RESTError << "TRestRawSignalEvent::DrawEvent not valid ids format!" << RESTendl;
484
485 sRangeInit = StringToInteger((string)optList_4[0]);
486 sRangeEnd = StringToInteger((string)optList_4[1]);
487
488 sRangeID = true;
489 }
490
491 // Read print ID option
492 if (str.find("printIDs") != string::npos) {
493 printIDs = true;
494 cout << "IDs of printed signals: " << endl;
495 }
496 }
497
498 std::vector<int> signalIDs; // Signal IDs to print
499
501 if ((optList.empty()) || !(isANumber((string)optList[0]))) {
502 // If threshold and baseline options are given
503 if (thresholdCheck && baselineCheck) {
504 RESTDebug << "Draw only good signals with: " << RESTendl;
505 RESTDebug << " Signal threshold: " << signalTh << RESTendl;
506 RESTDebug << " Point threshold: " << pointTh << RESTendl;
507 RESTDebug << " Points over threshold: " << nOver << RESTendl;
508 RESTDebug << " Base line range: (" << baseLineRangeInit << "," << baseLineRangeEnd << ")"
509 << RESTendl;
510
511 for (int n = 0; n < nSignals; n++) {
512 fSignal[n].CalculateBaseLine(baseLineRangeInit, baseLineRangeEnd);
513 fSignal[n].InitializePointsOverThreshold(TVector2(pointTh, signalTh), nOver);
514 if (fSignal[n].GetPointsOverThreshold().size() >= 2) {
515 signalIDs.push_back(fSignal[n].GetID());
516 }
517 }
518 // If no threshold and baseline options are given
519 } else {
520 for (int n = 0; n < nSignals; n++) {
521 signalIDs.push_back(fSignal[n].GetID());
522 }
523 }
524
525 // Remove SIDs which are not in range
526 if (sRangeID) {
527 for (auto it = signalIDs.begin(); it != signalIDs.end();)
528 if (*it >= sRangeInit && *it <= sRangeEnd) {
529 ++it;
530 } else {
531 it = signalIDs.erase(it);
532 }
533 }
534
535 cout << "Number of drawn signals: " << signalIDs.size() << endl;
536
538 } else if (isANumber((string)optList[0])) {
539 string str = (string)optList[0];
540 size_t separation = str.find('-');
541
542 // Signals range //
543 if (separation != string::npos) {
544 TString firstSignal = optList[0](0, separation);
545 TString lastSignal = optList[0](separation + 1, str.size());
546 RESTDebug << "First signal: " << firstSignal << RESTendl;
547 RESTDebug << "Last signal: " << lastSignal << RESTendl;
548
549 if (StringToInteger((string)lastSignal) >= (int)fSignal.size()) {
550 fPad->SetTitle("No Such Signal");
551 cout << "No such last signal" << endl;
552 return fPad;
553 }
554
555 sprintf(title, "Event ID %d", this->GetID());
556
557 if (thresholdCheck && baselineCheck) {
558 RESTDebug << "Draw only good signals with: " << RESTendl;
559 RESTDebug << " Signal threshold: " << signalTh << RESTendl;
560 RESTDebug << " Point threshold: " << pointTh << RESTendl;
561 RESTDebug << " Points over threshold: " << nOver << RESTendl;
562 RESTDebug << " Base line range: (" << baseLineRangeInit << "," << baseLineRangeEnd << ")"
563 << RESTendl;
564
565 for (int n = 0; n < nSignals; n++) {
566 if (n < StringToInteger((string)firstSignal) || n > StringToInteger((string)lastSignal))
567 continue;
568 fSignal[n].CalculateBaseLine(baseLineRangeInit, baseLineRangeEnd);
569 fSignal[n].InitializePointsOverThreshold(TVector2(pointTh, signalTh), nOver);
570 if (fSignal[n].GetPointsOverThreshold().size() >= 2) {
571 signalIDs.push_back(fSignal[n].GetID());
572 }
573 }
574 cout << "Number of good signals in range (" << firstSignal << "," << lastSignal
575 << "): " << signalIDs.size() << endl;
576 // If no threshold and baseline options are given
577 } else {
578 for (int n = StringToInteger((string)firstSignal);
579 n < StringToInteger((string)lastSignal) + 1; n++) {
580 signalIDs.push_back(fSignal[n].GetID());
581 }
582 }
583 // Single signal
584 } else {
585 int signalID = StringToInteger((string)optList[0]);
586 signalIDs.push_back(signalID);
587 }
588 }
589
590 if (signalIDs.empty()) {
591 fPad->SetTitle("No Such Signal");
592 cout << "No signals found" << endl;
593 return fPad;
594 }
595
596 if (printIDs) {
597 cout << "SignalIDs:";
598 auto sortedSignalsIDs = signalIDs;
599 sort(sortedSignalsIDs.begin(), sortedSignalsIDs.end());
600 for (const auto& signalID : sortedSignalsIDs) {
601 cout << " " << signalID;
602 }
603 cout << endl;
604 }
605
606 DrawSignals(fPad, signalIDs);
607
608 return fPad;
609}
610
615void TRestRawSignalEvent::DrawSignals(TPad* pad, const std::vector<Int_t>& signals) {
616 int maxSID = -1;
617 int max = numeric_limits<Short_t>::min();
618 int graphIndex = 1;
619
620 for (const auto& s : signals) {
621 TRestRawSignal* signal = GetSignalById(s);
622 if (!signal) {
623 continue;
624 }
625 TGraph* graph = signal->GetGraph(graphIndex++);
626 const double maxValue = TMath::MaxElement(graph->GetN(), graph->GetY());
627 if (maxValue > max) {
628 max = maxValue;
629 maxSID = s;
630 }
631 }
632
633 RESTDebug << "Max SID " << maxSID << RESTendl;
634
635 if (maxSID == -1) {
636 cout << "No signals ID found" << endl;
637 return;
638 }
639
640 TRestRawSignal* signalMaxID = GetSignalById(maxSID);
641 std::string title = "Event ID " + std::to_string(GetID());
642 if (signals.size() == 1) {
643 title += " Signal ID " + std::to_string(maxSID);
644 }
645
646 signalMaxID->fGraph->SetTitle(title.c_str());
647 signalMaxID->fGraph->GetXaxis()->SetTitle("Time bin");
648 signalMaxID->fGraph->GetYaxis()->SetTitleOffset(1.4);
649 signalMaxID->fGraph->GetYaxis()->SetTitle("Amplitude [a.u.]");
650 pad->Draw();
651 pad->cd();
652 signalMaxID->fGraph->SetLineColor(kBlack);
653 signalMaxID->fGraph->Draw("AL");
654
655 for (const auto& signalID : signals) {
656 if (signalID == maxSID) {
657 continue;
658 }
659 TRestRawSignal* signal = GetSignalById(signalID);
660 pad->cd();
661 signal->fGraph->Draw("L");
662 }
663
664 pad->Update();
665}
666
687TPad* TRestRawSignalEvent::DrawSignal(Int_t signalID, const TString& option) {
688 int nSignals = this->GetNumberOfSignals();
689
690 if (fPad != nullptr) {
691 for (int n = 0; n < nSignals; n++) {
692 delete fSignal[n].fGraph;
693 fSignal[n].fGraph = nullptr;
694 }
695 delete fPad;
696 fPad = nullptr;
697 }
698
699 if (nSignals == 0) {
700 cout << "Empty event " << endl;
701 return nullptr;
702 }
703
704 vector<TString> optList = Vector_cast<string, TString>(TRestTools::GetOptions((string)option));
705
706 double signalTh = 0, pointTh = 0, nOver = 0;
707 int baseLineRangeInit = 0, baseLineRangeEnd = 0;
708
709 for (auto& opt : optList) {
710 string str = (string)opt;
711
712 // Read threshold option
713 size_t goodSigOpt = str.find("goodSignals[");
714
715 if (goodSigOpt != string::npos) {
716 size_t startPos = str.find('[');
717 size_t endPos = str.find(']');
718 TString tmpStr = opt(startPos + 1, endPos - startPos - 1);
719 vector<TString> optList_2 = Vector_cast<string, TString>(Split((string)tmpStr, ","));
720
721 pointTh = StringToDouble((string)optList_2[0]);
722 signalTh = StringToDouble((string)optList_2[1]);
723 nOver = StringToDouble((string)optList_2[2]);
724 }
725
726 // Read baseline option
727 size_t BLOpt = str.find("baseLineRange[");
728
729 if (BLOpt != string::npos) {
730 size_t startPos2 = str.find('[');
731 size_t endPos2 = str.find(']');
732 TString tmpStr2 = opt(startPos2 + 1, endPos2 - startPos2 - 1);
733 vector<TString> optList_3 = Vector_cast<string, TString>(Split((string)tmpStr2, ","));
734
735 baseLineRangeInit = StringToInteger((string)optList_3[0]);
736 baseLineRangeEnd = StringToInteger((string)optList_3[1]);
737 }
738 }
739
740 fPad = new TPad(this->GetName(), " ", 0, 0, 1, 1);
741 fPad->Draw();
742 fPad->cd();
743
744 TGraph* gr = new TGraph();
745
746 TRestRawSignal* signal = this->GetSignalById(signalID);
747 signal->CalculateBaseLine(baseLineRangeInit, baseLineRangeEnd);
748 signal->InitializePointsOverThreshold(TVector2(pointTh, signalTh), nOver);
749
750 RESTInfo << "Drawing signalID. Event ID : " << this->GetID() << " Signal ID : " << signal->GetID()
751 << RESTendl;
752
753 for (int n = 0; n < signal->GetNumberOfPoints(); n++) {
754 gr->SetPoint(n, n, signal->GetData(n));
755 }
756
757 gr->Draw("AC*");
758
759 TGraph* gr2 = new TGraph();
760
761 gr2->SetLineWidth(2);
762 gr2->SetLineColor(2); // Red
763
764 for (int n = baseLineRangeInit; n < baseLineRangeEnd; n++) {
765 gr2->SetPoint(n - baseLineRangeInit, n, signal->GetData(n));
766 }
767
768 gr2->Draw("CP");
769
770 vector<Int_t> pOver = signal->GetPointsOverThreshold();
771
772 TGraph* gr3[5];
773 Int_t nGraphs = 0;
774 gr3[nGraphs] = new TGraph();
775 gr3[nGraphs]->SetLineWidth(2);
776 gr3[nGraphs]->SetLineColor(3);
777 Int_t point = 0;
778 Int_t nPoints = pOver.size();
779 for (int n = 0; n < nPoints; n++) {
780 gr3[nGraphs]->SetPoint(point, pOver[n], signal->GetData(pOver[n]));
781 point++;
782 if (n + 1 < nPoints && pOver[n + 1] - pOver[n] > 1) {
783 gr3[nGraphs]->Draw("CP");
784 nGraphs++;
785 if (nGraphs > 4) cout << "Ngraphs : " << nGraphs << endl;
786 point = 0;
787 gr3[nGraphs] = new TGraph();
788 gr3[nGraphs]->SetLineWidth(2);
789 gr3[nGraphs]->SetLineColor(3); // Green
790 }
791 }
792
793 if (nPoints > 0) {
794 gr3[nGraphs]->Draw("CP");
795 }
796
797 return fPad;
798}
799
800TRestRawReadoutMetadata* TRestRawSignalEvent::GetReadoutMetadata() const {
801 if (fRun == nullptr) {
802 RESTError << "TRestRawSignalEvent::GetReadoutMetadata: fRun is nullptr" << RESTendl;
803 return nullptr;
804 }
805 return dynamic_cast<TRestRawReadoutMetadata*>(fRun->GetMetadataClass("TRestRawReadoutMetadata"));
806}
807
808TRestRawSignalEvent TRestRawSignalEvent::GetSignalEventForType(const string& type) const {
809 return GetSignalEventForTypes({type});
810}
811
812TRestRawSignalEvent TRestRawSignalEvent::GetSignalEventForTypes(
813 const std::set<std::string>& types, const TRestRawReadoutMetadata* readoutMetadata) const {
814 // TODO: verify this works
815 TRestRawSignalEvent signalEvent;
816 signalEvent.SetEventInfo((TRestEvent*)this);
817 auto metadata = readoutMetadata ? readoutMetadata : GetReadoutMetadata();
818 if (metadata == nullptr) {
819 // cerr << "TRestRawSignalEvent::GetSignalEventForTypes: metadata is nullptr" << endl;
820 // exit(1);
821 }
822 for (const auto& signal : fSignal) {
823 if (types.empty() ||
824 types.find(metadata->GetTypeForChannelDaqId(signal.GetSignalID())) != types.end()) {
825 signalEvent.AddSignal(const_cast<TRestRawSignal&>(signal));
826 }
827 }
828 return signalEvent;
829}
A base class for any REST event.
Definition: TRestEvent.h:38
void SetEventInfo(TRestEvent *eve)
Definition: TRestEvent.cxx:135
virtual void PrintEvent() const
Definition: TRestEvent.cxx:181
virtual void Initialize()=0
Definition: TRestEvent.cxx:71
An event container for time rawdata signals with fixed length.
void DrawSignals(TPad *pad, const std::vector< Int_t > &signals)
This method draws selected signal IDs, given by the vector passed as reference.
TPad * DrawEvent(const TString &option="")
This method draws current raw signal event in a TPad.
TPad * DrawSignal(Int_t signalID, const TString &option="")
This method draws selected signalID by ID, with baseline range and points over threshold highlighted.
void AddChargeToSignal(Int_t sgnlID, Int_t bin, Short_t value)
It defines a Short_t array with a physical parameter that evolves in time using a fixed time bin.
Double_t GetBaseLineSigma() const
Int_t GetID() const
Returns the value of signal ID.
TGraph * fGraph
A TGraph pointer used to store the TRestRawSignal drawing.
Double_t GetMaxPeakValue()
It returns the amplitude of the signal maximum, baseline will be corrected if CalculateBaseLine was c...
void CalculateBaseLine(Int_t startBin, Int_t endBin, const std::string &option="")
This method calculates the average and fluctuation of the baseline in the specified range and writes ...
void SetSignalID(Int_t sID)
It sets the id number of the signal.
std::vector< Int_t > GetPointsOverThreshold() const
Returns a std::vector containing the indexes of data points over threshold.
Double_t GetBaseLine() const
void InitializePointsOverThreshold(const TVector2 &thrPar, Int_t nPointsOver, Int_t nPointsFlat=512)
It initializes the fPointsOverThreshold array with the indexes of data points that are found over thr...
Int_t GetMaxPeakWidth()
It returns the temporal width of the peak with maximum amplitude inside the signal.
Double_t GetData(Int_t n) const
It returns the data value of point n including baseline correction.
TGraph * GetGraph(Int_t color=1)
It builds a TGraph object that can be used for drawing.
Int_t GetSignalID() const
Returns the value of signal ID.
void SetRange(const TVector2 &range)
It sets/constrains the range for any calculation.
Int_t GetNumberOfPoints() const
Returns the actual number of points, or size of the signal.
static std::vector< std::string > GetOptions(std::string optionsStr)
Returns all the options in an option string.
Definition: TRestTools.cxx:86
std::vector< std::string > Split(std::string in, std::string separator, bool allowBlankString=false, bool removeWhiteSpaces=false, int startPos=-1)
Split the input string according to the given separator. Returning a vector of fragments.
Double_t StringToDouble(std::string in)
Gets a double from a string.
Int_t StringToInteger(std::string in)
Gets an integer from a string.
Int_t isANumber(std::string in)
Returns 1 only if a valid number is found in the string in. If not it returns 0.