Go to the documentation of this file.00001 #include "PhysicsTools/CandUtils/interface/EventShapeVariables.h"
00002
00003 #include "TMath.h"
00004
00006 EventShapeVariables::EventShapeVariables(const edm::View<reco::Candidate>& inputVectors)
00007 {
00008 std::cout << "inputVectors.size = " << inputVectors.size() << std::endl;
00009 inputVectors_.reserve( inputVectors.size() );
00010 for ( edm::View<reco::Candidate>::const_iterator vec = inputVectors.begin(); vec != inputVectors.end(); ++vec){
00011 inputVectors_.push_back(math::XYZVector(vec->px(), vec->py(), vec->pz()));
00012 }
00013 }
00014
00016 EventShapeVariables::EventShapeVariables(const std::vector<math::XYZVector>& inputVectors)
00017 : inputVectors_(inputVectors)
00018 {}
00019
00021 EventShapeVariables::EventShapeVariables(const std::vector<math::RhoEtaPhiVector>& inputVectors)
00022 {
00023 inputVectors_.reserve( inputVectors.size() );
00024 for ( std::vector<math::RhoEtaPhiVector>::const_iterator vec = inputVectors.begin(); vec != inputVectors.end(); ++vec ){
00025 inputVectors_.push_back(math::XYZVector(vec->x(), vec->y(), vec->z()));
00026 }
00027 }
00028
00030 EventShapeVariables::EventShapeVariables(const std::vector<math::RThetaPhiVector>& inputVectors)
00031 {
00032 inputVectors_.reserve( inputVectors.size() );
00033 for(std::vector<math::RThetaPhiVector>::const_iterator vec = inputVectors.begin(); vec != inputVectors.end(); ++vec ){
00034 inputVectors_.push_back(math::XYZVector(vec->x(), vec->y(), vec->z()));
00035 }
00036 }
00037
00041 double
00042 EventShapeVariables::isotropy(const unsigned int& numberOfSteps) const
00043 {
00044 const double deltaPhi=2*TMath::Pi()/numberOfSteps;
00045 double phi = 0, eIn =-1., eOut=-1.;
00046 for(unsigned int i=0; i<numberOfSteps; ++i){
00047 phi+=deltaPhi;
00048 double sum=0;
00049 for(unsigned int j=0; j<inputVectors_.size(); ++j){
00050
00051 sum+=TMath::Abs(TMath::Cos(phi)*inputVectors_[j].x()+TMath::Sin(phi)*inputVectors_[j].y());
00052 }
00053 if( eOut<0. || sum<eOut ) eOut=sum;
00054 if( eIn <0. || sum>eIn ) eIn =sum;
00055 }
00056 return (eIn-eOut)/eIn;
00057 }
00058
00061 double
00062 EventShapeVariables::circularity(const unsigned int& numberOfSteps) const
00063 {
00064 const double deltaPhi=2*TMath::Pi()/numberOfSteps;
00065 double circularity=-1, phi=0, area = 0;
00066 for(unsigned int i=0;i<inputVectors_.size();i++) {
00067 area+=TMath::Sqrt(inputVectors_[i].x()*inputVectors_[i].x()+inputVectors_[i].y()*inputVectors_[i].y());
00068 }
00069 for(unsigned int i=0; i<numberOfSteps; ++i){
00070 phi+=deltaPhi;
00071 double sum=0, tmp=0.;
00072 for(unsigned int j=0; j<inputVectors_.size(); ++j){
00073 sum+=TMath::Abs(TMath::Cos(phi)*inputVectors_[j].x()+TMath::Sin(phi)*inputVectors_[j].y());
00074 }
00075 tmp=TMath::Pi()/2*sum/area;
00076 if( circularity<0 || tmp<circularity ){
00077 circularity=tmp;
00078 }
00079 }
00080 return circularity;
00081 }
00082
00084 TMatrixDSym
00085 EventShapeVariables::compMomentumTensor(double r) const
00086 {
00087 TMatrixDSym momentumTensor(3);
00088 momentumTensor.Zero();
00089
00090 if ( inputVectors_.size() < 2 ){
00091 return momentumTensor;
00092 }
00093
00094
00095 double norm = 1.;
00096 for ( int i = 0; i < (int)inputVectors_.size(); ++i ){
00097 double p2 = inputVectors_[i].Dot(inputVectors_[i]);
00098 double pR = ( r == 2. ) ? p2 : TMath::Power(p2, 0.5*r);
00099 norm += pR;
00100 double pRminus2 = ( r == 2. ) ? 1. : TMath::Power(p2, 0.5*r - 1.);
00101 momentumTensor(0,0) += pRminus2*inputVectors_[i].x()*inputVectors_[i].x();
00102 momentumTensor(0,1) += pRminus2*inputVectors_[i].x()*inputVectors_[i].y();
00103 momentumTensor(0,2) += pRminus2*inputVectors_[i].x()*inputVectors_[i].z();
00104 momentumTensor(1,0) += pRminus2*inputVectors_[i].y()*inputVectors_[i].x();
00105 momentumTensor(1,1) += pRminus2*inputVectors_[i].y()*inputVectors_[i].y();
00106 momentumTensor(1,2) += pRminus2*inputVectors_[i].y()*inputVectors_[i].z();
00107 momentumTensor(2,0) += pRminus2*inputVectors_[i].z()*inputVectors_[i].x();
00108 momentumTensor(2,1) += pRminus2*inputVectors_[i].z()*inputVectors_[i].y();
00109 momentumTensor(2,2) += pRminus2*inputVectors_[i].z()*inputVectors_[i].z();
00110 }
00111
00112
00113
00114
00115
00116
00117
00118 return (1./norm)*momentumTensor;
00119 }
00120
00123 TVectorD
00124 EventShapeVariables::compEigenValues(double r) const
00125 {
00126 TVectorD eigenValues(3);
00127 TMatrixDSym myTensor = compMomentumTensor(r);
00128 if( myTensor.IsSymmetric() ){
00129 if( myTensor.NonZeros() != 0 ) myTensor.EigenVectors(eigenValues);
00130 }
00131
00132
00133
00134
00135
00136
00137
00138 return eigenValues;
00139 }
00140
00143 double
00144 EventShapeVariables::sphericity(double r) const
00145 {
00146 TVectorD eigenValues = compEigenValues(r);
00147 return 1.5*(eigenValues(1) + eigenValues(2));
00148 }
00149
00152 double
00153 EventShapeVariables::aplanarity(double r) const
00154 {
00155 TVectorD eigenValues = compEigenValues(r);
00156 return 1.5*eigenValues(2);
00157 }
00158
00162 double
00163 EventShapeVariables::C(double r) const
00164 {
00165 TVectorD eigenValues = compEigenValues(r);
00166 return 3.*(eigenValues(0)*eigenValues(1) + eigenValues(0)*eigenValues(2) + eigenValues(1)*eigenValues(2));
00167 }
00168
00172 double
00173 EventShapeVariables::D(double r) const
00174 {
00175 TVectorD eigenValues = compEigenValues(r);
00176 return 27.*eigenValues(0)*eigenValues(1)*eigenValues(2);
00177 }
00178
00179
00180