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>();
157 std::auto_ptr<LHEEventProduct> product(
180 std::for_each(
runInfo->getHeaders().begin(),
184 std::for_each(
runInfo->getComments().begin(),
212 std::ostringstream eventStream;
214 args_.push_back(eventStream.str());
222 <<
"The ExternalLHEProducer module requires the RandomNumberGeneratorService\n"
223 "which is not present in the configuration file. You must add the service\n"
224 "in the configuration file if you want to run ExternalLHEProducer";
226 std::ostringstream randomStream;
227 randomStream << rng->
mySeed();
228 args_.push_back(randomStream.str());
230 for (
unsigned int iArg = 0; iArg <
args_.size() ; iArg++ ) {
231 LogDebug(
"LHEInputArgs") <<
"arg [" << iArg <<
"] = " <<
args_[iArg];
242 instream.seekg (0, instream.end);
243 int insize = instream.tellg();
244 instream.seekg (0, instream.beg);
245 p->fillCompressedContent(instream, 0.25*insize);
247 run.
put(p,
"LHEScriptOutput");
253 unsigned int skip = 0;
254 std::auto_ptr<lhef::LHEReader> thisRead(
new lhef::LHEReader(infiles, skip ) );
262 std::for_each(
runInfo->getHeaders().begin(),
266 std::for_each(
runInfo->getComments().begin(),
288 std::auto_ptr<LHERunInfoProduct> product(
runInfoProducts.pop_front().release());
295 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
310 if ((dir = opendir(
"/proc/self/fd"))) {
312 while ((dp = readdir (dir)) !=
NULL) {
313 if ((strcmp(dp->d_name,
".") == 0) || (strcmp(dp->d_name,
"..") == 0)) {
316 if (sscanf(dp->d_name,
"%d", &fd) != 1) {
332 for (fd=3; fd<maxfd+1; fd++) {
347 int filedes[2], fd_flags;
355 if ((fd_flags = fcntl(filedes[1], F_GETFD,
NULL)) == -1) {
356 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to get pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
358 if (fcntl(filedes[1], F_SETFD, fd_flags | FD_CLOEXEC) == -1) {
359 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to set pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
362 argc = 1 +
args_.size();
364 char **
argv =
new char *[argc+1];
366 for (
unsigned int i=1;
i<
argc;
i++) {
367 argv[
i] = strdup(
args_[
i-1].c_str());
375 execvp(argv[0], argv);
378 while ((
write(filedes[1], &rc,
sizeof(
int)) == -1) && (errno == EINTR)) {}
383 for (
unsigned int i=0;
i<
args_.size()+1;
i++) {
389 throw cms::Exception(
"ForkException") <<
"Unable to fork a child (errno=" << errno <<
", " << strerror(errno) <<
")";
394 while (((rc2 =
read(filedes[0], &rc,
sizeof(
int))) == -1) && (errno == EINTR)) { rc2 = 0; }
395 if ((rc2 ==
sizeof(
int)) && rc) {
396 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to execute script (errno=" << rc <<
", " << strerror(rc) <<
")";
403 if (waitpid(pid, &status, 0) < 0) {
404 if (errno == EINTR) {
407 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to read child status (errno=" << errno <<
", " << strerror(errno) <<
")";
410 if (WIFSIGNALED(status)) {
411 throw cms::Exception(
"ExternalLHEProducer") <<
"Child exited due to signal " << WTERMSIG(status) <<
".";
413 if (WIFEXITED(status)) {
414 rc = WEXITSTATUS(status);
419 throw cms::Exception(
"ExternalLHEProducer") <<
"Child failed with exit code " << rc <<
".";
432 if ((fd = open(
outputFile_.c_str(), O_RDONLY)) == -1) {
433 throw cms::Exception(
"OutputOpenError") <<
"Unable to open script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
436 std::stringstream
ss;
437 while ((n =
read(fd, buf,
BUFSIZE)) > 0 || (n == -1 && errno == EINTR)) {
442 throw cms::Exception(
"OutputOpenError") <<
"Unable to read from script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
446 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
449 return std::auto_ptr<std::string>(
new std::string(ss.str()));
458 desc.
setComment(
"Executes an external script and places its output file into an EDM collection");
463 desc.
add<std::vector<std::string> >(
"args");
464 desc.
add<uint32_t>(
"numberOfParameters");
480 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)