9 #include <top/modules/collectors/TOPCommonT0LLCollectorModule.h>
10 #include <top/geometry/TOPGeometryPar.h>
11 #include <top/reconstruction_cpp/TOPTrack.h>
12 #include <top/reconstruction_cpp/PDFConstructor.h>
13 #include <top/reconstruction_cpp/TOPRecoManager.h>
16 #include <framework/gearbox/Const.h>
17 #include <framework/logging/Logger.h>
45 TOPCommonT0LLCollectorModule::TOPCommonT0LLCollectorModule()
48 setDescription(
"A collector for common T0 calibration with dimuons or Bhabha's using "
49 "neg. log likelihood minimization (method LL)");
50 setPropertyFlags(c_ParallelProcessingCertified);
53 addParam(
"bunchesPerSSTclk", m_bunchesPerSSTclk,
54 "number of bunches per SST clock period", 24);
55 addParam(
"numBins", m_numBins,
"number of bins of the search region", 200);
56 addParam(
"timeRange", m_timeRange,
57 "time range in which to search for the minimum [ns]", 10.0);
58 addParam(
"sigmaSmear", m_sigmaSmear,
59 "sigma in [ns] for additional smearing of PDF", 0.0);
60 addParam(
"sample", m_sample,
61 "sample type: one of dimuon or bhabha", std::string(
"dimuon"));
62 addParam(
"deltaEcms", m_deltaEcms,
63 "c.m.s energy window (half size) if sample is dimuon or bhabha", 0.1);
64 addParam(
"dr", m_dr,
"cut on POCA in r", 2.0);
65 addParam(
"dz", m_dz,
"cut on POCA in abs(z)", 4.0);
66 addParam(
"minZ", m_minZ,
67 "minimal local z of extrapolated hit", -130.0);
68 addParam(
"maxZ", m_maxZ,
69 "maximal local z of extrapolated hit", 130.0);
70 addParam(
"pdfOption", m_pdfOption,
71 "PDF option, one of 'rough', 'fine', 'optimal'", std::string(
"rough"));
75 void TOPCommonT0LLCollectorModule::prepare()
79 m_digits.isRequired();
80 m_tracks.isRequired();
81 m_extHits.isRequired();
82 m_recBunch.isRequired();
86 const auto* geo = TOPGeometryPar::Instance()->getGeometry();
87 m_bunchTimeSep = geo->getNominalTDC().getSyncTimeBase() / m_bunchesPerSSTclk;
91 if (m_pdfOption ==
"rough") {
92 m_PDFOption = PDFConstructor::c_Rough;
93 }
else if (m_pdfOption ==
"fine") {
94 m_PDFOption = PDFConstructor::c_Fine;
95 }
else if (m_pdfOption ==
"optimal") {
96 m_PDFOption = PDFConstructor::c_Optimal;
98 B2ERROR(
"Unknown PDF option '" << m_pdfOption <<
"'");
103 if (m_sample ==
"dimuon" or m_sample ==
"bhabha") {
105 m_selector.setDeltaEcms(m_deltaEcms);
106 m_selector.setCutOnPOCA(m_dr, m_dz);
107 m_selector.setCutOnLocalZ(m_minZ, m_maxZ);
109 B2ERROR(
"Invalid sample type '" << m_sample <<
"'");
114 double tmin = -m_timeRange / 2;
115 double tmax = m_timeRange / 2;
116 for (
unsigned i = 0; i < c_numSets; i++) {
117 string name =
"chi2_set" + to_string(i);
118 auto h =
new TH1D(name.c_str(),
"chi2 scan; t0 [ns]; chi2", m_numBins, tmin, tmax);
119 registerObject<TH1D>(name, h);
120 m_names.push_back(name);
123 auto h1 =
new TH1F(
"tracks_per_set",
"tracks per sample; sample number; num tracks",
124 c_numSets, 0, c_numSets);
125 registerObject<TH1F>(
"tracks_per_set", h1);
127 auto h2 =
new TH1F(
"numHits",
"Number of photons per slot",
128 c_numModules, 0.5,
static_cast<float>(c_numModules) + 0.5);
129 h2->SetXTitle(
"slot number");
130 h2->SetYTitle(
"hits per slot");
131 registerObject<TH1F>(
"numHits", h2);
133 auto h3 =
new TH2F(
"timeHits",
"Photon times vs. boardstacks",
134 c_numModules * 4, 0.5,
static_cast<float>(c_numModules) + 0.5, 200, 0.0, 20.0);
135 h3->SetXTitle(
"slot number");
136 h3->SetYTitle(
"time [ns]");
137 registerObject<TH2F>(
"timeHits", h3);
141 auto h4 =
new TH1F(
"offset",
"current offset from input files; offset [ns]",
142 200, -m_bunchTimeSep / 2, m_bunchTimeSep / 2);
143 registerObject<TH1F>(
"offset", h4);
148 void TOPCommonT0LLCollectorModule::collect()
152 if (not m_recBunch.isValid())
return;
153 if (not m_recBunch->isReconstructed())
return;
155 TOPRecoManager::setDefaultTimeWindow();
156 double timeMin = TOPRecoManager::getMinTime();
157 double timeMax = TOPRecoManager::getMaxTime();
162 if (m_commonT0->isCalibrated()) T0 = m_commonT0->getT0();
163 for (
auto& digit : m_digits) {
164 if (digit.isCommonT0Calibrated()) digit.subtractT0(-T0);
165 if (digit.hasStatus(TOPDigit::c_BunchOffsetSubtracted)) digit.subtractT0(-m_recBunch->getAverageOffset());
171 for (
const auto& track : m_tracks) {
175 if (not trk.
isValid())
continue;
177 if (not m_selector.isSelected(trk))
continue;
180 PDFConstructor pdfConstructor(trk, m_selector.getChargedStable(), m_PDFOption);
181 if (not pdfConstructor.
isValid())
continue;
184 int sub = gRandom->Integer(c_numSets);
185 auto h = getObjectPtr<TH1D>(m_names[sub]);
186 for (
int ibin = 0; ibin < h->GetNbinsX(); ibin++) {
187 double t0 = h->GetBinCenter(ibin + 1);
188 double chi = h->GetBinContent(ibin + 1);
189 chi += -2 * pdfConstructor.
getLogL(t0, m_sigmaSmear).
logL;
190 h->SetBinContent(ibin + 1, chi);
192 auto h1 = getObjectPtr<TH1F>(
"tracks_per_set");
196 auto h2 = getObjectPtr<TH1F>(
"numHits");
197 auto h3 = getObjectPtr<TH2F>(
"timeHits");
198 for (
const auto& digit : m_digits) {
199 if (digit.getHitQuality() != TOPDigit::c_Good)
continue;
200 if (digit.getModuleID() != trk.
getModuleID())
continue;
201 if (digit.getTime() < timeMin)
continue;
202 if (digit.getTime() > timeMax)
continue;
203 h2->Fill(digit.getModuleID());
204 int bs = digit.getBoardstackNumber();
205 h3->Fill((digit.getModuleID() * 4 + bs - 1.5) / 4.0, digit.getTime());
213 auto h4 = getObjectPtr<TH1F>(
"offset");
214 h4->Fill(m_recBunch->getCurrentOffset());
PDF construction and log likelihood determination for a given track and particle hypothesis.
LogL getLogL() const
Returns extended log likelihood (using the default time window)
bool isValid() const
Checks the object status.
Reconstructed track at TOP.
bool isValid() const
Checks if track is successfully constructed.
int getModuleID() const
Returns slot ID.
Utility for the track selection - used in various calibration modules.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.
double logL
extended log likelihood