11 #include <boost/bind.hpp> 13 #include <xercesc/sax2/Attributes.hpp> 14 #include <xercesc/dom/DOM.hpp> 31 #include "boost/lexical_cast.hpp" 60 <<
"Could not open LHE file \"" 61 << fileURL <<
"\" for reading" 82 <<
"Empty LHE file string name \"" 85 std::stringstream * tmpis =
new std::stringstream(inputs);
86 fileStream.reset(tmpis);
100 typedef std::vector<std::pair<std::string,std::string> >
wgt_info;
106 {
if (xmlHeader) xmlHeader->release();
107 if (xmlEvent) xmlEvent->release(); }
119 weightsinevent.clear();
127 void startElement(
const XMLCh *
const uri,
128 const XMLCh *
const localname,
129 const XMLCh *
const qname,
130 const Attributes &attributes)
override;
132 void endElement(
const XMLCh *
const uri,
133 const XMLCh *
const localname,
134 const XMLCh *
const qname)
override;
136 void characters (
const XMLCh *
const chars,
const XMLSize_t length)
override;
137 void comment (
const XMLCh *
const chars,
const XMLSize_t length)
override;
142 bool skipEvent =
false;
143 std::unique_ptr<DOMImplementation>
impl;
161 for(
unsigned int i = 0;
i < attributes.getLength();
i++) {
162 const XMLCh *
name = attributes.getQName(
i);
163 const XMLCh *
value = attributes.getValue(
i);
165 dom->setAttribute(name, value);
172 const char *
end = len >= 0 ? (data + len) :
nullptr;
173 while(*data && (!end || data < end)) {
174 std::size_t len = std::strcspn(data,
"\r\n");
175 if (end && data + len > end)
177 if (data[len] ==
'\r' && data[len + 1] ==
'\n')
187 const XMLCh *
const localname,
188 const XMLCh *
const qname,
189 const Attributes &attributes)
194 if (name !=
"LesHouchesEvents")
196 <<
"LHE file has invalid header" << std::endl;
201 if (
mode == kHeader) {
202 DOMElement *
elem = xmlHeader->createElement(qname);
204 xmlNodes.back()->appendChild(elem);
205 xmlNodes.push_back(elem);
207 }
else if (
mode == kEvent ) {
209 if (skipEvent) {
return;}
211 DOMElement *
elem = xmlEvent->createElement(qname);
215 if( name ==
"rwgt" ) {
216 xmlEventNodes[0]->appendChild(elem);
217 }
else if (name ==
"wgt") {
218 xmlEventNodes[1]->appendChild(elem);
220 else if (name ==
"scales") {
221 for (XMLSize_t iscale=0; iscale<attributes.getLength(); ++iscale) {
223 const char *scalename =
XMLSimpleStr(attributes.getQName(iscale));
224 int nmatch = sscanf(scalename,
"pt_clust_%d",&ipart);
228 <<
"invalid attribute in <scales> tag" 233 const char *scalevalstr =
XMLSimpleStr(attributes.getValue(iscale));
234 sscanf(scalevalstr,
"%e",&scaleval);
236 scales.push_back(scaleval);
238 }
else if( name ==
"event_num" ) {
239 const char *evtnumstr =
XMLSimpleStr(attributes.getValue(XMLString::transcode(
"num")));
240 sscanf(evtnumstr,
"%d",&evtnum);
243 xmlEventNodes.push_back(elem);
245 }
else if (
mode == kInit) {
250 <<
"LHE file has invalid format" << std::endl;
253 if (name ==
"header") {
255 impl.reset(DOMImplementationRegistry::getDOMImplementation(
XMLUniStr(
"Core")));
257 xmlHeader =
impl->createDocument(
nullptr, qname,
nullptr);
259 xmlNodes[0] = xmlHeader->getDocumentElement();
261 }
if (name ==
"init") {
263 }
else if (name ==
"event") {
267 impl.reset(DOMImplementationRegistry::getDOMImplementation(
XMLUniStr(
"Core")));
269 if(xmlEvent) xmlEvent->release();
270 xmlEvent =
impl->createDocument(
nullptr, qname,
nullptr);
271 weightsinevent.resize(0);
276 const XMLCh *npLOval = attributes.getValue(XMLString::transcode(
"npLO"));
279 sscanf(npLOs,
"%d",&npLO);
281 const XMLCh *npNLOval = attributes.getValue(XMLString::transcode(
"npNLO"));
284 sscanf(npNLOs,
"%d",&npNLO);
287 xmlEventNodes.resize(1);
288 xmlEventNodes[0] = xmlEvent->getDocumentElement();
295 <<
"LHE file has invalid format" << std::endl;
301 const XMLCh *
const localname,
302 const XMLCh *
const qname)
308 if (
mode == kHeader && xmlNodes.size() > 1) {
309 xmlNodes.resize(xmlNodes.size() - 1);
311 }
else if (
mode == kHeader) {
312 std::unique_ptr<DOMLSSerializer>
writer(
impl->createLSSerializer());
313 std::unique_ptr<DOMLSOutput> outputDesc(
impl->createLSOutput());
314 assert(outputDesc.get());
315 outputDesc->setEncoding(
XMLUniStr(
"UTF-8"));
317 for(DOMNode *node = xmlNodes[0]->getFirstChild();
318 node; node = node->getNextSibling()) {
325 switch(node->getNodeType()) {
326 case DOMNode::ELEMENT_NODE:
327 elem =
static_cast<DOMElement*
>(node);
330 p = std::strchr((
const char*)
buffer,
332 q = std::strrchr(p,
'<');
334 case DOMNode::COMMENT_NODE:
342 std::strspn(
buffer,
" \t\r\n");
349 headers.push_back(header);
352 xmlHeader->release();
355 else if (name ==
"event" &&
357 (skipEvent || (!xmlEventNodes.empty()))) {
366 for(DOMNode *node = xmlEventNodes[0]->getFirstChild();
367 node; node = node->getNextSibling()) {
368 switch( node->getNodeType() ) {
369 case DOMNode::ELEMENT_NODE:
370 for(DOMNode *rwgt = xmlEventNodes[1]->getFirstChild();
371 rwgt; rwgt = rwgt->getNextSibling()) {
372 DOMNode* attr = rwgt->getAttributes()->item(0);
375 switch( rwgt->getNodeType() ) {
376 case DOMNode::ELEMENT_NODE:
377 weightsinevent.push_back(std::make_pair((
const char*)atname,
385 case DOMNode::TEXT_NODE:
396 else if (
mode == kEvent) {
401 if (gotObject !=
kNone)
403 <<
"Unexpected pileup in" 404 " LHEReader::XMLHandler::endElement" 413 const XMLSize_t length)
415 if (
mode == kHeader) {
416 DOMText *
text = xmlHeader->createTextNode(data_);
417 xmlNodes.back()->appendChild(text);
428 if(
mode == kEvent ) {
431 DOMText *
text = xmlEvent->createTextNode(data_+offset);
432 xmlEventNodes.back()->appendChild(text);
439 <<
"LHE file has invalid format" << std::endl;
446 const XMLSize_t length)
448 if (
mode == kHeader) {
449 DOMComment *
comment = xmlHeader->createComment(data_);
450 xmlNodes.back()->appendChild(comment);
458 headers.push_back(header);
464 firstEvent(params.getUntrackedParameter<unsigned
int>(
"skipEvents", 0)),
465 maxEvents(params.getUntrackedParameter<
int>(
"limitEvents", -1)),
508 if ( newFileOpened !=
nullptr ) *newFileOpened =
true;
510 }
else if ( !
strName.empty() ) {
528 return std::shared_ptr<LHEEvent>();
537 std::istringstream
data;
543 std::for_each(
handler->headers.begin(),
558 <<
"Got LHE event without" 559 " initialization." << std::endl;
567 return std::shared_ptr<LHEEvent>();
571 std::istringstream
data;
575 std::shared_ptr<LHEEvent> lheevent;
578 for(
size_t i=0;
i< info.size(); ++
i ) {
583 lheevent->setNpLO(
handler->npLO);
584 lheevent->setNpNLO(
handler->npNLO);
585 lheevent->setEvtNum(
handler->evtnum);
588 if (!
handler->scales.empty()) {
589 lheevent->setScales(
handler->scales);
596 return std::shared_ptr<LHEEvent>();
std::shared_ptr< void > platform
XMLDocument * createReader(XMLDocument::Handler &handler) override
LHEReader(const edm::ParameterSet ¶ms)
static void logFileAction(char const *msg, std::string const &fileName)
static void fillHeader(LHERunInfo::Header &header, const char *data, int len=-1)
std::unique_ptr< std::istream > fileStream
StringSource(const std::string &inputs)
void endElement(const XMLCh *const uri, const XMLCh *const localname, const XMLCh *const qname) override
const wgt_info & weightInfo() const
const std::vector< std::string > fileURLs
static bool isSpace(XMLCh ch)
void characters(const XMLCh *const chars, const XMLSize_t length) override
std::vector< LHERunInfo::Header > headers
U second(std::pair< T, U > const &p)
static const StorageFactory * get(void)
void addHeader(const Header &header)
std::unique_ptr< StorageWrap > fileStream
static bool isAllSpaces(const XMLCh *str, unsigned int length)
const std::string strName
std::vector< std::pair< std::string, std::string > > wgt_info
static std::shared_ptr< void > platformHandle()
std::unique_ptr< DOMImplementation > impl
std::unique_ptr< XMLDocument > curDoc
std::vector< DOMElement * > xmlNodes
def elem(elemtype, innerHTML='', html_class='', kwargs)
void startElement(const XMLCh *const uri, const XMLCh *const localname, const XMLCh *const qname, const Attributes &attributes) override
std::unique_ptr< Source > curSource
XMLDocument * createReader(XMLDocument::Handler &handler) override
char data[epos_bytes_allocation]
void comment(const XMLCh *const chars, const XMLSize_t length) override
virtual XMLDocument * createReader(XMLDocument::Handler &handler)=0
std::shared_ptr< LHERunInfo > curRunInfo
std::vector< float > scales
std::unique_ptr< XMLHandler > handler
std::shared_ptr< LHEEvent > next(bool *newFileOpened=nullptr)
FileSource(const std::string &fileURL)
static void attributesToDom(DOMElement *dom, const Attributes &attributes)
std::unique_ptr< Storage > open(const std::string &url, int mode=IOFlags::OpenRead) const