CMS 3D CMS Logo

AlphaT.cc
Go to the documentation of this file.
1 #include <numeric>
2 #include <cmath>
4 
5 double AlphaT::value_(std::vector<bool> * jet_sign) const {
6 
7  // Clear pseudo-jet container
8  if (jet_sign) {
9  jet_sign->clear();
10  jet_sign->resize(et_.size());
11  }
12 
13  // check the size of the input collection
14  if (et_.empty())
15  // empty jet collection, return AlphaT = 0
16  return 0.;
17 
18  if (et_.size() > (unsigned int) std::numeric_limits<unsigned int>::digits)
19  // too many jets, return AlphaT = a very large number
21 
22  // Momentum sums in transverse plane
23  const double sum_et = std::accumulate( et_.begin(), et_.end(), 0. );
24  const double sum_px = std::accumulate( px_.begin(), px_.end(), 0. );
25  const double sum_py = std::accumulate( py_.begin(), py_.end(), 0. );
26 
27  // Minimum Delta Et for two pseudo-jets
28  double min_delta_sum_et = sum_et;
29 
30  if(setDHtZero_){
31  min_delta_sum_et = 0.;
32  }else{
33  for (unsigned int i = 0; i < (1U << (et_.size() - 1)); i++) { //@@ iterate through different combinations
34  double delta_sum_et = 0.;
35  for (unsigned int j = 0; j < et_.size(); ++j) { //@@ iterate through jets
36  if (i & (1U << j))
37  delta_sum_et -= et_[j];
38  else
39  delta_sum_et += et_[j];
40  }
41  delta_sum_et = std::abs(delta_sum_et);
42  if (delta_sum_et < min_delta_sum_et) {
43  min_delta_sum_et = delta_sum_et;
44  if (jet_sign) {
45  for (unsigned int j = 0; j < et_.size(); ++j)
46  (*jet_sign)[j] = ((i & (1U << j)) == 0);
47  }
48  }
49  }
50  }
51  // Alpha_T
52  return (0.5 * (sum_et - min_delta_sum_et) / std::sqrt( sum_et*sum_et - (sum_px*sum_px+sum_py*sum_py) ));
53 }
std::vector< double > px_
Definition: AlphaT.h:19
std::vector< double > py_
Definition: AlphaT.h:20
double value_(std::vector< bool > *jet_sign) const
Definition: AlphaT.cc:5
std::vector< double > et_
Definition: AlphaT.h:18
T sqrt(T t)
Definition: SSEVec.h:18
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool setDHtZero_
Definition: AlphaT.h:28