6 #include "Tofrec02_ihep.h"
12 m_logger->info(
"UBegin =============================================");
17 std::string output_file_option =
m_reprocess_rti ?
"update" :
"recreate";
21 m_logger->info(
"Creating NAIA event tree");
25 m_logger->info(
"NAIA branches created");
29 static bool firstCall =
true;
31 m_logger->debug(
"Switching file in chain: {}",
m_tree->GetCurrentFile()->GetName());
39 return AMSEventR::Notify();
43 m_logger->debug(
"Called NtpSelector::ProcessFileInfo");
49 m_chain->m_fileInfo.FileName =
m_tree->GetCurrentFile()->GetName();
51 m_chain->m_fileInfo.Run = Run();
55 m_chain->m_fileInfo.UTCTime.first = fHeader.Time[0];
56 m_chain->m_fileInfo.UTCTime.second = fHeader.Time[0];
61 MCEventgR *primary = (nMCEventg() != 0) ? pMCEventg(0) :
nullptr;
62 m_chain->m_fileInfoMC.Charge = (primary) ? static_cast<int>(primary->Charge) : 0;
63 m_chain->m_fileInfoMC.Mass = (primary) ? primary->Mass : 0;
64 m_chain->m_fileInfoMC.MomentumRange.first = std::numeric_limits<float>::max();
65 m_chain->m_fileInfoMC.MomentumRange.second = 0;
66 auto *datacard =
m_tree->GetCurrentFile()->Get<TObjString>(
"DataCards");
68 m_logger->error(
"No Datacard Object available!");
70 m_chain->m_fileInfoMC.DatacardPID = NtpTools::GetDatacardValue<int>(datacard,
"PART");
71 m_chain->m_fileInfoMC.DatacardMomentumRange.first = NtpTools::GetDatacardValue<float>(datacard,
"PMIN");
72 m_chain->m_fileInfoMC.DatacardMomentumRange.second = NtpTools::GetDatacardValue<float>(datacard,
"PMAX");
73 m_chain->m_fileInfoMC.DatacardNGen = NtpTools::GetDatacardValue<unsigned int>(datacard,
"TRIG");
75 if (
m_chain->m_fileInfo.FileName.find(
".l1.") != std::string::npos) {
77 }
else if (
m_chain->m_fileInfo.FileName.find(
".l19.") != std::string::npos) {
79 }
else if (
m_chain->m_fileInfo.FileName.find(
".l1a9.") != std::string::npos) {
81 }
else if (
m_chain->m_fileInfo.FileName.find(
".tb.") != std::string::npos) {
89 m_chain->m_fileInfo.BadRunTag = getsetup()->IsBadRun(
m_chain->m_fileInfo.BadRunReason, UTime(), Run());
91 m_chain->m_fileInfo.BadRunTag = 2;
97 Abort(
"Aborting TSelector Loop\n");
98 if (
m_chain->m_fileInfo.Run == 0) {
106 m_chain->m_fileInfo.UTCTime.second = fHeader.Time[0];
109 SetDefaultMCTuningParameters();
110 TRCLFFKEY.ClusterCofGOpt = 1;
111 TRFITFFKEY.Zshift = -1;
113 m_chain->m_fileInfoMC.EventNo.first = std::min(
Event(),
m_chain->m_fileInfoMC.EventNo.first);
114 m_chain->m_fileInfoMC.EventNo.second = std::max(
Event(),
m_chain->m_fileInfoMC.EventNo.second);
116 MCEventgR *primary = (nMCEventg() != 0) ? pMCEventg(0) :
nullptr;
117 float p = (primary) ? primary->Momentum : 0;
118 m_chain->m_fileInfoMC.MomentumRange.first = std::min(p,
m_chain->m_fileInfoMC.MomentumRange.first);
119 m_chain->m_fileInfoMC.MomentumRange.second = std::max(p,
m_chain->m_fileInfoMC.MomentumRange.second);
121 TrLinearEtaDB::SetLinearCluster();
122 TRFITFFKEY.Zshift = 2;
125 TRFITFFKEY.ErcHeY = 0;
138 static bool got_it =
false;
140 m_logger->debug(
"UProcessCut - First event processed - Entry: {}, Run: {}, Event: {}", Entry(), Run(),
Event());
141 }
else if (Entry() % 10000 == 0) {
142 m_logger->debug(
"UProcessCut - Event processed - Entry: {}, Run: {}, Event: {}", Entry(), Run(),
Event());
146 m_logger->trace(
"Entry: {}", Entry());
151 if ((nDaqEvent() < 1) || (nLevel1() < 1)) {
157 static unsigned long lastSec = 0;
159 ParticleR *particle =
nullptr;
163 m_chain->m_event.mcTruthBase.Fill(
this);
164 m_chain->m_event.mcTruthPlus.Fill(
this);
169 m_chain->m_event.header.Fill(
this);
170 m_chain->m_event.evSummary.Fill(
this);
179 m_chain->m_rtiInfo.FillEventVariables();
188 lastSec =
m_chain->m_event.header.UTCTime;
194 m_chain->m_rtiInfo.AccumulateEventVariables(
this);
204 m_chain->m_event.daq.Fill(*pDaqEvent(0));
208 particle = pParticle(0);
215 bool has_tof =
m_chain->m_event.tofBase.Fill(particle->pBeta(), particle->pBetaH());
220 if (std::fabs(UTOFCharge - 1) < 0.5) {
222 }
else if (std::fabs(UTOFCharge - 2) < 0.5) {
224 }
else if (UTOFCharge > 2.5) {
231 m_chain->m_event.tofPlus.Fill(particle->pBeta(), particle->pBetaH());
234 if (particle->pTrTrack()) {
236 m_chain->m_event.mcTruthPlus.FillTrMCHit(particle->pTrTrack());
242 m_logger->trace(
"Track no. = {}", particle->iTrTrack());
249 bool has_track =
m_chain->m_event.trTrackBase.Fill(particle->pTrTrack());
255 if (std::fabs(innerCharge - 1) < 0.5) {
257 }
else if (std::fabs(innerCharge - 2) < 0.5) {
259 }
else if (innerCharge > 2.5) {
266 m_chain->m_event.trTrackPlus.Fill(particle->pTrTrack());
269 if (NTrTrack() > 1) {
271 TrTrackR *second_track =
nullptr;
272 for (TrTrackR &track : TrTrack()) {
273 if (&track == particle->pTrTrack() || track.GetNhits() < 5) {
277 if (!second_track || second_track->GetRigidity() < track.GetRigidity()) {
278 second_track = &track;
283 m_chain->m_event.secondTrTrackBase.Fill(second_track, TrTrackFillType::SecondTrack);
289 m_chain->m_event.trTrackBaseSt.Fill(particle->pTrTrack(), TrTrackFillType::Standalone);
292 if (std::fabs(innerCharge_St - 1) < 0.5) {
294 }
else if (std::fabs(innerCharge_St - 2) < 0.5) {
296 }
else if (innerCharge_St > 2.5) {
306 auto trdK = std::make_unique<TrdKCluster>(
this, particle->pTrTrack(), 0);
317 bool has_trd =
m_chain->m_event.trdKBase.Fill(trdK.get(), particle->pTrTrack());
327 if (particle->pEcalShower()) {
331 bool has_ecal =
m_chain->m_event.ecalBase.Fill(particle->pEcalShower());
339 m_chain->m_event.ecalPlus.Fill(particle->pEcalShower());
343 if (particle->pRichRing()) {
347 bool has_rich =
m_chain->m_event.richBase.Fill(particle->pRichRing(), particle->pRichRingB());
355 m_chain->m_event.richPlus.Fill(
this, particle->pRichRing(), particle->pRichRingB(), particle->pTrTrack());
370 if (has_tof_standalone) {
375 if (std::fabs(UTOFCharge_St - 1) < 0.5) {
377 }
else if (std::fabs(UTOFCharge_St - 2) < 0.5) {
379 }
else if (UTOFCharge_St > 2.5) {
394 auto trdK = std::make_unique<TrdKCluster>();
396 m_logger->trace(
"Building standalone TRD from TrdTrack");
400 m_logger->trace(
"Building standalone TRD from BetaH");
413 bool has_trd_standalone =
m_chain->m_event.trdKBaseSt.Fill(trdK.get(),
nullptr);
414 if (has_trd_standalone) {
428 m_chain->m_event.extHitBase.Fill(
this, use_trd);
440 ? static_cast<float>(
m_chain->m_event.ecalBase.GetCOG().z())
441 : std::numeric_limits<float>::max();
442 m_chain->m_event.trTrackBase.FillElectronVars(particle->pTrTrack(), zEcalCOG, refitKalman);
446 m_chain->m_event.trTrackPlus.FillElectronVars(particle->pTrTrack(), refitKalman);
450 m_logger->trace(
"Event mask: {}", to_string_binary<32>(
m_chain->m_event.header.Mask()));
460 void NtpSelector::UProcessFill() {}
462 void NtpSelector::UTerminate() {
464 m_chain->FillFileInfo();
466 m_chain->m_rtiInfo.FillEventVariables();
469 m_logger->info(
"UTerminate =============================================");
474 if (m_reprocess_rti) {
475 m_logger->info(
"Overwriting RTIInfo tree");
476 m_chain->m_rti.tree->BuildIndex(
"RTIInfo.UTCTime");
477 m_outputFile->WriteTObject(m_chain->m_rti.tree,
"RTI",
"Overwrite");
479 m_logger->info(
"Writing chain to file");
480 NAIA::Version versionHeader;
481 m_outputFile->WriteTObject(&versionHeader,
"VersionHeader");
484 m_benchmark.Print(m_logger);
487 void NtpSelector::DefineStandAlone() {
488 m_betahStPtr =
nullptr;
489 m_trdTrackStPtr =
nullptr;
492 auto oldOpt = TofRecH::BuildOpt;
493 TofRecH::BuildOpt = 3110;
494 m_logger->trace(
"Rebuilding Tof with opt {}", TofRecH::BuildOpt);
496 m_logger->trace(
"{} BetaH objects found", nBetaH());
498 auto getMaxQBetaH = [
this](
bool matchTrd =
true) {
500 BetaHR *maxQBetaH =
nullptr;
506 double prev_tofcharge = 0;
508 for (BetaHR &betah :
BetaH()) {
510 float temp_tofcharge = betah.GetQ(nlayers, qrms);
511 if (temp_tofcharge <= 0)
515 if (!betah.pTrdTrack())
519 unsigned int nTrdHits{0};
520 for (
unsigned int i = 0; i < betah.pTrdTrack()->NTrdSegment(); ++i) {
521 nTrdHits += betah.pTrdTrack()->pTrdSegment(i)->NTrdCluster();
527 m_logger->trace(
"StAl BetaH n. {} - Charge {} (Chi2C: {} - Chi2T: {}) - TRD hits: {}", ib, temp_tofcharge,
528 betah.GetChi2C(), betah.GetChi2T(), nTrdHits);
530 m_logger->trace(
"StAl BetaH n. {} - Charge {} (Chi2C: {} - Chi2T: {})", ib, temp_tofcharge, betah.GetChi2C(),
534 if (temp_tofcharge > prev_tofcharge) {
536 prev_tofcharge = temp_tofcharge;
543 m_betahStPtr = getMaxQBetaH(
false);
544 m_trdTrackStPtr = m_betahStPtr ? m_betahStPtr->pTrdTrack() :
nullptr;
547 TofRecH::BuildOpt = oldOpt;
This event is classified as charge 1 according to tracker standalone (0.5 < Q < 1.5)
Tof standalone data is available for this event.
This event is classified as charge 1 according to tof standalone (0.5 < Q < 1.5)
This event is classified as charge 2 according to tof (1.5 < Q < 2.5)
TrTrack data is available for this event.
This event is classified as charge >2 according to tracker standalone (Q > 2.5)
Rich data is available for this event.
Stopwatch MakeStopwatch(std::string name)
This event is classified as charge >2 according to tof (Q > 2.5)
TRD standalone data is available for this event.
unsigned long long firstentry
first entry to be processed
TrdTrackR * m_trdTrackStPtr
This event is classified as charge 1 according to tracker (0.5 < Q < 1.5)
Charge estimated using the upper half of the TRD.
bool m_isMC
is simulation?
virtual void UBegin() override
Init output.
This event is classified as charge >2 according to tof standalone (Q > 2.5)
Ecal data is available for this event.
TRD data is available for this event.
std::enable_if< EnableBitMaskOperators< Enum >::enable, bool >::type MatchAllBits(const Enum test, const Enum ones, const Enum zeroes=static_cast< Enum >(0))
This event is classified as charge 1 according to tof (0.5 < Q < 1.5)
This event is classified as charge 2 according to tracker (1.5 < Q < 2.5)
This event is classified as charge 2 according to tracker standalone (1.5 < Q < 2.5)
std::shared_ptr< spdlog::logger > m_logger
std::unique_ptr< TFile > m_outputFile
Total deposited energy in Ecal.
virtual bool UProcessCut() override
Cut, select and prescale.
This event is classified as charge >2 according to tracker (Q > 2.5)
particles shot towards Layer 1
std::enable_if< std::is_convertible< Key, size_t >::value, bool >::type ContainsKeys(const std::array< T, N > &container, Key key)
virtual bool Notify() override
Called every time a new file is loaded in the chain.
std::string m_outputFilename
This event is classified as charge 2 according to tof standalone (1.5 < Q < 2.5)
Standard tracker charge reconstruction.
void DefineStandAlone()
Select standalone objects.
particles shot towards layer 1 and passing through layer 9
Tof data is available for this event.
std::unique_ptr< NAIAChain > m_chain
unsigned long long lastentry
last entry to be processed