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;
218 args_.push_back(eventStream.str());
226 <<
"The ExternalLHEProducer module requires the RandomNumberGeneratorService\n"
227 "which is not present in the configuration file. You must add the service\n"
228 "in the configuration file if you want to run ExternalLHEProducer";
230 std::ostringstream randomStream;
231 randomStream << rng->
mySeed();
232 args_.push_back(randomStream.str());
234 for (
unsigned int iArg = 0; iArg <
args_.size() ; iArg++ ) {
235 LogDebug(
"LHEInputArgs") <<
"arg [" << iArg <<
"] = " <<
args_[iArg];
246 instream.seekg (0, instream.end);
247 int insize = instream.tellg();
248 instream.seekg (0, instream.beg);
249 p->fillCompressedContent(instream, 0.25*insize);
251 run.
put(p,
"LHEScriptOutput");
257 unsigned int skip = 0;
258 std::auto_ptr<lhef::LHEReader> thisRead(
new lhef::LHEReader(infiles, skip ) );
266 std::for_each(
runInfo->getHeaders().begin(),
270 std::for_each(
runInfo->getComments().begin(),
292 std::auto_ptr<LHERunInfoProduct> product(
runInfoProducts.pop_front().release());
298 throw cms::Exception(
"ExternalLHEProducer") <<
"Error in ExternalLHEProducer::endRunProduce(). "
299 <<
"Event loop is over, but there are still lhe events to process."
300 <<
"This could happen if lhe file contains more events than requested. This is never expected to happen.";
306 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
321 if ((dir = opendir(
"/proc/self/fd"))) {
323 while ((dp = readdir (dir)) !=
NULL) {
324 if ((strcmp(dp->d_name,
".") == 0) || (strcmp(dp->d_name,
"..") == 0)) {
327 if (sscanf(dp->d_name,
"%d", &fd) != 1) {
343 for (fd=3; fd<maxfd+1; fd++) {
358 int filedes[2], fd_flags;
366 if ((fd_flags = fcntl(filedes[1], F_GETFD,
NULL)) == -1) {
367 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to get pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
369 if (fcntl(filedes[1], F_SETFD, fd_flags | FD_CLOEXEC) == -1) {
370 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to set pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
373 argc = 1 +
args_.size();
375 char **
argv =
new char *[argc+1];
377 for (
unsigned int i=1;
i<
argc;
i++) {
378 argv[
i] = strdup(
args_[
i-1].c_str());
386 execvp(argv[0], argv);
389 while ((
write(filedes[1], &rc,
sizeof(
int)) == -1) && (errno == EINTR)) {}
394 for (
unsigned int i=0;
i<
args_.size()+1;
i++) {
400 throw cms::Exception(
"ForkException") <<
"Unable to fork a child (errno=" << errno <<
", " << strerror(errno) <<
")";
405 while (((rc2 =
read(filedes[0], &rc,
sizeof(
int))) == -1) && (errno == EINTR)) { rc2 = 0; }
406 if ((rc2 ==
sizeof(
int)) && rc) {
407 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to execute script (errno=" << rc <<
", " << strerror(rc) <<
")";
414 if (waitpid(pid, &status, 0) < 0) {
415 if (errno == EINTR) {
418 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to read child status (errno=" << errno <<
", " << strerror(errno) <<
")";
421 if (WIFSIGNALED(status)) {
422 throw cms::Exception(
"ExternalLHEProducer") <<
"Child exited due to signal " << WTERMSIG(status) <<
".";
424 if (WIFEXITED(status)) {
425 rc = WEXITSTATUS(status);
430 throw cms::Exception(
"ExternalLHEProducer") <<
"Child failed with exit code " << rc <<
".";
443 if ((fd = open(
outputFile_.c_str(), O_RDONLY)) == -1) {
444 throw cms::Exception(
"OutputOpenError") <<
"Unable to open script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
447 std::stringstream
ss;
448 while ((n =
read(fd, buf,
BUFSIZE)) > 0 || (n == -1 && errno == EINTR)) {
453 throw cms::Exception(
"OutputOpenError") <<
"Unable to read from script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
457 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
460 return std::auto_ptr<std::string>(
new std::string(ss.str()));
469 desc.
setComment(
"Executes an external script and places its output file into an EDM collection");
474 desc.
add<std::vector<std::string> >(
"args");
475 desc.
add<uint32_t>(
"numberOfParameters");
491 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)