CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PFRecoTauDiscriminationByIsolation.cc
Go to the documentation of this file.
4 
5 /* class PFRecoTauDiscriminationByIsolation
6  * created : Jul 23 2007,
7  * revised : Thu Aug 13 14:44:40 PDT 2009
8  * contributors : Ludovic Houchu (Ludovic.Houchu@cern.ch ; IPHC, Strasbourg), Christian Veelken (veelken@fnal.gov ; UC Davis),
9  * Evan K. Friis (friis@physics.ucdavis.edu ; UC Davis)
10  */
11 
12 using namespace reco;
13 using namespace std;
14 
16  public:
18  qualityCuts_(iConfig.getParameter<edm::ParameterSet>("qualityCuts")) // retrieve quality cuts
19  {
20  includeTracks_ = iConfig.getParameter<bool>("ApplyDiscriminationByTrackerIsolation");
21  includeGammas_ = iConfig.getParameter<bool>("ApplyDiscriminationByECALIsolation");
22 
23  applyOccupancyCut_ = iConfig.getParameter<bool>("applyOccupancyCut");
24  maximumOccupancy_ = iConfig.getParameter<uint32_t>("maximumOccupancy");
25 
26  applySumPtCut_ = iConfig.getParameter<bool>("applySumPtCut");
27  maximumSumPt_ = iConfig.getParameter<double>("maximumSumPtCut");
28 
29  applyRelativeSumPtCut_ = iConfig.getParameter<bool>("applyRelativeSumPtCut");
30  maximumRelativeSumPt_ = iConfig.getParameter<double>("relativeSumPtCut");
31 
32  pvProducer_ = iConfig.getParameter<edm::InputTag>("PVProducer");
33  }
34 
36 
37  void beginEvent(const edm::Event& evt, const edm::EventSetup& evtSetup);
38  double discriminate(const PFTauRef& pfTau);
39 
40  private:
42 
45 
48 
50  double maximumSumPt_;
51 
54 
56 
58 };
59 
61 {
62  // NB: The use of the PV in this context is necessitated by its use in applying quality cuts to the
63  // different objects in the isolation cone
64 
65  // get the PV for this event
66  edm::Handle<VertexCollection> primaryVertices;
67  event.getByLabel(pvProducer_, primaryVertices);
68 
69  // take the highest pt primary vertex in the event
70  if( primaryVertices->size() )
71  {
72  currentPV_ = *(primaryVertices->begin());
73  } else // no PV exists, so simulate it ala PFRecoTauProducer.cc
74  {
75  const double smearedPVsigmaY = 0.0015;
76  const double smearedPVsigmaX = 0.0015;
77  const double smearedPVsigmaZ = 0.005;
78  Vertex::Error SimPVError;
79  SimPVError(0,0) = smearedPVsigmaX*smearedPVsigmaX;
80  SimPVError(1,1) = smearedPVsigmaY*smearedPVsigmaY;
81  SimPVError(2,2) = smearedPVsigmaZ*smearedPVsigmaZ;
82  Vertex::Point blankVertex(0, 0, 0);
83  // note that the PFTau has its vertex set as the associated PV. So if it doesn't exist,
84  // a fake vertex has already been created (about 0, 0, 0) w/ the above width (gaussian)
85  currentPV_ = Vertex(blankVertex, SimPVError,1,1,1);
86  }
87 }
88 
90 {
91  // collect the objects we are working with (ie tracks, tracks+gammas, etc)
92  std::vector<LeafCandidate> isoObjects;
93 
94  if( includeTracks_ )
95  {
96  qualityCuts_.isolationChargedObjects(*pfTau, currentPV_, isoObjects);
97  }
98 
99  if( includeGammas_ )
100  {
101  qualityCuts_.isolationGammaObjects(*pfTau, isoObjects);
102  }
103 
104  bool failsOccupancyCut = false;
105  bool failsSumPtCut = false;
106  bool failsRelativeSumPtCut = false;
107 
108  //--- nObjects requirement
109  failsOccupancyCut = ( isoObjects.size() > maximumOccupancy_ );
110 
111  //--- Sum PT requirement
112  if( applySumPtCut_ || applyRelativeSumPtCut_ )
113  {
115  for(std::vector<LeafCandidate>::const_iterator iIsoObject = isoObjects.begin();
116  iIsoObject != isoObjects.end();
117  ++iIsoObject)
118  {
119  totalP4 += iIsoObject->p4();
120  }
121 
122  failsSumPtCut = ( totalP4.pt() > maximumSumPt_ );
123 
124  //--- Relative Sum PT requirement
125  failsRelativeSumPtCut = ( ( pfTau->pt() > 0 ? totalP4.pt()/pfTau->pt() : 0 ) > maximumRelativeSumPt_ );
126  }
127 
128  bool fails = ( applyOccupancyCut_ && failsOccupancyCut ) ||
129  ( applySumPtCut_ && failsSumPtCut ) ||
130  ( applyRelativeSumPtCut_ && failsRelativeSumPtCut ) ;
131 
132  return ( fails ? 0. : 1. );
133 }
134 
136 
137 /*
138 void PFRecoTauDiscriminationByIsolation::produce(edm::Event& iEvent,const edm::EventSetup& iEventSetup){
139  edm::Handle<PFTauCollection> thePFTauCollection;
140  iEvent.getByLabel(PFTauProducer_,thePFTauCollection);
141 
142  // fill the AssociationVector object
143  auto_ptr<PFTauDiscriminator> thePFTauDiscriminatorByIsolation(new PFTauDiscriminator(PFTauRefProd(thePFTauCollection)));
144 
145  for(size_t iPFTau=0;iPFTau<thePFTauCollection->size();++iPFTau) {
146  PFTauRef thePFTauRef(thePFTauCollection,iPFTau);
147  PFTau thePFTau=*thePFTauRef;
148  math::XYZVector thePFTau_XYZVector=thePFTau.momentum();
149  PFTauElementsOperators thePFTauElementsOperators(thePFTau);
150  if (ApplyDiscriminationByTrackerIsolation_){
151  // optional selection by a tracker isolation : ask for 0 charged hadron PFCand / reco::Track in an isolation annulus around a leading PFCand / reco::Track axis
152  float TrackPtSum=0;
153  double theTrackerIsolationDiscriminator = 1.;
154  if (ManipulateTracks_insteadofChargedHadrCands_){
155  const TrackRefVector& isolationTracks = thePFTau.isolationTracks();
156  unsigned int tracksAboveThreshold = 0;
157 
158  for(size_t iTrack = 0; iTrack < isolationTracks.size(); ++iTrack)
159  {
160 
161  if (SumOverCandidates_){
162  TrackPtSum+=isolationTracks[iTrack]->pt();
163  if ((TrackPtSum>maxChargedPt_)&&(!TrackIsolationOverTauPt_)){
164  theTrackerIsolationDiscriminator = 0.;
165  break;
166  }
167  if ((TrackPtSum/thePFTau.pt()>maxChargedPt_)&&(TrackIsolationOverTauPt_)){
168  theTrackerIsolationDiscriminator = 0.;
169  break;
170  }
171  }
172  else{
173  if(isolationTracks[iTrack]->pt() > maxChargedPt_) {
174  if(++tracksAboveThreshold > TrackerIsolAnnulus_Tracksmaxn_)
175  {
176  theTrackerIsolationDiscriminator = 0.;
177  break;
178  }
179  }
180  }
181  }
182 
183  } else { //use pf candidates instead
184  const PFCandidateRefVector& pfIsoChargedCands = thePFTau.isolationPFChargedHadrCands();
185  unsigned int tracksAboveThreshold = 0;
186  for(size_t iIsoCand = 0; iIsoCand < pfIsoChargedCands.size(); ++iIsoCand)
187  {
188  if (SumOverCandidates_){
189  TrackPtSum+=pfIsoChargedCands[iIsoCand]->pt();
190  if ((TrackPtSum>maxChargedPt_)&&(!TrackIsolationOverTauPt_)){
191  theTrackerIsolationDiscriminator = 0.;
192  break;
193  }
194  if ((TrackPtSum/thePFTau.pt()>maxChargedPt_)&&(TrackIsolationOverTauPt_)){
195  theTrackerIsolationDiscriminator = 0.;
196  break;
197  }
198  }
199  else{
200  if(pfIsoChargedCands[iIsoCand]->pt() > maxChargedPt_) {
201  if(++tracksAboveThreshold > TrackerIsolAnnulus_Candsmaxn_) {
202  theTrackerIsolationDiscriminator = 0.;
203  break;
204  }
205  }
206  }
207  }
208  }
209 
210  if (theTrackerIsolationDiscriminator == 0.){
211  thePFTauDiscriminatorByIsolation->setValue(iPFTau,0.);
212  continue;
213  }
214  }
215 
216  if (ApplyDiscriminationByECALIsolation_){
217 
218  // optional selection by an ECAL isolation : ask for 0 gamma PFCand in an isolation annulus around a leading PFCand
219  double theECALIsolationDiscriminator =1.;
220  const PFCandidateRefVector& pfIsoGammaCands = thePFTau.isolationPFGammaCands();
221  unsigned int gammasAboveThreshold = 0;
222  float PhotonSum=0;
223  for(size_t iIsoGamma = 0; iIsoGamma < pfIsoGammaCands.size(); ++iIsoGamma)
224  {
225  if (SumOverCandidates_){
226  PhotonSum+=pfIsoGammaCands[iIsoGamma]->pt();
227  if ((PhotonSum>maxGammaPt_)&&(!TrackIsolationOverTauPt_)){
228  theECALIsolationDiscriminator = 0.;
229  break;
230  }
231  if ((PhotonSum/thePFTau.pt()>maxGammaPt_)&&(TrackIsolationOverTauPt_)){
232  theECALIsolationDiscriminator = 0.;
233  break;
234  }
235  }
236  else{
237  if(pfIsoGammaCands[iIsoGamma]->pt() > maxGammaPt_) {
238  if(++gammasAboveThreshold > ECALIsolAnnulus_Candsmaxn_) {
239  theECALIsolationDiscriminator = 0;
240  break;
241  }
242  }
243  }
244  }
245  if (theECALIsolationDiscriminator==0.){
246  thePFTauDiscriminatorByIsolation->setValue(iPFTau,0);
247  continue;
248  }
249  }
250 
251  // not optional selection : ask for a leading (Pt>minPt) PFCand / reco::Track in a matching cone around the PFJet axis
252  bool theleadElementDiscriminator = true;
253  if (ManipulateTracks_insteadofChargedHadrCands_) {
254  if (!thePFTau.leadTrack()) theleadElementDiscriminator = false;
255  } else if (!thePFTau.leadPFChargedHadrCand()) theleadElementDiscriminator = false;
256 
257  if (!theleadElementDiscriminator) thePFTauDiscriminatorByIsolation->setValue(iPFTau,0);
258  else thePFTauDiscriminatorByIsolation->setValue(iPFTau,1); //passes everything
259  }
260 
261  iEvent.put(thePFTauDiscriminatorByIsolation);
262 
263 }
264 
265 */
T getParameter(std::string const &) const
PFRecoTauDiscriminationByIsolation(const edm::ParameterSet &iConfig)
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:44
math::XYZPoint Point
point in the space
Definition: Vertex.h:40
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
void beginEvent(const edm::Event &evt, const edm::EventSetup &evtSetup)
DEFINE_FWK_MODULE(CosmicTrackingParticleSelector)
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Particle.h:26