CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MuonSelector.cc
Go to the documentation of this file.
2 
8 
10 
12 
13 using namespace reco;
14 
15 namespace helper
16 {
17  MuonCollectionStoreManager::
18  MuonCollectionStoreManager(const edm::Handle<reco::MuonCollection>&)
19  :
20  selMuons_( new reco::MuonCollection ),
21  selTracks_( new reco::TrackCollection ),
22  selTracksExtras_( new reco::TrackExtraCollection ),
23  selTracksHits_( new TrackingRecHitCollection ),
24  selGlobalMuonTracks_( new reco::TrackCollection ),
25  selGlobalMuonTracksExtras_( new reco::TrackExtraCollection ),
26  selGlobalMuonTracksHits_( new TrackingRecHitCollection ),
27  selStandAloneTracks_( new reco::TrackCollection ),
28  selStandAloneTracksExtras_( new reco::TrackExtraCollection ),
29  selStandAloneTracksHits_( new TrackingRecHitCollection ),
30  selStripClusters_( new edmNew::DetSetVector<SiStripCluster> ),
31  selPixelClusters_( new edmNew::DetSetVector<SiPixelCluster> ),
32  rMuons_(),
33  rTracks_(), rTrackExtras_(), rHits_(),
34  rGBTracks_(), rGBTrackExtras_(), rGBHits_(),
35  rSATracks_(), rSATrackExtras_(), rSAHits_(),
36  clusterStorer_(),
37  id_(0), igbd_(0), isad_(0), idx_(0), igbdx_(0),
38  isadx_(0), hidx_(0), higbdx_(0), hisadx_(0),
39  cloneClusters_ (true)
40  {
41  }
42 
43 
44  //------------------------------------------------------------------
46  //------------------------------------------------------------------
47  void
49  processMuon( const Muon & mu )
50  {
51  if (this->cloneClusters()
52  && ( (mu.globalTrack().isNonnull() && !this->clusterRefsOK(*mu.globalTrack()))
53  || (mu.innerTrack() .isNonnull() && !this->clusterRefsOK(*mu.innerTrack() ))
54  // || (mu.outerTrack(). isNonnull() && !this->clusterRefsOK(*mu.outerTrack() ))
55  )) { // outer track is muon only and has no strip clusters...
56  // At least until CMSSW_2_1_8, global muon track reconstruction assigns wrong hits in
57  // case of a track from iterative tracking. These hits are fetched from Trajectories
58  // instead of from Tracks and therefore reference temporary cluster collections.
59  // As a hack we skip these muons here - they can anyway not be refitted.
60  edm::LogError("BadRef") << "@SUB=MuonCollectionStoreManager::processMuon"
61  << "Skip muon: One of its tracks references "
62  << "non-available clusters!";
63  return;
64  }
65 
66  selMuons_->push_back( Muon( mu ) );
67  // only tracker Muon Track
68  selMuons_->back().setInnerTrack( TrackRef( rTracks_, id_ ++ ) );
69  TrackRef trkRef = mu.track();
70  if(trkRef.isNonnull()){
71 
72  selTracks_->push_back(Track( *trkRef) );
73 
74  Track & trk= selTracks_->back();
75 
76  selTracksExtras_->push_back( TrackExtra( trk.outerPosition(), trk.outerMomentum(), trk.outerOk(),
77  trk.innerPosition(), trk.innerMomentum(), trk.innerOk(),
78  trk.outerStateCovariance(), trk.outerDetId(),
79  trk.innerStateCovariance(), trk.innerDetId(),
80  trk.seedDirection() ) );
81 
82  TrackExtra & tx = selTracksExtras_->back();
83 
84  for( trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd();
85  ++ hit, ++ hidx_) {
86  selTracksHits_->push_back( (*hit)->clone() );
87  TrackingRecHit * newHit = & (selTracksHits_->back());
89  if (cloneClusters() && newHit->isValid()
90  && ((*hit)->geographicalId().det() == DetId::Tracker)) {
92  }
93  } // end of for loop over tracking rec hits on this track
94 
96 
97  }// TO trkRef.isNonnull
98 
99 
100  // global Muon Track
101  selMuons_->back().setGlobalTrack( TrackRef( rGBTracks_, igbd_ ++ ) );
102  trkRef = mu.combinedMuon();
103  if(trkRef.isNonnull()){
104  selGlobalMuonTracks_->push_back(Track( *trkRef) );
105  Track & trk = selGlobalMuonTracks_->back();
106 
108  trk.innerPosition(), trk.innerMomentum(), trk.innerOk(),
109  trk.outerStateCovariance(), trk.outerDetId(),
110  trk.innerStateCovariance(), trk.innerDetId(), trk.seedDirection() ) );
111  TrackExtra & tx = selGlobalMuonTracksExtras_->back();
112  for( trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd();
113  ++ hit, ++ higbdx_) {
114  selGlobalMuonTracksHits_->push_back( (*hit)->clone() );
115  TrackingRecHit * newHit = & (selGlobalMuonTracksHits_->back());
117  if (cloneClusters() && newHit->isValid()
118  && ((*hit)->geographicalId().det() == DetId::Tracker)) {
120  }
121 
122  }
124 
125  } // GB trkRef.isNonnull()
126 
127  // stand alone Muon Track
128  selMuons_->back().setOuterTrack( TrackRef( rSATracks_, isad_ ++ ) );
129  trkRef = mu.standAloneMuon();
130  if(trkRef.isNonnull()){
131  selStandAloneTracks_->push_back(Track( *trkRef) );
132  Track & trk = selStandAloneTracks_->back();
133 
135  trk.innerPosition(), trk.innerMomentum(), trk.innerOk(),
136  trk.outerStateCovariance(), trk.outerDetId(),
137  trk.innerStateCovariance(), trk.innerDetId(), trk.seedDirection() ) );
138  TrackExtra & tx = selStandAloneTracksExtras_->back();
139  for( trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++ hit ) {
140  selStandAloneTracksHits_->push_back( (*hit)->clone() );
141  tx.add( TrackingRecHitRef( rSAHits_, hisadx_ ++ ) );
142  }
144 
145  } // SA trkRef.isNonnull()
146  }// end of track, and function
147 
148  //-------------------------------------------------------------------------
150  //-------------------------------------------------------------------------
151  bool
153  clusterRefsOK(const reco::Track &track) const
154  {
155 
156  for (trackingRecHit_iterator hitIt = track.recHitsBegin(); hitIt != track.recHitsEnd(); ++hitIt) {
157  const TrackingRecHit &hit = **hitIt;
158  if (!hit.isValid() || hit.geographicalId().det() != DetId::Tracker) continue;
159 
160  // So we are in the tracker - now check hit types and availability of cluster refs:
161  const std::type_info &hit_type = typeid(hit);
162  if (hit_type == typeid(SiPixelRecHit)) {
163  if (!static_cast<const SiPixelRecHit &>(hit).cluster().isAvailable()) return false;
164  } else if (hit_type == typeid(SiStripRecHit2D)) {
165  if (!static_cast<const SiStripRecHit2D &>(hit).cluster().isAvailable()) return false;
166  } else if (hit_type == typeid(SiStripRecHit1D)) {
167  if (!static_cast<const SiStripRecHit1D &>(hit).cluster().isAvailable()) return false;
168  } else if (hit_type == typeid(SiStripMatchedRecHit2D)) {
169  const SiStripMatchedRecHit2D &mHit = static_cast<const SiStripMatchedRecHit2D &>(hit);
170  if (!mHit.monoHit().cluster().isAvailable()) return false;
171  if (!mHit.stereoHit().cluster().isAvailable()) return false;
172  } else if (hit_type == typeid(ProjectedSiStripRecHit2D)) {
173  const ProjectedSiStripRecHit2D &pHit = static_cast<const ProjectedSiStripRecHit2D &>(hit);
174  if (!pHit.originalHit().cluster().isAvailable()) return false;
175  } else {
176  // std::cout << "| It is a " << hit_type.name() << " hit !?" << std::endl;
177  // Do nothing. We might end up here for FastSim hits.
178  } // end 'switch' on hit type
179  }
180 
181  // No tracker hit with bad cluster found, so all fine:
182  return true;
183  }
184 
185  //------------------------------------------------------------------
187  //------------------------------------------------------------------
190  put( edm::Event & evt ) {
192  h = evt.put( selMuons_ , "SelectedMuons");
193  evt.put( selTracks_ , "TrackerOnly");
194  evt.put( selTracksExtras_ , "TrackerOnly");
195  evt.put( selTracksHits_ ,"TrackerOnly");
196  evt.put( selGlobalMuonTracks_,"GlobalMuon" );
197  evt.put( selGlobalMuonTracksExtras_ ,"GlobalMuon");
198  evt.put( selGlobalMuonTracksHits_,"GlobalMuon" );
199  evt.put( selStandAloneTracks_ ,"StandAlone");
200  evt.put( selStandAloneTracksExtras_ ,"StandAlone");
201  evt.put( selStandAloneTracksHits_ ,"StandAlone");
202  if (cloneClusters()) {
203  evt.put( selStripClusters_ );
204  evt.put( selPixelClusters_ );
205  }
206  return h;
207 
208  }
209 
210 
211 } // end of namespace helper
reco::TrackExtraRefProd rSATrackExtras_
Definition: MuonSelector.h:87
std::auto_ptr< edmNew::DetSetVector< SiPixelCluster > > selPixelClusters_
Definition: MuonSelector.h:75
virtual TrackRef innerTrack() const
Definition: Muon.h:49
std::auto_ptr< reco::TrackCollection > selTracks_
Definition: MuonSelector.h:65
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:10
virtual TrackRef track() const
reference to a Track
Definition: Muon.h:50
bool innerOk() const
return true if the innermost hit is valid
Definition: Track.h:40
edm::Ref< TrackExtraCollection > TrackExtraRef
persistent reference to a TrackExtra
Definition: TrackExtraFwd.h:13
bool isAvailable() const
Definition: Ref.h:276
void addCluster(TrackingRecHitCollection &hits, size_t index)
add cluster of newHit to list (throws if hit is of unknown type)
const math::XYZPoint & outerPosition() const
position of the outermost hit
Definition: Track.h:47
std::auto_ptr< reco::TrackCollection > selStandAloneTracks_
Definition: MuonSelector.h:71
std::vector< Muon > MuonCollection
collection of Muon objects
Definition: MuonFwd.h:9
reco::TrackExtraRefProd rTrackExtras_
Definition: MuonSelector.h:79
edm::OrphanHandle< reco::MuonCollection > put(edm::Event &evt)
Put tracks, track extras and hits+clusters into the event.
const math::XYZPoint & innerPosition() const
position of the innermost hit
Definition: Track.h:42
std::auto_ptr< TrackingRecHitCollection > selGlobalMuonTracksHits_
Definition: MuonSelector.h:70
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
TrackingRecHitRefProd rSAHits_
Definition: MuonSelector.h:88
std::auto_ptr< reco::TrackExtraCollection > selStandAloneTracksExtras_
Definition: MuonSelector.h:72
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:85
edm::Ref< TrackingRecHitCollection > TrackingRecHitRef
persistent reference to a TrackingRecHit
CovarianceMatrix outerStateCovariance() const
outermost trajectory state curvilinear errors
Definition: Track.h:51
unsigned int outerDetId() const
DetId of the detector on which surface the outermost state is located.
Definition: Track.h:59
void processMuon(const reco::Muon &mu)
Process a single muon.
Definition: MuonSelector.cc:49
ClusterRef cluster() const
std::auto_ptr< reco::TrackExtraCollection > selGlobalMuonTracksExtras_
Definition: MuonSelector.h:69
std::auto_ptr< edmNew::DetSetVector< SiStripCluster > > selStripClusters_
Definition: MuonSelector.h:74
TrackingRecHitRefProd rHits_
Definition: MuonSelector.h:80
const int mu
Definition: Constants.h:23
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
Definition: Track.h:63
TrackingRecHitRefProd rGBHits_
Definition: MuonSelector.h:84
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
Definition: TrackExtraFwd.h:9
void setExtra(const TrackExtraRef &ref)
set reference to &quot;extra&quot; object
Definition: Track.h:95
virtual TrackRef combinedMuon() const
reference to a stand-alone muon Track
Definition: Muon.h:56
SiStripRecHit2D stereoHit() const
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
Definition: Track.h:49
bool outerOk() const
return true if the outermost hit is valid
Definition: Track.h:38
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
reco::TrackExtraRefProd rGBTrackExtras_
Definition: MuonSelector.h:83
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:14
CovarianceMatrix innerStateCovariance() const
innermost trajectory state curvilinear errors
Definition: Track.h:53
bool isValid() const
void add(const TrackingRecHitRef &r)
add a reference to a RecHit
std::auto_ptr< TrackingRecHitCollection > selTracksHits_
Definition: MuonSelector.h:67
SiStripRecHit2D monoHit() const
Pixel cluster – collection of neighboring pixels above threshold.
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
Definition: Track.h:45
std::auto_ptr< reco::MuonCollection > selMuons_
Definition: MuonSelector.h:64
PropagationDirection seedDirection() const
direction of how the hits were sorted in the original seed
Definition: Track.h:105
DetId geographicalId() const
std::auto_ptr< reco::TrackExtraCollection > selTracksExtras_
Definition: MuonSelector.h:66
std::auto_ptr< reco::TrackCollection > selGlobalMuonTracks_
Definition: MuonSelector.h:68
Detector det() const
get the detector field from this detid
Definition: DetId.h:37
unsigned int innerDetId() const
DetId of the detector on which surface the innermost state is located.
Definition: Track.h:61
const SiStripRecHit2D & originalHit() const
bool clusterRefsOK(const reco::Track &track) const
Check if all references to silicon strip/pixel clusters are available.
std::auto_ptr< TrackingRecHitCollection > selStandAloneTracksHits_
Definition: MuonSelector.h:73
Our base class.
Definition: SiPixelRecHit.h:22
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:55
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
Definition: Track.h:65
virtual TrackRef standAloneMuon() const
reference to a stand-alone muon Track
Definition: Muon.h:53