00001 #ifndef RecoBTag_SecondaryVertex_SimpleSecondaryVertexComputer_h 00002 #define RecoBTag_SecondaryVertex_SimpleSecondaryVertexComputer_h 00003 00004 #include <cmath> 00005 00006 #include "Math/GenVector/VectorUtil.h" 00007 00008 #include "DataFormats/TrackReco/interface/Track.h" 00009 #include "DataFormats/VertexReco/interface/Vertex.h" 00010 #include "DataFormats/BTauReco/interface/SecondaryVertexTagInfo.h" 00011 00012 #include "RecoBTau/JetTagComputer/interface/JetTagComputer.h" 00013 00014 #include "RecoBTag/SecondaryVertex/interface/TrackKinematics.h" 00015 00016 class SimpleSecondaryVertexComputer : public JetTagComputer { 00017 public: 00018 SimpleSecondaryVertexComputer(const edm::ParameterSet ¶meters) : 00019 use2d(!parameters.getParameter<bool>("use3d")), 00020 useSig(parameters.getParameter<bool>("useSignificance")), 00021 unBoost(parameters.getParameter<bool>("unBoost")) 00022 { uses("svTagInfos"); } 00023 00024 float discriminator(const TagInfoHelper &tagInfos) const 00025 { 00026 const reco::SecondaryVertexTagInfo &info = 00027 tagInfos.get<reco::SecondaryVertexTagInfo>(); 00028 if (info.nVertices() == 0) 00029 return -1.0; 00030 00031 double gamma; 00032 if (unBoost) { 00033 reco::TrackKinematics kinematics( 00034 info.secondaryVertex(0)); 00035 gamma = kinematics.vectorSum().Gamma(); 00036 } else 00037 gamma = 1.0; 00038 00039 double value; 00040 if (useSig) 00041 value = info.flightDistance(0, use2d).significance(); 00042 else 00043 value = info.flightDistance(0, use2d).value(); 00044 00045 value /= gamma; 00046 00047 if (useSig) 00048 value = (value > 0) ? +std::log(1 + value) 00049 : -std::log(1 - value); 00050 00051 return value; 00052 } 00053 00054 private: 00055 bool use2d; 00056 bool useSig; 00057 bool unBoost; 00058 }; 00059 00060 #endif // RecoBTag_SecondaryVertex_SimpleSecondaryVertexComputer_h