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> {
132 scriptName_((iConfig.getParameter<
edm::FileInPath>(
"scriptName")).fullPath().c_str()),
135 npars_(iConfig.getParameter<uint32_t>(
"numberOfParameters")),
136 nEvents_(iConfig.getUntrackedParameter<uint32_t>(
"nEvents")),
137 storeXML_(iConfig.getUntrackedParameter<bool>(
"storeXML"))
140 throw cms::Exception(
"ExternalLHEProducer") <<
"Problem with configuration: " <<
args_.size() <<
" script arguments given, expected " <<
npars_;
141 produces<LHEXMLStringProduct, edm::Transition::BeginRun>(
"LHEScriptOutput");
143 produces<LHEEventProduct>();
144 produces<LHERunInfoProduct, edm::Transition::BeginRun>();
172 <<
"The likely cause is that the lhe file contains fewer events than were requested, which is possible " 173 <<
"in case of phase space integration or uneweighting efficiency problems.";
176 std::unique_ptr<LHEEventProduct> product(
199 std::for_each(
runInfo->getHeaders().begin(),
203 std::for_each(
runInfo->getComments().begin(),
231 std::ostringstream eventStream;
234 args_.insert(
args_.begin() + 1, eventStream.str());
242 <<
"The ExternalLHEProducer module requires the RandomNumberGeneratorService\n" 243 "which is not present in the configuration file. You must add the service\n" 244 "in the configuration file if you want to run ExternalLHEProducer";
246 std::ostringstream randomStream;
247 randomStream << rng->
mySeed();
249 args_.insert(
args_.begin() + 2, randomStream.str());
254 for (
unsigned int iArg = 0; iArg <
args_.size() ; iArg++ ) {
255 LogDebug(
"LHEInputArgs") <<
"arg [" << iArg <<
"] = " <<
args_[iArg];
269 instream.seekg (0, instream.end);
270 int insize = instream.tellg();
271 instream.seekg (0, instream.beg);
272 p->fillCompressedContent(instream, 0.25*insize);
281 unsigned int skip = 0;
282 reader_ = std::make_unique<lhef::LHEReader>(infiles,
skip);
289 std::for_each(
runInfo->getHeaders().begin(),
293 std::for_each(
runInfo->getComments().begin(),
315 std::unique_ptr<LHERunInfoProduct> product(
runInfoProducts.pop_front().release());
322 <<
"Event loop is over, but there are still lhe events to process." 323 <<
"This could happen if lhe file contains more events than requested. This is never expected to happen.";
329 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
344 if ((dir = opendir(
"/proc/self/fd"))) {
346 while ((dp = readdir (dir)) !=
NULL) {
347 if ((strcmp(dp->d_name,
".") == 0) || (strcmp(dp->d_name,
"..") == 0)) {
350 if (sscanf(dp->d_name,
"%d", &fd) != 1) {
366 for (fd=3; fd<maxfd+1; fd++) {
381 int filedes[2], fd_flags;
389 if ((fd_flags = fcntl(filedes[1], F_GETFD,
NULL)) == -1) {
390 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to get pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
392 if (fcntl(filedes[1], F_SETFD, fd_flags | FD_CLOEXEC) == -1) {
393 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to set pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
396 argc = 1 +
args_.size();
398 char **
argv =
new char *[argc+1];
400 for (
unsigned int i=1;
i<
argc;
i++) {
401 argv[
i] = strdup(
args_[
i-1].c_str());
409 execvp(argv[0], argv);
412 while ((
write(filedes[1], &rc,
sizeof(
int)) == -1) && (errno == EINTR)) {}
417 for (
unsigned int i=0;
i<
args_.size()+1;
i++) {
423 throw cms::Exception(
"ForkException") <<
"Unable to fork a child (errno=" << errno <<
", " << strerror(errno) <<
")";
428 while (((rc2 = read(filedes[0], &rc,
sizeof(
int))) == -1) && (errno == EINTR)) { rc2 = 0; }
429 if ((rc2 ==
sizeof(
int)) && rc) {
430 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to execute script (errno=" << rc <<
", " << strerror(rc) <<
")";
437 if (waitpid(pid, &status, 0) < 0) {
438 if (errno == EINTR) {
441 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to read child status (errno=" << errno <<
", " << strerror(errno) <<
")";
444 if (WIFSIGNALED(status)) {
445 throw cms::Exception(
"ExternalLHEProducer") <<
"Child exited due to signal " << WTERMSIG(status) <<
".";
447 if (WIFEXITED(status)) {
448 rc = WEXITSTATUS(status);
453 throw cms::Exception(
"ExternalLHEProducer") <<
"Child failed with exit code " << rc <<
".";
466 if ((fd = open(
outputFile_.c_str(), O_RDONLY)) == -1) {
467 throw cms::Exception(
"OutputOpenError") <<
"Unable to open script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
470 std::stringstream ss;
471 while ((n = read(fd, buf,
BUFSIZE)) > 0 || (n == -1 && errno == EINTR)) {
476 throw cms::Exception(
"OutputOpenError") <<
"Unable to read from script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
480 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
483 return std::unique_ptr<std::string>(
new std::string(ss.str()));
492 desc.
setComment(
"Executes an external script and places its output file into an EDM collection");
497 desc.
add<std::vector<std::string> >(
"args");
498 desc.
add<uint32_t>(
"numberOfParameters");
516 boost::shared_ptr<lhef::LHERunInfo> runInfoThis =
partonLevel->getRunInfo();
boost::shared_ptr< lhef::LHEEvent > partonLevel
virtual void beginRunProduce(edm::Run &run, edm::EventSetup const &es) override
virtual 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)
virtual 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)
virtual ~ExternalLHEProducer() override
virtual 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)