9#include <top/modules/collectors/TOPPhotonYieldsCollectorModule.h>
10#include <top/reconstruction_cpp/TOPTrack.h>
11#include <top/geometry/TOPGeometryPar.h>
14#include <framework/gearbox/Unit.h>
15#include <framework/logging/Logger.h>
45 setDescription(
"A collector for photon pixel yields aimed for PMT ageing studies and for finding optically decoupled PMT's");
49 addParam(
"sample",
m_sample,
"sample type: one of dimuon or bhabha", std::string(
"dimuon"));
50 addParam(
"deltaEcms",
m_deltaEcms,
"c.m.s energy window (half size) if sample is dimuon or bhabha", 0.1);
75 B2ERROR(
"Invalid sample type '" <<
m_sample <<
"'");
80 const int numModules = 16;
81 const int numPixels = 512;
84 auto* timeStamp =
new TProfile(
"timeStamp",
"Time stamp; ; unix time", 1, 0, 1, 0, 1.0e10,
"S");
85 registerObject<TProfile>(
"timeStamp", timeStamp);
88 auto* numTracks =
new TH1F(
"numTracks",
"Number of tracks per slot; slot number; track count", numModules, 0.5, numModules + 0.5);
89 registerObject<TH1F>(
"numTracks", numTracks);
92 for (
int slot = 1; slot <= numModules; slot++) {
93 string name = (slot < 10) ?
"signalHits_0" + to_string(slot) :
"signalHits_" + to_string(slot);
94 string title =
"Hits in signal window for slot " + to_string(slot);
95 auto h =
new TH1F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5);
96 h->SetXTitle(
"pixel number");
97 h->SetYTitle(
"hit count");
98 registerObject<TH1F>(name, h);
103 for (
int slot = 1; slot <= numModules; slot++) {
104 string name = (slot < 10) ?
"bkgHits_0" + to_string(slot) :
"bkgHits_" + to_string(slot);
105 string title =
"Hits in background window for slot " + to_string(slot);
106 auto h =
new TH1F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5);
107 h->SetXTitle(
"pixel number");
108 h->SetYTitle(
"hit count");
109 registerObject<TH1F>(name, h);
114 for (
int slot = 1; slot <= numModules; slot++) {
115 string name = (slot < 10) ?
"activePixels_0" + to_string(slot) :
"activePixels_" + to_string(slot);
116 string title =
"Active pixels for slot " + to_string(slot);
117 auto h =
new TH1F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5);
118 h->SetXTitle(
"pixel number");
119 h->SetYTitle(
"track count");
120 registerObject<TH1F>(name, h);
125 for (
int slot = 1; slot <= numModules; slot++) {
126 string name = (slot < 10) ?
"alphaLow_0" + to_string(slot) :
"alphaLow_" + to_string(slot);
127 string title =
"Hits w/ low alpha for slot " + to_string(slot);
128 auto h =
new TH1F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5);
129 h->SetXTitle(
"pixel number");
130 h->SetYTitle(
"hit count");
131 registerObject<TH1F>(name, h);
136 for (
int slot = 1; slot <= numModules; slot++) {
137 string name = (slot < 10) ?
"alphaHigh_0" + to_string(slot) :
"alphaHigh_" + to_string(slot);
138 string title =
"Hits w/ high alpha for slot " + to_string(slot);
139 auto h =
new TH1F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5);
140 h->SetXTitle(
"pixel number");
141 h->SetYTitle(
"hit count");
142 registerObject<TH1F>(name, h);
147 for (
int slot = 1; slot <= numModules; slot++) {
148 string name = (slot < 10) ?
"pulseHeights_0" + to_string(slot) :
"pulseHeights_" + to_string(slot);
149 string title =
"Pulse height distributions for slot " + to_string(slot);
150 auto h =
new TH2F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5, 200, 0, 2000);
151 h->SetXTitle(
"pixel number");
152 h->SetYTitle(
"pulse height");
153 registerObject<TH2F>(name, h);
158 for (
int slot = 1; slot <= numModules; slot++) {
159 string name = (slot < 10) ?
"muonZ_0" + to_string(slot) :
"muonZ_" + to_string(slot);
160 string title =
"Track z-distribution for slot " + to_string(slot);
161 auto h =
new TH1F(name.c_str(), title.c_str(), 100,
m_minZ,
m_maxZ);
162 h->SetXTitle(
"local z [cm]");
163 h->SetYTitle(
"track count");
164 registerObject<TH1F>(name, h);
175 if (not
m_recBunch->isReconstructed())
return;
179 for (
const auto& track :
m_tracks) {
182 if (not trk.
isValid())
continue;
186 auto timeStamp = getObjectPtr<TProfile>(
"timeStamp");
190 auto numTracks = getObjectPtr<TH1F>(
"numTracks");
191 numTracks->Fill(slot);
193 auto muonZ = getObjectPtr<TH1F>(
m_muonZNames[slot - 1]);
196 auto signalHits = getObjectPtr<TH1F>(
m_signalNames[slot - 1]);
197 auto bkgHits = getObjectPtr<TH1F>(
m_bkgNames[slot - 1]);
199 for (
const auto& digit :
m_digits) {
200 if (digit.getModuleID() != slot)
continue;
201 if (digit.getHitQuality() != TOPDigit::c_Good)
continue;
202 if (not
m_thresholdEff->isCalibrated(slot, digit.getChannel()))
continue;
203 double effi =
m_thresholdEff->getThrEff(slot, digit.getChannel());
207 if (digit.getTime() > 0) {
208 signalHits->Fill(digit.getPixelID(), 1 / effi);
209 pulseHeight->Fill(digit.getPixelID(), digit.getPulseHeight());
211 bkgHits->Fill(digit.getPixelID(), 1 / effi);
215 auto activePixels = getObjectPtr<TH1F>(
m_activeNames[slot - 1]);
217 for (
int pixel = 1; pixel <= activePixels->GetNbinsX(); pixel++) {
218 unsigned channel = chMapper.getChannel(pixel);
227 for (
const auto& digit :
m_digits) {
228 if (digit.getModuleID() != slot)
continue;
229 if (digit.getHitQuality() != TOPDigit::c_Good)
continue;
231 if (not pdf)
continue;
232 const auto* peak = pdf->getSinglePeak();
233 if (not peak)
continue;
234 double alpha = acos(std::abs(peak->kzd)) /
Unit::deg;
235 if (alpha > 60)
continue;
236 if (alpha < 30) alphaLow->Fill(digit.getPixelID());
237 else alphaHigh->Fill(digit.getPixelID());
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...
Class to store analytic PDF associated with a photon.
DBObjPtr< TOPCalChannelMask > m_channelMask
masked channels
double m_minThresholdEffi
minimal threshold efficiency
StoreObjPtr< TOPRecBunch > m_recBunch
reconstructed bunch
TOP::TrackSelector m_selector
track selection utility
std::vector< std::string > m_activeNames
histogram names for active pixels count
std::vector< std::string > m_alphaHighNames
histogram names for counting hits w/ high impact angle on photo cathode
std::vector< std::string > m_pulseHeightNames
histogram names for pulse heights
double m_dz
cut on POCA in z
DBObjPtr< TOPCalChannelThresholdEff > m_thresholdEff
threshold efficiencies
StoreObjPtr< EventMetaData > m_eventMetaData
event meta data object
std::vector< std::string > m_muonZNames
histogram names for track z-distribution
double m_dr
cut on POCA in r
std::vector< std::string > m_alphaLowNames
histogram names for counting hits w/ low impact angle on photo cathode
const double m_timeWindow
time window for counting photon hits (half size)
StoreArray< Track > m_tracks
collection of tracks
StoreArray< TOPAssociatedPDF > m_associatedPDFs
collection of PDF's associated to TOP digits
const double m_minZ
minimal local z of extrapolated track
const double m_excludedZ
excluded central region of extrapolated track for photon impact angle counting
const double m_maxZ
maximal local z of extrapolated track
double m_deltaEcms
c.m.s energy window
std::vector< std::string > m_signalNames
histogram names for signal window hit counts
std::vector< std::string > m_bkgNames
histogram names for background window hit counts
StoreArray< TOPDigit > m_digits
collection of TOP digits
StoreArray< ExtHit > m_extHits
collection of extrapolated hits
StoreObjPtr< TOPAsicMask > m_asicMask
online masked Asics
std::string m_sample
sample type
const ChannelMapper & getChannelMapper() const
Returns default channel mapper (mapping of channels to pixels)
static TOPGeometryPar * Instance()
Static method to obtain the pointer to its instance.
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.
const ROOT::Math::XYZPoint & getLocalPosition() const
Returns position at TOP in local frame of the track in last isSelected call.
void setDeltaEcms(double deltaEcms)
Sets cut on c.m.s.
void setCutOnPOCA(double dr, double dz)
Sets cut on point of closest approach to (0, 0, 0)
bool isSelected(const TOPTrack &track) const
Returns selection status.
void setCutOnLocalZ(double minZ, double maxZ)
Sets cut on local z coordinate (module frame) of the track extrapolated to TOP.
static const double deg
degree to radians
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.
virtual void collect() final
Replacement for event().
TOPPhotonYieldsCollectorModule()
Constructor.
virtual void prepare() final
Replacement for initialize().
Abstract base class for different kinds of events.