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
00055 )) {
00056
00057
00058
00059
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
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 }
00094
00095 trk.setExtra( TrackExtraRef( rTrackExtras_, idx_ ++ ) );
00096
00097 }
00098
00099
00100
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 }
00126
00127
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 }
00146 }
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
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
00177
00178 }
00179 }
00180
00181
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 }