Belle II Software development
BgoModule.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/bgo/modules/BgoModule.h>
10#include <beast/bgo/dataobjects/BgoSimHit.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::bgo;
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(Bgo);
25
26
27BgoModule::BgoModule() : Module(), m_intParameter(0), m_doubleParameter(0), m_stringParameter("")
28{
29 setDescription("Creates BGO 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("Bgo: 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("Bgo: Begin of new run");
71 //Here comes the initialisation specific to each run
72}
73
75{
76 B2INFO("Bgo: 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, BgoSimHit> relMCSimHit(mcParticles, simHits);
85
86 //Lets loop over all created BgoSimHits:
87 //int nSimHits = simHits.getEntries();
88 //for (int i = 0; i < nSimHits; ++i) {
89 //BgoSimHit& hit = *simHits[i];
90 //Find all MCParticles which point to that SimHit and the corresponding weight
91 //RelationIndex<MCParticle, BgoSimHit>::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, BgoSimHit>::Element& relation = *range.to;
95 //B2INFO("BgoSimHit #" << 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 BgoSimHits which point from that MCParticle.
106 typedef RelationIndex<MCParticle, BgoSimHit>::Element relMCSimHit_Element;
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("Bgo: End of run");
117 //Here cleanup after each run
118}
119
120
122{
123 B2INFO("Bgo: 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.
Definition: BgoModule.cc:74
virtual void initialize()
Init the module.
Definition: BgoModule.cc:47
std::string m_stringParameter
Useless variable showing how to create string parameters.
Definition: BgoModule.h:60
virtual void beginRun()
Called for every begin run.
Definition: BgoModule.cc:68
virtual void terminate()
Called on termination.
Definition: BgoModule.cc:121
virtual void endRun()
Called for every end run.
Definition: BgoModule.cc:114
BgoModule()
Constructor.
Definition: BgoModule.cc:27
double m_doubleParameter
Useless variable showing how to create double parameters.
Definition: BgoModule.h:57
int m_intParameter
Useless variable showing how to create integer parameters.
Definition: BgoModule.h:54
std::vector< double > m_doubleListParameter
Useless variable showing how to create array parameters.
Definition: BgoModule.h:63
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 BGO detector.
Definition: BgoCreator.h:22
Abstract base class for different kinds of events.
STL namespace.