23 #include <FairLogger.h>
24 #include <FairRootManager.h>
26 #include <Math/Point3D.h>
27 #include <TAttMarker.h>
30 #include <TClonesArray.h>
32 #include <TEveBoxSet.h>
34 #include <TEveManager.h>
35 #include <TEvePointSet.h>
36 #include <TEveTrans.h>
37 #include <TEveTreeTools.h>
47 #include <TPaletteAxis.h>
50 #include <TSeqCollection.h>
53 #include <TVirtualPad.h>
54 #include <TVirtualX.h>
66 constexpr
auto cRED =
"\033[1;31m";
69 constexpr
auto cGREEN =
"\033[1;32m";
70 constexpr
auto cBLUE =
"\033[1;34m";
77 : fIs2DPlotRange(kFALSE), fUnpackHough(kFALSE), fHitArray(nullptr),
81 fEventManager(nullptr), fRawevent(nullptr), fHoughSpaceArray(nullptr), fProtoEventArray(nullptr), fDetmap(nullptr),
82 fThreshold(0), fHitSet(nullptr),
85 fhitBoxSet(nullptr), fPadPlanePal(nullptr), fHitColor(kPink), fHitSize(1), fHitStyle(kFullDotMedium),
95 fCvsPadPlane(nullptr), fPadPlane(nullptr), fCvsPadWave(nullptr), fPadWave(nullptr), fCvsPadAll(nullptr),
96 fCvsQEvent(nullptr), fQEventHist(nullptr), fQEventHist_H(nullptr), fCvsHoughSpace(nullptr), fHoughSpace(nullptr),
97 fCvsRhoVariance(nullptr), fRhoVariance(nullptr), fCvsPhi(nullptr), fCvsMesh(nullptr), fMesh(nullptr),
98 fCvs3DHist(nullptr), f3DHist(nullptr), fCvsRad(nullptr), fRadVSTb(nullptr), fCvsTheta(nullptr), fTheta(nullptr),
99 fAtMapPtr(nullptr), fMinZ(0), fMaxZ(1344), fMinX(432), fMaxX(-432), f3DHitStyle(0), fMultiHit(0),
100 fSaveTextData(false), f3DThreshold(0), fRANSACAlg(0), fCvsLvsTheta(nullptr), fLvsTheta(nullptr), fCvsPID(nullptr),
101 fPID(nullptr), fCvsPID2(nullptr), fPID2(nullptr)
107 Char_t padhistname[256];
118 Char_t phihistname[256];
120 for (Int_t i = 0; i < 5; i++) {
121 sprintf(phihistname,
"PhiDistr_%d", i);
122 fPhiDistr[i] =
new TH1D(phihistname, phihistname, 180.0, -180.0, 180.0);
134 fPhiDistr[i]->GetYaxis()->SetRangeUser(0., 20.);
142 new TF1(
"HoughLinearFit",
" ( (-TMath::Cos([0])/TMath::Sin([0]))*x ) + [1]/TMath::Sin([0])", 0, 500);
165 std::cout <<
" ===== AtEventDrawTaskS800::Init =====" << std::endl;
166 std::cout <<
" ===== Current detector : " << option.Data() << std::endl;
168 FairRootManager *ioMan = FairRootManager::Instance();
171 if (option ==
"Prototype") {
182 gROOT->GetListOfSpecials()->Add(
fDetmap);
184 fHitArray =
dynamic_cast<TClonesArray *
>(
185 ioMan->GetObject(
"AtEventH"));
196 fHoughSpaceArray =
dynamic_cast<TClonesArray *
>(ioMan->GetObject(
"AtHough"));
200 fProtoEventArray =
dynamic_cast<TClonesArray *
>(ioMan->GetObject(
"AtProtoEvent"));
202 LOG(INFO) <<
cGREEN <<
"Prototype Event Array Found." <<
cNORMAL;
204 fRansacArray =
dynamic_cast<TClonesArray *
>(ioMan->GetObject(
"AtRansac"));
212 fPatternEventArray =
dynamic_cast<TClonesArray *
>(ioMan->GetObject(
"AtPatternEvent"));
214 LOG(INFO) <<
cGREEN <<
"Pattern Event Array Found." <<
cNORMAL;
218 LOG(INFO) <<
cGREEN <<
"Tracking Event Analysis Array Found." <<
cNORMAL;
229 gStyle->SetPalette(55);
300 gEve->Redraw3D(kFALSE);
327 Double_t x0_corr_tof = 0.;
328 Double_t afp_corr_tof = 0.;
329 Double_t afp_corr_dE = 0.;
330 Double_t x0_corr_dE = 0.;
331 Double_t rf_offset = 0.0;
332 Double_t corrGainE1up = 1;
333 Double_t corrGainE1down = 1;
334 Double_t ObjCorr1C1 = 100.;
335 Double_t ObjCorr1C2 = 0.021;
345 Int_t CondMTDCXfObj = 0;
348 Float_t S800_timeObjSelect = -999;
349 Float_t S800_timeXfSelect = -999;
350 Float_t ObjCorr = -999;
352 for (
float k : S800_timeMTDCXf) {
353 if (k > 140 && k < 230)
354 S800_timeXfSelect = k;
356 for (
float k : S800_timeMTDCObj) {
357 if (k > -115 && k < -20)
358 S800_timeObjSelect = k;
361 Double_t XfObj_tof = S800_timeXfSelect - S800_timeObjSelect;
362 if (S800_timeXfSelect != -999 && S800_timeObjSelect != -999) {
363 XfObj_tof = S800_timeXfSelect - S800_timeObjSelect;
379 Double_t S800_afp = atan((S800_x1 - S800_x0) / 1073.);
386 if (CondMTDCXfObj && std::isnan(S800_ICSum) == 0 && std::isnan(S800_afp) == 0 && std::isnan(S800_x0) == 0)
387 ObjCorr = S800_timeObjSelect + ObjCorr1C1 * S800_afp + ObjCorr1C2 * S800_x0;
392 fPID->Fill(ObjCorr, XfObj_tof);
394 fPID2->Fill(ObjCorr, S800_ICSum);
403 fMesh->Reset(
nullptr);
407 std::ofstream dumpEvent;
408 dumpEvent.open(
"event.dat");
410 std::vector<Double_t> fPosXMin;
411 std::vector<Double_t> fPosYMin;
412 std::vector<Double_t> fPosZMin;
419 auto MeshArray =
event->
GetMesh();
420 Int_t eventID =
event->GetEventID();
423 TString TSevt =
" Event ID : ";
424 TString TSpad =
" Pad ID : ";
425 dumpEvent << TSevt << eventID << std::endl;
436 for (Int_t i = 0; i < 512; i++) {
438 fMesh->SetBinContent(i, MeshArray[i]);
444 gROOT->GetListOfSpecials()->Add(
fRawevent);
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;
474 std::vector<AtTrack> TrackCand;
480 TrackCand = patternEvent->GetTrackCand();
484 if (TrackCand.size() < 10) {
485 for (Int_t i = 0; i < TrackCand.size(); i++) {
487 AtTrack track = TrackCand.at(i);
490 fHitSetTFHC[i] =
new TEvePointSet(Form(
"HitMC_%d", i), nHitsMin, TEvePointSelectorConsumer::kTVT_XYZ);
495 for (
auto &trackHit : trackHits) {
496 auto position = trackHit.GetPosition();
497 fHitSetTFHC[i]->SetNextPoint(position.X() / 10., position.Y() / 10., position.Z() / 10.);
510 std::cout <<
cRED <<
"Calling code for MC Minimization which is depricated!!!" << std::endl;
511 std::cout <<
cYELLOW <<
" ==== Tracking analysis ==== " << std::endl;
512 std::cout <<
" Number of analyzed tracks : " << anaTracks.size() << std::endl;
517 if (anaTracks.size() < 5) {
518 for (Int_t i = 0; i < anaTracks.size(); i++) {
519 AtTrack track = anaTracks.at(i);
520 std::cout << track << std::endl;
527 fHitSetMC[i] =
new TEvePointSet(Form(
"HitMC_%d", i), nHitsMin, TEvePointSelectorConsumer::kTVT_XYZ);
533 for (Int_t iHit = 0; iHit < fPosXMin.size(); iHit++)
534 fHitSetMC[i]->SetNextPoint(fPosXMin.at(iHit) / 10., fPosYMin.at(iHit) / 10., fPosZMin.at(iHit) / 10.);
540 std::cout <<
cRED <<
" Found " << TrackCand.size() <<
" track candidates " <<
cNORMAL << std::endl;
546 fhitBoxSet->Reset(TEveBoxSet::kBT_AABox, kTRUE, 64);
548 for (Int_t iHit = 0; iHit < nHits; iHit++) {
550 AtHit hit = *
event->GetHits().at(iHit);
552 Int_t PadMultHit =
event->GetHitPadMult(PadNumHit);
562 fHitSet->SetNextPoint(position.X() / 10., position.Y() / 10., position.Z() / 10.);
563 fHitSet->SetPointId(
new TNamed(Form(
"Hit %d", iHit),
""));
590 dumpEvent << position.X() <<
" " << position.Y() <<
" " << position.Z() <<
" " << hit.
GetTimeStamp() <<
" "
631 std::cout <<
cGREEN <<
" Number of simulated points " << fPosXMin.size() <<
cNORMAL << std::endl;
632 for (Int_t iHit = 0; iHit < fPosXMin.size(); iHit++) {
635 fHitSetMin->SetNextPoint(fPosXMin.at(iHit) / 10., fPosYMin.at(iHit) / 10.,
636 fPosZMin.at(iHit) / 10.);
647 for (Int_t iHit = 0; iHit < nHits; iHit++) {
649 AtHit hit = *
event->GetHits().at(iHit);
654 Float_t HitBoxYDim = hit.
GetCharge() * 0.001;
655 Float_t HitBoxZDim = 0.05;
656 Float_t HitBoxXDim = 0.05;
659 fhitBoxSet->AddBox(position.X() / 10. - HitBoxXDim / 2.0, position.Y() / 10.,
660 position.Z() / 10. - HitBoxZDim / 2.0, HitBoxXDim, HitBoxYDim,
666 Float_t HitBoxYDim = hit.
GetCharge() * 0.0002;
667 Float_t HitBoxZDim = hit.
GetCharge() * 0.0002;
668 Float_t HitBoxXDim = hit.
GetCharge() * 0.0002;
671 fhitBoxSet->AddBox(position.X() / 10. - HitBoxXDim / 2.0, position.Y() / 10. - HitBoxYDim / 2.0,
672 position.Z() / 10. - HitBoxZDim / 2.0, HitBoxXDim, HitBoxYDim,
677 Float_t xrgb = 255, yrgb = 0, zrgb = 0;
681 TColor *hitBoxColor = gROOT->GetColor(cHit);
682 hitBoxColor->GetRGB(xrgb, yrgb, zrgb);
690 fhitBoxSet->DigitColor(xrgb * 255, yrgb * 255, zrgb * 255, 0);
696 TEveTrans &tHitBoxPos =
fhitBoxSet->RefMainTrans();
697 tHitBoxPos.SetPos(0.0, 0.0, 0.0);
703 std::cout <<
"Num of pads : " << nPads << std::endl;
707 for (Int_t iPad = 0; iPad < nPads; iPad++) {
713 auto adc = fPad->
GetADC();
716 for (Int_t j = 0; j < 512; j++) {
721 fPadAll[iPad]->SetBinContent(j, adc[j]);
746 for (Int_t i = 0; i <
fLineNum; i++)
758 for (Int_t i = 0; i <
fLineNum; i++)
779 std::vector<AtProtoQuadrant> quadrant;
782 for (Int_t iQ = 0; iQ < nQuads; iQ++) {
785 quadrant.push_back(protoevent->GetQuadrantArray()->at(iQ));
786 std::vector<Double_t> *PhiArray = quadrant[iQ].GetPhiArray();
787 for (
double pval : *PhiArray) {
841 for (Int_t i = 0; i <
fLineNum; i++) {
852 for (Int_t i = 0; i <
fLineNum; i++) {
933 gStyle->SetOptStat(0);
934 gStyle->SetPalette(103);
964 fPadWave =
new TH1I(
"fPadWave",
"fPadWave", 512, 0, 511);
965 gROOT->GetListOfSpecials()->Add(
fPadWave);
976 for (Int_t i = 0; i < 300; i++) {
979 fPadAll[i]->GetYaxis()->SetRangeUser(0, 2500);
981 if (option ==
"Prototype") {
983 fPadAll[i]->SetLineColor(kPink - 3);
984 else if (i >= 64 && i < 127)
985 fPadAll[i]->SetLineColor(kGreen + 2);
986 else if (i >= 127 && i < 190)
987 fPadAll[i]->SetLineColor(kBlue + 1);
988 else if (i >= 190 && i < 253)
989 fPadAll[i]->SetLineColor(kOrange - 3);
1000 fQEventHist =
new TH1D(
"fQEventHist",
"fQEventHist", 300, 0., 2000000.);
1001 fQEventHist_H =
new TH1D(
"fQEventHist_H",
"fQEventHist_H", 300, 0., 2000000.);
1013 fRhoVariance =
new TH1D(
"fRhoVariance",
"fRhoVariance", 4000, 0., 1000000.);
1021 fHoughSpace =
new TH2F(
"HistHoughXY",
"HistHoughXY", 100, 0, 3.15, 500, -1000, 1000);
1029 fQuadrant1 =
new TH2F(
"fQuadrant1",
"fQuadrant1", 100, 0, 3.15, 500, -1000, 1000);
1032 fQuadrant2 =
new TH2F(
"fQuadrant2",
"fQuadrant2", 100, 0, 3.15, 500, -1000, 1000);
1035 fQuadrant3 =
new TH2F(
"fQuadrant3",
"fQuadrant3", 100, 0, 3.15, 500, -1000, 1000);
1038 fQuadrant4 =
new TH2F(
"fQuadrant4",
"fQuadrant4", 100, 0, 3.15, 500, -1000, 1000);
1056 fMesh =
new TH1F(
"Mesh",
"Mesh", 512, 0, 511);
1064 f3DHist =
new TH3F(
"gl3DHist",
"gl3DHist", 50, -25.0, 25.0, 50, -25.0, 25.0, 50, 0, 512);
1065 gStyle->SetPalette(55);
1078 fRadVSTb =
new TH2F(
"RadVSTb",
"RadVSTb", 100, 0, 512, 100, 0, 250);
1089 fTheta =
new TH2F(
"Theta",
"Theta", 512, 0, 511, 500, 0, 2.0);
1090 fTheta->SetMarkerStyle(22);
1091 fTheta->SetMarkerColor(kRed);
1100 fLvsTheta =
new TH2F(
"LvsTheta",
"LvsTheta", 180, 0, 180, 500, 0, 1030);
1111 fPID =
new TH2F(
"PID",
"PID", 500, -150, 50, 300, 230, 260);
1122 fPID2 =
new TH2F(
"PID2",
"PID2", 500, -150, 50, 1000, 1400, 2200);
1125 fPID2->Draw(
"colz");
1132 fThetaxPhi =
new TH2F(
"ThetaxPhi",
"ThetaxPhi", 512, 0, 511, 100, -1000, 1000);
1136 fThetaxPhi_Ini_RANSAC =
new TH2F(
"ThetaxPhi_Ini_RANSAC",
"ThetaxPhi_Ini_RANSAC", 512, 0, 511, 100, -1000, 1000);
1140 fThetaxPhi_Ini =
new TH2F(
"ThetaxPhi_Ini",
"ThetaxPhi_Ini", 512, 0, 511, 100, -1000, 1000);
1165 fMC_XY->SetPoint(1, 0, 0);
1166 fMC_XY->SetMarkerStyle(20);
1167 fMC_XY->SetMarkerSize(1.0);
1168 fMC_XY->SetMarkerColor(kRed);
1188 fMC_ZX->SetPoint(1, 0, 0);
1189 fMC_ZX->SetMarkerStyle(20);
1190 fMC_ZX->SetMarkerSize(1.0);
1191 fMC_ZX->SetMarkerColor(kRed);
1195 fMC_ZY->SetPoint(1, 0, 0);
1196 fMC_ZY->SetMarkerStyle(20);
1197 fMC_ZY->SetMarkerSize(1.0);
1198 fMC_ZY->SetMarkerColor(kBlack);
1365 fMC_XY_exp->GetXaxis()->SetRangeUser(-300.0, 300);
1366 fMC_XY_exp->GetYaxis()->SetRangeUser(-300.0, 300);
1367 fMC_XY->GetXaxis()->SetRangeUser(-300.0, 300);
1368 fMC_XY->GetYaxis()->SetRangeUser(-300.0, 300);
1369 fMC_XY_int->GetXaxis()->SetRangeUser(-300.0, 300);
1370 fMC_XY_int->GetYaxis()->SetRangeUser(-300.0, 300);
1371 fMC_XY_back->GetXaxis()->SetRangeUser(-300.0, 300);
1372 fMC_XY_back->GetYaxis()->SetRangeUser(-300.0, 300);
1376 fMC_ZX_int->GetXaxis()->SetRangeUser(0, 1000);
1377 fMC_ZX_int->GetYaxis()->SetRangeUser(-300.0, 300);
1378 fMC_ZY_int->GetXaxis()->SetRangeUser(0, 1000);
1379 fMC_ZY_int->GetYaxis()->SetRangeUser(-300.0, 300);
1380 fMC_ZX->GetXaxis()->SetRangeUser(0, 1000);
1381 fMC_ZX->GetYaxis()->SetRangeUser(-300.0, 300);
1382 fMC_ZY->GetXaxis()->SetRangeUser(0, 1000);
1383 fMC_ZY->GetYaxis()->SetRangeUser(-300.0, 300);
1385 fMC_ZX_back->GetYaxis()->SetRangeUser(-300.0, 300);
1387 fMC_ZY_back->GetYaxis()->SetRangeUser(-300.0, 300);
1417 int event = gPad->GetEvent();
1420 TObject *select = gPad->GetSelected();
1423 if (select->InheritsFrom(TH2Poly::Class())) {
1424 auto *h =
dynamic_cast<TH2Poly *
>(select);
1425 gPad->GetCanvas()->FeedbackMode(kTRUE);
1427 tRawEvent =
dynamic_cast<AtRawEvent *
>(gROOT->GetListOfSpecials()->FindObject(rawevt));
1428 if (tRawEvent ==
nullptr) {
1429 std::cout <<
" = AtEventDrawTaskS800::SelectPad NULL pointer for the AtRawEvent! Please select an event first "
1434 int pyold = gPad->GetUniqueID();
1435 int px = gPad->GetEventX();
1436 int py = gPad->GetEventY();
1437 float uxmin = gPad->GetUxmin();
1438 float uxmax = gPad->GetUxmax();
1439 int pxmin = gPad->XtoAbsPixel(uxmin);
1440 int pxmax = gPad->XtoAbsPixel(uxmax);
1442 TVirtualX::Instance()->DrawLine(pxmin, pyold, pxmax, pyold);
1443 TVirtualX::Instance()->DrawLine(pxmin, py, pxmax, py);
1444 gPad->SetUniqueID(py);
1445 Float_t upx = gPad->AbsPixeltoX(px);
1446 Float_t upy = gPad->AbsPixeltoY(py);
1447 Double_t x = gPad->PadtoX(upx);
1448 Double_t
y = gPad->PadtoY(upy);
1449 Int_t bin = h->FindBin(x,
y);
1450 const char *bin_name = h->GetBinName(bin);
1453 std::cout <<
" ==========================" << std::endl;
1454 std::cout <<
" Bin number selected : " << bin <<
" Bin name :" << bin_name << std::endl;
1456 AtMap *tmap =
nullptr;
1457 tmap =
dynamic_cast<AtMap *
>(gROOT->GetListOfSpecials()->FindObject(
"fMap"));
1461 Int_t tPadNum = tmap->
BinToPad(bin);
1462 std::cout <<
" Bin : " << bin <<
" to Pad : " << tPadNum << std::endl;
1464 if (tPad ==
nullptr)
1467 std::cout <<
" Event ID (Select Pad) : " << tRawEvent->
GetEventID() << std::endl;
1468 std::cout <<
" Raw Event Pad Num " << tPad->
GetPadNum() << std::endl;
1469 std::cout << std::endl;
1473 TH1I *tPadWave =
nullptr;
1474 tPadWave =
dynamic_cast<TH1I *
>(gROOT->GetListOfSpecials()->FindObject(
"fPadWave"));
1476 auto adc = tPad->
GetADC();
1477 if (tPadWave ==
nullptr) {
1478 std::cout <<
" = AtEventDrawTaskS800::SelectPad NULL pointer for the TH1I! Please enable SetPersistance for "
1479 "Unpacking task or select an event first "
1485 for (Int_t i = 0; i < 512; i++) {
1488 tPadWave->SetBinContent(i, adc[i]);
1492 TCanvas *tCvsPadWave =
nullptr;
1493 tCvsPadWave =
dynamic_cast<TCanvas *
>(gROOT->GetListOfSpecials()->FindObject(
"fCvsPadWave"));
1494 if (tCvsPadWave ==
nullptr) {
1495 std::cout <<
" = AtEventDrawTaskS800::SelectPad NULL pointer for the TCanvas! Please select an event first "
1502 tCvsPadWave->Update();
1556 x = (p[0] + p[1] * t) / 10.0;
1557 y = (p[2] + p[3] * t) / 10.0;
1566 x = (p[0] + p[1] * t) / 10.0;
1567 y = (p[2] + p[3] * t) / 10.0;
1568 z = (p[4] + p[5] * t) / 10.0;
1573 std::vector<EColor> colors = {kAzure, kOrange, kViolet, kTeal, kMagenta, kBlue, kViolet, kYellow, kCyan, kAzure};
1575 return colors.at(i);