Belle II Software development
MicrotpcModule.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/microtpc/modules/MicrotpcModule.h>
10#include <beast/microtpc/dataobjects/MicrotpcSimHit.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#include <boost/foreach.hpp>
17
18using namespace std;
19using namespace Belle2;
20using namespace Belle2::microtpc;
21
22//We have to register the module to the Framework. The "Module" part of the
23//class name will be appended automatically so every module hast to be named
24//XxxModule
25REG_MODULE(Microtpc);
26
27
28MicrotpcModule::MicrotpcModule() : Module(), m_intParameter(0), m_doubleParameter(0), m_stringParameter("")
29{
30 setDescription("Creates micro-Time Projection Chamber - sub-detector of BEASTII");
31
32 //We can define parameters which can be set from the steering file. The arguments are:
33 // name, reference to the veriable where the value will be stored, description, default value
34 //If the default value is ommited the user has to specify this parameter, otherwise an error is produced
35 addParam("intParameter", m_intParameter,
36 "Useless parameter of type integer", 0);
37 addParam("doubleParameter", m_doubleParameter,
38 "Useless parameter of type double", 0.0);
39 addParam("stringParameter", m_stringParameter,
40 "Useless parameter of type string", string(""));
41 addParam("doubleListParameter", m_doubleListParameter,
42 "Useless parameter of type vector<double>", vector<double>(3, 0));
43
44 //Valid parameter types are int, double, string, bool and vectors of any of those
45}
46
48{
49 B2INFO("Microtpc: 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 neccessary 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("Microtpc: Begin of new run");
71 //Here comes the initialisation specific to each run
72}
73
75{
76 B2INFO("Microtpc: 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, MicrotpcSimHit> relMCSimHit(mcParticles, simHits);
85
86 //Lets loop over all created MicrotpcSimHits:
87 //int nSimHits = simHits.getEntries();
88 //for (int i = 0; i < nSimHits; ++i) {
89 // MicrotpcSimHit& hit = *simHits[i];
90 //Find all MCParticles which point to that SimHit and the corresponding weight
91 //RelationIndex<MCParticle, MicrotpcSimHit>::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, MicrotpcSimHit>::Element& relation = *range.first;
95 //B2INFO("MicrotpcSimHit #" << 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 MicrotpcSimHits which point from that MCParticle using a typedef and BOOST_FOREACH
106 //The typedef is needed as BOOST_FOREACH is a macro and cannot handle anything including a comma
107 typedef RelationIndex<MCParticle, MicrotpcSimHit>::Element relMCSimHit_Element;
108 BOOST_FOREACH(const relMCSimHit_Element & relation, relMCSimHit.getElementsFrom(mcp)) {
109 B2INFO("MCParticle #" << i << " created the AwesomSimHit #" << relation.indexTo
110 << " which has an energy deposition of " << relation.to->getEnergyDep());
111 }
112 }
113}
114
116{
117 B2INFO("Microtpc: End of run");
118 //Here cleanup after each run
119}
120
121
123{
124 B2INFO("Microtpc: Terminate");
125 //Here final cleanup
126}
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:560
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
Namespace to encapsulate code needed for the MICROTPC detector.
Abstract base class for different kinds of events.
STL namespace.