CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/DataFormats/BTauReco/src/TrackIPTagInfo.cc

Go to the documentation of this file.
00001 #include <cmath>
00002 #include <map>
00003 
00004 #include <Math/VectorUtil.h>
00005 
00006 #include "DataFormats/Math/interface/Vector3D.h"
00007 #include "DataFormats/BTauReco/interface/TrackIPTagInfo.h"
00008 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00009 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00010 #include "DataFormats/GeometryVector/interface/VectorUtil.h"
00011 #include "DataFormats/TrackReco/interface/Track.h"
00012 #include "DataFormats/VertexReco/interface/Vertex.h"
00013 
00014 using namespace reco;
00015 using namespace std;
00016 
00017 static double etaRel(const math::XYZVector &dir, const math::XYZVector &track)
00018 {
00019   double momPar = dir.Dot(track);
00020   double energy = sqrt(track.Mag2() + ROOT::Math::Square(0.13957));
00021   return 0.5 * log((energy + momPar) / (energy - momPar));
00022 }
00023 
00024 TaggingVariableList TrackIPTagInfo::taggingVariables(void) const {
00025   TaggingVariableList vars;
00026 
00027   math::XYZVector jetDir = jet()->momentum().Unit();
00028   bool havePv = primaryVertex().isNonnull();
00029   GlobalPoint pv;
00030   if (havePv)
00031     pv = GlobalPoint(primaryVertex()->x(),
00032                      primaryVertex()->y(),
00033                      primaryVertex()->z());
00034 
00035   std::vector<size_t> indexes = sortedIndexes(); // use default criterium
00036   for(std::vector<size_t>::const_iterator it = indexes.begin();
00037       it != indexes.end(); ++it)
00038    {
00039      using namespace ROOT::Math;
00040      TrackRef track = m_selectedTracks[*it];
00041      const TrackIPData *data = &m_data[*it];
00042      math::XYZVector trackMom = track->momentum();
00043      double trackMag = std::sqrt(trackMom.Mag2());
00044 
00045      vars.insert(btau::trackMomentum, trackMag, true);
00046      vars.insert(btau::trackEta, trackMom.Eta(), true);
00047      vars.insert(btau::trackEtaRel, etaRel(jetDir, trackMom), true);
00048      vars.insert(btau::trackPtRel, VectorUtil::Perp(trackMom, jetDir), true);
00049      vars.insert(btau::trackPPar, jetDir.Dot(trackMom), true);
00050      vars.insert(btau::trackDeltaR, VectorUtil::DeltaR(trackMom, jetDir), true);
00051      vars.insert(btau::trackPtRatio, VectorUtil::Perp(trackMom, jetDir) / trackMag, true);
00052      vars.insert(btau::trackPParRatio, jetDir.Dot(trackMom) / trackMag, true);
00053      vars.insert(btau::trackSip3dVal, data->ip3d.value(), true);
00054      vars.insert(btau::trackSip3dSig, data->ip3d.significance(), true);
00055      vars.insert(btau::trackSip2dVal, data->ip2d.value(), true);
00056      vars.insert(btau::trackSip2dSig, data->ip2d.significance(), true);
00057      vars.insert(btau::trackDecayLenVal, havePv ? (data->closestToJetAxis - pv).mag() : -1.0, true);
00058      vars.insert(btau::trackJetDistVal, data->distanceToJetAxis.value(), true);
00059      vars.insert(btau::trackJetDistSig, data->distanceToJetAxis.significance(), true);
00060      vars.insert(btau::trackGhostTrackDistVal, data->distanceToGhostTrack.value(), true);
00061      vars.insert(btau::trackGhostTrackDistSig, data->distanceToGhostTrack.significance(), true);
00062      vars.insert(btau::trackGhostTrackWeight, data->ghostTrackWeight, true);
00063      vars.insert(btau::trackChi2, track->normalizedChi2(), true);
00064      vars.insert(btau::trackNTotalHits, track->hitPattern().numberOfValidHits(), true);
00065      vars.insert(btau::trackNPixelHits, track->hitPattern().numberOfValidPixelHits(), true);
00066    } 
00067   vars.finalize();
00068   return vars;
00069 }
00070 
00071 TrackRefVector TrackIPTagInfo::sortedTracks(std::vector<size_t> indexes) const
00072 {
00073  TrackRefVector tr;
00074  for(size_t i =0 ; i < indexes.size(); i++) tr.push_back(m_selectedTracks[indexes[i]]);
00075  return tr;
00076 }
00077 
00078 std::vector<size_t> TrackIPTagInfo::sortedIndexes(SortCriteria mode) const
00079 {
00080  float cut=-1e99;
00081  if((mode == Prob3D || mode == Prob2D)) cut=1e99;
00082  return sortedIndexesWithCut(cut,mode);
00083 }
00084 
00085 std::vector<size_t> TrackIPTagInfo::sortedIndexesWithCut(float cut, SortCriteria mode) const
00086 {
00087  multimap<float,size_t> sortedIdx;
00088  size_t nSelectedTracks = m_selectedTracks.size();
00089  std::vector<size_t> result;
00090  
00091 //check if probabilities are available
00092  if((mode == Prob3D || mode == Prob2D) && ! hasProbabilities()) 
00093   {
00094    return result;
00095   }
00096 
00097  for(size_t i=0;i<nSelectedTracks;i++) 
00098   {
00099      float sortingKey;
00100      switch(mode)
00101      {
00102       case IP3DSig:
00103            sortingKey=m_data[i].ip3d.significance();
00104            break;
00105       case IP2DSig:
00106            sortingKey=m_data[i].ip2d.significance();
00107            break;
00108       case IP3DValue:
00109            sortingKey=m_data[i].ip3d.value();
00110            break;
00111       case IP2DValue:
00112            sortingKey=m_data[i].ip2d.value();
00113            break;
00114       case Prob3D:
00115            sortingKey=m_prob3d[i];
00116            break;
00117       case Prob2D:
00118            sortingKey=m_prob2d[i];
00119            break;
00120 
00121       default:
00122        sortingKey=i;
00123      }   
00124      sortedIdx.insert(std::pair<float,size_t>(sortingKey,i));
00125   }
00126 
00127 //Descending: 
00128 if(mode == IP3DSig || mode == IP2DSig ||mode ==  IP3DValue || mode == IP2DValue)
00129  { 
00130    for(std::multimap<float,size_t>::reverse_iterator it = sortedIdx.rbegin(); it!=sortedIdx.rend(); it++)
00131     if(it->first >= cut) result.push_back(it->second);
00132  } else
00133 //Ascending:
00134  {
00135   for(std::multimap<float,size_t>::iterator it = sortedIdx.begin(); it!=sortedIdx.end(); it++)
00136     if(it->first <= cut) result.push_back(it->second);
00137  }
00138  return result;
00139 }