CMS 3D CMS Logo

List of all members | Public Member Functions | Public Attributes
HltDiff Class Reference

Public Member Functions

void compare () const
 
 HltDiff ()
 
void usage (std::ostream &out) const
 

Public Attributes

bool csv_out
 
bool debug
 
bool file_check
 
bool ignore_prescales
 
bool json_out
 
unsigned int max_events
 
std::vector< std::string > new_files
 
std::string new_process
 
std::vector< std::string > old_files
 
std::string old_process
 
std::string output_file
 
bool quiet
 
bool root_out
 
unsigned int verbose
 

Detailed Description

Definition at line 1192 of file hltDiff.cc.

Constructor & Destructor Documentation

HltDiff::HltDiff ( )
inline

Definition at line 1209 of file hltDiff.cc.

1210  : old_files(0),
1211  old_process(""),
1212  new_files(0),
1213  new_process(""),
1214  max_events(1e9),
1215  ignore_prescales(true),
1216  csv_out(false),
1217  json_out(false),
1218  root_out(false),
1219  output_file(""),
1220  file_check(false),
1221  debug(false),
1222  quiet(false),
1223  verbose(0) {}
bool debug
Definition: hltDiff.cc:1205
bool root_out
Definition: hltDiff.cc:1202
bool file_check
Definition: hltDiff.cc:1204
unsigned int verbose
Definition: hltDiff.cc:1207
bool quiet
Definition: hltDiff.cc:1206
std::vector< std::string > old_files
Definition: hltDiff.cc:1194
std::string output_file
Definition: hltDiff.cc:1203
std::vector< std::string > new_files
Definition: hltDiff.cc:1196
bool csv_out
Definition: hltDiff.cc:1200
bool ignore_prescales
Definition: hltDiff.cc:1199
bool json_out
Definition: hltDiff.cc:1201
unsigned int max_events
Definition: hltDiff.cc:1198
std::string new_process
Definition: hltDiff.cc:1197
std::string old_process
Definition: hltDiff.cc:1195

Member Function Documentation

void HltDiff::compare ( ) const
inline

Definition at line 1225 of file hltDiff.cc.

References edm::HLTGlobalStatus::accept(), beam_dqm_sourceclient-live_cfg::cerr, check_files(), universalConfigTemplate::collection, oniaPATMuonsWithTrigger_cff::collections, trigger::TriggerEvent::collectionTags(), JsonOutputProducer::configuration, counter, gather_cfg::cout, event(), event_state(), JsonOutputProducer::JsonConfiguration::events, JsonOutputProducer::eventState(), JsonOutputProducer::JsonConfigurationBlock::extractFileBase(), JsonOutputProducer::JsonConfigurationBlock::files, spr::find(), HLTCommonConfig::First, fwlite::Handle< T >::getByLabel(), getHLTConfigData(), mps_fire::i, edm::HLTGlobalStatus::index(), createfilelist::int, Invalid, fwlite::Handle< T >::isValid(), L1Trigger_dataformats::json, SiStripPI::max, min(), HLTConfigInterface::moduleLabel(), HLTConfigInterface::moduleType(), JsonOutputProducer::JsonConfiguration::n, JsonOutputProducer::JsonTriggerEventState::n, nEvents, JsonOutputProducer::JsonConfiguration::o, JsonOutputProducer::JsonTriggerEventState::o, or, AlCaHLTBitMon_ParallelJobs::p, Pass, path_state(), Prescaled, prescaled_state(), JsonOutputProducer::JsonConfiguration::prescales, print_detailed_path_state(), print_trigger_candidates(), print_trigger_collection(), JsonOutputProducer::JsonConfigurationBlock::process, HLTConfigInterface::processName(), fwlite::Handle< T >::product(), JsonOutputProducer::pushEvent(), Ready, writedatasetfile::run, HLTCommonConfig::Second, HLTConfigInterface::size(), runEdmFileComparison::skipped, JsonOutputProducer::JsonConfigurationBlock::skipped_triggers, edm::HLTGlobalStatus::state(), JsonOutputProducer::JsonVars::state, AlCaHLTBitMon_QueryRunRegistry::string, strip_process_name(), edmLumisInFiles::summary, JsonOutputProducer::JsonVars::trigger, JsonOutputProducer::JsonVars::trigger_passed_count, HLTConfigInterface::triggerIndex(), HLTConfigInterface::triggerName(), JsonOutputProducer::vars, JsonOutputProducer::write(), and SummaryOutputProducer::write().

