CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
LHECOMWeightProducer.cc
Go to the documentation of this file.
1 #include <memory>
2 
5 
9 
11 
15 
16 #include <sstream>
17 //class that reweights a pure parton level event from the originale COM energy to
18 //an energy that is < than original COM energy.
19 
20 //
21 // class declaration
22 //
24  public:
25  explicit LHECOMWeightProducer(const edm::ParameterSet&);
27 
28  private:
29  virtual void beginJob() ;
30  virtual void beginRun(edm::Run &run, const edm::EventSetup &es) ;
31  virtual void produce(edm::Event&, const edm::EventSetup&);
32  virtual void endJob() ;
33 
35  int _pdfset;
37  double _origECMS;
38  double _newECMS;
39  std::string _label;
40 };
41 
43 namespace LHAPDF {
44  void initPDFSet(int nset, int setid, int member=0);
45  int numberPDF(int nset);
46  void usePDFMember(int nset, int member);
47  double xfx(int nset, double x, double Q, int fl);
48  double getXmin(int nset, int member);
49  double getXmax(int nset, int member);
50  double getQ2min(int nset, int member);
51  double getQ2max(int nset, int member);
52  void extrapolate(bool extrapolate=true);
53 }
54 
57  lheTag_(pset.getParameter<edm::InputTag> ("lheSrc")),
58  _newECMS(pset.getParameter< double > ("NewECMS"))
59 {
60  std::stringstream labelStr;
61  labelStr << "com" << "To" << _newECMS;
62  _label = labelStr.str();
63  produces<GenEventInfoProduct>(_label);
64 }
65 
68 
71  using namespace edm;
73  run.getByLabel(lheTag_, lheRun);
74  //assumes the same pdf is used for both beams
75  _pdfset = lheRun->heprup().PDFSUP.first;
76  _pdfmember = lheRun->heprup().PDFGUP.first;
77  _origECMS = lheRun->heprup().EBMUP.first + lheRun->heprup().EBMUP.second;
78  edm::LogInfo("LHECOMWeightProducer") << "PDFSET: " << _pdfset << "; member: " << _pdfmember << "; COM energy: " << _origECMS;
79  if ( _newECMS > _origECMS )
80  throw cms::Exception("LHECOMWeightProducer") << "You cannot reweight COM energy to a higher than original energy ";
82 }
83 
84 
87  //LHAPDF::initPDFSet(1,pdfSetName_);
88 }
89 
92 
95 
96  using namespace std;
97  bool verbose = false;
98 
99  if (iEvent.isRealData()) return;
100 
102  iEvent.getByLabel(lheTag_, lheevent);
103 
104  float Q = lheevent->hepeup().SCALUP;
105 
106  int id1 = lheevent->hepeup().IDUP[0];
107  double x1 = fabs(lheevent->hepeup().PUP[0][2]/(_origECMS/2));
108  double x1prime = fabs(lheevent->hepeup().PUP[0][2]/(_newECMS/2));
109 
110  int id2 = lheevent->hepeup().IDUP[1];
111  double x2 = fabs(lheevent->hepeup().PUP[1][2]/(_origECMS/2));
112  double x2prime = fabs(lheevent->hepeup().PUP[1][2]/(_newECMS/2));
113 
114  LogTrace("LHECOMWeightProducer") << "*******LHECOMWeightProducer*******\n" <<
115  " Q : " << Q << "\n" <<
116  " id1: " << id1 << "\n" <<
117  " x1 : " << x1 << "\n" <<
118  " x1': " << x1prime << "\n" <<
119  " id2: " << id2 << "\n" <<
120  " x2 : " << x2 << "\n" <<
121  " x2': " << x2prime ;
122  //gluon is 0 in the LHAPDF numbering
123  if (id1 == 21)
124  id1 = 0;
125  if (id2 == 21)
126  id2 = 0;
127 
128  // Put PDF weights in the event
129  if (verbose)
130  cout << " Set : " << _pdfset << " member : " << _pdfmember << endl;
131 
133  double oldpdf1 = LHAPDF::xfx(1, x1, Q, id1)/x1;
134  double oldpdf2 = LHAPDF::xfx(1, x2, Q, id2)/x2;
135  double newpdf1 = LHAPDF::xfx(1, x1prime, Q, id1)/x1prime;
136  double newpdf2 = LHAPDF::xfx(1, x2prime, Q, id2)/x2prime;
137  LogTrace("LHECOMWeightProducer") <<
138  " xfx1 : " << oldpdf1 << "\n" <<
139  " xfx2 : " << oldpdf2 << "\n" <<
140  " xfx1': " << newpdf1 << "\n" <<
141  " xfx2': " << newpdf2 << "\n" <<
142  " weight:" << (newpdf1/oldpdf1)*(newpdf2/oldpdf2);
143  double weight = (newpdf1/oldpdf1)*(newpdf2/oldpdf2);
144  std::vector<double> weights;
145  weights.push_back(weight);
146  std::auto_ptr<GenEventInfoProduct> info(new GenEventInfoProduct());
147  info->setWeights(weights);
148  iEvent.put(info, _label);
149 }
150 
bool getByLabel(std::string const &label, Handle< PROD > &result) const
Definition: Run.h:177
virtual void produce(edm::Event &, const edm::EventSetup &)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
bool isRealData() const
Definition: EventBase.h:60
void initPDFSet(int nset, const std::string &filename, int member=0)
virtual void beginRun(edm::Run &run, const edm::EventSetup &es)
double getXmax(int nset, int member)
double getQ2max(int nset, int member)
int iEvent
Definition: GenABIO.cc:243
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:85
void extrapolate(bool extrapolate=true)
int numberPDF(int nset)
double getXmin(int nset, int member)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:356
#define LogTrace(id)
LHECOMWeightProducer(const edm::ParameterSet &)
double xfx(int nset, double x, double Q, int fl)
tuple cout
Definition: gather_cfg.py:121
double getQ2min(int nset, int member)
Definition: DDAxes.h:10
Definition: Run.h:33
void usePDFMember(int nset, int member)