CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Classes | Public Member Functions | Private Types | Private Member Functions | Private Attributes
LumiOutputBranches Class Reference

#include <LumiOutputBranches.h>

Classes

struct  NamedBranchPtr
 

Public Member Functions

void branch (TTree &tree)
 
void defineBranchesFromFirstEvent (const nanoaod::FlatTable &tab)
 
void fill (const edm::LuminosityBlockForOutput &iLumi, TTree &tree, bool extensions)
 
 LumiOutputBranches (const edm::BranchDescription *desc, const edm::EDGetToken &token)
 

Private Types

enum  { IsMain = 0, IsExtension = 1, DontKnowYetIfMainOrExtension = 2 }
 

Private Member Functions

template<typename T >
void fillColumn (NamedBranchPtr &pair, const nanoaod::FlatTable &tab)
 

Private Attributes

std::string m_baseName
 
bool m_branchesBooked
 
UInt_t m_counter
 
TBranch * m_counterBranch
 
std::string m_doc
 
enum LumiOutputBranches:: { ... }  m_extension
 
std::vector< NamedBranchPtrm_floatBranches
 
std::vector< NamedBranchPtrm_intBranches
 
bool m_singleton
 
edm::EDGetToken m_token
 
std::vector< NamedBranchPtrm_uint8Branches
 

Detailed Description

Definition at line 12 of file LumiOutputBranches.h.

Member Enumeration Documentation

anonymous enum
private
Enumerator
IsMain 
IsExtension 
DontKnowYetIfMainOrExtension 

Definition at line 31 of file LumiOutputBranches.h.

Constructor & Destructor Documentation

LumiOutputBranches::LumiOutputBranches ( const edm::BranchDescription desc,
const edm::EDGetToken token 
)
inline

Definition at line 14 of file LumiOutputBranches.h.

References edm::BranchDescription::className().

16  if (desc->className() != "nanoaod::FlatTable")
17  throw cms::Exception("Configuration", "NanoAODOutputModule can only write out nanoaod::FlatTable objects");
18  }
std::string const & className() const
edm::EDGetToken m_token
enum LumiOutputBranches::@899 m_extension

Member Function Documentation

void LumiOutputBranches::branch ( TTree &  tree)

Definition at line 34 of file LumiOutputBranches.cc.

References Exception, IsExtension, m_baseName, m_counter, m_counterBranch, m_doc, m_extension, m_floatBranches, m_intBranches, m_singleton, m_uint8Branches, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by python.cmstools.EventTree::__getattr__(), and fill().

34  {
35  if (!m_singleton) {
36  if (m_extension == IsExtension) {
37  m_counterBranch = tree.FindBranch(("n" + m_baseName).c_str());
38  if (!m_counterBranch) {
39  throw cms::Exception("LogicError",
40  "Trying to save an extension table for " + m_baseName +
41  " before having saved the corresponding main table\n");
42  }
43  } else {
44  if (tree.FindBranch(("n" + m_baseName).c_str()) != nullptr) {
45  throw cms::Exception("LogicError", "Trying to save multiple main tables for " + m_baseName + "\n");
46  }
47  m_counterBranch = tree.Branch(("n" + m_baseName).c_str(), &m_counter, ("n" + m_baseName + "/i").c_str());
48  m_counterBranch->SetTitle(m_doc.c_str());
49  }
50  }
51  std::string varsize = m_singleton ? "" : "[n" + m_baseName + "]";
52  for (std::vector<NamedBranchPtr> *branches : {&m_floatBranches, &m_intBranches, &m_uint8Branches}) {
53  for (auto &pair : *branches) {
54  std::string branchName = makeBranchName(m_baseName, pair.name);
55  pair.branch =
56  tree.Branch(branchName.c_str(), (void *)nullptr, (branchName + varsize + "/" + pair.rootTypeCode).c_str());
57  pair.branch->SetTitle(pair.title.c_str());
58  }
59  }
60 }
std::vector< NamedBranchPtr > m_floatBranches
std::vector< NamedBranchPtr > m_uint8Branches
std::vector< NamedBranchPtr > m_intBranches
enum LumiOutputBranches::@899 m_extension
void LumiOutputBranches::defineBranchesFromFirstEvent ( const nanoaod::FlatTable tab)

Definition at line 11 of file LumiOutputBranches.cc.

References nanoaod::FlatTable::Bool, nanoaod::FlatTable::columnDoc(), nanoaod::FlatTable::columnName(), nanoaod::FlatTable::columnType(), Exception, nanoaod::FlatTable::Float, mps_fire::i, nanoaod::FlatTable::Int, m_baseName, m_floatBranches, m_intBranches, m_uint8Branches, nanoaod::FlatTable::name(), nanoaod::FlatTable::nColumns(), AlCaHLTBitMon_QueryRunRegistry::string, nanoaod::FlatTable::UInt8, and ALCARECOEcalPhiSym_cff::var.

Referenced by fill().

11  {
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;
28  default:
29  throw cms::Exception("LogicError", "Unsupported type");
30  }
31  }
32 }
ColumnType columnType(unsigned int col) const
Definition: FlatTable.h:65
std::vector< NamedBranchPtr > m_floatBranches
std::vector< NamedBranchPtr > m_uint8Branches
std::vector< NamedBranchPtr > m_intBranches
const std::string & name() const
Definition: FlatTable.h:60
const std::string & columnName(unsigned int col) const
Definition: FlatTable.h:62
unsigned int nColumns() const
Definition: FlatTable.h:55
const std::string & columnDoc(unsigned int col) const
Definition: FlatTable.h:69
void LumiOutputBranches::fill ( const edm::LuminosityBlockForOutput iLumi,
TTree &  tree,
bool  extensions 
)

