CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/CommonTools/RecoAlgos/src/MuonSelector.cc

Go to the documentation of this file.
00001 #include "CommonTools/RecoAlgos/interface/MuonSelector.h"
00002 
00003 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHit.h"
00004 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit1D.h"
00005 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
00006 #include "DataFormats/TrackerRecHit2D/interface/ProjectedSiStripRecHit2D.h"
00007 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2D.h"
00008 
00009 #include <DataFormats/SiStripDetId/interface/SiStripDetId.h>
00010 
00011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00012 
00013 using namespace reco;
00014 
00015 namespace helper 
00016 {
00017     MuonCollectionStoreManager::
00018     MuonCollectionStoreManager(const edm::Handle<reco::MuonCollection>&) 
00019       :
00020       selMuons_( new reco::MuonCollection ),
00021       selTracks_( new reco::TrackCollection ),
00022       selTracksExtras_( new reco::TrackExtraCollection ),
00023       selTracksHits_( new TrackingRecHitCollection ),
00024       selGlobalMuonTracks_( new reco::TrackCollection ),
00025       selGlobalMuonTracksExtras_( new reco::TrackExtraCollection ),    
00026       selGlobalMuonTracksHits_( new TrackingRecHitCollection ),
00027       selStandAloneTracks_( new reco::TrackCollection ),
00028       selStandAloneTracksExtras_( new reco::TrackExtraCollection ),
00029       selStandAloneTracksHits_( new TrackingRecHitCollection ),     
00030       selStripClusters_( new edmNew::DetSetVector<SiStripCluster> ),
00031       selPixelClusters_( new edmNew::DetSetVector<SiPixelCluster> ),
00032       rMuons_(),
00033       rTracks_(), rTrackExtras_(), rHits_(),
00034       rGBTracks_(), rGBTrackExtras_(), rGBHits_(),
00035       rSATracks_(), rSATrackExtras_(), rSAHits_(),
00036       clusterStorer_(),
00037       id_(0), igbd_(0), isad_(0), idx_(0), igbdx_(0),
00038       isadx_(0), hidx_(0), higbdx_(0), hisadx_(0),
00039       cloneClusters_ (true)
00040     {
00041     }
00042 
00043   
00044   //------------------------------------------------------------------
00046   //------------------------------------------------------------------
00047   void 
00048   MuonCollectionStoreManager::
00049   processMuon( const Muon & mu ) 
00050   {
00051         if (this->cloneClusters() 
00052             && (   (mu.globalTrack().isNonnull() && !this->clusterRefsOK(*mu.globalTrack()))
00053                 || (mu.innerTrack() .isNonnull() && !this->clusterRefsOK(*mu.innerTrack() ))
00054                    // || (mu.outerTrack(). isNonnull() && !this->clusterRefsOK(*mu.outerTrack() ))
00055                    )) { // outer track is muon only and has no strip clusters...
00056           // At least until CMSSW_2_1_8, global muon track reconstruction assigns wrong hits in
00057           // case of a track from iterative tracking. These hits are fetched from Trajectories
00058           // instead of from Tracks and therefore reference temporary cluster collections.
00059           // As a hack we skip these muons here - they can anyway not be refitted. 
00060           edm::LogError("BadRef") << "@SUB=MuonCollectionStoreManager::processMuon"
00061                                   << "Skip muon: One of its tracks references "
00062                                   << "non-available clusters!";
00063           return;
00064         }
00065         
00066         selMuons_->push_back( Muon( mu ) );
00067         // only tracker Muon Track      
00068         selMuons_->back().setInnerTrack( TrackRef( rTracks_, id_ ++ ) );
00069         TrackRef trkRef = mu.track();
00070         if(trkRef.isNonnull()){
00071 
00072         selTracks_->push_back(Track( *trkRef) );
00073 
00074         Track & trk= selTracks_->back();
00075 
00076         selTracksExtras_->push_back( TrackExtra( trk.outerPosition(), trk.outerMomentum(), trk.outerOk(),
00077                                                  trk.innerPosition(), trk.innerMomentum(), trk.innerOk(),
00078                                                  trk.outerStateCovariance(), trk.outerDetId(),
00079                                                  trk.innerStateCovariance(), trk.innerDetId(),
00080                                                  trk.seedDirection() ) );
00081 
00082         TrackExtra & tx = selTracksExtras_->back();
00083 
00084         for( trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd();
00085              ++ hit, ++ hidx_) {
00086           selTracksHits_->push_back( (*hit)->clone() );
00087           TrackingRecHit * newHit = & (selTracksHits_->back());
00088           tx.add( TrackingRecHitRef( rHits_, hidx_ ) );
00089           if (cloneClusters() && newHit->isValid()
00090               && ((*hit)->geographicalId().det() == DetId::Tracker)) {
00091             clusterStorer_.addCluster( *selTracksHits_, hidx_ );
00092           }
00093         } // end of for loop over tracking rec hits on this track
00094         
00095         trk.setExtra( TrackExtraRef( rTrackExtras_, idx_ ++ ) );
00096 
00097         }// TO trkRef.isNonnull
00098 
00099 
00100         // global Muon Track    
00101         selMuons_->back().setGlobalTrack( TrackRef( rGBTracks_, igbd_ ++ ) );
00102         trkRef = mu.combinedMuon();
00103         if(trkRef.isNonnull()){
00104         selGlobalMuonTracks_->push_back(Track( *trkRef) );
00105         Track & trk = selGlobalMuonTracks_->back();
00106                 
00107         selGlobalMuonTracksExtras_->push_back( TrackExtra( trk.outerPosition(), trk.outerMomentum(), trk.outerOk(),
00108                                                 trk.innerPosition(), trk.innerMomentum(), trk.innerOk(),
00109                                                 trk.outerStateCovariance(), trk.outerDetId(),
00110                                                 trk.innerStateCovariance(), trk.innerDetId(), trk.seedDirection() ) );
00111         TrackExtra & tx = selGlobalMuonTracksExtras_->back();
00112         for( trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd();
00113              ++ hit, ++ higbdx_) {
00114             selGlobalMuonTracksHits_->push_back( (*hit)->clone() );
00115             TrackingRecHit * newHit = & (selGlobalMuonTracksHits_->back()); 
00116             tx.add( TrackingRecHitRef( rGBHits_, higbdx_ ) );
00117             if (cloneClusters() && newHit->isValid()
00118                 && ((*hit)->geographicalId().det() == DetId::Tracker)) {
00119               clusterStorer_.addCluster( *selGlobalMuonTracksHits_, higbdx_ );
00120           }
00121 
00122         }
00123         trk.setExtra( TrackExtraRef( rGBTrackExtras_, igbdx_ ++ ) );
00124 
00125         } // GB trkRef.isNonnull()
00126 
00127         // stand alone Muon Track       
00128         selMuons_->back().setOuterTrack( TrackRef( rSATracks_, isad_ ++ ) );
00129         trkRef = mu.standAloneMuon();
00130         if(trkRef.isNonnull()){
00131         selStandAloneTracks_->push_back(Track( *trkRef) );
00132         Track & trk = selStandAloneTracks_->back();
00133                 
00134         selStandAloneTracksExtras_->push_back( TrackExtra( trk.outerPosition(), trk.outerMomentum(), trk.outerOk(),
00135                                                 trk.innerPosition(), trk.innerMomentum(), trk.innerOk(),
00136                                                 trk.outerStateCovariance(), trk.outerDetId(),
00137                                                 trk.innerStateCovariance(), trk.innerDetId(), trk.seedDirection() ) );
00138         TrackExtra & tx = selStandAloneTracksExtras_->back();
00139         for( trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++ hit ) {
00140           selStandAloneTracksHits_->push_back( (*hit)->clone() );
00141           tx.add( TrackingRecHitRef( rSAHits_, hisadx_ ++ ) );
00142         }
00143         trk.setExtra( TrackExtraRef( rSATrackExtras_, isadx_ ++ ) );
00144 
00145         } // SA trkRef.isNonnull()
00146   }// end of track, and function
00147 
00148   //-------------------------------------------------------------------------
00150   //-------------------------------------------------------------------------
00151   bool
00152   MuonCollectionStoreManager::
00153   clusterRefsOK(const reco::Track &track) const
00154   {
00155 
00156     for (trackingRecHit_iterator hitIt = track.recHitsBegin(); hitIt != track.recHitsEnd(); ++hitIt) {
00157       const TrackingRecHit &hit = **hitIt;
00158       if (!hit.isValid() || hit.geographicalId().det() != DetId::Tracker) continue;
00159 
00160       // So we are in the tracker - now check hit types and availability of cluster refs:
00161       const std::type_info &hit_type = typeid(hit);
00162       if (hit_type == typeid(SiPixelRecHit)) {
00163         if (!static_cast<const SiPixelRecHit &>(hit).cluster().isAvailable()) return false;
00164       } else if (hit_type == typeid(SiStripRecHit2D)) {
00165         if (!static_cast<const SiStripRecHit2D &>(hit).cluster().isAvailable()) return false;
00166       } else if (hit_type == typeid(SiStripRecHit1D)) {
00167         if (!static_cast<const SiStripRecHit1D &>(hit).cluster().isAvailable()) return false;
00168       } else if (hit_type == typeid(SiStripMatchedRecHit2D)) {      
00169         const SiStripMatchedRecHit2D &mHit = static_cast<const SiStripMatchedRecHit2D &>(hit);
00170         if (!mHit.monoHit()->cluster().isAvailable()) return false;
00171         if (!mHit.stereoHit()->cluster().isAvailable()) return false;
00172       } else if (hit_type == typeid(ProjectedSiStripRecHit2D)) {
00173         const ProjectedSiStripRecHit2D &pHit = static_cast<const ProjectedSiStripRecHit2D &>(hit);
00174         if (!pHit.originalHit().cluster().isAvailable()) return false;
00175       } else {
00176         // std::cout << "|   It is a " << hit_type.name() << " hit !?" << std::endl;
00177         // Do nothing. We might end up here for FastSim hits.
00178       } // end 'switch' on hit type
00179     }
00180         
00181     // No tracker hit with bad cluster found, so all fine:
00182     return true;
00183   }
00184 
00185   //------------------------------------------------------------------
00187   //------------------------------------------------------------------
00188     edm::OrphanHandle<reco::MuonCollection> 
00189     MuonCollectionStoreManager::
00190     put( edm::Event & evt ) {
00191       edm::OrphanHandle<reco::MuonCollection> h;
00192       h = evt.put( selMuons_ , "SelectedMuons");
00193       evt.put( selTracks_ , "TrackerOnly");
00194       evt.put( selTracksExtras_ , "TrackerOnly");
00195       evt.put( selTracksHits_ ,"TrackerOnly");
00196       evt.put( selGlobalMuonTracks_,"GlobalMuon" );
00197       evt.put( selGlobalMuonTracksExtras_ ,"GlobalMuon");
00198       evt.put( selGlobalMuonTracksHits_,"GlobalMuon" );
00199       evt.put( selStandAloneTracks_ ,"StandAlone");
00200       evt.put( selStandAloneTracksExtras_ ,"StandAlone");
00201       evt.put( selStandAloneTracksHits_ ,"StandAlone");
00202       if (cloneClusters()) {
00203           evt.put( selStripClusters_ );
00204           evt.put( selPixelClusters_ );
00205       }
00206       return h; 
00207      
00208     }
00209 
00210 
00211 } // end of namespace helper