Belle II Software  release-08-01-10
CalibObjManager.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 #include <calibration/CalibObjManager.h>
9 
10 #include <string>
11 #include <boost/algorithm/string/split.hpp>
12 #include <boost/algorithm/string/classification.hpp>
13 #include <TTree.h>
14 
15 using namespace std;
16 using namespace Belle2;
17 using namespace Calibration;
18 
19 namespace Belle2 {
24  template<>
25  TTree* CalibObjManager::cloneObj(TTree* source, const std::string& newName) const
26  {
27  B2DEBUG(100, "Held object is a TTree which will be have CloneTree() called.");
28  // Construct the TTree by making a copy
29  // of the source TTree
30  TTree* dest = source->CloneTree(0);
31  dest->SetName(newName.c_str());
32  return dest;
33  }
34 
35  void CalibObjManager::deleteHeldObjects()
36  {
37  m_templateObjects.clear();
38  }
39 
40  void CalibObjManager::addObject(const string& name, shared_ptr<TNamed> object)
41  {
42  if (m_templateObjects.find(name) != m_templateObjects.end()) {
43  m_templateObjects[name].reset();
44  }
45  m_templateObjects[name] = object;
46  }
47 
48  void CalibObjManager::createDirectories()
49  {
50  for (auto& x : m_templateObjects) {
51  if (m_dir->GetDirectory(x.first.c_str()) == 0) {
52  m_dir->mkdir(x.first.c_str());
53  TDirectory* objectDir = m_dir->GetDirectory(x.first.c_str());
54  objectDir->SetWritable(true);
55  B2DEBUG(100, "Made TDirectory: " << x.first);
56  }
57  }
58  }
59 
60  void CalibObjManager::createExpRunDirectories(ExpRun& expRun) const
61  {
62  for (auto& x : m_templateObjects) {
63  TDirectory* objectDir = m_dir->GetDirectory(x.first.c_str());
64  string dirName = x.first + getSuffix(expRun);
65  TDirectory* newDir = objectDir->GetDirectory(dirName.c_str());
66  if (!newDir) {
67  newDir = objectDir->mkdir(dirName.c_str());
68  newDir->SetWritable(true);
69  B2DEBUG(100, "Made TDirectory " << newDir->GetPath());
70  }
71  }
72  }
73 
74  void CalibObjManager::writeCurrentObjects(const ExpRun& expRun)
75  {
76  for (auto& x : m_templateObjects) {
77  TDirectory* objectDir = m_dir->GetDirectory((x.first + '/' + getObjectExpRunName(x.first, expRun)).c_str());
78  B2DEBUG(100, "Writing for " << x.first);
79  for (auto key : * (objectDir->GetList())) {
80  B2DEBUG(100, "Writing for " << key->GetName());
81  TNamed* objMemory = dynamic_cast<TNamed*>(objectDir->FindObject(key->GetName()));
82  if (objMemory) {
83  objectDir->WriteTObject(objMemory, key->GetName(), "Overwrite");
84  }
85  }
86  }
87  }
88 
89  void CalibObjManager::clearCurrentObjects(const ExpRun& expRun)
90  {
91  for (auto& x : m_templateObjects) {
92  TDirectory* objectDir = m_dir->GetDirectory((x.first + '/' + getObjectExpRunName(x.first, expRun)).c_str());
93  B2DEBUG(100, "We are deleting all the in-memory + file objects " << objectDir->GetPath());
94  objectDir->DeleteAll();
95  }
96  }
97 
98  unsigned int CalibObjManager::getHighestIndexObject(const string& name, const TDirectory* dir) const
99  {
100  unsigned int index = 0;
101  // Try from the list of objects
102  for (auto key : * (dir->GetList())) {
103  string keyName = key->GetName();
104  if (keyName.find(name) != std::string::npos) {
105  B2DEBUG(1000, "Found previous Object " << keyName << " in the directory " << dir->GetPath());
106  unsigned int currentIndex = extractKeyIndex(keyName);
107  if (currentIndex > index) {
108  index = currentIndex;
109  }
110  }
111  }
112  // Try from List of keys
113  for (auto key : * (dir->GetListOfKeys())) {
114  string keyName = key->GetName();
115  if (keyName.find(name) != std::string::npos) {
116  B2DEBUG(1000, "Found previous Key " << keyName << " in the directory " << dir->GetPath());
117  unsigned int currentIndex = extractKeyIndex(keyName);
118  if (currentIndex > index) {
119  index = currentIndex;
120  }
121  }
122  }
123  B2DEBUG(1000, "Returning highest index " << index);
124  return index;
125  }
126 
127  string CalibObjManager::getSuffix(const ExpRun& expRun) const
128  {
129  return "_" + encodeExpRun(expRun);
130  }
131 
132  string CalibObjManager::getSuffix(const EventMetaData& emd) const
133  {
134  const ExpRun key = make_pair(emd.getExperiment(), emd.getRun());
135  return getSuffix(key);
136  }
137 
138  string CalibObjManager::getObjectExpRunName(const string& name, const ExpRun& expRun) const
139  {
140  return name + getSuffix(expRun);
141  }
142 
143  unsigned int CalibObjManager::extractKeyIndex(const string& keyName) const
144  {
145  vector<string> strs;
146  boost::split(strs, keyName, boost::is_any_of("_"));
147  string indexString = strs.back();
148  return stoi(indexString);
149  }
150 
151  bool CalibObjManager::isRegistered(const std::string& name) const
152  {
153  if (m_templateObjects.count(name)) return true;
154  else return false;
155  }
157 }
Store event, run, and experiment numbers.
Definition: EventMetaData.h:33
int getRun() const
Run Getter.
int getExperiment() const
Experiment Getter.
Abstract base class for different kinds of events.
Struct containing exp number and run number.
Definition: Splitter.h:51