CMS 3D CMS Logo

List of all members | Classes | Public Types | Public Member Functions | Private Member Functions | Private Attributes
lhef::LHERunInfo Class Reference

#include <LHERunInfo.h>

Classes

struct  Counter
 
class  Header
 
struct  Process
 
struct  XSec
 

Public Types

enum  CountMode { kTried = 0, kSelected, kKilled, kAccepted }
 

Public Member Functions

void addComment (const std::string &line)
 
void addHeader (const Header &header)
 
void count (int process, CountMode count, double eventWeight=1.0, double brWeight=1.0, double matchWeight=1.0)
 
std::vector< std::string > findHeader (const std::string &tag) const
 
const std::vector< std::string > & getComments () const
 
const std::vector< Header > & getHeaders () const
 
const int getHEPIDWTUP () const
 
const HEPRUPgetHEPRUP () const
 
const std::vector< Process > & getLumiProcesses () const
 
void initLumi ()
 
 LHERunInfo (std::istream &in)
 
 LHERunInfo (const HEPRUP &heprup)
 
 LHERunInfo (const HEPRUP &heprup, const std::vector< LHERunInfoProduct::Header > &headers, const std::vector< std::string > &comments)
 
 LHERunInfo (const LHERunInfoProduct &product)
 
bool operator!= (const LHERunInfo &other) const
 
bool operator== (const LHERunInfo &other) const
 
std::pair< int, int > pdfSetTranslation () const
 
void statistics () const
 
XSec xsec () const
 
 ~LHERunInfo ()
 

Private Member Functions

void init ()
 

Private Attributes

std::vector< std::string > comments
 
std::vector< Headerheaders
 
HEPRUP heprup
 
std::vector< Processprocesses
 
std::vector< ProcessprocessesLumi
 

Detailed Description

Definition at line 25 of file LHERunInfo.h.

Member Enumeration Documentation

◆ CountMode

Enumerator
kTried 
kSelected 
kKilled 
kAccepted 

Definition at line 64 of file LHERunInfo.h.

Constructor & Destructor Documentation

◆ LHERunInfo() [1/4]

lhef::LHERunInfo::LHERunInfo ( std::istream &  in)

Definition at line 38 of file LHERunInfo.cc.

References comments, lhef::HEPRUP::EBMUP, heprup, mps_fire::i, lhef::HEPRUP::IDBMUP, lhef::HEPRUP::IDWTUP, recoMuon::in, init(), mps_splice::line, lhef::HEPRUP::LPRUP, lhef::HEPRUP::NPRUP, lhef::HEPRUP::PDFGUP, lhef::HEPRUP::PDFSUP, lhef::HEPRUP::resize(), skipWhitespace(), AlCaHLTBitMon_QueryRunRegistry::string, lhef::HEPRUP::XERRUP, lhef::HEPRUP::XMAXUP, and lhef::HEPRUP::XSECUP.

38  {
39  in >> heprup.IDBMUP.first >> heprup.IDBMUP.second >> heprup.EBMUP.first >> heprup.EBMUP.second >>
40  heprup.PDFGUP.first >> heprup.PDFGUP.second >> heprup.PDFSUP.first >> heprup.PDFSUP.second >> heprup.IDWTUP >>
41  heprup.NPRUP;
42  if (!in.good())
43  throw cms::Exception("InvalidFormat") << "Les Houches file contained invalid"
44  " header in init section."
45  << std::endl;
46 
47  heprup.resize();
48 
49  for (int i = 0; i < heprup.NPRUP; i++) {
51  if (!in.good())
52  throw cms::Exception("InvalidFormat") << "Les Houches file contained invalid data"
53  " in header payload line "
54  << (i + 1) << "." << std::endl;
55  }
56 
57  while (skipWhitespace(in) == '#') {
59  std::getline(in, line);
60  comments.push_back(line + "\n");
61  }
62 
63  if (!in.eof())
64  edm::LogInfo("Generator|LHEInterface")
65  << "Les Houches file contained spurious"
66  " content after the regular data (this is normal for LHEv3 files for now)."
67  << std::endl;
68 
69  init();
70  }
static XERCES_CPP_NAMESPACE_USE int skipWhitespace(std::istream &in)
Definition: LHERunInfo.cc:26
void resize(int nrup)
Definition: LesHouches.h:44
std::pair< double, double > EBMUP
Definition: LesHouches.h:82
std::pair< int, int > IDBMUP
Definition: LesHouches.h:77
std::pair< int, int > PDFGUP
Definition: LesHouches.h:88
std::vector< double > XERRUP
Definition: LesHouches.h:118
std::vector< double > XMAXUP
Definition: LesHouches.h:123
std::pair< int, int > PDFSUP
Definition: LesHouches.h:94
std::vector< std::string > comments
Definition: LHERunInfo.h:160
std::vector< double > XSECUP
Definition: LesHouches.h:112
std::vector< int > LPRUP
Definition: LesHouches.h:128

