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