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::embedMuonBestTrack() {
00217 muonBestTrack_.clear();
00218 if (reco::Muon::muonBestTrack().isNonnull()) {
00219 muonBestTrack_.push_back(*reco::Muon::muonBestTrack());
00220 embeddedMuonBestTrack_ = true;
00221 }
00222 }
00223
00224
00225
00227 void Muon::embedTrack() {
00228 track_.clear();
00229 if (reco::Muon::innerTrack().isNonnull()) {
00230 track_.push_back(*reco::Muon::innerTrack());
00231 embeddedTrack_ = true;
00232 }
00233 }
00234
00235
00237 void Muon::embedStandAloneMuon() {
00238 standAloneMuon_.clear();
00239 if (reco::Muon::outerTrack().isNonnull()) {
00240 standAloneMuon_.push_back(*reco::Muon::outerTrack());
00241 embeddedStandAloneMuon_ = true;
00242 }
00243 }
00244
00245
00247 void Muon::embedCombinedMuon() {
00248 combinedMuon_.clear();
00249 if (reco::Muon::globalTrack().isNonnull()) {
00250 combinedMuon_.push_back(*reco::Muon::globalTrack());
00251 embeddedCombinedMuon_ = true;
00252 }
00253 }
00254
00256 void Muon::embedCaloMETMuonCorrs(const reco::MuonMETCorrectionData& t) {
00257 caloMETMuonCorrs_.clear();
00258 caloMETMuonCorrs_.push_back(t);
00259 embeddedCaloMETMuonCorrs_ = true;
00260 }
00261
00263 void Muon::embedTcMETMuonCorrs(const reco::MuonMETCorrectionData& t) {
00264 tcMETMuonCorrs_.clear();
00265 tcMETMuonCorrs_.push_back(t);
00266 embeddedTCMETMuonCorrs_ = true;
00267 }
00268
00270 void Muon::embedPickyMuon() {
00271 pickyMuon_.clear();
00272 reco::TrackRef tk = reco::Muon::pickyTrack();
00273 if (tk.isNonnull()) {
00274 pickyMuon_.push_back(*tk);
00275 embeddedPickyMuon_ = true;
00276 }
00277 }
00278
00280 void Muon::embedTpfmsMuon() {
00281 tpfmsMuon_.clear();
00282 reco::TrackRef tk = reco::Muon::tpfmsTrack();
00283 if (tk.isNonnull()) {
00284 tpfmsMuon_.push_back(*tk);
00285 embeddedTpfmsMuon_ = true;
00286 }
00287 }
00288
00290 void Muon::embedDytMuon() {
00291 dytMuon_.clear();
00292 reco::TrackRef tk = reco::Muon::dytTrack();
00293 if (tk.isNonnull()) {
00294 dytMuon_.push_back(*tk);
00295 embeddedDytMuon_ = true;
00296 }
00297 }
00298
00300 void Muon::embedPFCandidate() {
00301 pfCandidate_.clear();
00302 if ( pfCandidateRef_.isAvailable() && pfCandidateRef_.isNonnull()) {
00303 pfCandidate_.push_back( *pfCandidateRef_ );
00304 embeddedPFCandidate_ = true;
00305 }
00306 }
00307
00308 bool Muon::muonID(const std::string& name) const {
00309 muon::SelectionType st = muon::selectionTypeFromString(name);
00310 return muon::isGoodMuon(*this, st);
00311 }
00312
00313
00318 double Muon::normChi2() const {
00319 if ( cachedNormChi2_ ) {
00320 return normChi2_;
00321 } else {
00322 reco::TrackRef t = globalTrack();
00323 return t->chi2() / t->ndof();
00324 }
00325 }
00326
00331 unsigned int Muon::numberOfValidHits() const {
00332 if ( cachedNumberOfValidHits_ ) {
00333 return numberOfValidHits_;
00334 } else {
00335 reco::TrackRef t = innerTrack();
00336 return t->numberOfValidHits();
00337 }
00338 }
00339
00340
00341
00342
00343
00344 double Muon::dB(IpType type_) const {
00345
00346
00347 if (type_ == None){
00348 if ( cachedDB_ ) {
00349 return dB_;
00350 }
00351 else {
00352 return std::numeric_limits<double>::max();
00353 }
00354 }
00355
00356
00357 else if ( cachedIP_[type_] ) {
00358 return ip_[type_];
00359 } else {
00360 return std::numeric_limits<double>::max();
00361 }
00362 }
00363
00364
00365
00366
00367
00368
00369 double Muon::edB(IpType type_) const {
00370
00371
00372 if (type_ == None){
00373 if ( cachedDB_ ) {
00374 return edB_;
00375 }
00376 else {
00377 return std::numeric_limits<double>::max();
00378 }
00379 }
00380
00381
00382 else if ( cachedIP_[type_] ) {
00383 return eip_[type_];
00384 } else {
00385 return std::numeric_limits<double>::max();
00386 }
00387 }
00388
00389
00390 double Muon::segmentCompatibility(reco::Muon::ArbitrationType arbitrationType) const {
00391 return muon::segmentCompatibility(*this, arbitrationType);
00392 }
00393
00394
00395 bool Muon::isTightMuon(const reco::Vertex&vtx) const {
00396 return muon::isTightMuon(*this, vtx);
00397 }
00398
00399 bool Muon::isLooseMuon() const {
00400 return muon::isLooseMuon(*this);
00401
00402 }
00403
00404 bool Muon::isSoftMuon(const reco::Vertex& vtx) const {
00405 return muon::isSoftMuon(*this, vtx);
00406 }
00407
00408
00409 bool Muon::isHighPtMuon(const reco::Vertex& vtx) const{
00410 return muon::isHighPtMuon(*this, vtx);
00411 }
00412