CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/RecoTauTag/TauTagTools/interface/TauTagTools.h

Go to the documentation of this file.
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   //MIKE: Sort a reference vector
00044   void sortRefVectorByPt(reco::PFCandidateRefVector&);
00045 
00046 
00047   //binary predicate classes for sorting a list of indexes corresponding to PFRefVectors...(as they can't use STL??)
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;  //axis about which candidates are sorted
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   //binary predicate classes for sorting vectors of candidates
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