Belle II Software development
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
15using namespace std;
16using namespace Belle2;
17using namespace Calibration;
18
19namespace 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
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
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
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
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
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 Calibration::ExpRun& expRun) const
128 {
129 return "_" + encodeExpRun(expRun);
130 }
131
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}
std::map< std::string, std::shared_ptr< TNamed > > m_templateObjects
The objects that we are managing, these are template objects for all future objects for each (Exp,...
T * cloneObj(T *source, const std::string &newName) const
Clone object.
TDirectory * m_dir
The TDirectory where all of our managed objects should be found, and where we should create new ones.
Store event, run, and experiment numbers.
Definition: EventMetaData.h:33
int getRun() const
Run Getter.
int getExperiment() const
Experiment Getter.
unsigned int extractKeyIndex(const std::string &keyName) const
Extract key index.
void clearCurrentObjects(const Calibration::ExpRun &expRun)
Deletes all in-memory objects in the exprun directories for all the collector objects we know about.
void writeCurrentObjects(const Calibration::ExpRun &expRun)
For each templated object we know about, we find an in memory object for this exprun and write to the...
std::string getObjectExpRunName(const std::string &name, const Calibration::ExpRun &expRun) const
Get object experiment and run name.
unsigned int getHighestIndexObject(const std::string &name, const TDirectory *dir) const
Scans the directory to get the highest "_i" index of an object with this name.
void deleteHeldObjects()
Clears the map of templated objects -> causing their destruction.
void addObject(const std::string &name, std::shared_ptr< TNamed > object)
Add a new object to manage, this is used as a template for creating future/missing objects.
bool isRegistered(const std::string &name) const
Checks for the existence of a name in the templated object map to see if we registered the object.
void createExpRunDirectories(Calibration::ExpRun &expRun) const
For each templated object, we create a new TDirectory for this exprun.
std::string getSuffix(const Calibration::ExpRun &key) const
We rename objects based on the Exp,Run that they contain so we need to generate a nice naming convent...
void createDirectories()
Each object gets its own TDirectory under the main manager directory to store its objects.
Abstract base class for different kinds of events.
STL namespace.
Struct containing exp number and run number.
Definition: Splitter.h:51