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 1226 of file hltDiff.cc.

Constructor & Destructor Documentation

HltDiff::HltDiff ( )
inline

Definition at line 1245 of file hltDiff.cc.

1245  :
1246  old_files(0),
1247  old_process(""),
1248  new_files(0),
1249  new_process(""),
1250  max_events(1e9),
1251  ignore_prescales(true),
1252  csv_out(false),
1253  json_out(false),
1254  root_out(false),
1255  output_file(""),
1256  file_check(false),
1257  debug(false),
1258  quiet(false),
1259  verbose(0) {}
bool debug
Definition: hltDiff.cc:1241
bool root_out
Definition: hltDiff.cc:1238
bool file_check
Definition: hltDiff.cc:1240
unsigned int verbose
Definition: hltDiff.cc:1243
bool quiet
Definition: hltDiff.cc:1242
std::vector< std::string > old_files
Definition: hltDiff.cc:1230
std::string output_file
Definition: hltDiff.cc:1239
std::vector< std::string > new_files
Definition: hltDiff.cc:1232
bool csv_out
Definition: hltDiff.cc:1236
bool ignore_prescales
Definition: hltDiff.cc:1235
bool json_out
Definition: hltDiff.cc:1237
unsigned int max_events
Definition: hltDiff.cc:1234
std::string new_process
Definition: hltDiff.cc:1233
std::string old_process
Definition: hltDiff.cc:1231

Member Function Documentation

void HltDiff::compare ( ) const
inline

Definition at line 1261 of file hltDiff.cc.

References edm::HLTGlobalStatus::accept(), MessageLogger_cfi::cerr, check_files(), mps_alisetup::collection, 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(), edmPickEvents::json, hpstanc_transforms::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, findQualityFiles::run, HLTCommonConfig::Second, HLTConfigInterface::size(), runEdmFileComparison::skipped, JsonOutputProducer::JsonConfigurationBlock::skipped_triggers, edm::HLTGlobalStatus::state(), JsonOutputProducer::JsonVars::state, AlCaHLTBitMon_QueryRunRegistry::string, strip_process_name(), heppy_report::summary, JsonOutputProducer::JsonVars::trigger, JsonOutputProducer::JsonVars::trigger_passed_count, HLTConfigInterface::triggerIndex(), HLTConfigInterface::triggerName(), JsonOutputProducer::vars, JsonOutputProducer::write(), and SummaryOutputProducer::write().

