00001
00002
00003
00004
00005
00006
00007
00015
00016
00017
00018
00019
00020
00021
00022 #include "HLTriggerOffline/Tau/interface/L25TauAnalyzer.h"
00023 #include "Math/GenVector/VectorUtil.h"
00024
00025
00026 using namespace edm;
00027 using namespace reco;
00028 using namespace std;
00029
00030 L25TauAnalyzer::L25TauAnalyzer(const edm::ParameterSet& iConfig){
00031 jetTagSrc_ = iConfig.getParameter<InputTag>("JetTagProd");
00032 jetMCTagSrc_ = iConfig.getParameter<InputTag>("JetMCTagProd");
00033 rootFile_ = iConfig.getParameter<string>("outputFileName");
00034 signal_ = iConfig.getParameter<bool>("Signal");
00035 minTrackPt_ =iConfig.getParameter<double>("MinTrackPt");
00036 signalCone_ =iConfig.getParameter<double>("SignalCone");
00037 isolationCone_ =iConfig.getParameter<double>("IsolationCone");
00038
00039 l25file = new TFile(rootFile_.c_str(),"recreate");
00040 l25tree = new TTree("l25tree","Level 2.5 Tau Tree");
00041
00042 jetEt=0.;
00043 jetEta=0.;
00044 jetMCEt=0.;
00045 jetMCEta=0.;
00046 leadSignalTrackPt=0.;
00047 trkDrRMS=0.;
00048 trkDrRMSA=0.;
00049 leadTrkJetDeltaR=0.;
00050 numPixTrkInJet=0;
00051 numQPixTrkInJet=0;
00052 numQPixTrkInSignalCone=0;
00053 numQPixTrkInAnnulus=0;
00054 hasLeadTrk=0;
00055 emf=0;
00056
00057
00058 l25tree->Branch("jetEt", &jetEt, "jetEt/F");
00059 l25tree->Branch("jetEMF", &emf, "jetEMF/F");
00060 l25tree->Branch("jetEta", &jetEta, "jetEta/F");
00061 l25tree->Branch("jetMCEt", &jetMCEt, "jetMCEt/F");
00062 l25tree->Branch("jetMCEta", &jetMCEta, "jetMCEta/F");
00063 l25tree->Branch("leadTrackPt", &leadSignalTrackPt, "leadTrackPt/F");
00064 l25tree->Branch("trackDeltaRRMS", &trkDrRMS, "trackDeltaRRMS/F");
00065 l25tree->Branch("trackDeltaRRMSAll", &trkDrRMSA, "trackDeltaRRMSAll/F");
00066 l25tree->Branch("matchingCone", &leadTrkJetDeltaR, "matchingCone/F");
00067 l25tree->Branch("nTracks", &numPixTrkInJet, "nTracks/I");
00068 l25tree->Branch("nQTracks", &numQPixTrkInJet, "nQTracks/I");
00069 l25tree->Branch("nQTracksInSignal", &numQPixTrkInSignalCone, "nQTracksInSignal/I");
00070 l25tree->Branch("nQTracksInAnnulus", &numQPixTrkInAnnulus, "nQTracksInAnnulus/I");
00071 l25tree->Branch("hasLeadTrack", &hasLeadTrk, "hasLeadTrack/B");
00072 }
00073
00074
00075 L25TauAnalyzer::~L25TauAnalyzer(){
00076
00077 }
00078
00079
00080
00081
00082 void L25TauAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup){
00083
00084
00085 Handle<IsolatedTauTagInfoCollection> tauTagInfo;
00086 using namespace reco;
00087 Handle<LVColl> mcInfo;
00088
00089 if(signal_){
00090 iEvent.getByLabel(jetMCTagSrc_, mcInfo);
00091 }
00092
00093
00094
00095 if(iEvent.getByLabel(jetTagSrc_, tauTagInfo))
00096 {
00097 if(tauTagInfo->size()>0)
00098 for(IsolatedTauTagInfoCollection::const_iterator i = tauTagInfo->begin();i!=tauTagInfo->end();++i)
00099 {
00100 MatchElementL25 m;
00101 m.matched=false;
00102 m.mcEt=0;
00103 m.mcEta=0;
00104 m.deltar=0;
00105
00106 if(signal_)
00107 {
00108 if(iEvent.getByLabel(jetMCTagSrc_,mcInfo))
00109 m=match(*(i->jet()),*mcInfo);
00110 }
00111
00112 if((signal_&&m.matched)||(!signal_))
00113 {
00114
00115 const Jet* Jet =i->jet().get();
00116 const CaloJet* calojet = dynamic_cast<const CaloJet*>(Jet);
00117 emf = calojet->emEnergyFraction();
00118
00119
00120 jetEt=i->jet()->et();
00121 jetEta=i->jet()->eta();
00122 jetMCEt=m.mcEt;
00123 jetMCEta=m.mcEta;
00124 numPixTrkInJet = i->allTracks().size();
00125 numQPixTrkInJet = i->selectedTracks().size();
00126 trkDrRMS =trackDrRMS(*i,i->selectedTracks());
00127 trkDrRMSA =trackDrRMS(*i,i->allTracks());
00128
00129
00130
00131 const TrackRef leadTk = i->leadingSignalTrack();
00132 if(!leadTk)
00133 {
00134 numQPixTrkInSignalCone=0;
00135 numQPixTrkInAnnulus=0;
00136 leadSignalTrackPt=0;
00137 leadTrkJetDeltaR=0;
00138 hasLeadTrk=false;
00139 }
00140 else
00141 {
00142 leadTrkJetDeltaR = ROOT::Math::VectorUtil::DeltaR(i->jet()->p4().Vect(), leadTk->momentum());
00143 leadSignalTrackPt=leadTk->pt();
00144 numQPixTrkInSignalCone=(i->tracksInCone(leadTk->momentum(), signalCone_, minTrackPt_)).size();
00145 numQPixTrkInAnnulus=(i->tracksInCone(leadTk->momentum(), isolationCone_, minTrackPt_)).size()-numQPixTrkInSignalCone;
00146 hasLeadTrk=true;
00147 }
00148 }
00149 l25tree->Fill();
00150 }
00151 }
00152 }
00153
00154
00155
00156
00157 float
00158 L25TauAnalyzer::trackDrRMS(const reco::IsolatedTauTagInfo& info,const TrackRefVector& tracks)
00159 {
00160 float rms = 0.;
00161 float sumet = 0.;
00162
00163
00164
00165 if(tracks.size()>0)
00166 {
00167 math::XYZVector center = tracks[0]->momentum();
00168
00169 for(size_t i = 1;i<tracks.size();++i)
00170 {
00171 center+=tracks[i]->momentum();
00172 }
00173
00174
00175
00176 for(size_t i = 0;i<tracks.size();++i)
00177 {
00178 rms+= tracks[i]->pt()*pow(ROOT::Math::VectorUtil::DeltaR(tracks[i]->momentum(),center),2);
00179 sumet+=tracks[i]->pt();
00180 }
00181
00182 }
00183
00184 if(sumet==0.)
00185 sumet=1;
00186
00187 return rms/sumet;
00188 }
00189
00190
00191
00192 MatchElementL25
00193 L25TauAnalyzer::match(const reco::Jet& jet,const LVColl& McInfo)
00194 {
00195
00196
00197
00198
00199 bool matched=false;
00200 double delta_min=100.;
00201 double mceta=0;
00202 double mcet=0;
00203
00204 double matchDr=0.3;
00205
00206 if(McInfo.size()>0)
00207 for(std::vector<LV>::const_iterator it = McInfo.begin();it!=McInfo.end();++it)
00208 {
00209 double delta = ROOT::Math::VectorUtil::DeltaR(jet.p4().Vect(),*it);
00210 if(delta<matchDr)
00211 {
00212 matched=true;
00213 if(delta<delta_min)
00214 {
00215 delta_min=delta;
00216 mceta=it->eta();
00217 mcet=it->Et();
00218 }
00219 }
00220 }
00221
00222
00223 MatchElementL25 match;
00224 match.matched=matched;
00225 match.deltar=delta_min;
00226 match.mcEta = mceta;
00227 match.mcEt = mcet;
00228
00229 return match;
00230 }
00231
00232
00233
00234 void L25TauAnalyzer::beginJob() {
00235 }
00236
00237
00238 void L25TauAnalyzer::endJob() {
00239 l25file->Write();
00240 }
00241