9#include <top/modules/collectors/TOPPhotonYieldsCollectorModule.h>
10#include <top/reconstruction_cpp/TOPTrack.h>
11#include <top/geometry/TOPGeometryPar.h>
12#include <top/dataobjects/TOPTimeZero.h>
15#include <framework/gearbox/Unit.h>
16#include <framework/logging/Logger.h>
46 setDescription(
"A collector for photon pixel yields aimed for PMT ageing studies and for finding optically decoupled PMT's");
50 addParam(
"sample",
m_sample,
"sample type: one of dimuon or bhabha", std::string(
"dimuon"));
51 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* tofCorrections =
new TProfile(
"tofCorrections",
"TOF corrections; local z [cm]; t0 [ns]", 1000,
m_minZprism,
m_maxZ, -1, 1);
88 auto* timeStamp =
new TProfile(
"timeStamp",
"Time stamp; ; unix time", 1, 0, 1, 0, 1.0e10,
"S");
92 auto* numTracks =
new TH1F(
"numTracks",
"Number of tracks per slot; slot number; track count", numModules, 0.5, numModules + 0.5);
96 for (
int slot = 1; slot <= numModules; slot++) {
97 string name = (slot < 10) ?
"signalHits_0" + to_string(slot) :
"signalHits_" + to_string(slot);
98 string title =
"Hits in signal window for slot " + to_string(slot);
99 auto h =
new TH1F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5);
100 h->SetXTitle(
"pixel number");
101 h->SetYTitle(
"hit count");
107 for (
int slot = 1; slot <= numModules; slot++) {
108 string name = (slot < 10) ?
"bkgHits_0" + to_string(slot) :
"bkgHits_" + to_string(slot);
109 string title =
"Hits in background window for slot " + to_string(slot);
110 auto h =
new TH1F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5);
111 h->SetXTitle(
"pixel number");
112 h->SetYTitle(
"hit count");
118 for (
int slot = 1; slot <= numModules; slot++) {
119 string name = (slot < 10) ?
"activePixels_0" + to_string(slot) :
"activePixels_" + to_string(slot);
120 string title =
"Active pixels for slot " + to_string(slot);
121 auto h =
new TH1F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5);
122 h->SetXTitle(
"pixel number");
123 h->SetYTitle(
"track count");
129 for (
int slot = 1; slot <= numModules; slot++) {
130 string name = (slot < 10) ?
"effectiveSignalHits_0" + to_string(slot) :
"effectiveSignalHits_" + to_string(slot);
131 string title =
"Effective signal hits for slot " + to_string(slot);
132 auto h =
new TH1F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5);
133 h->SetXTitle(
"pixel number");
134 h->SetYTitle(
"hit count");
140 for (
int slot = 1; slot <= numModules; slot++) {
141 string name = (slot < 10) ?
"alphaLow_0" + to_string(slot) :
"alphaLow_" + to_string(slot);
142 string title =
"Hits w/ low alpha for slot " + to_string(slot);
143 auto h =
new TH1F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5);
144 h->SetXTitle(
"pixel number");
145 h->SetYTitle(
"hit count");
151 for (
int slot = 1; slot <= numModules; slot++) {
152 string name = (slot < 10) ?
"alphaHigh_0" + to_string(slot) :
"alphaHigh_" + to_string(slot);
153 string title =
"Hits w/ high alpha for slot " + to_string(slot);
154 auto h =
new TH1F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5);
155 h->SetXTitle(
"pixel number");
156 h->SetYTitle(
"hit count");
162 for (
int slot = 1; slot <= numModules; slot++) {
163 string name = (slot < 10) ?
"pulseHeights_0" + to_string(slot) :
"pulseHeights_" + to_string(slot);
164 string title =
"Pulse height distributions for slot " + to_string(slot);
165 auto h =
new TH2F(name.c_str(), title.c_str(), numPixels, 0.5, numPixels + 0.5, 200, 0, 2000);
166 h->SetXTitle(
"pixel number");
167 h->SetYTitle(
"pulse height");
173 for (
int slot = 1; slot <= numModules; slot++) {
174 string name = (slot < 10) ?
"muonZ_0" + to_string(slot) :
"muonZ_" + to_string(slot);
175 string title =
"Track z-distribution for slot " + to_string(slot);
176 auto h =
new TH1F(name.c_str(), title.c_str(), 100,
m_minZ,
m_maxZ);
177 h->SetXTitle(
"local z [cm]");
178 h->SetYTitle(
"track count");
190 if (not
m_recBunch->isReconstructed())
return;
194 for (
const auto& track :
m_tracks) {
197 if (not trk.
isValid())
continue;
201 double localZ =
m_selector.getLocalPosition().Z();
203 if (timeZero and timeZero->isValid()) {
205 tofCorrections->Fill(localZ, timeZero->getTime());
207 if (localZ <
m_minZ)
continue;
215 numTracks->Fill(slot);
218 muonZ->Fill(
m_selector.getLocalPosition().Z());
223 for (
const auto& digit :
m_digits) {
224 if (digit.getModuleID() != slot)
continue;
225 if (digit.getHitQuality() != TOPDigit::c_Good)
continue;
227 if (digit.getTime() > 0) {
228 signalHits->Fill(digit.getPixelID());
229 pulseHeight->Fill(digit.getPixelID(), digit.getPulseHeight());
231 bkgHits->Fill(digit.getPixelID());
237 for (
int pixel = 1; pixel <= activePixels->GetNbinsX(); pixel++) {
238 unsigned channel = chMapper.getChannel(pixel);
245 for (
const auto& digit :
m_digits) {
246 if (digit.getModuleID() != slot)
continue;
247 if (digit.getHitQuality() != TOPDigit::c_Good)
continue;
249 if (not pdf)
continue;
250 const auto* peak = pdf->getSinglePeak();
251 if (not peak)
continue;
252 effectiveSignalHits->Fill(digit.getPixelID());
254 double alpha = acos(std::abs(peak->kzd)) /
Unit::deg;
255 if (alpha > 60)
continue;
256 if (alpha < 30) alphaLow->Fill(digit.getPixelID());
257 else alphaHigh->Fill(digit.getPixelID());
void registerObject(const std::string &name, T *obj)
Register object with a name, takes ownership, do not access the pointer beyond prepare()
T * getObjectPtr(const 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...
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
Class to store analytic PDF associated with a photon.
DBObjPtr< TOPCalChannelMask > m_channelMask
masked channels
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
StoreObjPtr< EventMetaData > m_eventMetaData
event meta data object
std::vector< std::string > m_effectiveSignalNames
histogram names for effective signal hits in pixels
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
const double m_minZprism
most minimal local z of extrapolated track (this includes prism)
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
Class to store T0 information.
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.
const ExtHit * getExtHit() const
Returns extrapolated hit (track entrance to the bar)
int getModuleID() const
Returns slot ID.
Utility for the track selection - used in various calibration modules.
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.