62 const std::string& settingTotal,
63 const std::string& settingPrompt,
64 const std::string& settingDelayed,
66 const bool totalT =
true;
68 settingPrompt.find(
"t") != std::string::npos ? true :
false;
70 settingDelayed.find(
"t") != std::string::npos ? true :
false;
71 const bool electronT =
72 settingTotal.find(
"e") != std::string::npos ? true :
false;
73 const bool electronP =
74 settingPrompt.find(
"e") != std::string::npos ? true :
false;
75 const bool electronD =
76 settingDelayed.find(
"e") != std::string::npos ? true :
false;
77 const bool ionT = settingTotal.find(
"i") != std::string::npos ? true :
false;
78 const bool ionP = settingPrompt.find(
"i") != std::string::npos ? true :
false;
80 settingDelayed.find(
"i") != std::string::npos ? true :
false;
82 constexpr int lineThickness = 5;
83 constexpr double tol = 1e-50;
86 std::cerr <<
m_className <<
"::PlotSignal: Sensor is not defined.\n";
92 canvas->SetTitle(
"Signal");
94 unsigned int nBins = 100;
95 double t0 = 0., dt = 1.;
96 m_sensor->GetTimeWindow(t0, dt, nBins);
97 const double t1 = t0 + nBins * dt;
99 std::string xlabel =
"time [ns]";
100 std::string ylabel = m_labelY;
101 if (ylabel.empty()) {
102 ylabel = m_sensor->IsIntegrated(label) ?
"signal [fC]" :
"signal [fC / ns]";
104 unsigned int nPlots = same ? 1 : 0;
109 m_hSignal.reset(
new TH1D(hname.c_str(),
"", nBins, t0, t1));
110 m_hSignal->SetDirectory(
nullptr);
111 m_hSignal->SetLineColor(m_colTotal);
112 for (
unsigned int i = 0; i < nBins; ++i) {
113 const double sig = m_sensor->GetSignal(label, i, 0);
114 if (!std::isnan(sig) && std::abs(sig) < tol) {
115 m_hSignal->SetBinContent(i + 1, 0.);
117 m_hSignal->SetBinContent(i + 1, sig);
121 m_hSignal->SetLineWidth(lineThickness);
123 const std::string opt = nPlots > 0 ?
"same" :
"";
127 const auto nCrossings = m_sensor->GetNumberOfThresholdCrossings();
128 if (nCrossings > 0) {
130 gCrossings.SetMarkerStyle(20);
131 gCrossings.SetMarkerColor(m_colTotal);
132 std::vector<double> xp;
133 std::vector<double> yp;
134 double time = 0., level = 0.;
136 for (
unsigned int i = 0; i < nCrossings; ++i) {
137 if (m_sensor->GetThresholdCrossing(i, time, level, rise)) {
142 gCrossings.DrawGraph(xp.size(), xp.data(), yp.data(),
"psame");
144 DrawHistogram(m_hSignal.get(), opt, xlabel, ylabel);
149 m_hDelayedSignal.reset(
new TH1D(hname.c_str(),
"", nBins, t0, t1));
150 m_hDelayedSignal->SetDirectory(
nullptr);
151 m_hDelayedSignal->SetLineColor(m_colDelayed[3]);
152 m_hDelayedSignal->SetLineStyle(7);
153 m_hDelayedSignal->SetStats(0);
154 for (
unsigned int i = 0; i < nBins; ++i) {
155 const double sig = m_sensor->GetSignal(label, i, 2);
156 if (!std::isnan(sig) && std::abs(sig) < tol) {
157 m_hDelayedSignal->SetBinContent(i + 1, 0.);
159 m_hDelayedSignal->SetBinContent(i + 1, sig);
162 m_hDelayedSignal->SetLineWidth(lineThickness);
163 m_hDelayedSignal->DrawCopy(
"same");
168 m_hPromptSignal.reset(
new TH1D(hname.c_str(),
"", nBins, t0, t1));
169 m_hPromptSignal->SetDirectory(
nullptr);
170 m_hPromptSignal->SetLineColor(m_colPrompt[0]);
171 m_hPromptSignal->SetLineStyle(2);
172 m_hPromptSignal->SetStats(0);
173 for (
unsigned int i = 0; i < nBins; ++i) {
174 const double sig = m_sensor->GetSignal(label, i, 1);
175 if (!std::isnan(sig) && std::abs(sig) < tol) {
176 m_hPromptSignal->SetBinContent(i + 1, 0.);
178 m_hPromptSignal->SetBinContent(i + 1, sig);
182 m_hPromptSignal->SetLineWidth(lineThickness);
183 m_hPromptSignal->DrawCopy(
"same");
188 m_hSignalElectrons.reset(
new TH1D(hname.c_str(),
"", nBins, t0, t1));
189 m_hSignalElectrons->SetDirectory(
nullptr);
190 m_hSignalElectrons->SetLineColor(m_colElectrons);
191 for (
unsigned int i = 0; i < nBins; ++i) {
192 const double sig = m_sensor->GetElectronSignal(label, i);
193 m_hSignalElectrons->SetBinContent(i + 1, sig);
195 m_hSignalElectrons->SetLineWidth(lineThickness);
196 m_hSignalElectrons->DrawCopy(
"same");
201 m_hDelayedElectrons.reset(
new TH1D(hname.c_str(),
"", nBins, t0, t1));
202 m_hDelayedElectrons->SetDirectory(
nullptr);
203 m_hDelayedElectrons->SetLineColor(m_colDelayed[4]);
204 m_hDelayedElectrons->SetLineStyle(7);
205 m_hDelayedElectrons->SetStats(0);
206 for (
unsigned int i = 0; i < nBins; ++i) {
207 const double sig = m_sensor->GetDelayedElectronSignal(label, i);
208 if (!std::isnan(sig) && std::abs(sig) < tol) {
209 m_hDelayedElectrons->SetBinContent(i + 1, 0.);
211 m_hDelayedElectrons->SetBinContent(i + 1, sig);
214 m_hDelayedElectrons->SetLineWidth(lineThickness);
215 m_hDelayedElectrons->DrawCopy(
"same");
220 m_hPromptElectrons.reset(
new TH1D(hname.c_str(),
"", nBins, t0, t1));
221 m_hPromptElectrons->SetDirectory(
nullptr);
222 m_hPromptElectrons->SetLineColor(m_colPrompt[1]);
223 m_hPromptElectrons->SetLineStyle(2);
224 m_hPromptElectrons->SetStats(0);
225 for (
unsigned int i = 0; i < nBins; ++i) {
226 const double sig = m_sensor->GetElectronSignal(label, i) -
227 m_sensor->GetDelayedElectronSignal(label, i);
228 if (!std::isnan(sig) && std::abs(sig) < tol) {
229 m_hPromptElectrons->SetBinContent(i + 1, 0.);
231 m_hPromptElectrons->SetBinContent(i + 1, sig);
235 m_hPromptElectrons->SetLineWidth(lineThickness);
236 m_hPromptElectrons->DrawCopy(
"same");
241 m_hSignalIons.reset(
new TH1D(hname.c_str(),
"", nBins, t0, t1));
242 m_hSignalIons->SetDirectory(
nullptr);
243 m_hSignalIons->SetLineColor(m_colIons);
244 for (
unsigned int i = 0; i < nBins; ++i) {
245 const double sig = m_sensor->GetIonSignal(label, i);
246 m_hSignalIons->SetBinContent(i + 1, sig);
248 m_hSignalIons->SetLineWidth(lineThickness);
249 m_hSignalIons->DrawCopy(
"same");
254 m_hDelayedIons.reset(
new TH1D(hname.c_str(),
"", nBins, t0, t1));
255 m_hDelayedIons->SetDirectory(
nullptr);
256 m_hDelayedIons->SetLineColor(m_colDelayed[5]);
257 m_hDelayedIons->SetLineStyle(7);
258 m_hDelayedIons->SetStats(0);
259 for (
unsigned int i = 0; i < nBins; ++i) {
260 const double sig = m_sensor->GetDelayedIonSignal(label, i);
261 if (!std::isnan(sig) && std::abs(sig) < tol) {
262 m_hDelayedIons->SetBinContent(i + 1, 0.);
264 m_hDelayedIons->SetBinContent(i + 1, sig);
267 m_hDelayedIons->SetLineWidth(lineThickness);
268 m_hDelayedIons->DrawCopy(
"same");
274 m_hPromptIons.reset(
new TH1D(hname.c_str(),
"", nBins, t0, t1));
275 m_hPromptIons->SetDirectory(
nullptr);
276 m_hPromptIons->SetLineColor(m_colPrompt[2]);
277 m_hPromptIons->SetLineStyle(2);
278 m_hPromptIons->SetStats(0);
279 for (
unsigned int i = 0; i < nBins; ++i) {
280 const double sig = m_sensor->GetIonSignal(label, i) -
281 m_sensor->GetDelayedIonSignal(label, i);
282 if (!std::isnan(sig) && std::abs(sig) < tol) {
283 m_hPromptIons->SetBinContent(i + 1, 0.);
285 m_hPromptIons->SetBinContent(i + 1, sig);
289 m_hPromptIons->SetLineWidth(lineThickness);
290 m_hPromptIons->DrawCopy(
"same");
294 TLegend* leg =
new TLegend(0.7, 0.7, 0.9, 0.9);
295 leg->SetHeader(
"Induced current components");
296 if (totalT) leg->AddEntry(m_hSignal.get(),
"Total induced signal",
"l");
298 leg->AddEntry(m_hPromptSignal.get(),
"Prompt induced signal",
"l");
301 leg->AddEntry(m_hDelayedSignal.get(),
"Delayed induced signal",
"l");
304 leg->AddEntry(m_hSignalElectrons.get(),
"Electron induced signal",
"l");
307 leg->AddEntry(m_hPromptElectrons.get(),
"Electron prompt induced signal",
311 leg->AddEntry(m_hDelayedElectrons.get(),
312 "Electron delayed induced signal",
"l");
314 if (ionT) leg->AddEntry(m_hSignalIons.get(),
"Ion induced signal",
"l");
316 leg->AddEntry(m_hPromptIons.get(),
"Ion/hole prompt induced signal",
"l");
319 leg->AddEntry(m_hDelayedIons.get(),
"Ion/hole delayed induced signal",