00001 #include "TopQuarkAnalysis/TopEventSelection/interface/TtHadLRSignalSelObservables.h"
00002
00003 TtHadLRSignalSelObservables::TtHadLRSignalSelObservables()
00004 {
00005 }
00006
00007 TtHadLRSignalSelObservables::~TtHadLRSignalSelObservables()
00008 {
00009 }
00010
00011 void TtHadLRSignalSelObservables::operator() (TtHadEvtSolution &TS)
00012 {
00013 evtselectVarVal.clear();
00014 std::vector<pat::Jet> topJets;
00015 topJets.clear();
00016 topJets.push_back(TS.getHadp());
00017 topJets.push_back(TS.getHadq());
00018 topJets.push_back(TS.getHadj());
00019 topJets.push_back(TS.getHadk());
00020 topJets.push_back(TS.getHadb());
00021 topJets.push_back(TS.getHadbbar());
00022
00023
00024 TLorentzVector *Hadp = new TLorentzVector();
00025 TLorentzVector *Hadq = new TLorentzVector();
00026 TLorentzVector *Hadj = new TLorentzVector();
00027 TLorentzVector *Hadk = new TLorentzVector();
00028 TLorentzVector *Hadb = new TLorentzVector();
00029 TLorentzVector *Hadbbar = new TLorentzVector();
00030 Hadp->SetPxPyPzE(topJets[0].px(),topJets[0].py(),topJets[0].pz(),topJets[3].energy());
00031 Hadq->SetPxPyPzE(topJets[1].px(),topJets[1].py(),topJets[1].pz(),topJets[2].energy());
00032 Hadj->SetPxPyPzE(topJets[2].px(),topJets[2].py(),topJets[2].pz(),topJets[2].energy());
00033 Hadk->SetPxPyPzE(topJets[3].px(),topJets[3].py(),topJets[3].pz(),topJets[3].energy());
00034 Hadb->SetPxPyPzE(topJets[4].px(),topJets[4].py(),topJets[4].pz(),topJets[1].energy());
00035 Hadbbar->SetPxPyPzE(topJets[4].px(),topJets[4].py(),topJets[4].pz(),topJets[1].energy());
00036
00037
00038 std::sort(topJets.begin(),topJets.end(),EtComparator);
00039
00040
00041 double EtSum = topJets[5].et()+topJets[5].et();
00042 double Obs1 = (EtSum>0 ? EtSum : -1);
00043 evtselectVarVal.push_back(std::pair<unsigned int,double>(1,Obs1));
00044
00045
00046
00047
00048
00049 std::sort(topJets.begin(),topJets.end(),BdiscComparator);
00050
00051 double BGap = topJets[1].bDiscriminator("trackCountingJetTags") - topJets[2].bDiscriminator("trackCountingJetTags");
00052 double Obs2 = (BGap>0 ? log(BGap) : -1);
00053 evtselectVarVal.push_back(std::pair<unsigned int,double>(2,Obs2));
00054
00055
00056 double N=0,D=0,C_tmp=0,C=1000;
00057 double nx,ny,nz;
00058
00059
00060
00061 for(unsigned int i=0;i<6;i++){
00062 D += fabs(topJets[i].pt());
00063 }
00064
00065 if((D>0)){
00066
00067 for(unsigned int i=0; i<360; i++){
00068 nx = cos((2*PI/360)*i);
00069 ny = sin((2*PI/360)*i);
00070 nz = 0;
00071 N=0;
00072 for(unsigned int i=0;i<4;i++){
00073 N += fabs(topJets[i].px()*nx+topJets[i].py()*ny+topJets[i].pz()*nz);
00074 }
00075 C_tmp = 2*N/D;
00076 if(C_tmp<C) C = C_tmp;
00077 }
00078 }
00079
00080 double Obs3 = ( C!=1000 ? C : -1);
00081 evtselectVarVal.push_back(std::pair<unsigned int,double>(3,Obs3));
00082
00083
00084
00085 double HT=0;
00086 for(unsigned int i=0;i<6;i++){
00087 HT += topJets[i].et();
00088 }
00089
00090 double Obs4 = ( HT!=0 ? HT : -1);
00091 evtselectVarVal.push_back(std::pair<unsigned int,double>(4,Obs4));
00092
00093
00094 math::XYZTLorentzVector pjets;
00095
00096 for(unsigned int i=0;i<6;i++){
00097 pjets += topJets[i].p4();
00098 }
00099 double MT = sqrt(std::pow(pjets.mass(),2));
00100 double Obs5 = ( MT>0 ? MT : -1);
00101 evtselectVarVal.push_back(std::pair<unsigned int,double>(5,Obs5));
00102
00103
00104
00105 std::sort(topJets.begin(),topJets.end(),EtComparator);
00106
00107 double px1 = topJets[2].px(); double px2 = topJets[3].px();
00108 double py1 = topJets[2].py(); double py2 = topJets[3].py();
00109 double pz1 = topJets[2].pz(); double pz2 = topJets[3].pz();
00110 double E1 = topJets[2].energy(); double E2 = topJets[3].energy();
00111 double px3 = topJets[4].px(); double px4 = topJets[5].px();
00112 double py3 = topJets[4].py(); double py4 = topJets[5].py();
00113 double pz3 = topJets[4].pz(); double pz4 = topJets[5].pz();
00114 double E3 = topJets[4].energy(); double E4 = topJets[5].energy();
00115
00116 TLorentzVector *LightJet1 = new TLorentzVector();
00117 TLorentzVector *LightJet2 = new TLorentzVector();
00118 TLorentzVector *LightJet3 = new TLorentzVector();
00119 TLorentzVector *LightJet4 = new TLorentzVector();
00120
00121 LightJet1->SetPxPyPzE(px1,py1,pz1,E1);
00122
00123 LightJet2->SetPxPyPzE(px2,py2,pz2,E2);
00124
00125 LightJet3->SetPxPyPzE(px3,py3,pz3,E3);
00126
00127 LightJet4->SetPxPyPzE(px4,py4,pz4,E4);
00128
00129
00130 double CosTheta1 = cos(LightJet2->Angle(LightJet1->Vect()));
00131 double CosTheta2 = cos(LightJet4->Angle(LightJet3->Vect()));
00132
00133 double Obs6 = ( -1<CosTheta1 ? CosTheta1 : -2);
00134 evtselectVarVal.push_back(std::pair<unsigned int,double>(6,Obs6));
00135 double Obs7 = ( -1<CosTheta2 ? CosTheta2 : -2);
00136 evtselectVarVal.push_back(std::pair<unsigned int,double>(7,Obs7));
00137
00138 delete LightJet1;
00139 delete LightJet2;
00140 delete LightJet3;
00141 delete LightJet4;
00142
00143
00144
00145 std::sort(topJets.begin(),topJets.end(),BdiscComparator);
00146
00147 double BjetsBdiscSum = topJets[0].bDiscriminator("trackCountingJetTags") + topJets[1].bDiscriminator("trackCountingJetTags");
00148 double Ljets1BdiscSum = topJets[2].bDiscriminator("trackCountingJetTags") + topJets[3].bDiscriminator("trackCountingJetTags");
00149 double Ljets2BdiscSum = topJets[4].bDiscriminator("trackCountingJetTags") + topJets[5].bDiscriminator("trackCountingJetTags");
00150
00151
00152
00153 double Obs8 = (Ljets1BdiscSum !=0 ? log(BjetsBdiscSum/Ljets1BdiscSum) : -1);
00154 evtselectVarVal.push_back(std::pair<unsigned int,double>(8,Obs8));
00155 double Obs9 = (Ljets2BdiscSum !=0 ? log(BjetsBdiscSum/Ljets2BdiscSum) : -1);
00156 evtselectVarVal.push_back(std::pair<unsigned int,double>(9,Obs9));
00157 double Obs10 = (BGap>0 ? log(BjetsBdiscSum*BGap) : -1);
00158 evtselectVarVal.push_back(std::pair<unsigned int,double>(10,Obs10));
00159
00160
00161
00162 double Obs11 = (HT!=0 ? (HT-EtSum)/HT : -1);
00163 evtselectVarVal.push_back(std::pair<unsigned int,double>(11,Obs11));
00164
00165
00166
00167
00168 TMatrixDSym Matrix(3);
00169 double PX2 = std::pow(Hadp->Px(),2)+std::pow(Hadq->Px(),2)+std::pow(Hadb->Px(),2)+
00170 std::pow(Hadj->Px(),2)+std::pow(Hadk->Px(),2)+std::pow(Hadbbar->Px(),2);
00171 double PY2 = std::pow(Hadp->Py(),2)+std::pow(Hadq->Py(),2)+std::pow(Hadb->Py(),2)+
00172 std::pow(Hadj->Py(),2)+std::pow(Hadk->Py(),2)+std::pow(Hadbbar->Py(),2);
00173 double PZ2 = std::pow(Hadp->Pz(),2)+std::pow(Hadq->Pz(),2)+std::pow(Hadb->Pz(),2)+
00174 std::pow(Hadj->Pz(),2)+std::pow(Hadk->Pz(),2)+std::pow(Hadbbar->Pz(),2);
00175 double P2 = PX2+PY2+PZ2;
00176
00177 double PXY = Hadp->Px()*Hadp->Py()+Hadq->Px()*Hadq->Py()+Hadb->Px()*Hadb->Py()+
00178 Hadj->Px()*Hadj->Py()+Hadk->Px()*Hadk->Py()+Hadbbar->Px()*Hadbbar->Py();
00179 double PXZ = Hadp->Px()*Hadp->Pz()+Hadq->Px()*Hadq->Pz()+Hadb->Px()*Hadb->Pz()+
00180 Hadj->Px()*Hadj->Pz()+Hadk->Px()*Hadk->Pz()+Hadbbar->Px()*Hadbbar->Pz();
00181 double PYZ = Hadp->Py()*Hadp->Pz()+Hadq->Py()*Hadq->Pz()+Hadb->Py()*Hadb->Pz()+
00182 Hadj->Py()*Hadj->Pz()+Hadk->Py()*Hadk->Pz()+Hadbbar->Py()*Hadbbar->Pz();
00183
00184 Matrix(0,0) = PX2/P2; Matrix(0,1) = PXY/P2; Matrix(0,2) = PXZ/P2;
00185 Matrix(1,0) = PXY/P2; Matrix(1,1) = PY2/P2; Matrix(1,2) = PYZ/P2;
00186 Matrix(2,0) = PXZ/P2; Matrix(2,1) = PYZ/P2; Matrix(2,2) = PZ2/P2;
00187
00188 TMatrixDSymEigen pTensor(Matrix);
00189
00190 std::vector<double> EigValues;
00191 EigValues.clear();
00192 for(int i=0;i<3;i++){
00193 EigValues.push_back(pTensor.GetEigenValues()[i]);
00194 }
00195
00196 std::sort(EigValues.begin(),EigValues.end(),dComparator);
00197
00198 double Sphericity = 1.5*(EigValues[1]+EigValues[2]);
00199 double Aplanarity = 1.5*EigValues[2];
00200
00201 double Obs12 = (isnan(Sphericity) ? -1 : Sphericity);
00202 evtselectVarVal.push_back(std::pair<unsigned int,double>(12,Obs12));
00203
00204 double Obs13 = (isnan(Aplanarity) ? -1 : Aplanarity);
00205 evtselectVarVal.push_back(std::pair<unsigned int,double>(13,Obs13));
00206
00207
00208
00209 TLorentzVector *TtbarSystem = new TLorentzVector();
00210 TtbarSystem->SetPx(Hadp->Px()+Hadq->Px()+Hadb->Px()+Hadj->Px()+Hadk->Px()+Hadbbar->Px());
00211 TtbarSystem->SetPy(Hadp->Py()+Hadq->Py()+Hadb->Py()+Hadj->Py()+Hadk->Py()+Hadbbar->Py());
00212 TtbarSystem->SetPz(Hadp->Pz()+Hadq->Pz()+Hadb->Pz()+Hadj->Pz()+Hadk->Pz()+Hadbbar->Pz());
00213 TtbarSystem->SetE(Hadp->E()+Hadq->E()+Hadb->E()+Hadj->E()+Hadk->E()+Hadbbar->E());
00214
00215 TVector3 BoostBackToCM = -(TtbarSystem->BoostVector());
00216 Hadp->Boost(BoostBackToCM);
00217 Hadq->Boost(BoostBackToCM);
00218 Hadb->Boost(BoostBackToCM);
00219 Hadj->Boost(BoostBackToCM);
00220 Hadk->Boost(BoostBackToCM);
00221 Hadbbar->Boost(BoostBackToCM);
00222
00223 double BOOST_PX2 = std::pow(Hadp->Px(),2)+std::pow(Hadq->Px(),2)+std::pow(Hadb->Px(),2)+
00224 std::pow(Hadj->Px(),2)+std::pow(Hadk->Px(),2)+std::pow(Hadbbar->Px(),2);
00225 double BOOST_PY2 = std::pow(Hadp->Py(),2)+std::pow(Hadq->Py(),2)+std::pow(Hadb->Py(),2)+
00226 std::pow(Hadj->Py(),2)+std::pow(Hadk->Py(),2)+std::pow(Hadbbar->Py(),2);
00227 double BOOST_PZ2 = std::pow(Hadp->Pz(),2)+std::pow(Hadq->Pz(),2)+std::pow(Hadb->Pz(),2)+
00228 std::pow(Hadj->Pz(),2)+std::pow(Hadk->Pz(),2)+std::pow(Hadbbar->Pz(),2);
00229
00230 double BOOST_P2 = BOOST_PX2+BOOST_PY2+BOOST_PZ2;
00231
00232 double BOOST_PXY = Hadp->Px()*Hadp->Py()+Hadq->Px()*Hadq->Py()+Hadb->Px()*Hadb->Py()+
00233 Hadj->Px()*Hadj->Py()+Hadk->Px()*Hadk->Py()+Hadbbar->Px()*Hadbbar->Py();
00234 double BOOST_PXZ = Hadp->Px()*Hadp->Pz()+Hadq->Px()*Hadq->Pz()+Hadb->Px()*Hadb->Pz()+
00235 Hadj->Px()*Hadj->Pz()+Hadk->Px()*Hadk->Pz()+Hadbbar->Px()*Hadbbar->Pz();
00236 double BOOST_PYZ = Hadp->Py()*Hadp->Pz()+Hadq->Py()*Hadq->Pz()+Hadb->Py()*Hadb->Pz()+
00237 Hadj->Py()*Hadj->Pz()+Hadk->Py()*Hadk->Pz()+Hadbbar->Py()*Hadbbar->Pz();
00238
00239 TMatrixDSym BOOST_Matrix(3);
00240
00241 BOOST_Matrix(0,0) = BOOST_PX2/BOOST_P2; BOOST_Matrix(0,1) = BOOST_PXY/BOOST_P2; BOOST_Matrix(0,2) = BOOST_PXZ/BOOST_P2;
00242 BOOST_Matrix(1,0) = BOOST_PXY/BOOST_P2; BOOST_Matrix(1,1) = BOOST_PY2/BOOST_P2; BOOST_Matrix(1,2) = BOOST_PYZ/BOOST_P2;
00243 BOOST_Matrix(2,0) = BOOST_PXZ/BOOST_P2; BOOST_Matrix(2,1) = BOOST_PYZ/BOOST_P2; BOOST_Matrix(2,2) = BOOST_PZ2/BOOST_P2;
00244
00245 TMatrixDSymEigen BOOST_pTensor(BOOST_Matrix);
00246
00247 std::vector<double> BOOST_EigValues;
00248 BOOST_EigValues.clear();
00249 for(int i=0;i<3;i++){
00250 BOOST_EigValues.push_back(BOOST_pTensor.GetEigenValues()[i]);
00251 }
00252
00253 std::sort(BOOST_EigValues.begin(),BOOST_EigValues.end(),dComparator);
00254
00255 double BOOST_Sphericity = 1.5*(BOOST_EigValues[1]+BOOST_EigValues[2]);
00256 double BOOST_Aplanarity = 1.5*BOOST_EigValues[2];
00257
00258 double Obs14 = ( isnan(BOOST_Sphericity) ? -1 : BOOST_Sphericity );
00259 evtselectVarVal.push_back(std::pair<unsigned int,double>(14,Obs14));
00260
00261 double Obs15 = ( isnan(BOOST_Aplanarity) ? -1 : BOOST_Aplanarity );
00262 evtselectVarVal.push_back(std::pair<unsigned int,double>(15,Obs15));
00263
00264
00265
00266 double H=0;
00267 for(unsigned int i=0;i<6;i++){
00268 H += topJets[i].energy();
00269 }
00270 double Obs16 = ( H != 0 ? HT/H : -1 );
00271 evtselectVarVal.push_back(std::pair<unsigned int,double>(16,Obs16));
00272
00273
00274
00275 double Obs17 = ( BjetsBdiscSum != 0 && Ljets1BdiscSum != 0 ? 0.707*(BjetsBdiscSum-Ljets1BdiscSum) : -1 );
00276 evtselectVarVal.push_back(std::pair<unsigned int,double>(17,Obs17));
00277 double Obs18 = ( BjetsBdiscSum != 0 && Ljets2BdiscSum != 0 ? 0.707*(BjetsBdiscSum-Ljets2BdiscSum) : -1 );
00278 evtselectVarVal.push_back(std::pair<unsigned int,double>(18,Obs18));
00279
00280
00281 double Obs19 = ( HT != 0 ? EtSum/HT : -1 );
00282 evtselectVarVal.push_back(std::pair<unsigned int,double>(19,Obs19));
00283
00284
00285
00286 TS.setLRSignalEvtObservables(evtselectVarVal);
00287 }