CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 int JetMatchingAlpgen::match(const HepMC::GenEvent *partonLevel,
139  const HepMC::GenEvent *finalState,
140  bool showeredFinalState)
141 {
142  if (!showeredFinalState)
143  throw cms::Exception("Generator|PartonShowerVeto")
144  << "Alpgen matching expected parton shower "
145  "final state." << std::endl;
146 
147  if (!runInitialized)
148  throw cms::Exception("Generator|PartonShowerVeto")
149  << "Run not initialized in JetMatchingAlpgen"
150  << std::endl;
151 
152  if (!eventInitialized)
153  throw cms::Exception("Generator|PartonShowerVeto")
154  << "Event not initialized in JetMatchingAlpgen"
155  << std::endl;
156 
157  // If matching not required (e.g., icckw = 0), don't run the
158  // FORTRAN veto code.
159  if(!applyMatching) return 0;
160 
161  // Call the Fortran veto code.
162  int veto = 0;
163  alveto_(&veto);
164 
165  eventInitialized = false;
166 
167  // If event was vetoed, the variable veto will contain the number 1.
168  // In this case, we must return 1 - that will be used as the return value from UPVETO.
169  // If event was accepted, the variable veto will contain the number 0.
170  // In this case, we must return 0 - that will be used as the return value from UPVETO.
171  return veto ? 1 : 0;
172 }
173 
174 void alshcd_(char csho[3])
175 {
176  std::strncpy(csho, "PYT", 3); // or "HER"
177 }
178 
179 void alshen_()
180 {
181 }
182 
183 } // end namespace gen
T getParameter(std::string const &) const
int match(const HepMC::GenEvent *partonLevel, const HepMC::GenEvent *finalState, bool showeredFinalState)
struct AHPPARA ahppara_
void alsetp_()
std::map< Parameter, double > params
Definition: AlpgenHeader.h:67
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)
std::set< std::string > capabilities() const
tuple result
Definition: query.py:137
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
double rclus
double parval[nparam]
void pyupre_()
static const unsigned int nparam
unsigned int ihrd
Definition: AlpgenHeader.h:68
struct AHPARS ahpars_
void beforeHadronisation(const lhef::LHEEvent *event)
std::vector< std::string > findHeader(const std::string &tag) const
Definition: LHERunInfo.cc:529
double etclus
double masses[MASS_MAX]
Definition: AlpgenHeader.h:73
void dbpart_()
void alveto_(int *ipveto)