CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
VertexSorting.cc
Go to the documentation of this file.
1 #include <string>
2 #include <vector>
3 #include <map>
4 
7 
10 
13 
14 using namespace reco;
15 
17 VertexSorting::getSortCriterium(const std::string &criterium)
18 {
19  if (criterium == "dist3dError")
20  return sortDist3dErr;
21  if (criterium == "dist3dValue")
22  return sortDist3dVal;
23  if (criterium == "dist3dSignificance")
24  return sortDist3dSig;
25  if (criterium == "dist2dError")
26  return sortDist2dErr;
27  if (criterium == "dist2dValue")
28  return sortDist2dVal;
29  if (criterium == "dist2dSignificance")
30  return sortDist2dSig;
31 
32  throw cms::Exception("InvalidArgument")
33  << "Vertex sort criterium \"" << criterium << "\" is invalid."
34  << std::endl;
35 }
36 
38  sortCriterium(getSortCriterium(params.getParameter<std::string>("sortCriterium")))
39 {
40 }
41 
42 // identify most probable SV (closest to interaction point, significance-wise)
43 // FIXME: identify if this is the best strategy!
44 
45 std::vector<unsigned int> VertexSorting::operator () (
46  const std::vector<SecondaryVertex> &svCandidates) const
47 {
48  Measurement1D (SecondaryVertex::*measurementFn)() const = 0;
49  switch(sortCriterium) {
50  case sortDist3dErr:
51  case sortDist3dVal:
52  case sortDist3dSig:
53  measurementFn = &SecondaryVertex::dist3d;
54  break;
55  case sortDist2dErr:
56  case sortDist2dVal:
57  case sortDist2dSig:
58  measurementFn = &SecondaryVertex::dist2d;
59  break;
60  }
61 
62  double (Measurement1D::*valueFn)() const = 0;
63  switch(sortCriterium) {
64  case sortDist3dErr:
65  case sortDist2dErr:
66  valueFn = &Measurement1D::error;
67  break;
68  case sortDist3dVal:
69  case sortDist2dVal:
70  valueFn = &Measurement1D::value;
71  break;
72  case sortDist3dSig:
73  case sortDist2dSig:
74  valueFn = &Measurement1D::significance;
75  break;
76  }
77 
78  std::multimap<double, unsigned int> sortedMap;
79  unsigned int i = 0;
80  for(std::vector<SecondaryVertex>::const_iterator iter =
81  svCandidates.begin(); iter != svCandidates.end(); iter++) {
82 
83  double value = std::abs((((*iter).*measurementFn)().*valueFn)());
84  sortedMap.insert(std::make_pair(value, i++));
85  }
86 
87  std::vector<unsigned int> result;
88  for(std::multimap<double, unsigned int>::const_iterator iter =
89  sortedMap.begin(); iter != sortedMap.end(); iter++)
90  result.push_back(iter->second);
91 
92  return result;
93 }
int i
Definition: DBlmapReader.cc:9
static SortCriterium getSortCriterium(const std::string &criterium)
VertexSorting(const edm::ParameterSet &params)
Measurement1D dist3d() const
double error() const
Definition: Measurement1D.h:30
#define abs(x)
Definition: mlp_lapack.h:159
tuple result
Definition: query.py:137
std::vector< unsigned int > operator()(const std::vector< SecondaryVertex > &svCandidates) const
Measurement1D dist2d() const
double significance() const
Definition: Measurement1D.h:32
double value() const
Definition: Measurement1D.h:28
SortCriterium sortCriterium
Definition: VertexSorting.h:33