Go to the documentation of this file.00001 #include "PhysicsTools/JetMCUtils/interface/JetMCTag.h"
00002 #include "PhysicsTools/JetMCUtils/interface/CandMCTag.h"
00003 #include <iostream>
00004
00005 using namespace std;
00006 using namespace reco;
00007 using namespace JetMCTagUtils;
00008 using namespace CandMCTagUtils;
00009
00011
00012 double JetMCTagUtils::EnergyRatioFromBHadrons(const Candidate & c)
00013 {
00014 double ratioForBjet=0;
00015 double ratio = 0;
00016 for( Candidate::const_iterator itC = c.begin();
00017 itC != c.end();
00018 itC ++) {
00019 bool isFromB = decayFromBHadron(*itC);
00020 ratio = itC->energy() / c.energy() ;
00021 if( isFromB ) ratioForBjet += ratio;
00022 }
00023 return ratioForBjet;
00024 }
00025
00026 double JetMCTagUtils::EnergyRatioFromCHadrons(const Candidate & c)
00027 {
00028 double ratioForCjet=0;
00029 double ratio = 0;
00030 for( Candidate::const_iterator itC = c.begin();
00031 itC != c.end();
00032 itC ++) {
00033 bool isFromC = decayFromCHadron(*itC);
00034 ratio = itC->energy() / c.energy() ;
00035 if( isFromC ) ratioForCjet += ratio;
00036 }
00037 return ratioForCjet;
00038 }
00039
00040 bool JetMCTagUtils::decayFromBHadron(const Candidate & c)
00041 {
00042 bool isFromB = false;
00043 vector<const Candidate *> allParents = getAncestors( c );
00044 for( vector<const Candidate *>::const_iterator aParent = allParents.begin();
00045 aParent != allParents.end();
00046 aParent ++ )
00047 {
00048 if( hasBottom(**aParent) ) isFromB = true;
00049
00050
00051
00052
00053
00054
00055
00056 }
00057 return isFromB;
00058
00059 }
00060
00061 bool JetMCTagUtils::decayFromCHadron(const Candidate & c)
00062 {
00063 bool isFromC = false;
00064 vector<const Candidate *> allParents = getAncestors( c );
00065 for( vector<const Candidate *>::const_iterator aParent = allParents.begin();
00066 aParent != allParents.end();
00067 aParent ++ )
00068 {
00069 if( hasCharm(**aParent) ) isFromC = true;
00070
00071
00072
00073
00074
00075
00076
00077 }
00078 return isFromC;
00079 }
00080
00081 std::string JetMCTagUtils::genTauDecayMode(const CompositePtrCandidate &c) {
00082
00083 int numElectrons = 0;
00084 int numMuons = 0;
00085 int numChargedHadrons = 0;
00086 int numNeutralHadrons = 0;
00087 int numPhotons = 0;
00088
00089 const CompositePtrCandidate::daughters& daughters = c.daughterPtrVector();
00090 for ( CompositePtrCandidate::daughters::const_iterator daughter = daughters.begin();
00091 daughter != daughters.end(); ++daughter ) {
00092
00093 int pdg_id = abs((*daughter)->pdgId());
00094
00095 switch ( pdg_id ) {
00096
00097 case 22:
00098 numPhotons++;
00099 break;
00100 case 11:
00101 numElectrons++;
00102 break;
00103 case 13:
00104 numMuons++;
00105 break;
00106 default : {if ((*daughter)->charge() != 0) numChargedHadrons++; else numNeutralHadrons++;}
00107 }
00108 }
00109
00110 if (numElectrons == 1) return std::string("electron");
00111 else if (numMuons == 1) return std::string("muon");
00112
00113 switch ( numChargedHadrons ) {
00114 case 1 :
00115 if (numNeutralHadrons != 0) return std::string("oneProngOther");
00116 switch ( numPhotons ) {
00117 case 0:
00118 return std::string("oneProng0Pi0");
00119 case 2:
00120 return std::string("oneProng1Pi0");
00121 case 4:
00122 return std::string("oneProng2Pi0");
00123 default:
00124 return std::string("oneProngOther");
00125 }
00126 case 3 :
00127 if (numNeutralHadrons != 0) return std::string("threeProngOther");
00128 switch ( numPhotons ) {
00129 case 0:
00130 return std::string("threeProng0Pi0");
00131 case 2:
00132 return std::string("threeProng1Pi0");
00133 default:
00134 return std::string("threeProngOther");
00135 }
00136 default:
00137 return std::string("rare");
00138 }
00139
00140 }
00141