CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_1/src/DataFormats/PatCandidates/src/Muon.cc

Go to the documentation of this file.
00001 //
00002 // $Id: Muon.cc,v 1.30 2011/09/21 03:40:18 tucker 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::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 // embed various impact parameters with errors
00330 // IpType defines the type of the impact parameter
00331 // None is default and reverts to old behavior controlled by 
00332 // patMuons.usePV = True/False
00333 double Muon::dB(IpType type_) const {
00334   
00335   // preserve old functionality exactly
00336   if (type_ == None){
00337     if ( cachedDB_ ) {
00338       return dB_;
00339     }
00340     else {
00341       return std::numeric_limits<double>::max();
00342     }
00343   }
00344   
00345   // more IP types (new)
00346   else if ( cachedIP_[type_] ) {
00347     return ip_[type_];
00348   } else {
00349     return std::numeric_limits<double>::max();
00350   }
00351 }
00352 
00353 
00354 // embed various impact parameters with errors
00355 // IpType defines the type of the impact parameter
00356 // None is default and reverts to old behavior controlled by 
00357 // patMuons.usePV = True/False
00358 double Muon::edB(IpType type_) const {
00359 
00360   // preserve old functionality exactly
00361   if (type_ == None){
00362     if ( cachedDB_ ) {
00363       return edB_;
00364     }
00365     else {
00366       return std::numeric_limits<double>::max();
00367     }
00368   }
00369 
00370   // more IP types (new)
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