CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ZMuPtScaleAnalyzer.cc
Go to the documentation of this file.
5 #include "TH1.h"
6 #include "TRandom3.h"
7 
8 
10 public:
12 private:
13  virtual void analyze(const edm::Event& event, const edm::EventSetup& setup) override;
14  virtual void endJob() override;
16  unsigned int nbinsMass_, nbinsPt_, nbinsAng_;
21  TH1F *hardpt, *softpt, * hardeta, *softeta;
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  nbinsMass_(pset.getUntrackedParameter<unsigned int>("nbinsMass")),
48  nbinsPt_(pset.getUntrackedParameter<unsigned int>("nbinsPt")),
49  nbinsAng_(pset.getUntrackedParameter<unsigned int>("nbinsAng")),
50  massMax_(pset.getUntrackedParameter<double>("massMax")),
51  ptMax_(pset.getUntrackedParameter<double>("ptMax")),
52  angMax_(pset.getUntrackedParameter<double>("angMax")),
53  accPtMin_(pset.getUntrackedParameter<double>("accPtMin")),
54  accMassMin_(pset.getUntrackedParameter<double>("accMassMin")),
55  accMassMax_(pset.getUntrackedParameter<double>("accMassMax")),
56  accMassMinDen_(pset.getUntrackedParameter<double>("accMassMinDen")),
57  accMassMaxDen_(pset.getUntrackedParameter<double>("accMassMaxDen")),
58  accEtaMin_(pset.getUntrackedParameter<double>("accEtaMin")),
59  accEtaMax_(pset.getUntrackedParameter<double>("accEtaMax")),
60  ptScale_(pset.getUntrackedParameter<double>("ptScale")),
61  muPdgStatus_(pset.getUntrackedParameter<int>("muPdgStatus")){
62 
63  cout << ">>> Z Histogrammer constructor" << endl;
65  TFileDirectory ZMCHisto = fs->mkdir( "ZMCHisto" );
66 
67  h_mZMC_ = ZMCHisto.make<TH1F>("ZMCMass", "Z MC mass (GeV/c^{2})", nbinsMass_, 0, massMax_);
68  h_ptZMC_ = ZMCHisto.make<TH1F>("ZMCPt", "Z MC p_{t} (GeV/c)", nbinsPt_, 0, ptMax_);
69  hardpt = ZMCHisto.make<TH1F>("hardpt", "hard muon p_{t} (GeV/c)", nbinsPt_, 0, ptMax_);
70  softpt = ZMCHisto.make<TH1F>("softpt", "soft muon p_{t} (GeV/c)", nbinsPt_, 0, ptMax_);
71 
72 
73  h_phiZMC_ = ZMCHisto.make<TH1F>("ZMCPhi", "Z MC #phi", nbinsAng_, -angMax_, angMax_);
74  h_thetaZMC_ = ZMCHisto.make<TH1F>("ZMCTheta", "Z MC #theta", nbinsAng_, 0, angMax_);
75  h_etaZMC_ = ZMCHisto.make<TH1F>("ZMCEta", "Z MC #eta", nbinsAng_, -angMax_, angMax_);
76  h_rapidityZMC_ = ZMCHisto.make<TH1F>("ZMCRapidity", "Z MC y", nbinsAng_, -angMax_, angMax_);
77 
78  hardeta = ZMCHisto.make<TH1F>("hard muon eta", "hard muon #eta", nbinsAng_, -angMax_, angMax_);
79  softeta = ZMCHisto.make<TH1F>("soft muon eta", "soft muon #eta", nbinsAng_, -angMax_, angMax_);
80  nAcc_=0;
81  nAccPtScaleP_=0;
82  nAccPtScaleN_=0;
86 
87 
88 
90  cout << ">>> Z HistogrammerZLONLOHistogrammer.cc analyze" << endl;
91 
94 
95  event.getByToken(genToken_, gen);
96 
97 
98 
99 
100  // get weight and fill it to histogram
101 
102 
103 
104 
105  std::vector<GenParticle> muons;
106 
107  double mZGen = -100;
108 
109  for(unsigned int i = 0; i < gen->size(); ++i){
110  const GenParticle & muMC = (*gen)[i];
111  // filliScaledPng only muons coming form Z
112  if (abs(muMC.pdgId())==13 && muMC.status()==muPdgStatus_ && muMC.numberOfMothers()>0) {
113 
114  cout << "I'm getting a muon \n"
115  << "with " << "muMC.numberOfMothers() " << muMC.numberOfMothers() << "\n the first mother has pdgId " << muMC.mother()->pdgId()
116  << "with " << "muMC.mother()->numberOfMothers() " << muMC.mother()->numberOfMothers()<< "\n the first grandma has pdgId " << muMC.mother()->mother()->pdgId()<<endl;
117  cout << "with muMC.eta() " << muMC.eta()<<endl;
118  muons.push_back(muMC);
119  }
120  // introducing here the gen mass cut......................
121  /*
122  if (muPdgStatus_ ==1) {
123  mZGen = muMC.mother()->mother()->mass();
124  if (muMC.mother()->mother()->pdgId() ==23 && mZGen>accMassMinDen_ && mZGen<accMassMaxDen_ ) muons.push_back(muMC);}
125  }
126  if (muPdgStatus_ ==3) {
127  mZGen = muMC.mother()->mass();
128  if (muMC.mother()->pdgId() ==23 && mZGen>accMassMinDen_ && mZGen<accMassMaxDen_ ) muons.push_back(muMC);}
129  }
130 */
131 
132 
133  const GenParticle & zMC = (*gen)[i];
134  if (zMC.pdgId()==23 && zMC.status()==3 &&zMC.numberOfDaughters()>1 ) {
135  mZGen = zMC.mass();
136  cout << "I'm selecting a Z MC with mass " << mZGen << endl;
137  if(mZGen>accMassMinDen_ && mZGen<accMassMaxDen_ ) h_mZMC_->Fill(mZGen);
138 
139 
140 
141  }
142  }
143 
144 
145  cout << "finally I selected " << muons.size() << " muons" << endl;
146 
147 
148 
149 
150 
151 // if there are at least two muons,
152  // calculate invarant mass of first two and fill it into histogram
153 
154 
155 
156  double inv_mass = 0.0;
157  double Zpt_ = 0.0;
158  double Zeta_ = 0.0;
159  double Ztheta_ = 0.0;
160  double Zphi_ = 0.0;
161  double Zrapidity_ = 0.0;
162 
163  if(muons.size()>1) {
164 
165 
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 
180  double weight_sign = 1. ;
181 
182  //h_mZMC_->Fill(inv_mass);
183  h_ptZMC_->Fill(Zpt_,weight_sign);
184  h_etaZMC_->Fill(Zeta_,weight_sign);
185  h_thetaZMC_->Fill(Ztheta_,weight_sign);
186  h_phiZMC_->Fill(Zphi_,weight_sign);
187  h_rapidityZMC_-> Fill (Zrapidity_,weight_sign );
188 
189  double pt1 = muons[0].pt();
190  double pt2 = muons[1].pt();
191  double eta1 = muons[0].eta();
192  double eta2 = muons[1].eta();
193 
194 
195 
196 
197 
198  if(pt1>pt2) {
199  hardpt->Fill(pt1,weight_sign);
200  softpt->Fill(pt2,weight_sign);
201  hardeta->Fill(eta1,weight_sign);
202  softeta->Fill(eta2,weight_sign);
203  } else {
204  hardpt->Fill(pt2,weight_sign);
205  softpt->Fill(pt1,weight_sign);
206  hardeta->Fill(eta2,weight_sign);
207  softeta->Fill(eta1,weight_sign);
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  cout << "pt1" << pt1 << endl;
215 
216  // scaling the muon pt
217  double pt1ScaledP = pt1* ( 1. + ptScale_);
218  cout << "pt1 ScaledP of " << ( 1. + ptScale_) << endl;
219  cout << "pt1ScaledP" << pt1ScaledP << endl;
220 
221  double pt2ScaledP = pt2 * ( 1. + ptScale_);
222 
223 
224  //evaluating the geometric acceptance
225  if ( pt1ScaledP >= accPtMin_ && pt2ScaledP >= accPtMin_ && fabs(eta1)>= accEtaMin_ && fabs(eta2) >= accEtaMin_ && fabs(eta1)<= accEtaMax_ && fabs(eta2) <= accEtaMax_ && inv_mass>= accMassMin_ && inv_mass<= accMassMax_)
226 nAccPtScaleP_++;
227 
228 
229 
230 
231  // scaling the muon pt
232  double pt1ScaledN = pt1* ( 1. - ptScale_);
233  double pt2ScaledN = pt2 * ( 1. - ptScale_);
234 
235 
236  //evaluating the geometric acceptance
237  if ( pt1ScaledN >= accPtMin_ && pt2ScaledN >= accPtMin_ && fabs(eta1)>= accEtaMin_ && fabs(eta2) >= accEtaMin_ && fabs(eta1)<= accEtaMax_ && fabs(eta2) <= accEtaMax_ && inv_mass>= accMassMin_ && inv_mass<= accMassMax_)
238 nAccPtScaleN_++;
239 
240 
241  // scaling the muon pt
242  TRandom3 f;
243  f.SetSeed(123456789);
244  double pt1SmearedFlat = pt1* ( 1. + ptScale_ * f.Uniform() );
245  double pt2SmearedFlat = pt2 * ( 1. + ptScale_ * f.Uniform() ) ;
246 
247 
248  //evaluating the geometric acceptance
249  if ( pt1SmearedFlat >= accPtMin_ && pt2SmearedFlat >= accPtMin_ && fabs(eta1)>= accEtaMin_ && fabs(eta2) >= accEtaMin_ && fabs(eta1)<= accEtaMax_ && fabs(eta2) <= accEtaMax_ && inv_mass>= accMassMin_ && inv_mass<= accMassMax_)
251 
252 
253 // scaling the muon pt
254  TRandom3 ff;
255  ff.SetSeed(123456789);
256  double pt1SmearedGaus = pt1* ( 1. + ptScale_ * f.Gaus() );
257  double pt2SmearedGaus = pt2 * ( 1. + ptScale_ * f.Gaus() ) ;
258 
259 
260  //evaluating the geometric acceptance
261  if ( pt1SmearedGaus >= accPtMin_ && pt2SmearedGaus >= accPtMin_ && fabs(eta1)>= accEtaMin_ && fabs(eta2) >= accEtaMin_ && fabs(eta1)<= accEtaMax_ && fabs(eta2) <= accEtaMax_ && inv_mass>= accMassMin_ && inv_mass<= accMassMax_)
263 
264 
265 
266 
267  }}
268 
269 
270 
271 
273  cout << " number of events accepted :" << nAcc_ << endl;
274  cout << " number of total events :" << h_mZMC_->GetEntries() << endl;
275  cout << " number of cases in which BothMuHasZHasGrandMa :" << nBothMuHasZHasGrandMa_ << endl;
276  cout << " number of events pt scaled positively accepted :" << nAccPtScaleP_ << endl;
277 
278  cout << " number of events pt scaled negatively accepted :" << nAccPtScaleN_ << endl;
279 
280 cout << " number of events pt scaled smeared flattely accepted :" << nAccPtScaleSmearedFlat_ << endl;
281 
282 cout << " number of events pt scaled smeared gaussianely accepted :" << nAccPtScaleSmearedGaus_ << endl;
283 
284 
285  double eff = (double)nAcc_ / (double) h_mZMC_->GetEntries();
286  double err = sqrt( eff * (1. - eff) / (double) h_mZMC_->GetEntries() );
287  cout << " geometric acceptance: " << eff << "+/-" << err << endl;
288 
289  double effScaledP = (double)nAccPtScaleP_ / (double) h_mZMC_->GetEntries();
290  double errScaledP = sqrt( effScaledP * (1. - effScaledP) / (double) h_mZMC_->GetEntries() );
291  cout << " geometric acceptance when pt muon is positively scaled: " << effScaledP << "+/-" << errScaledP << endl;
292 
293  double effScaledN = (double)nAccPtScaleN_ / (double) h_mZMC_->GetEntries();
294  double errScaledN = sqrt( effScaledN * (1. - effScaledN) / (double) h_mZMC_->GetEntries() );
295  cout << " geometric acceptance when pt muon is negatively scaled: " << effScaledN << "+/-" << errScaledN << endl;
296 
297  double effSmearedFlat = (double) nAccPtScaleSmearedFlat_ / (double) h_mZMC_->GetEntries();
298  double errSmearedFlat = sqrt( effSmearedFlat * (1. - effSmearedFlat) / (double) h_mZMC_->GetEntries() );
299  cout << " geometric acceptance when pt muon is scaled with a flat smaering: " << effSmearedFlat << "+/-" << errSmearedFlat << endl;
300 
301  double effSmearedGaus = (double) nAccPtScaleSmearedGaus_ / (double) h_mZMC_->GetEntries();
302  double errSmearedGaus = sqrt( effSmearedGaus * (1. - effSmearedGaus) / (double) h_mZMC_->GetEntries() );
303  cout << " geometric acceptance when pt muon is scaled with a gaussian smearing: " << effSmearedGaus << "+/-" << errSmearedGaus << endl;
304 
305 
306 }
308 
310 
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
int i
Definition: DBlmapReader.cc:9
ZMuPtScaleAnalyzer(const edm::ParameterSet &pset)
virtual const Candidate * mother(size_type i=0) const =0
return pointer to mother
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
unsigned int nAccPtScaleP_
virtual size_type numberOfMothers() const =0
number of mothers (zero or one in most of but not all the cases)
edm::EDGetTokenT< reco::GenParticleCollection > genToken_
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
virtual int status() const final
status word
unsigned int nBothMuHasZHasGrandMa_
unsigned int nAccPtScaleN_
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:18
double p4[4]
Definition: TauolaWrapper.h:92
virtual size_t numberOfDaughters() const
number of daughters
virtual void endJob() override
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
T * make(const Args &...args) const
make new ROOT object
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 double mass() const final
mass
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
virtual int pdgId() const final
PDG identifier.
unsigned int nAccPtScaleSmearedFlat_
tuple muons
Definition: patZpeak.py:38
virtual void analyze(const edm::Event &event, const edm::EventSetup &setup) override
tuple cout
Definition: gather_cfg.py:145
unsigned int nAccPtScaleSmearedGaus_
virtual double eta() const final
momentum pseudorapidity
virtual const Candidate * mother(size_type=0) const
return mother at a given position, i = 0, ... numberOfMothers() - 1 (read only mode) ...