◆ LHERunInfo() [2/4]

lhef::LHERunInfo::LHERunInfo ( const HEPRUP heprup)

Definition at line 72 of file LHERunInfo.cc.

References init().

72 : heprup(heprup) { init(); }

◆ LHERunInfo() [3/4]

lhef::LHERunInfo::LHERunInfo ( const HEPRUP heprup,
const std::vector< LHERunInfoProduct::Header > &  headers,
const std::vector< std::string > &  comments 
)

Definition at line 74 of file LHERunInfo.cc.

References comments, filterCSVwithJSON::copy, headers, and init().

77  : heprup(heprup) {
78  std::copy(headers.begin(), headers.end(), std::back_inserter(this->headers));
79  std::copy(comments.begin(), comments.end(), std::back_inserter(this->comments));
80 
81  init();
82  }
std::vector< std::string > comments
Definition: LHERunInfo.h:160
std::vector< Header > headers
Definition: LHERunInfo.h:159

◆ LHERunInfo() [4/4]

lhef::LHERunInfo::LHERunInfo ( const LHERunInfoProduct product)

Definition at line 84 of file LHERunInfo.cc.

References comments, LHERunInfoProduct::comments_begin(), LHERunInfoProduct::comments_end(), filterCSVwithJSON::copy, headers, LHERunInfoProduct::headers_begin(), LHERunInfoProduct::headers_end(), and init().

84  : heprup(product.heprup()) {
85  std::copy(product.headers_begin(), product.headers_end(), std::back_inserter(headers));
86  std::copy(product.comments_begin(), product.comments_end(), std::back_inserter(comments));
87 
88  init();
89  }
headers_const_iterator headers_begin() const
comments_const_iterator comments_end() const
headers_const_iterator headers_end() const
const lhef::HEPRUP & heprup() const
std::vector< std::string > comments
Definition: LHERunInfo.h:160
std::vector< Header > headers
Definition: LHERunInfo.h:159
comments_const_iterator comments_begin() const

◆ ~LHERunInfo()

lhef::LHERunInfo::~LHERunInfo ( )

Definition at line 91 of file LHERunInfo.cc.

91 {}

Member Function Documentation

◆ addComment()

void lhef::LHERunInfo::addComment ( const std::string &  line)
inline

Definition at line 62 of file LHERunInfo.h.

References comments, and mps_splice::line.

62 { comments.push_back(line); }
std::vector< std::string > comments
Definition: LHERunInfo.h:160

◆ addHeader()

void lhef::LHERunInfo::addHeader ( const Header header)
inline

Definition at line 61 of file LHERunInfo.h.

References RecoTauValidation_cfi::header, and headers.

Referenced by lhef::LHEReader::next().

61 { headers.push_back(header); }
std::vector< Header > headers
Definition: LHERunInfo.h:159

◆ count()

void lhef::LHERunInfo::count ( int  process,
CountMode  count,
double  eventWeight = 1.0,
double  brWeight = 1.0,
double  matchWeight = 1.0 
)

Definition at line 119 of file LHERunInfo.cc.

References kAccepted, kKilled, kSelected, kTried, pfDeepBoostedJetPreprocessParams_cfi::lower_bound, ALCARECOPromptCalibProdSiPixelAli0T_cff::mode, ValidateTausOnZEEFastSim_cff::proc, LaserDQM_cfg::process, processes, and processesLumi.

