CMS 3D CMS Logo

HLTMCtruth.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <sstream>
3 #include <istream>
4 #include <fstream>
5 #include <iomanip>
6 #include <string>
7 #include <cmath>
8 #include <functional>
9 #include <cstdlib>
10 #include <cstring>
11 
12 #include "HLTMCtruth.h"
14 
16  //set parameter defaults
17  _Monte = false;
18  _Gen = false;
19  _Debug = false;
20 }
21 
22 /* Setup the analysis to put the branch-variables into the tree. */
23 void HLTMCtruth::setup(const edm::ParameterSet& pSet, TTree* HltTree) {
24  edm::ParameterSet myMCParams = pSet.getParameter<edm::ParameterSet>("RunParameters");
25  std::vector<std::string> parameterNames = myMCParams.getParameterNames();
26 
27  for (auto& parameterName : parameterNames) {
28  if (parameterName == "Monte")
29  _Monte = myMCParams.getParameter<bool>(parameterName);
30  else if (parameterName == "GenTracks")
31  _Gen = myMCParams.getParameter<bool>(parameterName);
32  else if (parameterName == "Debug")
33  _Debug = myMCParams.getParameter<bool>(parameterName);
34  }
35 
36  const int kMaxMcTruth = 10000;
37  mcpid = new int[kMaxMcTruth];
38  mcstatus = new int[kMaxMcTruth];
39  mcvx = new float[kMaxMcTruth];
40  mcvy = new float[kMaxMcTruth];
41  mcvz = new float[kMaxMcTruth];
42  mcpt = new float[kMaxMcTruth];
43  mceta = new float[kMaxMcTruth];
44  mcphi = new float[kMaxMcTruth];
45 
46  // MCtruth-specific branches of the tree
47  HltTree->Branch("NMCpart", &nmcpart, "NMCpart/I");
48  HltTree->Branch("MCpid", mcpid, "MCpid[NMCpart]/I");
49  HltTree->Branch("MCstatus", mcstatus, "MCstatus[NMCpart]/I");
50  HltTree->Branch("MCvtxX", mcvx, "MCvtxX[NMCpart]/F");
51  HltTree->Branch("MCvtxY", mcvy, "MCvtxY[NMCpart]/F");
52  HltTree->Branch("MCvtxZ", mcvz, "MCvtxZ[NMCpart]/F");
53  HltTree->Branch("MCpt", mcpt, "MCpt[NMCpart]/F");
54  HltTree->Branch("MCeta", mceta, "MCeta[NMCpart]/F");
55  HltTree->Branch("MCphi", mcphi, "MCphi[NMCpart]/F");
56  HltTree->Branch("MCPtHat", &pthatf, "MCPtHat/F");
57  HltTree->Branch("MCWeight", &weightf, "MCWeight/F");
58  HltTree->Branch("MCWeightSign", &weightsignf, "MCWeightSign/F");
59  HltTree->Branch("MCmu3", &nmu3, "MCmu3/I");
60  HltTree->Branch("MCel3", &nel3, "MCel3/I");
61  HltTree->Branch("MCbb", &nbb, "MCbb/I");
62  HltTree->Branch("MCab", &nab, "MCab/I");
63  HltTree->Branch("MCWenu", &nwenu, "MCWenu/I");
64  HltTree->Branch("MCWmunu", &nwmunu, "MCmunu/I");
65  HltTree->Branch("MCZee", &nzee, "MCZee/I");
66  HltTree->Branch("MCZmumu", &nzmumu, "MCZmumu/I");
67  HltTree->Branch("MCptEleMax", &ptEleMax, "MCptEleMax/F");
68  HltTree->Branch("MCptMuMax", &ptMuMax, "MCptMuMax/F");
69  HltTree->Branch("NPUTrueBX0", &npubx0, "NPUTrueBX0/I");
70  HltTree->Branch("NPUgenBX0", &npuvertbx0, "NPUgenBX0/I");
71 }
72 
73 /* **Analyze the event** */
75  const double& pthat,
76  const double& weight,
77  const edm::Handle<std::vector<SimTrack> >& simTracks,
78  const edm::Handle<std::vector<SimVertex> >& simVertices,
79  const edm::Handle<std::vector<PileupSummaryInfo> >& PupInfo,
80  TTree* HltTree) {
81  //std::cout << " Beginning HLTMCtruth " << std::endl;
82 
83  if (_Monte) {
84  int nmc = 0;
85  int mu3 = 0;
86  int el3 = 0;
87  int mab = 0;
88  int mbb = 0;
89  int wel = 0;
90  int wmu = 0;
91  int zee = 0;
92  int zmumu = 0;
93 
94  ptEleMax = -999.0;
95  ptMuMax = -999.0;
96  pthatf = pthat;
97  weightf = weight;
98  weightsignf = (weight > 0) ? 1. : -1.;
99  npubx0 = 0.0;
100  npuvertbx0 = 0;
101 
102  int npvtrue = 0;
103  int npuvert = 0;
104 
105  if (PupInfo.isValid()) {
106  std::vector<PileupSummaryInfo>::const_iterator PVI;
107  for (PVI = PupInfo->begin(); PVI != PupInfo->end(); ++PVI) {
108  int BX = PVI->getBunchCrossing();
109  npvtrue = PVI->getTrueNumInteractions();
110  npuvert = PVI->getPU_NumInteractions();
111 
112  if (BX == 0) {
113  npubx0 += npvtrue;
114  npuvertbx0 += npuvert;
115  }
116  }
117  }
118 
119  if ((simTracks.isValid()) && (simVertices.isValid())) {
120  for (auto const& j : *simTracks) {
121  int pdgid = j.type();
122  if (abs(pdgid) != 13)
123  continue;
124  double pt = j.momentum().pt();
125  if (pt < 5.0)
126  continue;
127  double eta = j.momentum().eta();
128  if (std::abs(eta) > 2.5)
129  continue;
130  if (j.noVertex())
131  continue;
132  int vertIndex = j.vertIndex();
133  double x = simVertices->at(vertIndex).position().x();
134  double y = simVertices->at(vertIndex).position().y();
135  double r = sqrt(x * x + y * y);
136  if (r > 200.)
137  continue; // I think units are cm here
138  double z = simVertices->at(vertIndex).position().z();
139  if (std::abs(z) > 400.)
140  continue; // I think units are cm here
141  mu3 += 1;
142  break;
143  }
144  }
145 
146  if (_Gen && mctruth.isValid()) {
147  for (size_t i = 0; i < mctruth->size(); ++i) {
148  const reco::Candidate& p = (*mctruth)[i];
149 
150  mcpid[nmc] = p.pdgId();
151  mcstatus[nmc] = p.status();
152  mcpt[nmc] = p.pt();
153  mceta[nmc] = p.eta();
154  mcphi[nmc] = p.phi();
155  mcvx[nmc] = p.vx();
156  mcvy[nmc] = p.vy();
157  mcvz[nmc] = p.vz();
158 
159  if ((mcpid[nmc] == 24) || (mcpid[nmc] == -24)) { // Checking W -> e/mu nu
160  size_t idg = p.numberOfDaughters();
161  for (size_t j = 0; j != idg; ++j) {
162  const reco::Candidate& d = *p.daughter(j);
163  if ((d.pdgId() == 11) || (d.pdgId() == -11)) {
164  wel += 1;
165  }
166  if ((d.pdgId() == 13) || (d.pdgId() == -13)) {
167  wmu += 1;
168  }
169  // if ( (abs(d.pdgId())!=24) && ((mcpid[nmc])*(d.pdgId())>0) )
170  // {std::cout << "Wrong sign between mother-W and daughter !" << std::endl;}
171  }
172  }
173  if (mcpid[nmc] == 23) { // Checking Z -> 2 e/mu
174  size_t idg = p.numberOfDaughters();
175  for (size_t j = 0; j != idg; ++j) {
176  const reco::Candidate& d = *p.daughter(j);
177  if (d.pdgId() == 11) {
178  zee += 1;
179  }
180  if (d.pdgId() == -11) {
181  zee += 2;
182  }
183  if (d.pdgId() == 13) {
184  zmumu += 1;
185  }
186  if (d.pdgId() == -13) {
187  zmumu += 2;
188  }
189  }
190  }
191 
192  // Set-up flags, based on Pythia-generator information, for avoiding double-counting events when
193  // using both pp->{e,mu}X AND QCD samples
194  // if (((mcpid[nmc]==13)||(mcpid[nmc]==-13))&&(mcpt[nmc]>2.5)) {mu3 += 1;} // Flag for muons with pT > 2.5 GeV/c
195  if (((mcpid[nmc] == 11) || (mcpid[nmc] == -11)) && (mcpt[nmc] > 2.5)) {
196  el3 += 1;
197  } // Flag for electrons with pT > 2.5 GeV/c
198 
199  if (mcpid[nmc] == -5) {
200  mab += 1;
201  } // Flag for bbar
202  if (mcpid[nmc] == 5) {
203  mbb += 1;
204  } // Flag for b
205 
206  if ((mcpid[nmc] == 13) || (mcpid[nmc] == -13)) {
207  if (p.pt() > ptMuMax) {
208  ptMuMax = p.pt();
209  }
210  } // Save max pt of generated Muons
211  if ((mcpid[nmc] == 11) || (mcpid[nmc] == -11)) {
212  if (p.pt() > ptEleMax)
213  ptEleMax = p.pt();
214  } // Save max pt of generated Electrons
215 
216  nmc++;
217  }
218  }
219  // else {std::cout << "%HLTMCtruth -- No MC truth information" << std::endl;}
220 
221  nmcpart = nmc;
222  nmu3 = mu3;
223  nel3 = el3;
224  nbb = mbb;
225  nab = mab;
226  nwenu = wel;
227  nwmunu = wmu;
228  if ((zee % 3) == 0) {
229  nzee = zee / 3;
230  }
231  // else {std::cout << "Z does not decay in e+ e- !" << std::endl;}
232  if ((zmumu % 3) == 0) {
233  nzmumu = zmumu / 3;
234  }
235  // else {std::cout << "Z does not decay in mu+ mu- !" << std::endl;}
236  }
237 }
int * mcpid
Definition: HLTMCtruth.h:48
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
bool _Gen
Definition: HLTMCtruth.h:54
float * mcpt
Definition: HLTMCtruth.h:47
float pthatf
Definition: HLTMCtruth.h:51
Definition: weight.py:1
float weightf
Definition: HLTMCtruth.h:51
bool _Debug
Definition: HLTMCtruth.h:54
float * mceta
Definition: HLTMCtruth.h:47
int nmcpart
Definition: HLTMCtruth.h:49
int nzmumu
Definition: HLTMCtruth.h:49
float ptEleMax
Definition: HLTMCtruth.h:52
float ptMuMax
Definition: HLTMCtruth.h:52
T sqrt(T t)
Definition: SSEVec.h:23
float * mcvy
Definition: HLTMCtruth.h:47
int npubx0
Definition: HLTMCtruth.h:50
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool _Monte
Definition: HLTMCtruth.h:54
float weightsignf
Definition: HLTMCtruth.h:51
d
Definition: ztail.py:151
void analyze(const edm::Handle< reco::CandidateView > &mctruth, const double &pthat, const double &weight, const edm::Handle< std::vector< SimTrack > > &simTracks, const edm::Handle< std::vector< SimVertex > > &simVertices, const edm::Handle< std::vector< PileupSummaryInfo > > &PupInfo, TTree *tree)
Definition: HLTMCtruth.cc:74
float * mcvx
Definition: HLTMCtruth.h:47
float * mcphi
Definition: HLTMCtruth.h:47
float * mcvz
Definition: HLTMCtruth.h:47
void setup(const edm::ParameterSet &pSet, TTree *tree)
Definition: HLTMCtruth.cc:23
int nwmunu
Definition: HLTMCtruth.h:49
std::vector< std::string > getParameterNames() const
int npuvertbx0
Definition: HLTMCtruth.h:50
int * mcstatus
Definition: HLTMCtruth.h:48