Belle II Software  release-08-01-10
RawSecMapRootInterface.h
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 #pragma once
10 
11 #include <tracking/trackFindingVXD/sectorMapTools/FilterValueDataSet.h>
12 
13 #include <framework/logging/Logger.h>
14 
15 #include <framework/pcore/RootMergeable.h>
16 #include <framework/datastore/StoreObjPtr.h>
17 
18 #include <framework/pcore/ProcHandler.h>
19 
20 #include <TFile.h>
21 #include <TTree.h>
22 #include <string>
23 
24 
25 namespace Belle2 {
33  protected:
34 
36  TFile* m_file;
37 
39  std::string m_name;
40 
43 
46 
49 
52 
53 
54  public:
55 
56 
58  RawSecMapRootInterface(const std::string& mapName, const std::string& tag) :
59  m_name(mapName),
60  m_tree2Hit((m_name + std::string("2Hit")), DataStore::c_Persistent),
61  m_data2Hit({}),
62  m_tree3Hit((m_name + std::string("3Hit")), DataStore::c_Persistent),
63  m_data3Hit({})
64 
65  {
66  // the "create" option results in the file not being opened if already existing
67  std::string fileName = mapName + "_" + tag + ".root";
68  m_file = new TFile((fileName).c_str(), "CREATE");
69  if (!m_file->IsOpen()) {
70  B2FATAL("File was not opened! File name: " << fileName << " (maybe it already esists!?)");
71  }
72  m_file->cd();
73  }
74 
77 
78 
80  RawSecMapRootInterface(const RawSecMapRootInterface& rawSecMapInterFace) = delete;
83  m_file(nullptr),
84  m_name(std::move(other.m_name)),
85  m_tree2Hit(std::move(other.m_tree2Hit)),
86  m_data2Hit(std::move(other.m_data2Hit)),
87  m_tree3Hit(std::move(other.m_tree3Hit)),
88  m_data3Hit(std::move(other.m_data3Hit))
89  {
90  // the new object takes ownership of the file
91  m_file = other.m_file;
92  other.m_file = nullptr;
93  }
94 
96  RawSecMapRootInterface& operator = (const RawSecMapRootInterface& rawSecMapInterFace) = delete;
97 
98 
100  void initialize2Hit(std::vector<std::string> filterNames)
101  {
102  B2DEBUG(20, "RawSecMapRootInterface::initialize2Hit: start - got " << filterNames.size() << " filters");
103  B2DEBUG(20, "and root file got size of: " << m_file->GetSize());
104  m_file->cd();
105 
106  // preparing StoreObjPtr:
107  bool registered = m_tree2Hit.registerInDataStore((m_name + std::string("2Hit")), DataStore::c_ErrorIfAlreadyRegistered);
108  bool constructed = m_tree2Hit.construct((m_name + std::string("2Hit")).c_str(), "Raw data of two-hit-combinations for a sectorMap");
109  B2DEBUG(20, "RawSecMapRootInterface::initialize2Hit: isRegistered/isConstructed: " << registered << "/" << constructed);
110 
111  // preparing data-mask for 2-hit-combinations:
113 
114  m_tree2Hit->get().Branch("expNo", &(m_data2Hit.expNo));
115  m_tree2Hit->get().Branch("runNo", &(m_data2Hit.runNo));
116  m_tree2Hit->get().Branch("evtNo", &(m_data2Hit.evtNo));
117  m_tree2Hit->get().Branch("trackNo", &(m_data2Hit.trackNo));
118  m_tree2Hit->get().Branch("pdg", &(m_data2Hit.pdg));
119  m_tree2Hit->get().Branch("outerSecID", &(m_data2Hit.secIDs.outer));
120  m_tree2Hit->get().Branch("innerSecID", &(m_data2Hit.secIDs.inner));
121 
122  B2DEBUG(20, "RawSecMapRootInterface::initialize2Hit: adding " << filterNames.size() << " filters as branches to ttree ");
123  for (auto& name : filterNames) {
124  double* valuePtr = m_data2Hit.getValuePtr(name);
125  if (valuePtr != nullptr) {
126  B2DEBUG(20, "RawSecMapRootInterface::initialize2Hit: adding now branch with name " << name);
127  m_tree2Hit->get().Branch(name.c_str(), valuePtr);
128  } else {
129  B2ERROR("RawSecMapRootInterface::initialize2Hit: filterName " << name <<
130  " not known! this is unintended behavior - skipping filter");
131  }
132 
133  }
134  B2DEBUG(20, "RawSecMapRootInterface::initialize2Hit: nBranches/nEntries: " << m_tree2Hit->get().GetNbranches() << "/" <<
135  m_tree2Hit->get().GetEntries());
136  }
137 
138 
139 
141  void initialize3Hit(std::vector<std::string> filterNames)
142  {
143  B2DEBUG(20, "RawSecMapRootInterface::initialize3Hit: start");
144  m_file->cd();
145 
146  // preparing StoreObjPtr:
147  bool registered = m_tree3Hit.registerInDataStore((m_name + std::string("3Hit")), DataStore::c_ErrorIfAlreadyRegistered);
148  bool constructed = m_tree3Hit.construct((m_name + std::string("3Hit")).c_str(),
149  "Raw data of three-hit-combinations for a sectorMap");
150  B2DEBUG(20, "RawSecMapRootInterface::initialize3Hit: isRegistered/isConstructed: " << registered << "/" << constructed);
151 
152  // preparing data-mask for 2-hit-combinations:
154 
155  m_tree3Hit->get().Branch("expNo", &(m_data3Hit.expNo));
156  m_tree3Hit->get().Branch("runNo", &(m_data3Hit.runNo));
157  m_tree3Hit->get().Branch("evtNo", &(m_data3Hit.evtNo));
158  m_tree3Hit->get().Branch("trackNo", &(m_data3Hit.trackNo));
159  m_tree3Hit->get().Branch("pdg", &(m_data3Hit.pdg));
160  m_tree3Hit->get().Branch("outerSecID", &(m_data3Hit.secIDs.outer));
161  m_tree3Hit->get().Branch("centerSecID", &(m_data3Hit.secIDs.center));
162  m_tree3Hit->get().Branch("innerSecID", &(m_data3Hit.secIDs.inner));
163 
164  B2DEBUG(20, "RawSecMapRootInterface::initialize3Hit: adding " << filterNames.size() << " filters as branches to ttree ");
165  for (auto& name : filterNames) {
166  double* valuePtr = m_data3Hit.getValuePtr(name);
167  if (valuePtr != nullptr) {
168  B2DEBUG(20, "RawSecMapRootInterface::initialize3Hit: adding now branch with name " << name);
169  m_tree3Hit->get().Branch(name.c_str(), valuePtr);
170  } else {
171  B2ERROR("RawSecMapRootInterface::initialize3Hit: filterName " << name <<
172  " not known! this is unintended behavior - skipping filter");
173  }
174 
175  }
176  B2DEBUG(20, "RawSecMapRootInterface::initialize3Hit: nBranches/nEntries: " << m_tree3Hit->get().GetNbranches() << "/" <<
177  m_tree3Hit->get().GetEntries());
178  }
179 
182 
183 
186 
187 
188 
191  void fill2Hit()
192  {
193  if (!m_data2Hit.isValid()) {
194  B2ERROR("RawSecMapRootInterface::fill2Hit: attempt to fill invalid data in the tree! -> unintended behavior, data will not be filled.");
195  m_data2Hit.reset();
196  return;
197  }
198  m_tree2Hit->get().Fill();
199  m_data2Hit.reset();
200  }
201 
202 
205  void fill3Hit()
206  {
207  if (!m_data3Hit.isValid()) {
208  B2ERROR("RawSecMapRootInterface::fill3Hit: attempt to fill invalid data in the tree! -> unintended behavior, data will not be filled.");
209  m_data3Hit.reset();
210  return;
211  }
212  m_tree3Hit->get().Fill();
213  m_data3Hit.reset();
214  }
215 
216 
218  void write()
219  {
220  B2DEBUG(20, "RawSecMapRootInterface::write: start");
221  m_file->cd();
222 
224  //use TFile you created in initialize()
225  m_tree2Hit->write(m_file);
226  m_tree3Hit->write(m_file);
227 
228  }
229  }
230 
231  };
233 }
234 
In the store you can park objects that have to be accessed by various modules.
Definition: DataStore.h:51
@ c_ErrorIfAlreadyRegistered
If the object/array was already registered, produce an error (aborting initialisation).
Definition: DataStore.h:72
@ c_Persistent
Object is available during entire execution time.
Definition: DataStore.h:60
contains the relevant information needed for filling a TTree containing train-data for the secMap.
static bool isOutputProcess()
Return true if the process is an output process.
Definition: ProcHandler.cc:232
static bool parallelProcessingUsed()
Returns true if multiple processes have been spawned, false in single-core mode.
Definition: ProcHandler.cc:226
To be used as an interface to root-stuff.
FilterValueDataSet< SecIDPair > m_data2Hit
Mask for storing dataSets to be piped into 2hit-tree.
RawSecMapRootInterface & operator=(const RawSecMapRootInterface &rawSecMapInterFace)=delete
That class shall not be copied.
RawSecMapRootInterface(RawSecMapRootInterface &&other)
but it may be moved
StoreObjPtr< RootMergeable< TTree > > m_tree3Hit
interface to the TTree storing three-hit-variables.
void fill3Hit()
fill three-hit-combinations in tree, triggers an Error if values not set yet.
FilterValueDataSet< SecIDPair > & get2HitDataSet()
returns a reference to the 2-hit-dataset so one can set the relevant values.
void initialize3Hit(std::vector< std::string > filterNames)
initialize the RawSecMapRootInterface for three-hit-combinations (to be called in Module::initialize(...
StoreObjPtr< RootMergeable< TTree > > m_tree2Hit
interface to the TTree storing two-hit-variables.
void fill2Hit()
fill two-hit-combinations in tree, triggers an Error if values not set yet.
TFile * m_file
a pointer to the file where the Tree shall be stored.
void write()
write all trees to file at end of processing.
void initialize2Hit(std::vector< std::string > filterNames)
initialize the RawSecMapRootInterface for two-hit-combinations (to be called in Module::initialize().
RawSecMapRootInterface(const RawSecMapRootInterface &rawSecMapInterFace)=delete
That class shall not be copied.
FilterValueDataSet< SecIDTriplet > m_data3Hit
Mask for storing dataSets to be piped into 3hit-tree.
RawSecMapRootInterface(const std::string &mapName, const std::string &tag)
Constructor - prepares ttree.
FilterValueDataSet< SecIDTriplet > & get3HitDataSet()
returns a reference to the 3-hit-dataset so one can set the relevant values.
~RawSecMapRootInterface()
destructor deleting the rootFile.
std::string m_name
name of the StoreObjPtr.
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:96
Abstract base class for different kinds of events.