00001
00002
00003
00004
00005
00016
00017
00018
00019
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
00039
00040 Tau3DAlgo::Tau3DAlgo(edm::Handle<reco::TrackCollection> *trackHandle) {
00041
00042 trackHandle_ = trackHandle;
00043
00044
00045 seedTrackPtThreshold_ = 5.0;
00046
00047
00048 tauOuterConeSize_ = 0.5236;
00049
00050
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
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 }
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
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
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 }
00170
00171 if(anyTrackHigherThanThisIn30) continue;
00172 if(binary_search(seedTrackRefs_.begin(),seedTrackRefs_.end(),trkRef)) continue;
00173 seedTrackRefs_.push_back(trkRef);
00174
00175 }
00176
00177 }
00178