12 #include <klm/modules/KLMClustersReconstructor/KLMClustersReconstructorModule.h>
15 #include <klm/dataobjects/bklm/BKLMElementNumbers.h>
16 #include <klm/dataobjects/eklm/EKLMElementNumbers.h>
17 #include <klm/modules/KLMClustersReconstructor/KLMHit2d.h>
27 m_PositionMode(c_FirstLayer),
28 m_ClusterMode(c_AnyHit)
30 setDescription(
"Unified BKLM/EKLM module for the reconstruction of KLMClusters.");
31 setPropertyFlags(c_ParallelProcessingCertified);
32 addParam(
"ClusteringAngle", m_ClusteringAngle,
"Clustering angle (rad).",
34 addParam(
"PositionMode", m_PositionModeString,
35 "Vertex position calculation mode ('FullAverage' or 'FirstLayer').",
36 std::string(
"FirstLayer"));
37 addParam(
"ClusterMode", m_ClusterModeString,
38 "Clusterization mode ('AnyHit' or 'FirstHit').",
39 std::string(
"AnyHit"));
58 B2FATAL(
"Incorrect PositionMode argument.");
64 B2FATAL(
"Incorrect ClusterMode argument.");
79 int i, nLayers, innermostLayer, nHits;
82 int* layerHitsBKLM, *layerHitsEKLM;
85 std::vector<KLMHit2d> klmHit2ds, klmClusterHits;
86 std::vector<KLMHit2d>::iterator it, it0, it2;
89 layerHitsBKLM =
new int[nLayersBKLM];
90 layerHitsEKLM =
new int[nLayersEKLM];
93 for (i = 0; i < nHitsBKLM; i++) {
99 for (i = 0; i < nHitsEKLM; i++) {
103 sort(klmHit2ds.begin(), klmHit2ds.end(), compareDistance);
105 while (klmHit2ds.size() > 0) {
106 klmClusterHits.clear();
107 it = klmHit2ds.begin();
108 klmClusterHits.push_back(*it);
109 it = klmHit2ds.erase(it);
110 while (it != klmHit2ds.end()) {
111 it2 = klmClusterHits.begin();
114 while (it2 != klmClusterHits.end()) {
115 if (it->getPosition().Angle(it2->getPosition()) <
117 klmClusterHits.push_back(*it);
118 it = klmHit2ds.erase(it);
125 if (it->getPosition().Angle(it2->getPosition()) <
127 klmClusterHits.push_back(*it);
128 it = klmHit2ds.erase(it);
139 for (i = 0; i < nLayersBKLM; i++)
140 layerHitsBKLM[i] = 0;
141 for (i = 0; i < nLayersEKLM; i++)
142 layerHitsEKLM[i] = 0;
144 it0 = klmClusterHits.begin();
146 for (it = klmClusterHits.begin(); it != klmClusterHits.end(); ++it) {
147 if ((it->getLayer() == it0->getLayer() &&
149 hitPos = hitPos + it->getPosition();
152 if (minTime < 0 || it->getTime() < minTime)
153 minTime = it->getTime();
155 layerHitsBKLM[it->getLayer() - 1]++;
157 layerHitsEKLM[it->getLayer() - 1]++;
159 hitPos = hitPos * (1.0 / nHits);
163 for (i = 0; i < nLayersBKLM; i++) {
164 if (layerHitsBKLM[i] > 0) {
166 if (innermostLayer < 0)
167 innermostLayer = i + 1;
170 for (i = 0; i < nLayersEKLM; i++) {
171 if (layerHitsEKLM[i] > 0) {
173 if (innermostLayer < 0)
174 innermostLayer = i + 1;
183 p = klmClusterHits.size() * 0.215;
193 hitPos.x(), hitPos.y(), hitPos.z(), minTime, nLayers,
195 for (it = klmClusterHits.begin(); it != klmClusterHits.end(); ++it) {
202 delete[] layerHitsBKLM;
203 delete[] layerHitsEKLM;