14#include "DataFormatsQualityControl/FlagTypeFactory.h"
18#include <boost/algorithm/string/replace.hpp>
19#include <boost/tokenizer.hpp>
25constexpr const char*
csvHeader =
"start,end,flag_id,flag_name,flag_bad,comment,source";
29 int runNumber, std::string periodName, std::string passName,
30 std::string provenance)
31 : mName(
std::move(
name)), mDetID(
std::move(detector)), mValidityRange(validityRange), mRunNumber(runNumber), mPeriodName(
std::move(periodName)), mPassName(passName), mProvenance(
std::move(provenance))
37 mQualityControlFlags.insert(std::move(trf));
42 mQualityControlFlags.insert(trf);
47 return mQualityControlFlags.size();
52 if (mDetID !=
other.mDetID) {
55 throw std::runtime_error(
56 "The detector ID of the target collection '" + mDetID +
"' is different than the other '" + mDetID);
58 mQualityControlFlags.merge(
other.mQualityControlFlags);
69 return mQualityControlFlags.begin();
74 return mQualityControlFlags.end();
79 auto escapeComma = [](
const std::string&
str) {
80 return boost::algorithm::replace_all_copy(
str,
",",
"\\,");
83 for (
const auto& trf : *
this) {
84 output << fmt::format(
"{},{},{},\"{}\",{:d},\"{}\",\"{}\"\n",
85 trf.getStart(), trf.getEnd(),
86 trf.getFlag().getID(), escapeComma(trf.getFlag().getName()), trf.getFlag().getBad(),
87 escapeComma(trf.getComment()), escapeComma(trf.getSource()));
94 std::getline(input, line);
96 throw std::runtime_error(
97 "Unsupported TRFCollection format, the first line is \"" + line +
"\" instead of \"" +
csvHeader +
"\"");
100 while (std::getline(input, line)) {
101 boost::tokenizer<boost::escaped_list_separator<char>> tok(line);
105 FlagType flag = FlagTypeFactory::Invalid();
108 auto it = tok.begin();
111 for (; it != tok.end() && valid;
pos++, it++) {
115 LOG(error) <<
"Invalid line, empty start time of a flag, skipping...";
124 LOG(error) <<
"Invalid line, empty end time of a flag, skipping...";
133 LOG(error) <<
"Invalid line, empty flag id, skipping...";
136 flag.mId = std::stoul(*it);
142 LOG(error) <<
"Invalid line, empty flag name, skipping...";
151 LOG(error) <<
"Invalid line, empty flag 'bad' field, skipping...";
154 flag.mBad =
static_cast<bool>(std::stoul(*it));
167 LOG(error) <<
"More columns (" <<
pos + 1 <<
") than expected (" <<
csvColumns
168 <<
") in this line, skipping...";
175 LOG(error) <<
"Less columns (" <<
pos <<
") than expected (" <<
csvColumns <<
") in this line, skipping...";
classes for defining time ranges with a certain mask to be able to cut on
void streamTo(std::ostream &output) const
write data to ostream
const std::string & getPeriodName() const
void insert(QualityControlFlag &&)
const std::string & getProvenance() const
QualityControlFlagCollection(std::string name, std::string detector="TST", RangeInterval validityRange={}, int runNumber=0, std::string periodName="Invalid", std::string passName="Invalid", std::string provenance="qc")
void merge(QualityControlFlagCollection &other)
collection_t::const_iterator begin() const
const std::string & getPassName() const
const std::string & getDetector() const
const std::string & getName() const
collection_t::const_iterator end() const
void streamFrom(std::istream &input)
Read data from instream.
GLuint const GLchar * name
GLsizei GLsizei GLchar * source
std::ostream & operator<<(std::ostream &os, FlagType const &my)
constexpr size_t csvColumns
constexpr const char * csvHeader
Defining DataPointCompositeObject explicitly as copiable.
VectorOfTObjectPtrs other
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"