1 |
#include "PhysicsTools/PatUtils/interface/DuplicatedElectronRemover.h"
|
2 |
|
3 |
#include <algorithm>
|
4 |
|
5 |
|
6 |
std::auto_ptr< std::vector<size_t> >
|
7 |
pat::DuplicatedElectronRemover::duplicatesToRemove(const std::vector<reco::GsfElectron> &electrons) const {
|
8 |
return duplicatesToRemove< std::vector<reco::GsfElectron> >(electrons);
|
9 |
}
|
10 |
|
11 |
std::auto_ptr< std::vector<size_t> >
|
12 |
pat::DuplicatedElectronRemover::duplicatesToRemove(const edm::View<reco::GsfElectron> &electrons) const {
|
13 |
return duplicatesToRemove< edm::View<reco::GsfElectron> >(electrons);
|
14 |
}
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
/*
|
20 |
std::auto_ptr< std::vector<size_t> >
|
21 |
pat::DuplicatedElectronRemover::duplicatesToRemove(const std::vector<reco::GsfElectron> &electrons)
|
22 |
{
|
23 |
using namespace std;
|
24 |
|
25 |
size_t size = electrons.size();
|
26 |
|
27 |
vector<bool> bad(size, false);
|
28 |
|
29 |
for (size_t ie = 0; ie < size; ++ie) {
|
30 |
if (bad[ie]) continue; // if already marked bad
|
31 |
|
32 |
reco::GsfTrackRef thistrack = electrons[ie].gsfTrack();
|
33 |
reco::SuperClusterRef thissc = electrons[ie].superCluster();
|
34 |
|
35 |
for (size_t je = ie+1; je < size; ++je) {
|
36 |
if (bad[je]) continue; // if already marked bad
|
37 |
|
38 |
if ( ( thistrack == electrons[je].gsfTrack()) ||
|
39 |
(thissc == electrons[je].superCluster()) ) {
|
40 |
// we have a match, arbitrate and mark one for removal
|
41 |
// keep the one with E/P closer to unity
|
42 |
float diff1 = fabs(electrons[ie].eSuperClusterOverP()-1);
|
43 |
float diff2 = fabs(electrons[je].eSuperClusterOverP()-1);
|
44 |
|
45 |
if (diff1<diff2) {
|
46 |
bad[je] = true;
|
47 |
} else {
|
48 |
bad[ie] = true;
|
49 |
}
|
50 |
}
|
51 |
}
|
52 |
}
|
53 |
|
54 |
auto_ptr< vector<size_t> > ret(new vector<size_t>());
|
55 |
|
56 |
for (size_t i = 0; i < size; ++i) {
|
57 |
if (bad[i]) ret->push_back(i);
|
58 |
}
|
59 |
|
60 |
return ret;
|
61 |
}
|
62 |
*/
|