CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/DataFormats/PatCandidates/src/Muon.cc

Go to the documentation of this file.
00001 //
00002 // $Id: Muon.cc,v 1.33 2012/09/27 09:52:17 bellan Exp $
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 // initialize impact parameter container vars
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 // embed various impact parameters with errors
00341 // IpType defines the type of the impact parameter
00342 // None is default and reverts to old behavior controlled by 
00343 // patMuons.usePV = True/False
00344 double Muon::dB(IpType type_) const {
00345   
00346   // preserve old functionality exactly
00347   if (type_ == None){
00348     if ( cachedDB_ ) {
00349       return dB_;
00350     }
00351     else {
00352       return std::numeric_limits<double>::max();
00353     }
00354   }
00355   
00356   // more IP types (new)
00357   else if ( cachedIP_[type_] ) {
00358     return ip_[type_];
00359   } else {
00360     return std::numeric_limits<double>::max();
00361   }
00362 }
00363 
00364 
00365 // embed various impact parameters with errors
00366 // IpType defines the type of the impact parameter
00367 // None is default and reverts to old behavior controlled by 
00368 // patMuons.usePV = True/False
00369 double Muon::edB(IpType type_) const {
00370 
00371   // preserve old functionality exactly
00372   if (type_ == None){
00373     if ( cachedDB_ ) {
00374       return edB_;
00375     }
00376     else {
00377       return std::numeric_limits<double>::max();
00378     }
00379   }
00380 
00381   // more IP types (new)
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 // Selectors
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