00001 #ifndef RecoTauTag_TauTagTools_TauTagTools_h
00002 #define RecoTauTag_TauTagTools_TauTagTools_h
00003
00004 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00005 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00006 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
00007 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidateFwd.h"
00008 #include "DataFormats/ParticleFlowReco/interface/PFBlock.h"
00009 #include "DataFormats/ParticleFlowReco/interface/PFBlockElement.h"
00010 #include "DataFormats/TrackReco/interface/Track.h"
00011 #include "DataFormats/VertexReco/interface/Vertex.h"
00012 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00013 #include "DataFormats/Math/interface/deltaR.h"
00014 #include "CommonTools/Utils/interface/Angle.h"
00015
00016 #include "Math/GenVector/VectorUtil.h"
00017
00018 #include "RecoTauTag/TauTagTools/interface/ECALBounds.h"
00019
00020 #include "TrackingTools/GeomPropagators/interface/AnalyticalPropagator.h"
00021
00022 #include "TFormula.h"
00023
00024 namespace TauTagTools{
00025 template <class T> class sortByOpeningDistance;
00026 reco::TrackRefVector filteredTracksByNumTrkHits(reco::TrackRefVector theInitialTracks, int tkminTrackerHitsn);
00027 reco::TrackRefVector filteredTracks(reco::TrackRefVector theInitialTracks,double tkminPt,int tkminPixelHitsn,int tkminTrackerHitsn,double tkmaxipt,double tkmaxChi2, reco::Vertex pV);
00028 reco::TrackRefVector filteredTracks(reco::TrackRefVector theInitialTracks,double tkminPt,int tkminPixelHitsn,int tkminTrackerHitsn,double tkmaxipt,double tkmaxChi2,double tktorefpointmaxDZ,reco::Vertex pV,double refpoint_Z);
00029
00030 reco::PFCandidateRefVector filteredPFChargedHadrCandsByNumTrkHits(reco::PFCandidateRefVector theInitialPFCands, int ChargedHadrCand_tkminTrackerHitsn);
00031 reco::PFCandidateRefVector filteredPFChargedHadrCands(reco::PFCandidateRefVector theInitialPFCands,double ChargedHadrCand_tkminPt,int ChargedHadrCand_tkminPixelHitsn,int ChargedHadrCand_tkminTrackerHitsn,double ChargedHadrCand_tkmaxipt,double ChargedHadrCand_tkmaxChi2, reco::Vertex pV);
00032 reco::PFCandidateRefVector filteredPFChargedHadrCands(reco::PFCandidateRefVector theInitialPFCands,double ChargedHadrCand_tkminPt,int ChargedHadrCand_tkminPixelHitsn,int ChargedHadrCand_tkminTrackerHitsn,double ChargedHadrCand_tkmaxipt,double ChargedHadrCand_tkmaxChi2,double ChargedHadrCand_tktorefpointmaxDZ,reco::Vertex pV, double refpoint_Z);
00033 reco::PFCandidateRefVector filteredPFNeutrHadrCands(reco::PFCandidateRefVector theInitialPFCands,double NeutrHadrCand_HcalclusMinEt);
00034 reco::PFCandidateRefVector filteredPFGammaCands(reco::PFCandidateRefVector theInitialPFCands,double GammaCand_EcalclusMinEt);
00035 math::XYZPoint propagTrackECALSurfContactPoint(const MagneticField*,reco::TrackRef);
00036
00037 TFormula computeConeSizeTFormula(const std::string& ConeSizeFormula,const char* errorMessage);
00038 void replaceSubStr(std::string& s,const std::string& oldSubStr,const std::string& newSubStr);
00039
00040 double computeDeltaR(const math::XYZVector& vec1, const math::XYZVector& vec2);
00041 double computeAngle(const math::XYZVector& vec1, const math::XYZVector& vec2);
00042
00043
00044 void sortRefVectorByPt(reco::PFCandidateRefVector&);
00045
00046
00047
00048 class sortRefsByOpeningDistance
00049 {
00050 public:
00051 sortRefsByOpeningDistance(const math::XYZVector& theAxis, double (*ptrToMetricFunction)(const math::XYZVector&, const math::XYZVector&), const reco::PFCandidateRefVector& myInputVector):myMetricFunction(ptrToMetricFunction),axis(theAxis),myVector(myInputVector){};
00052 bool operator()(uint32_t indexA, uint32_t indexB)
00053 {
00054 const reco::PFCandidateRef candA = myVector.at(indexA);
00055 const reco::PFCandidateRef candB = myVector.at(indexB);
00056 return (myMetricFunction(axis, candA->momentum()) < myMetricFunction(axis, candB->momentum()));
00057 }
00058 private:
00059 double (*myMetricFunction)(const math::XYZVector&, const math::XYZVector&);
00060 math::XYZVector axis;
00061 const reco::PFCandidateRefVector myVector;
00062 };
00063 class filterChargedAndNeutralsByPt
00064 {
00065 public:
00066 filterChargedAndNeutralsByPt(double minNeutralPt, double minChargedPt, const reco::PFCandidateRefVector& myInputVector):minNeutralPt_(minNeutralPt),minChargedPt_(minChargedPt),myVector(myInputVector){};
00067 bool operator()(uint32_t candIndex)
00068 {
00069 const reco::PFCandidateRef cand = myVector.at(candIndex);
00070 bool output = true;
00071 unsigned char charge = std::abs(cand->charge());
00072 double thePt = cand->pt();
00073 if (charge && thePt < minChargedPt_)
00074 output = false;
00075 else if (!charge && thePt < minNeutralPt_)
00076 output = false;
00077 return output;
00078 }
00079 private:
00080 double minNeutralPt_;
00081 double minChargedPt_;
00082 const reco::PFCandidateRefVector& myVector;
00083 };
00084
00085 class refVectorPtSorter {
00086 public:
00087 refVectorPtSorter(const reco::PFCandidateRefVector vec)
00088 {
00089 vec_ = vec;
00090 }
00091
00092 refVectorPtSorter()
00093 {
00094 }
00095
00096
00097 ~refVectorPtSorter()
00098 {}
00099
00100 bool operator()(size_t a , size_t b) {
00101 return (vec_.at(a)->pt() > vec_.at(b)->pt());
00102 }
00103
00104 private:
00105 reco::PFCandidateRefVector vec_;
00106 };
00107
00108
00109
00110 template <class T>
00111 class sortByAscendingPt
00112 {
00113 public:
00114 bool operator()(const T& candA, const T& candB)
00115 {
00116 return (candA.pt() > candB.pt());
00117 }
00118 bool operator()(const T* candA, const T* candB)
00119 {
00120 return (candA->pt() > candB->pt());
00121 }
00122 };
00123
00124 template <class T>
00125 class sortByDescendingPt
00126 {
00127 public:
00128 bool operator()(const T& candA, const T& candB)
00129 {
00130 return (candA.pt() < candB.pt());
00131 }
00132 bool operator()(const T* candA, const T* candB)
00133 {
00134 return (candA->pt() < candB->pt());
00135 }
00136 };
00137
00138 template <class T>
00139 class sortByOpeningAngleAscending
00140 {
00141 public:
00142 sortByOpeningAngleAscending(const math::XYZVector& theAxis, double (*ptrToMetricFunction)(const math::XYZVector&, const math::XYZVector&)):axis(theAxis),myMetricFunction(ptrToMetricFunction){};
00143 bool operator()(const T& candA, const T& candB)
00144 {
00145 return ( myMetricFunction(axis, candA.momentum()) > myMetricFunction(axis, candB.momentum()) );
00146 }
00147 bool operator()(const T* candA, const T* candB)
00148 {
00149 return ( myMetricFunction(axis, candA->momentum()) > myMetricFunction(axis, candB->momentum()) );
00150 }
00151 private:
00152 math::XYZVector axis;
00153 double (*myMetricFunction)(const math::XYZVector&, const math::XYZVector&);
00154 };
00155
00156 template <class T>
00157 class sortByOpeningAngleDescending
00158 {
00159 public:
00160 sortByOpeningAngleDescending(const math::XYZVector& theAxis, double (*ptrToMetricFunction)(const math::XYZVector&, const math::XYZVector&)):axis(theAxis),myMetricFunction(ptrToMetricFunction){};
00161 bool operator()(const T& candA, const T& candB)
00162 {
00163 return ( myMetricFunction(axis, candA.momentum()) < myMetricFunction(axis, candB.momentum()) );
00164 }
00165 bool operator()(const T* candA, const T* candB)
00166 {
00167 return ( myMetricFunction(axis, candA->momentum()) < myMetricFunction(axis, candB->momentum()) );
00168 }
00169 private:
00170 math::XYZVector axis;
00171 double (*myMetricFunction)(const math::XYZVector&, const math::XYZVector&);
00172 };
00173
00174 }
00175
00176 #endif
00177