Fill the current table, if extensions == table.extension(). This parameter is used so that the fill is called first for non-extensions and then for extensions

Definition at line 62 of file LumiOutputBranches.cc.

References branch(), defineBranchesFromFirstEvent(), nanoaod::FlatTable::doc(), DontKnowYetIfMainOrExtension, Exception, nanoaod::FlatTable::extension(), edm::OccurrenceForOutput::getByToken(), patZpeak::handle, IsExtension, IsMain, m_branchesBooked, m_counter, m_counterBranch, m_doc, m_extension, m_floatBranches, m_intBranches, m_singleton, m_token, m_uint8Branches, nanoaod::FlatTable::name(), nanoaod::FlatTable::singleton(), and nanoaod::FlatTable::size().

62  {
64  if (extensions != m_extension)
65  return; // do nothing, wait to be called with the proper flag
66  }
67 
69  iLumi.getByToken(m_token, handle);
70  const nanoaod::FlatTable &tab = *handle;
71  m_counter = tab.size();
72  m_singleton = tab.singleton();
73  if (!m_branchesBooked) {
75  if (extensions != m_extension)
76  return; // do nothing, wait to be called with the proper flag
78  m_doc = tab.doc();
79  m_branchesBooked = true;
80  branch(tree);
81  }
82  if (!m_singleton && m_extension == IsExtension) {
83  if (m_counter != *reinterpret_cast<UInt_t *>(m_counterBranch->GetAddress())) {
84  throw cms::Exception("LogicError",
85  "Mismatch in number of entries between extension and main table for " + tab.name());
86  }
87  }
88  for (auto &pair : m_floatBranches)
89  fillColumn<float>(pair, tab);
90  for (auto &pair : m_intBranches)
91  fillColumn<int>(pair, tab);
92  for (auto &pair : m_uint8Branches)
93  fillColumn<uint8_t>(pair, tab);
94 }
void defineBranchesFromFirstEvent(const nanoaod::FlatTable &tab)
bool extension() const
Definition: FlatTable.h:59
const std::string & doc() const
Definition: FlatTable.h:68
std::vector< NamedBranchPtr > m_floatBranches
std::vector< NamedBranchPtr > m_uint8Branches
std::vector< NamedBranchPtr > m_intBranches
tuple handle
Definition: patZpeak.py:25
edm::EDGetToken m_token
const std::string & name() const
Definition: FlatTable.h:60
enum LumiOutputBranches::@899 m_extension
BasicHandle getByToken(EDGetToken token, TypeID const &typeID) const
void branch(TTree &tree)
unsigned int size() const
Definition: FlatTable.h:57
bool singleton() const
Definition: FlatTable.h:58
template<typename T >
void LumiOutputBranches::fillColumn ( NamedBranchPtr pair,
const nanoaod::FlatTable tab 
)
inlineprivate

Definition at line 50 of file LumiOutputBranches.h.

References LumiOutputBranches::NamedBranchPtr::branch, nanoaod::FlatTable::columnData(), nanoaod::FlatTable::columnIndex(), Exception, m_baseName, and LumiOutputBranches::NamedBranchPtr::name.

50  {
51  int idx = tab.columnIndex(pair.name);
52  if (idx == -1)
53  throw cms::Exception("LogicError", "Missing column in input for " + m_baseName + "_" + pair.name);
54  pair.branch->SetAddress(const_cast<T *>(&tab.columnData<T>(idx).front())); // SetAddress should take a const * !
55  }
int columnIndex(const std::string &name) const
Definition: FlatTable.cc:3
auto columnData(unsigned int column) const
get a column by index (const)
Definition: FlatTable.h:73
long double T

Member Data Documentation

std::string LumiOutputBranches::m_baseName
private

Definition at line 29 of file LumiOutputBranches.h.

Referenced by branch(), defineBranchesFromFirstEvent(), and fillColumn().

bool LumiOutputBranches::m_branchesBooked
private

Definition at line 47 of file LumiOutputBranches.h.

Referenced by fill().

UInt_t LumiOutputBranches::m_counter
private

Definition at line 33 of file LumiOutputBranches.h.

Referenced by branch(), and fill().

TBranch* LumiOutputBranches::m_counterBranch
private

Definition at line 43 of file LumiOutputBranches.h.

Referenced by branch(), and fill().

std::string LumiOutputBranches::m_doc
private

Definition at line 32 of file LumiOutputBranches.h.

Referenced by branch(), and fill().

enum { ... } LumiOutputBranches::m_extension

Referenced by branch(), and fill().

std::vector<NamedBranchPtr> LumiOutputBranches::m_floatBranches
private

Definition at line 44 of file LumiOutputBranches.h.

Referenced by branch(), defineBranchesFromFirstEvent(), and fill().

std::vector<NamedBranchPtr> LumiOutputBranches::m_intBranches
private

Definition at line 45 of file LumiOutputBranches.h.

Referenced by branch(), defineBranchesFromFirstEvent(), and fill().

bool LumiOutputBranches::m_singleton
private

Definition at line 30 of file LumiOutputBranches.h.

Referenced by branch(), and fill().

edm::EDGetToken LumiOutputBranches::m_token
private

Definition at line 28 of file LumiOutputBranches.h.

Referenced by fill().

std::vector<NamedBranchPtr> LumiOutputBranches::m_uint8Branches
private

Definition at line 46 of file LumiOutputBranches.h.

Referenced by branch(), defineBranchesFromFirstEvent(), and fill().