CMS 3D CMS Logo

ObjectViewCleaner.cc
Go to the documentation of this file.
1 
2 /*****************************************************************************
3  * Project: CMS detector at the CERN
4  *
5  * Package: PhysicsTools/TagAndProbe
6  *
7  *
8  * Authors:
9  *
10  * Kalanand Mishra, Fermilab - kalanand@fnal.gov
11  *
12  * Description:
13  * - Cleans a given object collection of other
14  * cross-object candidates using deltaR-matching.
15  * - For example: can clean a muon collection by
16  * removing all jets in the muon collection.
17  * - Saves collection of the reference vectors of cleaned objects.
18  * History:
19  * Generalized the existing CandViewCleaner
20  *
21  *****************************************************************************/
23 // Includes
30 
33 
42 
44 
45 #include <memory>
46 #include <vector>
47 #include <sstream>
48 
49 
51 // class definition
53 template<typename T>
55 {
56 public:
57  // construction/destruction
58  ObjectViewCleaner(const edm::ParameterSet& iConfig);
59  ~ObjectViewCleaner() override;
60 
61  // member functions
62  void produce(edm::Event& iEvent,const edm::EventSetup& iSetup) override;
63  void endJob() override;
64 
65 private:
66  // member data
68  std::vector<edm::EDGetTokenT<edm::View<reco::Candidate> > > srcObjectsTokens_;
69  double deltaRMin_;
70 
72  StringCutObjectSelector<T,true> objKeepCut_; // lazy parsing, to allow cutting on variables not in reco::Candidate class
73  StringCutObjectSelector<reco::Candidate,true> objRemoveCut_; // lazy parsing, to allow cutting on variables
74 
75  unsigned int nObjectsTot_;
76  unsigned int nObjectsClean_;
77 };
78 
79 
80 using namespace std;
81 
82 
84 // construction/destruction
86 
87 //______________________________________________________________________________
88 template<typename T>
90  : srcCandsToken_ (consumes<edm::View<T> >(iConfig.getParameter<edm::InputTag> ("srcObject")))
91  , srcObjectsTokens_ (edm::vector_transform(iConfig.getParameter<vector<edm::InputTag> >("srcObjectsToRemove"), [this](edm::InputTag const & tag){return consumes<edm::View<reco::Candidate> >(tag);}))
92  , deltaRMin_ (iConfig.getParameter<double> ("deltaRMin"))
93  , moduleLabel_(iConfig.getParameter<string> ("@module_label"))
94  , objKeepCut_(iConfig.existsAs<std::string>("srcObjectSelection") ? iConfig.getParameter<std::string>("srcObjectSelection") : "", true)
95  ,objRemoveCut_(iConfig.existsAs<std::string>("srcObjectsToRemoveSelection") ? iConfig.getParameter<std::string>("srcObjectsToRemoveSelection") : "", true)
96  , nObjectsTot_(0)
97  , nObjectsClean_(0)
98 {
99  produces<edm::RefToBaseVector<T> >();
100 }
101 
102 
103 //______________________________________________________________________________
104 template<typename T>
106 {
107 
108 }
109 
110 
111 
113 // implementation of member functions
115 
116 //______________________________________________________________________________
117 template<typename T>
119 {
120  auto cleanObjects = std::make_unique<edm::RefToBaseVector<T>>();
121 
123  iEvent.getByToken(srcCandsToken_,candidates);
124 
125  bool* isClean = new bool[candidates->size()];
126  for (unsigned int iObject=0;iObject<candidates->size();iObject++) isClean[iObject] = true;
127 
128  for (unsigned int iSrc=0;iSrc<srcObjectsTokens_.size();iSrc++) {
130  iEvent.getByToken(srcObjectsTokens_[iSrc],objects);
131 
132  for (unsigned int iObject=0;iObject<candidates->size();iObject++) {
133  const T& candidate = candidates->at(iObject);
134  if (!objKeepCut_(candidate)) isClean[iObject] = false;
135 
136  for (unsigned int iObj=0;iObj<objects->size();iObj++) {
137  const reco::Candidate& obj = objects->at(iObj);
138  if (!objRemoveCut_(obj)) continue;
139 
140  double deltaR = reco::deltaR(candidate,obj);
141  if (deltaR<deltaRMin_) isClean[iObject] = false;
142  }
143  }
144  }
145 
146  for (unsigned int iObject=0;iObject<candidates->size();iObject++)
147  if (isClean[iObject]) cleanObjects->push_back(candidates->refAt(iObject));
148 
149  nObjectsTot_ +=candidates->size();
150  nObjectsClean_+=cleanObjects->size();
151 
152  delete [] isClean;
153  iEvent.put(std::move(cleanObjects));
154 }
155 
156 
157 //______________________________________________________________________________
158 template<typename T>
160 {
161  stringstream ss;
162  ss<<"nObjectsTot="<<nObjectsTot_<<" nObjectsClean="<<nObjectsClean_
163  <<" fObjectsClean="<<100.*(nObjectsClean_/(double)nObjectsTot_)<<"%\n";
164  edm::LogInfo("ObjectViewCleaner")<<"++++++++++++++++++++++++++++++++++++++++++++++++++"
165  <<"\n"<<moduleLabel_<<"(ObjectViewCleaner) SUMMARY:\n"<<ss.str()
166  <<"++++++++++++++++++++++++++++++++++++++++++++++++++";
167 }
168 
169 
171 // plugin definition
173 
174 
175 typedef ObjectViewCleaner<reco::Candidate> CandViewCleaner;
176 typedef ObjectViewCleaner<reco::Jet> JetViewCleaner;
177 typedef ObjectViewCleaner<reco::Muon> MuonViewCleaner;
178 typedef ObjectViewCleaner<reco::GsfElectron> GsfElectronViewCleaner;
179 typedef ObjectViewCleaner<reco::Electron> ElectronViewCleaner;
180 typedef ObjectViewCleaner<reco::Photon> PhotonViewCleaner;
181 
182 
virtual void endJob()
Definition: EDProducer.h:96
void endJob() override
ObjectViewCleaner(const edm::ParameterSet &iConfig)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
ObjectViewCleaner< reco::Electron > ElectronViewCleaner
unsigned int nObjectsTot_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
~ObjectViewCleaner() override
ObjectViewCleaner< reco::Jet > JetViewCleaner
ObjectViewCleaner< reco::Photon > PhotonViewCleaner
ObjectViewCleaner< reco::GsfElectron > GsfElectronViewCleaner
ObjectViewCleaner< reco::Muon > MuonViewCleaner
unsigned int nObjectsClean_
edm::EDGetTokenT< edm::View< T > > srcCandsToken_
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:28
std::string moduleLabel_
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
Definition: transform.h:11
HLT enums.
StringCutObjectSelector< reco::Candidate, true > objRemoveCut_
ObjectViewCleaner< reco::Candidate > CandViewCleaner
long double T
StringCutObjectSelector< T, true > objKeepCut_
std::vector< edm::EDGetTokenT< edm::View< reco::Candidate > > > srcObjectsTokens_
def move(src, dest)
Definition: eostools.py:511
virtual void produce(Event &, EventSetup const &)=0