119  {
120  std::vector<Process>::iterator proc = std::lower_bound(processes.begin(), processes.end(), process);
121  if (proc == processes.end() || proc->process() != process)
122  return;
123 
124  std::vector<Process>::iterator procLumi = std::lower_bound(processesLumi.begin(), processesLumi.end(), process);
125  if (procLumi == processesLumi.end() || procLumi->process() != process)
126  return;
127 
128  switch (mode) {
129  case kAccepted:
130  proc->addAcceptedBr(eventWeight * brWeight * matchWeight);
131  proc->addAccepted(eventWeight * matchWeight);
132  procLumi->addAcceptedBr(eventWeight * brWeight * matchWeight);
133  procLumi->addAccepted(eventWeight * matchWeight);
134  [[fallthrough]];
135  case kKilled:
136  proc->addKilled(eventWeight * matchWeight);
137  procLumi->addKilled(eventWeight * matchWeight);
138  if (eventWeight > 0) {
139  proc->addNPassPos();
140  procLumi->addNPassPos();
141  } else {
142  proc->addNPassNeg();
143  procLumi->addNPassNeg();
144  }
145  [[fallthrough]];
146  case kSelected:
147  proc->addSelected(eventWeight);
148  procLumi->addSelected(eventWeight);
149  if (eventWeight > 0) {
150  proc->addNTotalPos();
151  procLumi->addNTotalPos();
152  } else {
153  proc->addNTotalNeg();
154  procLumi->addNTotalNeg();
155  }
156  [[fallthrough]];
157  case kTried:
158  proc->addTried(eventWeight);
159  procLumi->addTried(eventWeight);
160  }
161  }
std::vector< Process > processes
Definition: LHERunInfo.h:158
std::vector< Process > processesLumi
Definition: LHERunInfo.h:168

◆ findHeader()

std::vector< std::string > lhef::LHERunInfo::findHeader ( const std::string &  tag) const

Definition at line 434 of file LHERunInfo.cc.

References lhef::domToLines(), RecoTauValidation_cfi::header, headers, and makeGlobalPositionRcd_cfg::tag.

Referenced by gen::Pythia6Hadronizer::initializeForExternalPartons().

434  {
435  const LHERunInfo::Header *header = nullptr;
436  for (std::vector<Header>::const_iterator iter = headers.begin(); iter != headers.end(); ++iter) {
437  if (iter->tag() == tag)
438  return std::vector<std::string>(iter->begin(), iter->end());
439  if (iter->tag() == "header")
440  header = &*iter;
441  }
442 
443  if (!header)
444  return std::vector<std::string>();
445 
446  const DOMNode *root = header->getXMLNode();
447  if (!root)
448  return std::vector<std::string>();
449 
450  for (const DOMNode *iter = root->getFirstChild(); iter; iter = iter->getNextSibling()) {
451  if (iter->getNodeType() != DOMNode::ELEMENT_NODE)
452  continue;
453  if (tag == (const char *)XMLSimpleStr(iter->getNodeName()))
454  return domToLines(iter);
455  }
456 
457  return std::vector<std::string>();
458  }
static std::vector< std::string > domToLines(const DOMNode *node)
Definition: LHERunInfo.cc:416
std::vector< Header > headers
Definition: LHERunInfo.h:159

◆ getComments()

const std::vector<std::string>& lhef::LHERunInfo::getComments ( ) const
inline

Definition at line 57 of file LHERunInfo.h.

References comments.

Referenced by LH5Source::fillRunInfoProduct(), and LHESource::fillRunInfoProduct().

57 { return comments; }
std::vector< std::string > comments
Definition: LHERunInfo.h:160

◆ getHeaders()

const std::vector<Header>& lhef::LHERunInfo::getHeaders ( ) const
inline

Definition at line 56 of file LHERunInfo.h.

References headers.

Referenced by LH5Source::fillRunInfoProduct(), and LHESource::fillRunInfoProduct().

56 { return headers; }
std::vector< Header > headers
Definition: LHERunInfo.h:159

◆ getHEPIDWTUP()

const int lhef::LHERunInfo::getHEPIDWTUP ( ) const
inline

Definition at line 164 of file LHERunInfo.h.

References heprup, and lhef::HEPRUP::IDWTUP.

164 { return heprup.IDWTUP; }

◆ getHEPRUP()

const HEPRUP* lhef::LHERunInfo::getHEPRUP ( ) const
inline

