Skip to content

Commit

Permalink
make ColumnType and enum class for type safety
Browse files Browse the repository at this point in the history
  • Loading branch information
guitargeek committed Jun 26, 2020
1 parent 217dc06 commit 028e589
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 51 deletions.
22 changes: 11 additions & 11 deletions DataFormats/NanoAOD/interface/FlatTable.h
Expand Up @@ -37,11 +37,11 @@ namespace nanoaod {

class FlatTable {
public:
enum ColumnType {
FloatColumn,
IntColumn,
UInt8Column,
BoolColumn
enum class ColumnType {
Float,
Int,
UInt8,
Bool
}; // We could have other Float types with reduced mantissa, and similar

FlatTable() : size_(0) {}
Expand Down Expand Up @@ -113,10 +113,10 @@ namespace nanoaod {
if (values.size() != size())
throw cms::Exception("LogicError", "Mismatched size for " + name);
if constexpr (std::is_same<T, bool>()) {
columns_.emplace_back(name, docString, ColumnType::BoolColumn, uint8s_.size());
columns_.emplace_back(name, docString, ColumnType::Bool, uint8s_.size());
uint8s_.insert(uint8s_.end(), values.begin(), values.end());
} else if constexpr (std::is_same<T, float>()) {
columns_.emplace_back(name, docString, ColumnType::FloatColumn, floats_.size());
columns_.emplace_back(name, docString, ColumnType::Float, floats_.size());
floats_.insert(floats_.end(), values.begin(), values.end());
flatTableHelper::MaybeMantissaReduce<float>(mantissaBits).bulk(columnData<float>(columns_.size() - 1));
} else {
Expand All @@ -134,10 +134,10 @@ namespace nanoaod {
if (columnIndex(name) != -1)
throw cms::Exception("LogicError", "Duplicated column: " + name);
if constexpr (std::is_same<T, bool>()) {
columns_.emplace_back(name, docString, ColumnType::BoolColumn, uint8s_.size());
columns_.emplace_back(name, docString, ColumnType::Bool, uint8s_.size());
uint8s_.push_back(value);
} else if constexpr (std::is_same<T, float>()) {
columns_.emplace_back(name, docString, ColumnType::FloatColumn, floats_.size());
columns_.emplace_back(name, docString, ColumnType::Float, floats_.size());
floats_.push_back(flatTableHelper::MaybeMantissaReduce<float>(mantissaBits).one(value));
} else {
ColumnType type = defaultColumnType<T>();
Expand All @@ -152,9 +152,9 @@ namespace nanoaod {
template <typename T>
static ColumnType defaultColumnType() {
if constexpr (std::is_same<T, int>())
return ColumnType::IntColumn;
return ColumnType::Int;
if constexpr (std::is_same<T, uint8_t>())
return ColumnType::UInt8Column;
return ColumnType::UInt8;
throw cms::Exception("unsupported type");
}

Expand Down
16 changes: 8 additions & 8 deletions DataFormats/NanoAOD/src/FlatTable.cc
Expand Up @@ -13,16 +13,16 @@ void nanoaod::FlatTable::addExtension(const nanoaod::FlatTable& other) {
throw cms::Exception("LogicError", "Mismatch in adding extension");
for (unsigned int i = 0, n = other.nColumns(); i < n; ++i) {
switch (other.columnType(i)) {
case FloatColumn:
case ColumnType::Float:
addColumn<float>(other.columnName(i), other.columnData<float>(i), other.columnDoc(i));
break;
case IntColumn:
case ColumnType::Int:
addColumn<int>(other.columnName(i), other.columnData<int>(i), other.columnDoc(i));
break;
case BoolColumn:
case ColumnType::Bool:
addColumn<bool>(other.columnName(i), other.columnData<uint8_t>(i), other.columnDoc(i));
break;
case UInt8Column:
case ColumnType::UInt8:
addColumn<uint8_t>(other.columnName(i), other.columnData<uint8_t>(i), other.columnDoc(i));
break;
}
Expand All @@ -33,13 +33,13 @@ double nanoaod::FlatTable::getAnyValue(unsigned int row, unsigned int column) co
if (column >= nColumns())
throw cms::Exception("LogicError", "Invalid column");
switch (columnType(column)) {
case FloatColumn:
case ColumnType::Float:
return *(beginData<float>(column) + row);
case IntColumn:
case ColumnType::Int:
return *(beginData<int>(column) + row);
case BoolColumn:
case ColumnType::Bool:
return *(beginData<uint8_t>(column) + row);
case UInt8Column:
case ColumnType::UInt8:
return *(beginData<uint8_t>(column) + row);
}
throw cms::Exception("LogicError", "Unsupported type");
Expand Down
15 changes: 5 additions & 10 deletions PhysicsTools/NanoAOD/interface/SimpleFlatTableProducer.h
Expand Up @@ -129,20 +129,15 @@ class SimpleFlatTableProducer : public SimpleFlatTableProducerBase<T, edm::View<
const auto &varPSet = extvarsPSet.getParameter<edm::ParameterSet>(vname);
const std::string &type = varPSet.getParameter<std::string>("type");
if (type == "int")
extvars_.push_back(
std::make_unique<IntExtVar>(vname, varPSet, this->consumesCollector()));
extvars_.push_back(std::make_unique<IntExtVar>(vname, varPSet, this->consumesCollector()));
else if (type == "float")
extvars_.push_back(std::make_unique<FloatExtVar>(
vname, varPSet, this->consumesCollector()));
extvars_.push_back(std::make_unique<FloatExtVar>(vname, varPSet, this->consumesCollector()));
else if (type == "double")
extvars_.push_back(std::make_unique<DoubleExtVar>(
vname, varPSet, this->consumesCollector()));
extvars_.push_back(std::make_unique<DoubleExtVar>(vname, varPSet, this->consumesCollector()));
else if (type == "uint8")
extvars_.push_back(std::make_unique<UInt8ExtVar>(
vname, varPSet, this->consumesCollector()));
extvars_.push_back(std::make_unique<UInt8ExtVar>(vname, varPSet, this->consumesCollector()));
else if (type == "bool")
extvars_.push_back(
std::make_unique<BoolExtVar>(vname, varPSet, this->consumesCollector()));
extvars_.push_back(std::make_unique<BoolExtVar>(vname, varPSet, this->consumesCollector()));
else
throw cms::Exception("Configuration", "unsupported type " + type + " for variable " + vname);
}
Expand Down
15 changes: 5 additions & 10 deletions PhysicsTools/NanoAOD/plugins/GlobalVariablesTableProducer.cc
Expand Up @@ -18,22 +18,17 @@ class GlobalVariablesTableProducer : public edm::stream::EDProducer<> {
if (type == "int")
vars_.push_back(std::make_unique<IntVar>(vname, varPSet, consumesCollector()));
else if (type == "float")
vars_.push_back(
std::make_unique<FloatVar>(vname, varPSet, consumesCollector()));
vars_.push_back(std::make_unique<FloatVar>(vname, varPSet, consumesCollector()));
else if (type == "double")
vars_.push_back(
std::make_unique<DoubleVar>(vname, varPSet, consumesCollector()));
vars_.push_back(std::make_unique<DoubleVar>(vname, varPSet, consumesCollector()));
else if (type == "bool")
vars_.push_back(std::make_unique<BoolVar>(vname, varPSet, consumesCollector()));
else if (type == "candidatescalarsum")
vars_.push_back(std::make_unique<CandidateScalarSumVar>(
vname, varPSet, consumesCollector()));
vars_.push_back(std::make_unique<CandidateScalarSumVar>(vname, varPSet, consumesCollector()));
else if (type == "candidatesize")
vars_.push_back(
std::make_unique<CandidateSizeVar>(vname, varPSet, consumesCollector()));
vars_.push_back(std::make_unique<CandidateSizeVar>(vname, varPSet, consumesCollector()));
else if (type == "candidatesummass")
vars_.push_back(std::make_unique<CandidateSumMassVar>(
vname, varPSet, consumesCollector()));
vars_.push_back(std::make_unique<CandidateSumMassVar>(vname, varPSet, consumesCollector()));
else
throw cms::Exception("Configuration", "unsupported type " + type + " for variable " + vname);
}
Expand Down
6 changes: 2 additions & 4 deletions PhysicsTools/NanoAOD/plugins/LHETablesProducer.cc
Expand Up @@ -137,10 +137,8 @@ class LHETablesProducer : public edm::global::EDProducer<> {
out.addColumnValue<uint8_t>("Nuds", lheNuds, "Number of u,d,s partons at LHE step");
out.addColumnValue<uint8_t>("Nglu", lheNglu, "Number of gluon partons at LHE step");
out.addColumnValue<float>("HT", lheHT, "HT, scalar sum of parton pTs at LHE step");
out.addColumnValue<float>("HTIncoming",
lheHTIncoming,
"HT, scalar sum of parton pTs at LHE step, restricted to partons",
nanoaod::FlatTable::FloatColumn);
out.addColumnValue<float>(
"HTIncoming", lheHTIncoming, "HT, scalar sum of parton pTs at LHE step, restricted to partons");
out.addColumnValue<float>("Vpt", lheVpt, "pT of the W or Z boson at LHE step");
out.addColumnValue<uint8_t>("NpNLO", lheProd.npNLO(), "number of partons at NLO");
out.addColumnValue<uint8_t>("NpLO", lheProd.npLO(), "number of partons at LO");
Expand Down
8 changes: 4 additions & 4 deletions PhysicsTools/NanoAOD/plugins/NanoAODDQM.cc
Expand Up @@ -84,16 +84,16 @@ class NanoAODDQM : public DQMEDAnalyzer {
if (icol == -1)
return; // columns may be missing (e.g. mc-only)
switch (table.columnType(icol)) {
case FlatTable::FloatColumn:
case FlatTable::ColumnType::Float:
vfill<float>(table, icol, rowsel);
break;
case FlatTable::IntColumn:
case FlatTable::ColumnType::Int:
vfill<int>(table, icol, rowsel);
break;
case FlatTable::UInt8Column:
case FlatTable::ColumnType::UInt8:
vfill<uint8_t>(table, icol, rowsel);
break;
case FlatTable::BoolColumn:
case FlatTable::ColumnType::Bool:
vfill<uint8_t>(table, icol, rowsel);
break;
}
Expand Down
8 changes: 4 additions & 4 deletions PhysicsTools/NanoAOD/plugins/TableOutputBranches.cc
Expand Up @@ -13,16 +13,16 @@ void TableOutputBranches::defineBranchesFromFirstEvent(const nanoaod::FlatTable
for (size_t i = 0; i < tab.nColumns(); i++) {
const std::string &var = tab.columnName(i);
switch (tab.columnType(i)) {
case (nanoaod::FlatTable::FloatColumn):
case nanoaod::FlatTable::ColumnType::Float:
m_floatBranches.emplace_back(var, tab.columnDoc(i), "F");
break;
case (nanoaod::FlatTable::IntColumn):
case nanoaod::FlatTable::ColumnType::Int:
m_intBranches.emplace_back(var, tab.columnDoc(i), "I");
break;
case (nanoaod::FlatTable::UInt8Column):
case nanoaod::FlatTable::ColumnType::UInt8:
m_uint8Branches.emplace_back(var, tab.columnDoc(i), "b");
break;
case (nanoaod::FlatTable::BoolColumn):
case nanoaod::FlatTable::ColumnType::Bool:
m_uint8Branches.emplace_back(var, tab.columnDoc(i), "O");
break;
}
Expand Down

0 comments on commit 028e589

Please sign in to comment.