10 #include <klm/modules/KLMClustersReconstructor/KLMClustersReconstructorModule.h>
13 #include <klm/dataobjects/bklm/BKLMElementNumbers.h>
14 #include <klm/dataobjects/eklm/EKLMElementNumbers.h>
15 #include <klm/modules/KLMClustersReconstructor/KLMHit2d.h>
25 m_PositionMode(c_FirstLayer),
26 m_ClusterMode(c_AnyHit)
28 setDescription(
"Unified BKLM/EKLM module for the reconstruction of KLMClusters.");
29 setPropertyFlags(c_ParallelProcessingCertified);
30 addParam(
"ClusteringAngle", m_ClusteringAngle,
"Clustering angle (rad).",
32 addParam(
"PositionMode", m_PositionModeString,
33 "Vertex position calculation mode ('FullAverage' or 'FirstLayer').",
34 std::string(
"FirstLayer"));
35 addParam(
"ClusterMode", m_ClusterModeString,
36 "Clusterization mode ('AnyHit' or 'FirstHit').",
37 std::string(
"AnyHit"));
56 B2FATAL(
"Incorrect PositionMode argument.");
62 B2FATAL(
"Incorrect ClusterMode argument.");
77 int i, nLayers, innermostLayer, nHits;
80 int* layerHitsBKLM, *layerHitsEKLM;
83 std::vector<KLMHit2d> klmHit2ds, klmClusterHits;
84 std::vector<KLMHit2d>::iterator it, it0, it2;
87 layerHitsBKLM =
new int[nLayersBKLM];
88 layerHitsEKLM =
new int[nLayersEKLM];
91 for (i = 0; i < nHitsBKLM; i++) {
97 for (i = 0; i < nHitsEKLM; i++) {
101 sort(klmHit2ds.begin(), klmHit2ds.end(), compareDistance);
103 while (klmHit2ds.size() > 0) {
104 klmClusterHits.clear();
105 it = klmHit2ds.begin();
106 klmClusterHits.push_back(*it);
107 it = klmHit2ds.erase(it);
108 while (it != klmHit2ds.end()) {
109 it2 = klmClusterHits.begin();
112 while (it2 != klmClusterHits.end()) {
113 if (it->getPosition().Angle(it2->getPosition()) <
115 klmClusterHits.push_back(*it);
116 it = klmHit2ds.erase(it);
123 if (it->getPosition().Angle(it2->getPosition()) <
125 klmClusterHits.push_back(*it);
126 it = klmHit2ds.erase(it);
137 for (i = 0; i < nLayersBKLM; i++)
138 layerHitsBKLM[i] = 0;
139 for (i = 0; i < nLayersEKLM; i++)
140 layerHitsEKLM[i] = 0;
142 it0 = klmClusterHits.begin();
144 for (it = klmClusterHits.begin(); it != klmClusterHits.end(); ++it) {
145 if ((it->getLayer() == it0->getLayer() &&
147 hitPos = hitPos + it->getPosition();
150 if (minTime < 0 || it->getTime() < minTime)
151 minTime = it->getTime();
153 layerHitsBKLM[it->getLayer() - 1]++;
155 layerHitsEKLM[it->getLayer() - 1]++;
157 hitPos = hitPos * (1.0 / nHits);
161 for (i = 0; i < nLayersBKLM; i++) {
162 if (layerHitsBKLM[i] > 0) {
164 if (innermostLayer < 0)
165 innermostLayer = i + 1;
168 for (i = 0; i < nLayersEKLM; i++) {
169 if (layerHitsEKLM[i] > 0) {
171 if (innermostLayer < 0)
172 innermostLayer = i + 1;
181 p = klmClusterHits.size() * 0.215;
191 hitPos.x(), hitPos.y(), hitPos.z(), minTime, nLayers,
193 for (it = klmClusterHits.begin(); it != klmClusterHits.end(); ++it) {
200 delete[] layerHitsBKLM;
201 delete[] layerHitsEKLM;
static constexpr int getMaximalLayerNumber()
Get maximal layer number (1-based).
static constexpr int getMaximalLayerNumber()
Get maximal layer number.
Module KLMClustersReconstructorModule.
~KLMClustersReconstructorModule()
Destructor.
enum ClusterMode m_ClusterMode
Clusterization mode.
void initialize() override
Initializer.
void event() override
This method is called for each event.
void endRun() override
This method is called if the current run ends.
void terminate() override
This method is called at the end of the event processing.
std::string m_PositionModeString
Vertex position calculation mode.
enum PositionMode m_PositionMode
Vertex position calculation mode.
std::string m_ClusterModeString
Clusterization mode.
@ c_FullAverage
Full average.
@ c_FirstLayer
First layer only.
StoreArray< BKLMHit2d > m_BKLMHit2ds
BKLM 2d hits.
void beginRun() override
Called when entering a new run.
StoreArray< EKLMHit2d > m_EKLMHit2ds
EKLM 2d hits.
double m_ClusteringAngle
Clustering angle.
StoreArray< KLMCluster > m_KLMClusters
KLM clusters.
@ c_FirstHit
Angle from first hit.
@ c_AnyHit
Angle from any hit.
Class for simultaneous handling of the BKLM and EKLM 2d hits.
TVector3 getPosition() const
Get hit position.
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.