18 #include <FairLogger.h>
19 #include <FairRootManager.h>
22 #include <Math/Point3D.h>
23 #include <TAttMarker.h>
26 #include <TClonesArray.h>
28 #include <TEveBoxSet.h>
30 #include <TEveManager.h>
31 #include <TEvePointSet.h>
32 #include <TEveTrans.h>
33 #include <TEveTreeTools.h>
44 #include <TPaletteAxis.h>
46 #include <TSeqCollection.h>
48 #include <TVirtualPad.h>
49 #include <TVirtualX.h>
62 constexpr
auto cRED =
"\033[1;31m";
65 constexpr
auto cGREEN =
"\033[1;32m";
72 : fHitColor(kPink), fHitSize(1), fHitStyle(kFullDotMedium), fHitSet(nullptr), fSaveTextData(false),
75 Char_t padhistname[256];
77 for (Int_t i = 0; i < 2015; i++) {
78 sprintf(padhistname,
"pad_%d", i);
79 fPadAll[i] =
new TH1I(padhistname, padhistname, 512, 0, 511);
82 Char_t phihistname[256];
84 for (Int_t i = 0; i < 5; i++) {
85 sprintf(phihistname,
"PhiDistr_%d", i);
86 fPhiDistr[i] =
new TH1D(phihistname, phihistname, 180.0, -180.0, 180.0);
98 fPhiDistr[i]->GetYaxis()->SetRangeUser(0., 20.);
106 new TF1(
"HoughLinearFit",
" ( (-TMath::Cos([0])/TMath::Sin([0]))*x ) + [1]/TMath::Sin([0])", 0, 500);
108 for (Int_t i = 0; i < 4; i++) {
110 new TF1(Form(
"HoughFit%i", i),
" ( (-TMath::Cos([0])/TMath::Sin([0]))*x ) + [1]/TMath::Sin([0])", 0, 120);
112 fFit[i] =
new TF1(Form(
"HoughFit%i", i),
"pol1", 0, 120);
113 fFit[i]->SetLineColor(kBlue);
128 std::cout <<
" ===== AtEventDrawTaskProto::Init =====" << std::endl;
131 FairRootManager *ioMan = FairRootManager::Instance();
137 gROOT->GetListOfSpecials()->Add(
fDetmap);
139 fHitArray =
dynamic_cast<TClonesArray *
>(
140 ioMan->GetObject(
"AtEventH"));
144 fRawEventArray =
dynamic_cast<TClonesArray *
>(ioMan->GetObject(
"AtRawEvent"));
150 fPatternEventArray =
dynamic_cast<TClonesArray *
>(ioMan->GetObject(
"AtPatternEvent"));
152 LOG(INFO) <<
cGREEN <<
"Pattern Event Array Found." <<
cNORMAL;
162 LOG(INFO) <<
cGREEN <<
"Prototype Event Analysis Array Found." <<
cNORMAL;
166 gStyle->SetPalette(55);
173 fCvsPadPlane->AddExec(
"ex",
"AtEventDrawTaskProto::SelectPad(\"fRawEvent\")");
198 std::cout <<
" AtEventDrawTaskProto::Init - End of initialization " << std::endl;
212 gEve->Redraw3D(kFALSE);
243 for (Int_t i = 0; i <
fLineNum; i++) {
264 fMesh->Reset(
nullptr);
266 fAuxChannel->Reset(
nullptr);
273 std::ofstream dumpEvent;
274 dumpEvent.open(
"event.dat");
276 std::vector<Double_t> fPosXMin;
277 std::vector<Double_t> fPosYMin;
278 std::vector<Double_t> fPosZMin;
284 if (event !=
nullptr) {
285 auto MeshArray =
event->
GetMesh();
286 Int_t eventID =
event->GetEventID();
287 nHits =
event->GetNumHits();
288 TString TSevt =
" Event ID : ";
289 TString TSpad =
" Pad ID : ";
290 dumpEvent << TSevt << eventID << std::endl;
301 for (Int_t i = 0; i < 512; i++) {
303 fMesh->SetBinContent(i, MeshArray[i]);
307 fHitSet =
new TEvePointSet(
"Hit", nHits, TEvePointSelectorConsumer::kTVT_XYZ);
312 std::cout <<
cYELLOW <<
" Number of hits : " << nHits <<
cNORMAL << std::endl;
317 fhitBoxSet->Reset(TEveBoxSet::kBT_AABox, kTRUE, 64);
319 for (Int_t iHit = 0; iHit < nHits; iHit++) {
321 AtHit hit = *
event->GetHits().at(iHit);
328 fHitSet->SetNextPoint(position.X() / 10., position.Y() / 10., position.Z() / 10.);
329 fHitSet->SetPointId(
new TNamed(Form(
"Hit %d", iHit),
""));
344 for (Int_t iHit = 0; iHit < nHits; iHit++) {
346 AtHit hit = *
event->GetHits().at(iHit);
351 Float_t HitBoxYDim = hit.
GetCharge() * 0.001;
352 Float_t HitBoxZDim = 0.05;
353 Float_t HitBoxXDim = 0.05;
355 fhitBoxSet->AddBox(position.X() / 10. - HitBoxXDim / 2.0, position.Y() / 10.,
356 position.Z() / 10. - HitBoxZDim / 2.0, HitBoxXDim, HitBoxYDim,
361 Float_t HitBoxYDim = hit.
GetCharge() * 0.0002;
362 Float_t HitBoxZDim = hit.
GetCharge() * 0.0002;
363 Float_t HitBoxXDim = hit.
GetCharge() * 0.0002;
365 fhitBoxSet->AddBox(position.X() / 10. - HitBoxXDim / 2.0, position.Y() / 10. - HitBoxYDim / 2.0,
366 position.Z() / 10. - HitBoxZDim / 2.0, HitBoxXDim, HitBoxYDim,
370 Float_t xrgb = 255, yrgb = 0, zrgb = 0;
374 TColor *hitBoxColor = gROOT->GetColor(cHit);
375 hitBoxColor->GetRGB(xrgb, yrgb, zrgb);
378 fhitBoxSet->DigitColor(xrgb * 255, yrgb * 255, zrgb * 255, 0);
380 dumpEvent << position.X() <<
" " << position.Y() <<
" " << position.Z() <<
" " << hit.
GetTimeStamp() <<
" "
387 TEveTrans &tHitBoxPos =
fhitBoxSet->RefMainTrans();
388 tHitBoxPos.SetPos(0.0, 0.0, 0.0);
398 gROOT->GetListOfSpecials()->Add(
fRawevent);
408 for (
int i = 0; i < 512; ++i)
414 std::cout <<
cYELLOW <<
"Warning: More auxiliary channels than expected (max 9)" <<
cNORMAL << std::endl;
424 std::cout <<
"Num of pads : " << nPads << std::endl;
426 for (Int_t iPad = 0; iPad < nPads; iPad++) {
432 if (fPad !=
nullptr) {
434 auto adc = fPad->
GetADC();
437 if (fPad->
GetValidPad() && PadNum_temp < 2015 && PadNum_temp > -1) {
439 for (Int_t j = 0; j < 512; j++) {
440 fPadAll[PadNum_temp]->SetBinContent(j, adc[j]);
458 std::vector<AtTrack> TrackCand;
464 if (patternEvent !=
nullptr) {
465 TrackCand = patternEvent->GetTrackCand();
470 std::cout <<
cRED <<
" Found " << TrackCand.size() <<
" track candidates " <<
cNORMAL << std::endl;
472 if (TrackCand.size() < 20) {
473 for (Int_t i = 0; i < TrackCand.size(); i++) {
475 AtTrack track = TrackCand.at(i);
477 int nHitsMin = trackHits.size();
479 fHitSetPR[i] =
new TEvePointSet(Form(
"HitPR_%d", i), nHitsMin, TEvePointSelectorConsumer::kTVT_XYZ);
484 for (
auto &trackHit : trackHits) {
485 auto position = trackHit.GetPosition();
486 fHitSetPR[i]->SetNextPoint(position.X() / 10., position.Y() / 10., position.Z() / 10.);
515 for (Int_t i = 0; i < 4; i++) {
521 std::vector<AtProtoQuadrant> quadrantArray;
527 for (Int_t iQ = 0; iQ < nQuads; iQ++) {
530 quadrantArray.push_back(protoevent->GetQuadrantArray()->at(iQ));
531 std::vector<Double_t> *PhiArray = quadrantArray[iQ].GetPhiArray();
533 for (
double pval : *PhiArray) {
540 for (Int_t j = 0; j < qNumHit; j++) {
545 Double_t radius = TMath::Sqrt(TMath::Power(position.X(), 2) + TMath::Power(position.Y(), 2));
563 fQKine[2]->Reset(
nullptr);
564 fQKine[3]->Reset(
nullptr);
568 std::vector<Double_t> *Par0 = protoeventAna->
GetPar0();
569 std::vector<Double_t> *Par1 = protoeventAna->GetPar1();
572 std::vector<std::vector<std::pair<Double_t, Double_t>>> *QELossHitPattern = protoeventAna->GetQELossHitPattern();
574 for (Int_t i = 0; i < QELossHitPattern->size(); i++) {
575 std::vector<std::pair<Double_t, Double_t>> ELossHitPattern = QELossHitPattern->at(i);
576 fFit[i]->SetParameter(0, Par0->at(i));
577 fFit[i]->SetParameter(1, Par1->at(i));
579 for (
auto HPbuffer : ELossHitPattern) {
580 Double_t radius = HPbuffer.second;
581 Double_t charge = HPbuffer.first;
586 std::vector<Double_t> *vertex = protoeventAna->GetVertex();
587 std::vector<Double_t> *KineAA = protoeventAna->GetAngleFit();
588 std::vector<Double_t> *Chi2 = protoeventAna->GetChi2();
589 std::vector<Int_t> *NDF = protoeventAna->GetNDF();
590 fQVertex[0]->Fill(vertex->at(0), vertex->at(2));
591 fQVertex[1]->Fill(vertex->at(1), vertex->at(3));
592 fQVertex[2]->Fill(vertex->at(0), vertex->at(2));
593 fQVertex[3]->Fill(vertex->at(1), vertex->at(3));
595 fQKine[0]->Fill(KineAA->at(0), KineAA->at(2));
596 fQKine[1]->Fill(KineAA->at(1), KineAA->at(3));
597 fQKine[2]->Fill(KineAA->at(0), KineAA->at(2));
598 fQKine[3]->Fill(KineAA->at(1), KineAA->at(3));
600 std::cout <<
cYELLOW <<
" ==================================================================== " << std::endl;
601 std::cout <<
" AtEventDrawTask : Fit Results " << std::endl;
602 std::cout <<
" - Quadrant 0 - Quadrant 1 - Quadrant 2 - Quadrant 3 " << std::endl;
603 std::cout <<
" Angle : " << KineAA->at(0) <<
" " << KineAA->at(1) <<
" " << KineAA->at(2)
604 <<
" " << KineAA->at(3) << std::endl;
605 std::cout <<
" Vertex : " << vertex->at(0) <<
" " << vertex->at(1) <<
" " << vertex->at(2)
606 <<
" " << vertex->at(3) << std::endl;
607 std::cout <<
" Chi2 : " << Chi2->at(0) <<
" " << Chi2->at(1) <<
" " << Chi2->at(2)
608 <<
" " << Chi2->at(3) << std::endl;
609 std::cout <<
" NDF : " << NDF->at(0) <<
" " << NDF->at(1) <<
" " << NDF->at(2)
610 <<
" " << NDF->at(3) << std::endl;
611 std::cout <<
" ==================================================================== " <<
cNORMAL << std::endl;
612 std::cout << std::endl;
620 fPadWave =
new TH1I(
"fPadWave",
"fPadWave", 512, 0, 511);
621 gROOT->GetListOfSpecials()->Add(
fPadWave);
642 gStyle->SetOptStat(0);
643 gStyle->SetPalette(103);
655 i->GetYaxis()->SetRangeUser(0, 2500);
672 fMesh =
new TH1F(
"Mesh",
"Mesh", 512, 0, 511);
681 for (Int_t i = 0; i < 4; i++) {
718 for (Int_t i = 0; i < 4; i++) {
743 for (Int_t i = 0; i < 4; i++) {
744 fQVertex[i] =
new TH2F(Form(
"Vertex_%i", i), Form(
"Vertex%i", i), 1000, 0, 1000, 1000, 0, 1000);
770 for (Int_t i = 0; i < 4; i++) {
771 fQKine[i] =
new TH2F(Form(
"Angle_Angle_Kinematics_%i", i), Form(
"Angle_Angle_Kinematics%i", i), 1000, 0, 180,
773 fQKine[i]->SetMarkerSize(1.2);
774 fQKine[i]->SetMarkerStyle(22);
776 fQKine[i]->SetMarkerColor(kRed);
778 fQKine[i]->SetMarkerColor(kRed);
779 fQKine[i]->SetMarkerStyle(20);
781 fQKine[i]->SetMarkerColor(kBlue);
783 fQKine[i]->SetMarkerColor(kBlue);
784 fQKine[i]->SetMarkerStyle(20);
799 for (Int_t i = 0; i < 9; i++) {
800 fAuxChannels[i] =
new TH1F(Form(
"Auxiliary_Channel_%i", i), Form(
"AuxChannel%i", i), 512, 0, 511);
878 TPad *Pad_1 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(1));
881 TPad *Pad_2 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(2));
884 TPad *Pad_3 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(3));
887 TPad *Pad_4 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(4));
890 TPad *Pad_5 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(5));
893 TPad *Pad_6 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(6));
896 TPad *Pad_7 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(7));
899 TPad *Pad_8 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(8));
902 TPad *Pad_9 =
dynamic_cast<TPad *
>(
fCvsAux->GetPad(9));
914 int event = gPad->GetEvent();
917 TObject *select = gPad->GetSelected();
920 if (select->InheritsFrom(TH2Poly::Class())) {
921 auto *h =
dynamic_cast<TH2Poly *
>(select);
922 gPad->GetCanvas()->FeedbackMode(kTRUE);
924 tRawEvent =
dynamic_cast<AtRawEvent *
>(gROOT->GetListOfSpecials()->FindObject(rawevt));
925 if (tRawEvent ==
nullptr) {
927 <<
" = AtEventDrawTaskProto::SelectPad NULL pointer for the AtRawEvent! Please select an event first "
932 int pyold = gPad->GetUniqueID();
933 int px = gPad->GetEventX();
934 int py = gPad->GetEventY();
935 float uxmin = gPad->GetUxmin();
936 float uxmax = gPad->GetUxmax();
937 int pxmin = gPad->XtoAbsPixel(uxmin);
938 int pxmax = gPad->XtoAbsPixel(uxmax);
940 gVirtualX->DrawLine(pxmin, pyold, pxmax, pyold);
941 gVirtualX->DrawLine(pxmin, py, pxmax, py);
942 gPad->SetUniqueID(py);
943 Float_t upx = gPad->AbsPixeltoX(px);
944 Float_t upy = gPad->AbsPixeltoY(py);
945 Double_t x = gPad->PadtoX(upx);
946 Double_t
y = gPad->PadtoY(upy);
947 Int_t bin = h->FindBin(x,
y);
948 const char *bin_name = h->GetBinName(bin);
951 std::cout <<
" ==========================" << std::endl;
952 std::cout <<
" Bin number selected : " << bin <<
" Bin name :" << bin_name << std::endl;
954 AtMap *tmap =
nullptr;
955 tmap =
dynamic_cast<AtMap *
>(gROOT->GetListOfSpecials()->FindObject(
"fMap"));
961 Int_t tPadNum = tmap->
BinToPad(bin);
963 std::cout <<
" Bin : " << bin <<
" to Pad : " << tPadNum << std::endl;
970 std::cout <<
" Event ID (Select Pad) : " << tRawEvent->
GetEventID() << std::endl;
971 std::cout <<
" Raw Event Pad Num " << tPad->
GetPadNum() << std::endl;
972 std::cout << std::endl;
976 TH1I *tPadWave =
nullptr;
977 tPadWave =
dynamic_cast<TH1I *
>(gROOT->GetListOfSpecials()->FindObject(
"fPadWave"));
979 auto adc = tPad->
GetADC();
980 if (tPadWave ==
nullptr) {
981 std::cout <<
" = AtEventDrawTask::SelectPad NULL pointer for the TH1I! Please select an event first "
987 for (Int_t i = 0; i < 512; i++) {
990 tPadWave->SetBinContent(i, adc[i]);
994 TCanvas *tCvsPadWave =
nullptr;
995 tCvsPadWave =
dynamic_cast<TCanvas *
>(gROOT->GetListOfSpecials()->FindObject(
"fCvsPadWave"));
996 if (tCvsPadWave ==
nullptr) {
997 std::cout <<
" = AtEventDrawTask::SelectPad NULL pointer for the TCanvas! Please select an event first "
1004 tCvsPadWave->Update();
1007 }
catch (
const std::exception &e) {
1009 std::cout <<
cRED <<
" Exception caught in Select Pad " << e.what() <<
cNORMAL <<
"\n";
1032 std::vector<EColor> colors = {kAzure, kOrange, kViolet, kTeal, kMagenta, kBlue, kViolet, kYellow, kCyan, kAzure};
1034 return colors.at(i);