CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
L3MuonCombinedRelativeIsolationProducer.cc
Go to the documentation of this file.
2 
3 // Framework
8 
10 
12 
18 
21 
24 
27 
29 
30 #include <string>
31 
32 using namespace edm;
33 using namespace std;
34 using namespace reco;
35 using namespace muonisolation;
36 
39  theConfig(par),
40  theMuonCollectionLabel(par.getParameter<InputTag>("inputMuonCollection")),
41  optOutputIsoDeposits(par.getParameter<bool>("OutputMuIsoDeposits")),
42  useCaloIso(par.existsAs<bool>("UseCaloIso") ?
43  par.getParameter<bool>("UseCaloIso") : true),
44  useRhoCorrectedCaloDeps(par.existsAs<bool>("UseRhoCorrectedCaloDeposits") ?
45  par.getParameter<bool>("UseRhoCorrectedCaloDeposits") : false),
46  theCaloDepsLabel(par.existsAs<InputTag>("CaloDepositsLabel") ?
47  par.getParameter<InputTag>("CaloDepositsLabel") :
48  InputTag("hltL3CaloMuonCorrectedIsolations")),
49  caloExtractor(0),
50  trkExtractor(0),
51  theTrackPt_Min(-1),
52  printDebug (par.getParameter<bool>("printDebug"))
53  {
54  LogDebug("RecoMuon|L3MuonCombinedRelativeIsolationProducer")<<" L3MuonCombinedRelativeIsolationProducer CTOR";
55 
56  theMuonCollectionToken = consumes<RecoChargedCandidateCollection>(theMuonCollectionLabel);
57  theCaloDepsToken = consumes<edm::ValueMap<float> >(theCaloDepsLabel);
58 
60  produces<reco::IsoDepositMap>("trkIsoDeposits");
61  if( useRhoCorrectedCaloDeps==false ) // otherwise, calo deposits have been previously computed
62  produces<reco::IsoDepositMap>("caloIsoDeposits");
63  //produces<std::vector<double> >("combinedRelativeIsoDeposits");
64  produces<edm::ValueMap<double> >("combinedRelativeIsoDeposits");
65  }
66  produces<edm::ValueMap<bool> >();
67 
68  //
69  // Extractor
70  //
71  // Calorimeters (ONLY if not previously computed)
72  //
73  if( useCaloIso && (useRhoCorrectedCaloDeps==false) ) {
74  edm::ParameterSet caloExtractorPSet = theConfig.getParameter<edm::ParameterSet>("CaloExtractorPSet");
75 
76  std::string caloExtractorName = caloExtractorPSet.getParameter<std::string>("ComponentName");
77  caloExtractor = IsoDepositExtractorFactory::get()->create( caloExtractorName, caloExtractorPSet, consumesCollector());
78  //std::string caloDepositType = caloExtractorPSet.getUntrackedParameter<std::string>("DepositLabel"); // N.B. Not used in the following!
79  }
80 
81  // Tracker
82  //
83  edm::ParameterSet trkExtractorPSet = theConfig.getParameter<edm::ParameterSet>("TrkExtractorPSet");
84 
85  theTrackPt_Min = theConfig.getParameter<double>("TrackPt_Min");
86  std::string trkExtractorName = trkExtractorPSet.getParameter<std::string>("ComponentName");
87  trkExtractor = IsoDepositExtractorFactory::get()->create( trkExtractorName, trkExtractorPSet, consumesCollector());
88  //std::string trkDepositType = trkExtractorPSet.getUntrackedParameter<std::string>("DepositLabel"); // N.B. Not used in the following!
89 
90  //
91  // Cuts for track isolation
92  //
94  std::string cutsName = cutsPSet.getParameter<std::string>("ComponentName");
95  if (cutsName == "SimpleCuts") {
96  theCuts = Cuts(cutsPSet);
97  }
98  else if (
99  // (cutsName== "L3NominalEfficiencyCuts_PXLS" && depositType=="PXLS")
100  // || (cutsName== "L3NominalEfficiencyCuts_TRKS" && depositType=="TRKS")
102  (cutsName== "L3NominalEfficiencyCuts_PXLS" )
103  || (cutsName== "L3NominalEfficiencyCuts_TRKS") ) {
105  }
106  else {
107  LogError("L3MuonCombinedRelativeIsolationProducer::beginJob")
108  <<"cutsName: "<<cutsPSet<<" is not recognized:"
109  <<" theCuts not set!";
110  }
111  LogTrace("")<< theCuts.print();
112 
113  // (kludge) additional cut on the number of tracks
114  theMaxNTracks = cutsPSet.getParameter<int>("maxNTracks");
115  theApplyCutsORmaxNTracks = cutsPSet.getParameter<bool>("applyCutsORmaxNTracks");
116 
117 }
118 
121  LogDebug("RecoMuon|L3MuonCombinedRelativeIsolationProducer")<<" L3MuonCombinedRelativeIsolationProducer DTOR";
122  if (caloExtractor) delete caloExtractor;
123  if (trkExtractor) delete trkExtractor;
124 }
125 
129  desc.add<bool>("UseRhoCorrectedCaloDeposits",false);
130  desc.add<bool>("UseCaloIso",true);
131  desc.add<edm::InputTag>("CaloDepositsLabel",edm::InputTag("hltL3CaloMuonCorrectedIsolations"));
132  desc.add<edm::InputTag>("inputMuonCollection",edm::InputTag("hltL3MuonCandidates"));
133  desc.add<bool>("OutputMuIsoDeposits",true);
134  desc.add<double>("TrackPt_Min",-1.0);
135  desc.add<bool>("printDebug",false);
137  {
138  cutsPSet.add<std::vector<double> >("ConeSizes",std::vector<double>(1, 0.24));
139  cutsPSet.add<std::string>("ComponentName","SimpleCuts");
140  cutsPSet.add<std::vector<double> >("Thresholds",std::vector<double>(1, 0.1));
141  cutsPSet.add<int>("maxNTracks",-1);
142  cutsPSet.add<std::vector<double> >("EtaBounds",std::vector<double>(1, 2.411));
143  cutsPSet.add<bool>("applyCutsORmaxNTracks",false);
144  }
145  desc.add<edm::ParameterSetDescription>("CutsPSet",cutsPSet);
146  edm::ParameterSetDescription trkExtractorPSet;
147  {
148  trkExtractorPSet.add<double>("Chi2Prob_Min", -1.0);
149  trkExtractorPSet.add<double>("Chi2Ndof_Max", 1.0E64);
150  trkExtractorPSet.add<double>("Diff_z",0.2);
151  trkExtractorPSet.add<edm::InputTag>("inputTrackCollection",edm::InputTag("hltPixelTracks"));
152  trkExtractorPSet.add<double>("ReferenceRadius",6.0);
153  trkExtractorPSet.add<edm::InputTag>("BeamSpotLabel",edm::InputTag("hltOnlineBeamSpot"));
154  trkExtractorPSet.add<std::string>("ComponentName","PixelTrackExtractor");
155  trkExtractorPSet.add<double>("DR_Max",0.24);
156  trkExtractorPSet.add<double>("Diff_r",0.1);
157  trkExtractorPSet.add<bool>("VetoLeadingTrack",true);
158  trkExtractorPSet.add<double>("DR_VetoPt",0.025);
159  trkExtractorPSet.add<double>("DR_Veto",0.01);
160  trkExtractorPSet.add<unsigned int>("NHits_Min",0);
161  trkExtractorPSet.add<double>("Pt_Min",-1.0);
162  trkExtractorPSet.addUntracked<std::string>("DepositLabel","PXLS");
163  trkExtractorPSet.add<std::string>("BeamlineOption","BeamSpotFromEvent");
164  trkExtractorPSet.add<bool>("PropagateTracksToRadius",true);
165  trkExtractorPSet.add<double>("PtVeto_Min",2.0);
166  }
167  desc.add<edm::ParameterSetDescription>("TrkExtractorPSet",trkExtractorPSet);
168  edm::ParameterSetDescription caloExtractorPSet;
169  {
170  caloExtractorPSet.add<double>("DR_Veto_H",0.1);
171  caloExtractorPSet.add<bool>("Vertex_Constraint_Z",false);
172  caloExtractorPSet.add<double>("Threshold_H",0.5);
173  caloExtractorPSet.add<std::string>("ComponentName","CaloExtractor");
174  caloExtractorPSet.add<double>("Threshold_E",0.2);
175  caloExtractorPSet.add<double>("DR_Max",0.24);
176  caloExtractorPSet.add<double>("DR_Veto_E",0.07);
177  caloExtractorPSet.add<double>("Weight_E",1.5);
178  caloExtractorPSet.add<bool>("Vertex_Constraint_XY",false);
179  caloExtractorPSet.addUntracked<std::string>("DepositLabel","EcalPlusHcal");
180  caloExtractorPSet.add<edm::InputTag>("CaloTowerCollectionLabel",edm::InputTag("hltTowerMakerForMuons"));
181  caloExtractorPSet.add<double>("Weight_H",1.0);
182  }
183  desc.add<edm::ParameterSetDescription>("CaloExtractorPSet",caloExtractorPSet);
184  descriptions.add("hltL3MuonIsolations", desc);
185 }
186 
187 
189  std::string metname = "RecoMuon|L3MuonCombinedRelativeIsolationProducer";
190 
191  if (printDebug) std::cout <<" L3 Muon Isolation producing..."
192  <<" BEGINING OF EVENT " <<"================================" <<std::endl;
193 
194  // Take the SA container
195  if (printDebug) std::cout <<" Taking the muons: "<<theMuonCollectionLabel << std::endl;
197  event.getByToken(theMuonCollectionToken,muons);
198 
199  // Take calo deposits with rho corrections (ONLY if previously computed)
200  Handle< edm::ValueMap<float> > caloDepWithCorrMap;
202  event.getByToken(theCaloDepsToken, caloDepWithCorrMap);
203 
204  std::auto_ptr<reco::IsoDepositMap> caloDepMap( new reco::IsoDepositMap());
205  std::auto_ptr<reco::IsoDepositMap> trkDepMap( new reco::IsoDepositMap());
206 
207  std::auto_ptr<edm::ValueMap<bool> > comboIsoDepMap( new edm::ValueMap<bool> ());
208 
209  //std::auto_ptr<std::vector<double> > combinedRelativeDeps(new std::vector<double>());
210  std::auto_ptr<edm::ValueMap<double> > combinedRelativeDepMap(new edm::ValueMap<double>());
211 
212 
213  //
214  // get Vetos and deposits
215  //
216  unsigned int nMuons = muons->size();
217 
218  IsoDeposit::Vetos trkVetos(nMuons);
219  std::vector<IsoDeposit> trkDeps(nMuons);
220 
221 
222  // IsoDeposit::Vetos caloVetos(nMuons);
223  // std::vector<IsoDeposit> caloDeps(nMuons);
224  // std::vector<float> caloCorrDeps(nMuons, 0.); // if calo deposits with corrections available
225 
226  IsoDeposit::Vetos caloVetos;
227  std::vector<IsoDeposit> caloDeps;
228  std::vector<float> caloCorrDeps; // if calo deposits with corrections available
229 
231  caloCorrDeps.resize(nMuons, 0.);
232  }
233  else if (useCaloIso) {
234  caloVetos.resize(nMuons);
235  caloDeps.resize(nMuons);
236  }
237 
238  std::vector<double> combinedRelativeDeps(nMuons, 0.);
239  std::vector<bool> combinedRelativeIsos(nMuons, false);
240 
241  for (unsigned int i=0; i<nMuons; i++) {
242 
243  RecoChargedCandidateRef candref(muons,i);
244  TrackRef mu = candref->track();
245 
246  trkDeps[i] = trkExtractor->deposit(event, eventSetup, *mu);
247  trkVetos[i] = trkDeps[i].veto();
248 
250  caloCorrDeps[i] = (*caloDepWithCorrMap)[candref];
251  }
252  else if (useCaloIso) {
253  caloDeps[i] = caloExtractor->deposit(event, eventSetup, *mu);
254  caloVetos[i] = caloDeps[i].veto();
255  }
256 
257  }
258 
259  //
260  // add here additional vetos
261  //
262  //.....
263 
264  //
265  // actual cut step
266  //
267 
268  if (printDebug) std::cout << "Looping over deposits...." << std::endl;
269  for(unsigned int iMu=0; iMu < nMuons; ++iMu){
270 
271  if (printDebug) std::cout << "Muon number = " << iMu << std::endl;
272  TrackRef mu = (*muons)[iMu].track();
273 
274  // cuts
275  const Cuts::CutSpec & cut = theCuts( mu->eta());
276 
277 
278  if (printDebug) std::cout << "CUTDEBUG: Muon eta = " << mu->eta() << std::endl
279  << "CUTDEBUG: Muon pt = " << mu->pt() << std::endl
280  << "CUTDEBUG: minEta = " << cut.etaRange.min() << std::endl
281  << "CUTDEBUG: maxEta = " << cut.etaRange.max() << std::endl
282  << "CUTDEBUG: consize = " << cut.conesize << std::endl
283  << "CUTDEBUG: thresho = " << cut.threshold << std::endl;
284 
285  const IsoDeposit & trkDeposit = trkDeps[iMu];
286  if (printDebug) std::cout << trkDeposit.print();
287  std::pair<double, int> trkIsoSumAndCount = trkDeposit.depositAndCountWithin(cut.conesize, trkVetos, theTrackPt_Min);
288 
289  double caloIsoSum = 0.;
291  caloIsoSum = caloCorrDeps[iMu];
292  if(caloIsoSum<0.) caloIsoSum = 0.;
293  if(printDebug) std::cout << "Rho-corrected calo deposit (min. 0) = " << caloIsoSum << std::endl;
294  }
295  else if (useCaloIso) {
296  const IsoDeposit & caloDeposit = caloDeps[iMu];
297  if (printDebug) std::cout << caloDeposit.print();
298  caloIsoSum = caloDeposit.depositWithin(cut.conesize, caloVetos);
299  }
300 
301  double trkIsoSum = trkIsoSumAndCount.first;
302  int count = trkIsoSumAndCount.second;
303 
304  double muPt = mu->pt();
305  if( muPt<1. ) muPt = 1.;
306  double combinedRelativeDeposit = ((trkIsoSum + caloIsoSum ) / muPt);
307  bool result = ( combinedRelativeDeposit < cut.threshold);
308  if (theApplyCutsORmaxNTracks ) result |= count <= theMaxNTracks;
309  if (printDebug) std::cout <<" trk dep in cone: " << trkIsoSum << " with count "<<count <<std::endl
310  <<" calo dep in cone: " << caloIsoSum << std::endl
311  <<" muPt: " << muPt << std::endl
312  <<" relIso: " <<combinedRelativeDeposit << std::endl
313  <<" is isolated: "<<result << std::endl;
314 
315  combinedRelativeIsos[iMu] = result;
316  //combinedRelativeDeps->push_back(combinedRelativeDeposit);
317  combinedRelativeDeps[iMu] = combinedRelativeDeposit;
318  }
319 
320  //
321  // store
322  //
324 
325  reco::IsoDepositMap::Filler depFillerTrk(*trkDepMap);
326  depFillerTrk.insert(muons, trkDeps.begin(), trkDeps.end());
327  depFillerTrk.fill();
328  event.put(trkDepMap, "trkIsoDeposits");
329 
330  if( useCaloIso && (useRhoCorrectedCaloDeps==false) ) {
331  reco::IsoDepositMap::Filler depFillerCalo(*caloDepMap);
332  depFillerCalo.insert(muons, caloDeps.begin(), caloDeps.end());
333  depFillerCalo.fill();
334  event.put(caloDepMap, "caloIsoDeposits");
335  }
336 
337  //event.put(combinedRelativeDeps, "combinedRelativeIsoDeposits");
338  edm::ValueMap<double>::Filler depFillerCombRel(*combinedRelativeDepMap);
339  depFillerCombRel.insert(muons, combinedRelativeDeps.begin(), combinedRelativeDeps.end());
340  depFillerCombRel.fill();
341  event.put(combinedRelativeDepMap, "combinedRelativeIsoDeposits");
342 
343  }
344  edm::ValueMap<bool>::Filler isoFiller(*comboIsoDepMap);
345  isoFiller.insert(muons, combinedRelativeIsos.begin(), combinedRelativeIsos.end());
346  isoFiller.fill();
347  event.put(comboIsoDepMap);
348 
349  if (printDebug) std::cout <<" END OF EVENT " <<"================================";
350 }
#define LogDebug(id)
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > theMuonCollectionToken
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
const Veto & veto() const
Get veto area.
Definition: IsoDeposit.h:78
edm::EDGetTokenT< edm::ValueMap< float > > theCaloDepsToken
const std::string metname
bool theApplyCutsORmaxNTracks
apply or not the maxN cut on top of the sumPt (or nominall eff) &lt; cuts
void insert(const H &h, I begin, I end)
Definition: ValueMap.h:52
tuple result
Definition: mps_fire.py:84
double depositWithin(double coneSize, const Vetos &vetos=Vetos(), bool skipDepositVeto=false) const
Get deposit.
Definition: IsoDeposit.cc:34
std::string print() const
Definition: Cuts.cc:55
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
ParameterSet descriptions.
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
const int mu
Definition: Constants.h:22
ParameterDescriptionBase * add(U const &iLabel, T const &value)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
#define LogTrace(id)
virtual void produce(edm::Event &, const edm::EventSetup &) override
Produce isolation maps.
L3MuonCombinedRelativeIsolationProducer(const edm::ParameterSet &)
constructor with config
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool useCaloIso
flag to include or exclude calo iso from calculation
tuple muons
Definition: patZpeak.py:38
std::pair< double, int > depositAndCountWithin(double coneSize, const Vetos &vetos=Vetos(), double threshold=-1e+36, bool skipDepositVeto=false) const
Get deposit.
Definition: IsoDeposit.cc:44
std::string print() const
Definition: IsoDeposit.cc:181
tuple cout
Definition: gather_cfg.py:145
volatile std::atomic< bool > shutdown_flag false
virtual reco::IsoDeposit deposit(const edm::Event &ev, const edm::EventSetup &evSetup, const reco::Track &track) const =0
T get(const Candidate &c)
Definition: component.h:55