9#include <top/modules/collectors/TOPPulseHeightCollectorModule.h>
34 setDescription(
"A collector for channel pulse-height distributions");
39 addParam(
"xmax",
m_xmax,
"histogram upper limit [ADC counts]", 2000.0);
41 "lower and upper bound of pulse-width selection window [ns]. "
42 "Empty list means no selection on the pulse width. "
43 "Note: selection on pulse width will influence pulse-height distribution.",
46 "lower and upper bound of time selection window [ns]. "
47 "Empty list means no selection on photon time.",
m_timeWindow);
57 auto h1a =
new TH1F(
"time",
"time distribution (all hits)", 1000, -100, 250);
58 h1a->SetXTitle(
"time [ns]");
59 registerObject<TH1F>(
"time", h1a);
61 auto h1b =
new TH1F(
"time_sel",
"time distribution (selected hits)", 1000, -100, 250);
62 h1b->SetXTitle(
"time [ns]");
63 registerObject<TH1F>(
"time_sel", h1b);
65 auto h2a =
new TH2F(
"ph_vs_width",
"pulse height vs. width (all hits)",
66 200, 0, 10, 200, 0, 2000);
67 h2a->SetXTitle(
"pulse width [ns]");
68 h2a->SetYTitle(
"pulse height [ADC counts]");
69 registerObject<TH2F>(
"ph_vs_width", h2a);
71 auto h2b =
new TH2F(
"ph_vs_width_sel",
"pulse height vs. width (selected hits)",
72 200, 0, 10, 200, 0, 2000);
73 h2b->SetXTitle(
"pulse width [ns]");
74 h2b->SetYTitle(
"pulse height [ADC counts]");
75 registerObject<TH2F>(
"ph_vs_width_sel", h2b);
77 for (
int slot = 1; slot <= 16; slot++) {
78 string name =
"ph_slot_" + to_string(slot);
79 string title =
"pulse-height vs. channel for slot " + to_string(slot);
80 auto h =
new TH2F(name.c_str(), title.c_str(), 512, 0, 512,
m_nx, 0,
m_xmax);
81 h->SetXTitle(
"channel number");
82 h->SetYTitle(
"pulse height [ADC counts]");
83 registerObject<TH2F>(name, h);
93 std::vector<TH2F*> slots;
94 for (
const auto& name :
m_names) {
95 auto h = getObjectPtr<TH2F>(name);
99 auto h1a = getObjectPtr<TH1F>(
"time");
100 auto h1b = getObjectPtr<TH1F>(
"time_sel");
101 auto h2a = getObjectPtr<TH2F>(
"ph_vs_width");
102 auto h2b = getObjectPtr<TH2F>(
"ph_vs_width_sel");
104 for (
const auto& digit :
m_digits) {
105 if (digit.getHitQuality() != TOPDigit::c_Good)
continue;
106 auto t = digit.getTime();
107 auto w = digit.getPulseWidth();
108 auto ph = digit.getPulseHeight();
119 unsigned m = digit.getModuleID() - 1;
120 if (m < slots.size()) slots[m]->Fill(digit.getChannel(), ph);
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...
int m_nx
number of histogram bins
std::vector< std::string > m_names
histogram names
double m_xmax
histogram upper bound [ADC counts]
std::vector< double > m_widthWindow
lower and upper bound of pulse-width window
std::vector< double > m_timeWindow
lower and upper bound of time window
StoreArray< TOPDigit > m_digits
collection of TOP digits
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().
TOPPulseHeightCollectorModule()
Constructor.
virtual void prepare() final
Replacement for initialize().
Abstract base class for different kinds of events.