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 > 0? npass/ntotal: -1;
228 fracAcc =
proc->selected().sum() > 0?
proc->killed().sum() /
proc->selected().sum():-1;
232 if(fracAcc<=0)
continue;
234 double fracBr =
proc->accepted().sum() > 0.0 ?
235 proc->acceptedBr().sum() /
proc->accepted().sum() : 1;
236 double sigmaFin = sigmaAvg * fracAcc ;
237 double sigmaFinBr = sigmaFin * fracBr;
245 double ntotal_pos =
proc->nTotalPos();
246 double effp = ntotal_pos > 0?
247 (double)
proc->nPassPos()/ntotal_pos:0;
248 double effp_err2 = ntotal_pos > 0?
249 (1-effp)*effp/ntotal_pos: 0;
251 double ntotal_neg =
proc->nTotalNeg();
252 double effn = ntotal_neg > 0?
253 (double)
proc->nPassNeg()/ntotal_neg:0;
254 double effn_err2 = ntotal_neg > 0?
255 (1-effn)*effn/ntotal_neg: 0;
257 efferr2 = ntotal > 0 ?
258 (ntotal_pos*ntotal_pos*effp_err2 +
259 ntotal_neg*ntotal_neg*effn_err2)/ntotal/ntotal:0;
265 double passw =
proc->killed().sum();
266 double passw2 =
proc->killed().sum2();
267 double failw =
proc->selected().sum() - passw;
268 double failw2 =
proc->selected().sum2() - passw2;
269 double numerator = (passw2*failw*failw + failw2*passw*passw);
271 efferr2 = denominator > 0?
272 numerator/denominator:0;
276 double delta2Veto = efferr2/fracAcc/fracAcc;
277 double delta2Sum = delta2Veto
278 + sigma2Err / sigma2Sum;
279 relErr = (delta2Sum > 0.0 ?
282 double deltaFin = sigmaFin * relErr;
283 double deltaFinBr = sigmaFinBr * relErr;
285 sigSelSum += sigmaAvg;
287 sigBrSum += sigmaFinBr;
288 err2Sum += deltaFin * deltaFin;
289 errBr2Sum += deltaFinBr * deltaFinBr;
299 double sigSelSum = 0.0;
301 double sigBrSum = 0.0;
302 double errSel2Sum = 0.0;
303 double err2Sum = 0.0;
304 double errBr2Sum = 0.0;
305 double errMatch2Sum = 0.0;
306 unsigned long nAccepted = 0;
307 unsigned long nTried = 0;
308 unsigned long nAccepted_pos = 0;
309 unsigned long nTried_pos = 0;
310 unsigned long nAccepted_neg = 0;
311 unsigned long nTried_neg = 0;
315 std::cout <<
"Process and cross-section statistics" << std::endl;
316 std::cout <<
"------------------------------------" << std::endl;
317 std::cout <<
"Process\t\txsec_before [pb]\t\tpassed\tnposw\tnnegw\ttried\tnposw\tnnegw \txsec_match [pb]\t\t\taccepted [%]\t event_eff [%]"
320 for(std::vector<Process>::const_iterator
proc =
processes.begin();
322 unsigned int idx =
proc->heprupIndex();
324 if (!
proc->selected().n()) {
330 double sigma2Sum, sigma2Err;
338 double npass =
proc->nPassPos() -
proc->nPassNeg();
341 fracAcc = ntotal > 0? npass/ntotal: -1;
344 fracAcc =
proc->selected().sum() > 0?
proc->killed().sum() /
proc->selected().sum():-1;
349 double fracBr =
proc->accepted().sum() > 0.0 ?
350 proc->acceptedBr().sum() /
proc->accepted().sum() : 1;
351 double sigmaFin = fracAcc >0? sigmaAvg * fracAcc : 0;
352 double sigmaFinBr = sigmaFin * fracBr;
355 double relAccErr = 1.0;
358 if (
proc->killed().n() > 0 && fracAcc > 0) {
362 double ntotal_pos =
proc->nTotalPos();
363 double effp = ntotal_pos > 0?
364 (double)
proc->nPassPos()/ntotal_pos:0;
365 double effp_err2 = ntotal_pos > 0?
366 (1-effp)*effp/ntotal_pos: 0;
368 double ntotal_neg =
proc->nTotalNeg();
369 double effn = ntotal_neg > 0?
370 (double)
proc->nPassNeg()/ntotal_neg:0;
371 double effn_err2 = ntotal_neg > 0?
372 (1-effn)*effn/ntotal_neg: 0;
374 efferr2 = ntotal > 0 ?
375 (ntotal_pos*ntotal_pos*effp_err2 +
376 ntotal_neg*ntotal_neg*effn_err2)/ntotal/ntotal:0;
382 double passw =
proc->killed().sum();
383 double passw2 =
proc->killed().sum2();
384 double failw =
proc->selected().sum() - passw;
385 double failw2 =
proc->selected().sum2() - passw2;
386 double numerator = (passw2*failw*failw + failw2*passw*passw);
388 efferr2 = denominator>0?
389 numerator/denominator:0;
393 double delta2Veto = efferr2/fracAcc/fracAcc;
394 double delta2Sum = delta2Veto
395 + sigma2Err / sigma2Sum;
396 relErr = (delta2Sum > 0.0 ?
398 relAccErr = (delta2Veto > 0.0 ?
401 double deltaFin = sigmaFin * relErr;
402 double deltaFinBr = sigmaFinBr * relErr;
404 double ntotal_proc =
proc->nTotalPos()+
proc->nTotalNeg();
405 double event_eff_proc = ntotal_proc>0? (double)(
proc->nPassPos()+
proc->nPassNeg())/ntotal_proc: -1;
406 double event_eff_err_proc = ntotal_proc>0?
std::sqrt((1-event_eff_proc)*event_eff_proc/ntotal_proc): -1;
409 << std::scientific << std::setprecision(3)
412 <<
proc->accepted().n() <<
"\t"
413 <<
proc->nPassPos() <<
"\t"
414 <<
proc->nPassNeg() <<
"\t"
415 <<
proc->tried().n() <<
"\t"
416 <<
proc->nTotalPos() <<
"\t"
417 <<
proc->nTotalNeg() <<
"\t"
418 << std::scientific << std::setprecision(3)
419 << sigmaFinBr <<
" +/- "
420 << deltaFinBr <<
"\t\t"
421 << std::fixed << std::setprecision(1)
422 << (fracAcc * 100) <<
" +/- " << ( std::sqrt(efferr2) * 100) <<
"\t"
423 << std::fixed << std::setprecision(1)
424 << (event_eff_proc * 100) <<
" +/- " << ( event_eff_err_proc * 100)
427 nAccepted +=
proc->accepted().n();
428 nTried +=
proc->tried().n();
429 nAccepted_pos +=
proc->nPassPos();
430 nTried_pos +=
proc->nTotalPos();
431 nAccepted_neg +=
proc->nPassNeg();
432 nTried_neg +=
proc->nTotalNeg();
433 sigSelSum += sigmaAvg;
435 sigBrSum += sigmaFinBr;
436 errSel2Sum += sigma2Err;
437 err2Sum += deltaFin * deltaFin;
438 errBr2Sum += deltaFinBr * deltaFinBr;
439 errMatch2Sum += sigmaFin*relAccErr*sigmaFin*relAccErr;
442 double ntotal_all = (nTried_pos+nTried_neg);
443 double event_eff_all = ntotal_all>0? (double)(nAccepted_pos+nAccepted_neg)/ntotal_all: -1;
444 double event_eff_err_all = ntotal_all>0?
std::sqrt((1-event_eff_all)*event_eff_all/ntotal_all): -1;
447 << std::scientific << std::setprecision(3)
448 << sigSelSum <<
" +/- " <<
std::sqrt(errSel2Sum) <<
"\t\t"
450 << nAccepted_pos <<
"\t"
451 << nAccepted_neg <<
"\t"
453 << nTried_pos <<
"\t"
454 << nTried_neg <<
"\t"
455 << std::scientific << std::setprecision(3)
456 << sigBrSum <<
" +/- "
458 << std::fixed << std::setprecision(1)
459 << (sigSum / sigSelSum * 100) <<
" +/- " << (std::sqrt(errMatch2Sum)/sigSelSum * 100) <<
"\t"
460 << std::fixed << std::setprecision(1)
461 << (event_eff_all * 100) <<
" +/- " << (event_eff_err_all * 100)
494 const char *
end = len >= 0 ? (data + len) : 0;
495 while(*data && (!end || data < end)) {
496 std::size_t len = std::strcspn(data,
"\r\n");
497 if (end && data + len > end)
499 if (data[len] ==
'\r' && data[len + 1] ==
'\n')
510 std::vector<std::string>
result;
511 DOMImplementation *impl =
512 DOMImplementationRegistry::getDOMImplementation(
514 std::auto_ptr<DOMWriter> writer(
515 static_cast<DOMImplementationLS*>(impl)->createDOMWriter());
520 const char *
p = std::strchr((
const char*)buffer,
'>') + 1;
521 const char *
q = std::strrchr(p,
'<');
530 for(std::vector<Header>::const_iterator iter =
headers.begin();
531 iter !=
headers.end(); ++iter) {
532 if (iter->tag() ==
tag)
533 return std::vector<std::string>(iter->begin(),
535 if (iter->tag() ==
"header")
540 return std::vector<std::string>();
542 const DOMNode *
root = header->getXMLNode();
544 return std::vector<std::string>();
546 for(
const DOMNode *iter = root->getFirstChild();
547 iter; iter = iter->getNextSibling()) {
548 if (iter->getNodeType() != DOMNode::ELEMENT_NODE)
550 if (tag == (
const char*)
XMLSimpleStr(iter->getNodeName()))
554 return std::vector<std::string>();
561 header(header),
mode(kHeader),
562 iter(header->
begin())
570 tmp =
"<" + header->tag() +
">";
574 if (iter != header->end())
576 tmp =
"</" + header->tag() +
">";
593 const LHERunInfo::Header *header;
600 const DOMNode *LHERunInfo::Header::getXMLNode()
const
607 parser.setValidationScheme(XercesDOMParser::Val_Auto);
608 parser.setDoNamespaces(
false);
609 parser.setDoSchema(
false);
610 parser.setValidationSchemaFullChecking(
false);
612 HandlerBase errHandler;
613 parser.setErrorHandler(&errHandler);
614 parser.setCreateEntityReferenceNodes(
false);
617 std::auto_ptr<CBInputStream::Reader>
reader(
618 new HeaderReader(
this));
621 xmlDoc = parser.adoptDocument();
622 }
catch(
const XMLException &
e) {
624 <<
"XML parser reported DOM error no. "
625 << (
unsigned long)e.getCode()
628 }
catch(
const SAXException &e) {
630 <<
"XML parser reported: "
636 return xmlDoc->getDocumentElement();
641 int pdfA = -1, pdfB = -1;
651 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
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