00001 #include "TMath.h"
00002 #include <algorithm>
00003
00004 #include "PhysicsTools/JetMCUtils/interface/combination.h"
00005 #include "PhysicsTools/MVATrainer/interface/HelperMacros.h"
00006
00007 #include "AnalysisDataFormats/TopObjects/interface/TtEvent.h"
00008 #include "TopQuarkAnalysis/TopEventSelection/plugins/TtSemiLepSignalSelMVATrainer.h"
00009 #include "TopQuarkAnalysis/TopEventSelection/interface/TtSemiLepSignalSelEval.h"
00010
00011 #include "DataFormats/PatCandidates/interface/MET.h"
00012 #include "DataFormats/PatCandidates/interface/Jet.h"
00013 #include "DataFormats/PatCandidates/interface/Muon.h"
00014 #include "DataFormats/PatCandidates/interface/Flags.h"
00015 #include "DataFormats/PatCandidates/interface/Electron.h"
00016 #include "DataFormats/RecoCandidate/interface/RecoCandidate.h"
00017
00018
00019 TtSemiLepSignalSelMVATrainer::TtSemiLepSignalSelMVATrainer(const edm::ParameterSet& cfg):
00020 muons_ (cfg.getParameter<edm::InputTag>("muons")),
00021 electrons_ (cfg.getParameter<edm::InputTag>("electrons")),
00022 jets_ (cfg.getParameter<edm::InputTag>("jets")),
00023 METs_ (cfg.getParameter<edm::InputTag>("METs")),
00024 lepChannel_(cfg.getParameter<int>("lepChannel")),
00025 whatData_ (cfg.getParameter<int>("whatData")),
00026 maxEv_ (cfg.getParameter<int>("maxEv"))
00027 {
00028 }
00029
00030 TtSemiLepSignalSelMVATrainer::~TtSemiLepSignalSelMVATrainer()
00031 {
00032 }
00033
00034 void
00035 TtSemiLepSignalSelMVATrainer::analyze(const edm::Event& evt, const edm::EventSetup& setup)
00036 {
00037
00038 mvaComputer.update<TtSemiLepSignalSelMVARcd>("trainer", setup, "traintreeSaver");
00039
00040
00041
00042 if(!mvaComputer) return;
00043
00044
00045
00046
00047 edm::Handle<edm::View<pat::MET> > MET_handle;
00048 evt.getByLabel(METs_,MET_handle);
00049 if(!MET_handle.isValid()) return;
00050 const edm::View<pat::MET> MET = *MET_handle;
00051
00052 edm::Handle< std::vector<pat::Jet> > jet_handle;
00053 evt.getByLabel(jets_, jet_handle);
00054 if(!jet_handle.isValid()) return;
00055 const std::vector<pat::Jet> jets = *jet_handle;
00056 unsigned int nJets = 0;
00057 std::vector<pat::Jet> seljets;
00058
00059 for(std::vector<pat::Jet>::const_iterator it = jets.begin(); it != jets.end(); it++) {
00060
00061 if(!(pat::Flags::test(*it, pat::Flags::Overlap::Electrons))) continue;
00062 if(it->et()>30. && fabs(it->eta())<2.4) {
00063 seljets.push_back(*it);
00064 nJets++;
00065 }
00066 }
00067
00068 if(nJets<4) return;
00069
00070
00071 sort(seljets.begin(),seljets.end(),JetwithHigherPt());
00072
00073 edm::Handle< edm::View<pat::Muon> > muon_handle;
00074 evt.getByLabel(muons_, muon_handle);
00075 if(!muon_handle.isValid()) return;
00076 const edm::View<pat::Muon> muons = *muon_handle;
00077 int nmuons = 0;
00078 std::vector<pat::Muon> selMuons;
00079 for(edm::View<pat::Muon>::const_iterator it = muons.begin(); it!=muons.end(); it++) {
00080 reco::TrackRef gltr = it->track();
00081 reco::TrackRef trtr = it->innerTrack();
00082 if(it->pt()>30 && fabs(it->eta())<2.1 && (it->pt()/(it->pt()+it->trackIso()+it->caloIso()))>0.95 && it->isGlobalMuon()){
00083 if(gltr.isNull()) continue;
00084 if((gltr->chi2()/gltr->ndof())<10 && trtr->numberOfValidHits()>=11) {
00085
00086 double dRmin = 9999.;
00087 for(std::vector<pat::Jet>::const_iterator ajet = seljets.begin(); ajet != seljets.end(); ajet++) {
00088 math::XYZTLorentzVector jet = ajet->p4();
00089 math::XYZTLorentzVector muon = it->p4();
00090 double tmpdR = DeltaR(muon,jet);
00091 if(tmpdR<dRmin) dRmin = tmpdR;
00092 }
00093 reco::TrackRef trtr = it->track();
00094 if(dRmin>0.3) {
00095 nmuons++;
00096 selMuons.push_back(*it);
00097 }
00098 }
00099 }
00100 }
00101
00102 if(nmuons!=1) return;
00103
00104 edm::Handle< edm::View<pat::Electron> > electron_handle;
00105 evt.getByLabel(electrons_, electron_handle);
00106 if(!electron_handle.isValid()) return;
00107 const edm::View<pat::Electron> electrons = *electron_handle;
00108 int nelectrons = 0;
00109 for(edm::View<pat::Electron>::const_iterator it = electrons.begin(); it!=electrons.end(); it++) {
00110 if(it->pt()>30 && fabs(it->eta())<2.4 && (it->pt()/(it->pt()+it->trackIso()+it->caloIso()))>0.95 && it->isElectronIDAvailable("eidTight"))
00111 {
00112 if(it->electronID("eidTight")==1) nelectrons++;
00113 }
00114 }
00115 if(nelectrons>0) return;
00116
00117
00118
00119 math::XYZTLorentzVector muon = selMuons.begin()->p4();
00120
00121
00122 selEv++;
00123
00124 if(selEv>maxEv_ && maxEv_!=-1) return;
00125
00126
00127
00128
00129
00130
00131
00132 TtSemiLepSignalSel selection(seljets,muon,MET);
00133
00134
00135 edm::Handle<TtGenEvent> genEvt;
00136 evt.getByLabel("genEvt", genEvt);
00137
00138 double weight = 1.0;
00139
00140 if(whatData_==-1) {
00141 bool isSignal;
00142 isSignal = true;
00143 evaluateTtSemiLepSignalSel(mvaComputer, selection, weight, true, isSignal);
00144 }
00145 else {
00146
00147 if(whatData_==1){
00148
00149
00150 if(genEvt->isSemiLeptonic() && genEvt->semiLeptonicChannel() == lepChannel_) {
00151
00152 evaluateTtSemiLepSignalSel(mvaComputer, selection, weight, true, true);
00153 }
00154 else selEv--;
00155 }
00156 else if(whatData_==0){
00157
00158 evaluateTtSemiLepSignalSel(mvaComputer, selection, weight, true, false);
00159 }
00160 else std::cout<<"Config File Error!! Please check <whatData> in TtSemiLepSignalSelMVATrainer.cfi";
00161 }
00162 }
00163
00164 void TtSemiLepSignalSelMVATrainer::beginJob(const edm::EventSetup&){
00165 selEv = 0;
00166 if(whatData_!=-1 && whatData_!=0 && whatData_!=1){
00167 std::cout<<"Config File Error!! Please check <whatData> in TtSemiLepSignalSelMVATrainer.cfi"<<std::endl;;
00168 return;
00169 }
00170 }
00171
00172 double TtSemiLepSignalSelMVATrainer::DeltaPhi(math::XYZTLorentzVector v1, math::XYZTLorentzVector v2)
00173 {
00174 double dPhi = fabs(v1.Phi() - v2.Phi());
00175 if (dPhi > TMath::Pi()) dPhi = 2*TMath::Pi() - dPhi;
00176 return dPhi;
00177 }
00178
00179 double TtSemiLepSignalSelMVATrainer::DeltaR(math::XYZTLorentzVector v1, math::XYZTLorentzVector v2)
00180 {
00181 double dPhi = DeltaPhi(v1,v2);
00182 double dR = TMath::Sqrt((v1.Eta()-v2.Eta())*(v1.Eta()-v2.Eta())+dPhi*dPhi);
00183 return dR;
00184 }
00185
00186
00187
00188
00189
00190 MVA_TRAINER_IMPLEMENT(TtSemiLepSignalSelMVA);