◆ getLumiProcesses()

const std::vector<Process>& lhef::LHERunInfo::getLumiProcesses ( ) const
inline

◆ init()

void lhef::LHERunInfo::init ( void  )
private

Definition at line 93 of file LHERunInfo.cc.

References heprup, mps_fire::i, lhef::HEPRUP::LPRUP, lhef::HEPRUP::NPRUP, ValidateTausOnZEEFastSim_cff::proc, processes, and jetUpdater_cfi::sort.

Referenced by LHERunInfo().

93  {
94  for (int i = 0; i < heprup.NPRUP; i++) {
95  Process proc;
96  proc.setProcess(heprup.LPRUP[i]);
97  proc.setHepRupIndex((unsigned int)i);
98  processes.push_back(proc);
99  }
100 
101  std::sort(processes.begin(), processes.end());
102  }
std::vector< Process > processes
Definition: LHERunInfo.h:158
std::vector< int > LPRUP
Definition: LesHouches.h:128

◆ initLumi()

void lhef::LHERunInfo::initLumi ( )

◆ operator!=()

bool lhef::LHERunInfo::operator!= ( const LHERunInfo other) const
inline

Definition at line 54 of file LHERunInfo.h.

References trackingPlots::other.

54 { return !(*this == other); }

◆ operator==()

bool lhef::LHERunInfo::operator== ( const LHERunInfo other) const

Definition at line 117 of file LHERunInfo.cc.

References heprup, and trackingPlots::other.

117 { return heprup == other.heprup; }

◆ pdfSetTranslation()

std::pair< int, int > lhef::LHERunInfo::pdfSetTranslation ( ) const

Definition at line 527 of file LHERunInfo.cc.

References heprup, lhef::HEPRUP::PDFGUP, and lhef::HEPRUP::PDFSUP.

527  {
528  int pdfA = -1, pdfB = -1;
529 
530  if (heprup.PDFGUP.first >= 0) {
531  pdfA = heprup.PDFSUP.first;
532  }
533 
534  if (heprup.PDFGUP.second >= 0) {
535  pdfB = heprup.PDFSUP.second;
536  }
537 
538  return std::make_pair(pdfA, pdfB);
539  }
std::pair< int, int > PDFGUP
Definition: LesHouches.h:88
std::pair< int, int > PDFSUP
Definition: LesHouches.h:94

◆ statistics()

void lhef::LHERunInfo::statistics ( ) const

Definition at line 252 of file LHERunInfo.cc.

References bTagMiniDQMDeepCSV::denominator, alignBH_cfg::fixed, heprup, lhef::HEPRUP::IDWTUP, heavyIonCSV_trainingSettings::idx, LogDebug, groupFilesInBlocks::ntotal, bTagMiniDQMDeepCSV::numerator, funct::pow(), ValidateTausOnZEEFastSim_cff::proc, processes, mathSSE::sqrt(), lhef::HEPRUP::XERRUP, and lhef::HEPRUP::XSECUP.

Referenced by edm::HadronizerFilter< HAD, DEC >::endRunProduce(), and edm::ConcurrentHadronizerFilter< HAD, DEC >::streamEndRun().

