CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HepMCValidationHelper.cc
Go to the documentation of this file.
4 #include <iostream>
5 #include <limits>
6 #include "TLorentzVector.h"
7 
8 //#define DEBUG_HepMCValidationHelper
9 
10 namespace HepMCValidationHelper {
11  void findFSRPhotons(const std::vector<const HepMC::GenParticle*>& leptons,
12  const HepMC::GenEvent* all,
13  double deltaRcut,
14  std::vector<const HepMC::GenParticle*>& fsrphotons){
15 
16  std::vector<const HepMC::GenParticle*> status1;
17  allStatus1(all, status1);
18  findFSRPhotons(leptons, status1, deltaRcut, fsrphotons);
19  }
20 
21  void findFSRPhotons(const std::vector<const HepMC::GenParticle*>& leptons,
22  const std::vector<const HepMC::GenParticle*>& all,
23  double deltaRcut,
24  std::vector<const HepMC::GenParticle*>& fsrphotons){
25 
26  //find all status 1 photons
27  std::vector<const HepMC::GenParticle*> allphotons;
28  for (unsigned int i = 0; i < all.size(); ++i){
29  if (all[i]->status()==1 && all[i]->pdg_id()==22) allphotons.push_back(all[i]);
30  }
31 
32  //loop over the photons and check the distance wrt the leptons
33  for (unsigned int ipho = 0; ipho < allphotons.size(); ++ipho){
34  bool close = false;
35  for (unsigned int ilep = 0; ilep < leptons.size(); ++ilep){
36  if (deltaR(allphotons[ipho]->momentum(), leptons[ilep]->momentum()) < deltaRcut){
37  close = true;
38  break;
39  }
40  }
41  if (close) fsrphotons.push_back(allphotons[ipho]);
42  }
43  }
44 
45  //returns true if a status 3 particle is a tau or if a status 1 particle is either an electron or a neutrino
47  int status = part->status();
48  unsigned int pdg_id = abs(part->pdg_id());
49  if (status == 2) return pdg_id == 15;
50  else return status == 1 && (pdg_id == 11 || pdg_id == 13 ) ;
51  }
52 
53  //returns true if a status 1 particle is a neutrino
55  int status = part->status();
56  unsigned int pdg_id = abs(part->pdg_id());
57  return status == 1 && (pdg_id == 12 || pdg_id == 14 || pdg_id == 16) ;
58  }
59 
60  //returns true is status 3 particle is tau
62  return part->status() == 2 && abs(part->pdg_id()) == 15;
63  }
64 /*
65  void getTaus(const HepMC::GenEvent* all, std::vector<const HepMC::GenParticle*>& taus){
66  for (HepMC::GenEvent::particle_const_iterator iter = all->particles_begin(); iter != all->particles_end(); ++iter){
67  if (abs((*iter)->pdg_id()) == 15) taus.push_back(*iter);
68  }
69  }
70 */
71  // get all status 1 particles
72  void allStatus1(const HepMC::GenEvent* all, std::vector<const HepMC::GenParticle*>& status1){
73  for (HepMC::GenEvent::particle_const_iterator iter = all->particles_begin(); iter != all->particles_end(); ++iter){
74  if ((*iter)->status() == 1) status1.push_back(*iter);
75  }
76  }
77 
78  void allStatus2(const HepMC::GenEvent* all, std::vector<const HepMC::GenParticle*>& status1){
79  for (HepMC::GenEvent::particle_const_iterator iter = all->particles_begin(); iter != all->particles_end(); ++iter){
80  if ((*iter)->status() == 2) status1.push_back(*iter);
81  }
82  }
83 
84  void allStatus3(const HepMC::GenEvent* all, std::vector<const HepMC::GenParticle*>& status1){
85  for (HepMC::GenEvent::particle_const_iterator iter = all->particles_begin(); iter != all->particles_end(); ++iter){
86  if ((*iter)->status() == 3) status1.push_back(*iter);
87  }
88  }
89 
90  void findDescendents(const HepMC::GenParticle* a, std::vector<const HepMC::GenParticle*>& descendents){
91  HepMC::GenVertex* decayVertex = a->end_vertex();
92  if (!decayVertex) return;
93  HepMC::GenVertex::particles_out_const_iterator ipart;
94  for (ipart = decayVertex->particles_out_const_begin(); ipart != decayVertex->particles_out_const_end(); ++ipart ){
95  if ((*ipart)->status() == 1) descendents.push_back(*ipart);
96  else findDescendents(*ipart, descendents);
97  }
98  }
99 
100  void removeIsolatedLeptons(const HepMC::GenEvent* all, double deltaRcut, double sumPtCut, std::vector<const HepMC::GenParticle*>& pruned) {
101  //get all status 1 particles
102  std::vector<const HepMC::GenParticle*> status1;
103  allStatus1(all, status1);
104  std::vector<const HepMC::GenParticle*> toRemove;
105  //loop on all particles and find candidates to be isolated
106  for (unsigned int i = 0; i < status1.size(); ++i){
107  //if it is a neutrino is a charged lepton (not a tau) this is a candidate to be isolated
108  if (isNeutrino(status1[i]) || (isChargedLepton(status1[i]) && !isTau(status1[i]))){
109  //list of particles not to be considered in the isolation computation.
110  //this includes the particle to be isolated and the fsr photons in case of charged lepton
111  std::vector<const HepMC::GenParticle*> leptons;
112  leptons.push_back(status1[i]);
113  std::vector<const HepMC::GenParticle*> removedForIsolation;
114  removedForIsolation.push_back(status1[i]);
115  if (isChargedLepton(status1[i])) findFSRPhotons(leptons, status1, deltaRcut, removedForIsolation);
116 #ifdef DEBUG_HepMCValidationHelper
117  //std::cout << removedForIsolation.size() << " particles to be removed for isolation calculation " << std::endl;
118 #endif
119  //create vector of particles to compute isolation (removing removedForIsolation);
120  std::vector<const HepMC::GenParticle*> forIsolation;
121  std::vector<const HepMC::GenParticle*>::iterator iiso;
122  for (iiso = status1.begin(); iiso != status1.end(); ++iiso){
123  std::vector<const HepMC::GenParticle*>::const_iterator iremove;
124  bool marked = false;
125  for ( iremove = removedForIsolation.begin(); iremove != removedForIsolation.end(); ++iremove){
126  if ((*iiso)->barcode() == (*iremove)->barcode()) {
127 #ifdef DEBUG_HepMCValidationHelper
128  //std::cout << "removing particle " << **iiso << " from the list of particles to compute isolation" << std::endl;
129 #endif
130  marked = true;
131  break;
132  }
133  }
134  if (!marked) forIsolation.push_back(*iiso);
135  }
136  //now compute isolation
137  double sumIso = 0;
138  for (iiso = forIsolation.begin(); iiso < forIsolation.end(); ++iiso){
139  if (deltaR(leptons.front()->momentum(), (*iiso)->momentum()) < deltaRcut){
140  sumIso += (*iiso)->momentum().perp();
141  }
142  }
143  //if isolated remove from the pruned list
144  if (sumIso < sumPtCut) {
145 #ifdef DEBUG_HepMCValidationHelper
146  std::cout << "particle " << *status1[i] << " is considered isolated, with sumPt " << sumIso << std::endl;
147 #endif
148  toRemove.insert(toRemove.end(), removedForIsolation.begin(), removedForIsolation.end());
149  }
150 #ifdef DEBUG_HepMCValidationHelper
151  else {
152  std::cout << "NOT isolated! " << *status1[i] << " is considered not isolated, with sumPt " << sumIso << std::endl;
153  }
154 #endif
155  }
156  }
157  //at this point we have taken care of the electrons and muons, but pruned could still contain the decay products of isolated taus,
158  //we want to remove these as well
159  std::vector<const HepMC::GenParticle*> status2;
160  allStatus2(all, status2);
161  std::vector<const HepMC::GenParticle*> taus;
162  //getTaus(all, taus);
163  for (unsigned int i = 0; i < status2.size(); ++i){
164  if (isTau(status2[i])) {
165  //check the list we have already for duplicates
166  //there use to be duplicates in some generators (sherpa)
167  bool duplicate = false;
168  TLorentzVector taumomentum(status2[i]->momentum().x(), status2[i]->momentum().y(), status2[i]->momentum().z(), status2[i]->momentum().t());
169  for (unsigned int j = 0; j < taus.size(); ++j){
170  //compare momenta
171  TLorentzVector othermomentum(taus[j]->momentum().x(), taus[j]->momentum().y(), taus[j]->momentum().z(), taus[j]->momentum().t());
172  othermomentum-=taumomentum;
173  if (status2[i]->pdg_id() == taus[j]->pdg_id() &&
174  othermomentum.E() < 0.1 &&//std::numeric_limits<float>::epsilon() &&
175  othermomentum.P() < 0.1 ){ //std::numeric_limits<float>::epsilon()){
176  duplicate = true;
177  break;
178  }
179  }
180  if (!duplicate) taus.push_back(status2[i]);
181  }
182  }
183  //loop over the taus, find the descendents, remove all these from the list of particles to compute isolation
184  for (unsigned int i = 0; i < taus.size(); ++i){
185  std::vector<const HepMC::GenParticle*> taudaughters;
186  findDescendents(taus[i], taudaughters);
187  if ( taudaughters.size()<=0 ) {
188  edm::LogError("HepMCValidationHelper") << "Tau with no daughters. This is a bug. Fix it";
189  abort();
190  }
191  const HepMC::FourVector& taumom = taus[i]->momentum();
192  //remove the daughters from the list of particles to compute isolation
193  std::vector<const HepMC::GenParticle*> forIsolation;
194  std::vector<const HepMC::GenParticle*>::iterator iiso;
195  for (iiso = status1.begin(); iiso < status1.end(); ++iiso){
196  bool marked = false;
197  std::vector<const HepMC::GenParticle*>::const_iterator iremove;
198  for ( iremove = taudaughters.begin(); iremove != taudaughters.end(); ++iremove){
199  if ((*iiso)->barcode() == (*iremove)->barcode()) {
200 #ifdef DEBUG_HepMCValidationHelper
201 // std::cout << "removing particle " << **iiso << " from the list of particles to compute isolation because it comes from a tau" << std::endl;
202 #endif
203  marked = true;
204  break;
205  }
206  if (!marked) forIsolation.push_back(*iiso);
207  }
208  }
209  //no compute isolation wrt the status 2 tau direction
210  double sumIso = 0;
211  for (iiso = forIsolation.begin(); iiso < forIsolation.end(); ++iiso){
212  if (deltaR(taumom, (*iiso)->momentum()) < deltaRcut){
213  sumIso += (*iiso)->momentum().perp();
214  }
215  }
216  //if isolated remove the tau daughters from the pruned list
217  if (sumIso < sumPtCut) {
218 #ifdef DEBUG_HepMCValidationHelper
219  std::cout << "particle " << *taus[i] << " is considered isolated, with sumPt " << sumIso << std::endl;
220 #endif
221  toRemove.insert(toRemove.end(), taudaughters.begin(), taudaughters.end());
222  }
223  }
224 
225  //now actually remove
226  pruned.clear();
227  for (unsigned int i = 0; i < status1.size(); ++i){
228  bool marked = false;
229  std::vector<const HepMC::GenParticle*>::const_iterator iremove;
230  for ( iremove = toRemove.begin(); iremove != toRemove.end(); ++iremove){
231  if (status1[i]->barcode() == (*iremove)->barcode()){
232  marked = true;
233  break;
234  }
235  }
236  if (!marked) pruned.push_back(status1[i]);
237  }
238 
239 #ifdef DEBUG_HepMCValidationHelper
240  std::cout<< "list of remaining particles:" <<std::endl;
241  for (unsigned int i = 0; i < pruned.size(); ++i){
242  std::cout << *pruned[i] << std::endl;
243  }
244 #endif
245  }
246 
247  //get all visible status1 particles
248  void allVisibleParticles(const HepMC::GenEvent* all, std::vector<const HepMC::GenParticle*>& visible) {
249  std::vector<const HepMC::GenParticle*> status1;
250  visible.clear();
251  allStatus1(all, status1);
252  for (unsigned int i = 0; i < status1.size(); ++i){
253  if (!isNeutrino(status1[i])) visible.push_back(status1[i]);
254  }
255  }
256 
257  //compute generated met
258  TLorentzVector genMet(const HepMC::GenEvent* all, double etamin, double etamax){
259  std::vector<const HepMC::GenParticle*> visible;
260  allVisibleParticles(all, visible);
261  TLorentzVector momsum(0., 0., 0., 0.);
262  for (unsigned int i = 0; i < visible.size(); ++i){
263  if (visible[i]->momentum().eta() > etamin && visible[i]->momentum().eta() < etamax) {
264  TLorentzVector mom(visible[i]->momentum().x(), visible[i]->momentum().y(), visible[i]->momentum().z(), visible[i]->momentum().t());
265  momsum += mom;
266  }
267  }
268  TLorentzVector met(-momsum.Px(), -momsum.Py(), 0., momsum.Pt());
269  return met;
270  }
271 }
tuple t
Definition: tree.py:139
int i
Definition: DBlmapReader.cc:9
bool isTau(const HepMC::GenParticle *part)
void allStatus3(const HepMC::GenEvent *all, std::vector< const HepMC::GenParticle * > &status3)
void findFSRPhotons(const std::vector< const HepMC::GenParticle * > &leptons, const std::vector< const HepMC::GenParticle * > &all, double deltaR, std::vector< const HepMC::GenParticle * > &photons)
bool isChargedLepton(const HepMC::GenParticle *part)
void allStatus1(const HepMC::GenEvent *all, std::vector< const HepMC::GenParticle * > &status1)
T x() const
Cartesian x coordinate.
void removeIsolatedLeptons(const HepMC::GenEvent *all, double deltaR, double sumPt, std::vector< const HepMC::GenParticle * > &pruned)
static const boost::regex duplicate("duplicateIOV[[:print:]]+?[S|s]ince[=| ]([[:alnum:]]+?);.*")
void allStatus2(const HepMC::GenEvent *all, std::vector< const HepMC::GenParticle * > &status2)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int j
Definition: DBlmapReader.cc:9
void allVisibleParticles(const HepMC::GenEvent *all, std::vector< const HepMC::GenParticle * > &visible)
void findDescendents(const HepMC::GenParticle *a, std::vector< const HepMC::GenParticle * > &descendents)
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
part
Definition: HCALResponse.h:20
TLorentzVector genMet(const HepMC::GenEvent *all, double etamin=-9999., double etamax=9999.)
bool isNeutrino(const HepMC::GenParticle *part)
double a
Definition: hdecay.h:121
tuple cout
Definition: gather_cfg.py:121
tuple status
Definition: ntuplemaker.py:245