Belle II Software  release-05-01-25
EKLMTimeCalibrationCollectorModule.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2015 Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Kirill Chilikin *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 /* Own header. */
12 #include <klm/eklm/modules/EKLMTimeCalibration/EKLMTimeCalibrationCollectorModule.h>
13 
14 /* KLM headers. */
15 #include <klm/dataobjects/eklm/EKLMHit2d.h>
16 
17 /* Belle 2 headers. */
18 #include <framework/gearbox/Unit.h>
19 #include <tracking/dataobjects/ExtHit.h>
20 
21 /* ROOT headers. */
22 #include <TTree.h>
23 
24 using namespace Belle2;
25 
26 REG_MODULE(EKLMTimeCalibrationCollector)
27 
30  m_ElementNumbers(&(EKLMElementNumbers::Instance())),
31  m_TransformData(nullptr),
32  m_GeoDat(nullptr),
33  m_ev( {0, 0, 0}),
34  m_Strip(0)
35 {
36  setDescription("Module for EKLM time calibration (data collection).");
37  setPropertyFlags(c_ParallelProcessingCertified);
38  addParam("UseEventT0", m_UseEventT0, "Calibrate relatively to event T0.",
39  false);
40 }
41 
43 {
44 }
45 
47 {
48  TTree* t;
50  m_EKLMHit2ds.isRequired();
51  m_Tracks.isRequired();
52  StoreArray<KLMDigit> eklmDigits;
53  m_EKLMHit2ds.requireRelationTo(eklmDigits);
54  StoreArray<ExtHit> extHits;
55  m_Tracks.requireRelationTo(extHits);
56  if (m_UseEventT0)
57  m_EventT0.isRequired("EventT0");
59  t = new TTree("calibration_data", "");
60  t->Branch("time", &m_ev.time, "time/F");
61  t->Branch("dist", &m_ev.dist, "dist/F");
62  t->Branch("npe", &m_ev.npe, "npe/F");
63  t->Branch("strip", &m_Strip, "strip/I");
64  registerObject<TTree>("calibration_data", t);
65 }
66 
68 {
69  /* cppcheck-suppress variableScope */
70  int i, j, n, n2, vol;
71  double l, hitTime;
72  TVector3 hitPosition;
73  HepGeom::Point3D<double> hitGlobal, hitLocal;
74  std::multimap<int, ExtHit*> mapExtHit;
75  std::multimap<int, ExtHit*>::iterator it, itLower, itUpper;
76  ExtHit* extHit, *entryHit[2], *exitHit[2];
77  const HepGeom::Transform3D* tr;
78  TTree* calibrationData = getObjectPtr<TTree>("calibration_data");
79  n = m_Tracks.getEntries();
80  if (m_UseEventT0) {
81  if (!m_EventT0->hasEventT0()) {
82  B2ERROR("Event T0 is not determined. "
83  "Cannot collect data for EKLM time calibration.");
84  return;
85  }
86  }
87  for (i = 0; i < n; i++) {
88  RelationVector<ExtHit> extHits = m_Tracks[i]->getRelationsTo<ExtHit>();
89  n2 = extHits.size();
90  for (j = 0; j < n2; j++) {
91  if (extHits[j]->getDetectorID() != Const::EDetector::EKLM)
92  continue;
93  if (!m_GeoDat->hitInEKLM(extHits[j]->getPosition().Z()))
94  continue;
95  mapExtHit.insert(std::pair<int, ExtHit*>(extHits[j]->getCopyID(),
96  extHits[j]));
97  }
98  }
99  n = m_EKLMHit2ds.getEntries();
100  for (i = 0; i < n; i++) {
101  RelationVector<KLMDigit> digits =
102  m_EKLMHit2ds[i]->getRelationsTo<KLMDigit>();
103  if (digits.size() != 2)
104  B2FATAL("Wrong number of related KLMDigits.");
105  /*
106  * This is possible if the threshold was crossed, but the pedestal level
107  * has been estimated incorrectly.
108  */
109  if (digits[0]->getNPhotoelectrons() == 0 || digits[1]->getNPhotoelectrons() == 0)
110  continue;
111  for (j = 0; j < 2; j++) {
112  entryHit[j] = nullptr;
113  exitHit[j] = nullptr;
115  digits[j]->getSection(), digits[j]->getLayer(),
116  digits[j]->getSector(), digits[j]->getPlane(),
117  digits[j]->getStrip());
118  itLower = mapExtHit.lower_bound(vol);
119  itUpper = mapExtHit.upper_bound(vol);
120  for (it = itLower; it != itUpper; ++it) {
121  extHit = it->second;
122  switch (extHit->getStatus()) {
123  case EXT_ENTER:
124  if (entryHit[j] == nullptr) {
125  entryHit[j] = extHit;
126  } else {
127  if (extHit->getTOF() < entryHit[j]->getTOF())
128  entryHit[j] = extHit;
129  }
130  break;
131  case EXT_EXIT:
132  if (exitHit[j] == nullptr) {
133  exitHit[j] = extHit;
134  } else {
135  if (extHit->getTOF() > exitHit[j]->getTOF())
136  exitHit[j] = extHit;
137  }
138  break;
139  default:
140  break;
141  }
142  }
143  }
144  if (entryHit[0] == nullptr || exitHit[0] == nullptr ||
145  entryHit[1] == nullptr || exitHit[1] == nullptr)
146  continue;
147  for (j = 0; j < 2; j++) {
148  hitTime = 0.5 * (entryHit[j]->getTOF() + exitHit[j]->getTOF());
149  if (m_UseEventT0)
150  hitTime = hitTime + m_EventT0->getEventT0();
151  hitPosition = 0.5 * (entryHit[j]->getPosition() +
152  exitHit[j]->getPosition());
153  l = m_GeoDat->getStripLength(digits[j]->getStrip()) / CLHEP::mm *
154  Unit::mm;
155  hitGlobal.setX(hitPosition.X() / Unit::mm * CLHEP::mm);
156  hitGlobal.setY(hitPosition.Y() / Unit::mm * CLHEP::mm);
157  hitGlobal.setZ(hitPosition.Z() / Unit::mm * CLHEP::mm);
158  tr = m_TransformData->getStripGlobalToLocal(digits[j]);
159  hitLocal = (*tr) * hitGlobal;
160  m_ev.time = digits[j]->getTime() - hitTime;
161  m_ev.dist = 0.5 * l - hitLocal.x() / CLHEP::mm * Unit::mm;
162  m_ev.npe = digits[j]->getNPhotoelectrons();
164  digits[j]->getSection(), digits[j]->getLayer(),
165  digits[j]->getSector(), digits[j]->getPlane(),
166  digits[j]->getStrip());
167  calibrationData->Fill();
168  }
169  }
170 }
171 
173 {
174  if (m_TransformData != nullptr)
175  delete m_TransformData;
176 }
177 
Belle2::CalibrationCollectorModule
Calibration collector module base class.
Definition: CalibrationCollectorModule.h:44
Belle2::RelationVector::size
size_t size() const
Get number of relations.
Definition: RelationVector.h:98
Belle2::EKLMTimeCalibrationCollectorModule
EKLM time calibration (data collection).
Definition: EKLMTimeCalibrationCollectorModule.h:43
Belle2::EKLM::TransformData
Transformation data.
Definition: TransformData.h:37
Belle2::EKLMTimeCalibrationCollectorModule::m_Strip
int m_Strip
Number of strip (for tree branch).
Definition: EKLMTimeCalibrationCollectorModule.h:100
Belle2::EKLMTimeCalibrationCollectorModule::m_GeoDat
const EKLM::GeometryData * m_GeoDat
Geometry data.
Definition: EKLMTimeCalibrationCollectorModule.h:85
Belle2::EKLMElementNumbers
EKLM element numbers.
Definition: EKLMElementNumbers.h:34
Belle2::ExtHit::getPosition
TVector3 getPosition() const
Get position of this extrapolation hit.
Definition: ExtHit.h:153
Belle2::EKLMTimeCalibrationCollectorModule::m_Tracks
StoreArray< Track > m_Tracks
Tracks.
Definition: EKLMTimeCalibrationCollectorModule.h:91
Belle2::EKLM::TransformData::getStripGlobalToLocal
const HepGeom::Transform3D * getStripGlobalToLocal(KLMDigit *hit) const
Get strip global to local transformation by hit.
Definition: TransformData.cc:336
REG_MODULE
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:652
Belle2::EKLMTimeCalibrationCollectorModule::prepare
void prepare() override
Initializer.
Definition: EKLMTimeCalibrationCollectorModule.cc:46
Belle2::EKLMTimeCalibrationCollectorModule::m_EventT0
StoreObjPtr< EventT0 > m_EventT0
Event T0.
Definition: EKLMTimeCalibrationCollectorModule.h:94
Belle2::EKLMTimeCalibrationCollectorModule::m_ev
struct EKLMTimeCalibrationAlgorithm::Event m_ev
Event (for tree branches).
Definition: EKLMTimeCalibrationCollectorModule.h:97
Belle2::ExtHit::getTOF
double getTOF() const
Get time of flight from the point of closest approach near the origin to this hit.
Definition: ExtHit.h:145
Belle2::KLMDigit
KLM digit (class representing a digitized hit in RPCs or scintillators).
Definition: KLMDigit.h:40
Belle2::ExtHit
Store one Ext hit as a ROOT object.
Definition: ExtHit.h:40
Belle2::EKLMTimeCalibrationAlgorithm::Event::npe
float npe
Number of photoelectrons.
Definition: EKLMTimeCalibrationAlgorithm.h:43
Belle2::ExtHit::getStatus
ExtHitStatus getStatus() const
Get state of extrapolation at this hit.
Definition: ExtHit.h:138
Belle2::RelationVector
Class for type safe access to objects that are referred to in relations.
Definition: DataStore.h:38
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::EKLM::GeometryData::getStripLength
double getStripLength(int strip) const
Get strip length.
Definition: GeometryData.h:73
Belle2::EKLM::GeometryData::hitInEKLM
bool hitInEKLM(double z) const
Check if z coordinate may be in EKLM.
Definition: GeometryData.cc:639
Belle2::EKLMTimeCalibrationCollectorModule::m_ElementNumbers
const EKLMElementNumbers * m_ElementNumbers
Element numbers.
Definition: EKLMTimeCalibrationCollectorModule.h:79
Belle2::EKLMTimeCalibrationCollectorModule::collect
void collect() override
This method is called for each event.
Definition: EKLMTimeCalibrationCollectorModule.cc:67
Belle2::EKLMTimeCalibrationCollectorModule::finish
void finish() override
This method is called at the end of the event processing.
Definition: EKLMTimeCalibrationCollectorModule.cc:172
Belle2::EKLMTimeCalibrationCollectorModule::m_TransformData
EKLM::TransformData * m_TransformData
Transformation data.
Definition: EKLMTimeCalibrationCollectorModule.h:82
Belle2::EKLMElementNumbers::stripNumber
int stripNumber(int section, int layer, int sector, int plane, int strip) const
Get strip number.
Definition: EKLMElementNumbers.cc:212
Belle2::EKLMTimeCalibrationAlgorithm::Event::time
float time
Time.
Definition: EKLMTimeCalibrationAlgorithm.h:41
Belle2::Unit::mm
static const double mm
[millimeters]
Definition: Unit.h:80
Belle2::EKLMTimeCalibrationCollectorModule::m_EKLMHit2ds
StoreArray< EKLMHit2d > m_EKLMHit2ds
EKLM 2d hits.
Definition: EKLMTimeCalibrationCollectorModule.h:88
Belle2::EKLMTimeCalibrationCollectorModule::m_UseEventT0
bool m_UseEventT0
Use enent T0 or not.
Definition: EKLMTimeCalibrationCollectorModule.h:76
HepGeom::Point3D< double >
Belle2::StoreArray
Accessor to arrays stored in the data store.
Definition: ECLMatchingPerformanceExpertModule.h:33
Belle2::EKLMTimeCalibrationAlgorithm::Event::dist
float dist
Distance.
Definition: EKLMTimeCalibrationAlgorithm.h:42
Belle2::EKLMTimeCalibrationCollectorModule::~EKLMTimeCalibrationCollectorModule
~EKLMTimeCalibrationCollectorModule()
Destructor.
Definition: EKLMTimeCalibrationCollectorModule.cc:42
Belle2::EKLM::GeometryData::Instance
static const GeometryData & Instance(enum DataSource dataSource=c_Database, const GearDir *gearDir=nullptr)
Instantiation.
Definition: GeometryData.cc:35
Belle2::EKLM::TransformData::c_None
@ c_None
Displacement is not used.
Definition: TransformData.h:45