Belle II Software development
KLMScintillatorSimulatorModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9/* Own header. */
10#include <klm/modules/KLMScintillatorSimulator/KLMScintillatorSimulatorModule.h>
11
12/* KLM headers. */
13#include <klm/eklm/geometry/GeometryData.h>
14#include <klm/simulation/ScintillatorSimulator.h>
15
16/* Basf2 headers. */
17#include <framework/gearbox/Unit.h>
18
19/* ROOT headers. */
20#include <TH1F.h>
21
22using namespace Belle2;
23
24REG_MODULE(KLMScintillatorSimulator)
25
26static const char MemErr[] = "Memory allocation error.";
27
29 Module(),
30 m_fout(nullptr),
31 m_SciSimPar(nullptr),
32 m_hDir(nullptr),
33 m_hRef(nullptr)
34{
35 setDescription("Standalone generation and studies of ADC output.");
37 addParam("OutputFile", m_out, "Output file.",
38 std::string("KLMScintillatorSimulator.root"));
39 addParam("Mode", m_mode, "Mode (\"Shape\" or \"Strips\").",
40 std::string("Strips"));
41}
42
46
48 const char* name, double l, double d, int npe)
49{
50 int j;
51 double t, s;
52 KLM::ScintillatorSimulator fe(m_SciSimPar, nullptr, 0, false);
53 KLMTime* klmTime = &(KLMTime::Instance());
54 klmTime->updateConstants();
55 TH1F* h = nullptr;
56 t = m_SciSimPar->getNDigitizations() *
57 m_SciSimPar->getADCSamplingTDCPeriods() * klmTime->getTDCPeriod();
58 try {
59 h = new TH1F(name, "", m_SciSimPar->getNDigitizations(), 0, t);
60 } catch (std::bad_alloc& ba) {
61 B2FATAL(MemErr);
62 }
63 for (j = 0; j < m_SciSimPar->getNDigitizations(); j++) {
64 m_hDir[j] = 0;
65 m_hRef[j] = 0;
66 }
67 fe.generatePhotoelectrons(l, d, npe, 0, false);
68 fe.generatePhotoelectrons(l, d, npe, 0, true);
69 fe.fillSiPMOutput(m_hDir, true, false);
70 fe.fillSiPMOutput(m_hRef, false, true);
71 s = 0;
72 for (j = 0; j < m_SciSimPar->getNDigitizations(); j++)
73 s = s + m_hDir[j] + m_hRef[j];
74 for (j = 1; j <= m_SciSimPar->getNDigitizations(); j++)
75 h->SetBinContent(j, (m_hDir[j - 1] + m_hRef[j - 1]) / s);
76 h->Write();
77 delete h;
78}
79
81{
82 /* cppcheck-suppress variableScope */
83 char str[32];
84 /* cppcheck-suppress variableScope */
85 int i;
86 /* cppcheck-suppress variableScope */
87 double l;
88 if (!m_SciSimParDatabase.isValid())
89 B2FATAL("EKLM digitization parameters are not available.");
92 try {
93 m_fout = new TFile(m_out.c_str(), "recreate");
94 } catch (std::bad_alloc& ba) {
95 B2FATAL(MemErr);
96 }
97 m_hDir = static_cast<float*>(malloc(m_SciSimPar->getNDigitizations() * sizeof(float)));
98 if (m_hDir == nullptr)
99 B2FATAL(MemErr);
100 m_hRef = static_cast<float*>(malloc(m_SciSimPar->getNDigitizations() * sizeof(float)));
101 if (m_hRef == nullptr)
102 B2FATAL(MemErr);
103 if (m_mode.compare("Strips") == 0) {
104 for (i = 1; i <= geoDat->getNStrips(); i++) {
105 l = geoDat->getStripLength(i) / CLHEP::mm * Unit::mm;
106 snprintf(str, 32, "h%d_near", i);
107 generateHistogram(str, l, 0, 10000);
108 snprintf(str, 32, "h%d_far", i);
109 generateHistogram(str, l, l, 10000);
110 }
111 } else if (m_mode.compare("Shape") == 0) {
112 m_SciSimPar->setMirrorReflectiveIndex(0);
113 generateHistogram("FitShape", 0, 0, 1000000);
114 } else
115 B2FATAL("Unknown operation mode.");
116 free(m_hDir);
117 free(m_hRef);
118 m_fout->Close();
119 delete m_fout;
120}
121
126
int getNStrips() const
Get number of strips.
EKLM geometry data.
static const GeometryData & Instance(enum DataSource dataSource=c_Database, const GearDir *gearDir=nullptr)
Instantiation.
double getStripLength(int strip) const
Get strip length.
Class to store KLM scintillator simulation parameters in the database.
void generateHistogram(const char *name, double l, double d, int npe)
Generate output histogram.
void terminate() override
This method is called at the end of the event processing.
KLMScintillatorDigitizationParameters * m_SciSimPar
Scintillator simulation parameters.
DBObjPtr< KLMScintillatorDigitizationParameters > m_SciSimParDatabase
Scintillator simulation parameters.
KLM time conversion.
Definition KLMTime.h:27
double getTDCPeriod() const
Get TDC period.
Definition KLMTime.h:45
void updateConstants()
Update constants from database objects.
Definition KLMTime.cc:20
static KLMTime & Instance()
Instantiation.
Definition KLMTime.cc:14
Digitize EKLMSim2Hits to get EKLM StripHits.
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition Module.cc:208
Module()
Constructor.
Definition Module.cc:30
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition Module.h:80
static const double mm
[millimeters]
Definition Unit.h:70
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
Abstract base class for different kinds of events.