CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ZLONLOHistogrammer.cc
Go to the documentation of this file.
5 #include "TH1.h"
6 
8 public:
10 private:
11  virtual void analyze(const edm::Event& event, const edm::EventSetup& setup) override;
12  virtual void endJob() override;
15  unsigned int nbinsMass_, nbinsPt_, nbinsAng_;
20  TH1F *hardpt, *softpt, * hardeta, *softeta;
22  bool isMCatNLO_;
24 };
25 
30 
31 #include "HepMC/WeightContainer.h"
32 #include "HepMC/GenEvent.h"
38 #include <cmath>
39 #include <iostream>
40 
41 using namespace std;
42 using namespace reco;
43 using namespace edm;
44 
46  genToken_(consumes<GenParticleCollection>(pset.getParameter<InputTag>("genParticles"))),
47  weightsToken_(consumes<double>(pset.getParameter<InputTag>("weights"))),
48  nbinsMass_(pset.getUntrackedParameter<unsigned int>("nbinsMass")),
49  nbinsPt_(pset.getUntrackedParameter<unsigned int>("nbinsPt")),
50  nbinsAng_(pset.getUntrackedParameter<unsigned int>("nbinsAng")),
51  massMax_(pset.getUntrackedParameter<double>("massMax")),
52  ptMax_(pset.getUntrackedParameter<double>("ptMax")),
53  angMax_(pset.getUntrackedParameter<double>("angMax")),
54  accPtMin_(pset.getUntrackedParameter<double>("accPtMin")),
55  accMassMin_(pset.getUntrackedParameter<double>("accMassMin")),
56  accMassMax_(pset.getUntrackedParameter<double>("accMassMax")),
57  accEtaMin_(pset.getUntrackedParameter<double>("accEtaMin")),
58  accEtaMax_(pset.getUntrackedParameter<double>("accEtaMax")),
59  isMCatNLO_(pset.getUntrackedParameter<bool>("isMCatNLO")) {
60  cout << ">>> Z Histogrammer constructor" << endl;
62  TFileDirectory ZHisto = fs->mkdir( "ZRecHisto" );
63  TFileDirectory ZMCHisto = fs->mkdir( "ZMCHisto" );
64  h_nZ_ = ZHisto.make<TH1F>("ZNumber", "number of Z particles", 11, -0.5, 10.5);
65  h_mZ_ = ZHisto.make<TH1F>("ZMass", "Z mass (GeV/c^{2})", nbinsMass_, 0, massMax_);
66  h_ptZ_ = ZHisto.make<TH1F>("ZPt", "Z p_{t} (GeV/c)", nbinsPt_, 0, ptMax_);
67  h_phiZ_ = ZHisto.make<TH1F>("ZPhi", "Z #phi", nbinsAng_, -angMax_, angMax_);
68  h_thetaZ_ = ZHisto.make<TH1F>("Ztheta", "Z #theta", nbinsAng_, 0, angMax_);
69  h_etaZ_ = ZHisto.make<TH1F>("ZEta", "Z #eta", nbinsAng_, -angMax_, angMax_);
70  h_rapidityZ_ = ZHisto.make<TH1F>("ZRapidity", "Z rapidity", nbinsAng_, -angMax_, angMax_);
71  h_weight_histo = ZMCHisto.make<TH1F>("weight_histo","weight_histo",20,-10,10);
72 
73  h_mZMC_ = ZMCHisto.make<TH1F>("ZMCMass", "Z MC mass (GeV/c^{2})", nbinsMass_, 0, massMax_);
74  h_ptZMC_ = ZMCHisto.make<TH1F>("ZMCPt", "Z MC p_{t} (GeV/c)", nbinsPt_, 0, ptMax_);
75  hardpt = ZMCHisto.make<TH1F>("hardpt", "hard muon p_{t} (GeV/c)", nbinsPt_, 0, ptMax_);
76  softpt = ZMCHisto.make<TH1F>("softpt", "soft muon p_{t} (GeV/c)", nbinsPt_, 0, ptMax_);
77 
78 
79  h_phiZMC_ = ZMCHisto.make<TH1F>("ZMCPhi", "Z MC #phi", nbinsAng_, -angMax_, angMax_);
80  h_thetaZMC_ = ZMCHisto.make<TH1F>("ZMCTheta", "Z MC #theta", nbinsAng_, 0, angMax_);
81  h_etaZMC_ = ZMCHisto.make<TH1F>("ZMCEta", "Z MC #eta", nbinsAng_, -angMax_, angMax_);
82  h_rapidityZMC_ = ZMCHisto.make<TH1F>("ZMCRapidity", "Z MC y", nbinsAng_, -angMax_, angMax_);
83 
84  hardeta = ZMCHisto.make<TH1F>("hard muon eta", "hard muon #eta", nbinsAng_, -angMax_, angMax_);
85  softeta = ZMCHisto.make<TH1F>("soft muon eta", "soft muon #eta", nbinsAng_, -angMax_, angMax_);
86  nAcc_=0;
88 
89 }
90 
92  cout << ">>> Z Histogrammer analyze" << endl;
93 
96 
97  event.getByToken(genToken_, gen);
98  event.getByToken(weightsToken_, weights );
99 
100 
101 
102  // get weight and fill it to histogram
103 
104  double weight = * weights;
105  if(!weight) weight=1.;
106  h_weight_histo->Fill(weight);
107 
108  if(isMCatNLO_) {
109  weight > 0 ? weight=1. : weight=-1.;
110  }
111 
112 
113 
114  std::vector<GenParticle> muons;
115  if (!isMCatNLO_){
116  // LO....
117  for(unsigned int i = 0; i < gen->size(); ++i){
118  const GenParticle & muMC = (*gen)[i];
119  // filling only muons coming form Z
120  if (abs(muMC.pdgId())==13 && muMC.status()==1 && muMC.numberOfMothers()>0) {
121  if (muMC.mother()->numberOfMothers()> 0 ){
122  cout << "I'm getting a muon \n"
123  << "with " << "muMC.numberOfMothers() " << muMC.numberOfMothers() << "\n the first mother has pdgId " << muMC.mother()->pdgId()
124  << "with " << "muMC.mother()->numberOfMothers() " << muMC.mother()->numberOfMothers()<< "\n the first grandma has pdgId " << muMC.mother()->mother()->pdgId()<<endl;
125  if (muMC.mother()->mother()->pdgId() ==23 ) muons.push_back(muMC);
126  }
127  }
128  }
129  } else {
130  // NLO
131  for(unsigned int i = 0; i < gen->size(); ++i){
132  const GenParticle & muMC = (*gen)[i];
133  if (abs(muMC.pdgId())==13 && muMC.status()==1 && muMC.numberOfMothers()>0) { if (muMC.mother()->numberOfMothers()> 0 ){
134  cout << "I'm getting a muon \n"
135  << "with " << "muMC.numberOfMothers() " << muMC.numberOfMothers() << "\n the first mother has pdgId " << muMC.mother()->pdgId()
136  << "with " << "muMC.mother()->numberOfMothers() " << muMC.mother()->numberOfMothers()<< "\n the first grandma has pdgId " << muMC.mother()->mother()->pdgId()<<endl;
137  // filling withoput requiring that the grandma is a Z...... sometimes the grandma are still muons, otherwise those are fake muons, but the first two are always the desired muons....
138  muons.push_back(muMC);
139  }
140  }
141  }
142  }
143 
144  cout << "finally I selected " << muons.size() << " muons" << endl;
145 
146 
147 
148 
149 
150 // if there are at least two muons,
151  // calculate invarant mass of first two and fill it into histogram
152 
153  //if isMCatNLO_......
154 
155 
156 
157 
158  double inv_mass = 0.0;
159  double Zpt_ = 0.0;
160  double Zeta_ = 0.0;
161  double Ztheta_ = 0.0;
162  double Zphi_ = 0.0;
163  double Zrapidity_ = 0.0;
164 
165  if(muons.size()>1) {
166  if (muons[0].mother()->mother()->pdgId()==23 && muons[1].mother()->mother()->pdgId()==23) nBothMuHasZHasGrandMa_ ++;
167  math::XYZTLorentzVector tot_momentum(muons[0].p4());
168  math::XYZTLorentzVector mom2(muons[1].p4());
169  tot_momentum += mom2;
170  inv_mass = sqrt(tot_momentum.mass2());
171  Zpt_=tot_momentum.pt();
172  Zeta_ = tot_momentum.eta();
173  Ztheta_ = tot_momentum.theta();
174  Zphi_ = tot_momentum.phi();
175  Zrapidity_ = tot_momentum.Rapidity();
176 
177 
178 
179  // IMPORTANT: use the weight of the event ...
180 
181  double weight_sign = (weight > 0) ? 1. : -1.;
182  //double weight_sign = 1. ;
183  h_mZMC_->Fill(inv_mass,weight_sign);
184  h_ptZMC_->Fill(Zpt_,weight_sign);
185  h_etaZMC_->Fill(Zeta_,weight_sign);
186  h_thetaZMC_->Fill(Ztheta_,weight_sign);
187  h_phiZMC_->Fill(Zphi_,weight_sign);
188  h_rapidityZMC_-> Fill (Zrapidity_,weight_sign );
189 
190  double pt1 = muons[0].pt();
191  double pt2 = muons[1].pt();
192  double eta1 = muons[0].eta();
193  double eta2 = muons[1].eta();
194 
195 
196 
197  if(pt1>pt2) {
198  hardpt->Fill(pt1,weight_sign);
199  softpt->Fill(pt2,weight_sign);
200  hardeta->Fill(eta1,weight_sign);
201  softeta->Fill(eta2,weight_sign);
202  } else {
203  hardpt->Fill(pt2,weight_sign);
204  softpt->Fill(pt1,weight_sign);
205  hardeta->Fill(eta2,weight_sign);
206  softeta->Fill(eta1,weight_sign);
207  }
208 
209 
210  //evaluating the geometric acceptance
211  if ( pt1 >= accPtMin_ && pt2 >= accPtMin_ && fabs(eta1)>= accEtaMin_ && fabs(eta2) >= accEtaMin_ && fabs(eta1)<= accEtaMax_ && fabs(eta2) <= accEtaMax_ && inv_mass>= accMassMin_ && inv_mass<= accMassMax_) nAcc_++;
212 
213 
214  }
215 
216 }
217 
218 
220  cout << " number of events accepted :" << nAcc_ << endl;
221  cout << " number of total events :" << h_mZMC_->GetEntries() << endl;
222  cout << " number of cases in which BothMuHasZHasGrandMa :" << nBothMuHasZHasGrandMa_ << endl;
223  double eff = (double)nAcc_ / (double) h_mZMC_->GetEntries();
224  double err = sqrt( eff * (1. - eff) / (double) h_mZMC_->GetEntries() );
225  cout << " geometric acceptance: " << eff << "+/-" << err << endl;
226 }
228 
230 
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
int i
Definition: DBlmapReader.cc:9
virtual int pdgId() const
PDG identifier.
virtual const Candidate * mother(size_type i=0) const =0
return pointer to mother
virtual void analyze(const edm::Event &event, const edm::EventSetup &setup) override
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
virtual int status() const
status word
virtual size_type numberOfMothers() const =0
number of mothers (zero or one in most of but not all the cases)
virtual void endJob() override
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
edm::EDGetTokenT< double > weightsToken_
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
virtual size_t numberOfMothers() const
number of mothers
T sqrt(T t)
Definition: SSEVec.h:48
double p4[4]
Definition: TauolaWrapper.h:92
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ZLONLOHistogrammer(const edm::ParameterSet &pset)
T * make(const Args &...args) const
make new ROOT object
unsigned int nBothMuHasZHasGrandMa_
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
virtual int pdgId() const =0
PDG identifier.
TFileDirectory mkdir(const std::string &dir, const std::string &descr="")
create a new subdirectory
Definition: TFileService.h:69
edm::EDGetTokenT< reco::GenParticleCollection > genToken_
tuple muons
Definition: patZpeak.py:38
tuple cout
Definition: gather_cfg.py:121
int weight
Definition: histoStyle.py:50
virtual const Candidate * mother(size_type=0) const
return mother at a given position, i = 0, ... numberOfMothers() - 1 (read only mode) ...
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")