31 #include <sys/resource.h> 34 #include "boost/bind.hpp" 35 #include "boost/shared_ptr.hpp" 36 #include "boost/ptr_container/ptr_deque.hpp" 69 edm::EndRunProducer> {
126 scriptName_((iConfig.getParameter<
edm::FileInPath>(
"scriptName")).fullPath()),
129 npars_(iConfig.getParameter<uint32_t>(
"numberOfParameters")),
130 nEvents_(iConfig.getUntrackedParameter<uint32_t>(
"nEvents")),
134 throw cms::Exception(
"ExternalLHEProducer") <<
"Problem with configuration: " <<
args_.size() <<
" script arguments given, expected " <<
npars_;
136 if (iConfig.
exists(
"nPartonMapping")) {
138 for (
auto&
cfg : processMap) {
139 unsigned processId(
cfg.getParameter<
unsigned>(
"idprup"));
143 if (orderStr ==
"LO")
145 else if (orderStr ==
"NLO")
148 throw cms::Exception(
"ExternalLHEProducer") <<
"Invalid order specification for process " << processId <<
": " << orderStr;
150 unsigned np(
cfg.getParameter<
unsigned>(
"np"));
156 produces<LHEXMLStringProduct, edm::Transition::BeginRun>(
"LHEScriptOutput");
158 produces<LHEEventProduct>();
159 produces<LHERunInfoProduct, edm::Transition::BeginRun>();
160 produces<LHERunInfoProduct, edm::Transition::EndRun>();
187 <<
"The likely cause is that the lhe file contains fewer events than were requested, which is possible " 188 <<
"in case of phase space integration or uneweighting efficiency problems.";
191 std::unique_ptr<LHEEventProduct> product(
209 unsigned processId(
partonLevel->getHEPEUP()->IDPRUP);
214 order = procDef.first;
217 catch (std::out_of_range&) {
223 product->setNpLO(np);
224 product->setNpNLO(-1);
227 product->setNpLO(-1);
228 product->setNpNLO(np);
244 std::for_each(
runInfo->getHeaders().begin(),
248 std::for_each(
runInfo->getComments().begin(),
276 std::ostringstream eventStream;
279 args_.insert(
args_.begin() + 1, eventStream.str());
287 <<
"The ExternalLHEProducer module requires the RandomNumberGeneratorService\n" 288 "which is not present in the configuration file. You must add the service\n" 289 "in the configuration file if you want to run ExternalLHEProducer";
291 std::ostringstream randomStream;
292 randomStream << rng->
mySeed();
294 args_.insert(
args_.begin() + 2, randomStream.str());
299 for (
unsigned int iArg = 0; iArg <
args_.size() ; iArg++ ) {
300 LogDebug(
"LHEInputArgs") <<
"arg [" << iArg <<
"] = " <<
args_[iArg];
314 instream.seekg (0, instream.end);
315 int insize = instream.tellg();
316 instream.seekg (0, instream.beg);
317 p->fillCompressedContent(instream, 0.25*insize);
326 unsigned int skip = 0;
327 reader_ = std::make_unique<lhef::LHEReader>(infiles,
skip);
334 std::for_each(
runInfo->getHeaders().begin(),
338 std::for_each(
runInfo->getComments().begin(),
360 std::unique_ptr<LHERunInfoProduct> product(
runInfoProducts.pop_front().release());
367 <<
"Event loop is over, but there are still lhe events to process." 368 <<
"This could happen if lhe file contains more events than requested. This is never expected to happen.";
374 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
389 if ((dir = opendir(
"/proc/self/fd"))) {
391 while ((dp = readdir (dir)) !=
nullptr) {
392 if ((strcmp(dp->d_name,
".") == 0) || (strcmp(dp->d_name,
"..") == 0)) {
395 if (sscanf(dp->d_name,
"%d", &fd) != 1) {
411 for (fd=3; fd<maxfd+1; fd++) {
426 int filedes[2], fd_flags;
434 if ((fd_flags = fcntl(filedes[1], F_GETFD,
NULL)) == -1) {
435 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to get pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
437 if (fcntl(filedes[1], F_SETFD, fd_flags | FD_CLOEXEC) == -1) {
438 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to set pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
441 argc = 1 +
args_.size();
443 char **
argv =
new char *[argc+1];
445 for (
unsigned int i=1;
i<
argc;
i++) {
446 argv[
i] = strdup(
args_[
i-1].c_str());
448 argv[
argc] =
nullptr;
454 execvp(argv[0], argv);
457 while ((
write(filedes[1], &rc,
sizeof(
int)) == -1) && (errno == EINTR)) {}
462 for (
unsigned int i=0;
i<
args_.size()+1;
i++) {
468 throw cms::Exception(
"ForkException") <<
"Unable to fork a child (errno=" << errno <<
", " << strerror(errno) <<
")";
473 while (((rc2 = read(filedes[0], &rc,
sizeof(
int))) == -1) && (errno == EINTR)) { rc2 = 0; }
474 if ((rc2 ==
sizeof(
int)) && rc) {
475 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to execute script (errno=" << rc <<
", " << strerror(rc) <<
")";
482 if (waitpid(pid, &status, 0) < 0) {
483 if (errno == EINTR) {
486 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to read child status (errno=" << errno <<
", " << strerror(errno) <<
")";
489 if (WIFSIGNALED(status)) {
490 throw cms::Exception(
"ExternalLHEProducer") <<
"Child exited due to signal " << WTERMSIG(status) <<
".";
492 if (WIFEXITED(status)) {
493 rc = WEXITSTATUS(status);
498 throw cms::Exception(
"ExternalLHEProducer") <<
"Child failed with exit code " << rc <<
".";
511 if ((fd = open(
outputFile_.c_str(), O_RDONLY)) == -1) {
512 throw cms::Exception(
"OutputOpenError") <<
"Unable to open script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
515 std::stringstream ss;
516 while ((n = read(fd, buf,
BUFSIZE)) > 0 || (n == -1 && errno == EINTR)) {
521 throw cms::Exception(
"OutputOpenError") <<
"Unable to read from script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
525 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
528 return std::unique_ptr<std::string>(
new std::string(ss.str()));
537 desc.
setComment(
"Executes an external script and places its output file into an EDM collection");
542 desc.
add<std::vector<std::string> >(
"args");
543 desc.
add<uint32_t>(
"numberOfParameters");
548 nPartonMappingDesc.
add<
unsigned>(
"idprup");
550 nPartonMappingDesc.add<
unsigned>(
"np");
567 std::shared_ptr<lhef::LHERunInfo> runInfoThis =
partonLevel->getRunInfo();
void beginRunProduce(edm::Run &run, edm::EventSetup const &es) override
VParameterSet const & getParameterSetVector(std::string const &name) const
void endRunProduce(edm::Run &, edm::EventSetup const &) override
std::shared_ptr< lhef::LHEEvent > partonLevel
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
std::unique_ptr< std::string > readOutput()
std::shared_ptr< lhef::LHERunInfo > runInfoLast
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
void addHeader(const Header &header)
void addComment(const std::string &line)
ParameterDescriptionBase * addVPSetOptional(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
void produce(edm::Event &, const edm::EventSetup &) override
void addWeight(const WGT &wgt)
bool exists(std::string const ¶meterName) const
checks if a parameter exists
std::vector< std::string > args_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void setComment(std::string const &value)
int closeDescriptors(int preserve)
#define DEFINE_FWK_MODULE(type)
void addDefault(ParameterSetDescription const &psetDescription)
std::unique_ptr< lhef::LHEReader > reader_
std::map< unsigned, std::pair< unsigned, unsigned > > nPartonMapping_
def pipe(cmdline, input=None)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
virtual std::uint32_t mySeed() const =0
std::string outputContents_
std::shared_ptr< lhef::LHERunInfo > runInfo
void addComment(const std::string &line)
~ExternalLHEProducer() override
void preallocThreads(unsigned int) override
void put(std::unique_ptr< PROD > product)
Put a new product.
boost::ptr_deque< LHERunInfoProduct > runInfoProducts
ExternalLHEProducer(const edm::ParameterSet &iConfig)