252  {
253  double sigSelSum = 0.0;
254  double sigSum = 0.0;
255  double sigBrSum = 0.0;
256  double errSel2Sum = 0.0;
257  double err2Sum = 0.0;
258  double errBr2Sum = 0.0;
259  double errMatch2Sum = 0.0;
260  unsigned long nAccepted = 0;
261  unsigned long nTried = 0;
262  unsigned long nAccepted_pos = 0;
263  unsigned long nTried_pos = 0;
264  unsigned long nAccepted_neg = 0;
265  unsigned long nTried_neg = 0;
266  int idwtup = heprup.IDWTUP;
267 
268  LogDebug("LHERunInfo") << " statistics";
269  LogDebug("LHERunInfo") << "Process and cross-section statistics";
270  LogDebug("LHERunInfo") << "------------------------------------";
271  LogDebug("LHERunInfo") << "Process\t\txsec_before [pb]\t\tpassed\tnposw\tnnegw\ttried\tnposw\tnnegw \txsec_match "
272  "[pb]\t\t\taccepted [%]\t event_eff [%]";
273 
274  for (std::vector<Process>::const_iterator proc = processes.begin(); proc != processes.end(); ++proc) {
275  unsigned int idx = proc->heprupIndex();
276 
277  if (!proc->selected().n()) {
278  LogDebug("LHERunInfo") << proc->process() << "\t0\t0\tn/a\t\t\tn/a";
279  continue;
280  }
281 
282  double sigma2Sum, sigma2Err;
283  sigma2Sum = heprup.XSECUP[idx] * heprup.XSECUP[idx];
284  sigma2Err = heprup.XERRUP[idx] * heprup.XERRUP[idx];
285 
286  double sigmaAvg = heprup.XSECUP[idx];
287 
288  double fracAcc = 0;
289  double ntotal = proc->nTotalPos() - proc->nTotalNeg();
290  double npass = proc->nPassPos() - proc->nPassNeg();
291  switch (idwtup) {
292  case 3:
293  case -3:
294  fracAcc = ntotal > 0 ? npass / ntotal : -1;
295  break;
296  default:
297  fracAcc = proc->selected().sum() > 0 ? proc->killed().sum() / proc->selected().sum() : -1;
298  break;
299  }
300 
301  double fracBr = proc->accepted().sum() > 0.0 ? proc->acceptedBr().sum() / proc->accepted().sum() : 1;
302  double sigmaFin = fracAcc > 0 ? sigmaAvg * fracAcc : 0;
303  double sigmaFinBr = sigmaFin * fracBr;
304 
305  double relErr = 1.0;
306  double relAccErr = 1.0;
307  double efferr2 = 0;
308 
309  if (proc->killed().n() > 0 && fracAcc > 0) {
310  switch (idwtup) {
311  case 3:
312  case -3: {
313  double ntotal_pos = proc->nTotalPos();
314  double effp = ntotal_pos > 0 ? (double)proc->nPassPos() / ntotal_pos : 0;
315  double effp_err2 = ntotal_pos > 0 ? (1 - effp) * effp / ntotal_pos : 0;
316 
317  double ntotal_neg = proc->nTotalNeg();
318  double effn = ntotal_neg > 0 ? (double)proc->nPassNeg() / ntotal_neg : 0;
319  double effn_err2 = ntotal_neg > 0 ? (1 - effn) * effn / ntotal_neg : 0;
320 
321  efferr2 = ntotal > 0 ? (ntotal_pos * ntotal_pos * effp_err2 + ntotal_neg * ntotal_neg * effn_err2) /
322  ntotal / ntotal
323  : 0;
324  break;
325  }
326  default: {
327  double denominator = pow(proc->selected().sum(), 4);
328  double passw = proc->killed().sum();
329  double passw2 = proc->killed().sum2();
330  double failw = proc->selected().sum() - passw;
331  double failw2 = proc->selected().sum2() - passw2;
332  double numerator = (passw2 * failw * failw + failw2 * passw * passw);
333 
334  efferr2 = denominator > 0 ? numerator / denominator : 0;
335  break;
336  }
337  }
338  double delta2Veto = efferr2 / fracAcc / fracAcc;
339  double delta2Sum = delta2Veto + sigma2Err / sigma2Sum;
340  relErr = (delta2Sum > 0.0 ? std::sqrt(delta2Sum) : 0.0);
341  relAccErr = (delta2Veto > 0.0 ? std::sqrt(delta2Veto) : 0.0);
342  }
343  double deltaFin = sigmaFin * relErr;
344  double deltaFinBr = sigmaFinBr * relErr;
345 
346  double ntotal_proc = proc->nTotalPos() + proc->nTotalNeg();
347  double event_eff_proc = ntotal_proc > 0 ? (double)(proc->nPassPos() + proc->nPassNeg()) / ntotal_proc : -1;
348  double event_eff_err_proc = ntotal_proc > 0 ? std::sqrt((1 - event_eff_proc) * event_eff_proc / ntotal_proc) : -1;
349 
350  LogDebug("LHERunInfo") << proc->process() << "\t\t" << std::scientific << std::setprecision(3)
351  << heprup.XSECUP[proc->heprupIndex()] << " +/- " << heprup.XERRUP[proc->heprupIndex()]
352  << "\t\t" << proc->accepted().n() << "\t" << proc->nPassPos() << "\t" << proc->nPassNeg()
353  << "\t" << proc->tried().n() << "\t" << proc->nTotalPos() << "\t" << proc->nTotalNeg()
354  << "\t" << std::scientific << std::setprecision(3) << sigmaFinBr << " +/- " << deltaFinBr
355  << "\t\t" << std::fixed << std::setprecision(1) << (fracAcc * 100) << " +/- "
356  << (std::sqrt(efferr2) * 100) << "\t" << std::fixed << std::setprecision(1)
357  << (event_eff_proc * 100) << " +/- " << (event_eff_err_proc * 100);
358 
359  nAccepted += proc->accepted().n();
360  nTried += proc->tried().n();
361  nAccepted_pos += proc->nPassPos();
362  nTried_pos += proc->nTotalPos();
363  nAccepted_neg += proc->nPassNeg();
364  nTried_neg += proc->nTotalNeg();
365  sigSelSum += sigmaAvg;
366  sigSum += sigmaFin;
367  sigBrSum += sigmaFinBr;
368  errSel2Sum += sigma2Err;
369  err2Sum += deltaFin * deltaFin;
370  errBr2Sum += deltaFinBr * deltaFinBr;
371  errMatch2Sum += sigmaFin * relAccErr * sigmaFin * relAccErr;
372  }
373 
374  double ntotal_all = (nTried_pos + nTried_neg);
375  double event_eff_all = ntotal_all > 0 ? (double)(nAccepted_pos + nAccepted_neg) / ntotal_all : -1;
376  double event_eff_err_all = ntotal_all > 0 ? std::sqrt((1 - event_eff_all) * event_eff_all / ntotal_all) : -1;
377 
378  LogDebug("LHERunInfo") << "Total\t\t" << std::scientific << std::setprecision(3) << sigSelSum << " +/- "
379  << std::sqrt(errSel2Sum) << "\t\t" << nAccepted << "\t" << nAccepted_pos << "\t"
380  << nAccepted_neg << "\t" << nTried << "\t" << nTried_pos << "\t" << nTried_neg << "\t"
381  << std::scientific << std::setprecision(3) << sigBrSum << " +/- " << std::sqrt(errBr2Sum)
382  << "\t\t" << std::fixed << std::setprecision(1) << (sigSum / sigSelSum * 100) << " +/- "
383  << (std::sqrt(errMatch2Sum) / sigSelSum * 100) << "\t" << std::fixed << std::setprecision(1)
384  << (event_eff_all * 100) << " +/- " << (event_eff_err_all * 100);
385  }
std::vector< Process > processes
Definition: LHERunInfo.h:158
T sqrt(T t)
Definition: SSEVec.h:19
std::vector< double > XERRUP
Definition: LesHouches.h:118
std::vector< double > XSECUP
Definition: LesHouches.h:112
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
#define LogDebug(id)

