Belle II Software development
QcsmonitorModule.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#include <beast/qcsmonitor/modules/QcsmonitorModule.h>
10#include <beast/qcsmonitor/dataobjects/QcsmonitorSimHit.h>
11#include <mdst/dataobjects/MCParticle.h>
12#include <framework/datastore/StoreArray.h>
13#include <framework/datastore/RelationArray.h>
14#include <framework/datastore/RelationIndex.h>
15#include <framework/logging/Logger.h>
16
17using namespace std;
18using namespace Belle2;
19using namespace Belle2::qcsmonitor;
20
21//We have to register the module to the Framework. The "Module" part of the
22//class name will be appended automatically so every module hast to be named
23//XxxModule
24REG_MODULE(Qcsmonitor);
25
26
27QcsmonitorModule::QcsmonitorModule() : Module(), m_intParameter(0), m_doubleParameter(0), m_stringParameter("")
28{
29 setDescription("Creates QCSMONITOR crystals - sub-detector of BEASTII");
30
31 //We can define parameters which can be set from the steering file. The arguments are:
32 // name, reference to the variable where the value will be stored, description, default value
33 //If the default value is omitted the user has to specify this parameter, otherwise an error is produced
34 addParam("intParameter", m_intParameter,
35 "Useless parameter of type integer", 0);
36 addParam("doubleParameter", m_doubleParameter,
37 "Useless parameter of type double", 0.0);
38 addParam("stringParameter", m_stringParameter,
39 "Useless parameter of type string", string(""));
40 addParam("doubleListParameter", m_doubleListParameter,
41 "Useless parameter of type vector<double>", vector<double>(3, 0));
42
43
44 //Valid parameter types are int, double, string, bool and vectors of any of those
45}
46
48{
49 B2INFO("Qcsmonitor: Initialize");
50 //Here you can do some stuff before processing starts. If you want to
51 //write to some collections of the DataStore you have to register these
52 //here by using StoreArray<T>::registerPersistent() for collections which
53 //should be written to the output file by default or
54 //StoreArray<T>::registerTransient() for collections which will not be
55 //saved by default. If one just wants to access collections one should
56 //check if they were registered by using the isRequired member
57
58 StoreArray<MCParticle> mcParticles;
60 RelationArray relMCSimHit(mcParticles, simHits);
61 if (!(mcParticles.isRequired() && simHits.isRequired() && relMCSimHit.isRequired())) {
62 //Fatal is not necessary here as the storeArrays should just look
63 //empty if not registered but let's make sure everything is present
64 B2FATAL("Not all collections found, exiting processing");
65 }
66}
67
69{
70 B2INFO("Qcsmonitor: Begin of new run");
71 //Here comes the initialisation specific to each run
72}
73
75{
76 B2INFO("Qcsmonitor: Event is being processed");
77 //Here comes the actual event processing
78
79 StoreArray<MCParticle> mcParticles;
81
82 //RelationIndex is a readonly, bidirectional index for a Relation so that one
83 //can easily use the RelationArray without looping over it manually.
84 RelationIndex<MCParticle, QcsmonitorSimHit> relMCSimHit(mcParticles, simHits);
85
86 //Lets loop over all created QcsmonitorSimHits:
87 //int nSimHits = simHits.getEntries();
88 //for (int i = 0; i < nSimHits; ++i) {
89 //QcsmonitorSimHit& hit = *simHits[i];
90 //Find all MCParticles which point to that SimHit and the corresponding weight
91 //RelationIndex<MCParticle, QcsmonitorSimHit>::range_to range = relMCSimHit.getElementsTo(hit);
92 //for (; range.first != range.second; ++range.first) {
93 //And Print something about the relation
94 //const RelationIndex<MCParticle, QcsmonitorSimHit>::Element& relation = *range.to;
95 //B2INFO("QcsmonitorSimHit #" << i << " has an energy deposition of " << hit.getEnergyDep()
96 // << " and is related to MCParticle #" << relation.indexFrom
97 // << " which has an PDG code of " << relation.from->getPDG());
98 //}
99 //}
100
101 //Now let's do it the other way round:
102 int nMCParticles = mcParticles.getEntries();
103 for (int i = 0; i < nMCParticles; ++i) {
104 MCParticle& mcp = *mcParticles[i];
105 // Find all QcsmonitorSimHits which point from that MCParticle.
107 for (const relMCSimHit_Element& relation : relMCSimHit.getElementsFrom(mcp)) {
108 B2INFO("MCParticle #" << i << " created the AwesomSimHit #" << relation.indexTo
109 << " which has an energy deposition of " << relation.to->getEnergyDep());
110 }
111 }
112}
113
115{
116 B2INFO("Qcsmonitor: End of run");
117 //Here cleanup after each run
118}
119
120
122{
123 B2INFO("Qcsmonitor: Terminate");
124 //Here final cleanup
125}
A Class to store the Monte Carlo particle information.
Definition: MCParticle.h:32
Base class for Modules.
Definition: Module.h:72
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
Low-level class to create/modify relations between StoreArrays.
Definition: RelationArray.h:62
Provides access to fast ( O(log n) ) bi-directional lookups on a specified relation.
Definition: RelationIndex.h:76
range_from getElementsFrom(const FROM *from) const
Return a range of all elements pointing from the given object.
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
int getEntries() const
Get the number of objects in the array.
Definition: StoreArray.h:216
virtual void event()
Called for every end run.
virtual void initialize()
Init the module.
std::string m_stringParameter
Useless variable showing how to create string parameters.
virtual void beginRun()
Called for every begin run.
virtual void terminate()
Called on termination.
virtual void endRun()
Called for every end run.
double m_doubleParameter
Useless variable showing how to create double parameters.
int m_intParameter
Useless variable showing how to create integer parameters.
std::vector< double > m_doubleListParameter
Useless variable showing how to create array parameters.
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
Namespace to encapsulate code needed for the QCSMONITOR detector.
Abstract base class for different kinds of events.
STL namespace.