6 #include "TLorentzVector.h"
10 namespace HepMCValidationHelper {
12 const HepMC::GenEvent*
all,
14 std::vector<const HepMC::GenParticle*>& fsrphotons){
16 std::vector<const HepMC::GenParticle*> status1;
22 const std::vector<const HepMC::GenParticle*>&
all,
24 std::vector<const HepMC::GenParticle*>& fsrphotons){
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]);
33 for (
unsigned int ipho = 0; ipho < allphotons.size(); ++ipho){
35 for (
unsigned int ilep = 0; ilep < leptons.size(); ++ilep){
36 if (
deltaR(allphotons[ipho]->momentum(), leptons[ilep]->momentum()) < deltaRcut){
41 if (close) fsrphotons.push_back(allphotons[ipho]);
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 ) ;
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) ;
62 return part->status() == 2 &&
abs(part->pdg_id()) == 15;
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);
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);
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);
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);
100 void removeIsolatedLeptons(
const HepMC::GenEvent*
all,
double deltaRcut,
double sumPtCut, std::vector<const HepMC::GenParticle*>& pruned) {
102 std::vector<const HepMC::GenParticle*> status1;
104 std::vector<const HepMC::GenParticle*> toRemove;
106 for (
unsigned int i = 0;
i < status1.size(); ++
i){
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]);
116 #ifdef DEBUG_HepMCValidationHelper
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;
125 for ( iremove = removedForIsolation.begin(); iremove != removedForIsolation.end(); ++iremove){
126 if ((*iiso)->barcode() == (*iremove)->barcode()) {
127 #ifdef DEBUG_HepMCValidationHelper
134 if (!marked) forIsolation.push_back(*iiso);
138 for (iiso = forIsolation.begin(); iiso < forIsolation.end(); ++iiso){
139 if (
deltaR(leptons.front()->momentum(), (*iiso)->momentum()) < deltaRcut){
140 sumIso += (*iiso)->momentum().perp();
144 if (sumIso < sumPtCut) {
145 #ifdef DEBUG_HepMCValidationHelper
146 std::cout <<
"particle " << *status1[
i] <<
" is considered isolated, with sumPt " << sumIso << std::endl;
148 toRemove.insert(toRemove.end(), removedForIsolation.begin(), removedForIsolation.end());
150 #ifdef DEBUG_HepMCValidationHelper
152 std::cout <<
"NOT isolated! " << *status1[
i] <<
" is considered not isolated, with sumPt " << sumIso << std::endl;
159 std::vector<const HepMC::GenParticle*> status2;
161 std::vector<const HepMC::GenParticle*> taus;
163 for (
unsigned int i = 0;
i < status2.size(); ++
i){
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){
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 &&
175 othermomentum.P() < 0.1 ){
180 if (!duplicate) taus.push_back(status2[i]);
184 for (
unsigned int i = 0;
i < taus.size(); ++
i){
185 std::vector<const HepMC::GenParticle*> taudaughters;
187 if ( taudaughters.size()<=0 ) {
188 edm::LogError(
"HepMCValidationHelper") <<
"Tau with no daughters. This is a bug. Fix it";
191 const HepMC::FourVector& taumom = taus[
i]->momentum();
193 std::vector<const HepMC::GenParticle*> forIsolation;
194 std::vector<const HepMC::GenParticle*>::iterator iiso;
195 for (iiso = status1.begin(); iiso < status1.end(); ++iiso){
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
206 if (!marked) forIsolation.push_back(*iiso);
211 for (iiso = forIsolation.begin(); iiso < forIsolation.end(); ++iiso){
212 if (
deltaR(taumom, (*iiso)->momentum()) < deltaRcut){
213 sumIso += (*iiso)->momentum().perp();
217 if (sumIso < sumPtCut) {
218 #ifdef DEBUG_HepMCValidationHelper
219 std::cout <<
"particle " << *taus[
i] <<
" is considered isolated, with sumPt " << sumIso << std::endl;
221 toRemove.insert(toRemove.end(), taudaughters.begin(), taudaughters.end());
227 for (
unsigned int i = 0;
i < status1.size(); ++
i){
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()){
236 if (!marked) pruned.push_back(status1[
i]);
239 #ifdef DEBUG_HepMCValidationHelper
240 std::cout<<
"list of remaining particles:" <<std::endl;
241 for (
unsigned int i = 0;
i < pruned.size(); ++
i){
249 std::vector<const HepMC::GenParticle*> status1;
252 for (
unsigned int i = 0;
i < status1.size(); ++
i){
253 if (!
isNeutrino(status1[
i])) visible.push_back(status1[i]);
258 TLorentzVector
genMet(
const HepMC::GenEvent*
all,
double etamin,
double etamax){
259 std::vector<const HepMC::GenParticle*> 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());
268 TLorentzVector
met(-momsum.Px(), -momsum.Py(), 0., momsum.Pt());
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)
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)
TLorentzVector genMet(const HepMC::GenEvent *all, double etamin=-9999., double etamax=9999.)
bool isNeutrino(const HepMC::GenParticle *part)