◆ xsec()

LHERunInfo::XSec lhef::LHERunInfo::xsec ( ) const

Definition at line 163 of file LHERunInfo.cc.

References bTagMiniDQMDeepCSV::denominator, heprup, lhef::HEPRUP::IDWTUP, heavyIonCSV_trainingSettings::idx, groupFilesInBlocks::ntotal, bTagMiniDQMDeepCSV::numerator, funct::pow(), ValidateTausOnZEEFastSim_cff::proc, processes, mps_fire::result, mathSSE::sqrt(), lhef::HEPRUP::XERRUP, and lhef::HEPRUP::XSECUP.

Referenced by edm::HadronizerFilter< HAD, DEC >::endRunProduce(), and edm::ConcurrentHadronizerFilter< HAD, DEC >::streamEndRun().

163  {
164  double sigSelSum = 0.0;
165  double sigSum = 0.0;
166  double sigBrSum = 0.0;
167  double err2Sum = 0.0;
168  double errBr2Sum = 0.0;
169  int idwtup = heprup.IDWTUP;
170  for (std::vector<Process>::const_iterator proc = processes.begin(); proc != processes.end(); ++proc) {
171  unsigned int idx = proc->heprupIndex();
172 
173  if (!proc->killed().n())
174  continue;
175 
176  double sigma2Sum, sigma2Err;
177  sigma2Sum = heprup.XSECUP[idx] * heprup.XSECUP[idx];
178  sigma2Err = heprup.XERRUP[idx] * heprup.XERRUP[idx];
179 
180  double sigmaAvg = heprup.XSECUP[idx];
181 
182  double fracAcc = 0;
183  double ntotal = proc->nTotalPos() - proc->nTotalNeg();
184  double npass = proc->nPassPos() - proc->nPassNeg();
185  switch (idwtup) {
186  case 3:
187  case -3:
188  fracAcc = ntotal > 0 ? npass / ntotal : -1;
189  break;
190  default:
191  fracAcc = proc->selected().sum() > 0 ? proc->killed().sum() / proc->selected().sum() : -1;
192  break;
193  }
194 
195  if (fracAcc <= 0)
196  continue;
197 
198  double fracBr = proc->accepted().sum() > 0.0 ? proc->acceptedBr().sum() / proc->accepted().sum() : 1;
199  double sigmaFin = sigmaAvg * fracAcc;
200  double sigmaFinBr = sigmaFin * fracBr;
201 
202  double relErr = 1.0;
203 
204  double efferr2 = 0;
205  switch (idwtup) {
206  case 3:
207  case -3: {
208  double ntotal_pos = proc->nTotalPos();
209  double effp = ntotal_pos > 0 ? (double)proc->nPassPos() / ntotal_pos : 0;
210  double effp_err2 = ntotal_pos > 0 ? (1 - effp) * effp / ntotal_pos : 0;
211 
212  double ntotal_neg = proc->nTotalNeg();
213  double effn = ntotal_neg > 0 ? (double)proc->nPassNeg() / ntotal_neg : 0;
214  double effn_err2 = ntotal_neg > 0 ? (1 - effn) * effn / ntotal_neg : 0;
215 
216  efferr2 = ntotal > 0
217  ? (ntotal_pos * ntotal_pos * effp_err2 + ntotal_neg * ntotal_neg * effn_err2) / ntotal / ntotal
218  : 0;
219  break;
220  }
221  default: {
222  double denominator = pow(proc->selected().sum(), 4);
223  double passw = proc->killed().sum();
224  double passw2 = proc->killed().sum2();
225  double failw = proc->selected().sum() - passw;
226  double failw2 = proc->selected().sum2() - passw2;
227  double numerator = (passw2 * failw * failw + failw2 * passw * passw);
228 
229  efferr2 = denominator > 0 ? numerator / denominator : 0;
230  break;
231  }
232  }
233  double delta2Veto = efferr2 / fracAcc / fracAcc;
234  double delta2Sum = delta2Veto + sigma2Err / sigma2Sum;
235  relErr = (delta2Sum > 0.0 ? std::sqrt(delta2Sum) : 0.0);
236 
237  double deltaFin = sigmaFin * relErr;
238  double deltaFinBr = sigmaFinBr * relErr;
239 
240  sigSelSum += sigmaAvg;
241  sigSum += sigmaFin;
242  sigBrSum += sigmaFinBr;
243  err2Sum += deltaFin * deltaFin;
244  errBr2Sum += deltaFinBr * deltaFinBr;
245  }
246 
247  XSec result(sigBrSum, std::sqrt(errBr2Sum));
248 
249  return result;
250  }
std::vector< Process > processes
Definition: LHERunInfo.h:158
T sqrt(T t)
Definition: SSEVec.h:19
std::vector< double > XERRUP
Definition: LesHouches.h:118
std::vector< double > XSECUP
Definition: LesHouches.h:112
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29

Member Data Documentation

◆ comments

std::vector<std::string> lhef::LHERunInfo::comments
private

Definition at line 160 of file LHERunInfo.h.

Referenced by addComment(), getComments(), and LHERunInfo().

◆ headers

std::vector<Header> lhef::LHERunInfo::headers
private

◆ heprup

HEPRUP lhef::LHERunInfo::heprup
private

◆ processes

std::vector<Process> lhef::LHERunInfo::processes
private

Definition at line 158 of file LHERunInfo.h.

Referenced by count(), init(), statistics(), and xsec().

◆ processesLumi

std::vector<Process> lhef::LHERunInfo::processesLumi
private

Definition at line 168 of file LHERunInfo.h.

Referenced by count(), getLumiProcesses(), and initLumi().