1261  {
1262  std::shared_ptr<fwlite::ChainEvent> old_events;
1263  std::shared_ptr<fwlite::ChainEvent> new_events;
1264 
1266  old_events = std::make_shared<fwlite::ChainEvent>(old_files);
1267  else
1268  return;
1269 
1270  if (new_files.size() == 1 and new_files[0] == "-")
1271  new_events = old_events;
1272  else if (not file_check or check_files(new_files))
1273  new_events = std::make_shared<fwlite::ChainEvent>(new_files);
1274  else
1275  return;
1276 
1277  // creating the structure holding data for JSON and ROOT output
1279 
1280  json.configuration.prescales = ignore_prescales;
1281  // setting the old configuration
1282  json.configuration.o.process = old_process;
1283  json.configuration.o.files = old_files;
1284  json.configuration.o.extractFileBase();
1285  // setting the new configuration
1286  json.configuration.n.process = new_process;
1287  json.configuration.n.files = new_files;
1288  json.configuration.n.extractFileBase();
1289 
1290  // initialising configurations to be compared
1291  std::unique_ptr<HLTConfigDataEx> old_config_data;
1292  std::unique_ptr<HLTConfigDataEx> new_config_data;
1293  std::unique_ptr<HLTCommonConfig> common_config;
1294  HLTConfigInterface const * old_config = nullptr;
1295  HLTConfigInterface const * new_config = nullptr;
1296 
1297  unsigned int counter = 0;
1298  unsigned int skipped = 0;
1299  unsigned int affected = 0;
1300  bool new_run = true;
1301  std::vector<TriggerDiff> differences;
1302 
1303  // loop over the reference events
1304  const unsigned int nEvents = std::min((int)old_events->size(), (int)max_events);
1305  const unsigned int counter_denominator = std::max(1, int(nEvents/10));
1306  for (old_events->toBegin(); not old_events->atEnd(); ++(*old_events)) {
1307  // printing progress on every 10%
1308  if (counter%(counter_denominator) == 0) {
1309  std::cout << "Processed events: " << counter << " out of " << nEvents
1310  << " (" << 10*counter/(counter_denominator) << "%)" << std::endl;
1311  }
1312 
1313  // seek the same event in the "new" files
1314  edm::EventID const& id = old_events->id();
1315  if (new_events != old_events and not new_events->to(id)) {
1316  if (debug)
1317  std::cerr << "run " << id.run() << ", lumi " << id.luminosityBlock() << ", event " << id.event() << ": not found in the 'new' files, skipping." << std::endl;
1318  ++skipped;
1319  continue;
1320  }
1321 
1322  // read the TriggerResults and TriggerEvent
1324  edm::TriggerResults const * old_results = nullptr;
1325  old_results_h.getByLabel<fwlite::Event>(* old_events->event(), "TriggerResults", "", old_process.c_str());
1326  if (old_results_h.isValid())
1327  old_results = old_results_h.product();
1328  else {
1329  if (debug)
1330  std::cerr << "run " << id.run() << ", lumi " << id.luminosityBlock() << ", event " << id.event() << ": 'old' TriggerResults not found, skipping." << std::endl;
1331  continue;
1332  }
1333 
1335  trigger::TriggerEvent const * old_summary = nullptr;
1336  old_summary_h.getByLabel<fwlite::Event>(* old_events->event(), "hltTriggerSummaryAOD", "", old_process.c_str());
1337  if (old_summary_h.isValid())
1338  old_summary = old_summary_h.product();
1339 
1341  edm::TriggerResults const * new_results = nullptr;
1342  new_results_h.getByLabel<fwlite::Event>(* new_events->event(), "TriggerResults", "", new_process.c_str());
1343  if (new_results_h.isValid())
1344  new_results = new_results_h.product();
1345  else {
1346  if (debug)
1347  std::cerr << "run " << id.run() << ", lumi " << id.luminosityBlock() << ", event " << id.event() << ": 'new' TriggerResults not found, skipping." << std::endl;
1348  continue;
1349  }
1350 
1352  trigger::TriggerEvent const * new_summary = nullptr;
1353  new_summary_h.getByLabel<fwlite::Event>(* new_events->event(), "hltTriggerSummaryAOD", "", new_process.c_str());
1354  if (new_summary_h.isValid())
1355  new_summary = new_summary_h.product();
1356 
1357  // initialise the trigger configuration
1358  if (new_run) {
1359  new_run = false;
1360  old_events->fillParameterSetRegistry();
1361  new_events->fillParameterSetRegistry();
1362 
1363  old_config_data = getHLTConfigData(* old_events->event(), old_process);
1364  new_config_data = getHLTConfigData(* new_events->event(), new_process);
1365  if (new_config_data->triggerNames() == old_config_data->triggerNames()) {
1366  old_config = old_config_data.get();
1367  new_config = new_config_data.get();
1368  } else {
1369  common_config = std::make_unique<HLTCommonConfig>(*old_config_data, *new_config_data);
1370  old_config = & common_config->getView(HLTCommonConfig::Index::First);
1371  new_config = & common_config->getView(HLTCommonConfig::Index::Second);
1372  std::cout << "Warning: old and new TriggerResults come from different HLT menus. Only the common " << old_config->size() << " triggers are compared.\n" << std::endl;
1373  }
1374 
1375  differences.clear();
1376  differences.resize(old_config->size());
1377 
1378  // adding the list of selected triggers to JSON output
1379  std::vector<std::string> states_str;
1380  for (int i = State::Ready; i != State::Invalid; i++)
1381  states_str.push_back(std::string(path_state(static_cast<State>(i))));
1382  json.vars.state = states_str;
1383  for (size_t triggerId = 0; triggerId < old_config->size(); ++triggerId) {
1384  json.vars.trigger.push_back(old_config->triggerName(triggerId));
1385  json.vars.trigger_passed_count.push_back(std::pair<int, int>(0,0));
1386  }
1387  // getting names of triggers existing only in the old configuration
1388  for (auto const & it : old_config_data->triggerNames()) {
1389  if (std::find(json.vars.trigger.begin(), json.vars.trigger.end(), it) != json.vars.trigger.end()) continue;
1390  json.configuration.o.skipped_triggers.push_back(it);
1391  }
1392  // getting names of triggers existing only in the new configuration
1393  for (auto const & it : new_config_data->triggerNames()) {
1394  if (std::find(json.vars.trigger.begin(), json.vars.trigger.end(), it) != json.vars.trigger.end()) continue;
1395  json.configuration.n.skipped_triggers.push_back(it);
1396  }
1397  }
1398 
1399  // compare the TriggerResults
1400  bool needs_header = true;
1401  bool event_affected = false;
1402  for (unsigned int p = 0; p < old_config->size(); ++p) {
1403  // FIXME explicitly converting the indices is a hack, it should be properly encapsulated instead
1404  unsigned int old_index = old_config->triggerIndex(p);
1405  unsigned int new_index = new_config->triggerIndex(p);
1406  State old_state = prescaled_state(old_results->state(old_index), p, old_results->index(old_index), * old_config);
1407  State new_state = prescaled_state(new_results->state(new_index), p, new_results->index(new_index), * new_config);
1408 
1409  if (old_state == Pass) {
1410  ++differences.at(p).count;
1411  }
1412  if (old_state == Pass)
1413  ++json.vars.trigger_passed_count.at(p).first;
1414  if (new_state == Pass)
1415  ++json.vars.trigger_passed_count.at(p).second;
1416 
1417  bool trigger_affected = false;
1418  if (not ignore_prescales or (old_state != Prescaled and new_state != Prescaled)) {
1419  if (old_state == Pass and new_state != Pass) {
1420  ++differences.at(p).lost;
1421  trigger_affected = true;
1422  } else if (old_state != Pass and new_state == Pass) {
1423  ++differences.at(p).gained;
1424  trigger_affected = true;
1425  } else if (old_results->index(old_index) != new_results->index(new_index)) {
1426  ++differences.at(p).internal;
1427  trigger_affected = true;
1428  }
1429  }
1430 
1431  if (not trigger_affected) continue;
1432 
1433  event_affected = true;
1434  const unsigned int old_moduleIndex = old_results->index(old_index);
1435  const unsigned int new_moduleIndex = new_results->index(new_index);
1436  // storing the event to JSON, without any trigger results for the moment
1437  JsonOutputProducer::JsonEvent& event = json.pushEvent(id.run(), id.luminosityBlock(), id.event());
1438  JsonOutputProducer::JsonTriggerEventState& state = event.pushTrigger(p);
1439  state.o = json.eventState(old_state, old_moduleIndex, old_config->moduleLabel(p, old_moduleIndex), old_config->moduleType(p, old_moduleIndex));
1440  state.n = json.eventState(new_state, new_moduleIndex, new_config->moduleLabel(p, new_moduleIndex), new_config->moduleType(p, new_moduleIndex));
1441 
1442  if (verbose > 0) {
1443  if (needs_header) {
1444  needs_header = false;
1445  std::cout << "run " << id.run() << ", lumi " << id.luminosityBlock() << ", event " << id.event() << ": "
1446  << "old result is '" << event_state(old_results->accept()) << "', "
1447  << "new result is '" << event_state(new_results->accept()) << "'"
1448  << std::endl;
1449  }
1450  // print the Trigger path and filter responsible for the discrepancy
1451  std::cout << " Path " << old_config->triggerName(p) << ":\n"
1452  << " old state is ";
1453  print_detailed_path_state(std::cout, old_state, p, old_moduleIndex, * old_config);
1454  std::cout << ",\n"
1455  << " new state is ";
1456  print_detailed_path_state(std::cout, new_state, p, new_moduleIndex, * new_config);
1457  std::cout << std::endl;
1458  }
1459  if (verbose > 1 and old_summary and new_summary) {
1460  // print TriggerObjects for the filter responsible for the discrepancy
1461  unsigned int module = std::min(old_moduleIndex, new_moduleIndex);
1462  std::cout << " Filter " << old_config->moduleLabel(p, module) << ":\n";
1463  std::cout << " old trigger candidates:\n";
1464  print_trigger_candidates(std::cout, * old_summary, edm::InputTag(old_config->moduleLabel(p, module), "", old_config->processName()));
1465  std::cout << " new trigger candidates:\n";
1466  print_trigger_candidates(std::cout, * new_summary, edm::InputTag(new_config->moduleLabel(p, module), "", new_config->processName()));
1467  }
1468  if (verbose > 0)
1469  std::cout << std::endl;
1470  }
1471  if (event_affected)
1472  ++affected;
1473 
1474  // compare the TriggerEvent
1475  if (event_affected and verbose > 2 and old_summary and new_summary) {
1476  std::map<std::string, std::pair<std::string, std::string>> collections;
1477  for (auto const & old_collection: old_summary->collectionTags())
1478  collections[strip_process_name(old_collection)].first = old_collection;
1479  for (auto const & new_collection: new_summary->collectionTags())
1480  collections[strip_process_name(new_collection)].second = new_collection;
1481 
1482  for (auto const & collection: collections) {
1483  std::cout << " Collection " << collection.first << ":\n";
1484  std::cout << " old trigger candidates:\n";
1485  print_trigger_collection(std::cout, * old_summary, collection.second.first);
1486  std::cout << " new trigger candidates:\n";
1487  print_trigger_collection(std::cout, * new_summary, collection.second.second);
1488  std::cout << std::endl;
1489  }
1490  }
1491 
1492  ++counter;
1493  if (nEvents and counter >= nEvents)
1494  break;
1495  }
1496 
1497  json.configuration.events = counter;
1498 
1499  if (not counter) {
1500  std::cout << "There are no common events between the old and new files";
1501  if (skipped)
1502  std::cout << ", " << skipped << " events were skipped";
1503  std::cout << "." << std::endl;
1504  } else {
1505  std::cout << "Found " << counter << " matching events, out of which " << affected << " have different HLT results";
1506  if (skipped)
1507  std::cout << ", " << skipped << " events were skipped";
1508  std::cout << "\n" << std::endl;
1509  }
1510  // Printing the summary of affected triggers with affected-event counts
1511  if (!quiet) {
1512  bool summaryHeaderPrinted = false;
1513  for (size_t p = 0; p < old_config->size(); ++p) {
1514  if (differences.at(p).total() < 1) continue;
1515  if (!summaryHeaderPrinted)
1516  std::cout << std::setw(12) << "Events" << std::setw(12) << "Accepted" << std::setw(12) << "Gained" << std::setw(12) << "Lost" << std::setw(12) << "Other" << " " << "Trigger" << std::endl;
1517  std::cout << std::setw(12) << counter << differences.at(p) << " " << old_config->triggerName(p) << std::endl;
1518  summaryHeaderPrinted = true;
1519  }
1520  }
1521 
1522  // writing all the required output
1523  json.write(); // to JSON file for interactive visualisation
1525  summary.write(); // to ROOT file for fast validation with static plots
1526  }
virtual unsigned int triggerIndex(unsigned int trigger) const =0
bool check_files(std::vector< std::string > const &files)
Definition: hltDiff.cc:1216
const std::vector< std::string > & collectionTags() const
Definition: TriggerEvent.h:96
The single EDProduct to be saved for each event (AOD case)
Definition: TriggerEvent.h:25
bool debug
Definition: hltDiff.cc:1241
virtual std::string const & processName() const =0
bool root_out
Definition: hltDiff.cc:1238
Definition: hltDiff.cc:290
void print_trigger_candidates(std::ostream &out, trigger::TriggerEvent const &summary, edm::InputTag const &filter)
Definition: hltDiff.cc:346
virtual std::string const & moduleLabel(unsigned int trigger, unsigned int module) const =0
bool isValid() const
Definition: Handle.h:61
bool file_check
Definition: hltDiff.cc:1240
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:335
const char * event_state(bool state)
Definition: hltDiff.cc:136
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
bool quiet
Definition: hltDiff.cc:1242
void getByLabel(const P &iP, const char *iModuleLabel, const char *iProductInstanceLabel=0, const char *iProcessLabel=0)
Definition: Handle.h:91
std::vector< std::string > old_files
Definition: hltDiff.cc:1230
State prescaled_state(int state, int path, int module, HLTConfigInterface const &config)
Definition: hltDiff.cc:307
std::string output_file
Definition: hltDiff.cc:1239
std::unique_ptr< HLTConfigDataEx > getHLTConfigData(fwlite::EventBase const &event, std::string process)
Definition: hltDiff.cc:412
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:1232
virtual std::string const & moduleType(unsigned int trigger, unsigned int module) const =0
bool csv_out
Definition: hltDiff.cc:1236
bool ignore_prescales
Definition: hltDiff.cc:1235
bool json_out
Definition: hltDiff.cc:1237
std::string strip_process_name(std::string const &s)
Definition: hltDiff.cc:320
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:376
const char * path_state(State state)
Definition: hltDiff.cc:297
unsigned int max_events
Definition: hltDiff.cc:1234
static std::atomic< unsigned int > counter
State
Definition: hltDiff.cc:288
T const * product() const
Definition: Handle.h:66
UInt_t nEvents
Definition: hcalCalib.cc:42
Definition: vlib.h:208
std::string new_process
Definition: hltDiff.cc:1233
hlt::HLTState state(const unsigned int i) const
Get status of ith path.
std::string old_process
Definition: hltDiff.cc:1231
void HltDiff::usage ( std::ostream &  out) const
inline

Definition at line 1528 of file hltDiff.cc.

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

Member Data Documentation

bool HltDiff::csv_out

Definition at line 1236 of file hltDiff.cc.

bool HltDiff::debug

Definition at line 1241 of file hltDiff.cc.

Referenced by rrapi.RRApi::dprint(), and rrapi.RRApi::get().

bool HltDiff::file_check

Definition at line 1240 of file hltDiff.cc.

bool HltDiff::ignore_prescales

Definition at line 1235 of file hltDiff.cc.

bool HltDiff::json_out

Definition at line 1237 of file hltDiff.cc.

unsigned int HltDiff::max_events

Definition at line 1234 of file hltDiff.cc.

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

Definition at line 1232 of file hltDiff.cc.

std::string HltDiff::new_process

Definition at line 1233 of file hltDiff.cc.

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

Definition at line 1230 of file hltDiff.cc.

std::string HltDiff::old_process

Definition at line 1231 of file hltDiff.cc.

std::string HltDiff::output_file

Definition at line 1239 of file hltDiff.cc.

bool HltDiff::quiet

Definition at line 1242 of file hltDiff.cc.

bool HltDiff::root_out

Definition at line 1238 of file hltDiff.cc.

unsigned int HltDiff::verbose