10#include <klm/modules/KLMEventT0Estimator/KLMEventT0EstimatorModule.h>
13#include <klm/bklm/geometry/Module.h>
14#include <klm/dataobjects/bklm/BKLMElementNumbers.h>
15#include <klm/dataobjects/eklm/EKLMElementNumbers.h>
18#include <framework/gearbox/Const.h>
19#include <framework/logging/Logger.h>
20#include <framework/datastore/DataStore.h>
23using namespace Belle2::bklm;
24using namespace Belle2::EKLM;
30KLMEventT0EstimatorModule::KLMEventT0EstimatorModule() :
36 setDescription(
"Estimate per-event T0 using KLM digits matched to extrapolated tracks (BKLM/EKLM scintillators and RPC) with per-event track averages, uncertainties, and final combined KLM value.");
37 setPropertyFlags(c_ParallelProcessingCertified);
39 addParam(
"MuonListName", m_MuonListName,
40 "Muon (or generic) ParticleList name used to access tracks and KLM relations (e.g. 'mu+:forT0').",
41 std::string(
"mu+:forT0"));
42 addParam(
"useCDCTemporaryT0", m_useCDCTemporaryT0,
43 "Read CDC temporary EventT0 as a seed/diagnostic (not applied to the mean).",
45 addParam(
"IgnoreBackwardPropagation", m_ignoreBackward,
46 "Ignore backward-propagated ExtHits when forming entry/exit pairs.",
48 addParam(
"histogramDirectoryName", m_histDirName,
49 "Top directory for KLMEventT0Estimator histograms inside the ROOT file.",
50 std::string(
"KLMEventT0Estimator"));
51 addParam(
"histogramSubdirUncorrected", m_histSubdirUncorr,
52 "Subdirectory name for uncorrected timing histograms.",
53 std::string(
"uncorrected"));
56 addParam(
"ADCCut_BKLM_Scint_Min", m_ADCCut_BKLM_Scint_Min,
57 "Minimum ADC charge cut for BKLM scintillator. Set to 0 to disable lower cut.",
59 addParam(
"ADCCut_BKLM_Scint_Max", m_ADCCut_BKLM_Scint_Max,
60 "Maximum ADC charge cut for BKLM scintillator. Set to large value to disable upper cut.",
62 addParam(
"ADCCut_EKLM_Scint_Min", m_ADCCut_EKLM_Scint_Min,
63 "Minimum ADC charge cut for EKLM scintillator. Set to 0 to disable lower cut.",
65 addParam(
"ADCCut_EKLM_Scint_Max", m_ADCCut_EKLM_Scint_Max,
66 "Maximum ADC charge cut for EKLM scintillator. Set to large value to disable upper cut.",
71KLMEventT0EstimatorModule::~KLMEventT0EstimatorModule()
81 TDirectory* topdir = gDirectory->mkdir(
m_histDirName.c_str());
82 TDirectory::TContext ctxTop{gDirectory, topdir};
87 auto H1 = [](
const char* n,
const char* t,
int nb,
double lo,
double hi) {
88 return new TH1D(n, t, nb, lo, hi);
93 TDirectory::TContext ctxUnc{gDirectory, d_unc};
96 TDirectory* d_per_track = d_unc->mkdir(
"per_track");
98 TDirectory::TContext ctxTrk{gDirectory, d_per_track};
99 m_hT0Trk_BKLM_Scint = H1(
"h_t0trk_bklm_scint",
"Per-track T0 (BKLM Scint);T0 [ns]", 800, -100, 100);
100 m_hT0Trk_BKLM_RPC = H1(
"h_t0trk_bklm_rpc",
"Per-track T0 (BKLM RPC);T0 [ns]", 800, -100, 100);
101 m_hT0Trk_EKLM_Scint = H1(
"h_t0trk_eklm_scint",
"Per-track T0 (EKLM Scint);T0 [ns]", 800, -100, 100);
105 TDirectory* d_per_event = d_unc->mkdir(
"per_event");
107 TDirectory::TContext ctxEvt{gDirectory, d_per_event};
116 m_hT0Evt_TrkAvg_All = H1(
"h_t0evt_trkavg_all",
"Per-event T0 (track-avg, all categories);T0 [ns]", 800, -100,
121 m_hT0Evt_TrkAvg_All_SEM = H1(
"h_t0evt_trkavg_all_sem",
"SEM (track-avg, all categories);SEM [ns]", 800, 0.0, 20.0);
124 m_hFinalSource =
new TH1I(
"h_final_source",
"Final KLM source;;events", 7, 0.5, 7.5);
154 B2DEBUG(20,
"KLMEventT0Estimator: ADC cuts configured:"
164 B2FATAL(
"KLMEventT0Estimator: KLM EventT0 hit resolution data are not available.");
166 B2DEBUG(20,
"KLMEventT0Estimator: Using calibrated per-hit resolution."
197 B2ERROR(
"KLMEventT0Estimator: Calibrated hit resolution payload not available!");
223 ExtHit* entryHit =
nullptr;
224 ExtHit* exitHit =
nullptr;
225 auto itlow = v_ExtHits.lower_bound(key);
226 auto itup = v_ExtHits.upper_bound(key);
227 for (
auto it = itlow; it != itup; ++it) {
228 if (!entryHit || it->second.
getTOF() < entryHit->
getTOF()) entryHit = &(it->second);
229 if (!exitHit || it->second.
getTOF() > exitHit->
getTOF()) exitHit = &(it->second);
231 return std::make_pair(entryHit, exitHit);
244 for (
const ExtHit& eHit : extHits) {
245 if (eHit.getStatus() != EXT_EXIT)
continue;
248 const bool isB = (eHit.getDetectorID() == Const::EDetector::BKLM);
249 const bool isE = (eHit.getDetectorID() == Const::EDetector::EKLM);
250 if (!isB && !isE)
continue;
252 int copyId = eHit.getCopyID();
253 int tFor, tSec, tLay, tPla, tStr;
259 &tFor, &tLay, &tSec, &tPla, &tStr);
264 &tFor, &tSec, &tLay, &tPla, &tStr);
266 if (tSub < 0)
continue;
269 const bool crossed = muidLikelihood
270 ? muidLikelihood->isExtrapolatedBarrelLayerCrossed(tLay - 1)
272 if (!crossed)
continue;
278 unsigned int moduleKey =
280 rpcMap.insert(std::make_pair(moduleKey, eHit));
283 unsigned int channelKey =
284 m_elementNum->channelNumber(tSub, tFor, tSec, tLay, tPla, tStr);
288 scintMap.insert(std::make_pair(channelKey, eHit));
293 const bool crossed = muidLikelihood
294 ? muidLikelihood->isExtrapolatedEndcapLayerCrossed(tLay - 1)
296 if (!crossed)
continue;
298 unsigned int channelKey =
299 m_elementNum->channelNumber(tSub, tFor, tSec, tLay, tPla, tStr);
303 scintMap.insert(std::make_pair(channelKey, eHit));
312 inline void acc_stat_weighted(
double t,
double sigma,
double& sumW,
double& sumWT)
314 if (sigma <= 0.0 || !std::isfinite(sigma))
return;
315 const double w = 1.0 / (sigma * sigma);
324 double& sumW,
double& sumWT)
329 const double delayScint = timeConstants.isValid()
335 for (
const KLMHit2d& hit2d : klmHit2ds) {
339 if (digits.size() == 0)
continue;
342 if (!d.isGood())
continue;
344 unsigned int cid = d.getUniqueChannelID();
354 ExtPair ex =
const_cast<KLMEventT0EstimatorModule*
>(
this)->
matchExt(cid,
const_cast<ExtMap&
>(scintMap));
355 if (!ex.first || !ex.second)
continue;
356 const double flyTime = 0.5 * (ex.first->getTOF() + ex.second->getTOF());
359 const ROOT::Math::XYZVector posGlobExt = 0.5 * (ex.first->getPosition() + ex.second->getPosition());
360 hitGlobal_ext.setX(posGlobExt.X() /
Unit::mm * CLHEP::mm);
361 hitGlobal_ext.setY(posGlobExt.Y() /
Unit::mm * CLHEP::mm);
362 hitGlobal_ext.setZ(posGlobExt.Z() /
Unit::mm * CLHEP::mm);
364 const double Lmm =
m_geoParE->getStripLength(d.getStrip()) / CLHEP::mm *
Unit::mm;
365 const HepGeom::Transform3D* tr =
m_transformE->getStripGlobalToLocal(
const_cast<KLMDigit*
>(&d));
366 hitLocal_ext = (*tr) * hitGlobal_ext;
367 const double dist_mm = 0.5 * Lmm - hitLocal_ext.x() / CLHEP::mm *
Unit::mm;
370 const double Trec = d.getTime();
371 const double Tcable = timeCableDelay.isValid() ? timeCableDelay->getTimeDelay(cid) : 0.0;
372 const double Tprop = dist_mm * delayScint;
373 const double Tfly = flyTime;
377 if (timeCableDelay.isValid()) t -= Tcable;
380 const double t0_est = t - Tfly;
381 if (!std::isfinite(t0_est))
continue;
385 acc_stat_weighted(t0_est, sigma, sumW, sumWT);
393 double& sumW,
double& sumWT)
398 const double delayScint = timeConstants.isValid()
404 if (hit2d.inRPC())
continue;
405 if (hit2d.isOutOfTime())
continue;
408 if (b1ds.
size() == 0)
continue;
410 const bklm::Module* mod =
m_geoParB->findModule(hit2d.getSection(), hit2d.getSector(), hit2d.getLayer());
411 const ROOT::Math::XYZVector posG2d = hit2d.getPosition();
417 if (d.inRPC() || !d.isGood())
continue;
419 unsigned int cid = d.getUniqueChannelID();
429 ExtPair p =
const_cast<KLMEventT0EstimatorModule*
>(
this)->
matchExt(cid,
const_cast<ExtMap&
>(scintMap));
430 if (!p.first || !p.second)
continue;
432 const double flyTime = 0.5 * (p.first->getTOF() + p.second->getTOF());
433 const ROOT::Math::XYZVector posGext = 0.5 * (p.first->getPosition() + p.second->getPosition());
436 const CLHEP::Hep3Vector locExt = mod->globalToLocal(CLHEP::Hep3Vector(posGext.X(), posGext.Y(), posGext.Z()),
true);
437 const CLHEP::Hep3Vector locHit2 = mod->globalToLocal(CLHEP::Hep3Vector(posG2d.X(), posG2d.Y(), posG2d.Z()),
true);
438 const CLHEP::Hep3Vector diff = locExt - locHit2;
439 if (std::fabs(diff.z()) > mod->getZStripWidth() || std::fabs(diff.y()) > mod->getPhiStripWidth())
continue;
442 const bool isPhiReadout = h1d.isPhiReadout();
443 double propaLen = mod->getPropagationDistance(locExt, d.getStrip(), isPhiReadout);
446 const double Trec = d.getTime();
447 const double Tcable = timeCableDelay.isValid() ? timeCableDelay->getTimeDelay(cid) : 0.0;
448 const double Tprop = propaLen * delayScint;
449 const double Tfly = flyTime;
452 if (timeCableDelay.isValid()) t -= Tcable;
455 const double t0_est = t - Tfly;
456 if (!std::isfinite(t0_est))
continue;
460 acc_stat_weighted(t0_est, sigma, sumW, sumWT);
469 double& sumW,
double& sumWT)
474 const double delayPhi = timeConstants.isValid()
477 const double delayZ = timeConstants.isValid()
483 if (!hit2d.inRPC())
continue;
484 if (hit2d.isOutOfTime())
continue;
487 if (b1ds.
size() == 0)
continue;
489 const bklm::Module* mod =
m_geoParB->findModule(hit2d.getSection(), hit2d.getSector(), hit2d.getLayer());
490 const ROOT::Math::XYZVector posG2d = hit2d.getPosition();
493 const bool isPhi = h1d.isPhiReadout();
497 if (!d.inRPC())
continue;
499 unsigned int cid = d.getUniqueChannelID();
503 if (!d.isGood())
continue;
506 unsigned int moduleKey =
m_elementNum->moduleNumber(d.getSubdetector(), d.getSection(), d.getSector(), d.getLayer());
507 ExtPair p =
const_cast<KLMEventT0EstimatorModule*
>(
this)->
matchExt(moduleKey,
const_cast<ExtMap&
>(rpcMap));
508 if (!p.first || !p.second)
continue;
510 const double flyTime = 0.5 * (p.first->getTOF() + p.second->getTOF());
511 const ROOT::Math::XYZVector posGext = 0.5 * (p.first->getPosition() + p.second->getPosition());
513 const CLHEP::Hep3Vector locExt = mod->globalToLocal(CLHEP::Hep3Vector(posGext.X(), posGext.Y(), posGext.Z()),
true);
514 const CLHEP::Hep3Vector locHit2 = mod->globalToLocal(CLHEP::Hep3Vector(posG2d.X(), posG2d.Y(), posG2d.Z()),
true);
516 const CLHEP::Hep3Vector diff = locExt - locHit2;
517 if (std::fabs(diff.z()) > mod->getZStripWidth() || std::fabs(diff.y()) > mod->getPhiStripWidth())
continue;
519 const CLHEP::Hep3Vector propaV = mod->getPropagationDistance(locExt);
520 const double propaDist = isPhi ? propaV.y() : propaV.z();
523 const double Trec = d.getTime();
524 const double Tcable = timeCableDelay.isValid() ? timeCableDelay->getTimeDelay(cid) : 0.0;
525 const double Tprop = propaDist * (isPhi ? delayPhi : delayZ);
526 const double Tfly = flyTime;
529 if (timeCableDelay.isValid()) t -= Tcable;
532 const double t0_est = t - Tfly;
533 if (!std::isfinite(t0_est))
continue;
538 acc_stat_weighted(t0_est, sigma, sumW, sumWT);
552 if (evtT0.
isValid() && evtT0->hasTemporaryEventT0(Const::EDetector::CDC)) {
553 const auto best = evtT0->getBestCDCTemporaryEventT0();
558 if (!
m_MuonList.isValid()) { B2WARNING(
"KLMEventT0Estimator: ParticleList '" <<
m_MuonListName <<
"' not found.");
return; }
559 const unsigned nTracks =
m_MuonList->getListSize();
560 if (nTracks == 0u)
return;
563 auto weighted_result = [](
double wsum,
double wtsum) -> std::pair<double, double> {
564 if (wsum <= 0.0)
return {NAN, NAN};
565 return {wtsum / wsum, std::sqrt(1.0 / wsum)};
569 auto mean_sem_tracks = [](
const std::vector<std::pair<double, double>>& v) -> std::pair<double, double> {
570 if (v.empty())
return {NAN, NAN};
573 return {v[0].first, std::isfinite(v[0].second) ? v[0].second : 0.0};
576 bool allValid =
true;
577 for (
const auto& [t0, sem] : v)
579 if (!std::isfinite(sem) || sem <= 0.0) { allValid =
false;
break; }
584 double wsum = 0.0, wtsum = 0.0;
585 for (
const auto& [t0, sem] : v) {
586 const double w = 1.0 / (sem * sem);
591 return {wtsum / wsum, std::sqrt(1.0 / wsum)};
597 for (
const auto& [t0, sem] : v) s += t0;
598 const double mu = s / v.size();
600 for (
const auto& [t0, sem] : v) {
const double d = t0 - mu; ss += d * d; }
601 const double var = (v.size() > 1) ? ss / (v.size() - 1) : 0.0;
602 return {mu, std::sqrt(var / v.size())};
606 std::vector<std::pair<double, double>> vTrk_B, vTrk_R, vTrk_E, vTrk_All;
608 for (
unsigned i = 0; i < nTracks; ++i) {
610 if (!particle)
continue;
611 const Track* track = particle->getTrack();
612 if (!track)
continue;
615 if (hit2ds.
size() == 0)
continue;
623 double wE = 0, wTE = 0;
626 double wB = 0, wTB = 0;
629 double wR = 0, wTR = 0;
634 auto [muB, seB] = weighted_result(wB, wTB);
636 if (std::isfinite(muB)) vTrk_B.push_back({muB, seB});
640 auto [muR, seR] = weighted_result(wR, wTR);
642 if (std::isfinite(muR)) vTrk_R.push_back({muR, seR});
646 auto [muE, seE] = weighted_result(wE, wTE);
648 if (std::isfinite(muE)) vTrk_E.push_back({muE, seE});
653 const double wAll = wB + wE + wR;
654 const double wtAll = wTB + wTE + wTR;
656 const double t0 = wtAll / wAll;
657 const double se = std::sqrt(1.0 / wAll);
658 vTrk_All.push_back({t0, se});
663 if (vTrk_All.empty()) {
664 B2DEBUG(20,
"KLMEventT0Estimator: no usable KLM timing residuals for this event.");
669 const auto [muB_trk, seB_trk] = mean_sem_tracks(vTrk_B);
670 const auto [muR_trk, seR_trk] = mean_sem_tracks(vTrk_R);
671 const auto [muE_trk, seE_trk] = mean_sem_tracks(vTrk_E);
672 const auto [muAll_trk, seAll_trk] = mean_sem_tracks(vTrk_All);
685 const bool useB = std::isfinite(muB_trk);
686 const bool useE = std::isfinite(muE_trk);
687 const bool useR = std::isfinite(muR_trk);
689 double finalT0 = NAN, finalSE = NAN;
693 std::vector<std::pair<double, double>> parts;
694 if (useB) parts.emplace_back(muB_trk, seB_trk);
695 if (useE) parts.emplace_back(muE_trk, seE_trk);
696 if (useR) parts.emplace_back(muR_trk, seR_trk);
698 auto [t0, se] = mean_sem_tracks(parts);
702 if (useB && useE && useR) sourceBin = 7;
703 else if (useB && useE) sourceBin = 4;
704 else if (useB && useR) sourceBin = 5;
705 else if (useE && useR) sourceBin = 6;
706 else if (useB) sourceBin = 1;
707 else if (useE) sourceBin = 2;
708 else if (useR) sourceBin = 3;
711 B2DEBUG(20,
"KLMEventT0Estimator: "
712 <<
"T0_trkavg_all=" << muAll_trk <<
" ns (seed CDC=" <<
m_seedT0 <<
" ns)"
713 <<
" | E=" << muE_trk <<
" | Bsc=" << muB_trk <<
" | Brpc=" << muR_trk
714 << (std::isfinite(finalT0) ? (std::string(
" | FINAL KLM=") + std::to_string(finalT0) +
" ns") : std::string(
"")));
719 if (std::isfinite(finalT0)) {
721 const double quality =
static_cast<double>((useB ? 1 : 0) + (useE ? 1 : 0) + (useR ? 1 : 0));
723 Const::KLM,
"KLM", quality);
724 outT0->addTemporaryEventT0(klmT0Component);
725 outT0->setEventT0(klmT0Component);
static void channelNumberToElementNumbers(KLMChannelNumber channel, int *section, int *sector, int *layer, int *plane, int *strip)
Get element numbers by channel number.
@ c_FirstRPCLayer
First RPC layer.
Store one reconstructed BKLM 1D hit as a ROOT object.
Class for accessing objects in the database.
@ c_Event
Different object in each event, all objects/arrays are invalidated after event() function has been ca...
static const EKLMElementNumbers & Instance()
Instantiation.
void stripNumberToElementNumbers(int stripGlobal, int *section, int *layer, int *sector, int *plane, int *strip) const
Get element numbers by strip global number.
static const GeometryData & Instance(enum DataSource dataSource=c_Database, const GearDir *gearDir=nullptr)
Instantiation.
Store one Ext hit as a ROOT object.
double getTOF() const
Get time of flight from the point of closest approach near the origin to this hit.
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
@ c_Normal
Normally operating channel.
KLM digit (class representing a digitized hit in RPCs or scintillators).
Belle2::EKLM::TransformData * m_transformE
EKLM strip transformation data.
TH1D * m_hT0Evt_TrkAvg_BKLM_RPC_SEM
Per-event T0 track-average for BKLM RPC (SEM) [ns].
TH1D * m_hT0Evt_TrkAvg_EKLM_Scint_SEM
Per-event T0 track-average for EKLM scintillator (SEM) [ns].
TH1D * m_hT0Trk_BKLM_RPC
Per-track T0 for BKLM RPC [ns].
double m_ADCCut_BKLM_Scint_Min
Minimum ADC cut for BKLM scintillator.
TH1D * m_hT0Trk_EKLM_Scint
Per-track T0 for EKLM scintillator [ns].
TH1I * m_hFinalSource
Final EventT0 source selection (7 bins).
std::string m_histDirName
Parent directory inside the ROOT file (HistoManager) for this module.
void accumulateEKLM(const RelationVector< KLMHit2d > &, const ExtMap &, double &sumW, double &sumWT)
Accumulate EKLM scintillator per-digit T0 estimates (weighted).
ExtPair matchExt(unsigned int key, ExtMap &v_ExtHits)
Find earliest (entry) and latest (exit) ExtHits matching a key (channel or module).
const Belle2::EKLM::GeometryData * m_geoParE
EKLM geometry data.
TH1D * m_hT0Trk_BKLM_Scint
Per-track T0 for BKLM scintillator [ns].
bool m_useCDCTemporaryT0
Use CDC temporary EventT0 as a diagnostic seed (not applied to averaging).
void initialize() override
Register inputs/params; get geometry; call REG_HISTOGRAM.
void event() override
Per-event algorithm: collect hits, compute residuals, fill outputs.
std::string m_histSubdirUncorr
Subdirectory name for uncorrected timing histograms.
DBObjPtr< KLMEventT0HitResolution > m_eventT0HitResolution
Per-hit time resolution for EventT0 estimation.
std::multimap< unsigned int, Belle2::ExtHit > ExtMap
Multimap of ExtHit objects keyed by channel or module number.
ExtMap m_extRPC
Extrapolated hits keyed by module number (RPC).
TH1D * m_hT0Evt_TrkAvg_BKLM_Scint_SEM
Per-event T0 track-average for BKLM scintillator (SEM) [ns].
void collectExtrapolatedHits(const Track *track, ExtMap &scintMap, ExtMap &rpcMap)
Build maps of extrapolated hits for a track (scint: channel key; RPC: module key).
double m_ADCCut_BKLM_Scint_Max
Maximum ADC cut for BKLM scintillator.
DBObjPtr< KLMChannelStatus > m_channelStatus
Channel status (Normal/Dead/etc.).
StoreObjPtr< ParticleList > m_MuonList
Selected muon particle list.
void beginRun() override
Per-run resets if desired (histos remain booked).
StoreArray< Track > m_tracks
Reconstructed tracks.
double m_ADCCut_EKLM_Scint_Max
Maximum ADC cut for EKLM scintillator.
bool passesADCCut(double charge, int subdetector, int layer, bool inRPC) const
Check if a digit passes the ADC charge cut.
double m_ADCCut_EKLM_Scint_Min
Minimum ADC cut for EKLM scintillator.
Belle2::bklm::GeometryPar * m_geoParB
BKLM geometry.
bool m_ignoreBackward
Ignore backward-propagated ExtHits when forming entry/exit pairs.
TH1D * m_hT0Evt_TrkAvg_BKLM_Scint
Per-event T0 track-average for BKLM scintillator (mean) [ns].
std::pair< Belle2::ExtHit *, Belle2::ExtHit * > ExtPair
Pair of entry and exit ExtHit pointers.
double m_seedT0
Optional seed from CDC (for logging only).
std::string m_MuonListName
Input ParticleList (e.g.
double getHitSigma(int subdetector, int layer, bool inRPC, int plane=0) const
Get per-hit sigma for a digit based on detector category.
TH1D * m_hT0Evt_TrkAvg_All
Per-event T0 track-average combined (mean) [ns].
const KLMElementNumbers * m_elementNum
Element numbering helpers.
void accumulateBKLMRPC(RelationVector< KLMHit2d > &klmHit2ds, const ExtMap &rpcMap, double &sumW, double &sumWT)
Accumulate BKLM RPC per-digit T0 estimates (weighted, both readout directions).
TH1D * m_hT0Evt_TrkAvg_All_SEM
Per-event T0 track-average combined (SEM) [ns].
TH1D * m_hT0Evt_TrkAvg_BKLM_RPC
Per-event T0 track-average for BKLM RPC (mean) [ns].
ExtMap m_extScint
Extrapolated hits keyed by channel number (scintillator).
TH1D * m_hT0Evt_TrkAvg_EKLM_Scint
Per-event T0 track-average for EKLM scintillator (mean) [ns].
void accumulateBKLMScint(RelationVector< KLMHit2d > &, const ExtMap &, double &sumW, double &sumWT)
Accumulate BKLM scintillator per-digit T0 estimates (weighted).
void defineHisto() override
Definition of histograms (called once by HistoManager).
Class to store the likelihoods from KLM with additional information related to the extrapolation.
@ c_BKLM
BKLM scintillator.
@ c_EKLM
EKLM scintillator.
Class to store reconstructed particles.
Class for type safe access to objects that are referred to in relations.
size_t size() const
Get number of relations.
Type-safe access to single objects in the data store.
bool isValid() const
Check whether the object was created.
bool construct(Args &&... params)
Construct an object of type T in this StoreObjPtr, using the provided constructor arguments.
Class that bundles various TrackFitResults.
static const double mm
[millimeters]
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.
Class to store variables with their name which were sent to the logging service.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.
Structure for storing the extracted event t0s together with its detector and its uncertainty.