1225  {
1226  std::shared_ptr<fwlite::ChainEvent> old_events;
1227  std::shared_ptr<fwlite::ChainEvent> new_events;
1228 
1230  old_events = std::make_shared<fwlite::ChainEvent>(old_files);
1231  else
1232  return;
1233 
1234  if (new_files.size() == 1 and new_files[0] == "-")
1235  new_events = old_events;
1236  else if (not file_check or check_files(new_files))
1237  new_events = std::make_shared<fwlite::ChainEvent>(new_files);
1238  else
1239  return;
1240 
1241  // creating the structure holding data for JSON and ROOT output
1243 
1244  json.configuration.prescales = ignore_prescales;
1245  // setting the old configuration
1246  json.configuration.o.process = old_process;
1247  json.configuration.o.files = old_files;
1248  json.configuration.o.extractFileBase();
1249  // setting the new configuration
1250  json.configuration.n.process = new_process;
1251  json.configuration.n.files = new_files;
1252  json.configuration.n.extractFileBase();
1253 
1254  // initialising configurations to be compared
1255  std::unique_ptr<HLTConfigDataEx> old_config_data;
1256  std::unique_ptr<HLTConfigDataEx> new_config_data;
1257  std::unique_ptr<HLTCommonConfig> common_config;
1258  HLTConfigInterface const* old_config = nullptr;
1259  HLTConfigInterface const* new_config = nullptr;
1260 
1261  unsigned int counter = 0;
1262  unsigned int skipped = 0;
1263  unsigned int affected = 0;
1264  bool new_run = true;
1265  std::vector<TriggerDiff> differences;
1266 
1267  // loop over the reference events
1268  const unsigned int nEvents = std::min((int)old_events->size(), (int)max_events);
1269  const unsigned int counter_denominator = std::max(1, int(nEvents / 10));
1270  for (old_events->toBegin(); not old_events->atEnd(); ++(*old_events)) {
1271  // printing progress on every 10%
1272  if (counter % (counter_denominator) == 0) {
1273  std::cout << "Processed events: " << counter << " out of " << nEvents << " ("
1274  << 10 * counter / (counter_denominator) << "%)" << std::endl;
1275  }
1276 
1277  // seek the same event in the "new" files
1278  edm::EventID const& id = old_events->id();
1279  if (new_events != old_events and not new_events->to(id)) {
1280  if (debug)
1281  std::cerr << "run " << id.run() << ", lumi " << id.luminosityBlock() << ", event " << id.event()
1282  << ": not found in the 'new' files, skipping." << std::endl;
1283  ++skipped;
1284  continue;
1285  }
1286 
1287  // read the TriggerResults and TriggerEvent
1289  edm::TriggerResults const* old_results = nullptr;
1290  old_results_h.getByLabel<fwlite::Event>(*old_events->event(), "TriggerResults", "", old_process.c_str());
1291  if (old_results_h.isValid())
1292  old_results = old_results_h.product();
1293  else {
1294  if (debug)
1295  std::cerr << "run " << id.run() << ", lumi " << id.luminosityBlock() << ", event " << id.event()
1296  << ": 'old' TriggerResults not found, skipping." << std::endl;
1297  continue;
1298  }
1299 
1301  trigger::TriggerEvent const* old_summary = nullptr;
1302  old_summary_h.getByLabel<fwlite::Event>(*old_events->event(), "hltTriggerSummaryAOD", "", old_process.c_str());
1303  if (old_summary_h.isValid())
1304  old_summary = old_summary_h.product();
1305 
1307  edm::TriggerResults const* new_results = nullptr;
1308  new_results_h.getByLabel<fwlite::Event>(*new_events->event(), "TriggerResults", "", new_process.c_str());
1309  if (new_results_h.isValid())
1310  new_results = new_results_h.product();
1311  else {
1312  if (debug)
1313  std::cerr << "run " << id.run() << ", lumi " << id.luminosityBlock() << ", event " << id.event()
1314  << ": 'new' TriggerResults not found, skipping." << std::endl;
1315  continue;
1316  }
1317 
1319  trigger::TriggerEvent const* new_summary = nullptr;
1320  new_summary_h.getByLabel<fwlite::Event>(*new_events->event(), "hltTriggerSummaryAOD", "", new_process.c_str());
1321  if (new_summary_h.isValid())
1322  new_summary = new_summary_h.product();
1323 
1324  // initialise the trigger configuration
1325  if (new_run) {
1326  new_run = false;
1327  old_events->fillParameterSetRegistry();
1328  new_events->fillParameterSetRegistry();
1329 
1330  old_config_data = getHLTConfigData(*old_events->event(), old_process);
1331  new_config_data = getHLTConfigData(*new_events->event(), new_process);
1332  if (new_config_data->triggerNames() == old_config_data->triggerNames()) {
1333  old_config = old_config_data.get();
1334  new_config = new_config_data.get();
1335  } else {
1336  common_config = std::make_unique<HLTCommonConfig>(*old_config_data, *new_config_data);
1337  old_config = &common_config->getView(HLTCommonConfig::Index::First);
1338  new_config = &common_config->getView(HLTCommonConfig::Index::Second);
1339  std::cout << "Warning: old and new TriggerResults come from different HLT menus. Only the common "
1340  << old_config->size() << " triggers are compared.\n"
1341  << std::endl;
1342  }
1343 
1344  differences.clear();
1345  differences.resize(old_config->size());
1346 
1347  // adding the list of selected triggers to JSON output
1348  std::vector<std::string> states_str;
1349  for (int i = State::Ready; i != State::Invalid; i++)
1350  states_str.push_back(std::string(path_state(static_cast<State>(i))));
1351  json.vars.state = states_str;
1352  for (size_t triggerId = 0; triggerId < old_config->size(); ++triggerId) {
1353  json.vars.trigger.push_back(old_config->triggerName(triggerId));
1354  json.vars.trigger_passed_count.push_back(std::pair<int, int>(0, 0));
1355  }
1356  // getting names of triggers existing only in the old configuration
1357  for (auto const& it : old_config_data->triggerNames()) {
1358  if (std::find(json.vars.trigger.begin(), json.vars.trigger.end(), it) != json.vars.trigger.end())
1359  continue;
1360  json.configuration.o.skipped_triggers.push_back(it);
1361  }
1362  // getting names of triggers existing only in the new configuration
1363  for (auto const& it : new_config_data->triggerNames()) {
1364  if (std::find(json.vars.trigger.begin(), json.vars.trigger.end(), it) != json.vars.trigger.end())
1365  continue;
1366  json.configuration.n.skipped_triggers.push_back(it);
1367  }
1368  }
1369 
1370  // compare the TriggerResults
1371  bool needs_header = true;
1372  bool event_affected = false;
1373  for (unsigned int p = 0; p < old_config->size(); ++p) {
1374  // FIXME explicitly converting the indices is a hack, it should be properly encapsulated instead
1375  unsigned int old_index = old_config->triggerIndex(p);
1376  unsigned int new_index = new_config->triggerIndex(p);
1377  State old_state = prescaled_state(old_results->state(old_index), p, old_results->index(old_index), *old_config);
1378  State new_state = prescaled_state(new_results->state(new_index), p, new_results->index(new_index), *new_config);
1379 
1380  if (old_state == Pass) {
1381  ++differences.at(p).count;
1382  }
1383  if (old_state == Pass)
1384  ++json.vars.trigger_passed_count.at(p).first;
1385  if (new_state == Pass)
1386  ++json.vars.trigger_passed_count.at(p).second;
1387 
1388  bool trigger_affected = false;
1389  if (not ignore_prescales or (old_state != Prescaled and new_state != Prescaled)) {
1390  if (old_state == Pass and new_state != Pass) {
1391  ++differences.at(p).lost;
1392  trigger_affected = true;
1393  } else if (old_state != Pass and new_state == Pass) {
1394  ++differences.at(p).gained;
1395  trigger_affected = true;
1396  } else if (old_results->index(old_index) != new_results->index(new_index)) {
1397  ++differences.at(p).internal;
1398  trigger_affected = true;
1399  }
1400  }
1401 
1402  if (not trigger_affected)
1403  continue;
1404 
1405  event_affected = true;
1406  const unsigned int old_moduleIndex = old_results->index(old_index);
1407  const unsigned int new_moduleIndex = new_results->index(new_index);
1408  // storing the event to JSON, without any trigger results for the moment
1409  JsonOutputProducer::JsonEvent& event = json.pushEvent(id.run(), id.luminosityBlock(), id.event());
1410  JsonOutputProducer::JsonTriggerEventState& state = event.pushTrigger(p);
1411  state.o = json.eventState(old_state,
1412  old_moduleIndex,
1413  old_config->moduleLabel(p, old_moduleIndex),
1414  old_config->moduleType(p, old_moduleIndex));
1415  state.n = json.eventState(new_state,
1416  new_moduleIndex,
1417  new_config->moduleLabel(p, new_moduleIndex),
1418  new_config->moduleType(p, new_moduleIndex));
1419 
1420  if (verbose > 0) {
1421  if (needs_header) {
1422  needs_header = false;
1423  std::cout << "run " << id.run() << ", lumi " << id.luminosityBlock() << ", event " << id.event() << ": "
1424  << "old result is '" << event_state(old_results->accept()) << "', "
1425  << "new result is '" << event_state(new_results->accept()) << "'" << std::endl;
1426  }
1427  // print the Trigger path and filter responsible for the discrepancy
1428  std::cout << " Path " << old_config->triggerName(p) << ":\n"
1429  << " old state is ";
1430  print_detailed_path_state(std::cout, old_state, p, old_moduleIndex, *old_config);
1431  std::cout << ",\n"
1432  << " new state is ";
1433  print_detailed_path_state(std::cout, new_state, p, new_moduleIndex, *new_config);
1434  std::cout << std::endl;
1435  }
1436  if (verbose > 1 and old_summary and new_summary) {
1437  // print TriggerObjects for the filter responsible for the discrepancy
1438  unsigned int module = std::min(old_moduleIndex, new_moduleIndex);
1439  std::cout << " Filter " << old_config->moduleLabel(p, module) << ":\n";
1440  std::cout << " old trigger candidates:\n";
1442  *old_summary,
1443  edm::InputTag(old_config->moduleLabel(p, module), "", old_config->processName()));
1444  std::cout << " new trigger candidates:\n";
1446  *new_summary,
1447  edm::InputTag(new_config->moduleLabel(p, module), "", new_config->processName()));
1448  }
1449  if (verbose > 0)
1450  std::cout << std::endl;
1451  }
1452  if (event_affected)
1453  ++affected;
1454 
1455  // compare the TriggerEvent
1456  if (event_affected and verbose > 2 and old_summary and new_summary) {
1457  std::map<std::string, std::pair<std::string, std::string>> collections;
1458  for (auto const& old_collection : old_summary->collectionTags())
1459  collections[strip_process_name(old_collection)].first = old_collection;
1460  for (auto const& new_collection : new_summary->collectionTags())
1461  collections[strip_process_name(new_collection)].second = new_collection;
1462 
1463  for (auto const& collection : collections) {
1464  std::cout << " Collection " << collection.first << ":\n";
1465  std::cout << " old trigger candidates:\n";
1466  print_trigger_collection(std::cout, *old_summary, collection.second.first);
1467  std::cout << " new trigger candidates:\n";
1468  print_trigger_collection(std::cout, *new_summary, collection.second.second);
1469  std::cout << std::endl;
1470  }
1471  }
1472 
1473  ++counter;
1474  if (nEvents and counter >= nEvents)
1475  break;
1476  }
1477 
1478  json.configuration.events = counter;
1479 
1480  if (not counter) {
1481  std::cout << "There are no common events between the old and new files";
1482  if (skipped)
1483  std::cout << ", " << skipped << " events were skipped";
1484  std::cout << "." << std::endl;
1485  } else {
1486  std::cout << "Found " << counter << " matching events, out of which " << affected
1487  << " have different HLT results";
1488  if (skipped)
1489  std::cout << ", " << skipped << " events were skipped";
1490  std::cout << "\n" << std::endl;
1491  }
1492  // Printing the summary of affected triggers with affected-event counts
1493  if (!quiet) {
1494  bool summaryHeaderPrinted = false;
1495  for (size_t p = 0; p < old_config->size(); ++p) {
1496  if (differences.at(p).total() < 1)
1497  continue;
1498  if (!summaryHeaderPrinted)
1499  std::cout << std::setw(12) << "Events" << std::setw(12) << "Accepted" << std::setw(12) << "Gained"
1500  << std::setw(12) << "Lost" << std::setw(12) << "Other"
1501  << " "
1502  << "Trigger" << std::endl;
1503  std::cout << std::setw(12) << counter << differences.at(p) << " " << old_config->triggerName(p) << std::endl;
1504  summaryHeaderPrinted = true;
1505  }
1506  }
1507 
1508  // writing all the required output
1509  json.write(); // to JSON file for interactive visualisation
1511  summary.write(); // to ROOT file for fast validation with static plots
1512  }
virtual unsigned int triggerIndex(unsigned int trigger) const =0
bool check_files(std::vector< std::string > const &files)
Definition: hltDiff.cc:1182
const std::vector< std::string > & collectionTags() const
Definition: TriggerEvent.h:99
The single EDProduct to be saved for each event (AOD case)
Definition: TriggerEvent.h:25
bool debug
Definition: hltDiff.cc:1205
virtual std::string const & processName() const =0
bool root_out
Definition: hltDiff.cc:1202
Definition: hltDiff.cc:244
void print_trigger_candidates(std::ostream &out, trigger::TriggerEvent const &summary, edm::InputTag const &filter)
Definition: hltDiff.cc:298
virtual std::string const & moduleLabel(unsigned int trigger, unsigned int module) const =0
bool isValid() const
Definition: Handle.h:60
bool file_check
Definition: hltDiff.cc:1204
bool accept() const
Has at least one path accepted the event?
void print_detailed_path_state(std::ostream &out, State state, int path, int module, HLTConfigInterface const &config)
Definition: hltDiff.cc:287
const char * event_state(bool state)
Definition: hltDiff.cc:114
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
bool quiet
Definition: hltDiff.cc:1206
void getByLabel(const P &iP, const char *iModuleLabel, const char *iProductInstanceLabel=0, const char *iProcessLabel=0)
Definition: Handle.h:100
std::vector< std::string > old_files
Definition: hltDiff.cc:1194
State prescaled_state(int state, int path, int module, HLTConfigInterface const &config)
Definition: hltDiff.cc:260
std::string output_file
Definition: hltDiff.cc:1203
std::unique_ptr< HLTConfigDataEx > getHLTConfigData(fwlite::EventBase const &event, std::string process)
Definition: hltDiff.cc:363
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
unsigned int index(const unsigned int i) const
Get index (slot position) of module giving the decision of the ith path.
std::vector< std::string > new_files
Definition: hltDiff.cc:1196
virtual std::string const & moduleType(unsigned int trigger, unsigned int module) const =0
bool csv_out
Definition: hltDiff.cc:1200
bool ignore_prescales
Definition: hltDiff.cc:1199
bool json_out
Definition: hltDiff.cc:1201
std::string strip_process_name(std::string const &s)
Definition: hltDiff.cc:273
T min(T a, T b)
Definition: MathUtil.h:58
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
void print_trigger_collection(std::ostream &out, trigger::TriggerEvent const &summary, std::string const &tag)
Definition: hltDiff.cc:328
const char * path_state(State state)
Definition: hltDiff.cc:251
unsigned int max_events
Definition: hltDiff.cc:1198
static std::atomic< unsigned int > counter
T const * product() const
Definition: Handle.h:65
UInt_t nEvents
Definition: hcalCalib.cc:41
Definition: vlib.h:198
std::string new_process
Definition: hltDiff.cc:1197
hlt::HLTState state(const unsigned int i) const
Get status of ith path.
std::string old_process
Definition: hltDiff.cc:1195
void HltDiff::usage ( std::ostream &  out) const
inline

