31 #include <sys/resource.h> 34 #include "boost/bind.hpp" 35 #include "boost/shared_ptr.hpp" 36 #include "boost/ptr_container/ptr_deque.hpp" 70 edm::EndRunProducer> {
132 scriptName_((iConfig.getParameter<
edm::FileInPath>(
"scriptName")).fullPath()),
135 npars_(iConfig.getParameter<uint32_t>(
"numberOfParameters")),
136 nEvents_(iConfig.getUntrackedParameter<uint32_t>(
"nEvents"))
139 throw cms::Exception(
"ExternalLHEProducer") <<
"Problem with configuration: " <<
args_.size() <<
" script arguments given, expected " <<
npars_;
140 produces<LHEXMLStringProduct, edm::Transition::BeginRun>(
"LHEScriptOutput");
142 produces<LHEEventProduct>();
143 produces<LHERunInfoProduct, edm::Transition::BeginRun>();
144 produces<LHERunInfoProduct, edm::Transition::EndRun>();
171 <<
"The likely cause is that the lhe file contains fewer events than were requested, which is possible " 172 <<
"in case of phase space integration or uneweighting efficiency problems.";
175 std::unique_ptr<LHEEventProduct> product(
198 std::for_each(
runInfo->getHeaders().begin(),
202 std::for_each(
runInfo->getComments().begin(),
230 std::ostringstream eventStream;
233 args_.insert(
args_.begin() + 1, eventStream.str());
241 <<
"The ExternalLHEProducer module requires the RandomNumberGeneratorService\n" 242 "which is not present in the configuration file. You must add the service\n" 243 "in the configuration file if you want to run ExternalLHEProducer";
245 std::ostringstream randomStream;
246 randomStream << rng->
mySeed();
248 args_.insert(
args_.begin() + 2, randomStream.str());
253 for (
unsigned int iArg = 0; iArg <
args_.size() ; iArg++ ) {
254 LogDebug(
"LHEInputArgs") <<
"arg [" << iArg <<
"] = " <<
args_[iArg];
265 instream.seekg (0, instream.end);
266 int insize = instream.tellg();
267 instream.seekg (0, instream.beg);
268 p->fillCompressedContent(instream, 0.25*insize);
276 unsigned int skip = 0;
277 reader_ = std::make_unique<lhef::LHEReader>(infiles,
skip);
284 std::for_each(
runInfo->getHeaders().begin(),
288 std::for_each(
runInfo->getComments().begin(),
310 std::unique_ptr<LHERunInfoProduct> product(
runInfoProducts.pop_front().release());
317 <<
"Event loop is over, but there are still lhe events to process." 318 <<
"This could happen if lhe file contains more events than requested. This is never expected to happen.";
324 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
339 if ((dir = opendir(
"/proc/self/fd"))) {
341 while ((dp = readdir (dir)) !=
nullptr) {
342 if ((strcmp(dp->d_name,
".") == 0) || (strcmp(dp->d_name,
"..") == 0)) {
345 if (sscanf(dp->d_name,
"%d", &fd) != 1) {
361 for (fd=3; fd<maxfd+1; fd++) {
376 int filedes[2], fd_flags;
384 if ((fd_flags = fcntl(filedes[1], F_GETFD,
NULL)) == -1) {
385 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to get pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
387 if (fcntl(filedes[1], F_SETFD, fd_flags | FD_CLOEXEC) == -1) {
388 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to set pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
391 argc = 1 +
args_.size();
393 char **
argv =
new char *[argc+1];
395 for (
unsigned int i=1;
i<
argc;
i++) {
396 argv[
i] = strdup(
args_[
i-1].c_str());
398 argv[
argc] =
nullptr;
404 execvp(argv[0], argv);
407 while ((
write(filedes[1], &rc,
sizeof(
int)) == -1) && (errno == EINTR)) {}
412 for (
unsigned int i=0;
i<
args_.size()+1;
i++) {
418 throw cms::Exception(
"ForkException") <<
"Unable to fork a child (errno=" << errno <<
", " << strerror(errno) <<
")";
423 while (((rc2 = read(filedes[0], &rc,
sizeof(
int))) == -1) && (errno == EINTR)) { rc2 = 0; }
424 if ((rc2 ==
sizeof(
int)) && rc) {
425 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to execute script (errno=" << rc <<
", " << strerror(rc) <<
")";
432 if (waitpid(pid, &status, 0) < 0) {
433 if (errno == EINTR) {
436 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to read child status (errno=" << errno <<
", " << strerror(errno) <<
")";
439 if (WIFSIGNALED(status)) {
440 throw cms::Exception(
"ExternalLHEProducer") <<
"Child exited due to signal " << WTERMSIG(status) <<
".";
442 if (WIFEXITED(status)) {
443 rc = WEXITSTATUS(status);
450 getrusage(RUSAGE_CHILDREN,&ru);
451 double time =
static_cast<double>(ru.ru_stime.tv_sec) + (static_cast<double>(ru.ru_stime.tv_usec) * 1E-6);
455 throw cms::Exception(
"ExternalLHEProducer") <<
"Child failed with exit code " << rc <<
".";
468 if ((fd = open(
outputFile_.c_str(), O_RDONLY)) == -1) {
469 throw cms::Exception(
"OutputOpenError") <<
"Unable to open script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
472 std::stringstream ss;
473 while ((n = read(fd, buf,
BUFSIZE)) > 0 || (n == -1 && errno == EINTR)) {
478 throw cms::Exception(
"OutputOpenError") <<
"Unable to read from script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
482 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
485 return std::unique_ptr<std::string>(
new std::string(ss.str()));
494 desc.
setComment(
"Executes an external script and places its output file into an EDM collection");
499 desc.
add<std::vector<std::string> >(
"args");
500 desc.
add<uint32_t>(
"numberOfParameters");
517 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)
virtual void addToCPUTime(double iTime)=0
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)