CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/RecoBTag/SecondaryVertex/src/V0Filter.cc

Go to the documentation of this file.
00001 #include <cmath>
00002 
00003 #include <Math/GenVector/PxPyPzM4D.h>
00004 
00005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00006 
00007 #include "DataFormats/Math/interface/LorentzVector.h"
00008 #include "DataFormats/TrackReco/interface/Track.h"
00009 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00010 
00011 #include "RecoBTag/SecondaryVertex/interface/ParticleMasses.h"
00012 #include "RecoBTag/SecondaryVertex/interface/V0Filter.h"
00013 
00014 using namespace reco; 
00015 
00016 V0Filter::V0Filter(const edm::ParameterSet &params) :
00017         k0sMassWindow(params.getParameter<double>("k0sMassWindow"))
00018 {
00019 }
00020 
00021 inline bool
00022 V0Filter::operator () (const reco::Track **tracks, unsigned int n) const
00023 {
00024         // only check for K0s for now
00025 
00026         if (n != 2)
00027                 return true;
00028 
00029         if (tracks[0]->charge() * tracks[1]->charge() > 0)
00030                 return true;
00031 
00032         ROOT::Math::LorentzVector<ROOT::Math::PxPyPzM4D<double> > vec1;
00033         ROOT::Math::LorentzVector<ROOT::Math::PxPyPzM4D<double> > vec2;
00034 
00035         vec1.SetPx(tracks[0]->px());
00036         vec1.SetPy(tracks[0]->py());
00037         vec1.SetPz(tracks[0]->pz());
00038         vec1.SetM(ParticleMasses::piPlus);
00039 
00040         vec2.SetPx(tracks[1]->px());
00041         vec2.SetPy(tracks[1]->py());
00042         vec2.SetPz(tracks[1]->pz());
00043         vec2.SetM(ParticleMasses::piPlus);
00044 
00045         double invariantMass = (vec1 + vec2).M();
00046         if (std::abs(invariantMass - ParticleMasses::k0) < k0sMassWindow)
00047                 return false;
00048 
00049         return true;
00050 }
00051 
00052 bool
00053 V0Filter::operator () (const reco::TrackRef *tracks, unsigned int n) const
00054 {
00055         std::vector<const reco::Track*> trackPtrs(n);
00056         for(unsigned int i = 0; i < n; i++)
00057                 trackPtrs[i] = &*tracks[i];
00058 
00059         return (*this)(&trackPtrs[0], n);
00060 }
00061 
00062 bool
00063 V0Filter::operator () (const reco::Track *tracks, unsigned int n) const
00064 {
00065         std::vector<const reco::Track*> trackPtrs(n);
00066         for(unsigned int i = 0; i < n; i++)
00067                 trackPtrs[i] = &tracks[i];
00068 
00069         return (*this)(&trackPtrs[0], n);
00070 }