11 #include <boost/bind.hpp>
13 #include <xercesc/dom/DOM.hpp>
14 #include <xercesc/parsers/XercesDOMParser.hpp>
15 #include <xercesc/sax/HandlerBase.hpp>
26 XERCES_CPP_NAMESPACE_USE
33 }
while(std::isspace(ch));
34 if (ch != std::istream::traits_type::eof())
50 <<
"Les Houches file contained invalid"
51 " header in init section." << std::endl;
60 <<
"Les Houches file contained invalid data"
61 " in header payload line " << (
i + 1)
67 std::getline(in, line);
73 <<
"Les Houches file contained spurious"
74 " content after the regular data (this is normal for LHEv3 files for now)." << std::endl;
86 const std::vector<LHERunInfoProduct::Header> &
headers,
87 const std::vector<std::string> &
comments) :
91 std::back_inserter(this->headers));
92 std::copy(comments.begin(), comments.end(),
93 std::back_inserter(this->comments));
99 heprup(product.heprup())
148 double brWeight,
double matchWeight)
150 std::vector<Process>::iterator
proc =
155 std::vector<Process>::iterator procLumi =
162 proc->addAcceptedBr(eventWeight * brWeight * matchWeight);
163 proc->addAccepted(eventWeight * matchWeight);
164 procLumi->addAcceptedBr(eventWeight * brWeight * matchWeight);
165 procLumi->addAccepted(eventWeight * matchWeight);
167 proc->addKilled(eventWeight * matchWeight);
168 procLumi->addKilled(eventWeight * matchWeight);
172 procLumi->addNPassPos();
177 procLumi->addNPassNeg();
180 proc->addSelected(eventWeight);
181 procLumi->addSelected(eventWeight);
184 proc->addNTotalPos();
185 procLumi->addNTotalPos();
189 proc->addNTotalNeg();
190 procLumi->addNTotalNeg();
193 proc->addTried(eventWeight);
194 procLumi->addTried(eventWeight);
201 double sigSelSum = 0.0;
203 double sigBrSum = 0.0;
204 double err2Sum = 0.0;
205 double errBr2Sum = 0.0;
207 for(std::vector<Process>::const_iterator
proc =
processes.begin();
209 unsigned int idx =
proc->heprupIndex();
211 if (!
proc->killed().n())
214 double sigma2Sum, sigma2Err;
222 double npass =
proc->nPassPos() -
proc->nPassNeg();
225 fracAcc = ntotal > 1
e-6? npass/ntotal: -1;
228 fracAcc =
proc->selected().sum() > 1
e-6?
proc->killed().sum() /
proc->selected().sum():-1;
232 if(fracAcc<1
e-6)
continue;
234 double fracBr =
proc->accepted().sum() > 0.0 ?
235 proc->acceptedBr().sum() /
proc->accepted().sum() : 1;
236 double sigmaFin = sigmaAvg * fracAcc * fracBr;
237 double sigmaFinBr = sigmaFin * fracBr;
240 if (
proc->killed().n() > 1) {
246 double ntotal_pos =
proc->nTotalPos();
247 double effp = ntotal_pos > 1
e-6?
248 (double)
proc->nPassPos()/ntotal_pos:0;
249 double effp_err2 = ntotal_pos > 1
e-6?
250 (1-effp)*effp/ntotal_pos: 0;
252 double ntotal_neg =
proc->nTotalNeg();
253 double effn = ntotal_neg > 1
e-6?
254 (double)
proc->nPassNeg()/ntotal_neg:0;
255 double effn_err2 = ntotal_neg > 1
e-6?
256 (1-effn)*effn/ntotal_neg: 0;
258 efferr2 = ntotal > 0 ?
259 (ntotal_pos*ntotal_pos*effp_err2 +
260 ntotal_neg*ntotal_neg*effn_err2)/ntotal/ntotal:0;
266 double passw =
proc->killed().sum();
267 double passw2 =
proc->killed().sum2();
268 double failw =
proc->selected().sum() - passw;
269 double failw2 =
proc->selected().sum2() - passw2;
270 double numerator = (passw2*failw*failw + failw2*passw*passw);
272 efferr2 = denominator>1
e-6?
273 numerator/denominator:0;
277 double delta2Veto = efferr2/fracAcc/fracAcc;
278 double delta2Sum = delta2Veto
279 + sigma2Err / sigma2Sum;
280 relErr = (delta2Sum > 0.0 ?
283 double deltaFin = sigmaFin * relErr;
284 double deltaFinBr = sigmaFinBr * relErr;
286 sigSelSum += sigmaAvg;
288 sigBrSum += sigmaFinBr;
289 err2Sum += deltaFin * deltaFin;
290 errBr2Sum += deltaFinBr * deltaFinBr;
300 double sigSelSum = 0.0;
302 double sigBrSum = 0.0;
303 double err2Sum = 0.0;
304 double errBr2Sum = 0.0;
305 unsigned long nAccepted = 0;
306 unsigned long nTried = 0;
310 std::cout <<
"Process and cross-section statistics" << std::endl;
311 std::cout <<
"------------------------------------" << std::endl;
312 std::cout <<
"Process\tevents\ttried\txsec [pb]\t\taccepted [%]"
315 for(std::vector<Process>::const_iterator
proc =
processes.begin();
317 unsigned int idx =
proc->heprupIndex();
319 if (!
proc->selected().n()) {
325 double sigma2Sum, sigma2Err;
333 double npass =
proc->nPassPos() -
proc->nPassNeg();
336 fracAcc = ntotal > 1
e-6? npass/ntotal: -1;
339 fracAcc =
proc->selected().sum() > 1
e-6?
proc->killed().sum() /
proc->selected().sum():-1;
343 if(fracAcc<1
e-6)
continue;
345 double fracBr =
proc->accepted().sum() > 0.0 ?
346 proc->acceptedBr().sum() /
proc->accepted().sum() : 1;
347 double sigmaFin = sigmaAvg * fracAcc;
348 double sigmaFinBr = sigmaFin * fracBr;
351 if (
proc->killed().n() > 1) {
356 double ntotal_pos =
proc->nTotalPos();
357 double effp = ntotal_pos > 1
e-6?
358 (double)
proc->nPassPos()/ntotal_pos:0;
359 double effp_err2 = ntotal_pos > 1
e-6?
360 (1-effp)*effp/ntotal_pos: 0;
362 double ntotal_neg =
proc->nTotalNeg();
363 double effn = ntotal_neg > 1
e-6?
364 (double)
proc->nPassNeg()/ntotal_neg:0;
365 double effn_err2 = ntotal_neg > 1
e-6?
366 (1-effn)*effn/ntotal_neg: 0;
368 efferr2 = ntotal > 0 ?
369 (ntotal_pos*ntotal_pos*effp_err2 +
370 ntotal_neg*ntotal_neg*effn_err2)/ntotal/ntotal:0;
376 double passw =
proc->killed().sum();
377 double passw2 =
proc->killed().sum2();
378 double failw =
proc->selected().sum() - passw;
379 double failw2 =
proc->selected().sum2() - passw2;
380 double numerator = (passw2*failw*failw + failw2*passw*passw);
382 efferr2 = denominator>1
e-6?
383 numerator/denominator:0;
387 double delta2Veto = efferr2/fracAcc/fracAcc;
388 double delta2Sum = delta2Veto
389 + sigma2Err / sigma2Sum;
390 relErr = (delta2Sum > 0.0 ?
393 double deltaFin = sigmaFin * relErr;
394 double deltaFinBr = sigmaFinBr * relErr;
397 <<
proc->accepted().n() <<
"\t"
398 <<
proc->tried().n() <<
"\t"
399 << std::scientific << std::setprecision(3)
400 << sigmaFinBr <<
" +/- "
401 << deltaFinBr <<
"\t"
402 << std::fixed << std::setprecision(1)
403 << (fracAcc * 100) << std::endl;
405 nAccepted +=
proc->accepted().n();
406 nTried +=
proc->tried().n();
407 sigSelSum += sigmaAvg;
409 sigBrSum += sigmaFinBr;
410 err2Sum += deltaFin * deltaFin;
411 errBr2Sum += deltaFinBr * deltaFinBr;
417 << std::scientific << std::setprecision(3)
418 << sigBrSum <<
" +/- "
420 << std::fixed << std::setprecision(1)
421 << (sigSum / sigSelSum * 100) << std::endl;
453 const char *
end = len >= 0 ? (data + len) : 0;
454 while(*data && (!end || data < end)) {
455 std::size_t len = std::strcspn(data,
"\r\n");
456 if (end && data + len > end)
458 if (data[len] ==
'\r' && data[len + 1] ==
'\n')
469 std::vector<std::string>
result;
470 DOMImplementation *impl =
471 DOMImplementationRegistry::getDOMImplementation(
473 std::auto_ptr<DOMWriter> writer(
474 static_cast<DOMImplementationLS*>(impl)->createDOMWriter());
479 const char *
p = std::strchr((
const char*)buffer,
'>') + 1;
480 const char *
q = std::strrchr(p,
'<');
489 for(std::vector<Header>::const_iterator
iter =
headers.begin();
492 return std::vector<std::string>(
iter->begin(),
494 if (
iter->tag() ==
"header")
499 return std::vector<std::string>();
501 const DOMNode *
root = header->getXMLNode();
503 return std::vector<std::string>();
505 for(
const DOMNode *
iter = root->getFirstChild();
507 if (
iter->getNodeType() != DOMNode::ELEMENT_NODE)
513 return std::vector<std::string>();
520 header(header),
mode(kHeader),
529 tmp =
"<" + header->tag() +
">";
533 if (
iter != header->end())
535 tmp =
"</" + header->tag() +
">";
552 const LHERunInfo::Header *header;
559 const DOMNode *LHERunInfo::Header::getXMLNode()
const
566 parser.setValidationScheme(XercesDOMParser::Val_Auto);
567 parser.setDoNamespaces(
false);
568 parser.setDoSchema(
false);
569 parser.setValidationSchemaFullChecking(
false);
571 HandlerBase errHandler;
572 parser.setErrorHandler(&errHandler);
573 parser.setCreateEntityReferenceNodes(
false);
576 std::auto_ptr<CBInputStream::Reader>
reader(
577 new HeaderReader(
this));
580 xmlDoc = parser.adoptDocument();
581 }
catch(
const XMLException &
e) {
583 <<
"XML parser reported DOM error no. "
584 << (
unsigned long)e.getCode()
587 }
catch(
const SAXException &e) {
589 <<
"XML parser reported: "
595 return xmlDoc->getDocumentElement();
600 int pdfA = -1, pdfB = -1;
610 return std::make_pair(pdfA, pdfB);
static XERCES_CPP_NAMESPACE_USE int skipWhitespace(std::istream &in)
const bool operator<(const LHERunInfo::Process &lhs, const LHERunInfo::Process &rhs)
void setLHEXSec(double value, double error)
TrainProcessor *const proc
XMLInputSourceWrapper< CBInputStream > CBInputSource
std::pair< double, double > EBMUP
comments_const_iterator comments_end() const
static std::vector< std::string > domToLines(const DOMNode *node)
headers_const_iterator headers_end() const
std::pair< int, int > IDBMUP
std::vector< Process > processes
std::pair< int, int > PDFGUP
headers_const_iterator headers_begin() const
Abs< T >::type abs(const T &t)
LHERunInfo(std::istream &in)
std::vector< double > XERRUP
std::vector< double > XMAXUP
void setHepRupIndex(int id)
tuple idx
DEBUGGING if hasattr(process,"trackMonIterativeTracking2012"): print "trackMonIterativeTracking2012 D...
comments_const_iterator comments_begin() const
std::vector< Process > processesLumi
std::pair< int, int > pdfSetTranslation() const
std::pair< int, int > PDFSUP
std::vector< std::string > comments
std::vector< std::vector< double > > tmp
char data[epos_bytes_allocation]
std::vector< Header > headers
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
bool operator==(const LHERunInfo &other) const
std::vector< double > XSECUP
static void fillLines(std::vector< std::string > &lines, const char *data, int len=-1)
static std::string const source
Power< A, B >::type pow(const A &a, const B &b)
string root
initialization