ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbbAnalysis/HbbAnalyzer/plugins/HbbCandidateFinder.cc
(Generate patch)

Comparing UserCode/VHbbAnalysis/HbbAnalyzer/plugins/HbbCandidateFinder.cc (file contents):
Revision 1.5 by tboccali, Tue Jun 21 16:22:47 2011 UTC vs.
Revision 1.9 by tboccali, Thu Jul 28 13:17:30 2011 UTC

# Line 1 | Line 1
1   #include "VHbbAnalysis/HbbAnalyzer/interface/HbbCandidateFinder.h"
2  
3 < struct CompareJetPt {
4 <  bool operator()( const VHbbEvent::SimpleJet& j1, const  VHbbEvent::SimpleJet& j2 ) const {
5 <    return j1.fourMomentum.Pt() > j2.fourMomentum.Pt();
6 <  }
7 < };
8 <
9 <  struct CompareBTag {
10 <    bool operator()(const  VHbbEvent::SimpleJet& j1, const  VHbbEvent::SimpleJet& j2 ) const {
11 <      return j1.csv > j2.csv;
12 <    }
13 <  };
14 <
15 < HbbCandidateFinder::HbbCandidateFinder(const edm::ParameterSet& iConfig):   vhbbevent_(iConfig.getParameter<edm::InputTag>("VHbbEventLabel")), verbose_ (iConfig.getParameter<bool>("verbose")), jetPtThreshold(iConfig.getParameter<double>("jetPtThreshold")){
3 > HbbCandidateFinder::HbbCandidateFinder(const edm::ParameterSet& iConfig): verbose_(iConfig.getParameter<bool>("verbose") ) {
4 >  algo_ = new HbbCandidateFinderAlgo(iConfig.getParameter<bool>("verbose"), iConfig.getParameter<double>("jetPtThreshold"),
5 >                                     iConfig.getParameter<bool>("useHighestPtHiggs")                         );
6 >  applyFilter = iConfig.getParameter<bool>("actAsAFilter");
7    produces<std::vector<VHbbCandidate > >();
8   }
9  
10 < HbbCandidateFinder::~HbbCandidateFinder(){}
10 > HbbCandidateFinder::~HbbCandidateFinder(){delete algo_;}
11  
12   void HbbCandidateFinder::beginJob(){}
13   void HbbCandidateFinder::endJob(){}
14  
15 <
25 < float HbbCandidateFinder::getDeltaTheta( const VHbbEvent::SimpleJet & j1, const VHbbEvent::SimpleJet & j2 ) const{
26 <
27 < double deltaTheta = 1e10;
28 < TLorentzVector pi(0,0,0,0);
29 < TLorentzVector v_j1 = j1.chargedTracksFourMomentum;
30 < TLorentzVector v_j2 = j2.chargedTracksFourMomentum;
31 <
32 < if( v_j2.Mag() == 0
33 <     || v_j1.Mag() == 0 )
34 <   return deltaTheta = 1e10;
35 <
36 < //use j1 to calculate the pull vector
37 < TVector2 t = j1.tVector;
38 <
39 < if( t.Mod() == 0 )
40 <   return deltaTheta = 1e10;
41 <
42 < Double_t dphi =  v_j2.Phi()- v_j1.Phi();
43 < if ( dphi > M_PI ) {
44 <   dphi -= 2.0*M_PI;
45 < } else if ( dphi <= -M_PI ) {
46 <   dphi += 2.0*M_PI;
47 < }
48 < Double_t deltaeta = v_j2.Rapidity() - v_j1.Rapidity();
49 < TVector2 BBdir( deltaeta, dphi );
50 <
51 < deltaTheta = t.DeltaPhi(BBdir);
52 <
53 < return deltaTheta;
54 <
55 < }
56 <
57 <
58 <
59 <
60 < void HbbCandidateFinder::produce( edm::Event& iEvent, const edm::EventSetup& iEventSetup){
15 > bool HbbCandidateFinder::filter( edm::Event& iEvent, const edm::EventSetup& iEventSetup){
16    
17    std::auto_ptr<std::vector<VHbbCandidate> >  vHbbCandidates( new std::vector<VHbbCandidate>  );
18  
# Line 73 | Line 28 | void HbbCandidateFinder::produce( edm::E
28    //  hbbCandidateFinderAlgo(vHbbCandidates, vHbbEvent-> result());
29    // do nothing for a test
30    
31 <  run(vHbbEvent.product(),vHbbCandidates);
77 <
78 <
79 <  if (verbose_)
80 <    std::cout <<" Pushing VHbb candidates: "<<vHbbCandidates->size()<<std::endl;
81 <
82 <  iEvent.put(vHbbCandidates);  
83 <
84 < }
85 <
86 < void HbbCandidateFinder::run (const VHbbEvent* event, std::auto_ptr<std::vector<VHbbCandidate> > & candidates){
87 <  //
88 <  // first find the jets
89 <  //
90 <
91 <  VHbbEvent::SimpleJet j1,j2;
92 <  std::vector<VHbbEvent::SimpleJet> addJets;
93 <  bool foundJets = findDiJets(event->simpleJets2,j1,j2,addJets) ;
94 <
95 <  if (verbose_){
96 <    std::cout <<" Found Dijets: "<<foundJets<< " Additional: "<<addJets.size()<< std::endl;
97 <  }
31 >  algo_->run(vHbbEvent.product(),(*vHbbCandidates));
32    
99  if (foundJets == false) return;
100  //
101  // search for leptons
102  //
103  std::vector<VHbbEvent::MuonInfo> mu;
104  findMuons(event->muInfo,mu);
105  std::vector<VHbbEvent::ElectronInfo> ele;
106 findElectrons(event->eleInfo,ele);
107  
108  std::vector<VHbbEvent::METInfo> met;
109  findMET(event->pfmet, met);
110
111  if (verbose_){
112    std::cout <<" Electrons: "<< ele.size()<<std::endl;
113    std::cout <<" Muons    : "<< mu.size()<<std::endl;
114    std::cout <<" MET      : "<< met.size()<<std::endl;
115  }
116  if (ele.size()<1 && mu.size() < 1 && met.size()<1) return;
117
118  //
119  // fill!
120  //
121  VHbbCandidate temp;
122  temp.H.jets.push_back(j1);
123  temp.H.jets.push_back(j2);
124  temp.H.fourMomentum = (j1).fourMomentum+(j2).fourMomentum;
125  temp.H.deltaTheta = getDeltaTheta(j1,j2);
126  //  temp.H.deltaTheta = getDeltaTheta()
127  temp.additionalJets = addJets;
128  temp.V.mets = met;
129  temp.V.muons = mu;
130  temp.V.electrons = ele;
33    
34 <  candidates->push_back(temp);
35 < }
134 <
135 < void HbbCandidateFinder::findMET(const VHbbEvent::METInfo & met, std::vector<VHbbEvent::METInfo>& out){
136 <  //
137 <  //  just preselection: met significance > 2
138 <    if (met.metSig >2 ) out.push_back(met);
139 <  
140 < }
141 <
142 <
143 < bool HbbCandidateFinder::findDiJets (const std::vector<VHbbEvent::SimpleJet>& jets, VHbbEvent::SimpleJet& j1, VHbbEvent::SimpleJet& j2,std::vector<VHbbEvent::SimpleJet>& addJets){
34 >  if (verbose_)
35 >    std::cout <<" Pushing VHbb candidates: "<<vHbbCandidates->size()<<std::endl;
36    
37 < std::vector<VHbbEvent::SimpleJet> tempJets;
146 <
147 < for (unsigned int i=0 ; i< jets.size(); ++i){
148 <   if (jets[i].fourMomentum.Pt()> jetPtThreshold)
149 <     tempJets.push_back(jets[i]);
150 < }
151 <
152 < CompareBTag  bTagComparator;
153 <
154 < if (tempJets.size()<2) return false;
155 <
156 < std::sort(tempJets.begin(), tempJets.end(), bTagComparator);
157 <
158 < j1 = tempJets[0];
159 < j2 = tempJets[1];
160 < //
161 < // additional jets
162 < //
163 < if (tempJets.size()>2){
164 <   for (unsigned int i=2 ; i< tempJets.size(); ++i){
165 <     addJets.push_back(tempJets[i]);
166 <   }
167 < }
168 <  CompareJetPt ptComparator;
169 <
170 <  std::sort(addJets.begin(), addJets.end(), ptComparator);
171 < return true;
172 < }
37 >  iEvent.put(vHbbCandidates);  
38  
39 < void HbbCandidateFinder::findMuons(const std::vector<VHbbEvent::MuonInfo>& muons, std::vector<VHbbEvent::MuonInfo>& out){
40 <  /* Use:
41 < For both W -> mu nu and Z -> mu mu, we adopt the standard VBTF muon selection described in VbtfWmunuBaselineSelection. The explicit cuts are reproduced here:
177 <
178 <    We use RECO Muons that are both Global and Tracker
179 <    chi2/ndof < 10 for the global muon fit
180 <    The track associated to the muon must have
181 <        >= 1 pixel hits
182 <        >= 10 pixel + strip hits
183 <        >= 1 valid hit in the muon chambers
184 <        >= 2 muon stations
185 <        |dxy| < 0.2
186 <        |eta| < 2.4
187 <    Relative combined isolation (R) is required to be < 0.15
188 <        R = [Sum pT(trks) + Et(ECAL) + Et(HCAL)] / pT(mu) computed in a cone of radius 0.3 in eta-phi
189 <    pT(mu) > 20 GeV
190 <  */
191 <  for (std::vector<VHbbEvent::MuonInfo>::const_iterator it = muons.begin(); it!= muons.end(); ++it){
192 <    if (
193 <        (*it). globChi2<10 &&
194 <        (*it).nPixelHits>= 1 &&
195 <        (*it).globNHits >= 1 &&
196 <        (*it).nHits >= 10 &&
197 <        (*it).cat ==1 &&
198 <        (*it).validMuStations >=2 &&
199 <        (*it).ipDb<.2 &&
200 <        ((*it).hIso+(*it).eIso+(*it).tIso)/(*it).fourMomentum.Pt()<.15 &&
201 <        (*it).fourMomentum.Eta()<2.4 &&
202 <        (*it).fourMomentum.Pt()>15) {
203 <      out.push_back(*it);
204 <    }
205 <  }
39 >  if (applyFilter == false) return true;
40 >  if (vHbbCandidates->size() == 0) return false;
41 >  return true;
42   }
43  
44  
209 void HbbCandidateFinder::findElectrons(const std::vector<VHbbEvent::ElectronInfo>& electrons, std::vector<VHbbEvent::ElectronInfo>& out){
210  /*
211 We adopt the standard cut-based selection from VBTF described in detail here.
212
213    Z -> ee
214        gsf electrons
215        VBTF WP95
216        |eta|<2.5, excluding the gap 1.44 < |eta| < 1.57
217        pT(e) > 20
218
219    W -> e nu
220        gsf electrons
221        VBTF WP80
222        |eta|<2.5, excluding the gap 1.44 < |eta| < 1.57
223        pT(e) > 30
224  */
225
226  for (std::vector<VHbbEvent::ElectronInfo>::const_iterator it = electrons.begin(); it!= electrons.end(); ++it){
227    if (
228        // fake
229        //      (*it).id95>  &&
230        std::abs((*it).fourMomentum.Eta()) < 2.5 &&
231        !(      std::abs((*it).fourMomentum.Eta()) < 1.57 &&    std::abs((*it).fourMomentum.Eta()) > 1.44) &&
232        (*it).fourMomentum.Pt()>15 //  I use the minimum ok for both Z and W
233        ){
234      out.push_back(*it);
235    }  
236  }
237 }
238
45  
46   //define this as a plug-in
47   DEFINE_FWK_MODULE(HbbCandidateFinder);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines