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");
31 m_logger->info(
"NAIA branches created");
35 static bool firstCall =
true;
37 m_logger->debug(
"Switching file in chain: {}",
m_tree->GetCurrentFile()->GetName());
45 return AMSEventR::Notify();
49 m_logger->debug(
"Called NtpSelector::ProcessFileInfo");
55 m_chain->m_fileInfo.FileName =
m_tree->GetCurrentFile()->GetName();
57 m_chain->m_fileInfo.Run = Run();
61 m_chain->m_fileInfo.UTCTime.first = fHeader.Time[0];
62 m_chain->m_fileInfo.UTCTime.second = fHeader.Time[0];
67 MCEventgR *primary = (nMCEventg() != 0) ? pMCEventg(0) :
nullptr;
68 m_chain->m_fileInfoMC.Charge = (primary) ?
static_cast<int>(primary->Charge) : 0;
69 m_chain->m_fileInfoMC.Mass = (primary) ? primary->Mass : 0;
70 m_chain->m_fileInfoMC.MomentumRange.first = std::numeric_limits<float>::max();
71 m_chain->m_fileInfoMC.MomentumRange.second = 0;
72 auto *datacard =
m_tree->GetCurrentFile()->Get<TObjString>(
"DataCards");
74 m_logger->error(
"No Datacard Object available!");
76 m_chain->m_fileInfoMC.DatacardPID = NtpTools::GetDatacardValue<int>(datacard,
"PART");
77 m_chain->m_fileInfoMC.DatacardMomentumRange.first = NtpTools::GetDatacardValue<float>(datacard,
"PMIN");
78 m_chain->m_fileInfoMC.DatacardMomentumRange.second = NtpTools::GetDatacardValue<float>(datacard,
"PMAX");
79 m_chain->m_fileInfoMC.DatacardNGen = NtpTools::GetDatacardValue<unsigned int>(datacard,
"TRIG");
81 if (
m_chain->m_fileInfo.FileName.find(
".l1.") != std::string::npos) {
83 }
else if (
m_chain->m_fileInfo.FileName.find(
".l19.") != std::string::npos) {
85 }
else if (
m_chain->m_fileInfo.FileName.find(
".l1a9.") != std::string::npos) {
87 }
else if (
m_chain->m_fileInfo.FileName.find(
".tb.") != std::string::npos) {
95 m_chain->m_fileInfo.BadRunTag = getsetup()->IsBadRun(
m_chain->m_fileInfo.BadRunReason, UTime(), Run());
97 m_chain->m_fileInfo.BadRunTag = 2;
103 Abort(
"Aborting TSelector Loop\n");
104 if (
m_chain->m_fileInfo.Run == 0) {
112 m_chain->m_fileInfo.UTCTime.second = fHeader.Time[0];
115 SetDefaultMCTuningParameters();
116 TRCLFFKEY.ClusterCofGOpt = 1;
117 TRFITFFKEY.Zshift = -1;
119 m_chain->m_fileInfoMC.EventNo.first = std::min(
Event(),
m_chain->m_fileInfoMC.EventNo.first);
120 m_chain->m_fileInfoMC.EventNo.second = std::max(
Event(),
m_chain->m_fileInfoMC.EventNo.second);
122 MCEventgR *primary = (nMCEventg() != 0) ? pMCEventg(0) :
nullptr;
123 float p = (primary) ? primary->Momentum : 0;
124 m_chain->m_fileInfoMC.MomentumRange.first = std::min(p,
m_chain->m_fileInfoMC.MomentumRange.first);
125 m_chain->m_fileInfoMC.MomentumRange.second = std::max(p,
m_chain->m_fileInfoMC.MomentumRange.second);
127 TrLinearEtaDB::SetLinearCluster();
128 TRFITFFKEY.Zshift = 2;
131 TRFITFFKEY.ErcHeY = 0;
144 static bool got_it =
false;
146 m_logger->debug(
"UProcessCut - First event processed - Entry: {}, Run: {}, Event: {}", Entry(), Run(),
Event());
147 }
else if (Entry() % 10000 == 0) {
148 m_logger->debug(
"UProcessCut - Event processed - Entry: {}, Run: {}, Event: {}", Entry(), Run(),
Event());
152 m_logger->trace(
"Entry: {}", Entry());
157 if ((nDaqEvent() < 1) || (nLevel1() < 1)) {
163 static unsigned long lastSec = 0;
165 ParticleR *particle =
nullptr;
169 m_chain->m_event.mcTruthBase.Fill(
this);
170 m_chain->m_event.mcTruthPlus.Fill(
this);
175 m_chain->m_event.header.Fill(
this);
176 m_chain->m_event.evSummary.Fill(
this);
180 if (!
isMC && lastSec !=
m_chain->m_event.header.UTCTime) {
185 m_chain->m_rtiInfo.FillEventVariables();
194 lastSec =
m_chain->m_event.header.UTCTime;
200 m_chain->m_rtiInfo.AccumulateEventVariables(
this);
210 m_chain->m_event.daq.Fill(*pDaqEvent(0));
214 particle = pParticle(0);
221 bool has_tof =
m_chain->m_event.tofBase.Fill(particle->pBeta(), particle->pBetaH());
226 if (std::fabs(UTOFCharge - 1) < 0.5) {
228 }
else if (std::fabs(UTOFCharge - 2) < 0.5) {
230 }
else if (UTOFCharge > 2.5) {
237 m_chain->m_event.tofPlus.Fill(particle->pBeta(), particle->pBetaH());
240 if (particle->pTrTrack()) {
241 float tof_beta = 1.0f;
248 m_chain->m_event.mcTruthPlus.FillTrMCHit(particle->pTrTrack(), tof_beta);
255 m_logger->trace(
"Track no. = {}", particle->iTrTrack());
259 m_chain->m_event.trTrackBase.SetBeta(tof_beta);
262 bool has_track =
m_chain->m_event.trTrackBase.Fill(particle->pTrTrack());
268 if (std::fabs(innerCharge - 1) < 0.5) {
270 }
else if (std::fabs(innerCharge - 2) < 0.5) {
272 }
else if (innerCharge > 2.5) {
279 m_chain->m_event.trTrackPlus.Fill(particle->pTrTrack());
282 if (NTrTrack() > 1) {
284 TrTrackR *second_track =
nullptr;
285 for (TrTrackR &track : TrTrack()) {
286 if (&track == particle->pTrTrack() || track.GetNhits() < 5) {
290 if (!second_track || second_track->GetRigidity() < track.GetRigidity()) {
291 second_track = &track;
296 m_chain->m_event.secondTrTrackBase.Fill(second_track, TrTrackFillType::SecondTrack);
302 m_chain->m_event.trTrackBaseSt.Fill(particle->pTrTrack(), TrTrackFillType::Standalone);
305 if (std::fabs(innerCharge_St - 1) < 0.5) {
307 }
else if (std::fabs(innerCharge_St - 2) < 0.5) {
309 }
else if (innerCharge_St > 2.5) {
319 std::unique_ptr<TrdKCluster> trdK;
320 if (particle->pTrdTrack())
321 trdK = std::make_unique<TrdKCluster>(
this, particle->pTrdTrack(), 0);
323 trdK = std::make_unique<TrdKCluster>(
this, particle->pTrTrack(), 0);
334 bool has_trd =
m_chain->m_event.trdKBase.Fill(trdK.get(), particle->pTrTrack());
344 if (particle->pEcalShower()) {
348 bool has_ecal =
m_chain->m_event.ecalBase.Fill(particle->pEcalShower());
356 m_chain->m_event.ecalPlus.Fill(particle->pEcalShower());
360 if (particle->pRichRing()) {
364 bool has_rich =
m_chain->m_event.richBase.Fill(particle->pRichRing(), particle->pRichRingB());
372 m_chain->m_event.richPlus.Fill(
this, particle->pRichRing(), particle->pRichRingB(), particle->pTrTrack());
387 if (has_tof_standalone) {
392 if (std::fabs(UTOFCharge_St - 1) < 0.5) {
394 }
else if (std::fabs(UTOFCharge_St - 2) < 0.5) {
396 }
else if (UTOFCharge_St > 2.5) {
411 auto trdK = std::make_unique<TrdKCluster>();
413 m_logger->trace(
"Building standalone TRD from TrdTrack");
417 m_logger->trace(
"Building standalone TRD from BetaH");
430 bool has_trd_standalone =
m_chain->m_event.trdKBaseSt.Fill(trdK.get(),
nullptr);
431 if (has_trd_standalone) {
445 m_chain->m_event.extHitBase.Fill(
this, use_trd);
457 ?
static_cast<float>(
m_chain->m_event.ecalBase.GetCOG().z())
458 : std::numeric_limits<float>::max();
459 m_chain->m_event.trTrackBase.FillElectronVars(particle->pTrTrack(), zEcalCOG, refitKalman);
463 m_chain->m_event.trTrackPlus.FillElectronVars(particle->pTrTrack(), refitKalman);
467 m_logger->trace(
"Event mask: {}", to_string_binary<32>(
m_chain->m_event.header.Mask()));
483 m_chain->m_rtiInfo.FillEventVariables();
486 m_logger->info(
"UTerminate =============================================");
492 m_logger->info(
"Overwriting RTIInfo tree");
493 m_chain->m_rti.tree->BuildIndex(
"RTIInfo.UTCTime");
496 m_logger->info(
"Writing chain to file");
497 NAIA::Version versionHeader;
498 m_outputFile->WriteTObject(&versionHeader,
"VersionHeader");
509 auto oldOpt = TofRecH::BuildOpt;
510 TofRecH::BuildOpt = 3110;
511 m_logger->trace(
"Rebuilding Tof with opt {}", TofRecH::BuildOpt);
513 m_logger->trace(
"{} BetaH objects found", nBetaH());
519 auto getMaxQBetaH = [
this, &nlayers, &qrms](
bool matchTrd =
true) {
521 BetaHR *maxQBetaH =
nullptr;
523 double prev_tofcharge = 0;
525 for (BetaHR &betah :
BetaH()) {
527 float temp_tofcharge = betah.GetQ(nlayers, qrms);
528 if (temp_tofcharge <= 0)
532 if (!betah.pTrdTrack())
536 unsigned int nTrdHits{0};
537 for (
unsigned int i = 0; i < betah.pTrdTrack()->NTrdSegment(); ++i) {
538 nTrdHits += betah.pTrdTrack()->pTrdSegment(i)->NTrdCluster();
544 m_logger->trace(
"StAl BetaH n. {} - Charge {} (Chi2C: {} - Chi2T: {}) - TRD hits: {}", ib, temp_tofcharge,
545 betah.GetChi2C(), betah.GetChi2T(), nTrdHits);
547 m_logger->trace(
"StAl BetaH n. {} - Charge {} (Chi2C: {} - Chi2T: {})", ib, temp_tofcharge, betah.GetChi2C(),
551 if (temp_tofcharge > prev_tofcharge) {
553 prev_tofcharge = temp_tofcharge;
560 auto getBestChi2BetaH = [
this, &nlayers, &qrms]() {
562 BetaHR *bestBetaH =
nullptr;
564 double prev_chi2sum = std::numeric_limits<float>::max();
566 for (BetaHR &betah :
BetaH()) {
568 float temp_tofcharge = betah.GetQ(nlayers, qrms);
569 if (temp_tofcharge <= 0)
572 float chi2sum = betah.GetChi2C() + betah.GetChi2T();
574 if (chi2sum > 0 && chi2sum < prev_chi2sum) {
576 prev_chi2sum = chi2sum;
590 m_logger->trace(
"(chosen) StAl BetaH - Charge {} (Chi2C: {} - Chi2T: {})",
m_betahStPtr->GetQ(nlayers, qrms),
597 TofRecH::BuildOpt = oldOpt;