CMS 3D CMS Logo

ZLONLOHistogrammer.cc
Go to the documentation of this file.
5 #include "TH1.h"
6 
8 public:
10 private:
11  void analyze(const edm::Event& event, const edm::EventSetup& setup) override;
12  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 pdgId() const final
PDG identifier.
void analyze(const edm::Event &event, const edm::EventSetup &setup) override
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
size_t numberOfMothers() const override
number of mothers
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:2
Definition: weight.py:1
virtual const Candidate * mother(size_type i=0) const =0
return pointer to mother
void endJob() override
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
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 int pdgId() const =0
PDG identifier.
T sqrt(T t)
Definition: SSEVec.h:18
double p4[4]
Definition: TauolaWrapper.h:92
virtual size_type numberOfMothers() const =0
number of mothers (zero or one in most of but not all the cases)
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_
def gen(fragment, howMuch)
Production test section ####.
TFileDirectory mkdir(const std::string &dir, const std::string &descr="")
create a new subdirectory
Definition: TFileService.h:69
edm::EDGetTokenT< reco::GenParticleCollection > genToken_
fixed size matrix
HLT enums.
int status() const final
status word
const Candidate * mother(size_type=0) const override
return mother at a given position, i = 0, ... numberOfMothers() - 1 (read only mode) ...
Definition: event.py:1