CMS 3D CMS Logo

JetMatchingAlpgen.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <cstring>
3 #include <vector>
4 #include <memory>
5 #include <string>
6 
7 #include <HepMC/GenEvent.h>
8 
11 
15 
16 namespace gen {
17 
18 extern "C" {
19  // Put here all the functions for interfacing Fortran code.
20 
21 // extern void alinit_();
22  extern void alsetp_();
23 // extern void alevnt_();
24  extern void alveto_(int *ipveto);
25 
26  extern void dbpart_();
27  extern void pyupre_();
28 
29  void alshcd_(char csho[3]);
30  void alshen_();
31 } // extern "C"
32 
33 // Constructor
35  JetMatching(params),
36  applyMatching(params.getParameter<bool>("applyMatching")),
37  runInitialized(false)
38 {
39  ahopts_.etclus = params.getParameter<double>("etMin");
40  ahopts_.rclus = params.getParameter<double>("drMin");
41  ahopts_.iexc = params.getParameter<bool>("exclusive");
42 }
43 
44 // Destructor
46 {
47 }
48 
49 std::set<std::string> JetMatchingAlpgen::capabilities() const
50 {
51  std::set<std::string> result;
52  result.insert("psFinalState");
53  result.insert("hepevt");
54  result.insert("pythia6");
55  return result;
56 }
57 
58 // Implements the Alpgen MLM method - use alpg_match.F
59 
61 {
62 
63  // Read Alpgen run card stored in the LHERunInfo object.
64  std::vector<std::string> headerLines = runInfo->findHeader("AlpgenUnwParFile");
65  if (headerLines.empty())
66  throw cms::Exception("Generator|PartonShowerVeto")
67  << "In order to use Alpgen jet matching, "
68  "the input file has to contain the corresponding "
69  "Alpgen headers." << std::endl;
70 
71  // Parse the header using its bultin function.
72  header.parse(headerLines.begin(), headerLines.end());
73 
74  // I don't want to print this right now.
75 // std::cout << "Alpgen header" << std::endl;
76 // std::cout << "========================" << std::endl;
77 // std::cout << "\tihrd = " << header.ihrd << std::endl;
78 // std::cout << "\tmc = " << header.masses[AlpgenHeader::mc]
79 // << ", mb = " << header.masses[AlpgenHeader::mb]
80 // << ", mt = " << header.masses[AlpgenHeader::mt]
81 // << ", mw = " << header.masses[AlpgenHeader::mw]
82 // << ", mz = " << header.masses[AlpgenHeader::mz]
83 // << ", mh = " << header.masses[AlpgenHeader::mh]
84 // << std::endl;
85 // for(std::map<AlpgenHeader::Parameter, double>::const_iterator iter =
86 // header.params.begin(); iter != header.params.end(); ++iter)
87 // std::cout << "\t" << AlpgenHeader::parameterName(iter->first)
88 // << " = " << iter->second << std::endl;
89 // std::cout << "\txsec = " << header.xsec
90 // << " +-" << header.xsecErr << std::endl;
91 // std::cout << "========================" << std::endl;
92 
93  // Here we pass a few header variables to common block and
94  // call Alpgen init routine to do the rest.
95  // The variables passed first are the ones directly that
96  // need to be set up "manually": IHRD and the masses.
97  // (ebeam is set just to mimic the original code)
98  // Afterwards, we pass the full spectrum of Alpgen
99  // parameters directly into the AHPARS structure, to be
100  // treated by AHSPAR which is called inside alsetp_().
101 
105 
106  for(std::map<AlpgenHeader::Parameter, double>::const_iterator iter =
107  header.params.begin(); iter != header.params.end(); ++iter) {
108  if (iter->first <= 0 || iter->first >= (int)AHPARS::nparam - 1)
109  continue;
110  ahpars_.parval[(int)iter->first - 1] = iter->second;
111  }
112 
113  // Run the rest of the setup.
114  alsetp_();
115 
116  // When we reach this point, the run is fully initialized.
117  runInitialized = true;
118 }
119 
121 {
122  // We can't continue if the run has not been initialized.
123  if (!runInitialized)
124  throw cms::Exception("Generator|PartonShowerVeto")
125  << "Run not initialized in JetMatchingAlpgen"
126  << std::endl;
127 
128  // We are called just after LHEInterface has filled in
129  // the Fortran common block (and Pythia6 called UPEVNT).
130 
131  // Possibly not interesting for us.
132  // (except perhaps for debugging?)
133  // pyupre_();
134  // dbpart_();
135  eventInitialized = true;
136 }
137 
138 /*
139 int JetMatchingAlpgen::match(const HepMC::GenEvent *partonLevel,
140  const HepMC::GenEvent *finalState,
141  bool showeredFinalState)
142 */
143 int JetMatchingAlpgen::match( const lhef::LHEEvent* partonLevel, const std::vector<fastjet::PseudoJet>* jetInput )
144 {
145 
146 /*
147  if (!showeredFinalState)
148  throw cms::Exception("Generator|PartonShowerVeto")
149  << "Alpgen matching expected parton shower "
150  "final state." << std::endl;
151 */
152 
153  if (!runInitialized)
154  throw cms::Exception("Generator|PartonShowerVeto")
155  << "Run not initialized in JetMatchingAlpgen"
156  << std::endl;
157 
158  if (!eventInitialized)
159  throw cms::Exception("Generator|PartonShowerVeto")
160  << "Event not initialized in JetMatchingAlpgen"
161  << std::endl;
162 
163  // If matching not required (e.g., icckw = 0), don't run the
164  // FORTRAN veto code.
165  if(!applyMatching) return 0;
166 
167  // Call the Fortran veto code.
168  int veto = 0;
169  alveto_(&veto);
170 
171  eventInitialized = false;
172 
173  // If event was vetoed, the variable veto will contain the number 1.
174  // In this case, we must return 1 - that will be used as the return value from UPVETO.
175  // If event was accepted, the variable veto will contain the number 0.
176  // In this case, we must return 0 - that will be used as the return value from UPVETO.
177  return veto ? 1 : 0;
178 }
179 
180 void alshcd_(char csho[3])
181 {
182  std::strncpy(csho, "PYT", 3); // or "HER"
183 }
184 
185 void alshen_()
186 {
187 }
188 
189 } // end namespace gen
T getParameter(std::string const &) const
struct AHPPARA ahppara_
void alsetp_()
std::map< Parameter, double > params
Definition: AlpgenHeader.h:67
void beforeHadronisation(const lhef::LHEEvent *event) override
bool parse(const std::vector< std::string >::const_iterator &begin, const std::vector< std::string >::const_iterator &end)
Definition: AlpgenHeader.cc:67
JetMatchingAlpgen(const edm::ParameterSet &params)
void alshcd_(char csho[3])
void alshen_()
double masses[6]
struct AHOPTS ahopts_
void init(const lhef::LHERunInfo *runInfo) override
int match(const lhef::LHEEvent *partonLevel, const std::vector< fastjet::PseudoJet > *jetInput) override
double rclus
double parval[nparam]
void pyupre_()
static const unsigned int nparam
unsigned int ihrd
Definition: AlpgenHeader.h:68
struct AHPARS ahpars_
std::vector< std::string > findHeader(const std::string &tag) const
Definition: LHERunInfo.cc:525
double etclus
std::set< std::string > capabilities() const override
double masses[MASS_MAX]
Definition: AlpgenHeader.h:73
void dbpart_()
Definition: event.py:1
void alveto_(int *ipveto)