CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TauSpinnerCMS.cc
Go to the documentation of this file.
2 
3 //MC-TESTER header files
4 #include "Tauola/Tauola.h"
5 #include "TauSpinner/tau_reweight_lib.h"
6 #include "TauSpinner/Tauola_wrapper.h"
8 #include "TLorentzVector.h"
9 
10 #include "CLHEP/Random/RandomEngine.h"
14 
15 using namespace edm;
16 using namespace TauSpinner;
17 
18 CLHEP::HepRandomEngine* TauSpinnerCMS::fRandomEngine= nullptr;
19 
21 
23  isReco_(pset.getParameter<bool>("isReco"))
24  ,isTauolaConfigured_(pset.getParameter<bool>("isTauolaConfigured" ))
25  ,isLHPDFConfigured_(pset.getParameter<bool>("isLHPDFConfigured" ))
26  ,LHAPDFname_(pset.getUntrackedParameter("LHAPDFname",(string)("MSTW2008nnlo90cl.LHgrid")))
27  ,CMSEnergy_(pset.getParameter<double>("CMSEnergy"))//GeV
28  ,gensrc_(pset.getParameter<edm::InputTag>("gensrc"))
29  ,MotherPDGID_(pset.getUntrackedParameter("MotherPDGID",(int)(-1)))
30  ,Ipol_(pset.getUntrackedParameter("Ipol",(int)(0)))
31  ,nonSM2_(pset.getUntrackedParameter("nonSM2",(int)(0)))
32  ,nonSMN_(pset.getUntrackedParameter("nonSMN",(int)(0)))
33  ,roundOff_(pset.getUntrackedParameter("roundOff",(double)(0.01)))
34 {
35  produces<bool>("TauSpinnerWTisValid").setBranchAlias("TauSpinnerWTisValid");
36  produces<double>("TauSpinnerWT").setBranchAlias("TauSpinnerWT");
37  produces<double>("TauSpinnerWTFlip").setBranchAlias("TauSpinnerWTFlip");
38  produces<double>("TauSpinnerWThplus").setBranchAlias("TauSpinnerWThplus");
39  produces<double>("TauSpinnerWThminus").setBranchAlias("TauSpinnerWThminus");
40 
41 }
42 
44 {
46  if(!rng.isAvailable()) {
47  throw cms::Exception("Configuration")
48  << "The RandomNumberProducer module requires the RandomNumberGeneratorService\n"
49  "which appears to be absent. Please add that service to your configuration\n"
50  "or remove the modules that require it." << std::endl;
51  }
52  fRandomEngine = &rng->getEngine();
53 
55  Tauolapp::Tauola::setRandomGenerator(TauSpinnerCMS::flat);
56  Tauolapp::Tauola::initialize();
57  }
58  if(!isLHPDFConfigured_){
59  LHAPDF::initPDFSetByName(LHAPDFname_);
60  }
63  bool Ipp = true; // for pp collisions
64  // Initialize TauSpinner
65  //Ipol - polarization of input sample
66  //nonSM2 - nonstandard model calculations
67  //nonSMN
68  TauSpinner::initialize_spinner(Ipp,Ipol_,nonSM2_,nonSMN_,CMSEnergy_);
69  }
70 }
71 
73 
74  Tauolapp::Tauola::setRandomGenerator(TauSpinnerCMS::flat); // rest tauola++ random number incase other modules use tauola++
75  Tauolapp::jaki_.ktom = 1; // rest for when you run after tauola
76  double WT=1.0;
77  double WTFlip=1.0;
78  double polSM=-999; //range [-1,1]
79  SimpleParticle X, tau, tau2;
80  std::vector<SimpleParticle> tau_daughters, tau_daughters2;
81  int stat(0);
82  if(isReco_){
83  stat=readParticlesfromReco(e,X,tau,tau2,tau_daughters,tau_daughters2);
84  }
85  else{
86  Handle< HepMCProduct > EvtHandle ;
87  e.getByLabel( "generator", EvtHandle ) ;
88  const HepMC::GenEvent* Evt = EvtHandle->GetEvent() ;
89  stat=readParticlesFromHepMC(Evt,X,tau,tau2,tau_daughters,tau_daughters2);
90  }
91  if(MotherPDGID_<0 || abs(X.pdgid())==MotherPDGID_){
92  if(stat!=1){
93  // Determine the weight
94  if( abs(X.pdgid())==24 || abs(X.pdgid())==37 ){
95  TLorentzVector tau_1r(0,0,0,0);
96  TLorentzVector tau_1(tau.px(),tau.py(),tau.pz(),tau.e());
97  for(unsigned int i=0; i<tau_daughters.size();i++){
98  tau_1r+=TLorentzVector(tau_daughters.at(i).px(),tau_daughters.at(i).py(),tau_daughters.at(i).pz(),tau_daughters.at(i).e());
99  }
100  if(fabs(tau_1r.M()-tau_1.M())<roundOff_){
101  WT = TauSpinner::calculateWeightFromParticlesWorHpn(X, tau, tau2, tau_daughters); // note that tau2 is tau neutrino
102  polSM=getTauSpin();
103  WTFlip=(2.0-WT)/WT;
104  }
105  }
106  else if( X.pdgid()==25 || X.pdgid()==36 || X.pdgid()==22 || X.pdgid()==23 ){
107  TLorentzVector tau_1r(0,0,0,0), tau_2r(0,0,0,0);
108  TLorentzVector tau_1(tau.px(),tau.py(),tau.pz(),tau.e()), tau_2(tau2.px(),tau2.py(),tau2.pz(),tau2.e());
109  for(unsigned int i=0; i<tau_daughters.size();i++){
110  tau_1r+=TLorentzVector(tau_daughters.at(i).px(),tau_daughters.at(i).py(),tau_daughters.at(i).pz(),tau_daughters.at(i).e());
111  }
112  for(unsigned int i=0; i<tau_daughters2.size();i++){
113  tau_2r+=TLorentzVector(tau_daughters2.at(i).px(),tau_daughters2.at(i).py(),tau_daughters2.at(i).pz(),tau_daughters2.at(i).e());
114  }
115 
116  if(fabs(tau_1r.M()-tau_1.M())<roundOff_ && fabs(tau_2r.M()-tau_2.M())<roundOff_){
117  WT = TauSpinner::calculateWeightFromParticlesH(X, tau, tau2, tau_daughters,tau_daughters2);
118  //std::cout << "WT " << WT << std::endl;
119  polSM=getTauSpin();
120  if(X.pdgid()==25 || X.pdgid()==22 || X.pdgid()==23 ){
121  if(X.pdgid()==25) X.setPdgid(23);
122  if( X.pdgid()==22 || X.pdgid()==23 ) X.setPdgid(25);
123 
124  double WTother=TauSpinner::calculateWeightFromParticlesH(X, tau, tau2, tau_daughters,tau_daughters2);
125  WTFlip=WTother/WT;
126  }
127  }
128  }
129  else{
130  cout<<"TauSpinner: WARNING: Unexpected PDG for tau mother: "<<X.pdgid()<<endl;
131  }
132  }
133  }
134  bool isValid=true;
135  if(!(0<=WT && WT<10)){isValid=false; WT=1.0; WTFlip=1.0;}
136  std::auto_ptr<bool> TauSpinnerWeightisValid(new bool);
137  *TauSpinnerWeightisValid =isValid;
138  e.put(TauSpinnerWeightisValid,"TauSpinnerWTisValid");
139 
140  // regular weight
141  std::auto_ptr<double> TauSpinnerWeight(new double);
142  *TauSpinnerWeight =WT;
143  e.put(TauSpinnerWeight,"TauSpinnerWT");
144 
145  // flipped weight (ie Z->H or H->Z)
146  std::auto_ptr<double> TauSpinnerWeightFlip(new double);
147  *TauSpinnerWeightFlip =WTFlip;
148  e.put(TauSpinnerWeightFlip,"TauSpinnerWTFlip");
149 
150  // h+ polarization
151  double WThplus=WT;
152  if(polSM<0.0 && polSM!=-999 && isValid) WThplus=0;
153  std::auto_ptr<double> TauSpinnerWeighthplus(new double);
154  *TauSpinnerWeighthplus = WThplus;
155  e.put(TauSpinnerWeighthplus,"TauSpinnerWThplus");
156 
157  // h- polarization
158  double WThminus=WT;
159  if(polSM>0.0&& polSM!=-999 && isValid) WThminus=0;
160  std::auto_ptr<double> TauSpinnerWeighthminus(new double);
161  *TauSpinnerWeighthminus = WThminus;
162  e.put(TauSpinnerWeighthminus,"TauSpinnerWThminus");
163  return ;
164 }
165 
167 
169 
170 int TauSpinnerCMS::readParticlesfromReco(edm::Event& e,SimpleParticle &X,SimpleParticle &tau,SimpleParticle &tau2,
171  std::vector<SimpleParticle> &tau_daughters,std::vector<SimpleParticle> &tau2_daughters){
173  e.getByLabel(gensrc_, genParticles);
174  for(reco::GenParticleCollection::const_iterator itr = genParticles->begin(); itr!= genParticles->end(); ++itr){
175  int pdgid=abs(itr->pdgId());
176  if(pdgid==24 || pdgid==37 || pdgid ==25 || pdgid==36 || pdgid==22 || pdgid==23 ){
177  const reco::GenParticle *hx=&(*itr);
178  if(!isFirst(hx)) continue;
179  GetLastSelf(hx);
180  const reco::GenParticle *recotau1=NULL;
181  const reco::GenParticle *recotau2=NULL;
182  unsigned int ntau(0),ntauornu(0);
183  for(unsigned int i=0; i<itr->numberOfDaughters(); i++){
184  const reco::Candidate *dau=itr->daughter(i);
185  if(abs(dau->pdgId())!=pdgid){
186  if(abs(dau->pdgId())==15 || abs(dau->pdgId())==16){
187  if(ntau==0 && abs(dau->pdgId())==15){
188  recotau1=static_cast<const reco::GenParticle*>(dau);
189  GetLastSelf(recotau1);
190  ntau++;
191  }
192  else if((ntau==1 && abs(dau->pdgId())==15) || abs(dau->pdgId())==16){
193  recotau2=static_cast<const reco::GenParticle*>(dau);
194  if(abs(dau->pdgId())==15){ntau++;GetLastSelf(recotau2);}
195  }
196  ntauornu++;
197  }
198  }
199  }
200  if((ntau==2 && ntauornu==2) || (ntau==1 && ntauornu==2)){
201  X.setPx(itr->p4().Px());
202  X.setPy(itr->p4().Py());
203  X.setPz(itr->p4().Pz());
204  X.setE (itr->p4().E());
205  X.setPdgid(itr->pdgId());
206  tau.setPx(recotau1->p4().Px());
207  tau.setPy(recotau1->p4().Py());
208  tau.setPz(recotau1->p4().Pz());
209  tau.setE (recotau1->p4().E());
210  tau.setPdgid(recotau1->pdgId());
211  GetRecoDaughters(recotau1,tau_daughters,recotau1->pdgId());
212  tau2.setPx(recotau2->p4().Px());
213  tau2.setPy(recotau2->p4().Py());
214  tau2.setPz(recotau2->p4().Pz());
215  tau2.setE (recotau2->p4().E());
216  tau2.setPdgid(recotau2->pdgId());
217  if(ntau==2)GetRecoDaughters(recotau2,tau2_daughters,recotau2->pdgId());
218  return 0;
219  }
220  }
221  }
222  return 1;
223 }
224 
226  for (unsigned int i=0; i< Particle->numberOfDaughters(); i++){
227  const reco::GenParticle *dau=static_cast<const reco::GenParticle*>(Particle->daughter(i));
228  if(Particle->pdgId()==dau->pdgId()){
229  Particle=dau;
230  GetLastSelf(Particle);
231  }
232  }
233 }
234 
236  for (unsigned int i=0; i< Particle->numberOfMothers(); i++){
237  const reco::GenParticle *moth=static_cast<const reco::GenParticle*>(Particle->mother(i));
238  if(Particle->pdgId()==moth->pdgId()){
239  return false;
240  }
241  }
242  return true;
243 }
244 
245 void TauSpinnerCMS::GetRecoDaughters(const reco::GenParticle *Particle,std::vector<SimpleParticle> &daughters, int parentpdgid){
246  if( Particle->numberOfDaughters()==0 || abs(Particle->pdgId())==111){
247  SimpleParticle tp(Particle->p4().Px(), Particle->p4().Py(), Particle->p4().Pz(), Particle->p4().E(), Particle->pdgId());
248  daughters.push_back(tp);
249  return;
250  }
251  for (unsigned int i=0; i< Particle->numberOfDaughters(); i++){
252  const reco::Candidate *dau=Particle->daughter(i);
253  GetRecoDaughters(static_cast<const reco::GenParticle*>(dau),daughters,Particle->pdgId());
254  }
255 }
256 
258  if ( !fRandomEngine ) {
259  throw cms::Exception("LogicError")
260  << "TauSpinnerCMS::flat: Attempt to generate random number when engine pointer is null\n"
261  << "This might mean that the code was modified to generate a random number outside the\n"
262  << "event and beginLuminosityBlock methods, which is not allowed.\n";
263  }
264  return fRandomEngine->flat();
265 }
266 
int i
Definition: DBlmapReader.cc:9
virtual int pdgId() const
PDG identifier.
void GetLastSelf(const reco::GenParticle *Particle)
virtual const Candidate * daughter(size_type i) const =0
return daughter at a given position, i = 0, ... numberOfDaughters() - 1 (read only mode) ...
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
static double flat()
bool isFirst(const reco::GenParticle *Particle)
int readParticlesFromHepMC(const HepMC::GenEvent *event, SimpleParticle &X, SimpleParticle &tau, SimpleParticle &tau2, std::vector< SimpleParticle > &tau_daughters, std::vector< SimpleParticle > &tau2_daughters)
#define X(str)
Definition: MuonsGrabber.cc:49
#define abs(x)
Definition: mlp_lapack.h:159
#define NULL
Definition: scimark2.h:8
double roundOff_
Definition: TauSpinnerCMS.h:74
virtual void endJob()
static CLHEP::HepRandomEngine * fRandomEngine
Definition: TauSpinnerCMS.h:75
void GetRecoDaughters(const reco::GenParticle *Particle, std::vector< TauSpinner::SimpleParticle > &daughters, int parentpdgid)
static bool isTauSpinnerConfigure
Definition: TauSpinnerCMS.h:60
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:85
virtual size_t numberOfMothers() const
number of mothers
virtual size_t numberOfDaughters() const
number of daughters
virtual const Candidate * daughter(size_type) const
return daughter at a given position, i = 0, ... numberOfDaughters() - 1 (read only mode) ...
bool isAvailable() const
Definition: Service.h:47
int readParticlesfromReco(edm::Event &e, TauSpinner::SimpleParticle &X, TauSpinner::SimpleParticle &tau, TauSpinner::SimpleParticle &tau2, std::vector< TauSpinner::SimpleParticle > &tau_daughters, std::vector< TauSpinner::SimpleParticle > &tau2_daughters)
virtual CLHEP::HepRandomEngine & getEngine() const =0
Use this to get the random number engine, this is the only function most users should call...
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:356
virtual int pdgId() const =0
PDG identifier.
bool isTauolaConfigured_
Definition: TauSpinnerCMS.h:54
std::string LHAPDFname_
Definition: TauSpinnerCMS.h:56
virtual void produce(edm::Event &, const edm::EventSetup &)
edm::InputTag gensrc_
Definition: TauSpinnerCMS.h:58
virtual void endRun(const edm::Run &, const edm::EventSetup &)
TauSpinnerCMS(const edm::ParameterSet &)
double CMSEnergy_
Definition: TauSpinnerCMS.h:57
tuple cout
Definition: gather_cfg.py:121
virtual void beginJob()
bool isLHPDFConfigured_
Definition: TauSpinnerCMS.h:55
virtual const LorentzVector & p4() const
four-momentum Lorentz vector
virtual const Candidate * mother(size_type=0) const
return mother at a given position, i = 0, ... numberOfMothers() - 1 (read only mode) ...
Definition: Run.h:33