NAIA  1.0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
NtpSelector.cpp
Go to the documentation of this file.
2 
3 #include "NtpMaker/NtpSelector.h"
4 #include "NtpMaker/NtpTools.h"
5 
6 #include "Tofrec02_ihep.h"
7 #include "tkdcards.h"
8 extern int StopSelector;
9 
10 namespace NAIA {
12  m_logger->info("UBegin =============================================");
13 
14  auto stpw = m_benchmark.MakeStopwatch("NtpSelector::UBegin");
15 
16  m_logger->info("Creating output file {}", m_outputFilename);
17  std::string output_file_option = m_reprocess_rti ? "update" : "recreate";
18  m_outputFile = std::make_unique<TFile>(m_outputFilename.c_str(), output_file_option.c_str());
19  m_outputFile->SetCompressionLevel(7);
20 
21  m_logger->info("Creating NAIA event tree");
22  m_chain = std::make_unique<NAIAChain>(NAIAChain::AccessMode::Write);
23  m_chain->m_event.SetMC(m_isMC);
24  m_chain->SetupBranches(m_isMC);
25  m_logger->info("NAIA branches created");
26 }
27 
29  static bool firstCall = true;
30  if (!firstCall) {
31  m_logger->debug("Switching file in chain: {}", m_tree->GetCurrentFile()->GetName());
32  // reset file info containers
33  m_chain->m_fileInfo.Clear();
34  if (m_isMC)
35  m_chain->m_fileInfoMC.Clear();
36  } else {
37  firstCall = false;
38  }
39  return AMSEventR::Notify();
40 }
41 
43  m_logger->debug("Called NtpSelector::ProcessFileInfo");
44 
45  m_chain->m_fileInfo.Clear();
46  if (m_isMC)
47  m_chain->m_fileInfoMC.Clear();
48 
49  m_chain->m_fileInfo.FileName = m_tree->GetCurrentFile()->GetName();
50 
51  m_chain->m_fileInfo.Run = Run();
52  m_chain->m_fileInfo.EventNo.first = Event();
53  m_chain->m_fileInfo.EventNo.second = Event();
54 
55  m_chain->m_fileInfo.UTCTime.first = fHeader.Time[0];
56  m_chain->m_fileInfo.UTCTime.second = fHeader.Time[0];
57 
58  if (m_isMC) {
59  m_chain->m_fileInfoMC.EventNo.first = Event();
60  m_chain->m_fileInfoMC.EventNo.second = Event();
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");
67  if (!datacard) {
68  m_logger->error("No Datacard Object available!");
69  }
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");
74 
75  if (m_chain->m_fileInfo.FileName.find(".l1.") != std::string::npos) {
76  m_chain->m_fileInfoMC.Focus = MCFileInfo::SimFocus::L1;
77  } else if (m_chain->m_fileInfo.FileName.find(".l19.") != std::string::npos) {
78  m_chain->m_fileInfoMC.Focus = MCFileInfo::SimFocus::L19;
79  } else if (m_chain->m_fileInfo.FileName.find(".l1a9.") != std::string::npos) {
80  m_chain->m_fileInfoMC.Focus = MCFileInfo::SimFocus::L19;
81  } else if (m_chain->m_fileInfo.FileName.find(".tb.") != std::string::npos) {
82  m_chain->m_fileInfoMC.Focus = MCFileInfo::SimFocus::TB;
83  }
84  } else {
85  // not MC
86  // [VF] here we reproduce the logic of AMSEventR::IsBadRun. Can't use that since the "reason" parameter is thrown
87  // away and we actually need it
88  if (getsetup())
89  m_chain->m_fileInfo.BadRunTag = getsetup()->IsBadRun(m_chain->m_fileInfo.BadRunReason, UTime(), Run());
90  else
91  m_chain->m_fileInfo.BadRunTag = 2;
92  }
93 }
94 
96  if (StopSelector)
97  Abort("Aborting TSelector Loop\n");
98  if (m_chain->m_fileInfo.Run == 0) {
99  // this happens when a file is first loaded
100  ProcessFileInfo();
101  }
102 
103  // fill FileInfo stuff...
104  m_chain->m_fileInfo.NEvents++;
105  m_chain->m_fileInfo.EventNo.second = Event();
106  m_chain->m_fileInfo.UTCTime.second = fHeader.Time[0];
107 
108  if (m_isMC) {
109  SetDefaultMCTuningParameters();
110  TRCLFFKEY.ClusterCofGOpt = 1;
111  TRFITFFKEY.Zshift = -1;
112 
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);
115 
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);
120  } else {
121  TrLinearEtaDB::SetLinearCluster();
122  TRFITFFKEY.Zshift = 2;
123  }
124 
125  TRFITFFKEY.ErcHeY = 0;
126 
127  // quickly discard entries we don't care about...
128  if (Entry() < firstentry) {
129  m_logger->trace("Skip entry {} < {}", Entry(), firstentry);
130  return false;
131  } else if (Entry() > lastentry) {
132  // FIXME: check is Paolo's patch to gbatch is accepted upstream. Then set StopSelector
133  // StopSelector = true;
134  m_logger->trace("Skip entry {} > {}", Entry(), lastentry);
135  return false;
136  }
137 
138  static bool got_it = false;
139  if (!got_it) {
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());
143  }
144  got_it = true;
145 
146  m_logger->trace("Entry: {}", Entry());
147 
148  m_chain->Clear();
149 
150  // cut really bad stuff
151  if ((nDaqEvent() < 1) || (nLevel1() < 1)) {
152  return false;
153  }
154 
155  auto stpw = m_benchmark.MakeStopwatch("Event processing");
156 
157  static unsigned long lastSec = 0;
158  // int ibetah_select = -1;
159  ParticleR *particle = nullptr;
160 
161  if (m_isMC) {
162  auto stpw = m_benchmark.MakeStopwatch("MCTruth::Fill");
163  m_chain->m_event.mcTruthBase.Fill(this);
164  m_chain->m_event.mcTruthPlus.Fill(this);
165  }
166 
167  {
168  auto stpw = m_benchmark.MakeStopwatch("(Header+EventSummary)::Fill");
169  m_chain->m_event.header.Fill(this);
170  m_chain->m_event.evSummary.Fill(this);
171  }
172 
173  // RTI
174  if (!m_isMC && lastSec != m_chain->m_event.header.UTCTime) {
175  auto stpw = m_benchmark.MakeStopwatch("RTIInfo::Fill");
176 
177  // don't fill the first time we enter here
178  if (lastSec > 0) {
179  m_chain->m_rtiInfo.FillEventVariables();
180  m_chain->FillRTI();
181  }
182  m_chain->m_rtiInfo.Clear();
183 
185  GetRTI(m_rti);
186  m_chain->m_rtiInfo.Fill(&m_rti, m_chain->m_event.header.RunTag);
188  lastSec = m_chain->m_event.header.UTCTime;
189  }
190 
191  if (!m_isMC) {
192  auto stpw = m_benchmark.MakeStopwatch("RTIInfo::AccumulateEventVariables");
194  m_chain->m_rtiInfo.AccumulateEventVariables(this);
196  }
197 
198  // NOTE: We stop here if we only have to process RTIInfo :)
199  if (m_reprocess_rti)
200  return true;
201 
202  if (pDaqEvent(0)) {
203  auto stpw = m_benchmark.MakeStopwatch("DAQ::Fill");
204  m_chain->m_event.daq.Fill(*pDaqEvent(0));
205  }
206 
207  // temporary! To be reviewed
208  particle = pParticle(0);
209 
210  if (particle) {
211 
212  // TofBase
213  {
214  auto stpw = m_benchmark.MakeStopwatch("TofBase::Fill");
215  bool has_tof = m_chain->m_event.tofBase.Fill(particle->pBeta(), particle->pBetaH());
216  if (has_tof) {
217  m_chain->m_event.header.SetMaskCategory(NAIA::Category::HasTof);
218  }
219  float UTOFCharge = m_chain->m_event.tofBase.Charge[NAIA::Tof::ChargeType::Upper];
220  if (std::fabs(UTOFCharge - 1) < 0.5) {
221  m_chain->m_event.SetMaskCategory(NAIA::Category::Charge1_Tof);
222  } else if (std::fabs(UTOFCharge - 2) < 0.5) {
223  m_chain->m_event.SetMaskCategory(NAIA::Category::Charge2_Tof);
224  } else if (UTOFCharge > 2.5) {
225  m_chain->m_event.SetMaskCategory(NAIA::Category::ChargeGT2_Tof);
226  }
227  }
228  // TofPlus
229  {
230  auto stpw = m_benchmark.MakeStopwatch("TofPlus::Fill");
231  m_chain->m_event.tofPlus.Fill(particle->pBeta(), particle->pBetaH());
232  }
233 
234  if (particle->pTrTrack()) {
235  if (m_isMC)
236  m_chain->m_event.mcTruthPlus.FillTrMCHit(particle->pTrTrack());
237 
238  // TrTrackBase
239  {
240  auto stpw = m_benchmark.MakeStopwatch("TrTrackBase::Fill");
241 
242  m_logger->trace("Track no. = {}", particle->iTrTrack());
243 
244  if (MatchAllBits(m_chain->m_event.header.Mask(), NAIA::Category::HasTof) &&
245  ContainsKeys(m_chain->m_event.tofBase.Beta, NAIA::Tof::BetaType::BetaH)) {
246  m_chain->m_event.trTrackBase.SetBeta(m_chain->m_event.tofBase.Beta[NAIA::Tof::BetaType::BetaH]);
247  }
248 
249  bool has_track = m_chain->m_event.trTrackBase.Fill(particle->pTrTrack());
250  if (has_track) {
251  m_chain->m_event.header.SetMaskCategory(NAIA::Category::HasTrack);
252  }
253 
254  float innerCharge = m_chain->m_event.trTrackBase.InnerCharge[NAIA::TrTrack::ChargeRecoType::STD];
255  if (std::fabs(innerCharge - 1) < 0.5) {
256  m_chain->m_event.SetMaskCategory(NAIA::Category::Charge1_Trk);
257  } else if (std::fabs(innerCharge - 2) < 0.5) {
258  m_chain->m_event.SetMaskCategory(NAIA::Category::Charge2_Trk);
259  } else if (innerCharge > 2.5) {
260  m_chain->m_event.SetMaskCategory(NAIA::Category::ChargeGT2_Trk);
261  }
262  }
263  // TrTrackPlus
264  {
265  auto stpw = m_benchmark.MakeStopwatch("TrTrackPlus::Fill");
266  m_chain->m_event.trTrackPlus.Fill(particle->pTrTrack());
267  }
268  // SecondTrTrackBase
269  if (NTrTrack() > 1) {
270  auto stpw = m_benchmark.MakeStopwatch("SecondTrTrackBase::Fill");
271  TrTrackR *second_track = nullptr;
272  for (TrTrackR &track : TrTrack()) {
273  if (&track == particle->pTrTrack() || track.GetNhits() < 5) {
274  continue;
275  }
276 
277  if (!second_track || second_track->GetRigidity() < track.GetRigidity()) {
278  second_track = &track;
279  }
280  }
281 
282  if (second_track) {
283  m_chain->m_event.secondTrTrackBase.Fill(second_track, TrTrackFillType::SecondTrack);
284  }
285  }
286  // Standalone TrTrack
287  {
288  auto stpw = m_benchmark.MakeStopwatch("TrTrackBaseStandalone::Fill");
289  m_chain->m_event.trTrackBaseSt.Fill(particle->pTrTrack(), TrTrackFillType::Standalone);
290 
291  float innerCharge_St = m_chain->m_event.trTrackBaseSt.InnerCharge[NAIA::TrTrack::ChargeRecoType::STD];
292  if (std::fabs(innerCharge_St - 1) < 0.5) {
293  m_chain->m_event.SetMaskCategory(NAIA::Category::Charge1_Trk_St);
294  } else if (std::fabs(innerCharge_St - 2) < 0.5) {
295  m_chain->m_event.SetMaskCategory(NAIA::Category::Charge2_Trk_St);
296  } else if (innerCharge_St > 2.5) {
297  m_chain->m_event.SetMaskCategory(NAIA::Category::ChargeGT2_Trk_St);
298  }
299  }
300 
301  // TrdKBase
302  {
303  auto stpw = m_benchmark.MakeStopwatch("TrdKBase::Fill");
304 
306  auto trdK = std::make_unique<TrdKCluster>(this, particle->pTrTrack(), 0);
308 
309  if (trdK) {
310  // set beta for TRD filling
311  if (MatchAllBits(m_chain->m_event.header.Mask(), NAIA::Category::HasTof) &&
312  ContainsKeys(m_chain->m_event.tofBase.Beta, NAIA::Tof::BetaType::BetaH)) {
313  m_chain->m_event.trdKBase.SetBeta(m_chain->m_event.tofBase.Beta[NAIA::Tof::BetaType::BetaH]);
314  m_chain->m_event.trdKBase.Type = TrdK::BuildType::TrkTrack;
315  }
316 
317  bool has_trd = m_chain->m_event.trdKBase.Fill(trdK.get(), particle->pTrTrack());
318  if (has_trd) {
319  m_chain->m_event.header.SetMaskCategory(NAIA::Category::HasTrd);
320  }
321  }
322  }
323 
324  // we still need to fill electron-related track fits
325  }
326 
327  if (particle->pEcalShower()) {
328  // EcalBase
329  {
330  auto stpw = m_benchmark.MakeStopwatch("EcalBase::Fill");
331  bool has_ecal = m_chain->m_event.ecalBase.Fill(particle->pEcalShower());
332  if (has_ecal) {
333  m_chain->m_event.header.SetMaskCategory(NAIA::Category::HasEcal);
334  }
335  }
336  // EcalPlus
337  {
338  auto stpw = m_benchmark.MakeStopwatch("EcalPlus::Fill");
339  m_chain->m_event.ecalPlus.Fill(particle->pEcalShower());
340  }
341  }
342 
343  if (particle->pRichRing()) {
344  // RichBase
345  {
346  auto stpw = m_benchmark.MakeStopwatch("RichBase::Fill");
347  bool has_rich = m_chain->m_event.richBase.Fill(particle->pRichRing(), particle->pRichRingB());
348  if (has_rich) {
349  m_chain->m_event.header.SetMaskCategory(NAIA::Category::HasRich);
350  }
351  }
352  // RichPlus
353  {
354  auto stpw = m_benchmark.MakeStopwatch("RichPlus::Fill");
355  m_chain->m_event.richPlus.Fill(this, particle->pRichRing(), particle->pRichRingB(), particle->pTrTrack());
356  }
357  }
358 
359  // fill standalone containers
360  {
361  auto stpw = m_benchmark.MakeStopwatch("DefineStandalone");
363  }
364 
365  if (m_betahStPtr) {
366  // TofBaseStandalone
367  {
368  auto stpw = m_benchmark.MakeStopwatch("TofBaseStandalone::Fill");
369  bool has_tof_standalone = m_chain->m_event.tofBaseSt.Fill(nullptr, m_betahStPtr, true);
370  if (has_tof_standalone) {
371  m_chain->m_event.header.SetMaskCategory(NAIA::Category::HasTofStandalone);
372  }
373 
374  float UTOFCharge_St = m_chain->m_event.tofBaseSt.ChargeNoPL[NAIA::Tof::ChargeType::Upper];
375  if (std::fabs(UTOFCharge_St - 1) < 0.5) {
376  m_chain->m_event.SetMaskCategory(NAIA::Category::Charge1_Tof_St);
377  } else if (std::fabs(UTOFCharge_St - 2) < 0.5) {
378  m_chain->m_event.SetMaskCategory(NAIA::Category::Charge2_Tof_St);
379  } else if (UTOFCharge_St > 2.5) {
380  m_chain->m_event.SetMaskCategory(NAIA::Category::ChargeGT2_Tof_St);
381  }
382  }
383  // TofPlusStandalone
384  {
385  auto stpw = m_benchmark.MakeStopwatch("TofPlusStandalone::Fill");
386  m_chain->m_event.tofPlusSt.Fill(nullptr, m_betahStPtr, true);
387  }
388 
389  // TrdKBaseStandalone
390  {
391  auto stpw = m_benchmark.MakeStopwatch("TrdKBaseStandalone::Fill");
392 
394  auto trdK = std::make_unique<TrdKCluster>();
395  if (m_trdTrackStPtr) {
396  m_logger->trace("Building standalone TRD from TrdTrack");
397  trdK->Build(m_trdTrackStPtr);
398  m_chain->m_event.trdKBaseSt.Type = TrdK::BuildType::TrdTrack;
399  } else {
400  m_logger->trace("Building standalone TRD from BetaH");
401  trdK->Build(m_betahStPtr);
402  m_chain->m_event.trdKBaseSt.Type = TrdK::BuildType::BetaH;
403  }
405 
406  if (trdK) {
407  // set beta for TRD filling
408  if (MatchAllBits(m_chain->m_event.header.Mask(), NAIA::Category::HasTofStandalone) &&
409  ContainsKeys(m_chain->m_event.tofBaseSt.Beta, NAIA::Tof::BetaType::BetaH)) {
410  m_chain->m_event.trdKBaseSt.SetBeta(m_chain->m_event.tofBaseSt.Beta[NAIA::Tof::BetaType::BetaH]);
411  }
412 
413  bool has_trd_standalone = m_chain->m_event.trdKBaseSt.Fill(trdK.get(), nullptr);
414  if (has_trd_standalone) {
415  m_chain->m_event.header.SetMaskCategory(NAIA::Category::HasTrdStandalone);
416  }
417  }
418  }
419  }
420 
421  // unbiased ExtHit
422  if (MatchAllBits(m_chain->m_event.header.Mask(), NAIA::Category::HasTofStandalone)) {
423  auto stpw = m_benchmark.MakeStopwatch("UnbExtHitBase::Fill");
424 
425  bool use_trd = MatchAllBits(m_chain->m_event.header.Mask(), NAIA::Category::HasTrdStandalone);
426 
428  m_chain->m_event.extHitBase.Fill(this, use_trd);
430  }
431 
432  // only at the very end we screw up gbatch's tracker fits internals and fill electron-related variables
433  if (particle->pTrTrack() && MatchAllBits(m_chain->m_event.header.Mask(), Category::HasTrd)) {
434  // condition for Kalman electron fit: ECAL EnergyD > 0.4 GeV
435  bool refitKalman = MatchAllBits(m_chain->m_event.header.Mask(), Category::HasEcal) &&
436  m_chain->m_event.ecalBase.Energy[Ecal::EnergyRecoType::EnergyD] > 0.4;
437  {
438  auto stpw = m_benchmark.MakeStopwatch("TrTrackBase::FillElectronVars");
439  float zEcalCOG = MatchAllBits(m_chain->m_event.header.Mask(), Category::HasEcal)
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);
443  }
444  {
445  auto stpw = m_benchmark.MakeStopwatch("TrTrackPlus::FillElectronVars");
446  m_chain->m_event.trTrackPlus.FillElectronVars(particle->pTrTrack(), refitKalman);
447  }
448  }
449 
450  m_logger->trace("Event mask: {}", to_string_binary<32>(m_chain->m_event.header.Mask()));
451  } else {
452  // do selection without particle here?
453  }
454 
455  m_chain->Fill();
456 
457  return true;
458 }
459 
460 void NtpSelector::UProcessFill() {}
461 
462 void NtpSelector::UTerminate() {
463  // last call for accumulated info
464  m_chain->FillFileInfo();
465 
466  m_chain->m_rtiInfo.FillEventVariables();
467  m_chain->FillRTI();
468 
469  m_logger->info("UTerminate =============================================");
470  // m_chain->Print();
471 
472  m_outputFile->cd();
473 
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");
478  } else {
479  m_logger->info("Writing chain to file");
480  NAIA::Version versionHeader;
481  m_outputFile->WriteTObject(&versionHeader, "VersionHeader");
482  m_chain->Write();
483  }
484  m_benchmark.Print(m_logger);
485 }
486 
487 void NtpSelector::DefineStandAlone() {
488  m_betahStPtr = nullptr;
489  m_trdTrackStPtr = nullptr;
490 
491  // Rebuild Tof with standalone reconstruction
492  auto oldOpt = TofRecH::BuildOpt;
493  TofRecH::BuildOpt = 3110;
494  m_logger->trace("Rebuilding Tof with opt {}", TofRecH::BuildOpt);
495  TofRecH::ReBuild();
496  m_logger->trace("{} BetaH objects found", nBetaH());
497 
498  auto getMaxQBetaH = [this](bool matchTrd = true) {
499  int ib = -1;
500  BetaHR *maxQBetaH = nullptr;
501 
502  // dummy variables for gbatch terrible interface
503  int nlayers;
504  float qrms;
505 
506  double prev_tofcharge = 0;
507 
508  for (BetaHR &betah : BetaH()) {
509  ++ib;
510  float temp_tofcharge = betah.GetQ(nlayers, qrms);
511  if (temp_tofcharge <= 0)
512  continue;
513 
514  if (matchTrd) {
515  if (!betah.pTrdTrack())
516  continue;
517  // count TRD track hits
518  // NOTE(vformato): Is this the right thing?
519  unsigned int nTrdHits{0};
520  for (unsigned int i = 0; i < betah.pTrdTrack()->NTrdSegment(); ++i) {
521  nTrdHits += betah.pTrdTrack()->pTrdSegment(i)->NTrdCluster();
522  }
523 
524  if (nTrdHits < 15)
525  continue;
526 
527  m_logger->trace("StAl BetaH n. {} - Charge {} (Chi2C: {} - Chi2T: {}) - TRD hits: {}", ib, temp_tofcharge,
528  betah.GetChi2C(), betah.GetChi2T(), nTrdHits);
529  } else {
530  m_logger->trace("StAl BetaH n. {} - Charge {} (Chi2C: {} - Chi2T: {})", ib, temp_tofcharge, betah.GetChi2C(),
531  betah.GetChi2T());
532  }
533 
534  if (temp_tofcharge > prev_tofcharge) {
535  maxQBetaH = &betah;
536  prev_tofcharge = temp_tofcharge;
537  }
538  }
539 
540  return maxQBetaH;
541  };
542 
543  m_betahStPtr = getMaxQBetaH(false);
544  m_trdTrackStPtr = m_betahStPtr ? m_betahStPtr->pTrdTrack() : nullptr;
545 
546  // just for safety, restore old opt
547  TofRecH::BuildOpt = oldOpt;
548 }
549 
550 } // namespace NAIA
This event is classified as charge 1 according to tracker standalone (0.5 &lt; Q &lt; 1.5)
Tof standalone data is available for this event.
This event is classified as charge 1 according to tof standalone (0.5 &lt; Q &lt; 1.5)
This event is classified as charge 2 according to tof (1.5 &lt; Q &lt; 2.5)
TrTrack data is available for this event.
bool StopSelector
Definition: NtpMaker.cpp:23
This event is classified as charge &gt;2 according to tracker standalone (Q &gt; 2.5)
Rich data is available for this event.
Stopwatch MakeStopwatch(std::string name)
Definition: Benchmark.h:66
This event is classified as charge &gt;2 according to tof (Q &gt; 2.5)
TRD standalone data is available for this event.
unsigned long long firstentry
first entry to be processed
Definition: NtpSelector.h:28
void UnmuteOutput()
Definition: Logging.cpp:36
TrdTrackR * m_trdTrackStPtr
Definition: NtpSelector.h:67
This event is classified as charge 1 according to tracker (0.5 &lt; Q &lt; 1.5)
test beam simulation
Charge estimated using the upper half of the TRD.
Definition: Utils.h:233
bool m_isMC
is simulation?
Definition: NtpSelector.h:26
Event object.
Definition: Event.h:20
virtual void UBegin() override
Init output.
Definition: NtpSelector.cpp:11
This event is classified as charge &gt;2 according to tof standalone (Q &gt; 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))
Definition: bitmask.h:89
This event is classified as charge 1 according to tof (0.5 &lt; Q &lt; 1.5)
Benchmark m_benchmark
Definition: NtpSelector.h:71
This event is classified as charge 2 according to tracker (1.5 &lt; Q &lt; 2.5)
This event is classified as charge 2 according to tracker standalone (1.5 &lt; Q &lt; 2.5)
IHEP reconstruction.
Definition: Utils.h:349
std::shared_ptr< spdlog::logger > m_logger
Definition: NtpSelector.h:72
std::unique_ptr< TFile > m_outputFile
Definition: NtpSelector.h:60
BetaHR * m_betahStPtr
Definition: NtpSelector.h:66
Total deposited energy in Ecal.
Definition: Utils.h:289
virtual bool UProcessCut() override
Cut, select and prescale.
Definition: NtpSelector.cpp:95
This event is classified as charge &gt;2 according to tracker (Q &gt; 2.5)
void MuteOutput()
Definition: Logging.cpp:22
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)
Definition: Utils.hpp:53
AMSSetupR::RTI m_rti
Definition: NtpSelector.h:68
virtual bool Notify() override
Called every time a new file is loaded in the chain.
Definition: NtpSelector.cpp:28
std::string m_outputFilename
Definition: NtpSelector.h:59
This event is classified as charge 2 according to tof standalone (1.5 &lt; Q &lt; 2.5)
Standard tracker charge reconstruction.
Definition: Utils.h:91
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
Definition: NtpSelector.h:63
unsigned long long lastentry
last entry to be processed
Definition: NtpSelector.h:30