CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ChargedHadronTrackResolutionFilter.cc
Go to the documentation of this file.
1 
2 
3 
4 // system include files
5 #include <memory>
6 #include <iostream>
7 
8 // user include files
11 
14 
16 
23 //
24 // class declaration
25 //
26 
28 public:
31 
32 private:
33  virtual bool filter(edm::StreamID iID, edm::Event&, const edm::EventSetup&) const override;
34 
35  // ----------member data ---------------------------
36 
39  const bool taggingMode_;
40  const double ptMin_;
41  const double metSignifMin_;
42  const double p1_;
43  const double p2_;
44  const double p3_;
45  const bool debug_;
46 
47 };
48 
49 //
50 // constants, enums and typedefs
51 //
52 
53 //
54 // static data member definitions
55 //
56 
57 //
58 // constructors and destructor
59 //
61  : tokenPFCandidates_ ( consumes<reco::PFCandidateCollection>(iConfig.getParameter<edm::InputTag> ("PFCandidates") ))
62  , tokenPFMET_ ( consumes<reco::PFMETCollection>(iConfig.getParameter<edm::InputTag> ("PFMET") ))
63  , taggingMode_ ( iConfig.getParameter<bool> ("taggingMode") )
64  , ptMin_ ( iConfig.getParameter<double> ("ptMin") )
65  , metSignifMin_ ( iConfig.getParameter<double> ("MetSignifMin") )
66  , p1_ ( iConfig.getParameter<double> ("p1") )
67  , p2_ ( iConfig.getParameter<double> ("p2") )
68  , p3_ ( iConfig.getParameter<double> ("p3") )
69  , debug_ ( iConfig.getParameter<bool> ("debug") )
70 {
71  produces<bool>();
72 }
73 
75 
76 
77 //
78 // member functions
79 //
80 
81 // ------------ method called on each new Event ------------
82 bool
84 {
85  using namespace std;
86  using namespace edm;
87 
92 
93  bool foundBadTrack = false;
94  if ( debug_ ) cout << "starting loop over pfCandidates" << endl;
95 
96  for ( unsigned i=0; i<pfCandidates->size(); ++i ) {
97 
98  const reco::PFCandidate & cand = (*pfCandidates)[i];
99 
100  if ( std::abs(cand.pdgId()) == 211 ) {
101 
102  if (cand.trackRef().isNull()) continue;
103 
104  const reco::TrackRef trackref = cand.trackRef();
105  const double Pt = trackref->pt();
106  const double DPt = trackref->ptError();
107  if (Pt < ptMin_) continue;
108  if ( debug_ ) cout << "charged hadron track pT > " << Pt << " GeV - " << " dPt: " << DPt << " GeV - algorithm: " << trackref->algo() << std::endl;
109 
110  const double P = trackref->p();
111 
112  const unsigned int LostHits = trackref->numberOfLostHits();
113 
114  if ( (DPt/Pt) > (p1_ * sqrt(p2_*p2_/P+p3_*p3_) / (1.+LostHits)) ) {
115 
116  const double MET_px = pfMET->begin()->px();
117  const double MET_py = pfMET->begin()->py();
118  const double MET_et = pfMET->begin()->et();
119  const double MET_sumEt = pfMET->begin()->sumEt();
120  const double hadron_px = cand.px();
121  const double hadron_py = cand.py();
122  if (MET_sumEt == 0) continue;
123  const double MET_signif = MET_et/MET_sumEt;
124  const double MET_et_corr = sqrt( (MET_px + hadron_px)*(MET_px + hadron_px) + (MET_py + hadron_py)*(MET_py + hadron_py) );
125  const double MET_signif_corr = MET_et_corr/MET_sumEt;
126  if ( debug_ ) std::cout << "MET signif before: " << MET_signif << " - after: " << MET_signif_corr << " - reduction factor: " << MET_signif/MET_signif_corr << endl;
127 
128  if ( (MET_signif/MET_signif_corr) > metSignifMin_ ) {
129 
130  foundBadTrack = true;
131 
132  if ( debug_ ) {
133  cout << cand << endl;
134  cout << "charged hadron \t" << "track pT = " << Pt << " +/- " << DPt;
135  cout << endl;
136  cout << "MET: " << MET_et << " MET phi: " << pfMET->begin()->phi()<<
137  " MET sumet: " << MET_sumEt << " MET significance: " << MET_et/MET_sumEt << endl;
138  cout << "MET_px: " << MET_px << " MET_py: " << MET_py << " hadron_px: " << hadron_px << " hadron_py: " << hadron_py << endl;
139  cout << "corrected: " << sqrt( pow((MET_px + hadron_px),2) + pow((MET_py + hadron_py),2)) << endl;
140  }
141  }
142  }
143  }
144  } // end loop over PF candidates
145 
146  bool pass = !foundBadTrack;
147 
148  iEvent.put( std::auto_ptr<bool>(new bool(pass)) );
149 
150  return taggingMode_ || pass;
151 }
152 
153 //define this as a plug-in
int i
Definition: DBlmapReader.cc:9
virtual int pdgId() const
PDG identifier.
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:464
edm::EDGetTokenT< reco::PFMETCollection > tokenPFMET_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
#define P
tuple pfMET
Definition: pfMET_cfi.py:7
edm::EDGetTokenT< reco::PFCandidateCollection > tokenPFCandidates_
std::vector< PFCandidatePtr > pfCandidates(const PFJet &jet, int particleId, bool sort=true)
reco::TrackRef trackRef() const
Definition: PFCandidate.cc:433
int iEvent
Definition: GenABIO.cc:230
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:120
T sqrt(T t)
Definition: SSEVec.h:48
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool isNull() const
Checks for null.
Definition: Ref.h:249
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
virtual bool filter(edm::StreamID iID, edm::Event &, const edm::EventSetup &) const override
virtual double px() const
x coordinate of momentum vector
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:39
tuple cout
Definition: gather_cfg.py:121
virtual double py() const
y coordinate of momentum vector
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
Collection of PF MET.