6 #include "Tofrec02_ihep.h"
12 m_logger->info(
"UBegin =============================================");
20 m_logger->info(
"Creating NAIA event tree");
24 m_logger->info(
"NAIA branches created");
28 static bool firstCall =
true;
30 m_logger->debug(
"Switching file in chain: {}",
m_tree->GetCurrentFile()->GetName());
38 return AMSEventR::Notify();
42 m_logger->debug(
"Called NtpSelector::ProcessFileInfo");
48 m_chain->m_fileInfo.FileName =
m_tree->GetCurrentFile()->GetName();
50 m_chain->m_fileInfo.Run = Run();
54 m_chain->m_fileInfo.UTCTime.first = fHeader.Time[0];
55 m_chain->m_fileInfo.UTCTime.second = fHeader.Time[0];
60 MCEventgR *primary = (nMCEventg() != 0) ? pMCEventg(0) :
nullptr;
61 m_chain->m_fileInfoMC.Charge = (primary) ? static_cast<int>(primary->Charge) : 0;
62 m_chain->m_fileInfoMC.Mass = (primary) ? primary->Mass : 0;
63 m_chain->m_fileInfoMC.MomentumRange.first = std::numeric_limits<float>::max();
64 m_chain->m_fileInfoMC.MomentumRange.second = 0;
65 auto *datacard =
m_tree->GetCurrentFile()->Get<TObjString>(
"DataCards");
67 m_logger->error(
"No Datacard Object available!");
69 m_chain->m_fileInfoMC.DatacardPID = NtpTools::GetDatacardValue<int>(datacard,
"PART");
70 m_chain->m_fileInfoMC.DatacardMomentumRange.first = NtpTools::GetDatacardValue<float>(datacard,
"PMIN");
71 m_chain->m_fileInfoMC.DatacardMomentumRange.second = NtpTools::GetDatacardValue<float>(datacard,
"PMAX");
72 m_chain->m_fileInfoMC.DatacardNGen = NtpTools::GetDatacardValue<unsigned int>(datacard,
"TRIG");
74 if (
m_chain->m_fileInfo.FileName.find(
".l1.") != std::string::npos) {
76 }
else if (
m_chain->m_fileInfo.FileName.find(
".l19.") != std::string::npos) {
78 }
else if (
m_chain->m_fileInfo.FileName.find(
".l1a9.") != std::string::npos) {
80 }
else if (
m_chain->m_fileInfo.FileName.find(
".tb.") != std::string::npos) {
88 m_chain->m_fileInfo.BadRunTag = getsetup()->IsBadRun(
m_chain->m_fileInfo.BadRunReason, UTime(), Run());
90 m_chain->m_fileInfo.BadRunTag = 2;
96 Abort(
"Aborting TSelector Loop\n");
97 if (
m_chain->m_fileInfo.Run == 0) {
105 m_chain->m_fileInfo.UTCTime.second = fHeader.Time[0];
108 SetDefaultMCTuningParameters();
109 TRCLFFKEY.ClusterCofGOpt = 1;
110 TRFITFFKEY.Zshift = -1;
112 m_chain->m_fileInfoMC.EventNo.first = std::min(
Event(),
m_chain->m_fileInfoMC.EventNo.first);
113 m_chain->m_fileInfoMC.EventNo.second = std::max(
Event(),
m_chain->m_fileInfoMC.EventNo.second);
115 MCEventgR *primary = (nMCEventg() != 0) ? pMCEventg(0) :
nullptr;
116 float p = (primary) ? primary->Momentum : 0;
117 m_chain->m_fileInfoMC.MomentumRange.first = std::min(p,
m_chain->m_fileInfoMC.MomentumRange.first);
118 m_chain->m_fileInfoMC.MomentumRange.second = std::max(p,
m_chain->m_fileInfoMC.MomentumRange.second);
120 TrLinearEtaDB::SetLinearCluster();
121 TRFITFFKEY.Zshift = 2;
124 TRFITFFKEY.ErcHeY = 0;
136 static bool got_it =
false;
138 m_logger->debug(
"UProcessCut - First event processed - Entry: {}, Run: {}, Event: {}", Entry(), Run(),
Event());
139 }
else if (Entry() % 10000 == 0) {
140 m_logger->debug(
"UProcessCut - Event processed - Entry: {}, Run: {}, Event: {}", Entry(), Run(),
Event());
144 m_logger->trace(
"Entry: {}", Entry());
149 if ((nDaqEvent() < 1) || (nLevel1() < 1)) {
155 static unsigned long lastSec = 0;
157 ParticleR *particle =
nullptr;
161 m_chain->m_event.mcTruthBase.Fill(
this);
162 m_chain->m_event.mcTruthPlus.Fill(
this);
167 m_chain->m_event.header.Fill(
this);
168 m_chain->m_event.evSummary.Fill(
this);
177 m_chain->m_rtiInfo.FillEventVariables();
186 lastSec =
m_chain->m_event.header.UTCTime;
192 m_chain->m_rtiInfo.AccumulateEventVariables(
this);
198 m_chain->m_event.daq.Fill(*pDaqEvent(0));
202 particle = pParticle(0);
209 bool has_tof =
m_chain->m_event.tofBase.Fill(particle->pBeta(), particle->pBetaH());
214 if (std::fabs(UTOFCharge - 1) < 0.5) {
216 }
else if (std::fabs(UTOFCharge - 2) < 0.5) {
218 }
else if (UTOFCharge > 2.5) {
225 m_chain->m_event.tofPlus.Fill(particle->pBeta(), particle->pBetaH());
228 if (particle->pTrTrack()) {
230 m_chain->m_event.mcTruthPlus.FillTrMCHit(particle->pTrTrack());
236 m_logger->trace(
"Track no. = {}", particle->iTrTrack());
243 bool has_track =
m_chain->m_event.trTrackBase.Fill(particle->pTrTrack());
249 if (std::fabs(innerCharge - 1) < 0.5) {
251 }
else if (std::fabs(innerCharge - 2) < 0.5) {
253 }
else if (innerCharge > 2.5) {
260 m_chain->m_event.trTrackPlus.Fill(particle->pTrTrack());
263 if (NTrTrack() > 1) {
265 TrTrackR *second_track =
nullptr;
266 for (TrTrackR &track : TrTrack()) {
267 if (&track == particle->pTrTrack() || track.GetNhits() < 5) {
271 if (!second_track || second_track->GetRigidity() < track.GetRigidity()) {
272 second_track = &track;
277 m_chain->m_event.secondTrTrackBase.Fill(second_track, TrTrackFillType::SecondTrack);
283 m_chain->m_event.trTrackBaseSt.Fill(particle->pTrTrack(), TrTrackFillType::Standalone);
286 if (std::fabs(innerCharge_St - 1) < 0.5) {
288 }
else if (std::fabs(innerCharge_St - 2) < 0.5) {
290 }
else if (innerCharge_St > 2.5) {
300 auto trdK = std::make_unique<TrdKCluster>(
this, particle->pTrTrack(), 0);
311 bool has_trd =
m_chain->m_event.trdKBase.Fill(trdK.get(), particle->pTrTrack());
321 if (particle->pEcalShower()) {
325 bool has_ecal =
m_chain->m_event.ecalBase.Fill(particle->pEcalShower());
333 m_chain->m_event.ecalPlus.Fill(particle->pEcalShower());
337 if (particle->pRichRing()) {
341 bool has_rich =
m_chain->m_event.richBase.Fill(particle->pRichRing(), particle->pRichRingB());
349 m_chain->m_event.richPlus.Fill(
this, particle->pRichRing(), particle->pRichRingB(), particle->pTrTrack());
364 if (has_tof_standalone) {
369 if (std::fabs(UTOFCharge_St - 1) < 0.5) {
371 }
else if (std::fabs(UTOFCharge_St - 2) < 0.5) {
373 }
else if (UTOFCharge_St > 2.5) {
388 auto trdK = std::make_unique<TrdKCluster>();
390 m_logger->trace(
"Building standalone TRD from TrdTrack");
394 m_logger->trace(
"Building standalone TRD from BetaH");
407 bool has_trd_standalone =
m_chain->m_event.trdKBaseSt.Fill(trdK.get(),
nullptr);
408 if (has_trd_standalone) {
422 m_chain->m_event.extHitBase.Fill(
this, use_trd);
434 ? static_cast<float>(
m_chain->m_event.ecalBase.GetCOG().z())
435 : std::numeric_limits<float>::max();
436 m_chain->m_event.trTrackBase.FillElectronVars(particle->pTrTrack(), zEcalCOG, refitKalman);
440 m_chain->m_event.trTrackPlus.FillElectronVars(particle->pTrTrack(), refitKalman);
444 m_logger->trace(
"Event mask: {}", to_string_binary<32>(
m_chain->m_event.header.Mask()));
454 void NtpSelector::UProcessFill() {}
456 void NtpSelector::UTerminate() {
458 m_chain->FillFileInfo();
460 m_chain->m_rtiInfo.FillEventVariables();
463 m_logger->info(
"UTerminate =============================================");
468 m_outputFile->WriteTObject(&versionHeader,
"VersionHeader");
471 m_benchmark.Print(m_logger);
474 void NtpSelector::DefineStandAlone() {
475 m_betahStPtr =
nullptr;
476 m_trdTrackStPtr =
nullptr;
479 auto oldOpt = TofRecH::BuildOpt;
480 TofRecH::BuildOpt = 3110;
481 m_logger->trace(
"Rebuilding Tof with opt {}", TofRecH::BuildOpt);
483 m_logger->trace(
"{} BetaH objects found", nBetaH());
485 auto getMaxQBetaH = [
this](
bool matchTrd =
true) {
487 BetaHR *maxQBetaH =
nullptr;
493 double prev_tofcharge = 0;
495 for (BetaHR &betah :
BetaH()) {
497 float temp_tofcharge = betah.GetQ(nlayers, qrms);
498 if (temp_tofcharge <= 0)
502 if (!betah.pTrdTrack())
506 unsigned int nTrdHits{0};
507 for (
unsigned int i = 0; i < betah.pTrdTrack()->NTrdSegment(); ++i) {
508 nTrdHits += betah.pTrdTrack()->pTrdSegment(i)->NTrdCluster();
514 m_logger->trace(
"StAl BetaH n. {} - Charge {} (Chi2C: {} - Chi2T: {}) - TRD hits: {}", ib, temp_tofcharge,
515 betah.GetChi2C(), betah.GetChi2T(), nTrdHits);
517 m_logger->trace(
"StAl BetaH n. {} - Charge {} (Chi2C: {} - Chi2T: {})", ib, temp_tofcharge, betah.GetChi2C(),
521 if (temp_tofcharge > prev_tofcharge) {
523 prev_tofcharge = temp_tofcharge;
530 m_betahStPtr = getMaxQBetaH(
false);
531 m_trdTrackStPtr = m_betahStPtr ? m_betahStPtr->pTrdTrack() :
nullptr;
534 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)
Container class for versioning info.
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.
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)
std::enable_if< EnableBitMaskOperators< Enum >::enable, bool >::type MatchAllBits(const Enum test, const Enum ones, const Enum zeroes=static_cast< Enum >(0))
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