CMS 3D CMS Logo

TableOutputBranches.cc
Go to the documentation of this file.
2 
3 #include <iostream>
4 
5 namespace {
6  std::string makeBranchName(const std::string &baseName, const std::string &leafName) {
7  return baseName.empty() ? leafName : (leafName.empty() ? baseName : baseName + "_" + leafName);
8  }
9 } // namespace
10 
12  m_baseName = tab.name();
13  for (size_t i = 0; i < tab.nColumns(); i++) {
14  const std::string &var = tab.columnName(i);
15  switch (tab.columnType(i)) {
17  m_floatBranches.emplace_back(var, tab.columnDoc(i), "F");
18  break;
20  m_intBranches.emplace_back(var, tab.columnDoc(i), "I");
21  break;
23  m_uint8Branches.emplace_back(var, tab.columnDoc(i), "b");
24  break;
26  m_uint8Branches.emplace_back(var, tab.columnDoc(i), "O");
27  break;
29  m_uint32Branches.emplace_back(var, tab.columnDoc(i), "i");
30  break;
32  m_doubleBranches.emplace_back(var, tab.columnDoc(i), "D");
33  break;
34  default:
35  throw cms::Exception("LogicError", "Unsupported type");
36  }
37  }
38 }
39 
41  if (!m_singleton) {
42  if (m_extension == IsExtension) {
43  m_counterBranch = tree.FindBranch(("n" + m_baseName).c_str());
44  if (!m_counterBranch) {
45  throw cms::Exception("LogicError",
46  "Trying to save an extension table for " + m_baseName +
47  " before having saved the corresponding main table\n");
48  }
49  } else {
50  if (tree.FindBranch(("n" + m_baseName).c_str()) != nullptr) {
51  throw cms::Exception("LogicError", "Trying to save multiple main tables for " + m_baseName + "\n");
52  }
53  m_counterBranch = tree.Branch(("n" + m_baseName).c_str(), &m_counter, ("n" + m_baseName + "/i").c_str());
54  m_counterBranch->SetTitle(m_doc.c_str());
55  }
56  }
57  std::string varsize = m_singleton ? "" : "[n" + m_baseName + "]";
58  for (std::vector<NamedBranchPtr> *branches :
60  for (auto &pair : *branches) {
61  std::string branchName = makeBranchName(m_baseName, pair.name);
62  pair.branch =
63  tree.Branch(branchName.c_str(), (void *)nullptr, (branchName + varsize + "/" + pair.rootTypeCode).c_str());
64  pair.branch->SetTitle(pair.title.c_str());
65  }
66  }
67 }
68 
69 void TableOutputBranches::fill(const edm::OccurrenceForOutput &iWhatever, TTree &tree, bool extensions) {
71  if (extensions != m_extension)
72  return; // do nothing, wait to be called with the proper flag
73  }
74 
76  iWhatever.getByToken(m_token, handle);
77  const nanoaod::FlatTable &tab = *handle;
78  m_counter = tab.size();
79  m_singleton = tab.singleton();
80  if (!m_branchesBooked) {
82  if (extensions != m_extension)
83  return; // do nothing, wait to be called with the proper flag
85  m_doc = tab.doc();
86  m_branchesBooked = true;
87  branch(tree);
88  }
89  if (!m_singleton && m_extension == IsExtension) {
90  if (m_counter != *reinterpret_cast<UInt_t *>(m_counterBranch->GetAddress())) {
91  throw cms::Exception("LogicError",
92  "Mismatch in number of entries between extension and main table for " + tab.name());
93  }
94  }
95  for (auto &pair : m_floatBranches)
96  fillColumn<float>(pair, tab);
97  for (auto &pair : m_intBranches)
98  fillColumn<int>(pair, tab);
99  for (auto &pair : m_uint8Branches)
100  fillColumn<uint8_t>(pair, tab);
101  for (auto &pair : m_uint32Branches)
102  fillColumn<uint32_t>(pair, tab);
103  for (auto &pair : m_doubleBranches)
104  fillColumn<double>(pair, tab);
105 }
nanoaod::FlatTable::ColumnType::Float
TableOutputBranches::m_baseName
std::string m_baseName
Definition: TableOutputBranches.h:29
mps_fire.i
i
Definition: mps_fire.py:428
TableOutputBranches::defineBranchesFromFirstEvent
void defineBranchesFromFirstEvent(const nanoaod::FlatTable &tab)
Definition: TableOutputBranches.cc:11
TableOutputBranches::m_extension
enum TableOutputBranches::@882 m_extension
TableOutputBranches::m_uint8Branches
std::vector< NamedBranchPtr > m_uint8Branches
Definition: TableOutputBranches.h:46
nanoaod::FlatTable::singleton
bool singleton() const
Definition: FlatTable.h:57
patZpeak.handle
handle
Definition: patZpeak.py:23
electrons_cff.branchName
branchName
Definition: electrons_cff.py:520
tree
Definition: tree.py:1
nanoaod::FlatTable::ColumnType::UInt32
TableOutputBranches::m_singleton
bool m_singleton
Definition: TableOutputBranches.h:30
edm::Handle
Definition: AssociativeIterator.h:50
TableOutputBranches::IsMain
Definition: TableOutputBranches.h:31
nanoaod::FlatTable::doc
const std::string & doc() const
Definition: FlatTable.h:67
edm::OccurrenceForOutput
Definition: OccurrenceForOutput.h:45
edm::OccurrenceForOutput::getByToken
BasicHandle getByToken(EDGetToken token, TypeID const &typeID) const
Definition: OccurrenceForOutput.cc:44
trigObjTnPSource_cfi.var
var
Definition: trigObjTnPSource_cfi.py:21
TableOutputBranches::fill
void fill(const edm::OccurrenceForOutput &iWhatever, TTree &tree, bool extensions)
Definition: TableOutputBranches.cc:69
TableOutputBranches::branch
void branch(TTree &tree)
Definition: TableOutputBranches.cc:40
TableOutputBranches::m_token
edm::EDGetToken m_token
Definition: TableOutputBranches.h:28
nanoaod::FlatTable::columnDoc
const std::string & columnDoc(unsigned int col) const
Definition: FlatTable.h:68
nanoaod::FlatTable::ColumnType::UInt8
nanoaod::FlatTable::columnType
ColumnType columnType(unsigned int col) const
Definition: FlatTable.h:64
nanoaod::FlatTable::extension
bool extension() const
Definition: FlatTable.h:58
nanoaod::FlatTable::ColumnType::Double
TableOutputBranches::m_counter
UInt_t m_counter
Definition: TableOutputBranches.h:33
TableOutputBranches::m_doubleBranches
std::vector< NamedBranchPtr > m_doubleBranches
Definition: TableOutputBranches.h:48
TableOutputBranches::DontKnowYetIfMainOrExtension
Definition: TableOutputBranches.h:31
TableOutputBranches::m_floatBranches
std::vector< NamedBranchPtr > m_floatBranches
Definition: TableOutputBranches.h:44
AlCaHLTBitMon_QueryRunRegistry.string
string string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
TableOutputBranches::m_intBranches
std::vector< NamedBranchPtr > m_intBranches
Definition: TableOutputBranches.h:45
nanoaod::FlatTable::name
const std::string & name() const
Definition: FlatTable.h:59
nanoaod::FlatTable::ColumnType::Int
TableOutputBranches.h
nanoaod::FlatTable
Definition: FlatTable.h:38
nanoaod::FlatTable::columnName
const std::string & columnName(unsigned int col) const
Definition: FlatTable.h:61
TableOutputBranches::m_uint32Branches
std::vector< NamedBranchPtr > m_uint32Branches
Definition: TableOutputBranches.h:47
nanoaod::FlatTable::nColumns
unsigned int nColumns() const
Definition: FlatTable.h:54
TableOutputBranches::IsExtension
Definition: TableOutputBranches.h:31
Exception
Definition: hltDiff.cc:245
TableOutputBranches::m_branchesBooked
bool m_branchesBooked
Definition: TableOutputBranches.h:49
TableOutputBranches::m_doc
std::string m_doc
Definition: TableOutputBranches.h:32
TableOutputBranches::m_counterBranch
TBranch * m_counterBranch
Definition: TableOutputBranches.h:43
nanoaod::FlatTable::ColumnType::Bool
nanoaod::FlatTable::size
unsigned int size() const
Definition: FlatTable.h:56