Belle II Software  release-05-02-19
IterativeEventTimeExtractor.icc.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2018 Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Nils Braun *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #pragma once
11 
12 #include <tracking/eventTimeExtraction/findlets/IterativeEventTimeExtractor.dcl.h>
13 #include <tracking/eventTimeExtraction/findlets/BaseEventTimeExtractor.icc.h>
14 #include <tracking/eventTimeExtraction/utilities/TimeExtractionUtils.h>
15 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
16 #include <framework/core/ModuleParamList.h>
17 #include <framework/logging/Logger.h>
18 
19 namespace Belle2 {
24  template <class AFindlet>
26  {
27  Super::addProcessingSignalListener(&m_findlet);
28  }
29 
30  template <class AFindlet>
31  void IterativeEventTimeExtractor<AFindlet>::apply(std::vector<RecoTrack*>& recoTracks)
32  {
33  m_wasSuccessful = false;
34 
35  m_eventT0WithQuality.clear();
36 
37  TimeExtractionUtils::addEventT0WithQuality(recoTracks, m_eventT0, m_eventT0WithQuality);
38 
39  unsigned int iteration = 0;
40  for (; iteration < m_param_maxIterations; iteration++) {
41  // The findlet will set the final event t0, but will probably not add any temporary event t0s, which is fine as we will do so.
42  m_findlet.apply(recoTracks);
43 
44  bool breakLoop = false;
45  if (m_findlet.wasSuccessful()) {
46 
47  if (not m_eventT0WithQuality.empty()) {
48  const double deltaT0 = std::abs(m_eventT0->getEventT0() - m_eventT0WithQuality.back().eventT0);
49  if (deltaT0 < m_param_minimalDeltaT0 and iteration >= m_param_minIterations) {
50  breakLoop = true;
51  }
52  }
53  TimeExtractionUtils::addEventT0WithQuality(recoTracks, m_eventT0, m_eventT0WithQuality);
54  } else if (m_param_abortOnUnsuccessfulStep) {
55  B2DEBUG(50, "Aborting because time extraction was not successful.");
56  breakLoop = true;
57  }
58 
59  if (breakLoop) {
60  break;
61  }
62  }
63 
64  if (not m_eventT0WithQuality.empty() and iteration != m_param_maxIterations) {
65  if (m_param_useLastEventT0) {
66  m_eventT0->addTemporaryEventT0(m_eventT0WithQuality.back());
67  m_eventT0->setEventT0(m_eventT0WithQuality.back());
68  } else {
69  // Look for the best event t0 (with the smallest chi2)
70  const auto& bestEventT0 = std::max_element(m_eventT0WithQuality.begin(), m_eventT0WithQuality.end(),
71  [](const auto & lhs, const auto & rhs) {
72  return lhs.quality < rhs.quality;
73  });
74  m_eventT0->setEventT0(*bestEventT0);
75  }
76  m_wasSuccessful = true;
77  }
78  }
79 
80  template <class AFindlet>
81  void IterativeEventTimeExtractor<AFindlet>::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
82  {
83  Super::exposeParameters(moduleParamList, prefix);
84 
85  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "maxIterations"),
86  m_param_maxIterations,
87  "How many iterations should be done maximally?",
88  m_param_maxIterations);
89  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minIterations"),
90  m_param_minIterations,
91  "How many iterations should be done minimally?",
92  m_param_minIterations);
93  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minimalDeltaT0"),
94  m_param_minimalDeltaT0,
95  "What is the final precision?",
96  m_param_minimalDeltaT0);
97  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "useLastEventT0"),
98  m_param_useLastEventT0,
99  "Use the last event t0 instead of the best one.",
100  m_param_useLastEventT0);
101  moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "abortOnUnsuccessfulStep"),
102  m_param_abortOnUnsuccessfulStep,
103  "Abort on a single unsuccessful step. Otherwise, the success is defined by the last step",
104  m_param_abortOnUnsuccessfulStep);
105 
106  m_findlet.exposeParameters(moduleParamList, TrackFindingCDC::prefixed("sub", prefix));
107  }
109 }
Belle2::TimeExtractionUtils::addEventT0WithQuality
static void addEventT0WithQuality(std::vector< RecoTrack * > &recoTracks, StoreObjPtr< EventT0 > &eventT0, std::vector< EventT0::EventT0Component > &eventT0WithQualityIndex)
Append an event-t0 value with quality information.
Definition: TimeExtractionUtils.cc:78
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::IterativeEventTimeExtractor::apply
void apply(std::vector< RecoTrack * > &recoTracks) override final
Timing extraction for this findlet.
Definition: IterativeEventTimeExtractor.icc.h:39
Belle2::IterativeEventTimeExtractor::exposeParameters
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) override
Expose the parameters.
Definition: IterativeEventTimeExtractor.icc.h:89
Belle2::IterativeEventTimeExtractor::IterativeEventTimeExtractor
IterativeEventTimeExtractor()
Add the subfindlet as listener.
Definition: IterativeEventTimeExtractor.icc.h:33