1 |
#ifndef PhysicsTools_PatAlgos_interface_MultiIsolator_h
|
2 |
#define PhysicsTools_PatAlgos_interface_MultiIsolator_h
|
3 |
|
4 |
#include "DataFormats/Common/interface/View.h"
|
5 |
#include "FWCore/ParameterSet/interface/ParameterSet.h"
|
6 |
#include "FWCore/Framework/interface/Event.h"
|
7 |
|
8 |
#include "PhysicsTools/PatAlgos/interface/BaseIsolator.h"
|
9 |
#include "boost/ptr_container/ptr_vector.hpp"
|
10 |
|
11 |
#include "DataFormats/PatCandidates/interface/Isolation.h"
|
12 |
|
13 |
namespace pat { namespace helper {
|
14 |
class MultiIsolator {
|
15 |
public:
|
16 |
typedef std::vector<std::pair<pat::IsolationKeys,float> > IsolationValuePairs;
|
17 |
MultiIsolator() {}
|
18 |
MultiIsolator(const edm::ParameterSet &conf, bool cuts=true) ;
|
19 |
~MultiIsolator() {}
|
20 |
|
21 |
// adds an isolator (and takes onwership of the pointer)
|
22 |
void addIsolator(BaseIsolator *iso, uint32_t mask, pat::IsolationKeys key) ;
|
23 |
|
24 |
// parses an isolator and adds it to the list
|
25 |
void addIsolator(const edm::ParameterSet &conf, bool withCut, uint32_t mask, pat::IsolationKeys key) ;
|
26 |
|
27 |
// Parses out an isolator, and returns a pointer to it.
|
28 |
// For an empty PSet, it returns a null pointer.
|
29 |
// You own the returned pointer!
|
30 |
static BaseIsolator * make(const edm::ParameterSet &conf, bool withCut) ;
|
31 |
|
32 |
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup);
|
33 |
void endEvent() ;
|
34 |
|
35 |
template<typename T>
|
36 |
uint32_t test(const edm::View<T> &coll, int idx) const;
|
37 |
|
38 |
template<typename T>
|
39 |
void fill(const edm::View<T> &coll, int idx, IsolationValuePairs& isolations) const ;
|
40 |
|
41 |
/// Fill Isolation from a Ref, Ptr or RefToBase to the object
|
42 |
template<typename RefType>
|
43 |
void fill(const RefType &ref, IsolationValuePairs& isolations) const ;
|
44 |
|
45 |
void print(std::ostream &out) const ;
|
46 |
|
47 |
std::string printSummary() const ;
|
48 |
|
49 |
/// True if it has a non null configuration
|
50 |
bool enabled() const { return !isolators_.empty(); }
|
51 |
private:
|
52 |
boost::ptr_vector<BaseIsolator> isolators_;
|
53 |
std::vector<uint32_t> masks_;
|
54 |
std::vector<pat::IsolationKeys> keys_;
|
55 |
};
|
56 |
|
57 |
template<typename T>
|
58 |
uint32_t
|
59 |
MultiIsolator::test(const edm::View<T> &coll, int idx) const {
|
60 |
uint32_t retval = 0;
|
61 |
edm::RefToBase<T> rb = coll.refAt(idx); // edm::Ptr<T> in a shiny new future to come one remote day ;-)
|
62 |
for (size_t i = 0, n = isolators_.size(); i < n; ++i) {
|
63 |
if (!isolators_[i].test(rb)) retval |= masks_[i];
|
64 |
}
|
65 |
return retval;
|
66 |
}
|
67 |
|
68 |
template<typename RefType>
|
69 |
void
|
70 |
MultiIsolator::fill(const RefType &rb, IsolationValuePairs & isolations) const
|
71 |
{
|
72 |
isolations.resize(isolators_.size());
|
73 |
for (size_t i = 0, n = isolators_.size(); i < n; ++i) {
|
74 |
isolations[i].first = keys_[i];
|
75 |
isolations[i].second = isolators_[i].getValue(rb);
|
76 |
}
|
77 |
}
|
78 |
|
79 |
|
80 |
template<typename T>
|
81 |
void
|
82 |
MultiIsolator::fill(const edm::View<T> &coll, int idx, IsolationValuePairs & isolations) const
|
83 |
{
|
84 |
edm::RefToBase<T> rb = coll.refAt(idx);
|
85 |
fill(rb, isolations);
|
86 |
}
|
87 |
|
88 |
}} // namespace
|
89 |
|
90 |
#endif
|
91 |
|