31 #include <boost/shared_ptr.hpp>
32 #include <boost/ptr_container/ptr_deque.hpp>
65 edm::EndRunProducer> {
94 boost::shared_ptr<lhef::LHERunInfo>
runInfo;
125 scriptName_((iConfig.getParameter<edm::
FileInPath>(
"scriptName")).
fullPath().c_str()),
126 outputFile_(iConfig.getParameter<std::
string>(
"outputFile")),
127 args_(iConfig.getParameter<std::vector<std::
string> >(
"args")),
128 npars_(iConfig.getParameter<uint32_t>(
"numberOfParameters")),
129 nEvents_(iConfig.getUntrackedParameter<uint32_t>(
"nEvents"))
132 throw cms::Exception(
"ExternalLHEProducer") <<
"Problem with configuration: " <<
args_.size() <<
" script arguments given, expected " <<
npars_;
133 produces<LHEXMLStringProduct, edm::InRun>(
"LHEScriptOutput");
135 produces<LHEEventProduct>();
136 produces<LHERunInfoProduct, edm::InRun>();
155 throw cms::Exception(
"ExternalLHEProducer") <<
"No lhe event found in ExternalLHEProducer::produce(). "
156 <<
"The likely cause is that the lhe file contains fewer events than were requested, which is possible "
157 <<
"in case of phase space integration or uneweighting efficiency problems.";
160 std::auto_ptr<LHEEventProduct> product(
183 std::for_each(
runInfo->getHeaders().begin(),
187 std::for_each(
runInfo->getComments().begin(),
215 std::ostringstream eventStream;
217 args_.push_back(eventStream.str());
225 <<
"The ExternalLHEProducer module requires the RandomNumberGeneratorService\n"
226 "which is not present in the configuration file. You must add the service\n"
227 "in the configuration file if you want to run ExternalLHEProducer";
229 std::ostringstream randomStream;
230 randomStream << rng->
mySeed();
231 args_.push_back(randomStream.str());
233 for (
unsigned int iArg = 0; iArg <
args_.size() ; iArg++ ) {
234 LogDebug(
"LHEInputArgs") <<
"arg [" << iArg <<
"] = " <<
args_[iArg];
245 instream.seekg (0, instream.end);
246 int insize = instream.tellg();
247 instream.seekg (0, instream.beg);
248 p->fillCompressedContent(instream, 0.25*insize);
250 run.
put(p,
"LHEScriptOutput");
256 unsigned int skip = 0;
257 std::auto_ptr<lhef::LHEReader> thisRead(
new lhef::LHEReader(infiles, skip ) );
265 std::for_each(
runInfo->getHeaders().begin(),
269 std::for_each(
runInfo->getComments().begin(),
291 std::auto_ptr<LHERunInfoProduct> product(
runInfoProducts.pop_front().release());
297 throw cms::Exception(
"ExternalLHEProducer") <<
"Error in ExternalLHEProducer::endRunProduce(). "
298 <<
"Event loop is over, but there are still lhe events to process."
299 <<
"This could happen if lhe file contains more events than requested. This is never expected to happen.";
305 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
320 if ((dir = opendir(
"/proc/self/fd"))) {
322 while ((dp = readdir (dir)) !=
NULL) {
323 if ((strcmp(dp->d_name,
".") == 0) || (strcmp(dp->d_name,
"..") == 0)) {
326 if (sscanf(dp->d_name,
"%d", &fd) != 1) {
342 for (fd=3; fd<maxfd+1; fd++) {
357 int filedes[2], fd_flags;
365 if ((fd_flags = fcntl(filedes[1], F_GETFD,
NULL)) == -1) {
366 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to get pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
368 if (fcntl(filedes[1], F_SETFD, fd_flags | FD_CLOEXEC) == -1) {
369 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to set pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
372 argc = 1 +
args_.size();
374 char **
argv =
new char *[argc+1];
376 for (
unsigned int i=1;
i<
argc;
i++) {
377 argv[
i] = strdup(
args_[
i-1].c_str());
385 execvp(argv[0], argv);
388 while ((
write(filedes[1], &rc,
sizeof(
int)) == -1) && (errno == EINTR)) {}
393 for (
unsigned int i=0;
i<
args_.size()+1;
i++) {
399 throw cms::Exception(
"ForkException") <<
"Unable to fork a child (errno=" << errno <<
", " << strerror(errno) <<
")";
404 while (((rc2 =
read(filedes[0], &rc,
sizeof(
int))) == -1) && (errno == EINTR)) { rc2 = 0; }
405 if ((rc2 ==
sizeof(
int)) && rc) {
406 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to execute script (errno=" << rc <<
", " << strerror(rc) <<
")";
413 if (waitpid(pid, &status, 0) < 0) {
414 if (errno == EINTR) {
417 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to read child status (errno=" << errno <<
", " << strerror(errno) <<
")";
420 if (WIFSIGNALED(status)) {
421 throw cms::Exception(
"ExternalLHEProducer") <<
"Child exited due to signal " << WTERMSIG(status) <<
".";
423 if (WIFEXITED(status)) {
424 rc = WEXITSTATUS(status);
429 throw cms::Exception(
"ExternalLHEProducer") <<
"Child failed with exit code " << rc <<
".";
442 if ((fd = open(
outputFile_.c_str(), O_RDONLY)) == -1) {
443 throw cms::Exception(
"OutputOpenError") <<
"Unable to open script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
446 std::stringstream
ss;
447 while ((n =
read(fd, buf,
BUFSIZE)) > 0 || (n == -1 && errno == EINTR)) {
452 throw cms::Exception(
"OutputOpenError") <<
"Unable to read from script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
456 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
459 return std::auto_ptr<std::string>(
new std::string(ss.str()));
468 desc.
setComment(
"Executes an external script and places its output file into an EDM collection");
473 desc.
add<std::vector<std::string> >(
"args");
474 desc.
add<uint32_t>(
"numberOfParameters");
490 boost::shared_ptr<lhef::LHERunInfo> runInfoThis =
partonLevel->getRunInfo();
boost::shared_ptr< lhef::LHEEvent > partonLevel
std::auto_ptr< std::string > readOutput()
virtual void beginRunProduce(edm::Run &run, edm::EventSetup const &es) override
virtual void endRunProduce(edm::Run &, edm::EventSetup const &) override
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)
std::auto_ptr< lhef::LHEReader > reader_
boost::shared_ptr< lhef::LHERunInfo > runInfoLast
void setComment(std::string const &value)
int closeDescriptors(int preserve)
void addDefault(ParameterSetDescription const &psetDescription)
virtual std::uint32_t mySeed() const =0
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::string outputContents_
boost::shared_ptr< lhef::LHERunInfo > runInfo
void addComment(const std::string &line)
virtual ~ExternalLHEProducer()
void put(std::auto_ptr< PROD > product)
Put a new product.
boost::ptr_deque< LHERunInfoProduct > runInfoProducts
ExternalLHEProducer(const edm::ParameterSet &iConfig)