00001
00002
00003
00004
00005 #include "DataFormats/PatCandidates/interface/Muon.h"
00006 #include "DataFormats/MuonReco/interface/MuonSelectors.h"
00007 #include "FWCore/Utilities/interface/Exception.h"
00008
00009 #include <limits>
00010
00011 using namespace pat;
00012
00013
00015 Muon::Muon() :
00016 Lepton<reco::Muon>(),
00017 embeddedTrack_(false),
00018 embeddedStandAloneMuon_(false),
00019 embeddedCombinedMuon_(false),
00020 embeddedTCMETMuonCorrs_(false),
00021 embeddedCaloMETMuonCorrs_(false),
00022 embeddedPickyMuon_(false),
00023 embeddedTpfmsMuon_(false),
00024 embeddedDytMuon_(false),
00025 embeddedPFCandidate_(false),
00026 pfCandidateRef_(),
00027 cachedNormChi2_(false),
00028 cachedDB_(false),
00029 cachedNumberOfValidHits_(0),
00030 normChi2_(0.0),
00031 dB_(0.0),
00032 edB_(0.0),
00033 numberOfValidHits_(0)
00034 {
00035 initImpactParameters();
00036 }
00037
00039 Muon::Muon(const reco::Muon & aMuon) :
00040 Lepton<reco::Muon>(aMuon),
00041 embeddedTrack_(false),
00042 embeddedStandAloneMuon_(false),
00043 embeddedCombinedMuon_(false),
00044 embeddedTCMETMuonCorrs_(false),
00045 embeddedCaloMETMuonCorrs_(false),
00046 embeddedPickyMuon_(false),
00047 embeddedTpfmsMuon_(false),
00048 embeddedDytMuon_(false),
00049 embeddedPFCandidate_(false),
00050 pfCandidateRef_(),
00051 cachedNormChi2_(false),
00052 cachedDB_(false),
00053 cachedNumberOfValidHits_(0),
00054 normChi2_(0.0),
00055 dB_(0.0),
00056 edB_(0.0),
00057 numberOfValidHits_(0)
00058 {
00059 initImpactParameters();
00060 }
00061
00063 Muon::Muon(const edm::RefToBase<reco::Muon> & aMuonRef) :
00064 Lepton<reco::Muon>(aMuonRef),
00065 embeddedTrack_(false),
00066 embeddedStandAloneMuon_(false),
00067 embeddedCombinedMuon_(false),
00068 embeddedTCMETMuonCorrs_(false),
00069 embeddedCaloMETMuonCorrs_(false),
00070 embeddedPickyMuon_(false),
00071 embeddedTpfmsMuon_(false),
00072 embeddedDytMuon_(false),
00073 embeddedPFCandidate_(false),
00074 pfCandidateRef_(),
00075 cachedNormChi2_(false),
00076 cachedDB_(false),
00077 cachedNumberOfValidHits_(0),
00078 normChi2_(0.0),
00079 dB_(0.0),
00080 edB_(0.0),
00081 numberOfValidHits_(0)
00082 {
00083 initImpactParameters();
00084 }
00085
00087 Muon::Muon(const edm::Ptr<reco::Muon> & aMuonRef) :
00088 Lepton<reco::Muon>(aMuonRef),
00089 embeddedTrack_(false),
00090 embeddedStandAloneMuon_(false),
00091 embeddedCombinedMuon_(false),
00092 embeddedTCMETMuonCorrs_(false),
00093 embeddedCaloMETMuonCorrs_(false),
00094 embeddedPickyMuon_(false),
00095 embeddedTpfmsMuon_(false),
00096 embeddedDytMuon_(false),
00097 embeddedPFCandidate_(false),
00098 pfCandidateRef_(),
00099 cachedNormChi2_(false),
00100 cachedDB_(false),
00101 cachedNumberOfValidHits_(0),
00102 normChi2_(0.0),
00103 dB_(0.0),
00104 edB_(0.0),
00105 numberOfValidHits_(0)
00106 {
00107 initImpactParameters();
00108 }
00109
00111 Muon::~Muon() {
00112 }
00113
00114 std::ostream&
00115 reco::operator<<(std::ostream& out, const pat::Muon& obj)
00116 {
00117 if(!out) return out;
00118
00119 out << "\tpat::Muon: ";
00120 out << std::setiosflags(std::ios::right);
00121 out << std::setiosflags(std::ios::fixed);
00122 out << std::setprecision(3);
00123 out << " E/pT/eta/phi "
00124 << obj.energy()<<"/"
00125 << obj.pt()<<"/"
00126 << obj.eta()<<"/"
00127 << obj.phi();
00128 return out;
00129 }
00130
00131
00132 void Muon::initImpactParameters() {
00133 for (int i_ = 0; i_<5; ++i_){
00134 ip_.push_back(0.0);
00135 eip_.push_back(0.0);
00136 cachedIP_.push_back(false);
00137 }
00138 }
00139
00140
00142 reco::TrackRef Muon::track() const {
00143 if (embeddedTrack_) {
00144 return reco::TrackRef(&track_, 0);
00145 } else {
00146 return reco::Muon::innerTrack();
00147 }
00148 }
00149
00150
00152 reco::TrackRef Muon::standAloneMuon() const {
00153 if (embeddedStandAloneMuon_) {
00154 return reco::TrackRef(&standAloneMuon_, 0);
00155 } else {
00156 return reco::Muon::outerTrack();
00157 }
00158 }
00159
00160
00162 reco::TrackRef Muon::combinedMuon() const {
00163 if (embeddedCombinedMuon_) {
00164 return reco::TrackRef(&combinedMuon_, 0);
00165 } else {
00166 return reco::Muon::globalTrack();
00167 }
00168 }
00169
00171 reco::TrackRef Muon::pickyTrack() const {
00172 if (embeddedPickyMuon_) {
00173 return reco::TrackRef(&pickyMuon_, 0);
00174 } else {
00175 return reco::Muon::pickyTrack();
00176 }
00177 }
00178
00180 reco::TrackRef Muon::tpfmsTrack() const {
00181 if (embeddedTpfmsMuon_) {
00182 return reco::TrackRef(&tpfmsMuon_, 0);
00183 } else {
00184 return reco::Muon::tpfmsTrack();
00185 }
00186 }
00187
00189 reco::TrackRef Muon::dytTrack() const {
00190 if (embeddedDytMuon_) {
00191 return reco::TrackRef(&dytMuon_, 0);
00192 } else {
00193 return reco::Muon::dytTrack();
00194 }
00195 }
00196
00198 reco::PFCandidateRef Muon::pfCandidateRef() const {
00199 if (embeddedPFCandidate_) {
00200 return reco::PFCandidateRef(&pfCandidate_, 0);
00201 } else {
00202 return pfCandidateRef_;
00203 }
00204 }
00205
00207 reco::CandidatePtr Muon::sourceCandidatePtr( size_type i ) const {
00208 if (embeddedPFCandidate_) {
00209 return reco::CandidatePtr( pfCandidateRef_.id(), pfCandidateRef_.get(), pfCandidateRef_.key() );
00210 } else {
00211 return reco::CandidatePtr();
00212 }
00213 }
00214
00216 void Muon::embedTrack() {
00217 track_.clear();
00218 if (reco::Muon::innerTrack().isNonnull()) {
00219 track_.push_back(*reco::Muon::innerTrack());
00220 embeddedTrack_ = true;
00221 }
00222 }
00223
00224
00226 void Muon::embedStandAloneMuon() {
00227 standAloneMuon_.clear();
00228 if (reco::Muon::outerTrack().isNonnull()) {
00229 standAloneMuon_.push_back(*reco::Muon::outerTrack());
00230 embeddedStandAloneMuon_ = true;
00231 }
00232 }
00233
00234
00236 void Muon::embedCombinedMuon() {
00237 combinedMuon_.clear();
00238 if (reco::Muon::globalTrack().isNonnull()) {
00239 combinedMuon_.push_back(*reco::Muon::globalTrack());
00240 embeddedCombinedMuon_ = true;
00241 }
00242 }
00243
00245 void Muon::embedCaloMETMuonCorrs(const reco::MuonMETCorrectionData& t) {
00246 caloMETMuonCorrs_.clear();
00247 caloMETMuonCorrs_.push_back(t);
00248 embeddedCaloMETMuonCorrs_ = true;
00249 }
00250
00252 void Muon::embedTcMETMuonCorrs(const reco::MuonMETCorrectionData& t) {
00253 tcMETMuonCorrs_.clear();
00254 tcMETMuonCorrs_.push_back(t);
00255 embeddedTCMETMuonCorrs_ = true;
00256 }
00257
00259 void Muon::embedPickyMuon() {
00260 pickyMuon_.clear();
00261 reco::TrackRef tk = reco::Muon::pickyTrack();
00262 if (tk.isNonnull()) {
00263 pickyMuon_.push_back(*tk);
00264 embeddedPickyMuon_ = true;
00265 }
00266 }
00267
00269 void Muon::embedTpfmsMuon() {
00270 tpfmsMuon_.clear();
00271 reco::TrackRef tk = reco::Muon::tpfmsTrack();
00272 if (tk.isNonnull()) {
00273 tpfmsMuon_.push_back(*tk);
00274 embeddedTpfmsMuon_ = true;
00275 }
00276 }
00277
00279 void Muon::embedDytMuon() {
00280 dytMuon_.clear();
00281 reco::TrackRef tk = reco::Muon::dytTrack();
00282 if (tk.isNonnull()) {
00283 dytMuon_.push_back(*tk);
00284 embeddedDytMuon_ = true;
00285 }
00286 }
00287
00289 void Muon::embedPFCandidate() {
00290 pfCandidate_.clear();
00291 if ( pfCandidateRef_.isAvailable() && pfCandidateRef_.isNonnull()) {
00292 pfCandidate_.push_back( *pfCandidateRef_ );
00293 embeddedPFCandidate_ = true;
00294 }
00295 }
00296
00297 bool Muon::muonID(const std::string& name) const {
00298 muon::SelectionType st = muon::selectionTypeFromString(name);
00299 return muon::isGoodMuon(*this, st);
00300 }
00301
00302
00307 double Muon::normChi2() const {
00308 if ( cachedNormChi2_ ) {
00309 return normChi2_;
00310 } else {
00311 reco::TrackRef t = globalTrack();
00312 return t->chi2() / t->ndof();
00313 }
00314 }
00315
00320 unsigned int Muon::numberOfValidHits() const {
00321 if ( cachedNumberOfValidHits_ ) {
00322 return numberOfValidHits_;
00323 } else {
00324 reco::TrackRef t = innerTrack();
00325 return t->numberOfValidHits();
00326 }
00327 }
00328
00329
00330
00331
00332
00333 double Muon::dB(IpType type_) const {
00334
00335
00336 if (type_ == None){
00337 if ( cachedDB_ ) {
00338 return dB_;
00339 }
00340 else {
00341 return std::numeric_limits<double>::max();
00342 }
00343 }
00344
00345
00346 else if ( cachedIP_[type_] ) {
00347 return ip_[type_];
00348 } else {
00349 return std::numeric_limits<double>::max();
00350 }
00351 }
00352
00353
00354
00355
00356
00357
00358 double Muon::edB(IpType type_) const {
00359
00360
00361 if (type_ == None){
00362 if ( cachedDB_ ) {
00363 return edB_;
00364 }
00365 else {
00366 return std::numeric_limits<double>::max();
00367 }
00368 }
00369
00370
00371 else if ( cachedIP_[type_] ) {
00372 return eip_[type_];
00373 } else {
00374 return std::numeric_limits<double>::max();
00375 }
00376 }
00377
00378
00379 double Muon::segmentCompatibility(reco::Muon::ArbitrationType arbitrationType) const {
00380 return muon::segmentCompatibility(*this, arbitrationType);
00381 }
00382
00383