Definition at line 1514 of file hltDiff.cc.

1514  {
1515  out << "\
1516 usage: hltDiff -o|--old-files FILE1.ROOT [FILE2.ROOT ...] [-O|--old-process LABEL[:INSTANCE[:PROCESS]]]\n\
1517  -n|--new-files FILE1.ROOT [FILE2.ROOT ...] [-N|--new-process LABEL[:INSTANCE[:PROCESS]]]\n\
1518  [-m|--max-events MAXEVENTS] [-p|--prescales] [-c|--csv-output] [-j|--json-output]\n\
1519  [-r|--root-output] [-f|--file-check] [-d|--debug] [-q|--quiet] [-v|--verbose]\n\
1520  [-h|--help] [-F|--output-file] FILE_NAME\n\
1521 \n\
1522  -o|--old-files FILE1.ROOT [FILE2.ROOT ...]\n\
1523  input file(s) with the old (reference) trigger results\n\
1524 \n\
1525  -O|--old-process PROCESS\n\
1526  process name of the collection with the old (reference) trigger results\n\
1527  default: take the 'TriggerResults' from the last process\n\
1528 \n\
1529  -n|--new-files FILE1.ROOT [FILE2.ROOT ...]\n\
1530  input file(s) with the new trigger results to be compared with the reference\n\
1531  to read these from a different collection in the same files as\n\
1532  the reference, use '-n -' and specify the collection with -N (see below)\n\
1533 \n\
1534  -N|--new-process PROCESS\n\
1535  process name of the collection with the new (reference) trigger results\n\
1536  default: take the 'TriggerResults' from the last process\n\
1537 \n\
1538  -m|--max-events MAXEVENTS\n\
1539  compare only the first MAXEVENTS events\n\
1540  default: compare all the events in the original (reference) files\n\
1541 \n\
1542  -p|--prescales\n\
1543  do not ignore differences caused by HLTPrescaler modules\n\
1544 \n\
1545  -c|--csv-output\n\
1546  produce comparison results in a CSV format\n\
1547 \n\
1548  -j|--json-output\n\
1549  produce comparison results in a JSON format\n\
1550 \n\
1551  -r|--root-output\n\
1552  produce comparison results as histograms in a ROOT file\n\
1553 \n\
1554  -F|--output-file FILE_NAME\n\
1555  combine all RUNs to files with the specified custom name: FILE_NAME.json, FILE_NAME.root\n\
1556  default: a separate output file will be produced for each RUN with names suitable for the DQM GUI\n\
1557 \n\
1558  -f|--file-check\n\
1559  check existence of every old and new file before running the comparison\n\
1560  safer if files are run for the first time, but can cause a substantial delay\n\
1561 \n\
1562  -d|--debug\n\
1563  display messages about missing events and collectiions\n\
1564 \n\
1565  -q|--quiet\n\
1566  don't display summary printout with the list of affected trigger paths\n\
1567 \n\
1568  -v|--verbose LEVEL\n\
1569  set verbosity level:\n\
1570  1: event-by-event comparison results\n\
1571  2: + print the trigger candidates of the affected filters\n\
1572  3: + print all the trigger candidates for the affected events\n\
1573  default: 1\n\
1574 \n\
1575  -h|--help\n\
1576  print this help message, and exit"
1577  << std::endl;
1578  }

Member Data Documentation

bool HltDiff::csv_out

Definition at line 1200 of file hltDiff.cc.

bool HltDiff::debug
bool HltDiff::file_check

Definition at line 1204 of file hltDiff.cc.

bool HltDiff::ignore_prescales

Definition at line 1199 of file hltDiff.cc.

bool HltDiff::json_out

Definition at line 1201 of file hltDiff.cc.

unsigned int HltDiff::max_events

Definition at line 1198 of file hltDiff.cc.

std::vector<std::string> HltDiff::new_files

Definition at line 1196 of file hltDiff.cc.

std::string HltDiff::new_process

Definition at line 1197 of file hltDiff.cc.

std::vector<std::string> HltDiff::old_files

Definition at line 1194 of file hltDiff.cc.

std::string HltDiff::old_process

Definition at line 1195 of file hltDiff.cc.

std::string HltDiff::output_file

Definition at line 1203 of file hltDiff.cc.

Referenced by DTWorkflow.DTWorkflow::prepare_common_write().

bool HltDiff::quiet

Definition at line 1206 of file hltDiff.cc.

bool HltDiff::root_out

Definition at line 1202 of file hltDiff.cc.

unsigned int HltDiff::verbose