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