63 float mainx = xsize + 2 * 10;
66 float currentY =
yoffset + ycount * (ysize_dist + ysize);
68 auto nextY = [&ycount, ¤tY,
yoffset, ysize, ysize_dist]() {
70 currentY =
yoffset + ycount * (ysize_dist + ysize);
74 mFrameMain->SetLayoutBroken(kTRUE);
75 mFrameMain->SetCleanup(kDeepCleanup);
77 TGCompositeFrame* mContRight =
new TGCompositeFrame(mFrameMain, xsize + 5, mainy, kVerticalFrame | kFixedWidth | kFitHeight);
78 mFrameMain->AddFrame(mContRight,
new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY | kLHintsExpandX, 3, 5, 3, 3));
81 TGTextButton* mFrameNextEvent =
new TGTextButton(mContRight,
"&Next Event");
82 mContRight->AddFrame(mFrameNextEvent,
new TGLayoutHints(kLHintsExpandX));
84 mFrameNextEvent->Connect(
"Clicked()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"next(=-1)");
85 mFrameNextEvent->SetTextColor(200);
86 mFrameNextEvent->SetToolTipText(
"Go to next event");
87 mFrameNextEvent->MoveResize(10, currentY, xsize, (
unsigned int)ysize);
91 TGTextButton* mFramePreviousEvent =
new TGTextButton(mContRight,
"&Previous Event");
92 mContRight->AddFrame(mFramePreviousEvent,
new TGLayoutHints(kLHintsExpandX));
94 mFramePreviousEvent->SetState(kButtonDisabled);
97 mFramePreviousEvent->Connect(
"Clicked()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"next(=-2)");
98 mFramePreviousEvent->SetTextColor(200);
99 mFramePreviousEvent->SetToolTipText(
"Go to previous event");
100 mFramePreviousEvent->MoveResize(10, currentY, xsize, (
unsigned int)ysize);
105 TGTextButton* mGoToEvent =
new TGTextButton(mContRight,
"&Go to event");
106 mContRight->AddFrame(mGoToEvent,
new TGLayoutHints(kLHintsNormal));
108 mGoToEvent->SetTextColor(200);
109 mGoToEvent->SetToolTipText(
"Go to event");
110 mGoToEvent->MoveResize(10, currentY, 0.65 * xsize, (
unsigned int)ysize);
111 mGoToEvent->Connect(
"Clicked()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"callEventNumber()");
114 auto* ftbuf =
new TGTextBuffer(10);
115 ftbuf->AddText(0,
"0");
116 mEventNumber =
new TGTextEntry(mContRight, ftbuf);
117 mContRight->AddFrame(mEventNumber,
new TGLayoutHints(kFitHeight));
118 mEventNumber->MoveResize(0.7 * xsize, currentY, 0.3 * xsize, (
unsigned int)ysize);
119 mEventNumber->SetAlignment(kTextRight);
123 TGTextButton* mApplySignalThreshold =
new TGTextButton(mContRight,
"&Apply Threshold");
124 mContRight->AddFrame(mApplySignalThreshold,
new TGLayoutHints(kLHintsNormal));
126 mApplySignalThreshold->SetTextColor(200);
127 mApplySignalThreshold->SetToolTipText(
"Apply Threshold");
128 mApplySignalThreshold->MoveResize(10, currentY, 0.65 * xsize, (
unsigned int)ysize);
129 mApplySignalThreshold->Connect(
"Clicked()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"applySignalThreshold()");
131 auto* signalThresholdBuf =
new TGTextBuffer(10);
132 signalThresholdBuf->AddText(0,
"0");
133 mSignalThresholdValue =
new TGTextEntry(mContRight, signalThresholdBuf);
134 mSignalThresholdValue->MoveResize(0.7 * xsize, currentY, 0.3 * xsize, (
unsigned int)ysize);
135 mSignalThresholdValue->SetAlignment(kTextRight);
136 mSignalThresholdValue->Connect(
"ReturnPressed()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"applySignalThreshold()");
140 mCheckSingleTB =
new TGCheckButton(mContRight,
"One TB");
141 mContRight->AddFrame(mCheckSingleTB,
new TGLayoutHints(kLHintsExpandX));
143 mCheckSingleTB->Connect(
"Clicked()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"toggleSingleTimeBin()");
144 mCheckSingleTB->SetTextColor(200);
145 mCheckSingleTB->SetToolTipText(
"Show single time bin");
146 mCheckSingleTB->MoveResize(10, currentY, 0.5 * xsize, (
unsigned int)ysize);
147 mCheckSingleTB->SetDown(0);
149 mSelTimeBin =
new TGNumberEntry(mContRight, mEvDisp.
getFirstTimeBin(), 6, 999, TGNumberFormat::kNESInteger,
150 TGNumberFormat::kNEAPositive,
151 TGNumberFormat::kNELLimitMinMax,
154 mSelTimeBin->MoveResize(0.55 * xsize, currentY, 0.45 * xsize, (
unsigned int)ysize);
155 mSelTimeBin->Connect(
"ValueSet(Long_t)",
"o2::tpc::SimpleEventDisplayGUI",
this,
"selectTimeBin()");
156 (mSelTimeBin->GetNumberEntry())->
Connect(
"ReturnPressed()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"selectTimeBin()");
160 mCheckFFT =
new TGCheckButton(mContRight,
"Show FFT");
161 mContRight->AddFrame(mCheckFFT,
new TGLayoutHints(kLHintsExpandX));
163 mCheckFFT->Connect(
"Clicked()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"toggleFFT()");
164 mCheckFFT->SetTextColor(200);
165 mCheckFFT->SetToolTipText(
"Switch on FFT calculation");
166 mCheckFFT->MoveResize(10, currentY, xsize, (
unsigned int)ysize);
167 mCheckFFT->SetDown(0);
172 mCheckOccupancy =
new TGCheckButton(mContRight,
"Show Occupancy");
173 mContRight->AddFrame(mCheckOccupancy,
new TGLayoutHints(kLHintsExpandX));
175 mCheckOccupancy->Connect(
"Clicked()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"toggleOccupancy()");
176 mCheckOccupancy->SetTextColor(200);
177 mCheckOccupancy->SetToolTipText(
"Switch on Occupancy calculation");
178 mCheckOccupancy->MoveResize(10, currentY, xsize, (
unsigned int)ysize);
179 mCheckOccupancy->SetDown(0);
184 mCheckPadTime =
new TGCheckButton(mContRight,
"Show PadTime");
185 mContRight->AddFrame(mCheckPadTime,
new TGLayoutHints(kLHintsExpandX));
187 mCheckPadTime->Connect(
"Clicked()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"togglePadTime()");
188 mCheckPadTime->SetTextColor(200);
189 mCheckPadTime->SetToolTipText(
"Switch on PadTime calculation");
190 mCheckPadTime->MoveResize(10, currentY, xsize, (
unsigned int)ysize);
191 mCheckPadTime->SetDown(0);
195 mCheckShowClusters =
new TGCheckButton(mContRight,
"Overlay clusters");
196 mContRight->AddFrame(mCheckShowClusters,
new TGLayoutHints(kLHintsExpandX));
198 mCheckShowClusters->Connect(
"Clicked()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"toggleClusters()");
199 mCheckShowClusters->SetTextColor(200);
200 mCheckShowClusters->SetToolTipText(
"Switch on ShowClusters calculation");
201 mCheckShowClusters->MoveResize(10, currentY, xsize, (
unsigned int)ysize);
202 mCheckShowClusters->SetDown(0);
203 mCheckShowClusters->SetEnabled(kFALSE);
208 mFlagGroup =
new TGVButtonGroup(mContRight,
"Cl Flags");
209 auto hframe =
new TGHorizontalFrame(mFlagGroup);
210 const std::string flagTips[NCheckClFlags] = {
"Golden",
"Split Pad",
"Split Time",
"Edge",
"Single Pad and/or Time"};
211 for (
int iCheck = 0; iCheck < NCheckClFlags; ++iCheck) {
212 mCheckClFlags[iCheck] =
new TGCheckButton(hframe,
"", 10000 + iCheck);
213 mCheckClFlags[iCheck]->SetToolTipText(flagTips[iCheck].
data());
214 mCheckClFlags[iCheck]->SetDown(1);
215 mCheckClFlags[iCheck]->SetEnabled(kFALSE);
216 mCheckClFlags[iCheck]->Connect(
"Clicked()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"showClusters(=-1,-1)");
217 hframe->AddFrame(mCheckClFlags[iCheck],
new TGLayoutHints(kLHintsExpandX));
219 mFlagGroup->AddFrame(hframe,
new TGLayoutHints(kLHintsExpandX));
221 mFlagGroup->MoveResize(10, currentY, xsize, (
unsigned int)2 * ysize);
222 mContRight->AddFrame(mFlagGroup,
new TGLayoutHints(kLHintsExpandX));
223 mFlagGroup->SetState(kFALSE);
228 TGTextButton* mFrameExit =
new TGTextButton(mContRight,
"Exit ROOT");
229 mContRight->AddFrame(mFrameExit,
new TGLayoutHints(kLHintsExpandX));
231 mFrameExit->Connect(
"Clicked()",
"o2::tpc::SimpleEventDisplayGUI",
this,
"exitRoot()");
232 mFrameExit->SetTextColor(200);
233 mFrameExit->SetToolTipText(
"Exit the ROOT process");
234 mFrameExit->MoveResize(10, currentY, xsize, (
unsigned int)ysize);
238 mFrameMain->MapSubwindows();
239 mFrameMain->MapWindow();
240 mFrameMain->SetWindowName(
"OM");
241 mFrameMain->MoveResize(50, 50, (
unsigned int)mainx, (
unsigned int)currentY + 20);
242 mFrameMain->Move(4 * 400 + 10, 10);
662 TH1*
h = getBinInfoXY(binx, biny, bincx, bincy);
670 int roc = mSelectedSector;
672 const std::string_view objectName(
o->GetName());
675 int row =
int(TMath::Floor(bincx));
680 if (objectName ==
"hMaxValsIROC" || objectName ==
"hOccupancyValsIROC") {
682 }
else if (objectName ==
"hMaxValsOROC" || objectName ==
"hOccupancyValsOROC") {
685 }
else if (objectName ==
"hPadTimeValsI") {
687 row =
h->GetUniqueID();
688 }
else if (objectName ==
"hPadTimeValsO") {
690 row =
h->GetUniqueID();
692 }
else if (objectName ==
"hSingleTB") {
694 const auto padPosSec = mapper.padPos(binx - 1);
695 pad = padPosSec.getPad();
696 row = padPosSec.getRow();
700 row -= mapper.getNumberOfRowsROC(0);
706 const int nPads = mapper.getNumberOfPadsInRowROC(
roc,
row);
708 const int cpad =
int(TMath::Floor(bincy));
709 pad = cpad + nPads / 2;
712 if (pad < 0 || pad >= (
int)nPads) {
715 if (row < 0 || row >= (
int)mapper.getNumberOfRowsROC(
roc)) {
721 const TString rocType = (
roc < 36) ?
"I" :
"O";
725 TH1*& hFFT = (
roc < 36) ? mHFFTI : mHFFTO;
727 TCanvas*
c = (TCanvas*)gROOT->GetListOfCanvases()->FindObject(
type);
728 TCanvas* cFFT = (TCanvas*)gROOT->GetListOfCanvases()->FindObject(Form(
"%sFFT",
type.Data()));
738 const bool init = (hFFT ==
nullptr);
739 const double maxTime = h2->GetNbinsX() * 200.e-6;
740 hFFT = h2->FFT(hFFT,
"MAG M");
743 const auto nbinsx = hFFT->GetNbinsX();
744 auto xax = hFFT->GetXaxis();
745 xax->SetRange(2, nbinsx / 2);
747 xax->Set(nbinsx, xax->GetXmin() / maxTime, xax->GetXmax() / maxTime);
748 hFFT->SetNameTitle(Form(
"hFFT_%sROC", rocType.Data()),
"FFT magnitude;frequency (kHz);amplitude");
750 hFFT->Scale(2. / (nbinsx - 1));
756 if (mCheckSingleTB) {
758 l.SetLineColor(kRed);
759 const auto timeBin = mSelTimeBin->GetNumberEntry()->GetIntNumber();
760 h = (TH1D*)gROOT->FindObject(fmt::format(
"PadSignals_{}ROC", rocType.Data()).
data());
762 l.DrawLine(timeBin + 0.5,
h->GetMinimum(), timeBin + 0.5,
h->GetMaximum());
765 if (mCheckPadTime && objectName.find(
"hPadTimeVals") == 0) {
767 l.SetLineColor(kMagenta);
768 const auto timeBin = bincx;
769 h = (TH1D*)gROOT->FindObject(fmt::format(
"PadSignals_{}ROC", rocType.Data()).
data());
771 l.DrawLine(timeBin + 0.5,
h->GetMinimum(), timeBin,
h->GetMaximum());
774 if (mCheckShowClusters->IsDown()) {
777 const auto padTimeValsName = fmt::format(
"PadTimeVals{}",
type[
type.Length() - 1]);
778 TCanvas* cPadTimeVals = (TCanvas*)gROOT->GetListOfCanvases()->FindObject(padTimeValsName.data());
780 h = (TH1D*)gROOT->FindObject((
"h" + padTimeValsName).data());
783 delete cPadTimeVals->GetListOfPrimitives()->FindObject(
"TLine");
785 l.SetLineColor(kRed);
786 const auto timeBin = mSelTimeBin->GetNumberEntry()->GetIntNumber();
787 l.DrawLine(timeBin + 0.5,
h->GetYaxis()->GetXmin(), timeBin + 0.5,
h->GetYaxis()->GetXmax());
790 update(Form(
"%s;%sFFT;PadTimeVals%s;SingleTB",
type.Data(),
type.Data(), rocType.Data()));