31 #include "boost/bind.hpp"
32 #include "boost/shared_ptr.hpp"
33 #include "boost/ptr_container/ptr_deque.hpp"
66 edm::EndRunProducer> {
95 boost::shared_ptr<lhef::LHERunInfo>
runInfo;
126 scriptName_((iConfig.getParameter<edm::
FileInPath>(
"scriptName")).
fullPath().c_str()),
127 outputFile_(iConfig.getParameter<std::
string>(
"outputFile")),
128 args_(iConfig.getParameter<std::vector<std::
string> >(
"args")),
129 npars_(iConfig.getParameter<uint32_t>(
"numberOfParameters")),
130 nEvents_(iConfig.getUntrackedParameter<uint32_t>(
"nEvents"))
133 throw cms::Exception(
"ExternalLHEProducer") <<
"Problem with configuration: " <<
args_.size() <<
" script arguments given, expected " <<
npars_;
134 produces<LHEXMLStringProduct, edm::InRun>(
"LHEScriptOutput");
136 produces<LHEEventProduct>();
137 produces<LHERunInfoProduct, edm::InRun>();
156 throw cms::Exception(
"ExternalLHEProducer") <<
"No lhe event found in ExternalLHEProducer::produce(). "
157 <<
"The likely cause is that the lhe file contains fewer events than were requested, which is possible "
158 <<
"in case of phase space integration or uneweighting efficiency problems.";
161 std::auto_ptr<LHEEventProduct> product(
184 std::for_each(
runInfo->getHeaders().begin(),
188 std::for_each(
runInfo->getComments().begin(),
216 std::ostringstream eventStream;
219 args_.insert(
args_.begin() + 1, eventStream.str());
227 <<
"The ExternalLHEProducer module requires the RandomNumberGeneratorService\n"
228 "which is not present in the configuration file. You must add the service\n"
229 "in the configuration file if you want to run ExternalLHEProducer";
231 std::ostringstream randomStream;
232 randomStream << rng->
mySeed();
234 args_.insert(
args_.begin() + 2, randomStream.str());
236 for (
unsigned int iArg = 0; iArg <
args_.size() ; iArg++ ) {
237 LogDebug(
"LHEInputArgs") <<
"arg [" << iArg <<
"] = " <<
args_[iArg];
248 instream.seekg (0, instream.end);
249 int insize = instream.tellg();
250 instream.seekg (0, instream.beg);
251 p->fillCompressedContent(instream, 0.25*insize);
253 run.
put(p,
"LHEScriptOutput");
259 unsigned int skip = 0;
260 std::auto_ptr<lhef::LHEReader> thisRead(
new lhef::LHEReader(infiles, skip ) );
268 std::for_each(
runInfo->getHeaders().begin(),
272 std::for_each(
runInfo->getComments().begin(),
294 std::auto_ptr<LHERunInfoProduct> product(
runInfoProducts.pop_front().release());
300 throw cms::Exception(
"ExternalLHEProducer") <<
"Error in ExternalLHEProducer::endRunProduce(). "
301 <<
"Event loop is over, but there are still lhe events to process."
302 <<
"This could happen if lhe file contains more events than requested. This is never expected to happen.";
308 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
323 if ((dir = opendir(
"/proc/self/fd"))) {
325 while ((dp = readdir (dir)) !=
NULL) {
326 if ((strcmp(dp->d_name,
".") == 0) || (strcmp(dp->d_name,
"..") == 0)) {
329 if (sscanf(dp->d_name,
"%d", &fd) != 1) {
345 for (fd=3; fd<maxfd+1; fd++) {
360 int filedes[2], fd_flags;
368 if ((fd_flags = fcntl(filedes[1], F_GETFD,
NULL)) == -1) {
369 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to get pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
371 if (fcntl(filedes[1], F_SETFD, fd_flags | FD_CLOEXEC) == -1) {
372 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to set pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
375 argc = 1 +
args_.size();
377 char **
argv =
new char *[argc+1];
379 for (
unsigned int i=1;
i<
argc;
i++) {
380 argv[
i] = strdup(
args_[
i-1].c_str());
388 execvp(argv[0], argv);
391 while ((
write(filedes[1], &rc,
sizeof(
int)) == -1) && (errno == EINTR)) {}
396 for (
unsigned int i=0;
i<
args_.size()+1;
i++) {
402 throw cms::Exception(
"ForkException") <<
"Unable to fork a child (errno=" << errno <<
", " << strerror(errno) <<
")";
407 while (((rc2 =
read(filedes[0], &rc,
sizeof(
int))) == -1) && (errno == EINTR)) { rc2 = 0; }
408 if ((rc2 ==
sizeof(
int)) && rc) {
409 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to execute script (errno=" << rc <<
", " << strerror(rc) <<
")";
416 if (waitpid(pid, &status, 0) < 0) {
417 if (errno == EINTR) {
420 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to read child status (errno=" << errno <<
", " << strerror(errno) <<
")";
423 if (WIFSIGNALED(status)) {
424 throw cms::Exception(
"ExternalLHEProducer") <<
"Child exited due to signal " << WTERMSIG(status) <<
".";
426 if (WIFEXITED(status)) {
427 rc = WEXITSTATUS(status);
432 throw cms::Exception(
"ExternalLHEProducer") <<
"Child failed with exit code " << rc <<
".";
445 if ((fd = open(
outputFile_.c_str(), O_RDONLY)) == -1) {
446 throw cms::Exception(
"OutputOpenError") <<
"Unable to open script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
449 std::stringstream
ss;
450 while ((n =
read(fd, buf,
BUFSIZE)) > 0 || (n == -1 && errno == EINTR)) {
455 throw cms::Exception(
"OutputOpenError") <<
"Unable to read from script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
459 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
462 return std::auto_ptr<std::string>(
new std::string(ss.str()));
471 desc.
setComment(
"Executes an external script and places its output file into an EDM collection");
476 desc.
add<std::vector<std::string> >(
"args");
477 desc.
add<uint32_t>(
"numberOfParameters");
493 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)