13 #include "AtFindVertex.h"
24 #include <FairLogger.h>
25 #include <FairRootManager.h>
27 #include <Math/Point3D.h>
28 #include <TAttMarker.h>
31 #include <TClonesArray.h>
33 #include <TEveBoxSet.h>
34 #include <TEveElement.h>
36 #include <TEveManager.h>
37 #include <TEvePointSet.h>
38 #include <TEveRGBAPalette.h>
39 #include <TEveTrans.h>
40 #include <TEveTreeTools.h>
50 #include <TPaletteAxis.h>
53 #include <TSeqCollection.h>
55 #include <TVirtualPad.h>
56 #include <TVirtualX.h>
70 constexpr
auto cRED =
"\033[1;31m";
73 constexpr
auto cGREEN =
"\033[1;32m";
74 constexpr
auto cBLUE =
"\033[1;34m";
81 : fIs2DPlotRange(kFALSE), fUnpackHough(kFALSE), fEventArray(nullptr), fEventManager(nullptr), fRawevent(nullptr),
82 fDetmap(nullptr), fThreshold(0), fHitSet(nullptr), fCorrectedHitSet(nullptr), fhitBoxSet(nullptr),
83 fPadPlanePal(nullptr), fHitColor(kPink), fHitSize(1), fHitStyle(kFullDotMedium), fCvsPadPlane(nullptr),
84 fPadPlane(nullptr), fCvsPadWave(nullptr), fPadWave(nullptr), fCvsPadAll(nullptr), fCvsQEvent(nullptr),
85 fQEventHist(nullptr), fQEventHist_H(nullptr), fCvsHoughSpace(nullptr), fHoughSpace(nullptr),
86 fCvsRhoVariance(nullptr), fRhoVariance(nullptr), fCvsPhi(nullptr), fCvsMesh(nullptr), fMesh(nullptr),
87 fCvs3DHist(nullptr), f3DHist(nullptr), fCvsRad(nullptr), fRadVSTb(nullptr), fCvsTheta(nullptr), fTheta(nullptr),
88 fAtMapPtr(nullptr), fMinZ(0), fMaxZ(1344), fMinX(432), fMaxX(-432), f3DHitStyle(0), fMultiHit(0),
89 fSaveTextData(false), f3DThreshold(0), fRawEventBranchName(
"AtRawEvent"), fEventBranchName(
"AtEventH"),
90 fPatternEventBranchName(
"AtPatternEvent"), fVertexSize(1.5), fVertexStyle(kFullCircle), fCvsPID(nullptr),
91 fPID(nullptr), fCvsPID2(nullptr), fPID2(nullptr), fS800Calc(nullptr)
94 Char_t padhistname[256];
96 for (Int_t i = 0; i <
fNumPads; i++) {
97 sprintf(padhistname,
"pad_%d", i);
98 fPadAll[i] =
new TH1I(padhistname, padhistname, 512, 0, 511);
101 Char_t phihistname[256];
103 for (Int_t i = 0; i < 5; i++) {
104 sprintf(phihistname,
"PhiDistr_%d", i);
105 fPhiDistr[i] =
new TH1D(phihistname, phihistname, 180.0, -180.0, 180.0);
117 fPhiDistr[i]->GetYaxis()->SetRangeUser(0., 20.);
136 std::cout <<
" ===== AtEventDrawTask::Init =====" << std::endl;
139 FairRootManager *ioMan = FairRootManager::Instance();
143 LOG(fatal) <<
"Map was never set using the function SetMap() in AtEventDrawTask!";
148 gROOT->GetListOfSpecials()->Add(
fDetmap.get());
174 gStyle->SetPalette(55);
182 fCvsPadPlane->AddExec(
"ex",
"AtEventDrawTask::SelectPad(\"fRawEvent\")");
188 fCvsQEvent =
new TCanvas(
"fCvsQEvent",
"fCvsQEvent");
228 std::cout <<
" AtEventDrawTask::Init : Initialization complete! "
249 gEve->Redraw3D(kFALSE);
255 UpdateCvsRhoVariance();
262 UpdateCvsHoughSpace();
265 UpdateCvsThetaxPhi();
270 void AtEventDrawTask::DrawAuxChannels()
273 fAuxChannel->Reset(
nullptr);
278 gROOT->GetListOfSpecials()->Add(
fRawevent);
289 for (
int i = 0; i < 512; ++i)
295 std::cout <<
cYELLOW <<
"Warning: More auxiliary channels than expected (max 9)" <<
cNORMAL << std::endl;
299 void AtEventDrawTask::DrawRecoHits()
306 LOG(info) <<
"No pattern event";
318 std::vector<tracksFromVertex> tv;
319 tv = findVtx.GetTracksVertex();
321 for (
size_t i = 0; i < tv.size(); i++) {
322 fVertex.push_back(
new TEvePointSet(Form(
"Vertex_%zu", i), 0, TEvePointSelectorConsumer::kTVT_XYZ));
323 fVertex[i]->SetMarkerColor(kViolet);
326 fVertex[i]->SetNextPoint(tv.at(i).vertex.X() / 10., tv.at(i).vertex.Y() / 10., tv.at(i).vertex.Z() / 10.);
329 for (Int_t i = 0; i < TrackCand.size(); i++) {
331 Color_t trackColor = GetTrackColor(i) + 1;
334 AtTrack track = TrackCand.at(i);
338 fHitLine.back()->SetMainColor(trackColor);
347 fHitSetTFHC.push_back(
new TEvePointSet(Form(
"HitMC_%d", i), 0, TEvePointSelectorConsumer::kTVT_XYZ));
352 for (
auto &trackHit : trackHits) {
353 auto position = trackHit.GetPosition();
354 fHitSetTFHC[i]->SetNextPoint(position.X() / 10., position.Y() / 10., position.Z() / 10.);
359 fHitClusterSet.push_back(
new TEveBoxSet(Form(
"HitCluster_%d", i)));
364 if (hitClusters->size() > 0) {
366 for (
auto hitCluster : *hitClusters) {
367 auto clusPos = hitCluster.GetPosition();
368 double boxSize = 0.6;
370 fHitClusterSet[i]->AddBox(clusPos.X() / 10. - boxSize / 2.0, clusPos.Y() / 10. - boxSize / 2.0,
371 clusPos.Z() / 10. - boxSize / 2.0, boxSize, boxSize, boxSize);
381 tHitClusterBoxPos.SetPos(0.0, 0.0, 0.0);
386 fHitSetTFHC.push_back(
new TEvePointSet(
"HitsNoise", 0, TEvePointSelectorConsumer::kTVT_XYZ));
391 for (
auto &hit : patternEvent->GetNoiseHits()) {
392 auto position = hit->GetPosition();
393 fHitSetTFHC.back()->SetNextPoint(position.X() / 10., position.Y() / 10., position.Z() / 10.);
396 std::cout <<
cRED <<
" Found " << TrackCand.size() <<
" track candidates " <<
cNORMAL << std::endl;
399 gEve->AddElement(elem);
401 gEve->AddElement(elem);
403 gEve->AddElement(elem);
405 gEve->AddElement(elem);
408 void AtEventDrawTask::DrawHitPoints()
411 fMesh->Reset(
nullptr);
416 std::ofstream dumpEvent;
417 dumpEvent.open(
"event.dat");
423 Double_t RhoVariance =
event->GetRhoVariance();
424 auto MeshArray =
event->GetMesh();
425 Int_t eventID =
event->GetEventID();
426 TString TSevt =
" Event ID : ";
427 TString TSpad =
" Pad ID : ";
428 dumpEvent << TSevt << eventID << std::endl;
439 for (Int_t i = 0; i < 512; i++) {
441 fMesh->SetBinContent(i, MeshArray[i]);
450 fhitBoxSet->Reset(TEveBoxSet::kBT_AABox, kTRUE, 64);
452 Int_t nHits =
event->GetNumHits();
453 fHitSet =
new TEvePointSet(
"Hit", nHits, TEvePointSelectorConsumer::kTVT_XYZ);
458 std::cout <<
cBLUE <<
" Number of hits : " << nHits <<
cNORMAL << std::endl;
460 for (Int_t iHit = 0; iHit < nHits; iHit++) {
462 AtHit hit = *
event->GetHits().at(iHit);
464 Int_t PadMultHit =
event->GetHitPadMult(PadNumHit);
474 fHitSet->SetNextPoint(position.X() / 10., position.Y() / 10., position.Z() / 10.);
475 fHitSet->SetPointId(
new TNamed(Form(
"Hit %d", iHit),
""));
481 if (RawPad !=
nullptr) {
482 auto adc = RawPad->
GetADC();
483 for (Int_t i = 0; i < 512; i++) {
487 f3DHist->Fill(position.X() / 10., position.Y() / 10., i, adc[i]);
494 dumpEvent << position.X() <<
" " << position.Y() <<
" " << position.Z() <<
" " << hit.
GetTimeStamp() <<
" "
500 std::cout <<
"Adding corrected hits" << std::endl;
502 fCorrectedHitSet =
new TEvePointSet(
"Hit2", nHits, TEvePointSelectorConsumer::kTVT_XYZ);
508 for (Int_t iHit = 0; iHit < nHits; iHit++) {
509 if (eventCorr ==
nullptr) {
510 std::cout <<
"Corrected event was empty!" << std::endl;
513 AtHit hit = *eventCorr->GetHits().at(iHit);
517 fCorrectedHitSet->SetNextPoint(position.X() / 10., position.Y() / 10., position.Z() / 10.);
528 for (Int_t iHit = 0; iHit < nHits; iHit++) {
530 AtHit hit = *
event->GetHits().at(iHit);
535 Float_t HitBoxYDim = hit.
GetCharge() * 0.001;
536 Float_t HitBoxZDim = 0.05;
537 Float_t HitBoxXDim = 0.05;
540 fhitBoxSet->AddBox(position.X() / 10. - HitBoxXDim / 2.0, position.Y() / 10.,
541 position.Z() / 10. - HitBoxZDim / 2.0, HitBoxXDim, HitBoxYDim,
547 Float_t HitBoxYDim = hit.
GetCharge() * 0.0002;
548 Float_t HitBoxZDim = hit.
GetCharge() * 0.0002;
549 Float_t HitBoxXDim = hit.
GetCharge() * 0.0002;
552 fhitBoxSet->AddBox(position.X() / 10. - HitBoxXDim / 2.0, position.Y() / 10. - HitBoxYDim / 2.0,
553 position.Z() / 10. - HitBoxZDim / 2.0, HitBoxXDim, HitBoxYDim,
558 Float_t xrgb = 255, yrgb = 0, zrgb = 0;
562 TColor *hitBoxColor = gROOT->GetColor(cHit);
563 hitBoxColor->GetRGB(xrgb, yrgb, zrgb);
571 fhitBoxSet->DigitColor(xrgb * 255, yrgb * 255, zrgb * 255, 0);
577 TEveTrans &tHitBoxPos =
fhitBoxSet->RefMainTrans();
578 tHitBoxPos.SetPos(0.0, 0.0, 0.0);
584 std::cout <<
"Num of pads : " << nPads << std::endl;
588 std::cout <<
"Setting pads for Draw All Pads." << std::endl;
590 for (Int_t iPad = 0; iPad < nPads; iPad++) {
600 auto adc = fPad->
GetADC();
603 for (Int_t j = 0; j < 512; j++)
604 fPadAll[iPad]->SetBinContent(j, adc[j]);
621 void AtEventDrawTask::DrawS800()
680 void AtEventDrawTask::DrawPadPlane()
693 gStyle->SetOptStat(0);
694 gStyle->SetPalette(103);
698 void AtEventDrawTask::DrawPadWave()
700 fPadWave =
new TH1I(
"fPadWave",
"fPadWave", 512, 0, 511);
701 gROOT->GetListOfSpecials()->Add(
fPadWave);
706 void AtEventDrawTask::DrawPadAll()
711 std::cout <<
"Starting to draw pads" << std::endl;
713 i->GetYaxis()->SetRangeUser(0, 2500);
717 std::cout <<
"Finished drawing." << std::endl;
720 void AtEventDrawTask::DrawQEvent()
723 fQEventHist =
new TH1D(
"fQEventHist",
"fQEventHist", 300, 0., 2000000.);
724 fQEventHist_H =
new TH1D(
"fQEventHist_H",
"fQEventHist_H", 300, 0., 2000000.);
732 void AtEventDrawTask::DrawRhoVariance()
736 fRhoVariance =
new TH1D(
"fRhoVariance",
"fRhoVariance", 4000, 0., 1000000.);
741 void AtEventDrawTask::DrawHoughSpace()
744 fHoughSpace =
new TH2F(
"HistHoughXY",
"HistHoughXY", 100, 0, 3.15, 500, -1000, 1000);
748 void AtEventDrawTask::DrawPhiReco()
757 void AtEventDrawTask::DrawMesh()
761 fMesh =
new TH1F(
"Mesh",
"Mesh", 512, 0, 511);
765 void AtEventDrawTask::Draw3DHist()
769 f3DHist =
new TH3F(
"gl3DHist",
"gl3DHist", 50, -25.0, 25.0, 50, -25.0, 25.0, 50, 0, 512);
770 gStyle->SetPalette(55);
779 void AtEventDrawTask::DrawRad()
783 fRadVSTb =
new TH2F(
"RadVSTb",
"RadVSTb", 100, 0, 512, 100, 0, 250);
789 void AtEventDrawTask::DrawTheta()
794 fTheta =
new TH2F(
"Theta",
"Theta", 512, 0, 511, 500, 0, 2.0);
795 fTheta->SetMarkerStyle(22);
796 fTheta->SetMarkerColor(kRed);
801 void AtEventDrawTask::DrawThetaxPhi()
805 fThetaxPhi =
new TH2F(
"ThetaxPhi",
"ThetaxPhi", 512, 0, 511, 100, -1000, 1000);
809 fThetaxPhi_Ini_RANSAC =
new TH2F(
"ThetaxPhi_Ini_RANSAC",
"ThetaxPhi_Ini_RANSAC", 512, 0, 511, 100, -1000, 1000);
813 fThetaxPhi_Ini =
new TH2F(
"ThetaxPhi_Ini",
"ThetaxPhi_Ini", 512, 0, 511, 100, -1000, 1000);
823 void AtEventDrawTask::DrawMC()
836 fMC_XY->SetPoint(1, 0, 0);
837 fMC_XY->SetMarkerStyle(20);
838 fMC_XY->SetMarkerSize(1.0);
839 fMC_XY->SetMarkerColor(kRed);
859 fMC_ZX->SetPoint(1, 0, 0);
860 fMC_ZX->SetMarkerStyle(20);
861 fMC_ZX->SetMarkerSize(1.0);
862 fMC_ZX->SetMarkerColor(kRed);
866 fMC_ZY->SetPoint(1, 0, 0);
867 fMC_ZY->SetMarkerStyle(20);
868 fMC_ZY->SetMarkerSize(1.0);
869 fMC_ZY->SetMarkerColor(kBlack);
900 void AtEventDrawTask::DrawAux()
903 for (
int i = 0; i < 9; ++i) {
904 fAuxChannels[i] =
new TH1F(Form(
"AuxCh%i", i), Form(
"AuxChannel%i", i), 512, 0, 511);
910 void AtEventDrawTask::DrawPID()
915 fPID =
new TH2F(
"PID",
"PID", 200, -150, 50, 300, 150, 450);
919 void AtEventDrawTask::DrawPID2()
924 fPID2 =
new TH2F(
"PID2",
"PID2", 200, -150, 50, 300, 150, 450);
928 void AtEventDrawTask::UpdateCvsPID()
934 void AtEventDrawTask::UpdateCvsPID2()
940 void AtEventDrawTask::UpdateCvsAux()
943 TPad *Pad_1 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(1));
946 TPad *Pad_2 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(2));
949 TPad *Pad_3 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(3));
952 TPad *Pad_4 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(4));
955 TPad *Pad_5 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(5));
958 TPad *Pad_6 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(6));
961 TPad *Pad_7 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(7));
964 TPad *Pad_8 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(8));
967 TPad *Pad_9 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(9));
973 void AtEventDrawTask::UpdateCvsPadPlane()
995 void AtEventDrawTask::UpdateCvsPadWave()
1004 void AtEventDrawTask::UpdateCvsPadAll()
1013 void AtEventDrawTask::UpdateCvsQEvent()
1019 void AtEventDrawTask::UpdateCvsRhoVariance()
1025 void AtEventDrawTask::UpdateCvsHoughSpace()
1031 void AtEventDrawTask::UpdateCvsPhi()
1038 void AtEventDrawTask::UpdateCvsMesh()
1045 void AtEventDrawTask::UpdateCvs3DHist()
1052 void AtEventDrawTask::UpdateCvsRad()
1059 void AtEventDrawTask::UpdateCvsTheta()
1066 void AtEventDrawTask::UpdateCvsThetaxPhi()
1073 void AtEventDrawTask::UpdateCvsQuadrants()
1085 void AtEventDrawTask::UpdateCvsMC()
1087 fMC_XY_exp->GetXaxis()->SetRangeUser(-300.0, 300);
1088 fMC_XY_exp->GetYaxis()->SetRangeUser(-300.0, 300);
1089 fMC_XY->GetXaxis()->SetRangeUser(-300.0, 300);
1090 fMC_XY->GetYaxis()->SetRangeUser(-300.0, 300);
1091 fMC_XY_int->GetXaxis()->SetRangeUser(-300.0, 300);
1092 fMC_XY_int->GetYaxis()->SetRangeUser(-300.0, 300);
1093 fMC_XY_back->GetXaxis()->SetRangeUser(-300.0, 300);
1094 fMC_XY_back->GetYaxis()->SetRangeUser(-300.0, 300);
1098 fMC_ZX_int->GetXaxis()->SetRangeUser(0, 1000);
1099 fMC_ZX_int->GetYaxis()->SetRangeUser(-300.0, 300);
1100 fMC_ZY_int->GetXaxis()->SetRangeUser(0, 1000);
1101 fMC_ZY_int->GetYaxis()->SetRangeUser(-300.0, 300);
1102 fMC_ZX->GetXaxis()->SetRangeUser(0, 1000);
1103 fMC_ZX->GetYaxis()->SetRangeUser(-300.0, 300);
1104 fMC_ZY->GetXaxis()->SetRangeUser(0, 1000);
1105 fMC_ZY->GetYaxis()->SetRangeUser(-300.0, 300);
1107 fMC_ZX_back->GetYaxis()->SetRangeUser(-300.0, 300);
1109 fMC_ZY_back->GetYaxis()->SetRangeUser(-300.0, 300);
1141 int event = gPad->GetEvent();
1144 TObject *select = gPad->GetSelected();
1147 if (select->InheritsFrom(TH2Poly::Class())) {
1148 auto *h =
dynamic_cast<TH2Poly *
>(select);
1149 gPad->GetCanvas()->FeedbackMode(kTRUE);
1151 tRawEvent =
dynamic_cast<AtRawEvent *
>(gROOT->GetListOfSpecials()->FindObject(rawevt));
1152 if (tRawEvent ==
nullptr) {
1153 std::cout <<
" = AtEventDrawTask::SelectPad NULL pointer for the AtRawEvent! Please select an event first "
1158 int pyold = gPad->GetUniqueID();
1159 int px = gPad->GetEventX();
1160 int py = gPad->GetEventY();
1161 float uxmin = gPad->GetUxmin();
1162 float uxmax = gPad->GetUxmax();
1163 int pxmin = gPad->XtoAbsPixel(uxmin);
1164 int pxmax = gPad->XtoAbsPixel(uxmax);
1166 TVirtualX::Instance()->DrawLine(pxmin, pyold, pxmax, pyold);
1167 TVirtualX::Instance()->DrawLine(pxmin, py, pxmax, py);
1168 gPad->SetUniqueID(py);
1169 Float_t upx = gPad->AbsPixeltoX(px);
1170 Float_t upy = gPad->AbsPixeltoY(py);
1171 Double_t x = gPad->PadtoX(upx);
1172 Double_t
y = gPad->PadtoY(upy);
1173 Int_t bin = h->FindBin(x,
y);
1174 const char *bin_name = h->GetBinName(bin);
1177 std::cout <<
" ==========================" << std::endl;
1178 std::cout <<
" Bin number selected : " << bin <<
" Bin name :" << bin_name << std::endl;
1180 AtMap *tmap =
nullptr;
1181 tmap =
dynamic_cast<AtMap *
>(gROOT->GetListOfSpecials()->FindObject(
"fMap"));
1182 Int_t tPadNum = tmap->
BinToPad(bin);
1184 std::cout <<
" Bin : " << bin <<
" to Pad : " << tPadNum << std::endl;
1185 std::cout <<
" Electronic mapping: " << tmap->
GetPadRef(tPadNum) << std::endl;
1188 if (tPad ==
nullptr)
1191 std::cout <<
" Event ID (Select Pad) : " << tRawEvent->
GetEventID() << std::endl;
1192 std::cout <<
" Raw Event Pad Num " << tPad->
GetPadNum() << std::endl;
1193 std::cout << std::endl;
1195 TH1I *tPadWave =
nullptr;
1196 tPadWave =
dynamic_cast<TH1I *
>(gROOT->GetListOfSpecials()->FindObject(
"fPadWave"));
1198 auto adc = tPad->
GetADC();
1199 if (tPadWave ==
nullptr) {
1200 std::cout <<
" = AtEventDrawTask::SelectPad NULL pointer for the TH1I! Please enable SetPersistance for "
1201 "Unpacking task or select an event first "
1207 for (Int_t i = 0; i < 512; i++) {
1210 tPadWave->SetBinContent(i, adc[i]);
1214 TCanvas *tCvsPadWave =
nullptr;
1215 tCvsPadWave =
dynamic_cast<TCanvas *
>(gROOT->GetListOfSpecials()->FindObject(
"fCvsPadWave"));
1216 if (tCvsPadWave ==
nullptr) {
1217 std::cout <<
" = AtEventDrawTask::SelectPad NULL pointer for the TCanvas! Please select an event first "
1224 tCvsPadWave->Update();
1227 }
catch (
const std::exception &e) {
1229 std::cout <<
cRED <<
" Exception caught in Select Pad " << e.what() <<
cNORMAL <<
"\n";
1242 void AtEventDrawTask::ResetPadAll()
1249 void AtEventDrawTask::ResetPhiDistr()
1277 EColor AtEventDrawTask::GetTrackColor(
int i)
1279 std::vector<EColor> colors = {kAzure, kOrange, kViolet, kTeal, kMagenta, kBlue, kViolet, kYellow, kCyan, kAzure};
1281 return colors.at(i);