31 #include "boost/bind.hpp" 32 #include "boost/shared_ptr.hpp" 33 #include "boost/ptr_container/ptr_deque.hpp" 66 edm::EndRunProducer> {
97 boost::shared_ptr<lhef::LHERunInfo>
runInfo;
128 scriptName_((iConfig.getParameter<
edm::FileInPath>(
"scriptName")).fullPath()),
131 npars_(iConfig.getParameter<uint32_t>(
"numberOfParameters")),
132 nEvents_(iConfig.getUntrackedParameter<uint32_t>(
"nEvents"))
135 throw cms::Exception(
"ExternalLHEProducer") <<
"Problem with configuration: " <<
args_.size() <<
" script arguments given, expected " <<
npars_;
136 produces<LHEXMLStringProduct, edm::Transition::BeginRun>(
"LHEScriptOutput");
138 produces<LHEEventProduct>();
139 produces<LHERunInfoProduct, edm::Transition::BeginRun>();
140 produces<LHERunInfoProduct, edm::Transition::EndRun>();
167 <<
"The likely cause is that the lhe file contains fewer events than were requested, which is possible " 168 <<
"in case of phase space integration or uneweighting efficiency problems.";
171 std::unique_ptr<LHEEventProduct> product(
194 std::for_each(
runInfo->getHeaders().begin(),
198 std::for_each(
runInfo->getComments().begin(),
226 std::ostringstream eventStream;
229 args_.insert(
args_.begin() + 1, eventStream.str());
237 <<
"The ExternalLHEProducer module requires the RandomNumberGeneratorService\n" 238 "which is not present in the configuration file. You must add the service\n" 239 "in the configuration file if you want to run ExternalLHEProducer";
241 std::ostringstream randomStream;
242 randomStream << rng->
mySeed();
244 args_.insert(
args_.begin() + 2, randomStream.str());
249 for (
unsigned int iArg = 0; iArg <
args_.size() ; iArg++ ) {
250 LogDebug(
"LHEInputArgs") <<
"arg [" << iArg <<
"] = " <<
args_[iArg];
261 instream.seekg (0, instream.end);
262 int insize = instream.tellg();
263 instream.seekg (0, instream.beg);
264 p->fillCompressedContent(instream, 0.25*insize);
272 unsigned int skip = 0;
273 reader_ = std::make_unique<lhef::LHEReader>(infiles,
skip);
280 std::for_each(
runInfo->getHeaders().begin(),
284 std::for_each(
runInfo->getComments().begin(),
306 std::unique_ptr<LHERunInfoProduct> product(
runInfoProducts.pop_front().release());
313 <<
"Event loop is over, but there are still lhe events to process." 314 <<
"This could happen if lhe file contains more events than requested. This is never expected to happen.";
320 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
335 if ((dir = opendir(
"/proc/self/fd"))) {
337 while ((dp = readdir (dir)) !=
nullptr) {
338 if ((strcmp(dp->d_name,
".") == 0) || (strcmp(dp->d_name,
"..") == 0)) {
341 if (sscanf(dp->d_name,
"%d", &fd) != 1) {
357 for (fd=3; fd<maxfd+1; fd++) {
372 int filedes[2], fd_flags;
380 if ((fd_flags = fcntl(filedes[1], F_GETFD,
NULL)) == -1) {
381 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to get pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
383 if (fcntl(filedes[1], F_SETFD, fd_flags | FD_CLOEXEC) == -1) {
384 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to set pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
387 argc = 1 +
args_.size();
389 char **
argv =
new char *[argc+1];
391 for (
unsigned int i=1;
i<
argc;
i++) {
392 argv[
i] = strdup(
args_[
i-1].c_str());
394 argv[
argc] =
nullptr;
400 execvp(argv[0], argv);
403 while ((
write(filedes[1], &rc,
sizeof(
int)) == -1) && (errno == EINTR)) {}
408 for (
unsigned int i=0;
i<
args_.size()+1;
i++) {
414 throw cms::Exception(
"ForkException") <<
"Unable to fork a child (errno=" << errno <<
", " << strerror(errno) <<
")";
419 while (((rc2 = read(filedes[0], &rc,
sizeof(
int))) == -1) && (errno == EINTR)) { rc2 = 0; }
420 if ((rc2 ==
sizeof(
int)) && rc) {
421 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to execute script (errno=" << rc <<
", " << strerror(rc) <<
")";
428 if (waitpid(pid, &status, 0) < 0) {
429 if (errno == EINTR) {
432 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to read child status (errno=" << errno <<
", " << strerror(errno) <<
")";
435 if (WIFSIGNALED(status)) {
436 throw cms::Exception(
"ExternalLHEProducer") <<
"Child exited due to signal " << WTERMSIG(status) <<
".";
438 if (WIFEXITED(status)) {
439 rc = WEXITSTATUS(status);
444 throw cms::Exception(
"ExternalLHEProducer") <<
"Child failed with exit code " << rc <<
".";
457 if ((fd = open(
outputFile_.c_str(), O_RDONLY)) == -1) {
458 throw cms::Exception(
"OutputOpenError") <<
"Unable to open script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
461 std::stringstream ss;
462 while ((n = read(fd, buf,
BUFSIZE)) > 0 || (n == -1 && errno == EINTR)) {
467 throw cms::Exception(
"OutputOpenError") <<
"Unable to read from script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
471 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
474 return std::unique_ptr<std::string>(
new std::string(ss.str()));
483 desc.
setComment(
"Executes an external script and places its output file into an EDM collection");
488 desc.
add<std::vector<std::string> >(
"args");
489 desc.
add<uint32_t>(
"numberOfParameters");
506 boost::shared_ptr<lhef::LHERunInfo> runInfoThis =
partonLevel->getRunInfo();
boost::shared_ptr< lhef::LHEEvent > partonLevel
void beginRunProduce(edm::Run &run, edm::EventSetup const &es) override
void endRunProduce(edm::Run &, edm::EventSetup const &) override
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
std::unique_ptr< std::string > readOutput()
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
void addHeader(const Header &header)
void addComment(const std::string &line)
#define DEFINE_FWK_MODULE(type)
void produce(edm::Event &, const edm::EventSetup &) override
void addWeight(const WGT &wgt)
std::vector< std::string > args_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
boost::shared_ptr< lhef::LHERunInfo > runInfoLast
void setComment(std::string const &value)
int closeDescriptors(int preserve)
void addDefault(ParameterSetDescription const &psetDescription)
std::unique_ptr< lhef::LHEReader > reader_
def pipe(cmdline, input=None)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
virtual std::uint32_t mySeed() const =0
std::string outputContents_
boost::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)