CMS 3D CMS Logo

Tau3DAlgo.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:    Tau3DAlgo
00004 // Class:      Tau3DAlgo
00005 // 
00016 //
00017 // Original Author:  Dongwook Jang
00018 //         Created:  Tue Jan  9 16:40:36 CST 2007
00019 // $Id: Tau3DAlgo.cc,v 1.2 2007/04/05 19:27:50 dwjang Exp $
00020 //
00021 //
00022 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00023 #include "Math/GenVector/VectorUtil.h"
00024 #include "DataFormats/Math/interface/Point3D.h"
00025 #include "DataFormats/Math/interface/LorentzVector.h"
00026 
00027 #include "RecoTauTag/Pi0Tau/interface/Pi0Algo.h"
00028 #include "RecoTauTag/Pi0Tau/interface/Tau3DAlgo.h"
00029 
00030 using namespace reco;
00031 
00032 bool trackPtGreaterThan(const reco::TrackRef &left, const reco::TrackRef &right){
00033   return (left->momentum().Rho() > right->momentum().Rho());
00034 }
00035 
00036 
00037 //
00038 // constructors and destructor
00039 //
00040 Tau3DAlgo::Tau3DAlgo(edm::Handle<reco::TrackCollection> *trackHandle) {
00041 
00042   trackHandle_ = trackHandle;
00043 
00044 // threshold for seed track
00045   seedTrackPtThreshold_ = 5.0;
00046 
00047 // radian for 30 degree : 30.0/180.0 * TMath::Pi() = 0.5236
00048   tauOuterConeSize_     = 0.5236;
00049 
00050   // flag to use 3D angle
00051   use3DAngle_ = false;
00052 
00053 }
00054 
00055 
00056 Tau3DAlgo::~Tau3DAlgo()
00057 {
00058 
00059   trackHandle_ = 0;
00060 
00061   trackRefs_.clear();
00062   seedTrackRefs_.clear();
00063 
00064 }
00065 
00066 
00067 void Tau3DAlgo::fillTau3Ds(edm::Handle<reco::PFCandidateCollection> &pFCandidateHandle){
00068 
00069   fillRefVectors();
00070 
00071   LogDebug("Tau3DAlgo::fillTau3Ds") << " seedTrackCandidateRefs_.size() : " << seedTrackCandidateRefs_.size() << "\n";
00072 
00073   // sort seed track candidate collection in pt descending order
00074   std::sort(seedTrackCandidateRefs_.begin(),seedTrackCandidateRefs_.end(),trackPtGreaterThan);
00075 
00076   findSeedTracks();
00077 
00078   LogDebug("Tau3DAlgo::fillTau3Ds") << " seedTrackRefs_.size() : " << seedTrackRefs_.size() << "\n";
00079 
00080   for(std::vector<reco::TrackRef>::const_iterator sIter = seedTrackRefs_.begin();
00081       sIter != seedTrackRefs_.end(); sIter++){
00082 
00083     const reco::TrackRef seedTrk = *sIter;
00084 
00085     if(seedTrk.isNull()) continue;
00086 
00087     reco::TrackRefVector trackColl;
00088 
00089     for(std::vector<reco::TrackRef>::const_iterator tIter = trackRefs_.begin();
00090       tIter != trackRefs_.end(); tIter++){
00091       const reco::TrackRef trkRef = *tIter;
00092 
00093       double dist = use3DAngle_ ? ROOT::Math::VectorUtil::Angle(seedTrk->momentum(),trkRef->momentum()) :
00094         ROOT::Math::VectorUtil::DeltaR(seedTrk->momentum(),trkRef->momentum());
00095 
00096       if(dist < tauOuterConeSize_) trackColl.push_back(trkRef);
00097     }
00098 
00099     reco::Pi0Algo pi0Algo(seedTrk);
00100     pi0Algo.setConeSize(tauOuterConeSize_);
00101     pi0Algo.setUse3DAngle(true);
00102     pi0Algo.setEcalEntrance(129.0);
00103     pi0Algo.setMassRes(0.03);
00104     pi0Algo.fillPi0sUsingPF(pFCandidateHandle);
00105 
00106     reco::Tau3D tau3D(seedTrk,trackColl,pi0Algo.pi0Collection());
00107     tau3DCollection_.push_back(tau3D);
00108 
00109     trackColl.clear();
00110 
00111   }// for seed track iter
00112 
00113 
00114 
00115 }
00116 
00117 
00118 
00119 void Tau3DAlgo::fillRefVectors(){
00120 
00121   trackRefs_.clear();
00122   seedTrackCandidateRefs_.clear();
00123 
00124   if(trackHandle_->isValid()) {
00125     const reco::TrackCollection trackCollection = *(trackHandle_->product());
00126 
00127     // Let's make a collection of track references just once because this will be used later on
00128     int itrk=0;
00129     for(reco::TrackCollection::const_iterator tIter = trackCollection.begin();
00130         tIter != trackCollection.end(); tIter++){
00131       const reco::TrackRef trkRef(*trackHandle_,itrk);
00132       trackRefs_.push_back(trkRef);
00133       if(trkRef->momentum().Rho() > seedTrackPtThreshold_) seedTrackCandidateRefs_.push_back(trkRef);
00134       itrk++;
00135     }
00136   }
00137   else {
00138     LogDebug("Tau3DAlgo") << "TrackCollection is not valid\n";
00139   }
00140 
00141 }
00142 
00143 
00144 
00145 void Tau3DAlgo::findSeedTracks(){
00146 
00147   // now find seed tracks above a certain threshold which should be the highest one in 30 degree cone
00148 
00149   seedTrackRefs_.clear();
00150 
00151   for(std::vector<reco::TrackRef>::const_iterator tIter = seedTrackCandidateRefs_.begin();
00152       tIter != seedTrackCandidateRefs_.end(); tIter++){
00153     const reco::TrackRef trkRef = *tIter;
00154     double pt = trkRef->pt();
00155 
00156     bool anyTrackHigherThanThisIn30 = false;
00157     for(std::vector<reco::TrackRef>::const_iterator tIter2 = seedTrackCandidateRefs_.begin();
00158       tIter2 != seedTrackCandidateRefs_.end(); tIter2++){
00159       const reco::TrackRef trkRef2 = *tIter2;
00160       if(trkRef == trkRef2) continue;
00161       double pt2 = trkRef2->pt();
00162       if(pt2 < pt) continue;
00163 
00164       double dist = use3DAngle_ ? ROOT::Math::VectorUtil::Angle(trkRef->momentum(),trkRef2->momentum()) :
00165         ROOT::Math::VectorUtil::DeltaR(trkRef->momentum(),trkRef2->momentum());
00166 
00167       if(dist > tauOuterConeSize_) continue;
00168       anyTrackHigherThanThisIn30 = true;
00169     }// for tIter2
00170 
00171     if(anyTrackHigherThanThisIn30) continue;
00172     if(binary_search(seedTrackRefs_.begin(),seedTrackRefs_.end(),trkRef)) continue;
00173     seedTrackRefs_.push_back(trkRef);
00174 
00175   }// for tIter
00176 
00177 }
00178 

Generated on Tue Jun 9 17:45:00 2009 for CMSSW by  doxygen 1.5.4