Go to the documentation of this file.00001
00013 #include "TopQuarkAnalysis/TopPairBSM/interface/JetCombinatorics.h"
00014 #include "TMath.h"
00015
00016 #include <iostream>
00017
00018 std::string itoa(int i) {
00019 char temp[20];
00020 sprintf(temp,"%d",i);
00021 return((std::string)temp);
00022 }
00023
00024
00025
00026
00027 JetCombinatorics::JetCombinatorics() {
00028
00029 this->Clear();
00030
00031 minMassLepW_ = -999999.;
00032 maxMassLepW_ = 999999.;
00033 minMassHadW_ = -999999.;
00034 maxMassHadW_ = 999999.;
00035 minMassLepTop_ = -999999.;
00036 maxMassLepTop_ = 999999.;
00037
00038 minPhi_ = -1.;
00039 removeDuplicates_ = true;
00040 maxNJets_ = 9999;
00041 verbosef = false;
00042 UsebTagging_ = false;
00043 UseMtop_ = true;
00044 SigmasTypef = 0;
00045 UseFlv_ = false;
00046
00047 Template4jCombos_ = NestedCombinatorics();
00048 Template5jCombos_ = Combinatorics(4,5);
00049 Template6jCombos_ = Combinatorics(4,6);
00050 Template7jCombos_ = Combinatorics(4,7);
00051
00052 }
00053
00054
00055 JetCombinatorics::~JetCombinatorics() {
00056 this->Clear();
00057 }
00058
00059
00060 void JetCombinatorics::Clear() {
00061
00062 allCombos_.clear();
00063 allCombosSumEt_.clear();
00064 Template4jCombos_.clear();
00065 Template5jCombos_.clear();
00066 Template6jCombos_.clear();
00067 Template7jCombos_.clear();
00068 cand1_.clear();
00069
00070 }
00071
00072
00073
00074 std::map< int, std::string > JetCombinatorics::Combinatorics(int n, int max) {
00075
00076
00077
00078
00079 int kcombos = n;
00080 int maxcombos = max;
00081
00082 std::string list;
00083
00084 for ( int m=0; m<maxcombos; m++) { list = list + (itoa(m));}
00085
00086 std::string seed;
00087 for ( int m=0; m<kcombos; m++) { seed = seed + (itoa(m));}
00088
00089
00090 std::map< int, std::string > aTemplateCombos;
00091 aTemplateCombos.clear();
00092
00093 aTemplateCombos[0] = seed;
00094
00095 int i = 0;
00096 int totalmatches = seed.size();
00097 int totalIte = list.size();
00098
00099 for ( int ite = 0; ite < ((int)totalIte); ite++) {
00100
00101
00102
00103
00104 for ( i=0; i< (int) totalmatches; i++) {
00105
00106 std::string newseed = aTemplateCombos[ite];
00107 std::string newseed2;
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 for ( int itemp=0; itemp<(int)newseed.size(); itemp++) {
00118 if (itemp!=i) newseed2 = newseed2 + (newseed[itemp]);
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 for ( int j=0; j<(int) list.size(); j++) {
00130
00131 bool Isnewelement = true;
00132 std::string newelement = "0";
00133
00134 for (int k=0; k< (int)newseed2.size(); k++) {
00135 if ( list[j] == newseed2[k] ) Isnewelement = false;
00136 }
00137 if (Isnewelement) {
00138
00139 newelement = list[j];
00140
00141
00142 std::string candseed = newseed2;
00143 candseed = candseed + newelement;
00144
00145 bool IsnewCombo = true;
00146 for (int ic=0; ic<(int)aTemplateCombos.size(); ++ic ) {
00147
00148 int nmatch = 0;
00149 for ( int ij=0; ij<(int)(aTemplateCombos[ic]).size(); ij++) {
00150
00151 for (int ik=0; ik<(int)candseed.size(); ik++) {
00152 if ( candseed[ik] == aTemplateCombos[ic][ij] ) nmatch++;
00153 }
00154 }
00155 if (nmatch == (int)totalmatches)
00156 IsnewCombo = false;
00157
00158 }
00159 if (IsnewCombo) {
00160
00161 aTemplateCombos[(int)aTemplateCombos.size()] = candseed;
00162
00163 }
00164 }
00165
00166 }
00167 }
00168 }
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 return aTemplateCombos;
00180
00181
00182
00183 }
00184
00185
00186
00187 std::map< int, std::string > JetCombinatorics::NestedCombinatorics() {
00188
00189
00190
00191 std::map< int, std::string > aTemplateCombos;
00192 aTemplateCombos.clear();
00193
00194 aTemplateCombos[0] = "0123";
00195 aTemplateCombos[1] = "0132";
00196 aTemplateCombos[2] = "0213";
00197 aTemplateCombos[3] = "0231";
00198 aTemplateCombos[4] = "0312";
00199 aTemplateCombos[5] = "0321";
00200 aTemplateCombos[6] = "1203";
00201 aTemplateCombos[7] = "1230";
00202 aTemplateCombos[8] = "1302";
00203 aTemplateCombos[9] = "1320";
00204 aTemplateCombos[10] = "2301";
00205 aTemplateCombos[11] = "2310";
00206
00207 return aTemplateCombos;
00208
00209 }
00210
00211
00212 void JetCombinatorics::FourJetsCombinations(std::vector<TLorentzVector> jets, std::vector<double> bdiscriminators ) {
00213
00214
00215 int n = 0;
00216 std::map< Combo, int, minChi2 > allCombos;
00217 std::map< Combo, int, maxSumEt > allCombosSumEt;
00218
00219 std::map< int, std::string > aTemplateCombos;
00220 aTemplateCombos.clear();
00221
00222 if ( jets.size() == 4 ) aTemplateCombos[0] = std::string("0123");
00223 if ( jets.size() == 5 ) aTemplateCombos = Template5jCombos_;
00224 if ( jets.size() == 6 ) aTemplateCombos = Template6jCombos_;
00225 if ( jets.size() == 7 ) aTemplateCombos = Template7jCombos_;
00226
00227
00228 if ( maxNJets_ == 4 ) aTemplateCombos[0] = std::string("0123");
00229
00230 if (verbosef) std::cout << "[JetCombinatorics] size of vector of jets = " << jets.size() << std::endl;
00231
00232 for (size_t ic=0; ic != aTemplateCombos.size(); ++ic) {
00233
00234 if (verbosef) std::cout << "[JetCombinatorics] get 4 jets from the list, cluster # " << ic << "/"<< aTemplateCombos.size()-1 << std::endl;
00235
00236
00237 std::string aTemplate = aTemplateCombos[ic];
00238
00239 if (verbosef) std::cout << "[JetCombinatorics] template of 4 jets = " << aTemplate << std::endl;
00240
00241
00242 std::vector< TLorentzVector > the4jets;
00243 std::vector< int > the4Ids;
00244 std::vector< double > thebdisc;
00245 std::vector< double > theFlvCorr;
00246
00247
00248 for (int ij=0; ij<4; ij++) {
00249
00250
00251
00252 int tmpi = atoi((aTemplate.substr(ij,1)).c_str());
00253
00254 the4jets.push_back(jets[tmpi]);
00255 the4Ids.push_back(tmpi);
00256 if ( UsebTagging_ ) thebdisc.push_back( bdiscriminators[tmpi] );
00257 if ( UseFlv_ ) theFlvCorr.push_back( flavorCorrections_[tmpi] );
00258 }
00259
00260 if (verbosef) std::cout<< "[JetCombinatorics] with these 4 jets, make 12 combinations: " <<std::endl;
00261
00262
00263
00264 for (size_t itemplate=0; itemplate!= Template4jCombos_.size(); ++itemplate) {
00265
00266 std::string a4template = Template4jCombos_[itemplate];
00267
00268 if (verbosef) std::cout << "[JetCombinatorics] ==> combination: " << a4template << " is # " << itemplate << "/"<< Template4jCombos_.size()-1 << std::endl;
00269
00270 Combo acombo;
00271
00272 acombo.SetWp( the4jets[atoi((a4template.substr(0,1)).c_str())] );
00273 acombo.SetWq( the4jets[atoi((a4template.substr(1,1)).c_str())] );
00274 acombo.SetHadb( the4jets[atoi((a4template.substr(2,1)).c_str())] );
00275 acombo.SetLepb( the4jets[atoi((a4template.substr(3,1)).c_str())] );
00276 acombo.SetLepW( theLepW_ );
00277
00278 acombo.SetIdWp( the4Ids[atoi((a4template.substr(0,1)).c_str())] );
00279 acombo.SetIdWq( the4Ids[atoi((a4template.substr(1,1)).c_str())] );
00280 acombo.SetIdHadb( the4Ids[atoi((a4template.substr(2,1)).c_str())] );
00281 acombo.SetIdLepb( the4Ids[atoi((a4template.substr(3,1)).c_str())] );
00282
00283
00284 if ( UseFlv_ ) {
00285 acombo.SetFlvCorrWp( theFlvCorr[atoi((a4template.substr(0,1)).c_str())] );
00286 acombo.SetFlvCorrWq( theFlvCorr[atoi((a4template.substr(1,1)).c_str())] );
00287 acombo.SetFlvCorrHadb( theFlvCorr[atoi((a4template.substr(2,1)).c_str())] );
00288 acombo.SetFlvCorrLepb( theFlvCorr[atoi((a4template.substr(3,1)).c_str())] );
00289 acombo.ApplyFlavorCorrections();
00290 }
00291 if ( UsebTagging_ ) {
00292
00293 acombo.Usebtagging();
00294 acombo.SetbDiscPdf(bTagPdffilename_);
00295 acombo.SetWp_disc( thebdisc[atoi((a4template.substr(0,1)).c_str())] );
00296 acombo.SetWq_disc( thebdisc[atoi((a4template.substr(1,1)).c_str())] );
00297 acombo.SetHadb_disc( thebdisc[atoi((a4template.substr(2,1)).c_str())] );
00298 acombo.SetLepb_disc( thebdisc[atoi((a4template.substr(3,1)).c_str())] );
00299
00300 }
00301
00302 acombo.UseMtopConstraint(UseMtop_);
00303
00304 acombo.SetSigmas(SigmasTypef);
00305
00306 acombo.analyze();
00307
00308 if (verbosef) {
00309
00310 std::cout << "[JetCombinatorics] ==> combination done:" << std::endl;
00311 acombo.Print();
00312 }
00313
00314
00315 TLorentzVector aHadWP4 = acombo.GetHadW();
00316 TLorentzVector aLepWP4 = acombo.GetLepW();
00317 TLorentzVector aLepTopP4=acombo.GetLepTop();
00318
00319 if ( ( aHadWP4.M() > minMassHadW_ && aHadWP4.M() < maxMassHadW_ ) &&
00320 ( aLepWP4.M() > minMassLepW_ && aLepWP4.M() < maxMassLepW_ ) &&
00321 ( aLepTopP4.M() > minMassLepTop_ && aLepTopP4.M() < maxMassLepTop_) ) {
00322
00323 allCombos[acombo] = n;
00324 allCombosSumEt[acombo] = n;
00325
00326 n++;
00327 }
00328
00329 }
00330 }
00331
00332 allCombos_ = allCombos;
00333 allCombosSumEt_ = allCombosSumEt;
00334
00335 }
00336
00337 Combo JetCombinatorics::GetCombination(int n) {
00338
00339 int j = 0;
00340 Combo a;
00341 for ( std::map<Combo,int,minChi2>::const_iterator ite=allCombos_.begin();
00342 ite!=allCombos_.end(); ++ite) {
00343
00344 if (j == n) a = ite->first;
00345 j++;
00346 }
00347
00348 return a;
00349
00350
00351 }
00352
00353 Combo JetCombinatorics::GetCombinationSumEt(int n) {
00354
00355 int j = 0;
00356 Combo a;
00357 for ( std::map<Combo,int,maxSumEt>::const_iterator ite=allCombosSumEt_.begin();
00358 ite!=allCombosSumEt_.end(); ++ite) {
00359
00360 if (j == n) a = ite->first;
00361 j++;
00362 }
00363
00364 return a;
00365
00366
00367 }