CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/DataFormats/BTauReco/src/TaggingVariable.cc

Go to the documentation of this file.
00001 #include <algorithm>
00002 #include <functional>
00003 #include <ext/functional>
00004 using namespace std;
00005 
00006 #include "FWCore/Utilities/interface/EDMException.h"
00007 #include "DataFormats/BTauReco/interface/TaggingVariable.h"
00008 
00009 namespace reco {
00010 
00011 const char* TaggingVariableDescription[] = {
00012   /* [jetEnergy]                                = */ "jet energy",
00013   /* [jetPt]                                    = */ "jet transverse momentum",
00014   /* [jetEta]                                   = */ "jet pseudorapidity",
00015   /* [jetPhi]                                   = */ "jet polar angle",
00016   /* [jetNTracks]                               = */ "tracks associated to jet",
00017 
00018   /* [trackMomentum]                            = */ "track momentum",
00019   /* [trackEta]                                 = */ "track pseudorapidity",
00020   /* [trackPhi]                                 = */ "track polar angle",
00021 
00022   /* [trackPtRel]                               = */ "track transverse momentum, relative to the jet axis",
00023   /* [trackPPar]                                = */ "track parallel momentum, along the jet axis",
00024   /* [trackEtaRel]                              = */ "track pseudorapidity, relative to the jet axis",
00025   /* [trackDeltaR]                              = */ "track pseudoangular distance from the jet axis",
00026   /* [trackPtRatio]                             = */ "track transverse momentum, relative to the jet axis, normalized to its energy",
00027   /* [trackPParRatio]                           = */ "track parallel momentum, along the jet axis, normalized to its energy",
00028 
00029   /* [trackIp2dVal]                             = */ "track 2D impact parameter",
00030   /* [trackSip2dVal]                            = */ "track 2D signed impact parameter",
00031   /* [trackSip2dSig]                            = */ "track 2D signed impact parameter significance",
00032   /* [trackSip3dVal]                            = */ "track 3D signed impact parameter",
00033   /* [trackSip3dSig]                            = */ "track 3D signed impact parameter significance",
00034   /* [trackDecayLenVal]                         = */ "track decay length",
00035   /* [trackDecayLenSig]                         = */ "track decay length significance",
00036   /* [trackJetDistVal]                          = */ "minimum track approach distance to jet axis",
00037   /* [trackJetDistSig]                          = */ "minimum track approach distance to jet axis signifiance",
00038   /* [trackGhostTrackDistVal]                   = */ "minimum approach distance to ghost track",
00039   /* [trackGhostTrackDistSig]                   = */ "minimum approach distance to ghost track significance",
00040   /* [trackGhostTrackWeight]                    = */ "weight of track participation in ghost track fit",
00041 
00042   /* [trackSumJetEtRatio]                       = */ "ratio of track sum transverse energy over jet energy",
00043   /* [trackSumJetDeltaR]                        = */ "pseudoangular distance between jet axis and track fourvector sum",
00044 
00045   /* [vertexCategory]                           = */ "category of secondary vertex (Reco, Pseudo, No)",
00046 
00047   /* [jetNSecondaryVertices]                    = */ "number of reconstructed possible secondary vertices in jet",
00048   /* [jetNSingleTrackVertices]                  = */ "number of single-track ghost-track vertices",
00049 
00050   /* [vertexMass]                               = */ "mass of track sum at secondary vertex",
00051   /* [vertexNTracks]                            = */ "number of tracks at secondary vertex",
00052   /* [vertexFitProb]                            = */ "vertex fit probability",
00053 
00054   /* [vertexEnergyRatio]                        = */ "ratio of energy at secondary vertex over total energy",
00055   /* [vertexJetDeltaR]                          = */ "pseudoangular distance between jet axis and secondary vertex direction",
00056 
00057   /* [flightDistance2dVal]                      = */ "transverse distance between primary and secondary vertex",
00058   /* [flightDistance2dSig]                      = */ "transverse distance significance between primary and secondary vertex",
00059   /* [flightDistance3dVal]                      = */ "distance between primary and secondary vertex",
00060   /* [flightDistance3dSig]                      = */ "distance significance between primary and secondary vertex",
00061 
00062   /* [trackSip2dValAboveCharm]                  = */ "track 2D signed impact parameter of first track lifting mass above charm",
00063   /* [trackSip2dSigAboveCharm]                  = */ "track 2D signed impact parameter significance of first track lifting mass above charm",
00064   /* [trackSip3dValAboveCharm]                  = */ "track 3D signed impact parameter of first track lifting mass above charm",
00065   /* [trackSip3dSigAboveCharm]                  = */ "track 3D signed impact parameter significance of first track lifting mass above charm",
00066 
00067   /* [neutralEnergy]                            = */ "neutral ECAL clus. energy sum",
00068   /* [neutralEnergyOverCombinedEnergy]          = */ "neutral ECAL clus. energy sum/(neutral ECAL clus. energy sum + pion tracks energy)",
00069   /* [neutralIsolEnergy]                        = */ "neutral ECAL clus. energy sum in isolation band",
00070   /* [neutralIsolEnergyOverCombinedEnergy]      = */ "neutral ECAL clus. energy sum in isolation band/(neutral ECAL clus. energy sum + pion tracks energy)",
00071   /* [neutralEnergyRatio]                       = */ "ratio of neutral ECAL clus. energy sum in isolation band over neutral ECAL clus. energy sum",
00072   /* [neutralclusterNumber]                     = */ "number of neutral ECAL clus.",
00073   /* [neutralclusterRadius]                     = */ "mean DR between neutral ECAL clus. and lead.track",
00074 
00075   /* [leptonQuality]                            = */ "lepton identification quality",
00076   /* [leptonQuality2]                           = */ "lepton identification quality 2",
00077   /* [trackP0Par]                               = */ "track momentum along the jet axis, in the jet rest frame",
00078   /* [trackP0ParRatio]                          = */ "track momentum along the jet axis, in the jet rest frame, normalized to its energy"
00079   /* [trackChi2]                                = */ "chi2 of the track fit",
00080   /* [trackNTotalHits],                         = */ "number of valid total hits",
00081   /* [trackNPixelHits],                         = */ "number of valid pixel hits",
00082 
00083   /* [algoDiscriminator],                       = */ "discriminator output of an algorithm",
00084 
00085   /* [lastTaggingVariable]                      = */ ""
00086 };
00087 
00088 const char* TaggingVariableTokens[] = {
00089   /* [jetEnergy]                                = */ "jetEnergy",
00090   /* [jetPt]                                    = */ "jetPt",
00091   /* [jetEta]                                   = */ "jetEta",
00092   /* [jetPhi]                                   = */ "jetPhi",
00093   /* [jetNTracks]                               = */ "jetNTracks",
00094 
00095   /* [trackMomentum]                            = */ "trackMomentum",
00096   /* [trackEta]                                 = */ "trackEta",
00097   /* [trackPhi]                                 = */ "trackPhi",
00098 
00099   /* [trackPtRel]                               = */ "trackPtRel",
00100   /* [trackPPar]                                = */ "trackPPar",
00101   /* [trackEtaRel]                              = */ "trackEtaRel",
00102   /* [trackDeltaR]                              = */ "trackDeltaR",
00103   /* [trackPtRatio]                             = */ "trackPtRatio",
00104   /* [trackPParRatio]                           = */ "trackPParRatio",
00105 
00106   /* [trackIp2dVal]                             = */ "trackIp2dVal",
00107   /* [trackSip2dVal]                            = */ "trackSip2dVal",
00108   /* [trackSip2dSig]                            = */ "trackSip2dSig",
00109   /* [trackSip3dVal]                            = */ "trackSip3dVal",
00110   /* [trackSip3dSig]                            = */ "trackSip3dSig",
00111   /* [trackDecayLenVal]                         = */ "trackDecayLenVal",
00112   /* [trackDecayLenSig]                         = */ "trackDecayLenSig",
00113   /* [trackJetDistVal]                          = */ "trackJetDist",    //FIXME
00114   /* [trackJetDistSig]                          = */ "trackJetDistSig",
00115   /* [trackGhostTrackDistVal]                   = */ "trackGhostTrackDistVal",
00116   /* [trackGhostTrackDistSig]                   = */ "trackGhostTrackDistSig",
00117   /* [trackGhostTrackWeight]                    = */ "trackGhostTrackWeight",
00118 
00119   /* [trackSumJetEtRatio]                       = */ "trackSumJetEtRatio",
00120   /* [trackSumJetDeltaR]                        = */ "trackSumJetDeltaR",
00121 
00122   /* [vertexCategory]                           = */ "vertexCategory",
00123 
00124   /* [jetNSecondaryVertices]                    = */ "jetNSecondaryVertices",
00125   /* [jetNSingleTrackVertices]                  = */ "jetNSingleTrackVertices",
00126 
00127   /* [vertexMass]                               = */ "vertexMass",
00128   /* [vertexNTracks]                            = */ "vertexNTracks",
00129   /* [vertexFitProb]                            = */ "vertexFitProb",
00130 
00131   /* [vertexEnergyRatio]                        = */ "vertexEnergyRatio",
00132   /* [vertexJetDeltaR]                          = */ "vertexJetDeltaR",
00133 
00134   /* [flightDistance2dVal]                      = */ "flightDistance2dVal",
00135   /* [flightDistance2dSig]                      = */ "flightDistance2dSig",
00136   /* [flightDistance3dVal]                      = */ "flightDistance3dVal",
00137   /* [flightDistance3dSig]                      = */ "flightDistance3dSig",
00138 
00139   /* [trackSip2dValAboveCharm]                  = */ "trackSip2dValAboveCharm",
00140   /* [trackSip2dSigAboveCharm]                  = */ "trackSip2dSigAboveCharm",
00141   /* [trackSip3dValAboveCharm]                  = */ "trackSip3dValAboveCharm",
00142   /* [trackSip3dSigAboveCharm]                  = */ "trackSip3dSigAboveCharm",
00143 
00144   /* [neutralEnergy]                            = */ "neutralEnergy",
00145   /* [neutralEnergyOverCombinedEnergy]          = */ "neutralEnergyOverCombinedEnergy",
00146   /* [neutralIsolEnergy]                        = */ "neutralIsolEnergy",
00147   /* [neutralIsolEnergyOverCombinedEnergy]      = */ "neutralIsolEnergyOverCombinedEnergy",
00148   /* [neutralEnergyRatio]                       = */ "neutralEnergyRatio",
00149   /* [neutralclusterNumber]                     = */ "neutralclusterNumber",
00150   /* [neutralclusterRadius]                     = */ "neutralclusterRadius",
00151 
00152   /* [leptonQuality]                            = */ "leptonQuality",
00153   /* [leptonQuality2]                           = */ "leptonQuality2",
00154   /* [trackP0Par]                               = */ "trackP0Par",
00155   /* [trackP0ParRatio]                          = */ "trackP0ParRatio",
00156   /* [trackChi2]                                = */ "trackChi2",
00157   /* [trackNTotalHits],                         = */ "trackNTotalHits",
00158   /* [trackNPixelHits],                         = */ "trackNPixelHits",
00159 
00160   /* [algoDiscriminator],                       = */ "algoDiscriminator",
00161 
00162   /* [lastTaggingVariable]                      = */ "lastTaggingVariable"
00163 };
00164 
00165 btau::TaggingVariableName getTaggingVariableName( const std::string & name )
00166 {
00167   for (int i = 0; i <= reco::btau::lastTaggingVariable; i++)
00168     if (name == TaggingVariableTokens[i])
00169       return (reco::btau::TaggingVariableName) (i);
00170   return btau::lastTaggingVariable;
00171 }
00172 
00173 // check if a tag is present in the TaggingVariableList
00174 bool TaggingVariableList::checkTag( TaggingVariableName tag ) const {
00175   return binary_search( m_list.begin(), m_list.end(), tag, TaggingVariableCompare() );
00176 }
00177 
00178 void TaggingVariableList::insert( const TaggingVariable & variable, bool delayed /* = false */ ) {
00179   m_list.push_back( variable );
00180   if (not delayed) finalize();
00181 }
00182 
00183 void TaggingVariableList::insert( TaggingVariableName tag, TaggingValue value, bool delayed /* = false */ ) {
00184   m_list.push_back( TaggingVariable( tag, value ) );
00185   if (not delayed) finalize();
00186 }
00187 
00188 void TaggingVariableList::insert( TaggingVariableName tag, const std::vector<TaggingValue> & values, bool delayed /* = false */ ) {
00189   for (std::vector<TaggingValue>::const_iterator i = values.begin(); i != values.end(); i++) {
00190     m_list.push_back( TaggingVariable(tag, *i) );
00191   }
00192   if (not delayed) finalize();
00193 }
00194 
00195 void TaggingVariableList::insert( const TaggingVariableList & list ) {
00196   std::vector<TaggingVariable>::size_type size = m_list.size();
00197   m_list.insert( m_list.end(), list.m_list.begin(), list.m_list.end() );
00198   inplace_merge( m_list.begin(), m_list.begin() + size, m_list.end(), TaggingVariableCompare() );
00199 }
00200 
00201 void TaggingVariableList::finalize( void ) {
00202   stable_sort( m_list.begin(), m_list.end(), TaggingVariableCompare() );
00203 }
00204 
00205 TaggingValue TaggingVariableList::get( TaggingVariableName tag ) const {
00206   range r = getRange(tag);
00207   if (r.first == r.second)
00208     throw edm::Exception( edm::errors::InvalidReference )
00209                   << "TaggingVariable " << tag << " is not present in the collection";
00210   return r.first->second;
00211 }
00212 
00213 TaggingValue TaggingVariableList::get( TaggingVariableName tag, TaggingValue defaultValue ) const {
00214   range r = getRange(tag);
00215   if ( r.first == r.second )
00216     return defaultValue;
00217   return r.first->second;
00218 }
00219 
00220 std::vector<TaggingValue> TaggingVariableList::getList( TaggingVariableName tag, bool throwOnEmptyList ) const {
00221   using namespace __gnu_cxx;
00222   range r = getRange( tag );
00223   if ( throwOnEmptyList && r.first == r.second )
00224     throw edm::Exception( edm::errors::InvalidReference )
00225                   << "TaggingVariable " << tag << " is not present in the collection";
00226   std::vector<TaggingValue> list( r.second - r.first );
00227   transform( r.first, r.second, list.begin(), select2nd< TaggingVariable >() );
00228   return list;
00229 }
00230 
00231 TaggingVariableList::range TaggingVariableList::getRange( TaggingVariableName tag ) const {
00232   return equal_range( m_list.begin(), m_list.end(), tag, TaggingVariableCompare() );
00233 }
00234 
00235 } // namespace reco