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 "jet energy",
00013 "jet transverse momentum",
00014 "jet pseudorapidity",
00015 "jet polar angle",
00016 "tracks associated to jet",
00017
00018 "track momentum",
00019 "track pseudorapidity",
00020 "track polar angle",
00021
00022 "track transverse momentum, relative to the jet axis",
00023 "track parallel momentum, along the jet axis",
00024 "track pseudorapidity, relative to the jet axis",
00025 "track pseudoangular distance from the jet axis",
00026 "track transverse momentum, relative to the jet axis, normalized to its energy",
00027 "track parallel momentum, along the jet axis, normalized to its energy",
00028
00029 "track 2D impact parameter",
00030 "track 2D signed impact parameter",
00031 "track 2D signed impact parameter significance",
00032 "track 3D signed impact parameter",
00033 "track 3D signed impact parameter significance",
00034 "track decay length",
00035 "track decay length significance",
00036 "minimum track approach distance to jet axis",
00037 "minimum track approach distance to jet axis signifiance",
00038 "minimum approach distance to ghost track",
00039 "minimum approach distance to ghost track significance",
00040 "weight of track participation in ghost track fit",
00041
00042 "ratio of track sum transverse energy over jet energy",
00043 "pseudoangular distance between jet axis and track fourvector sum",
00044
00045 "category of secondary vertex (Reco, Pseudo, No)",
00046
00047 "number of reconstructed possible secondary vertices in jet",
00048 "number of single-track ghost-track vertices",
00049
00050 "mass of track sum at secondary vertex",
00051 "number of tracks at secondary vertex",
00052 "vertex fit probability",
00053
00054 "ratio of energy at secondary vertex over total energy",
00055 "pseudoangular distance between jet axis and secondary vertex direction",
00056
00057 "transverse distance between primary and secondary vertex",
00058 "transverse distance significance between primary and secondary vertex",
00059 "distance between primary and secondary vertex",
00060 "distance significance between primary and secondary vertex",
00061
00062 "track 2D signed impact parameter of first track lifting mass above charm",
00063 "track 2D signed impact parameter significance of first track lifting mass above charm",
00064 "track 3D signed impact parameter of first track lifting mass above charm",
00065 "track 3D signed impact parameter significance of first track lifting mass above charm",
00066
00067 "neutral ECAL clus. energy sum",
00068 "neutral ECAL clus. energy sum/(neutral ECAL clus. energy sum + pion tracks energy)",
00069 "neutral ECAL clus. energy sum in isolation band",
00070 "neutral ECAL clus. energy sum in isolation band/(neutral ECAL clus. energy sum + pion tracks energy)",
00071 "ratio of neutral ECAL clus. energy sum in isolation band over neutral ECAL clus. energy sum",
00072 "number of neutral ECAL clus.",
00073 "mean DR between neutral ECAL clus. and lead.track",
00074
00075 "lepton identification quality",
00076 "lepton identification quality 2",
00077 "track momentum along the jet axis, in the jet rest frame",
00078 "track momentum along the jet axis, in the jet rest frame, normalized to its energy"
00079 "chi2 of the track fit",
00080 "number of valid total hits",
00081 "number of valid pixel hits",
00082
00083 "discriminator output of an algorithm",
00084
00085 ""
00086 };
00087
00088 const char* TaggingVariableTokens[] = {
00089 "jetEnergy",
00090 "jetPt",
00091 "jetEta",
00092 "jetPhi",
00093 "jetNTracks",
00094
00095 "trackMomentum",
00096 "trackEta",
00097 "trackPhi",
00098
00099 "trackPtRel",
00100 "trackPPar",
00101 "trackEtaRel",
00102 "trackDeltaR",
00103 "trackPtRatio",
00104 "trackPParRatio",
00105
00106 "trackIp2dVal",
00107 "trackSip2dVal",
00108 "trackSip2dSig",
00109 "trackSip3dVal",
00110 "trackSip3dSig",
00111 "trackDecayLenVal",
00112 "trackDecayLenSig",
00113 "trackJetDist",
00114 "trackJetDistSig",
00115 "trackGhostTrackDistVal",
00116 "trackGhostTrackDistSig",
00117 "trackGhostTrackWeight",
00118
00119 "trackSumJetEtRatio",
00120 "trackSumJetDeltaR",
00121
00122 "vertexCategory",
00123
00124 "jetNSecondaryVertices",
00125 "jetNSingleTrackVertices",
00126
00127 "vertexMass",
00128 "vertexNTracks",
00129 "vertexFitProb",
00130
00131 "vertexEnergyRatio",
00132 "vertexJetDeltaR",
00133
00134 "flightDistance2dVal",
00135 "flightDistance2dSig",
00136 "flightDistance3dVal",
00137 "flightDistance3dSig",
00138
00139 "trackSip2dValAboveCharm",
00140 "trackSip2dSigAboveCharm",
00141 "trackSip3dValAboveCharm",
00142 "trackSip3dSigAboveCharm",
00143
00144 "neutralEnergy",
00145 "neutralEnergyOverCombinedEnergy",
00146 "neutralIsolEnergy",
00147 "neutralIsolEnergyOverCombinedEnergy",
00148 "neutralEnergyRatio",
00149 "neutralclusterNumber",
00150 "neutralclusterRadius",
00151
00152 "leptonQuality",
00153 "leptonQuality2",
00154 "trackP0Par",
00155 "trackP0ParRatio",
00156 "trackChi2",
00157 "trackNTotalHits",
00158 "trackNPixelHits",
00159
00160 "algoDiscriminator",
00161
00162 "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
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 ) {
00179 m_list.push_back( variable );
00180 if (not delayed) finalize();
00181 }
00182
00183 void TaggingVariableList::insert( TaggingVariableName tag, TaggingValue value, bool delayed ) {
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 ) {
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 }