diff --git a/DataFormats/NanoAOD/interface/FlatTable.h b/DataFormats/NanoAOD/interface/FlatTable.h index 3a3934cc7dafe..3ff9f82edbdcd 100644 --- a/DataFormats/NanoAOD/interface/FlatTable.h +++ b/DataFormats/NanoAOD/interface/FlatTable.h @@ -41,7 +41,9 @@ namespace nanoaod { Float, Int, UInt8, - Bool + Bool, + UInt32, + Double }; // We could have other Float types with reduced mantissa, and similar FlatTable() : size_(0) {} @@ -143,6 +145,10 @@ namespace nanoaod { return ColumnType::UInt8; else if constexpr (std::is_same()) return ColumnType::Bool; + else if constexpr (std::is_same()) + return ColumnType::UInt32; + else if constexpr (std::is_same()) + return ColumnType::Double; else static_assert(dependent_false::value, "unsupported type"); } @@ -187,6 +193,10 @@ namespace nanoaod { return table.uint8s_; else if constexpr (std::is_same()) return table.uint8s_; + else if constexpr (std::is_same()) + return table.uint32s_; + else if constexpr (std::is_same()) + return table.doubles_; else static_assert(dependent_false::value, "unsupported type"); } @@ -198,6 +208,8 @@ namespace nanoaod { std::vector floats_; std::vector ints_; std::vector uint8s_; + std::vector uint32s_; + std::vector doubles_; }; } // namespace nanoaod diff --git a/DataFormats/NanoAOD/src/FlatTable.cc b/DataFormats/NanoAOD/src/FlatTable.cc index 85c9d4c699fdc..1ba7933773f30 100644 --- a/DataFormats/NanoAOD/src/FlatTable.cc +++ b/DataFormats/NanoAOD/src/FlatTable.cc @@ -25,6 +25,12 @@ void nanoaod::FlatTable::addExtension(const nanoaod::FlatTable& other) { case ColumnType::UInt8: addColumn(other.columnName(i), other.columnData(i), other.columnDoc(i)); break; + case ColumnType::UInt32: + addColumn(other.columnName(i), other.columnData(i), other.columnDoc(i)); + break; + case ColumnType::Double: + addColumn(other.columnName(i), other.columnData(i), other.columnDoc(i)); + break; default: throw cms::Exception("LogicError", "Unsupported type"); } @@ -43,6 +49,10 @@ double nanoaod::FlatTable::getAnyValue(unsigned int row, unsigned int column) co return *(beginData(column) + row); case ColumnType::UInt8: return *(beginData(column) + row); + case ColumnType::UInt32: + return *(beginData(column) + row); + case ColumnType::Double: + return *(beginData(column) + row); } throw cms::Exception("LogicError", "Unsupported type"); } diff --git a/DataFormats/NanoAOD/src/classes_def.xml b/DataFormats/NanoAOD/src/classes_def.xml index fb6c23b3646e9..58f08dfc7e9f8 100644 --- a/DataFormats/NanoAOD/src/classes_def.xml +++ b/DataFormats/NanoAOD/src/classes_def.xml @@ -3,7 +3,8 @@ - + + diff --git a/PhysicsTools/NanoAOD/plugins/NanoAODOutputModule.cc b/PhysicsTools/NanoAOD/plugins/NanoAODOutputModule.cc index 6cff1fb221bd8..360bb570a0b9c 100644 --- a/PhysicsTools/NanoAOD/plugins/NanoAODOutputModule.cc +++ b/PhysicsTools/NanoAOD/plugins/NanoAODOutputModule.cc @@ -126,6 +126,7 @@ class NanoAODOutputModule : public edm::one::OutputModule<> { std::vector m_runTables; std::vector m_lumiTables; + std::vector m_runFlatTables; std::vector> m_nanoMetadata; }; @@ -243,6 +244,11 @@ void NanoAODOutputModule::writeRun(edm::RunForOutput const& iRun) { for (auto& t : m_runTables) t.fill(iRun, *m_runTree); + for (unsigned int extensions = 0; extensions <= 1; ++extensions) { + for (auto& t : m_runFlatTables) + t.fill(iRun, *m_runTree, extensions); + } + edm::Handle hstring; for (const auto& p : m_nanoMetadata) { iRun.getByToken(p.second, hstring); @@ -293,6 +299,7 @@ void NanoAODOutputModule::openFile(edm::FileBlock const&) { m_evstrings.clear(); m_runTables.clear(); m_lumiTables.clear(); + m_runFlatTables.clear(); const auto& keeps = keptProducts(); for (const auto& keep : keeps[edm::InEvent]) { if (keep.first->className() == "nanoaod::FlatTable") @@ -322,6 +329,8 @@ void NanoAODOutputModule::openFile(edm::FileBlock const&) { m_runTables.push_back(SummaryTableOutputBranches(keep.first, keep.second)); else if (keep.first->className() == "nanoaod::UniqueString" && keep.first->moduleLabel() == "nanoMetadata") m_nanoMetadata.emplace_back(keep.first->productInstanceName(), keep.second); + else if (keep.first->className() == "nanoaod::FlatTable") + m_runFlatTables.emplace_back(keep.first, keep.second); else throw cms::Exception("Configuration", "NanoAODOutputModule cannot handle class " + keep.first->className() + " in Run branch"); diff --git a/PhysicsTools/NanoAOD/plugins/TableOutputBranches.cc b/PhysicsTools/NanoAOD/plugins/TableOutputBranches.cc index 5744b329f7bbf..9e0c46d2f99c9 100644 --- a/PhysicsTools/NanoAOD/plugins/TableOutputBranches.cc +++ b/PhysicsTools/NanoAOD/plugins/TableOutputBranches.cc @@ -25,6 +25,12 @@ void TableOutputBranches::defineBranchesFromFirstEvent(const nanoaod::FlatTable case nanoaod::FlatTable::ColumnType::Bool: m_uint8Branches.emplace_back(var, tab.columnDoc(i), "O"); break; + case nanoaod::FlatTable::ColumnType::UInt32: + m_uint32Branches.emplace_back(var, tab.columnDoc(i), "i"); + break; + case nanoaod::FlatTable::ColumnType::Double: + m_doubleBranches.emplace_back(var, tab.columnDoc(i), "D"); + break; default: throw cms::Exception("LogicError", "Unsupported type"); } @@ -49,7 +55,8 @@ void TableOutputBranches::branch(TTree &tree) { } } std::string varsize = m_singleton ? "" : "[n" + m_baseName + "]"; - for (std::vector *branches : {&m_floatBranches, &m_intBranches, &m_uint8Branches}) { + for (std::vector *branches : + {&m_floatBranches, &m_intBranches, &m_uint8Branches, &m_uint32Branches, &m_doubleBranches}) { for (auto &pair : *branches) { std::string branchName = makeBranchName(m_baseName, pair.name); pair.branch = @@ -59,14 +66,14 @@ void TableOutputBranches::branch(TTree &tree) { } } -void TableOutputBranches::fill(const edm::EventForOutput &iEvent, TTree &tree, bool extensions) { +void TableOutputBranches::fill(const edm::OccurrenceForOutput &iWhatever, TTree &tree, bool extensions) { if (m_extension != DontKnowYetIfMainOrExtension) { if (extensions != m_extension) return; // do nothing, wait to be called with the proper flag } edm::Handle handle; - iEvent.getByToken(m_token, handle); + iWhatever.getByToken(m_token, handle); const nanoaod::FlatTable &tab = *handle; m_counter = tab.size(); m_singleton = tab.singleton(); @@ -91,4 +98,8 @@ void TableOutputBranches::fill(const edm::EventForOutput &iEvent, TTree &tree, b fillColumn(pair, tab); for (auto &pair : m_uint8Branches) fillColumn(pair, tab); + for (auto &pair : m_uint32Branches) + fillColumn(pair, tab); + for (auto &pair : m_doubleBranches) + fillColumn(pair, tab); } diff --git a/PhysicsTools/NanoAOD/plugins/TableOutputBranches.h b/PhysicsTools/NanoAOD/plugins/TableOutputBranches.h index df843bb6f4216..148f0dc9b67f2 100644 --- a/PhysicsTools/NanoAOD/plugins/TableOutputBranches.h +++ b/PhysicsTools/NanoAOD/plugins/TableOutputBranches.h @@ -4,7 +4,7 @@ #include #include #include -#include "FWCore/Framework/interface/EventForOutput.h" +#include "FWCore/Framework/interface/OccurrenceForOutput.h" #include "DataFormats/NanoAOD/interface/FlatTable.h" #include "DataFormats/Provenance/interface/BranchDescription.h" #include "FWCore/Utilities/interface/EDGetToken.h" @@ -22,7 +22,7 @@ class TableOutputBranches { /// 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 - void fill(const edm::EventForOutput &iEvent, TTree &tree, bool extensions); + void fill(const edm::OccurrenceForOutput &iWhatever, TTree &tree, bool extensions); private: edm::EDGetToken m_token; @@ -44,6 +44,8 @@ class TableOutputBranches { std::vector m_floatBranches; std::vector m_intBranches; std::vector m_uint8Branches; + std::vector m_uint32Branches; + std::vector m_doubleBranches; bool m_branchesBooked; template