CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
BaseHadronizer.cc
Go to the documentation of this file.
1 
4 
5 #include <random>
6 #include <sys/wait.h>
7 
8 namespace gen {
9 
10 const std::vector<std::string> BaseHadronizer::theSharedResources;
11 
13  randomIndex_(-1),
14  gridpackPaths_(1)
15  {
16 
17  if (ps.exists("RandomizedParameters")) {
18  std::vector<edm::ParameterSet> randomizedParameters = ps.getParameter<std::vector<edm::ParameterSet> >("RandomizedParameters");
19  randomInitWeights_.resize(randomizedParameters.size());
20  randomInitConfigDescriptions_.resize(randomizedParameters.size());
21  gridpackPaths_.resize(randomizedParameters.size());
22  for (unsigned int irand = 0; irand<randomizedParameters.size(); ++irand) {
23  randomInitWeights_[irand] = randomizedParameters[irand].getParameter<double>("ConfigWeight");
24  if (randomizedParameters[irand].exists("ConfigDescription")) {
25  randomInitConfigDescriptions_[irand] = randomizedParameters[irand].getParameter<std::string>("ConfigDescription");
26  }
27  if (randomizedParameters[irand].exists("GridpackPath")) {
28  gridpackPaths_[irand] = randomizedParameters[irand].getParameter<std::string>("GridpackPath");
29  }
30  }
31  }
32  else {
33  if (ps.exists("GridpackPath")) {
34  gridpackPaths_[0] = ps.getParameter<std::string>("GridpackPath");
35  }
36  }
37 
39  ps.getUntrackedParameter<double>("filterEfficiency", -1.) );
41  GenRunInfoProduct::XSec(ps.getUntrackedParameter<double>("crossSection", -1.)) );
43  GenRunInfoProduct::XSec(ps.getUntrackedParameter<double>("crossSectionNLO", -1.)) );
44 
45  }
46 
48 
49  GenLumiInfoHeader *genLumiInfoHeader = new GenLumiInfoHeader();
50 
51  //fill information on randomized configs for parameter scans
52  genLumiInfoHeader->setRandomConfigIndex(randomIndex_);
53  if (randomIndex_>=0) {
55  }
56 
57  return genLumiInfoHeader;
58 
59  }
60 
61  void BaseHadronizer::randomizeIndex(edm::LuminosityBlock const& lumi, CLHEP::HepRandomEngine* rengine) {
62  if (randomInitWeights_.size()>0) {
63  //randomly select from a list of provided configuration sets (for parameter scans)
64 
65  //seeds std 32-bit mersene twister with HepRandomEngine state plus run and lumi section numbers
66  //(random engine state will be the same for every lumi section in a job)
67  std::vector<long unsigned int> seeds = rengine->put();
68  seeds.push_back(lumi.id().run());
69  seeds.push_back(lumi.id().luminosityBlock());
70  std::seed_seq seedseq(seeds.begin(),seeds.end());
71  std::mt19937 randgen(seedseq);
72  std::discrete_distribution<int> randdist(randomInitWeights_.begin(),randomInitWeights_.end());
73 
74  randomIndex_ = randdist(randgen);
75  }
76  }
77 
78  void BaseHadronizer::generateLHE(edm::LuminosityBlock const& lumi, CLHEP::HepRandomEngine* rengine) {
79 
80  if (gridpackPath().empty()) {
81  return;
82  }
83 
84  //get random seed from HepRandomEngine state plus run and lumi section numbers
85  //(random engine state will be the same for every lumi section in a job)
86  std::vector<long unsigned int> seeds = rengine->put();
87  seeds.push_back(lumi.id().run());
88  seeds.push_back(lumi.id().luminosityBlock());
89  std::seed_seq seedseq(seeds.begin(),seeds.end());
90  std::array<unsigned int,1> lheseed;
91  seedseq.generate(lheseed.begin(),lheseed.end());
92 
93  constexpr unsigned int maxseed = 30081*30081; //madgraph cannot handle seeds larger than this
94  unsigned int seedval = lheseed[0]%(maxseed+1);
95 
96  unsigned int nevents = edm::pset::Registry::instance()->getMapped(lumi.processHistory().rbegin()->parameterSetID())->getParameter<edm::ParameterSet>("@main_input").getUntrackedParameter<unsigned int>("numberEventsInLuminosityBlock");
97 
98  std::ostringstream nevStream;
99  nevStream << nevents;
100 
101  std::ostringstream randomStream;
102  randomStream << seedval;
103 
104  edm::FileInPath script("GeneratorInterface/LHEInterface/data/run_generic_tarball_cvmfs.sh");
105  const char *outfilename = "cmsgrid_final.lhe";
106 
107  char *args[5];
108  args[0] = strdup(script.fullPath().c_str());
109  args[1] = strdup(gridpackPath().c_str());
110  args[2] = strdup(nevStream.str().c_str());
111  args[3] = strdup(randomStream.str().c_str());
112  args[4] = NULL;
113 
114  pid_t pid = fork();
115 
116  if (pid == -1) {
117  // error, failed to fork()
118  throw cms::Exception("BaseHadronizer::generateLHE") << "Unable to fork a child";
119  }
120  else if (pid==0) {
121  //child
122  execvp(args[0],args);
123  _exit(1); // exec never returns
124  }
125  else {
126  //parent
127  int status;
128  waitpid(pid, &status, 0);
129  if (status) {
130  throw cms::Exception("BaseHadronizer::generateLHE") << "Failed to execute script";
131  }
132  }
133  FILE* lhef = std::fopen(outfilename, "r");
134  if (!lhef) {
135  throw cms::Exception("BaseHadronizer::generateLHE") << "Output file " << outfilename << " not found.";
136  }
137  std::fclose(lhef);
138 
140 
141  for (int iarg=0; iarg<4; ++iarg) {
142  delete[] args[iarg];
143  }
144 
145  }
146 
148  if (lheFile_.empty()) {
149  return;
150  }
151 
152  std::remove(lheFile_.c_str());
153  }
154 
155 }
const_reverse_iterator rbegin() const
LuminosityBlockID id() const
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
void setRandomConfigIndex(int idx)
void setConfigDescription(const std::string &str)
std::vector< double > randomInitWeights_
void setFilterEfficiency(double effic)
tuple lumi
Definition: fjr2json.py:35
BaseHadronizer(edm::ParameterSet const &ps)
bool exists(std::string const &parameterName) const
checks if a parameter exists
#define NULL
Definition: scimark2.h:8
void generateLHE(edm::LuminosityBlock const &lumi, CLHEP::HepRandomEngine *rengine)
std::string lheFile_
#define constexpr
void randomizeIndex(edm::LuminosityBlock const &lumi, CLHEP::HepRandomEngine *rengine)
GenRunInfoProduct & runInfo()
ProcessHistory const & processHistory() const
const std::string & randomInitConfigDescription() const
RunNumber_t run() const
bool getMapped(key_type const &k, value_type &result) const
Definition: Registry.cc:20
int nevents
std::vector< std::string > gridpackPaths_
std::vector< std::string > randomInitConfigDescriptions_
tuple pid
Definition: sysUtil.py:22
LuminosityBlockNumber_t luminosityBlock() const
const std::string & gridpackPath() const
std::string fullPath() const
Definition: FileInPath.cc:165
void setExternalXSecNLO(const XSec &xsec)
tuple status
Definition: ntuplemaker.py:245
void setExternalXSecLO(const XSec &xsec)
static const std::vector< std::string > theSharedResources
static Registry * instance()
Definition: Registry.cc:14
virtual GenLumiInfoHeader * getGenLumiInfoHeader() const