32 #include "boost/bind.hpp"
33 #include "boost/shared_ptr.hpp"
34 #include "boost/ptr_container/ptr_deque.hpp"
67 edm::EndRunProducer> {
96 boost::shared_ptr<lhef::LHERunInfo>
runInfo;
127 scriptName_((iConfig.getParameter<edm::
FileInPath>(
"scriptName")).
fullPath().c_str()),
128 outputFile_(iConfig.getParameter<std::
string>(
"outputFile")),
129 args_(iConfig.getParameter<std::vector<std::
string> >(
"args")),
130 npars_(iConfig.getParameter<uint32_t>(
"numberOfParameters")),
131 nEvents_(iConfig.getUntrackedParameter<uint32_t>(
"nEvents"))
134 throw cms::Exception(
"ExternalLHEProducer") <<
"Problem with configuration: " <<
args_.size() <<
" script arguments given, expected " <<
npars_;
135 produces<LHEXMLStringProduct, edm::InRun>(
"LHEScriptOutput");
137 produces<LHEEventProduct>();
138 produces<LHERunInfoProduct, edm::InRun>();
157 throw cms::Exception(
"ExternalLHEProducer") <<
"No lhe event found in ExternalLHEProducer::produce(). "
158 <<
"The likely cause is that the lhe file contains fewer events than were requested, which is possible "
159 <<
"in case of phase space integration or uneweighting efficiency problems.";
162 std::auto_ptr<LHEEventProduct> product(
185 std::for_each(
runInfo->getHeaders().begin(),
189 std::for_each(
runInfo->getComments().begin(),
217 std::ostringstream eventStream;
220 args_.insert(
args_.begin() + 1, eventStream.str());
228 <<
"The ExternalLHEProducer module requires the RandomNumberGeneratorService\n"
229 "which is not present in the configuration file. You must add the service\n"
230 "in the configuration file if you want to run ExternalLHEProducer";
232 std::ostringstream randomStream;
233 randomStream << rng->
mySeed();
235 args_.insert(
args_.begin() + 2, randomStream.str());
237 for (
unsigned int iArg = 0; iArg <
args_.size() ; iArg++ ) {
238 LogDebug(
"LHEInputArgs") <<
"arg [" << iArg <<
"] = " <<
args_[iArg];
249 instream.seekg (0, instream.end);
250 int insize = instream.tellg();
251 instream.seekg (0, instream.beg);
252 p->fillCompressedContent(instream, 0.25*insize);
254 run.
put(p,
"LHEScriptOutput");
260 unsigned int skip = 0;
261 std::auto_ptr<lhef::LHEReader> thisRead(
new lhef::LHEReader(infiles, skip ) );
269 std::for_each(
runInfo->getHeaders().begin(),
273 std::for_each(
runInfo->getComments().begin(),
295 std::auto_ptr<LHERunInfoProduct> product(
runInfoProducts.pop_front().release());
302 if (std::getenv(
"VALIDATION_RUN") !=
nullptr) {
304 <<
"Event loop is over, but there are still lhe events to process, ignoring...";
307 <<
"Error in ExternalLHEProducer::endRunProduce(). "
308 <<
"Event loop is over, but there are still lhe events to process."
309 <<
"This could happen if lhe file contains more events than requested. This is never expected to happen.";
316 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
331 if ((dir = opendir(
"/proc/self/fd"))) {
333 while ((dp = readdir (dir)) !=
NULL) {
334 if ((strcmp(dp->d_name,
".") == 0) || (strcmp(dp->d_name,
"..") == 0)) {
337 if (sscanf(dp->d_name,
"%d", &fd) != 1) {
353 for (fd=3; fd<maxfd+1; fd++) {
368 int filedes[2], fd_flags;
376 if ((fd_flags = fcntl(filedes[1], F_GETFD,
NULL)) == -1) {
377 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to get pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
379 if (fcntl(filedes[1], F_SETFD, fd_flags | FD_CLOEXEC) == -1) {
380 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to set pipe file descriptor flags (errno=" << rc <<
", " << strerror(rc) <<
")";
383 argc = 1 +
args_.size();
385 char **
argv =
new char *[argc+1];
387 for (
unsigned int i=1;
i<
argc;
i++) {
388 argv[
i] = strdup(
args_[
i-1].c_str());
396 execvp(argv[0], argv);
399 while ((
write(filedes[1], &rc,
sizeof(
int)) == -1) && (errno == EINTR)) {}
404 for (
unsigned int i=0;
i<
args_.size()+1;
i++) {
410 throw cms::Exception(
"ForkException") <<
"Unable to fork a child (errno=" << errno <<
", " << strerror(errno) <<
")";
415 while (((rc2 =
read(filedes[0], &rc,
sizeof(
int))) == -1) && (errno == EINTR)) { rc2 = 0; }
416 if ((rc2 ==
sizeof(
int)) && rc) {
417 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to execute script (errno=" << rc <<
", " << strerror(rc) <<
")";
424 if (waitpid(pid, &status, 0) < 0) {
425 if (errno == EINTR) {
428 throw cms::Exception(
"ExternalLHEProducer") <<
"Failed to read child status (errno=" << errno <<
", " << strerror(errno) <<
")";
431 if (WIFSIGNALED(status)) {
432 throw cms::Exception(
"ExternalLHEProducer") <<
"Child exited due to signal " << WTERMSIG(status) <<
".";
434 if (WIFEXITED(status)) {
435 rc = WEXITSTATUS(status);
440 throw cms::Exception(
"ExternalLHEProducer") <<
"Child failed with exit code " << rc <<
".";
453 if ((fd = open(
outputFile_.c_str(), O_RDONLY)) == -1) {
454 throw cms::Exception(
"OutputOpenError") <<
"Unable to open script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
457 std::stringstream
ss;
458 while ((n =
read(fd, buf,
BUFSIZE)) > 0 || (n == -1 && errno == EINTR)) {
463 throw cms::Exception(
"OutputOpenError") <<
"Unable to read from script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
467 throw cms::Exception(
"OutputDeleteError") <<
"Unable to delete original script output file " <<
outputFile_ <<
" (errno=" << errno <<
", " << strerror(errno) <<
").";
470 return std::auto_ptr<std::string>(
new std::string(ss.str()));
479 desc.
setComment(
"Executes an external script and places its output file into an EDM collection");
484 desc.
add<std::vector<std::string> >(
"args");
485 desc.
add<uint32_t>(
"numberOfParameters");
501 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)