9#include <top/modules/collectors/TOPValidationCollectorModule.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>
18#include <framework/dataobjects/EventMetaData.h>
51 setDescription(
"A collector for automatic validation of TOP calibration");
57 "time range in which to search for the minimum [ns]", 10.0);
59 "sigma in [ns] for additional smearing of PDF", 0.0);
61 "sample type: one of dimuon or bhabha", std::string(
"dimuon"));
63 "c.m.s energy window (half size) if sample is dimuon or bhabha", 0.1);
67 "minimal local z of extrapolated hit", -130.0);
69 "maximal local z of extrapolated hit", 130.0);
71 "PDF option, one of 'rough', 'fine', 'optimal'", std::string(
"rough"));
94 B2ERROR(
"Unknown PDF option '" <<
m_pdfOption <<
"'");
105 B2ERROR(
"Invalid sample type '" <<
m_sample <<
"'");
112 for (
int set = 0; set <
c_numSets; set++) {
121 string slotName = to_string(slot);
122 if (slot < 10) slotName.insert(0,
"0");
123 string name =
"chi2_slot" + slotName;
124 string title =
"Chi2 scan, slot" + slotName +
"; channel; t0 [ns]";
131 string slotName = to_string(slot);
132 if (slot < 10) slotName.insert(0,
"0");
133 string name =
"hits_slot" + slotName;
134 string title =
"Photon hits, slot" + slotName +
"; channel; time [ns]";
140 auto h =
new TH1F(
"moduleT0_pulls",
"Module T0 pulls; pulls", 200, -15.0, 15.0);
143 auto tree =
new TTree(
"tree",
"TOP calibration validation tree");
144 tree->Branch(
"expNo", &
m_treeEntry.expNo,
"expNo/I");
145 tree->Branch(
"runNo", &
m_treeEntry.runNo,
"runNo/I");
146 tree->Branch(
"numTracks", &
m_treeEntry.numTracks,
"numTracks/I");
147 tree->Branch(
"commonT0", &
m_treeEntry.commonT0,
"commonT0/F");
148 tree->Branch(
"commonT0Err", &
m_treeEntry.commonT0Err,
"commonT0Err/F");
149 tree->Branch(
"moduleT0", &
m_treeEntry.moduleT0,
"moduleT0[16]/F");
150 tree->Branch(
"moduleT0Err", &
m_treeEntry.moduleT0Err,
"moduleT0Err[16]/F");
151 tree->Branch(
"numTBCalibrated", &
m_treeEntry.numTBCalibrated,
"numTBCalibrated[16]/I");
152 tree->Branch(
"numT0Calibrated", &
m_treeEntry.numT0Calibrated,
"numT0Calibrated[16]/I");
153 tree->Branch(
"numActive", &
m_treeEntry.numActive,
"numActive[16]/I");
154 tree->Branch(
"numActiveCalibrated", &
m_treeEntry.numActiveCalibrated,
"numActiveCalibrated[16]/I");
155 tree->Branch(
"thrEffi", &
m_treeEntry.thrEffi,
"thrEffi[16]/F");
156 tree->Branch(
"asicShifts", &
m_treeEntry.asicShifts,
"asicShifts[4]/F");
157 tree->Branch(
"svdOffset", &
m_treeEntry.svdOffset,
"svdOffset/F");
158 tree->Branch(
"svdSigma", &
m_treeEntry.svdSigma,
"svdSigma/F");
159 tree->Branch(
"cdcOffset", &
m_treeEntry.cdcOffset,
"cdcOffset/F");
160 tree->Branch(
"cdcSigma", &
m_treeEntry.cdcSigma,
"cdcSigma/F");
161 tree->Branch(
"fillPatternOffset", &
m_treeEntry.fillPatternOffset,
"fillPatternOffset/F");
162 tree->Branch(
"fillPatternFraction", &
m_treeEntry.fillPatternFraction,
"fillPatternFraction/F");
179 for (
auto& finder : finders) finder.clear();
185 for (
unsigned module = 0;
module < c_numModules;
module++) {
186 auto& numTBCalibrated = m_treeEntry.numTBCalibrated[module];
187 auto& numT0Calibrated =
m_treeEntry.numT0Calibrated[module];
189 auto& numActiveCalibrated =
m_treeEntry.numActiveCalibrated[module];
191 int slot =
module + 1;
192 for (
unsigned channel = 0; channel <
c_numChannels; channel++) {
193 bool tbCalibrated =
false;
194 const auto* fe = fe_mapper.getMap(slot, channel / 128);
196 tbCalibrated =
m_timebase->isAvailable(fe->getScrodID(), channel);
198 B2ERROR(
"No front-end map found");
200 bool t0Calibrated =
m_channelT0->isCalibrated(slot, channel);
202 if (tbCalibrated) numTBCalibrated++;
203 if (t0Calibrated) numT0Calibrated++;
204 if (active) numActive++;
205 if (tbCalibrated and t0Calibrated and active) {
206 numActiveCalibrated++;
210 if (numActiveCalibrated > 0) thrEffi /= numActiveCalibrated;
213 for (
unsigned carrier = 0; carrier < 4; carrier++) {
214 unsigned asic = (3 * 4 + carrier) * 4;
215 m_treeEntry.asicShifts[carrier] = m_asicShift->isCalibrated(13, asic) ? m_asicShift->getT0(13, asic) :
216 std::numeric_limits<float>::quiet_NaN();
219 const auto& svd = m_eventT0Offset->get(Const::SVD);
220 m_treeEntry.svdOffset = svd.offset;
221 m_treeEntry.svdSigma = svd.sigma;
223 const auto& cdc = m_eventT0Offset->get(Const::CDC);
224 m_treeEntry.cdcOffset = cdc.offset;
225 m_treeEntry.cdcSigma = cdc.sigma;
227 m_treeEntry.fillPatternOffset = m_fillPatternOffset->isCalibrated() ? m_fillPatternOffset->get() :
228 std::numeric_limits<float>::quiet_NaN();
229 m_treeEntry.fillPatternFraction = m_fillPatternOffset->getFraction();
238 if (not
m_recBunch->isReconstructed())
return;
245 for (
const auto& track :
m_tracks) {
249 if (not trk.
isValid())
continue;
255 if (not pdfConstructor.
isValid())
continue;
263 for (
int ibin = 0; ibin < h->GetNbinsY(); ibin++) {
264 double t0 = h->GetYaxis()->GetBinCenter(ibin + 1);
266 for (
unsigned channel = 0; channel <
c_numChannels; channel++) {
267 int pix = chMapper.getPixelID(channel) - 1;
268 double chi = h->GetBinContent(channel + 1, ibin + 1);
269 chi += -2 * pixelLogLs[pix].logL;
270 h->SetBinContent(channel + 1, ibin + 1, chi);
273 for (
auto& LL : pixelLogLs) logL += LL.logL;
274 finder.add(ibin, -2 * logL);
279 for (
const auto& digit :
m_digits) {
280 if (digit.getHitQuality() != TOPDigit::c_Good)
continue;
281 if (digit.getModuleID() != trk.
getModuleID())
continue;
282 h1->Fill(digit.getChannel(), digit.getTime());
293 for (
int module = 0;
module < c_numModules;
module++) {
294 std::vector<double> pos, err;
295 for (
int set = 0; set <
c_numSets; set++) {
296 const auto& minimum =
m_finders[set][module].getMinimum();
298 pos.push_back(minimum.position);
299 err.push_back(minimum.error);
303 for (
unsigned i = 0; i < pos.size(); i++) {
304 for (
unsigned j = i + 1; j < pos.size(); j++) {
305 double pull = (pos[i] - pos[j]) /
sqrt(err[i] * err[i] + err[j] * err[j]);
313 for (
int module = 0;
module < c_numModules;
module++) {
314 auto& finder = m_finders[0][module];
315 for (
int set = 1; set < c_numSets; set++) {
316 finder.add(m_finders[set][module]);
318 const auto& minimum = finder.getMinimum();
320 m_treeEntry.moduleT0[module] = minimum.position;
321 m_treeEntry.moduleT0Err[module] = minimum.error;
327 auto& finder = m_finders[0][0];
328 for (
int module = 1;
module < c_numModules;
module++) {
329 finder.add(m_finders[0][module]);
331 const auto& minimum = finder.getMinimum();
333 m_treeEntry.commonT0 = minimum.position;
334 m_treeEntry.commonT0Err = minimum.error;
339 auto tree = getObjectPtr<TTree>(
"tree");
void registerObject(std::string name, T *obj)
Register object with a name, takes ownership, do not access the pointer beyond prepare()
T * getObjectPtr(std::string name)
Calls the CalibObjManager to get the requested stored collector data.
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Type-safe access to single objects in the data store.
DBObjPtr< TOPCalChannelMask > m_channelMask
list of dead/noisy channels
TOP::ValidationTreeStruct m_treeEntry
tree entry
std::vector< std::string > m_namesHit
histogram names of photon hits (time vs.
DBObjPtr< TOPCalTimebase > m_timebase
sample time calibration constants
StoreObjPtr< TOPRecBunch > m_recBunch
reconstructed bunch
TOP::TrackSelector m_selector
track selection utility
double m_sigmaSmear
additional smearing of PDF in [ns]
double m_dz
cut on POCA in z
DBObjPtr< TOPCalChannelThresholdEff > m_thresholdEff
channel threshold effi.
DBObjPtr< TOPCalChannelT0 > m_channelT0
channel T0 calibration constants
int m_numBins
number of bins to which search region is divided
double m_maxZ
maximal local z of extrapolated hit
TOP::PDFConstructor::EPDFOption m_PDFOption
PDF option.
std::vector< std::string > m_namesChi
histogram names of chi2 scans
double m_minZ
minimal local z of extrapolated hit
double m_dr
cut on POCA in r
StoreArray< Track > m_tracks
collection of tracks
double m_deltaEcms
c.m.s energy window if sample is "dimuon" or "bhabha"
double m_timeRange
time range in which to search for the minimum [ns]
StoreArray< TOPDigit > m_digits
collection of digits
StoreArray< ExtHit > m_extHits
collection of extrapolated hits
std::string m_pdfOption
PDF option name.
@ c_numChannels
number of channels per module
@ c_numSets
number of statistically independent subsamples
@ c_numModules
number of modules
std::string m_sample
sample type
std::vector< TOP::Chi2MinimumFinder1D > m_finders[c_numSets]
minimum finders, vector index = slot - 1
Minimum finder using tabulated chi^2 values in one dimension.
PDF construction and log likelihood determination for a given track and particle hypothesis.
bool isValid() const
Checks the object status.
const std::vector< LogL > & getPixelLogLs(double t0, double sigt=0) const
Returns extended log likelihoods in pixels for PDF shifted in time.
@ c_Optimal
y dependent only where necessary
@ c_Fine
y dependent everywhere
@ c_Rough
no dependence on y
static TOPGeometryPar * Instance()
Static method to obtain the pointer to its instance.
const FrontEndMapper & getFrontEndMapper() const
Returns front-end mapper (mapping of SCROD's to positions within TOP modules)
static void setDefaultTimeWindow()
Sets default time window (functions getMinTime(), getMaxTime() will then return default values from D...
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.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
double sqrt(double a)
sqrt for double
virtual void collect() final
Replacement for event().
virtual void startRun() final
Replacement for beginRun().
TOPValidationCollectorModule()
Constructor.
virtual void closeRun() final
Replacement for endRun().
virtual void prepare() final
Replacement for initialize().
Abstract base class for different kinds of events.