CMS 3D CMS Logo

TableOutputBranches.cc
Go to the documentation of this file.
2 
3 #include <iostream>
4 #include <limits>
5 
6 namespace {
7  std::string makeBranchName(const std::string &baseName, const std::string &leafName) {
8  return baseName.empty() ? leafName : (leafName.empty() ? baseName : baseName + "_" + leafName);
9  }
10 } // namespace
11 
13  m_baseName = tab.name();
14  for (size_t i = 0; i < tab.nColumns(); i++) {
15  const std::string &var = tab.columnName(i);
16  switch (tab.columnType(i)) {
18  m_int8Branches.emplace_back(var, tab.columnDoc(i), "B");
19  break;
21  m_uint8Branches.emplace_back(var, tab.columnDoc(i), "b");
22  break;
24  m_int16Branches.emplace_back(var, tab.columnDoc(i), "S");
25  break;
27  m_uint16Branches.emplace_back(var, tab.columnDoc(i), "s");
28  break;
30  m_int32Branches.emplace_back(var, tab.columnDoc(i), "I");
31  break;
33  m_uint32Branches.emplace_back(var, tab.columnDoc(i), "i");
34  break;
36  m_uint8Branches.emplace_back(var, tab.columnDoc(i), "O");
37  break;
39  m_floatBranches.emplace_back(var, tab.columnDoc(i), "F");
40  break;
42  m_doubleBranches.emplace_back(var, tab.columnDoc(i), "D");
43  break;
44  default:
45  throw cms::Exception("LogicError", "Unsupported type");
46  }
47  }
48 }
49 
51  if (!m_singleton) {
52  if (m_extension == IsExtension) {
53  m_counterBranch = tree.FindBranch(("n" + m_baseName).c_str());
54  if (!m_counterBranch) {
55  throw cms::Exception("LogicError",
56  "Trying to save an extension table for " + m_baseName +
57  " before having saved the corresponding main table\n");
58  }
59  } else {
60  if (tree.FindBranch(("n" + m_baseName).c_str()) != nullptr) {
61  throw cms::Exception("LogicError", "Trying to save multiple main tables for " + m_baseName + "\n");
62  }
63  m_counterBranch = tree.Branch(("n" + m_baseName).c_str(), &m_counter, ("n" + m_baseName + "/I").c_str());
64  m_counterBranch->SetTitle(m_doc.c_str());
65  }
66  }
67  std::string varsize = m_singleton ? "" : "[n" + m_baseName + "]";
68  for (std::vector<NamedBranchPtr> *branches : {&m_int8Branches,
75  &m_doubleBranches}) {
76  for (auto &pair : *branches) {
77  std::string branchName = makeBranchName(m_baseName, pair.name);
78  pair.branch =
79  tree.Branch(branchName.c_str(), (void *)nullptr, (branchName + varsize + "/" + pair.rootTypeCode).c_str());
80  pair.branch->SetTitle(pair.title.c_str());
81  }
82  }
83 }
84 
85 void TableOutputBranches::fill(const edm::OccurrenceForOutput &iWhatever, TTree &tree, bool extensions) {
87  if (extensions != m_extension)
88  return; // do nothing, wait to be called with the proper flag
89  }
90 
92  iWhatever.getByToken(m_token, handle);
93  const nanoaod::FlatTable &tab = *handle;
94  auto size = tab.size();
95  // ROOT native array size branches may only be signed integers,
96  // until this is changed we need to make sure the vector sizes do not exceed that
98  throw cms::Exception("Table " + tab.name() + " size is " + std::to_string(size) +
99  ", is too large for ROOT native array branch");
100  }
101  m_counter = size;
102  m_singleton = tab.singleton();
103  if (!m_branchesBooked) {
105  if (extensions != m_extension)
106  return; // do nothing, wait to be called with the proper flag
108  m_doc = tab.doc();
109  m_branchesBooked = true;
110  branch(tree);
111  }
112  if (!m_singleton && m_extension == IsExtension) {
113  if (m_counter != *reinterpret_cast<CounterType *>(m_counterBranch->GetAddress())) {
114  throw cms::Exception("LogicError",
115  "Mismatch in number of entries between extension and main table for " + tab.name());
116  }
117  }
118  for (auto &pair : m_int8Branches)
119  fillColumn<int8_t>(pair, tab);
120  for (auto &pair : m_uint8Branches)
121  fillColumn<uint8_t>(pair, tab);
122  for (auto &pair : m_int16Branches)
123  fillColumn<int16_t>(pair, tab);
124  for (auto &pair : m_uint16Branches)
125  fillColumn<uint16_t>(pair, tab);
126  for (auto &pair : m_int32Branches)
127  fillColumn<int32_t>(pair, tab);
128  for (auto &pair : m_uint32Branches)
129  fillColumn<uint32_t>(pair, tab);
130  for (auto &pair : m_floatBranches)
131  fillColumn<float>(pair, tab);
132  for (auto &pair : m_doubleBranches)
133  fillColumn<double>(pair, tab);
134 }
size
Write out results.
std::vector< NamedBranchPtr > m_uint32Branches
const std::string & columnName(unsigned int col) const
Definition: FlatTable.h:64
void defineBranchesFromFirstEvent(const nanoaod::FlatTable &tab)
bool extension() const
Definition: FlatTable.h:61
enum TableOutputBranches::@886 m_extension
BasicHandle getByToken(EDGetToken token, TypeID const &typeID) const
const std::string & name() const
Definition: FlatTable.h:62
static std::string to_string(const XMLCh *ch)
const std::string & doc() const
Definition: FlatTable.h:70
std::vector< NamedBranchPtr > m_int8Branches
std::vector< NamedBranchPtr > m_int32Branches
std::vector< NamedBranchPtr > m_uint16Branches
std::vector< NamedBranchPtr > m_uint8Branches
void fill(const edm::OccurrenceForOutput &iWhatever, TTree &tree, bool extensions)
void branch(TTree &tree)
edm::EDGetToken m_token
bool singleton() const
Definition: FlatTable.h:60
std::vector< NamedBranchPtr > m_int16Branches
ColumnType columnType(unsigned int col) const
Definition: FlatTable.h:67
unsigned int nColumns() const
Definition: FlatTable.h:57
const std::string & columnDoc(unsigned int col) const
Definition: FlatTable.h:71
Definition: tree.py:1
std::vector< NamedBranchPtr > m_floatBranches
unsigned int size() const
Definition: FlatTable.h:59
std::vector< NamedBranchPtr > m_doubleBranches