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."
203 B2ERROR(
"KLMEventT0Estimator: Calibrated hit resolution payload not available!");
229 ExtHit* entryHit =
nullptr;
230 ExtHit* exitHit =
nullptr;
231 auto itlow = v_ExtHits.lower_bound(key);
232 auto itup = v_ExtHits.upper_bound(key);
233 for (
auto it = itlow; it != itup; ++it) {
234 if (!entryHit || it->second.
getTOF() < entryHit->
getTOF()) entryHit = &(it->second);
235 if (!exitHit || it->second.
getTOF() > exitHit->
getTOF()) exitHit = &(it->second);
237 return std::make_pair(entryHit, exitHit);
250 for (
const ExtHit& eHit : extHits) {
251 if (eHit.getStatus() != EXT_EXIT)
continue;
254 const bool isB = (eHit.getDetectorID() == Const::EDetector::BKLM);
255 const bool isE = (eHit.getDetectorID() == Const::EDetector::EKLM);
256 if (!isB && !isE)
continue;
258 int copyId = eHit.getCopyID();
259 int tFor, tSec, tLay, tPla, tStr;
265 &tFor, &tLay, &tSec, &tPla, &tStr);
270 &tFor, &tSec, &tLay, &tPla, &tStr);
272 if (tSub < 0)
continue;
274 bool crossed =
false;
277 crossed = muidLikelihood
278 ? muidLikelihood->isExtrapolatedBarrelLayerCrossed(tLay - 1)
280 if (!crossed)
continue;
286 unsigned int moduleKey =
288 rpcMap.insert(std::make_pair(moduleKey, eHit));
291 unsigned int channelKey =
292 m_elementNum->channelNumber(tSub, tFor, tSec, tLay, tPla, tStr);
296 scintMap.insert(std::make_pair(channelKey, eHit));
301 crossed = muidLikelihood
302 ? muidLikelihood->isExtrapolatedEndcapLayerCrossed(tLay - 1)
304 if (!crossed)
continue;
306 unsigned int channelKey =
307 m_elementNum->channelNumber(tSub, tFor, tSec, tLay, tPla, tStr);
311 scintMap.insert(std::make_pair(channelKey, eHit));
320 inline void acc_stat_weighted(
double t,
double sigma,
double& sumW,
double& sumWT)
322 if (sigma <= 0.0 || !std::isfinite(sigma))
return;
323 const double w = 1.0 / (sigma * sigma);
332 double& sumW,
double& sumWT)
337 const double delayScint = timeConstants.isValid()
343 for (
const KLMHit2d& hit2d : klmHit2ds) {
347 if (digits.size() == 0)
continue;
350 if (!d.isGood())
continue;
352 unsigned int cid = d.getUniqueChannelID();
362 ExtPair ex =
const_cast<KLMEventT0EstimatorModule*
>(
this)->
matchExt(cid,
const_cast<ExtMap&
>(scintMap));
363 if (!ex.first || !ex.second)
continue;
364 const double flyTime = 0.5 * (ex.first->getTOF() + ex.second->getTOF());
367 const ROOT::Math::XYZVector posGlobExt = 0.5 * (ex.first->getPosition() + ex.second->getPosition());
368 hitGlobal_ext.setX(posGlobExt.X() /
Unit::mm * CLHEP::mm);
369 hitGlobal_ext.setY(posGlobExt.Y() /
Unit::mm * CLHEP::mm);
370 hitGlobal_ext.setZ(posGlobExt.Z() /
Unit::mm * CLHEP::mm);
372 const double Lmm =
m_geoParE->getStripLength(d.getStrip()) / CLHEP::mm *
Unit::mm;
373 const HepGeom::Transform3D* tr =
m_transformE->getStripGlobalToLocal(
const_cast<KLMDigit*
>(&d));
374 hitLocal_ext = (*tr) * hitGlobal_ext;
375 const double dist_mm = 0.5 * Lmm - hitLocal_ext.x() / CLHEP::mm *
Unit::mm;
378 const double Trec = d.getTime();
379 const double Tcable = timeCableDelay.isValid() ? timeCableDelay->getTimeDelay(cid) : 0.0;
380 const double Tprop = dist_mm * delayScint;
381 const double Tfly = flyTime;
385 if (timeCableDelay.isValid()) t -= Tcable;
388 const double t0_est = t - Tfly;
389 if (!std::isfinite(t0_est))
continue;
393 acc_stat_weighted(t0_est, sigma, sumW, sumWT);
401 double& sumW,
double& sumWT)
406 const double delayScint = timeConstants.isValid()
412 if (hit2d.inRPC())
continue;
413 if (hit2d.isOutOfTime())
continue;
416 if (b1ds.
size() == 0)
continue;
418 const bklm::Module* mod =
m_geoParB->findModule(hit2d.getSection(), hit2d.getSector(), hit2d.getLayer());
419 const ROOT::Math::XYZVector posG2d = hit2d.getPosition();
425 if (d.inRPC() || !d.isGood())
continue;
427 unsigned int cid = d.getUniqueChannelID();
437 ExtPair p =
const_cast<KLMEventT0EstimatorModule*
>(
this)->
matchExt(cid,
const_cast<ExtMap&
>(scintMap));
438 if (!p.first || !p.second)
continue;
440 const double flyTime = 0.5 * (p.first->getTOF() + p.second->getTOF());
441 const ROOT::Math::XYZVector posGext = 0.5 * (p.first->getPosition() + p.second->getPosition());
444 const CLHEP::Hep3Vector locExt = mod->globalToLocal(CLHEP::Hep3Vector(posGext.X(), posGext.Y(), posGext.Z()),
true);
445 const CLHEP::Hep3Vector locHit2 = mod->globalToLocal(CLHEP::Hep3Vector(posG2d.X(), posG2d.Y(), posG2d.Z()),
true);
446 const CLHEP::Hep3Vector diff = locExt - locHit2;
447 if (std::fabs(diff.z()) > mod->getZStripWidth() || std::fabs(diff.y()) > mod->getPhiStripWidth())
continue;
450 const bool isPhiReadout = h1d.isPhiReadout();
451 double propaLen = mod->getPropagationDistance(locExt, d.getStrip(), isPhiReadout);
454 const double Trec = d.getTime();
455 const double Tcable = timeCableDelay.isValid() ? timeCableDelay->getTimeDelay(cid) : 0.0;
456 const double Tprop = propaLen * delayScint;
457 const double Tfly = flyTime;
460 if (timeCableDelay.isValid()) t -= Tcable;
463 const double t0_est = t - Tfly;
464 if (!std::isfinite(t0_est))
continue;
468 acc_stat_weighted(t0_est, sigma, sumW, sumWT);
477 double& sumW,
double& sumWT)
482 const double delayPhi = timeConstants.isValid()
485 const double delayZ = timeConstants.isValid()
491 if (!hit2d.inRPC())
continue;
492 if (hit2d.isOutOfTime())
continue;
495 if (b1ds.
size() == 0)
continue;
497 const bklm::Module* mod =
m_geoParB->findModule(hit2d.getSection(), hit2d.getSector(), hit2d.getLayer());
498 const ROOT::Math::XYZVector posG2d = hit2d.getPosition();
501 const bool isPhi = h1d.isPhiReadout();
505 if (!d.inRPC())
continue;
507 unsigned int cid = d.getUniqueChannelID();
511 if (!d.isGood())
continue;
514 unsigned int moduleKey =
m_elementNum->moduleNumber(d.getSubdetector(), d.getSection(), d.getSector(), d.getLayer());
515 ExtPair p =
const_cast<KLMEventT0EstimatorModule*
>(
this)->
matchExt(moduleKey,
const_cast<ExtMap&
>(rpcMap));
516 if (!p.first || !p.second)
continue;
518 const double flyTime = 0.5 * (p.first->getTOF() + p.second->getTOF());
519 const ROOT::Math::XYZVector posGext = 0.5 * (p.first->getPosition() + p.second->getPosition());
521 const CLHEP::Hep3Vector locExt = mod->globalToLocal(CLHEP::Hep3Vector(posGext.X(), posGext.Y(), posGext.Z()),
true);
522 const CLHEP::Hep3Vector locHit2 = mod->globalToLocal(CLHEP::Hep3Vector(posG2d.X(), posG2d.Y(), posG2d.Z()),
true);
524 const CLHEP::Hep3Vector diff = locExt - locHit2;
525 if (std::fabs(diff.z()) > mod->getZStripWidth() || std::fabs(diff.y()) > mod->getPhiStripWidth())
continue;
527 const CLHEP::Hep3Vector propaV = mod->getPropagationDistance(locExt);
528 const double propaDist = isPhi ? propaV.y() : propaV.z();
531 const double Trec = d.getTime();
532 const double Tcable = timeCableDelay.isValid() ? timeCableDelay->getTimeDelay(cid) : 0.0;
533 const double Tprop = propaDist * (isPhi ? delayPhi : delayZ);
534 const double Tfly = flyTime;
537 if (timeCableDelay.isValid()) t -= Tcable;
540 const double t0_est = t - Tfly;
541 if (!std::isfinite(t0_est))
continue;
546 acc_stat_weighted(t0_est, sigma, sumW, sumWT);
560 if (evtT0.
isValid() && evtT0->hasTemporaryEventT0(Const::EDetector::CDC)) {
561 const auto best = evtT0->getBestCDCTemporaryEventT0();
566 if (!
m_MuonList.isValid()) { B2WARNING(
"KLMEventT0Estimator: ParticleList '" <<
m_MuonListName <<
"' not found.");
return; }
567 const unsigned nTracks =
m_MuonList->getListSize();
568 if (nTracks == 0u)
return;
571 auto weighted_result = [](
double wsum,
double wtsum) -> std::pair<double, double> {
572 if (wsum <= 0.0)
return {NAN, NAN};
573 return {wtsum / wsum, std::sqrt(1.0 / wsum)};
577 auto mean_sem_tracks = [](
const std::vector<std::pair<double, double>>& v) -> std::pair<double, double> {
578 if (v.empty())
return {NAN, NAN};
581 return {v[0].first, std::isfinite(v[0].second) ? v[0].second : 0.0};
584 bool allValid =
true;
585 for (
const auto& [t0, sem] : v)
587 if (!std::isfinite(sem) || sem <= 0.0) { allValid =
false;
break; }
592 double wsum = 0.0, wtsum = 0.0;
593 for (
const auto& [t0, sem] : v) {
594 const double w = 1.0 / (sem * sem);
599 return {wtsum / wsum, std::sqrt(1.0 / wsum)};
605 for (
const auto& [t0, sem] : v) s += t0;
606 const double mu = s / v.size();
608 for (
const auto& [t0, sem] : v) {
const double d = t0 - mu; ss += d * d; }
609 const double var = (v.size() > 1) ? ss / (v.size() - 1) : 0.0;
610 return {mu, std::sqrt(var / v.size())};
614 std::vector<std::pair<double, double>> vTrk_B, vTrk_R, vTrk_E, vTrk_All;
616 for (
unsigned i = 0; i < nTracks; ++i) {
618 if (!particle)
continue;
619 const Track* track = particle->getTrack();
620 if (!track)
continue;
623 if (hit2ds.
size() == 0)
continue;
631 double wE = 0, wTE = 0;
634 double wB = 0, wTB = 0;
637 double wR = 0, wTR = 0;
642 auto [muB, seB] = weighted_result(wB, wTB);
644 if (std::isfinite(muB)) vTrk_B.push_back({muB, seB});
648 auto [muR, seR] = weighted_result(wR, wTR);
650 if (std::isfinite(muR)) vTrk_R.push_back({muR, seR});
654 auto [muE, seE] = weighted_result(wE, wTE);
656 if (std::isfinite(muE)) vTrk_E.push_back({muE, seE});
661 const double wAll = wB + wE + wR;
662 const double wtAll = wTB + wTE + wTR;
664 const double t0 = wtAll / wAll;
665 const double se = std::sqrt(1.0 / wAll);
666 vTrk_All.push_back({t0, se});
671 if (vTrk_All.empty()) {
672 B2DEBUG(20,
"KLMEventT0Estimator: no usable KLM timing residuals for this event.");
677 const auto [muB_trk, seB_trk] = mean_sem_tracks(vTrk_B);
678 const auto [muR_trk, seR_trk] = mean_sem_tracks(vTrk_R);
679 const auto [muE_trk, seE_trk] = mean_sem_tracks(vTrk_E);
680 const auto [muAll_trk, seAll_trk] = mean_sem_tracks(vTrk_All);
693 const bool useB = std::isfinite(muB_trk);
694 const bool useE = std::isfinite(muE_trk);
695 const bool useR = std::isfinite(muR_trk);
697 double finalT0 = NAN, finalSE = NAN;
701 std::vector<std::pair<double, double>> parts;
702 if (useB) parts.emplace_back(muB_trk, seB_trk);
703 if (useE) parts.emplace_back(muE_trk, seE_trk);
704 if (useR) parts.emplace_back(muR_trk, seR_trk);
706 auto [t0, se] = mean_sem_tracks(parts);
710 if (useB && useE && useR) sourceBin = 7;
711 else if (useB && useE) sourceBin = 4;
712 else if (useB && useR) sourceBin = 5;
713 else if (useE && useR) sourceBin = 6;
714 else if (useB) sourceBin = 1;
715 else if (useE) sourceBin = 2;
716 else if (useR) sourceBin = 3;
719 B2DEBUG(20,
"KLMEventT0Estimator: "
720 <<
"T0_trkavg_all=" << muAll_trk <<
" ns (seed CDC=" <<
m_seedT0 <<
" ns)"
721 <<
" | E=" << muE_trk <<
" | Bsc=" << muB_trk <<
" | Brpc=" << muR_trk
722 << (std::isfinite(finalT0) ? (std::string(
" | FINAL KLM=") + std::to_string(finalT0) +
" ns") : std::string(
"")));
727 if (std::isfinite(finalT0)) {
729 const double quality =
static_cast<double>((useB ? 1 : 0) + (useE ? 1 : 0) + (useR ? 1 : 0));
731 Const::KLM,
"KLM", quality);
732 outT0->addTemporaryEventT0(klmT0Component);
733 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.
void endRun() override
Called when the current run ends.
ExtMap m_extRPC
Extrapolated hits keyed by module number (RPC).
void terminate() override
Called at the end of processing.
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.