CMS 3D CMS Logo

EventShapeVariables.cc
Go to the documentation of this file.
2 
3 #include "TMath.h"
4 
7 {
8  inputVectors_.reserve( inputVectors.size() );
9  for (const auto& vec : inputVectors){
10  inputVectors_.push_back(math::XYZVector(vec.px(), vec.py(), vec.pz()));
11  }
12  //default values
13  set_r(2.);
14  setFWmax(10);
15 }
16 
17 
19 EventShapeVariables::EventShapeVariables(const std::vector<math::XYZVector>& inputVectors) : inputVectors_(inputVectors), eigenVectors_(3,3)
20 {
21  //default values
22  set_r(2.);
23  setFWmax(10);
24 }
25 
27 EventShapeVariables::EventShapeVariables(const std::vector<math::RhoEtaPhiVector>& inputVectors) : eigenVectors_(3,3)
28 {
29  inputVectors_.reserve( inputVectors.size() );
30  for (const auto& vec : inputVectors){
31  inputVectors_.push_back(math::XYZVector(vec.x(), vec.y(), vec.z()));
32  }
33  //default values
34  set_r(2.);
35  setFWmax(10);
36 }
37 
39 EventShapeVariables::EventShapeVariables(const std::vector<math::RThetaPhiVector>& inputVectors) : eigenVectors_(3,3)
40 {
41  inputVectors_.reserve( inputVectors.size() );
42  for (const auto& vec : inputVectors){
43  inputVectors_.push_back(math::XYZVector(vec.x(), vec.y(), vec.z()));
44  }
45  //default values
46  set_r(2.);
47  setFWmax(10);
48 }
49 
53 double
54 EventShapeVariables::isotropy(const unsigned int& numberOfSteps) const
55 {
56  const double deltaPhi=2*TMath::Pi()/numberOfSteps;
57  double phi = 0, eIn =-1., eOut=-1.;
58  for(unsigned int i=0; i<numberOfSteps; ++i){
59  phi+=deltaPhi;
60  double sum=0;
61  double cosphi = TMath::Cos(phi);
62  double sinphi = TMath::Sin(phi);
63  for(const auto& vec : inputVectors_){
64  // sum over inner product of unit vectors and momenta
65  sum+=TMath::Abs(cosphi*vec.x()+sinphi*vec.y());
66  }
67  if( eOut<0. || sum<eOut ) eOut=sum;
68  if( eIn <0. || sum>eIn ) eIn =sum;
69  }
70  return (eIn-eOut)/eIn;
71 }
72 
75 double
76 EventShapeVariables::circularity(const unsigned int& numberOfSteps) const
77 {
78  const double deltaPhi=2*TMath::Pi()/numberOfSteps;
79  double circularity=-1, phi=0, area = 0;
80  for(const auto& vec: inputVectors_) {
81  area+=TMath::Sqrt(vec.x()*vec.x()+vec.y()*vec.y());
82  }
83  for(unsigned int i=0; i<numberOfSteps; ++i){
84  phi+=deltaPhi;
85  double sum=0, tmp=0.;
86  double cosphi = TMath::Cos(phi);
87  double sinphi = TMath::Sin(phi);
88  for(const auto& vec: inputVectors_){
89  sum+=TMath::Abs(cosphi*vec.x()+sinphi*vec.y());
90  }
91  tmp=TMath::Pi()/2*sum/area;
92  if( circularity<0 || tmp<circularity ){
93  circularity=tmp;
94  }
95  }
96  return circularity;
97 }
98 
100 void
102 {
103  r_ = r;
105  tensors_computed_ = false;
106  eigenValues_ = std::vector<double>(3,0);
107  eigenValuesNoNorm_ = std::vector<double>(3,0);
108 }
109 
113 void
115 {
116  if(tensors_computed_) return;
117 
118  if ( inputVectors_.size() < 2 ){
119  tensors_computed_ = true;
120  return;
121  }
122 
123  TMatrixDSym momentumTensor(3);
124  momentumTensor.Zero();
125 
126  // fill momentumTensor from inputVectors
127  double norm = 0.;
128  for (const auto& vec: inputVectors_){
129  double p2 = vec.Dot(vec);
130  double pR = ( r_ == 2. ) ? p2 : TMath::Power(p2, 0.5*r_);
131  norm += pR;
132  double pRminus2 = ( r_ == 2. ) ? 1. : TMath::Power(p2, 0.5*r_ - 1.);
133  momentumTensor(0,0) += pRminus2*vec.x()*vec.x();
134  momentumTensor(0,1) += pRminus2*vec.x()*vec.y();
135  momentumTensor(0,2) += pRminus2*vec.x()*vec.z();
136  momentumTensor(1,0) += pRminus2*vec.y()*vec.x();
137  momentumTensor(1,1) += pRminus2*vec.y()*vec.y();
138  momentumTensor(1,2) += pRminus2*vec.y()*vec.z();
139  momentumTensor(2,0) += pRminus2*vec.z()*vec.x();
140  momentumTensor(2,1) += pRminus2*vec.z()*vec.y();
141  momentumTensor(2,2) += pRminus2*vec.z()*vec.z();
142  }
143 
144  if( momentumTensor.IsSymmetric() && ( momentumTensor.NonZeros() != 0 ) ){
145  momentumTensor.EigenVectors(eigenValuesNoNormTmp_);
146  }
150 
151  // momentumTensor normalized to determinant 1
152  momentumTensor *= (1./norm);
153 
154  // now get eigens
155  if( momentumTensor.IsSymmetric() && ( momentumTensor.NonZeros() != 0 ) ){
156  eigenVectors_ = momentumTensor.EigenVectors(eigenValuesTmp_);
157  }
161 
162  tensors_computed_ = true;
163 }
164 
167 double
169 {
171  return 1.5*(eigenValues_[1] + eigenValues_[2]);
172 }
173 
176 double
178 {
180  return 1.5*eigenValues_[2];
181 }
182 
186 double
188 {
191 }
192 
196 double
198 {
200  return 27.*eigenValues_[0]*eigenValues_[1]*eigenValues_[2];
201 }
202 
203 //========================================================================================================
204 
206 void
208 {
209  fwmom_maxl_ = m;
210  fwmom_computed_ = false;
211  fwmom_ = std::vector<double>(fwmom_maxl_,0.);
212 }
213 
215 
216  if ( l > fwmom_maxl_ ) return 0. ;
217 
219 
220  return fwmom_[l] ;
221 
222 } // getFWmoment
223 
224 const std::vector<double>& EventShapeVariables::getFWmoments() {
226 
227  return fwmom_;
228 }
229 
231  if(fwmom_computed_) return;
232 
233  double esum_total(0.) ;
234  for ( unsigned int i = 0 ; i < inputVectors_.size() ; i ++ ) {
235  esum_total += inputVectors_[i].R() ;
236  } // i
237  double esum_total_sq = esum_total * esum_total ;
238 
239  for ( unsigned int i = 0 ; i < inputVectors_.size() ; i ++ ) {
240 
241  double p_i = inputVectors_[i].R() ;
242  if ( p_i <= 0 ) continue ;
243 
244  for ( unsigned int j = 0 ; j <= i ; j ++ ) {
245 
246  double p_j = inputVectors_[j].R() ;
247  if ( p_j <= 0 ) continue ;
248 
251  int symmetry_factor = 2;
252  if( j == i ) symmetry_factor = 1;
253  double p_ij = p_i * p_j;
254  double cosTheta = inputVectors_[i].Dot( inputVectors_[j] ) / (p_ij) ;
255  double pi_pj_over_etot2 = p_ij / esum_total_sq ;
256 
259  double Pn1 = 0;
260  double Pn2 = 0;
261  for ( unsigned n = 0; n < fwmom_maxl_; n ++ ) {
263  if ( n == 0 ) {
264  Pn2 = pi_pj_over_etot2;
265  fwmom_[0] += Pn2*symmetry_factor;
266  }
267  else if ( n == 1 ) {
268  Pn1 = pi_pj_over_etot2 * cosTheta;
269  fwmom_[1] += Pn1*symmetry_factor;
270  }
271  else {
272  double Pn = ((2*n-1)*cosTheta*Pn1 - (n-1)*Pn2)/n;
273  fwmom_[n] += Pn*symmetry_factor;
275  Pn2 = Pn1;
276  Pn1 = Pn;
277  }
278  }
279 
280  } // j
281  } // i
282 
283  fwmom_computed_ = true;
284 
285 } // computeFWmoments
286 
287 //========================================================================================================
const double Pi
std::vector< double > eigenValuesNoNorm_
double circularity(const unsigned int &numberOfSteps=1000) const
size_type size() const
void setFWmax(unsigned m)
set number of Fox-Wolfram moments to compute
std::vector< double > eigenValues_
double r_
caching of output
EventShapeVariables(const edm::View< reco::Candidate > &inputVectors)
constructor from reco::Candidates
T Abs(T a)
Definition: MathUtil.h:49
const std::vector< double > & getFWmoments()
double getFWmoment(unsigned l)
double p2[4]
Definition: TauolaWrapper.h:90
std::vector< math::XYZVector > inputVectors_
caching of input vectors
unsigned fwmom_maxl_
Owen ; save computed Fox-Wolfram moments.
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
void set_r(double r)
set exponent for computation of momentum tensor and related products
double isotropy(const unsigned int &numberOfSteps=1000) const
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
std::vector< double > fwmom_