Go to the documentation of this file.00001 #include "RecoMET/METAlgorithms/interface/significanceAlgo.h"
00002 #include <iostream>
00003 #include <string>
00004 #include "TMath.h"
00005 #include "math.h"
00006 #include "TROOT.h"
00007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00008
00009
00010
00011
00012
00013
00021
00022
00023
00024
00025
00026
00027
00028 metsig::significanceAlgo::significanceAlgo():
00029
00030 signifmatrix_(2,2),
00031 set_worker_(0),
00032 xmet_(0),
00033 ymet_(0)
00034
00035 {
00036
00037 signifmatrix_(0,0)=signifmatrix_(1,0)=signifmatrix_(0,1)=signifmatrix_(1,1)=0;
00038 }
00039
00040
00041
00042 const void
00043 metsig::significanceAlgo::addSignifMatrix(const TMatrixD &input){
00044
00045 if(input.GetNrows()==2 && input.GetNcols()==2) {
00046 signifmatrix_+=input;
00047 }
00048 return;
00049 }
00052
00053 const void
00054 metsig::significanceAlgo::setSignifMatrix(const TMatrixD &input,const double &met_r, const double &met_phi, const double &met_set){
00055
00056 if(input.GetNrows()==2 && input.GetNcols()==2) {
00057 signifmatrix_=input;
00058 set_worker_=met_set;
00059 xmet_=met_r*cos(met_phi);
00060 ymet_=met_r*sin(met_phi);
00061 }
00062 return;
00063 }
00064
00065
00066
00067 metsig::significanceAlgo::~significanceAlgo(){
00068 }
00069
00070
00071
00072 void
00073 metsig::significanceAlgo::rotateMatrix( Double_t theta, TMatrixD &v)
00074 {
00075
00076 TMatrixD r(2,2);
00077 TMatrixD rInv(2,2);
00078
00079 r(0,0) = cos(theta); r(0,1) = sin(theta); r(1,0) = -sin(theta); r(1,1) = cos(theta);
00080 rInv = r;
00081 rInv.Invert();
00082
00083 v = rInv * v * r;
00084 }
00085
00086
00087
00088 const void
00089 metsig::significanceAlgo::subtractObjects(const std::vector<metsig::SigInputObj>& eventVec)
00090 {
00091 TMatrixD v_tot = signifmatrix_;
00092
00093
00094 for(std::vector<SigInputObj>::const_iterator obj = eventVec.begin(); obj!= eventVec.end(); ++obj){
00095 double et_tmp = obj->get_energy();
00096 double phi_tmp = obj->get_phi();
00097 double sigma_et = obj->get_sigma_e();
00098 double sigma_tan = obj->get_sigma_tan();
00099
00100 double cosphi=cos(phi_tmp);
00101 double sinphi=sin(phi_tmp);
00102 double xval = et_tmp * cosphi;
00103 double yval = et_tmp * sinphi;
00104 xmet_ += xval;
00105 ymet_ += yval;
00106 set_worker_ -= et_tmp;
00107
00108 double sigma0_2=sigma_et*sigma_et;
00109 double sigma1_2=sigma_tan*sigma_tan;
00110
00111 v_tot(0,0)-= sigma0_2*cosphi*cosphi + sigma1_2*sinphi*sinphi;
00112 v_tot(0,1)-= cosphi*sinphi*(sigma0_2 - sigma1_2);
00113 v_tot(1,0)-= cosphi*sinphi*(sigma0_2 - sigma1_2);
00114 v_tot(1,1)-= sigma1_2*cosphi*cosphi + sigma0_2*sinphi*sinphi;
00115
00116 }
00117 signifmatrix_=v_tot;
00118 }
00119
00120
00121
00122 const void
00123 metsig::significanceAlgo::addObjects(const std::vector<metsig::SigInputObj>& eventVec)
00124 {
00125 TMatrixD v_tot = signifmatrix_;
00126
00127
00128 for(std::vector<SigInputObj>::const_iterator obj = eventVec.begin(); obj!= eventVec.end(); ++obj){
00129 double et_tmp = obj->get_energy();
00130 double phi_tmp = obj->get_phi();
00131 double sigma_et = obj->get_sigma_e();
00132 double sigma_tan = obj->get_sigma_tan();
00133
00134 double cosphi=cos(phi_tmp);
00135 double sinphi=sin(phi_tmp);
00136 double xval = et_tmp * cosphi;
00137 double yval = et_tmp * sinphi;
00138 xmet_ -= xval;
00139 ymet_ -= yval;
00140 set_worker_ += et_tmp;
00141
00142 double sigma0_2=sigma_et*sigma_et;
00143 double sigma1_2=sigma_tan*sigma_tan;
00144
00145 v_tot(0,0)+= sigma0_2*cosphi*cosphi + sigma1_2*sinphi*sinphi;
00146 v_tot(0,1)+= cosphi*sinphi*(sigma0_2 - sigma1_2);
00147 v_tot(1,0)+= cosphi*sinphi*(sigma0_2 - sigma1_2);
00148 v_tot(1,1)+= sigma1_2*cosphi*cosphi + sigma0_2*sinphi*sinphi;
00149
00150 }
00151 signifmatrix_=v_tot;
00152 }
00153
00154
00155 const double
00156 metsig::significanceAlgo::significance(double &met_r, double &met_phi, double &met_set)
00157 {
00158
00159 if(signifmatrix_(0,0)==0 && signifmatrix_(1,1)==0 && signifmatrix_(1,0)==0 && signifmatrix_(0,1)==0){
00160
00161 return(-1);
00162 }
00163
00164
00165
00166 TMatrixD v_tot(2,2);
00167 TVectorD metvec(2);
00168
00169
00170 v_tot=signifmatrix_;
00171
00172
00173
00174
00175
00176 met_r = sqrt(xmet_*xmet_ + ymet_*ymet_);
00177 met_set = set_worker_;
00178 met_phi= TMath::ATan2(ymet_, xmet_);
00179
00180
00181
00182 if(fabs(v_tot.Determinant())<0.000001)
00183 return -1;
00184
00185
00186
00187
00188 v_tot.Invert();
00189
00190
00191
00192
00193 metvec(0) = xmet_; metvec(1) = ymet_;
00194 double lnSignificance = metvec * (v_tot * metvec);
00195
00196
00197
00198 return lnSignificance;
00199 }
00200