CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/PhysicsTools/JetMCUtils/src/JetMCTag.cc

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          cout << "     particle Parent is " << (*aParent)->status()
00051               << " type " << (*aParent)->pdgId()
00052               << " pt=" << (*aParent)->pt()
00053               << " isB = " << isFromB
00054               << endl;
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          cout << "     particle Parent is " << (*aParent)->status()
00072               << " type " << (*aParent)->pdgId()
00073               << " pt=" << (*aParent)->pt()
00074               << " isC = " << isFromC
00075               << endl;
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