6 #include "Tofrec02_ihep.h"
10 m_logger->info(
"UBegin =============================================");
18 m_logger->info(
"Creating NAIA event tree");
22 m_logger->info(
"NAIA branches created");
26 static bool firstCall =
true;
28 m_logger->debug(
"Switching file in chain: {}",
m_tree->GetCurrentFile()->GetName());
36 return AMSEventR::Notify();
40 m_logger->debug(
"Called NtpSelector::ProcessFileInfo");
46 m_chain->m_fileInfo.FileName =
m_tree->GetCurrentFile()->GetName();
48 m_chain->m_fileInfo.Run = Run();
52 m_chain->m_fileInfo.UTCTime.first = fHeader.Time[0];
53 m_chain->m_fileInfo.UTCTime.second = fHeader.Time[0];
58 MCEventgR *primary = (nMCEventg() != 0) ? pMCEventg(0) :
nullptr;
59 m_chain->m_fileInfoMC.Charge = (primary) ? static_cast<int>(primary->Charge) : 0;
60 m_chain->m_fileInfoMC.Mass = (primary) ? primary->Mass : 0;
61 m_chain->m_fileInfoMC.MomentumRange.first = std::numeric_limits<float>::max();
62 m_chain->m_fileInfoMC.MomentumRange.second = 0;
63 auto *datacard =
m_tree->GetCurrentFile()->Get<TObjString>(
"DataCards");
65 m_logger->error(
"No Datacard Object available!");
67 m_chain->m_fileInfoMC.DatacardPID = NtpTools::GetDatacardValue<int>(datacard,
"PART");
68 m_chain->m_fileInfoMC.DatacardMomentumRange.first = NtpTools::GetDatacardValue<float>(datacard,
"PMIN");
69 m_chain->m_fileInfoMC.DatacardMomentumRange.second = NtpTools::GetDatacardValue<float>(datacard,
"PMAX");
70 m_chain->m_fileInfoMC.DatacardNGen = NtpTools::GetDatacardValue<unsigned int>(datacard,
"TRIG");
72 if (
m_chain->m_fileInfo.FileName.find(
".l1.") != std::string::npos) {
74 }
else if (
m_chain->m_fileInfo.FileName.find(
".l19.") != std::string::npos) {
76 }
else if (
m_chain->m_fileInfo.FileName.find(
".l1a9.") != std::string::npos) {
78 }
else if (
m_chain->m_fileInfo.FileName.find(
".tb.") != std::string::npos) {
86 m_chain->m_fileInfo.BadRunTag = getsetup()->IsBadRun(
m_chain->m_fileInfo.BadRunReason, UTime(), Run());
88 m_chain->m_fileInfo.BadRunTag = 2;
93 if (
m_chain->m_fileInfo.Run == 0) {
101 m_chain->m_fileInfo.UTCTime.second = fHeader.Time[0];
104 m_chain->m_fileInfoMC.EventNo.first = std::min(
Event(),
m_chain->m_fileInfoMC.EventNo.first);
105 m_chain->m_fileInfoMC.EventNo.second = std::max(
Event(),
m_chain->m_fileInfoMC.EventNo.second);
107 MCEventgR *primary = (nMCEventg() != 0) ? pMCEventg(0) :
nullptr;
108 float p = (primary) ? primary->Momentum : 0;
109 m_chain->m_fileInfoMC.MomentumRange.first = std::min(p,
m_chain->m_fileInfoMC.MomentumRange.first);
110 m_chain->m_fileInfoMC.MomentumRange.second = std::max(p,
m_chain->m_fileInfoMC.MomentumRange.second);
123 static bool got_it =
false;
125 m_logger->debug(
"UProcessCut - First event processed - Entry: {}, Run: {}, Event: {}", Entry(), Run(),
Event());
126 }
else if (Entry() % 10000 == 0) {
127 m_logger->debug(
"UProcessCut - Event processed - Entry: {}, Run: {}, Event: {}", Entry(), Run(),
Event());
131 m_logger->trace(
"Entry: {}", Entry());
136 if ((nDaqEvent() < 1) || (nLevel1() < 1)) {
143 static unsigned long lastSec = 0;
145 ParticleR *particle =
nullptr;
149 m_chain->m_event.mcTruthBase.Fill(
this);
150 m_chain->m_event.mcTruthPlus.Fill(
this);
155 m_chain->m_event.header.Fill(
this);
156 m_chain->m_event.evSummary.Fill(
this);
165 m_chain->m_rtiInfo.FillEventVariables();
174 lastSec =
m_chain->m_event.header.UTCTime;
180 m_chain->m_rtiInfo.AccumulateEventVariables(
this);
186 m_chain->m_event.daq.Fill(*pDaqEvent(0));
190 particle = pParticle(0);
194 if (particle->pBetaH()) {
200 m_chain->m_event.tofBase.Fill(particle->pBeta(), particle->pBetaH());
202 if (std::fabs(UTOFCharge - 1) < 0.5) {
204 }
else if (std::fabs(UTOFCharge - 2) < 0.5) {
206 }
else if (UTOFCharge > 2.5) {
213 m_chain->m_event.tofPlus.Fill(particle->pBeta(), particle->pBetaH());
216 if (particle->pTrTrack()) {
218 m_chain->m_event.mcTruthPlus.FillTrMCHit(particle->pTrTrack());
226 m_logger->trace(
"Track no. = {}", particle->iTrTrack());
233 m_chain->m_event.trTrackBase.Fill(particle->pTrTrack());
236 if (std::fabs(innerCharge - 1) < 0.5) {
238 }
else if (std::fabs(innerCharge - 2) < 0.5) {
240 }
else if (innerCharge > 2.5) {
247 m_chain->m_event.trTrackPlus.Fill(particle->pTrTrack());
254 auto trdK = std::make_unique<TrdKCluster>(
this, particle->pTrTrack(), 0);
259 m_chain->m_event.trdKBase.Fill(trdK.get(), particle->pTrTrack());
266 if (particle->pEcalShower()) {
271 m_chain->m_event.ecalBase.Fill(particle->pEcalShower());
276 m_chain->m_event.ecalPlus.Fill(particle->pEcalShower());
303 auto trdK = std::make_unique<TrdKCluster>();
313 m_chain->m_event.trdKBaseSt.Fill(trdK.get(),
nullptr);
318 if (particle->pRichRing()) {
323 m_chain->m_event.richBase.Fill(particle->pRichRing(), particle->pRichRingB());
328 m_chain->m_event.richPlus.Fill(
this, particle->pRichRing(), particle->pTrTrack());
336 m_chain->m_event.extHitBase.Fill(
this);
347 m_chain->m_event.trTrackBase.FillElectronVars(particle->pTrTrack(), refitKalman);
352 ? static_cast<float>(
m_chain->m_event.ecalBase.GetCOG().z())
353 : std::numeric_limits<float>::max();
354 m_chain->m_event.trTrackPlus.FillElectronVars(particle->pTrTrack(), zEcalCOG, refitKalman);
358 m_logger->trace(
"Event mask: {}", to_string_binary<32>(
m_chain->m_event.header.Mask()));
368 void NtpSelector::UProcessFill() {}
370 void NtpSelector::UTerminate() {
372 m_chain->FillFileInfo();
374 m_chain->m_rtiInfo.FillEventVariables();
377 m_logger->info(
"UTerminate =============================================");
382 m_outputFile->WriteTObject(&versionHeader,
"VersionHeader");
385 m_benchmark.Print(m_logger);
388 void NtpSelector::DefineStandAlone() {
389 m_betahStPtr =
nullptr;
396 double prev_tofcharge = 0;
398 auto oldOpt = TofRecH::BuildOpt;
399 TofRecH::BuildOpt = 3110;
400 m_logger->trace(
"Rebuilding Tof with opt {}", TofRecH::BuildOpt);
402 m_logger->trace(
"{} BetaH objects found", nBetaH());
405 for (BetaHR &betah :
BetaH()) {
406 auto tofGoodPatt = 1000 * betah.IsGoodQPathL(0) + 100 * betah.IsGoodQPathL(1) + 10 * betah.IsGoodQPathL(2) +
407 1 * betah.IsGoodQPathL(3);
408 float temp_tofcharge = betah.GetQ(nlayers, qrms, 2, TofClusterHR::DefaultQOptIon, tofGoodPatt);
409 if (temp_tofcharge <= 0)
412 m_logger->trace(
"StAl BetaH n. {} - Charge {} (Chi2C: {} - Chi2T: {})", ib, temp_tofcharge, betah.GetChi2C(),
414 if (temp_tofcharge > prev_tofcharge) {
415 m_betahStPtr = &betah;
416 prev_tofcharge = temp_tofcharge;
422 for (BetaHR &betah :
BetaH()) {
423 auto tofGoodPatt_h = 1000 * m_betahStPtr->IsGoodQPathL(0) + 100 * m_betahStPtr->IsGoodQPathL(1) +
424 10 * m_betahStPtr->IsGoodQPathL(2) + 1 * m_betahStPtr->IsGoodQPathL(3);
425 auto tofGoodPatt = 1000 * betah.IsGoodQPathL(0) + 100 * betah.IsGoodQPathL(1) + 10 * betah.IsGoodQPathL(2) +
426 1 * betah.IsGoodQPathL(3);
428 int high_charge = floor(m_betahStPtr->GetQ(nlayers, qrms, 2, TofClusterHR::DefaultQOptIon, tofGoodPatt_h) + 0.5);
429 int temp_charge = floor(betah.GetQ(nlayers, qrms, 2, TofClusterHR::DefaultQOptIon, tofGoodPatt) + 0.5);
431 if ((high_charge == temp_charge) && (betah.GetChi2C() < m_betahStPtr->GetChi2C())) {
432 m_betahStPtr = &betah;
437 m_logger->trace(
"Selected StAl BetaH: - Charge {} (Chi2C: {})",
438 m_betahStPtr->GetQ(nlayers, qrms, 2, TofClusterHR::DefaultQOptIon), m_betahStPtr->GetChi2C());
441 TofRecH::BuildOpt = oldOpt;
442 m_logger->trace(
"Rebuilding Tof with opt {}", TofRecH::BuildOpt);
Tof standalone data is available for this event.
This event is classified as charge 2 according to tof (1.5 < Q < 2.5)
TrTrack data is available for this event.
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
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.
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)
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)
std::enable_if< std::is_convertible< T, Key >::value, bool >::type ContainsKeys(const std::map< Key, Value > &container, T key)
particles shot towards Layer 1
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
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