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!");
216 ExtHit* entryHit =
nullptr;
217 ExtHit* exitHit =
nullptr;
218 auto itlow = v_ExtHits.lower_bound(key);
219 auto itup = v_ExtHits.upper_bound(key);
220 for (
auto it = itlow; it != itup; ++it) {
221 if (!entryHit || it->second.
getTOF() < entryHit->
getTOF()) entryHit = &(it->second);
222 if (!exitHit || it->second.
getTOF() > exitHit->
getTOF()) exitHit = &(it->second);
224 return std::make_pair(entryHit, exitHit);
237 for (
const ExtHit& eHit : extHits) {
238 if (eHit.getStatus() != EXT_EXIT)
continue;
241 const bool isB = (eHit.getDetectorID() == Const::EDetector::BKLM);
242 const bool isE = (eHit.getDetectorID() == Const::EDetector::EKLM);
243 if (!isB && !isE)
continue;
245 int copyId = eHit.getCopyID();
246 int tFor, tSec, tLay, tPla, tStr;
252 &tFor, &tLay, &tSec, &tPla, &tStr);
257 &tFor, &tSec, &tLay, &tPla, &tStr);
259 if (tSub < 0)
continue;
262 const bool crossed = muidLikelihood
263 ? muidLikelihood->isExtrapolatedBarrelLayerCrossed(tLay - 1)
265 if (!crossed)
continue;
271 unsigned int moduleKey =
273 rpcMap.insert(std::make_pair(moduleKey, eHit));
276 unsigned int channelKey =
277 m_elementNum->channelNumber(tSub, tFor, tSec, tLay, tPla, tStr);
281 scintMap.insert(std::make_pair(channelKey, eHit));
286 const bool crossed = muidLikelihood
287 ? muidLikelihood->isExtrapolatedEndcapLayerCrossed(tLay - 1)
289 if (!crossed)
continue;
291 unsigned int channelKey =
292 m_elementNum->channelNumber(tSub, tFor, tSec, tLay, tPla, tStr);
296 scintMap.insert(std::make_pair(channelKey, eHit));
305 inline void acc_stat_weighted(
double t,
double sigma,
int section,
int sector,
308 if (sigma <= 0.0 || !std::isfinite(sigma))
return;
309 const double w = 1.0 / (sigma * sigma);
326 const double delayScint = timeConstants.isValid()
332 for (
const KLMHit2d& hit2d : klmHit2ds) {
336 if (digits.size() == 0)
continue;
339 if (!d.isGood())
continue;
341 unsigned int cid = d.getUniqueChannelID();
351 ExtPair ex =
const_cast<KLMEventT0EstimatorModule*
>(
this)->
matchExt(cid,
const_cast<ExtMap&
>(scintMap));
352 if (!ex.first || !ex.second)
continue;
353 const double flyTime = 0.5 * (ex.first->getTOF() + ex.second->getTOF());
356 const ROOT::Math::XYZVector posGlobExt = 0.5 * (ex.first->getPosition() + ex.second->getPosition());
357 hitGlobal_ext.setX(posGlobExt.X() /
Unit::mm * CLHEP::mm);
358 hitGlobal_ext.setY(posGlobExt.Y() /
Unit::mm * CLHEP::mm);
359 hitGlobal_ext.setZ(posGlobExt.Z() /
Unit::mm * CLHEP::mm);
361 const double Lmm =
m_geoParE->getStripLength(d.getStrip()) / CLHEP::mm *
Unit::mm;
362 const HepGeom::Transform3D* tr =
m_transformE->getStripGlobalToLocal(
const_cast<KLMDigit*
>(&d));
363 hitLocal_ext = (*tr) * hitGlobal_ext;
364 const double dist_mm = 0.5 * Lmm - hitLocal_ext.x() / CLHEP::mm *
Unit::mm;
367 const double Trec = d.getTime();
368 const double Tcable = timeCableDelay.isValid() ? timeCableDelay->getTimeDelay(cid) : 0.0;
369 const double Tprop = dist_mm * delayScint;
370 const double Tfly = flyTime;
374 if (timeCableDelay.isValid()) t -= Tcable;
377 const double t0_est = t - Tfly;
378 if (!std::isfinite(t0_est))
continue;
382 acc_stat_weighted(t0_est, sigma, d.getSection(), d.getSector(), sums);
395 const double delayScint = timeConstants.isValid()
401 if (hit2d.inRPC())
continue;
402 if (hit2d.isOutOfTime())
continue;
405 if (b1ds.
size() == 0)
continue;
407 const bklm::Module* mod =
m_geoParB->findModule(hit2d.getSection(), hit2d.getSector(), hit2d.getLayer());
408 const ROOT::Math::XYZVector posG2d = hit2d.getPosition();
414 if (d.inRPC() || !d.isGood())
continue;
416 unsigned int cid = d.getUniqueChannelID();
426 ExtPair p =
const_cast<KLMEventT0EstimatorModule*
>(
this)->
matchExt(cid,
const_cast<ExtMap&
>(scintMap));
427 if (!p.first || !p.second)
continue;
429 const double flyTime = 0.5 * (p.first->getTOF() + p.second->getTOF());
430 const ROOT::Math::XYZVector posGext = 0.5 * (p.first->getPosition() + p.second->getPosition());
433 const CLHEP::Hep3Vector locExt = mod->globalToLocal(CLHEP::Hep3Vector(posGext.X(), posGext.Y(), posGext.Z()),
true);
434 const CLHEP::Hep3Vector locHit2 = mod->globalToLocal(CLHEP::Hep3Vector(posG2d.X(), posG2d.Y(), posG2d.Z()),
true);
435 const CLHEP::Hep3Vector diff = locExt - locHit2;
436 if (std::fabs(diff.z()) > mod->getZStripWidth() || std::fabs(diff.y()) > mod->getPhiStripWidth())
continue;
439 const bool isPhiReadout = h1d.isPhiReadout();
440 double propaLen = mod->getPropagationDistance(locExt, d.getStrip(), isPhiReadout);
443 const double Trec = d.getTime();
444 const double Tcable = timeCableDelay.isValid() ? timeCableDelay->getTimeDelay(cid) : 0.0;
445 const double Tprop = propaLen * delayScint;
446 const double Tfly = flyTime;
449 if (timeCableDelay.isValid()) t -= Tcable;
452 const double t0_est = t - Tfly;
453 if (!std::isfinite(t0_est))
continue;
457 acc_stat_weighted(t0_est, sigma, hit2d.getSection(), hit2d.getSector(), sums);
471 const double delayPhi = timeConstants.isValid()
474 const double delayZ = timeConstants.isValid()
480 if (!hit2d.inRPC())
continue;
481 if (hit2d.isOutOfTime())
continue;
484 if (b1ds.
size() == 0)
continue;
486 const bklm::Module* mod =
m_geoParB->findModule(hit2d.getSection(), hit2d.getSector(), hit2d.getLayer());
487 const ROOT::Math::XYZVector posG2d = hit2d.getPosition();
490 const bool isPhi = h1d.isPhiReadout();
494 if (!d.inRPC())
continue;
496 unsigned int cid = d.getUniqueChannelID();
500 if (!d.isGood())
continue;
503 unsigned int moduleKey =
m_elementNum->moduleNumber(d.getSubdetector(), d.getSection(), d.getSector(), d.getLayer());
504 ExtPair p =
const_cast<KLMEventT0EstimatorModule*
>(
this)->
matchExt(moduleKey,
const_cast<ExtMap&
>(rpcMap));
505 if (!p.first || !p.second)
continue;
507 const double flyTime = 0.5 * (p.first->getTOF() + p.second->getTOF());
508 const ROOT::Math::XYZVector posGext = 0.5 * (p.first->getPosition() + p.second->getPosition());
510 const CLHEP::Hep3Vector locExt = mod->globalToLocal(CLHEP::Hep3Vector(posGext.X(), posGext.Y(), posGext.Z()),
true);
511 const CLHEP::Hep3Vector locHit2 = mod->globalToLocal(CLHEP::Hep3Vector(posG2d.X(), posG2d.Y(), posG2d.Z()),
true);
513 const CLHEP::Hep3Vector diff = locExt - locHit2;
514 if (std::fabs(diff.z()) > mod->getZStripWidth() || std::fabs(diff.y()) > mod->getPhiStripWidth())
continue;
516 const CLHEP::Hep3Vector propaV = mod->getPropagationDistance(locExt);
517 const double propaDist = isPhi ? propaV.y() : propaV.z();
520 const double Trec = d.getTime();
521 const double Tcable = timeCableDelay.isValid() ? timeCableDelay->getTimeDelay(cid) : 0.0;
522 const double Tprop = propaDist * (isPhi ? delayPhi : delayZ);
523 const double Tfly = flyTime;
526 if (timeCableDelay.isValid()) t -= Tcable;
529 const double t0_est = t - Tfly;
530 if (!std::isfinite(t0_est))
continue;
534 acc_stat_weighted(t0_est, sigma, hit2d.getSection(), hit2d.getSector(), sums);
548 if (evtT0.
isValid() && evtT0->hasTemporaryEventT0(Const::EDetector::CDC)) {
549 const auto best = evtT0->getBestCDCTemporaryEventT0();
554 if (!
m_MuonList.isValid()) { B2WARNING(
"KLMEventT0Estimator: ParticleList '" <<
m_MuonListName <<
"' not found.");
return; }
555 const unsigned nTracks =
m_MuonList->getListSize();
556 if (nTracks == 0u)
return;
559 auto weighted_result = [](
double wsum,
double wtsum) -> std::pair<double, double> {
560 if (wsum <= 0.0)
return {NAN, NAN};
561 return {wtsum / wsum, std::sqrt(1.0 / wsum)};
565 auto mean_sem_tracks = [](
const std::vector<std::pair<double, double>>& v) -> std::pair<double, double> {
566 if (v.empty())
return {NAN, NAN};
569 return {v[0].first, std::isfinite(v[0].second) ? v[0].second : 0.0};
572 bool allValid =
true;
573 for (
const auto& [t0, sem] : v)
575 if (!std::isfinite(sem) || sem <= 0.0) { allValid =
false;
break; }
580 double wsum = 0.0, wtsum = 0.0;
581 for (
const auto& [t0, sem] : v) {
582 const double w = 1.0 / (sem * sem);
587 return {wtsum / wsum, std::sqrt(1.0 / wsum)};
593 for (
const auto& [t0, sem] : v) s += t0;
594 const double mu = s / v.size();
596 for (
const auto& [t0, sem] : v) {
const double d = t0 - mu; ss += d * d; }
597 const double var = (v.size() > 1) ? ss / (v.size() - 1) : 0.0;
598 return {mu, std::sqrt(var / v.size())};
602 auto writeTrackInfo = [](
Particle * particle,
const std::string & category,
double t0,
double err,
604 particle->writeExtraInfo(
"klmTrackT0" + category, t0);
605 particle->writeExtraInfo(
"klmTrackT0Err" + category, err);
606 particle->writeExtraInfo(
"klmTrackNHits" + category, sums.
nHits);
607 particle->writeExtraInfo(
"klmTrackSector" + category, std::round(
double(sums.
sumSector) / sums.
nHits));
608 particle->writeExtraInfo(
"klmTrackSection" + category, std::round(
double(sums.
sumSection) / sums.
nHits));
612 std::vector<std::pair<double, double>> vTrk_B, vTrk_R, vTrk_E, vTrk_All;
614 for (
unsigned i = 0; i < nTracks; ++i) {
616 if (!particle)
continue;
617 const Track* track = particle->getTrack();
618 if (!track)
continue;
621 if (hit2ds.
size() == 0)
continue;
633 const double wE = sumsE.
sumW, wTE = sumsE.
sumWT;
634 const double wB = sumsB.
sumW, wTB = sumsB.
sumWT;
635 const double wR = sumsR.
sumW, wTR = sumsR.
sumWT;
639 auto [muB, seB] = weighted_result(wB, wTB);
641 if (std::isfinite(muB)) {
642 vTrk_B.push_back({muB, seB});
643 writeTrackInfo(particle,
"BKLMScint", muB, seB, sumsB);
648 auto [muR, seR] = weighted_result(wR, wTR);
650 if (std::isfinite(muR)) {
651 vTrk_R.push_back({muR, seR});
652 writeTrackInfo(particle,
"BKLMRPC", muR, seR, sumsR);
657 auto [muE, seE] = weighted_result(wE, wTE);
659 if (std::isfinite(muE)) {
660 vTrk_E.push_back({muE, seE});
661 writeTrackInfo(particle,
"EKLMScint", muE, seE, sumsE);
667 const double wAll = wB + wE + wR;
668 const double wtAll = wTB + wTE + wTR;
670 const double t0 = wtAll / wAll;
671 const double se = std::sqrt(1.0 / wAll);
672 vTrk_All.push_back({t0, se});
673 particle->writeExtraInfo(
"klmTrackT0All", t0);
674 particle->writeExtraInfo(
"klmTrackT0ErrAll", se);
679 if (vTrk_All.empty()) {
680 B2DEBUG(20,
"KLMEventT0Estimator: no usable KLM timing residuals for this event.");
685 const auto [muB_trk, seB_trk] = mean_sem_tracks(vTrk_B);
686 const auto [muR_trk, seR_trk] = mean_sem_tracks(vTrk_R);
687 const auto [muE_trk, seE_trk] = mean_sem_tracks(vTrk_E);
688 const auto [muAll_trk, seAll_trk] = mean_sem_tracks(vTrk_All);
702 auto writeEventInfo = [
this](
const std::string & category,
double t0,
double err) {
703 if (!std::isfinite(t0))
return;
707 writeEventInfo(
"BKLMScint", muB_trk, seB_trk);
708 writeEventInfo(
"BKLMRPC", muR_trk, seR_trk);
709 writeEventInfo(
"EKLMScint", muE_trk, seE_trk);
712 const bool useB = std::isfinite(muB_trk);
713 const bool useE = std::isfinite(muE_trk);
714 const bool useR = std::isfinite(muR_trk);
716 double finalT0 = NAN, finalSE = NAN;
720 std::vector<std::pair<double, double>> parts;
721 if (useB) parts.emplace_back(muB_trk, seB_trk);
722 if (useE) parts.emplace_back(muE_trk, seE_trk);
723 if (useR) parts.emplace_back(muR_trk, seR_trk);
725 auto [t0, se] = mean_sem_tracks(parts);
729 if (useB && useE && useR) sourceBin = 7;
730 else if (useB && useE) sourceBin = 4;
731 else if (useB && useR) sourceBin = 5;
732 else if (useE && useR) sourceBin = 6;
733 else if (useB) sourceBin = 1;
734 else if (useE) sourceBin = 2;
735 else if (useR) sourceBin = 3;
738 B2DEBUG(20,
"KLMEventT0Estimator: "
739 <<
"T0_trkavg_all=" << muAll_trk <<
" ns (seed CDC=" <<
m_seedT0 <<
" ns)"
740 <<
" | E=" << muE_trk <<
" | Bsc=" << muB_trk <<
" | Brpc=" << muR_trk
741 << (std::isfinite(finalT0) ? (std::string(
" | FINAL KLM=") + std::to_string(finalT0) +
" ns") : std::string(
"")));
746 if (std::isfinite(finalT0)) {
748 const double quality =
static_cast<double>((useB ? 1 : 0) + (useE ? 1 : 0) + (useR ? 1 : 0));
750 Const::KLM,
"KLM", quality);
752 outT0->addTemporaryEventT0(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.
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.
double getHitSigma(int subdetector, int layer, bool inRPC) const
Get per-hit sigma for a digit based on detector category.
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.
void accumulateEKLM(const RelationVector< KLMHit2d > &, const ExtMap &, CategorySums &sums)
Accumulate EKLM scintillator per-digit T0 estimates (weighted).
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).
void accumulateBKLMScint(RelationVector< KLMHit2d > &, const ExtMap &, CategorySums &sums)
Accumulate BKLM scintillator per-digit T0 estimates (weighted).
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.
StoreObjPtr< EventExtraInfo > m_eventExtraInfo
Event extra info, receives the per-event result of each category.
TH1D * m_hT0Evt_TrkAvg_All
Per-event T0 track-average combined (mean) [ns].
const KLMElementNumbers * m_elementNum
Element numbering helpers.
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).
void accumulateBKLMRPC(RelationVector< KLMHit2d > &klmHit2ds, const ExtMap &rpcMap, CategorySums &sums)
Accumulate BKLM RPC per-digit T0 estimates (weighted, both readout directions).
TH1D * m_hT0Evt_TrkAvg_EKLM_Scint
Per-event T0 track-average for EKLM scintillator (mean) [ns].
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.
Running sums of the hits of one category on one track.
int sumSector
Sum of the sector numbers of the hits used.
double sumW
Sum of the hit weights 1/sigma^2 [1/ns^2].
int nHits
Number of hits used.
double sumWT
Sum of weight times hit T0 [1/ns].
int sumSection
Sum of the section numbers of the hits used.