Belle II Software development
EKLMAlignmentAlongStripsCollectorModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9/* Own header. */
10#include <klm/eklm/modules/EKLMAlignmentAlongStrips/EKLMAlignmentAlongStripsCollectorModule.h>
11
12/* Basf2 headers. */
13#include <framework/gearbox/Unit.h>
14#include <tracking/dataobjects/ExtHit.h>
15
16/* ROOT headers. */
17#include <TTree.h>
18
19using namespace Belle2;
20
21REG_MODULE(EKLMAlignmentAlongStripsCollector);
22
26 m_ElementNumbers(&(EKLMElementNumbers::Instance())),
27 m_GeoDat(nullptr),
28 m_TransformData(nullptr),
29 m_Event(new EKLMAlignmentAlongStripsAlgorithm::Event)
30{
31 setDescription("Module for EKLM alignment along strip (data collection).");
33}
34
37{
38 delete m_Event;
39}
40
42{
43 TTree* t;
47 m_KLMDigits.isRequired();
48 m_Tracks.isRequired();
49 StoreArray<ExtHit> extHits;
50 m_Tracks.requireRelationTo(extHits);
51 t = new TTree("calibration_data", "");
52 t->Branch("event", &m_Event);
53 registerObject<TTree>("calibration_data", t);
54}
55
57{
58 /* cppcheck-suppress variableScope */
59 int i, j, n, n2, vol;
60 double l;
61 const HepGeom::Transform3D* tr;
62 ROOT::Math::XYZVector hitPosition;
63 HepGeom::Point3D<double> hitGlobal, hitLocal;
64 std::multimap<int, ExtHit*> mapExtHit;
65 std::multimap<int, ExtHit*>::iterator it, it2, itLower, itUpper;
66 std::set<int> digitVolumes;
67 ExtHit* extHit;
68 TTree* calibrationData = getObjectPtr<TTree>("calibration_data");
69 /* Create volume - extHit map. */
70 n = m_Tracks.getEntries();
71 for (i = 0; i < n; i++) {
72 RelationVector<ExtHit> extHits = m_Tracks[i]->getRelationsTo<ExtHit>();
73 n2 = extHits.size();
74 for (j = 0; j < n2; j++) {
75 if (extHits[j]->getDetectorID() != Const::EDetector::EKLM)
76 continue;
77 if (!m_GeoDat->hitInEKLM(extHits[j]->getPosition().Z()))
78 continue;
79 mapExtHit.insert(std::pair<int, ExtHit*>(extHits[j]->getCopyID(),
80 extHits[j]));
81 }
82 }
83 /* Create set of strips with signal. */
84 n = m_KLMDigits.getEntries();
85 for (i = 0; i < n; i++) {
86 if (m_KLMDigits[i]->getSubdetector() != KLMElementNumbers::c_EKLM)
87 continue;
89 m_KLMDigits[i]->getSection(), m_KLMDigits[i]->getLayer(),
90 m_KLMDigits[i]->getSector(), m_KLMDigits[i]->getPlane(),
91 m_KLMDigits[i]->getStrip());
92 digitVolumes.insert(vol);
93 }
94 /* Search for strips with extHits, but without signal. */
95 for (it = mapExtHit.begin(); it != mapExtHit.end();) {
96 itLower = it;
97 do {
98 ++it;
99 } while ((it != mapExtHit.end()) && (it->first == itLower->first));
100 itUpper = it;
101 if (digitVolumes.find(itLower->first) != digitVolumes.end())
102 continue;
103 /* Found: write all extHits to the data tree. */
104 for (it2 = itLower; it2 != itUpper; ++it2) {
105 extHit = it2->second;
106 hitPosition = extHit->getPosition();
107 m_Event->x = hitPosition.X();
108 m_Event->y = hitPosition.Y();
109 m_Event->z = hitPosition.Z();
110 hitGlobal.setX(hitPosition.X() / Unit::mm * CLHEP::mm);
111 hitGlobal.setY(hitPosition.Y() / Unit::mm * CLHEP::mm);
112 hitGlobal.setZ(hitPosition.Z() / Unit::mm * CLHEP::mm);
113 m_Event->stripGlobal = it2->first;
119 m_Event->strip);
120 hitLocal = (*tr) * hitGlobal;
121 l = m_GeoDat->getStripLength(m_Event->strip) / CLHEP::mm * Unit::mm;
122 m_Event->distSiPM = 0.5 * l - hitLocal.x() / CLHEP::mm * Unit::mm;
123 m_Event->distFarEnd = 0.5 * l + hitLocal.x() / CLHEP::mm * Unit::mm;
128 calibrationData->Fill();
129 }
130 }
131}
132
134{
135 delete m_TransformData;
136}
137
Calibration collector module base class.
void collect() override
This method is called for each event.
void finish() override
This method is called at the end of the event processing.
struct EKLMAlignmentAlongStripsAlgorithm::Event * m_Event
Event.
EKLM element numbers.
int stripNumber(int section, int layer, int sector, int plane, int strip) const
Get strip number.
void stripNumberToElementNumbers(int stripGlobal, int *section, int *layer, int *sector, int *plane, int *strip) const
Get element numbers by strip global number.
static constexpr int getNStripsSegment()
Get number of strips in a segment.
int segmentNumber(int section, int layer, int sector, int plane, int segment) const
Get segment number.
bool hitInEKLM(double z) const
Check if z coordinate may be in EKLM.
static const GeometryData & Instance(enum DataSource dataSource=c_Database, const GearDir *gearDir=nullptr)
Instantiation.
Definition: GeometryData.cc:33
double getStripLength(int strip) const
Get strip length.
Definition: GeometryData.h:71
Transformation data.
Definition: TransformData.h:35
@ c_Alignment
Use alignment data (for everything else).
Definition: TransformData.h:45
const HepGeom::Transform3D * getStripGlobalToLocal(KLMDigit *hit) const
Get strip global to local transformation by hit.
Store one Ext hit as a ROOT object.
Definition: ExtHit.h:31
ROOT::Math::XYZVector getPosition() const
Get position of this extrapolation hit.
Definition: ExtHit.h:144
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
Class for type safe access to objects that are referred to in relations.
size_t size() const
Get number of relations.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
static const double mm
[millimeters]
Definition: Unit.h:70
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
Abstract base class for different kinds of events.
float distFarEnd
Distance from hit to the far end of the strip.