Belle II Software development
KLMDQM2Module.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/modules/KLMDQM2/KLMDQM2Module.h>
11
12/* Basf2 headers. */
13#include <mdst/dataobjects/Track.h>
14
15/* ROOT headers. */
16#include <TDirectory.h>
17
18/* CLHEP headers. */
19#include <CLHEP/Vector/ThreeVector.h>
20
21/* C++ headers. */
22#include <string>
23
24using namespace Belle2;
25
26//-----------------------------------------------------------------
27// Register the Module
28//-----------------------------------------------------------------
29REG_MODULE(KLMDQM2);
30
31//-----------------------------------------------------------------
32// Implementation
33//-----------------------------------------------------------------
34
37 m_ElementNumbers(&(KLMElementNumbers::Instance())),
40 m_GeometryBKLM{nullptr},
41 m_MatchedHitsBKLM{nullptr},
42 m_AllExtHitsBKLM{nullptr},
43 m_MatchedHitsEKLM{nullptr},
44 m_AllExtHitsEKLM{nullptr},
49{
50 // Set module properties
51 setDescription(R"DOC(Additional Module for KLMDQM plots after HLT filters
52
53 An additional module developed to display plane efficiencies for the KLM during runs (i.e. for online analyses).
54 This module would be called after HLT filter in order to use mumu-tight skim to select reasonable events.
55 The output histograms would be plane efficiencies = MatchedDigits/AllExtits.
56 )DOC");
57
58 // Parameter definitions
59 addParam("MuonListName", m_MuonListName, "Muon list name.",
60 std::string("mu+:all"));
61 addParam("AllowedDistance1D", m_AllowedDistance1D,
62 "Maximal distance in the units of strip number from ExtHit to "
63 "matching KLMDigit (not for multi-strip hits).", double(8));
64 addParam("MinimalMatchingDigits", m_MinimalMatchingDigits,
65 "Minimal number of matching digits.", 0);
66 addParam("MinimalMatchingDigitsOuterLayers",
68 "Minimal number of matching digits in outer layers.", 0);
69 addParam("MinimalMomentumNoOuterLayers", m_MinimalMomentumNoOuterLayers,
70 "Minimal momentum in case there are no hits in outer layers.", 0.0);
71 addParam("RemoveUnusedMuons", m_RemoveUnusedMuons,
72 "Whether to remove unused muons.", false);
73 addParam("IgnoreBackwardPropagation", m_IgnoreBackwardPropagation,
74 "Whether to ignore ExtHits with backward propagation.", false);
76 addParam("histogramDirectoryName", m_HistogramDirectoryName,
77 "Directory for KLM DQM histograms in ROOT file.",
78 std::string("KLMEfficiencyDQM"));
79 addParam("SoftwareTriggerName", m_SoftwareTriggerName,
80 "Software Trigger for event selection",
81 std::string("software_trigger_cut&skim&accept_mumutight"));
82
83}
84
88
90{
91
92 TDirectory* newDirectory{gDirectory->mkdir(m_HistogramDirectoryName.c_str())};
93 TDirectory::TContext context{gDirectory, newDirectory};
94
95
98
99
100 /* Number of hits per channel. */
101 /* KLM General Related. */
102 m_MatchedHitsBKLM = new TH1F("matched_hitsBKLM",
103 "Matched Hits in BKLM Plane",
104 m_PlaneNumBKLM, 0.5, 0.5 + m_PlaneNumBKLM);
105 m_MatchedHitsBKLM->GetXaxis()->SetTitle("Layer Number");
106
107 m_AllExtHitsBKLM = new TH1F("all_ext_hitsBKLM",
108 "All ExtHits in BKLM Plane",
109 m_PlaneNumBKLM, 0.5, 0.5 + m_PlaneNumBKLM);
110 m_AllExtHitsBKLM->GetXaxis()->SetTitle("Layer number");
111
112
113
114 m_MatchedHitsEKLM = new TH1F("matched_hitsEKLM",
115 "Matched Hits in EKLM Plane",
116 m_PlaneNumEKLM, 0.5, m_PlaneNumEKLM + 0.5);
117 m_MatchedHitsEKLM->GetXaxis()->SetTitle("Plane number");
118
119 m_AllExtHitsEKLM = new TH1F("all_ext_hitsEKLM",
120 "All ExtHits in EKLM Plane",
121 m_PlaneNumEKLM, 0.5, m_PlaneNumEKLM + 0.5);
122 m_AllExtHitsEKLM->GetXaxis()->SetTitle("Plane number");
123
124
125
126 /********************/
127 /********************/
128 /* binned by sector */
129 /********************/
130 /********************/
131
132 m_MatchedHitsBKLMSector = new TH1F("matched_hitsBKLMSector",
133 "Matched Hits in BKLM Sector",
134 BKLMMaxSectors, 0.5, 0.5 + BKLMMaxSectors);
135 m_MatchedHitsBKLMSector->GetXaxis()->SetTitle("Sector Number");
136
137 m_AllExtHitsBKLMSector = new TH1F("all_ext_hitsBKLMSector",
138 "All ExtHits in BKLM Sector",
139 BKLMMaxSectors, 0.5, 0.5 + BKLMMaxSectors);
140 m_AllExtHitsBKLMSector->GetXaxis()->SetTitle("Sector number");
141
142
143
144 m_MatchedHitsEKLMSector = new TH1F("matched_hitsEKLMSector",
145 "Matched Hits in EKLM Sector",
146 EKLMMaxSectors, 0.5, EKLMMaxSectors + 0.5);
147 m_MatchedHitsEKLMSector->GetXaxis()->SetTitle("Sector number");
148
149 m_AllExtHitsEKLMSector = new TH1F("all_ext_hitsEKLMSector",
150 "All ExtHits in EKLM Sector",
151 EKLMMaxSectors, 0.5, EKLMMaxSectors + 0.5);
152 m_AllExtHitsEKLMSector->GetXaxis()->SetTitle("Sector number");
153
154}//end of defineHisto
155
157{
158 REG_HISTOGRAM;
159 //inputs
160 m_softwareTriggerResult.isOptional();
161 m_MuonList.isRequired(m_MuonListName);
162 m_Digits.isOptional();
164}
165
167{
168 //start by restarting histograms
169
170 /* KLM General Related. */
171 m_MatchedHitsBKLM->Reset();
172 m_AllExtHitsBKLM->Reset();
173 m_MatchedHitsEKLM->Reset();
174 m_AllExtHitsEKLM->Reset();
175
177 m_AllExtHitsBKLMSector->Reset();
179 m_AllExtHitsEKLMSector->Reset();
180}
181
183{
184 if (triggerFlag() || m_SoftwareTriggerName == "") {
185 unsigned int nMuons = m_MuonList->getListSize();
186 for (unsigned int i = 0; i < nMuons; ++i) {
187 const Particle* muon = m_MuonList->getParticle(i);
192
193 }
194
195 }
196}
197
199{
200
201 bool passed = false;
203 try {
205 true : false;
206 } catch (const std::out_of_range&) {
207 passed = false;
208 }
209 }
210 return passed;
211
212}
213
215 struct HitData* hitData)
216{
217 for (const KLMDigit& digit : m_Digits) {
218 if (!(digit.getSubdetector() == hitData->subdetector &&
219 digit.getSection() == hitData->section &&
220 digit.getLayer() == hitData->layer &&
221 digit.getSector() == hitData->sector &&
222 digit.getPlane() == hitData->plane) ||
223 !digit.isGood())
224 continue;
225
226 // Defining quantities for distance cut
227 double stripPosition = digit.getStrip();
228 double allowedDistance1D = m_AllowedDistance1D;
229
230 if (digit.isMultiStrip()) {
231 // Due to a firmware bug, we have to be wary with the allowed distance...
232 stripPosition = 0.5 * (digit.getLastStrip() + digit.getStrip());
233 allowedDistance1D *= (digit.getLastStrip() - digit.getStrip() + 1);
234 }
235 if (fabs(stripPosition - hitData->strip) < allowedDistance1D) {
236 hitData->digit = &digit;
237 return;
238 }
239 }
240}
241
243 std::map<KLMPlaneNumber, struct HitData>& hitMap,
244 KLMPlaneNumber planeGlobal, struct HitData* hitData)
245{
246 std::map<KLMPlaneNumber, struct HitData>::iterator it;
247 it = hitMap.find(planeGlobal);
248 /*
249 * There may be more than one such hit e.g. if track crosses the edge
250 * of the strips or WLS fiber groove. Select only one hit per plane.
251 */
252 if (it == hitMap.end()) {
253 hitMap.insert(std::pair<KLMPlaneNumber, struct HitData>(
254 planeGlobal, *hitData));
255 }
256}
257
259 const Particle* muon, TH1F* matchedHitsBKLM, TH1F* allExtHitsBKLM,
260 TH1F* matchedHitsEKLM, TH1F* allExtHitsEKLM, TH1F* matchedHitsBKLMSec, TH1F* allExtHitsBKLMSec,
261 TH1F* matchedHitsEKLMSec, TH1F* allExtHitsEKLMSec)
262{
263 const int nExtrapolationLayers =
265 const Track* track = muon->getTrack();
266 RelationVector<ExtHit> extHits = track->getRelationsTo<ExtHit>();
267 std::map<KLMPlaneNumber, struct HitData> selectedHits;
268 std::map<KLMPlaneNumber, struct HitData>::iterator it;
269 KLMChannelNumber channel;
271 struct HitData hitData, hitDataPrevious;
272 ROOT::Math::XYZVector extHitPosition;
273 CLHEP::Hep3Vector extHitPositionCLHEP, localPosition;
274 int layer;
275 int extHitLayer[nExtrapolationLayers] = {0};
276 int digitLayer[nExtrapolationLayers] = {0};
277 // initialize hitDataPrevious components
278 hitDataPrevious.subdetector = -1;
279 hitDataPrevious.section = -1;
280 hitDataPrevious.sector = -1;
281 hitDataPrevious.layer = -1;
282 for (const ExtHit& hit : extHits) {
283 /*
284 * Choose hits that exit the sensitive volume.
285 * It is not possible to use entry hits because of a bug in Geant4:
286 * the step does not always have a correct status (fGeomBoundary),
287 * and, consequently, ExtHits are not created.
288 */
289 if (hit.getStatus() != EXT_EXIT)
290 continue;
291 /*
292 * Ignore ExtHits with backward propagation. This affects cosmic events
293 * only. The removal of hits with backward propagation is normally
294 * not needed, however, it is added because of backward error propagation
295 * bug in Geant4 10.6.
296 */
298 if (hit.isBackwardPropagated())
299 continue;
300 }
301 KLMPlaneNumber planeGlobal = 0;
302 hitData.hit = &hit;
303 hitData.digit = nullptr;
304 if (hit.getDetectorID() == Const::EDetector::EKLM) {
305 int stripGlobal = hit.getCopyID();
307 m_eklmElementNumbers->stripNumberToElementNumbers(
308 stripGlobal, &hitData.section, &hitData.layer, &hitData.sector,
309 &hitData.plane, &hitData.strip);
310 channel = m_ElementNumbers->channelNumberEKLM(
311 hitData.section, hitData.sector, hitData.layer,
312 hitData.plane, hitData.strip);
313 status = m_ChannelStatus->getChannelStatus(channel);
314 if (status == KLMChannelStatus::c_Unknown)
315 B2FATAL("Incomplete KLM channel status data.");
316 if (status == KLMChannelStatus::c_Normal) {
317 layer = m_ElementNumbers->getExtrapolationLayer(
318 hitData.subdetector, hitData.layer);
319 extHitLayer[layer - 1]++;
320 planeGlobal = m_ElementNumbers->planeNumberEKLM(
321 hitData.section, hitData.sector, hitData.layer,
322 hitData.plane);
323 addHit(selectedHits, planeGlobal, &hitData);
324 }
325 } else if (hit.getDetectorID() == Const::EDetector::BKLM) {
326 int moduleNumber = hit.getCopyID();
329 moduleNumber, &hitData.section, &hitData.sector, &hitData.layer);
331 /*
332 * For scintillators, the plane and strip numbers are recorded
333 * in the copy number.
334 */
336 moduleNumber, &hitData.section, &hitData.sector, &hitData.layer,
337 &hitData.plane, &hitData.strip);
338 channel = m_ElementNumbers->channelNumberBKLM(
339 hitData.section, hitData.sector, hitData.layer,
340 hitData.plane, hitData.strip);
341 status = m_ChannelStatus->getChannelStatus(channel);
342 if (status == KLMChannelStatus::c_Unknown)
343 B2FATAL("Incomplete KLM channel status data.");
344 if (status == KLMChannelStatus::c_Normal) {
345 layer = m_ElementNumbers->getExtrapolationLayer(
346 hitData.subdetector, hitData.layer);
347 extHitLayer[layer - 1]++;
348 planeGlobal = m_ElementNumbers->planeNumberBKLM(
349 hitData.section, hitData.sector, hitData.layer,
350 hitData.plane);
351 addHit(selectedHits, planeGlobal, &hitData);
352 }
353 } else {
354 /* For RPCs, the sensitive volume corresponds to both readout planes. */
355 extHitPosition = hit.getPosition();
356 extHitPositionCLHEP.setX(extHitPosition.X());
357 extHitPositionCLHEP.setY(extHitPosition.Y());
358 extHitPositionCLHEP.setZ(extHitPosition.Z());
359 const bklm::Module* module =
360 m_GeometryBKLM->findModule(hitData.section, hitData.sector,
361 hitData.layer);
362 localPosition = module->globalToLocal(extHitPositionCLHEP);
364 hitData.strip = module->getZStrip(localPosition);
365 /*
366 * FIXME:
367 * There are 2 hits per module in RPCs, but the plane information is
368 * not available in ExtHit. For now, 2 entries are created (one for
369 * each plane) for the first hit, and the second one is removed.
370 */
371 if ((hitData.subdetector == hitDataPrevious.subdetector) &&
372 (hitData.section == hitDataPrevious.section) &&
373 (hitData.sector == hitDataPrevious.sector) &&
374 (hitData.layer == hitDataPrevious.layer))
375 continue;
376 std::memcpy(&hitDataPrevious, &hitData, sizeof(struct HitData));
377 /* The returned strip may be out of the valid range. */
379 hitData.section, hitData.sector, hitData.layer, hitData.plane,
380 hitData.strip, false)) {
381 channel = m_ElementNumbers->channelNumberBKLM(
382 hitData.section, hitData.sector, hitData.layer,
383 hitData.plane, hitData.strip);
384 status = m_ChannelStatus->getChannelStatus(channel);
385 if (status == KLMChannelStatus::c_Unknown)
386 B2FATAL("Incomplete KLM channel status data.");
387 if (status == KLMChannelStatus::c_Normal) {
388 layer = m_ElementNumbers->getExtrapolationLayer(
389 hitData.subdetector, hitData.layer);
390 extHitLayer[layer - 1]++;
391 hitData.localPosition = localPosition.z();
392 planeGlobal = m_ElementNumbers->planeNumberBKLM(
393 hitData.section, hitData.sector, hitData.layer,
394 hitData.plane);
395 addHit(selectedHits, planeGlobal, &hitData);
396 }
397 }
399 hitData.strip = module->getPhiStrip(localPosition);
400 /* The returned strip may be out of the valid range. */
402 hitData.section, hitData.sector, hitData.layer, hitData.plane,
403 hitData.strip, false)) {
404 channel = m_ElementNumbers->channelNumberBKLM(
405 hitData.section, hitData.sector, hitData.layer,
406 hitData.plane, hitData.strip);
407 status = m_ChannelStatus->getChannelStatus(channel);
408 if (status == KLMChannelStatus::c_Unknown)
409 B2FATAL("Incomplete KLM channel status data.");
410 if (status == KLMChannelStatus::c_Normal) {
411 layer = m_ElementNumbers->getExtrapolationLayer(
412 hitData.subdetector, hitData.layer);
413 extHitLayer[layer - 1]++;
414 hitData.localPosition = localPosition.y();
415 planeGlobal = m_ElementNumbers->planeNumberBKLM(
416 hitData.section, hitData.sector, hitData.layer,
417 hitData.plane);
418 addHit(selectedHits, planeGlobal, &hitData);
419 } //end of channel status check
420 } //end of channel number check
421 }//end of detector condition
422 } else
423 continue;
424 }
425 /* Find matching digits. */
426 int nDigits = 0;
427 for (it = selectedHits.begin(); it != selectedHits.end(); ++it) {
428 findMatchingDigit(&(it->second));
429 if (it->second.digit != nullptr) {
430 nDigits++;
431 layer = m_ElementNumbers->getExtrapolationLayer(
432 it->second.subdetector, it->second.layer);
433 digitLayer[layer - 1]++;
434 }
435 }
436 if (nDigits < m_MinimalMatchingDigits)
437 return false;
438 /* Write efficiency histograms */
439 for (it = selectedHits.begin(); it != selectedHits.end(); ++it) {
440 int matchingDigits = 0;
441 int matchingDigitsOuterLayers = 0;
442 int extHitsOuterLayers = 0;
443 layer = m_ElementNumbers->getExtrapolationLayer(
444 it->second.subdetector, it->second.layer) - 1;
445 for (int i = 0; i < nExtrapolationLayers; ++i) {
446 if (i != layer)
447 matchingDigits += digitLayer[i];
448 if (i > layer) {
449 matchingDigitsOuterLayers += digitLayer[i];
450 extHitsOuterLayers += extHitLayer[i];
451 }
452 }
453 /* Check the number of matching digits in other layers. */
454 if (matchingDigits < m_MinimalMatchingDigits)
455 continue;
456 /*
457 * Check the number of matching digits in outer layers relatively to
458 * this hit.
459 */
460 if (matchingDigitsOuterLayers < m_MinimalMatchingDigitsOuterLayers) {
466 if (extHitsOuterLayers >= m_MinimalMatchingDigitsOuterLayers)
467 continue;
468 /*
469 * If the number of ExtHits is insufficient, then check the momentum.
470 * The muons with sufficiently large momentum have a very small
471 * probability to get absorbed in the detector.
472 */
474 continue;
475 }
476 //Filling AddExtHits and MatchedHits histograms
477 if (it->second.subdetector == KLMElementNumbers::c_EKLM) {
478 int planeNum = m_eklmElementNumbers->planeNumber(it->second.section, it->second.layer, it->second.sector, it->second.plane);
479 int sectorNum = (it->second.section - 1) * EKLMElementNumbers::getMaximalSectorNumber() + it->second.sector;
480 allExtHitsEKLM->Fill(planeNum);
481 allExtHitsEKLMSec->Fill(sectorNum);
482 if (it->second.digit) {
483 matchedHitsEKLM->Fill(planeNum);
484 matchedHitsEKLMSec->Fill(sectorNum);
485 }
486 }//end of if loop
487
488
489 else if (it->second.subdetector == KLMElementNumbers::c_BKLM) {
491 it->second.section, it->second.sector, it->second.layer);
492 int sectorGlobal = it->second.section * BKLMElementNumbers::getMaximalSectorNumber() + (it->second.sector);
493 allExtHitsBKLM->Fill(layerGlobal);
494 allExtHitsBKLMSec->Fill(sectorGlobal);
495 if (it->second.digit) {
496 matchedHitsBKLM->Fill(layerGlobal);
497 matchedHitsBKLMSec->Fill(sectorGlobal);
498 }
499 } else {
500 B2FATAL("Had a hit that didn't come from BKLM or EKLM?");
501 }
502
503 } //end of selectedHits for loop
504 return true;
505} //end of collectTrackData
static void channelNumberToElementNumbers(KLMChannelNumber channel, int *section, int *sector, int *layer, int *plane, int *strip)
Get element numbers by channel number.
static bool checkChannelNumber(int section, int sector, int layer, int plane, int strip, bool fatalError=true)
Check channel number.
@ c_FirstRPCLayer
First RPC layer.
static constexpr int getMaximalSectorNumber()
Get maximal sector number (1-based).
static void moduleNumberToElementNumbers(KLMModuleNumber module, int *section, int *sector, int *layer)
Get element numbers by module number.
static constexpr int getMaximalSectorGlobalNumber()
Get maximal sector global number.
static int layerGlobalNumber(int section, int sector, int layer)
Get layer global number.
static constexpr int getMaximalSectorNumber()
Get maximal sector number.
static constexpr int getMaximalSectorGlobalNumberKLMOrder()
Get maximal sector global number with KLM ordering (section, sector).
Store one Ext hit as a ROOT object.
Definition ExtHit.h:31
HistoModule()
Constructor.
Definition HistoModule.h:32
@ c_Normal
Normally operating channel.
@ c_Unknown
Unknown status (no data).
TH1F * m_MatchedHitsBKLMSector
Matched hits in sector for BKLM.
TH1F * m_MatchedHitsEKLM
Matched hits in plane for EKLM.
const bklm::GeometryPar * m_GeometryBKLM
BKLM geometry.
void addHit(std::map< KLMPlaneNumber, struct HitData > &hitMap, KLMPlaneNumber planeGlobal, struct HitData *hitData)
Add hit to map.
StoreArray< KLMDigit > m_Digits
KLM digits.
DBObjPtr< KLMChannelStatus > m_ChannelStatus
Channel status.
TH1F * m_AllExtHitsBKLMSector
Extrapolated hits in sector for BKLM.
virtual void initialize() override
Register input and output data.
double m_MinimalMomentumNoOuterLayers
Minimal momentum in case there are no hits in outer layers.
bool m_RemoveUnusedMuons
Whether to remove unused muons.
virtual void event() override
Selection for mumu_tight_skim, then DQM plot filling.
const KLMElementNumbers * m_ElementNumbers
KLM element numbers.
const KLMPlaneArrayIndex * m_PlaneArrayIndex
Plane array index.
const EKLMElementNumbers * m_eklmElementNumbers
EKLM element numbers.
void findMatchingDigit(struct HitData *hitData)
Find matching digit.
std::string m_SoftwareTriggerName
Software Trigger Name.
TH1F * m_AllExtHitsEKLMSector
Extrapolated hits in sector for EKLM.
TH1F * m_MatchedHitsBKLM
Matched hits in plane for BKLM.
~KLMDQM2Module() override
Destructor.
StoreObjPtr< ParticleList > m_MuonList
Muons.
virtual void beginRun() override
Called when entering a new run.
bool m_IgnoreBackwardPropagation
Whether to ignore ExtHits with backward propagation.
double m_AllowedDistance1D
Maximal distance in the units of strip number from ExtHit to matching KLMDigit.
KLMDQM2Module()
Constructor: Sets the description, the properties and the parameters of the module.
TH1F * m_AllExtHitsBKLM
Extrapolated hits in plane for BKLM.
TH1F * m_MatchedHitsEKLMSector
Matched hits in sector for EKLM.
const int m_PlaneNumBKLM
Number of layers/planes for BKLM.
int m_MinimalMatchingDigitsOuterLayers
Minimal number of matching digits in outer layers.
std::string m_MuonListName
Muon list name.
int m_MinimalMatchingDigits
Minimal number of matching digits.
StoreObjPtr< SoftwareTriggerResult > m_softwareTriggerResult
Trigger Information.
const int m_PlaneNumEKLM
Number of layers/planes for EKLM.
TH1F * m_AllExtHitsEKLM
Extrapolated hits in plane for EKLM.
bool collectDataTrack(const Particle *muon, TH1F *matchedHitsBKLM, TH1F *allExtHitsBKLM, TH1F *matchedHitsEKLM, TH1F *allExtHitsEKLM, TH1F *matchedHitsBKLMSec, TH1F *allExtHitsBKLMSec, TH1F *matchedHitsEKLMSec, TH1F *allExtHitsEKLMSec)
Collect the data for one muon.
bool triggerFlag()
Uses TrigResult along with desired software cut to determine whether histograms are filled or not for...
std::string m_HistogramDirectoryName
Directory for KLM DQM histograms in ROOT file.
void defineHisto() override
Definition of the histograms.
KLM digit (class representing a digitized hit in RPCs or scintillators).
Definition KLMDigit.h:29
static constexpr int getMaximalExtrapolationLayer()
Get maximal extrapolation layer.
KLM plane array index.
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 to store reconstructed particles.
Definition Particle.h:76
const Track * getTrack() const
Returns the pointer to the Track object that was used to create this Particle (ParticleType == c_Trac...
Definition Particle.cc:916
double getP() const
Returns momentum magnitude (same as getMomentumMagnitude but with shorter name)
Definition Particle.h:598
Class for type safe access to objects that are referred to in relations.
Class that bundles various TrackFitResults.
Definition Track.h:25
static GeometryPar * instance(void)
Static method to get a reference to the singleton GeometryPar instance.
Define the geometry of a BKLM module Each sector [octant] contains Modules.
Definition Module.h:76
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
uint16_t KLMChannelNumber
Channel number.
uint16_t KLMPlaneNumber
Plane number.
Abstract base class for different kinds of events.
double localPosition
Local coordinate.
const KLMDigit * digit
Digit.
const ExtHit * hit
Extrapolation hit.