46 for(
int i = 0; selectionTypeStringToEnumMap[
i].
label && (!
found); ++
i)
47 if (! strcmp(label.c_str(), selectionTypeStringToEnumMap[
i].
label)) {
49 value = selectionTypeStringToEnumMap[
i].
value;
53 if (! found)
throw cms::Exception(
"MuonSelectorError") << label <<
" is not a recognized SelectionType";
59 double maxChamberDist,
60 double maxChamberDistPull,
63 unsigned int theMask = 0;
65 for(
int stationIdx = 1; stationIdx < 5; ++stationIdx)
66 for(
int detectorIdx = 1; detectorIdx < 3; ++detectorIdx)
67 if(muon.
trackDist(stationIdx,detectorIdx,arbitrationType) < maxChamberDist &&
68 muon.
trackDist(stationIdx,detectorIdx,arbitrationType)/muon.
trackDistErr(stationIdx,detectorIdx,arbitrationType) < maxChamberDistPull)
69 theMask += 1<<((stationIdx-1)+4*(detectorIdx-1));
81 bool use_weight_regain_at_chamber_boundary =
true;
82 bool use_match_dist_penalty =
true;
84 int nr_of_stations_crossed = 0;
85 int nr_of_stations_with_segment = 0;
86 std::vector<int> stations_w_track(8);
87 std::vector<int> station_has_segmentmatch(8);
88 std::vector<int> station_was_crossed(8);
89 std::vector<float> stations_w_track_at_boundary(8);
90 std::vector<float> station_weight(8);
91 int position_in_stations = 0;
92 float full_weight = 0.;
94 for(
int i = 1;
i<=8; ++
i) {
99 if( muon.
trackDist(
i,1,arbitrationType) < 999999 ) {
100 ++nr_of_stations_crossed;
101 station_was_crossed[
i-1] = 1;
102 if(muon.
trackDist(
i,1,arbitrationType) > -10. ) stations_w_track_at_boundary[
i-1] = muon.
trackDist(
i,1,arbitrationType);
103 else stations_w_track_at_boundary[
i-1] = 0.;
105 if( muon.
segmentX(
i,1,arbitrationType) < 999999 ) {
106 ++nr_of_stations_with_segment;
107 station_has_segmentmatch[
i-1] = 1;
111 if( muon.
trackDist(
i-4,2,arbitrationType) < 999999 ) {
112 ++nr_of_stations_crossed;
113 station_was_crossed[
i-1] = 1;
114 if(muon.
trackDist(
i-4,2,arbitrationType) > -10. ) stations_w_track_at_boundary[
i-1] = muon.
trackDist(
i-4,2,arbitrationType);
115 else stations_w_track_at_boundary[
i-1] = 0.;
117 if( muon.
segmentX(
i-4,2,arbitrationType) < 999999 ) {
118 ++nr_of_stations_with_segment;
119 station_has_segmentmatch[
i-1] = 1;
138 const float attenuate_weight_regain = 0.5;
140 for(
int i = 1;
i<=8; ++
i) {
146 if( station_was_crossed[
i-1] > 0 ) {
152 ++position_in_stations;
154 switch ( nr_of_stations_crossed ) {
156 station_weight[
i-1] = 1.;
159 if ( position_in_stations == 1 ) station_weight[
i-1] = 0.33;
160 else station_weight[
i-1] = 0.67;
163 if ( position_in_stations == 1 ) station_weight[
i-1] = 0.23;
164 else if( position_in_stations == 2 ) station_weight[
i-1] = 0.33;
165 else station_weight[
i-1] = 0.44;
168 if ( position_in_stations == 1 ) station_weight[
i-1] = 0.10;
169 else if( position_in_stations == 2 ) station_weight[
i-1] = 0.20;
170 else if( position_in_stations == 3 ) station_weight[
i-1] = 0.30;
171 else station_weight[
i-1] = 0.40;
178 station_weight[
i-1] = 1./nr_of_stations_crossed;
181 if( use_weight_regain_at_chamber_boundary ) {
182 if(station_has_segmentmatch[
i-1] <= 0 && stations_w_track_at_boundary[
i-1] != 0. ) {
186 station_weight[
i-1] = station_weight[
i-1]*attenuate_weight_regain*0.5*(TMath::Erf(stations_w_track_at_boundary[
i-1]/6.)+1.);
188 else if(station_has_segmentmatch[
i-1] <= 0 && stations_w_track_at_boundary[
i-1] == 0.) {
190 station_weight[
i-1] = 0.;
194 if(station_has_segmentmatch[
i-1] <= 0) station_weight[
i-1] = 0.;
197 if( station_has_segmentmatch[
i-1] > 0 && 42 == 42 ) {
199 if( muon.
dY(
i,1,arbitrationType) < 999999 && muon.
dX(
i,1,arbitrationType) < 999999) {
201 TMath::Sqrt(TMath::Power(muon.
pullX(
i,1,arbitrationType),2.)+TMath::Power(muon.
pullY(
i,1,arbitrationType),2.))> 1. ) {
203 if(use_match_dist_penalty) {
205 if(TMath::Sqrt(TMath::Power(muon.
dX(
i,1,arbitrationType),2.)+TMath::Power(muon.
dY(
i,1,arbitrationType),2.)) < 3. && TMath::Sqrt(TMath::Power(muon.
pullX(
i,1,arbitrationType),2.)+TMath::Power(muon.
pullY(
i,1,arbitrationType),2.)) > 3. ) {
206 station_weight[
i-1] *= 1./TMath::Power(
207 TMath::Max((
double)TMath::Sqrt(TMath::Power(muon.
dX(
i,1,arbitrationType),2.)+TMath::Power(muon.
dY(
i,1,arbitrationType),2.)),(
double)1.),.25);
210 station_weight[
i-1] *= 1./TMath::Power(
211 TMath::Sqrt(TMath::Power(muon.
pullX(
i,1,arbitrationType),2.)+TMath::Power(muon.
pullY(
i,1,arbitrationType),2.)),.25);
216 else if (muon.
dY(
i,1,arbitrationType) >= 999999) {
217 if( muon.
pullX(
i,1,arbitrationType) > 1. ) {
219 if(use_match_dist_penalty) {
221 if( muon.
dX(
i,1,arbitrationType) < 3. && muon.
pullX(
i,1,arbitrationType) > 3. ) {
222 station_weight[
i-1] *= 1./TMath::Power(
TMath::Max((
double)muon.
dX(
i,1,arbitrationType),(double)1.),.25);
225 station_weight[
i-1] *= 1./TMath::Power(muon.
pullX(
i,1,arbitrationType),.25);
231 if( muon.
pullY(
i,1,arbitrationType) > 1. ) {
233 if(use_match_dist_penalty) {
235 if( muon.
dY(
i,1,arbitrationType) < 3. && muon.
pullY(
i,1,arbitrationType) > 3. ) {
236 station_weight[
i-1] *= 1./TMath::Power(
TMath::Max((
double)muon.
dY(
i,1,arbitrationType),(double)1.),.25);
239 station_weight[
i-1] *= 1./TMath::Power(muon.
pullY(
i,1,arbitrationType),.25);
247 TMath::Sqrt(TMath::Power(muon.
pullX(
i-4,2,arbitrationType),2.)+TMath::Power(muon.
pullY(
i-4,2,arbitrationType),2.)) > 1. ) {
249 if(use_match_dist_penalty) {
251 if(TMath::Sqrt(TMath::Power(muon.
dX(
i-4,2,arbitrationType),2.)+TMath::Power(muon.
dY(
i-4,2,arbitrationType),2.)) < 3. && TMath::Sqrt(TMath::Power(muon.
pullX(
i-4,2,arbitrationType),2.)+TMath::Power(muon.
pullY(
i-4,2,arbitrationType),2.)) > 3. ) {
252 station_weight[
i-1] *= 1./TMath::Power(
253 TMath::Max((
double)TMath::Sqrt(TMath::Power(muon.
dX(
i-4,2,arbitrationType),2.)+TMath::Power(muon.
dY(
i-4,2,arbitrationType),2.)),(
double)1.),.25);
256 station_weight[
i-1] *= 1./TMath::Power(
257 TMath::Sqrt(TMath::Power(muon.
pullX(
i-4,2,arbitrationType),2.)+TMath::Power(muon.
pullY(
i-4,2,arbitrationType),2.)),.25);
270 station_weight[
i-1] = 0.;
274 full_weight += station_weight[
i-1];
280 if( nr_of_stations_crossed == 0 ) {
295 double minCompatibility,
298 bool goodMuon =
false;
304 else goodMuon =
false;
322 double maxChamberDist,
323 double maxChamberDistPull,
325 bool syncMinNMatchesNRequiredStationsInBarrelOnly,
326 bool applyAlsoAngularCuts)
329 bool goodMuon =
false;
334 if(minNumberOfMatches == 0)
return true;
336 unsigned int theStationMask = muon.
stationMask(arbitrationType);
337 unsigned int theRequiredStationMask =
RequiredStationMask(muon, maxChamberDist, maxChamberDistPull, arbitrationType);
341 int numRequiredStations = 0;
342 for(
int it = 0; it < 8; ++it) {
343 if(theStationMask & 1<<it) ++numSegs;
344 if(theRequiredStationMask & 1<<it) ++numRequiredStations;
349 if (syncMinNMatchesNRequiredStationsInBarrelOnly) {
351 if (fabs(muon.
eta()) < 1.2) {
352 if(minNumberOfMatches > numRequiredStations)
353 minNumberOfMatches = numRequiredStations;
354 if(minNumberOfMatches < 1)
355 minNumberOfMatches = 1;
358 if(minNumberOfMatches > numRequiredStations)
359 minNumberOfMatches = numRequiredStations;
360 if(minNumberOfMatches < 1)
361 minNumberOfMatches = 1;
364 if(numSegs >= minNumberOfMatches) goodMuon = 1;
371 if(theRequiredStationMask) {
372 for(
int stationIdx = 7; stationIdx >= 0; --stationIdx)
373 if(theRequiredStationMask & 1<<stationIdx){
374 if(theStationMask & 1<<stationIdx) {
375 lastSegBit = stationIdx;
384 for(
int stationIdx = 7; stationIdx >= 0; --stationIdx)
385 if(theStationMask & 1<<stationIdx) {
386 lastSegBit = stationIdx;
391 if(!goodMuon)
return false;
395 station = lastSegBit < 4 ? lastSegBit+1 : lastSegBit-3;
399 if(fabs(muon.
pullX(station,
detector,arbitrationType,1)) > maxAbsPullX &&
400 fabs(muon.
dX(station,
detector,arbitrationType)) > maxAbsDx)
403 if(applyAlsoAngularCuts && fabs(muon.
pullDxDz(station,
detector,arbitrationType,1)) > maxAbsPullX)
407 if (maxAbsDy < 999999) {
411 if(fabs(muon.
pullY(station,2,arbitrationType,1)) > maxAbsPullY &&
412 fabs(muon.
dY(station,2,arbitrationType)) > maxAbsDy)
415 if(applyAlsoAngularCuts && fabs(muon.
pullDyDz(station,2,arbitrationType,1)) > maxAbsPullY)
433 for (
int stationIdx = station; stationIdx > 0; --stationIdx) {
434 if(! (theStationMask & 1<<(stationIdx-1)))
437 if(muon.
dY(stationIdx,1,arbitrationType) > 999998)
440 if(fabs(muon.
pullY(stationIdx,1,arbitrationType,1)) > maxAbsPullY &&
441 fabs(muon.
dY(stationIdx,1,arbitrationType)) > maxAbsDy) {
445 if(applyAlsoAngularCuts && fabs(muon.
pullDyDz(stationIdx,1,arbitrationType,1)) > maxAbsPullY)
468 unsigned int theStationMask = muon.
stationMask(arbitrationType);
471 if (! theStationMask)
return false;
478 bool existsGoodDTSegX =
false;
479 bool existsDTSegY =
false;
483 for(
int stationIdx = 0; stationIdx <= 7; ++stationIdx)
484 if(theStationMask & 1<<stationIdx) {
485 station = stationIdx < 4 ? stationIdx+1 : stationIdx-3;
488 if((fabs(muon.
pullX(station,
detector,arbitrationType,1)) > maxAbsPullX &&
489 fabs(muon.
dX(station,
detector,arbitrationType)) > maxAbsDx) ||
490 (applyAlsoAngularCuts && fabs(muon.
pullDxDz(station,
detector,arbitrationType,1)) > maxAbsPullX))
493 existsGoodDTSegX =
true;
496 if (maxAbsDy < 999999) {
498 if((fabs(muon.
pullY(station,2,arbitrationType,1)) > maxAbsPullY &&
499 fabs(muon.
dY(station,2,arbitrationType)) > maxAbsDy) ||
500 (applyAlsoAngularCuts && fabs(muon.
pullDyDz(station,2,arbitrationType,1)) > maxAbsPullY))
504 if(muon.
dY(station,1,arbitrationType) > 999998)
509 if((fabs(muon.
pullY(station,1,arbitrationType,1)) > maxAbsPullY &&
510 fabs(muon.
dY(station,1,arbitrationType)) > maxAbsDy) ||
511 (applyAlsoAngularCuts && fabs(muon.
pullDyDz(station,1,arbitrationType,1)) > maxAbsPullY)) {
528 if (maxAbsDy < 999999) {
531 else if (existsGoodDTSegX)
539 if ( minNumberOfMatches == 0 )
return true;
542 for ( std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = muon.
matches().begin();
543 chamberMatch != muon.
matches().end(); ++chamberMatch )
545 if ( chamberMatch->detector() != 3 )
continue;
547 const double trkX = chamberMatch->x;
548 const double errX = chamberMatch->xErr;
550 for ( std::vector<reco::MuonRPCHitMatch>::const_iterator rpcMatch = chamberMatch->rpcMatches.begin();
551 rpcMatch != chamberMatch->rpcMatches.end(); ++rpcMatch )
553 const double rpcX = rpcMatch->x;
555 const double dX = fabs(rpcX-trkX);
556 if ( dX < maxAbsDx
or dX/errX < maxAbsPullX )
564 if ( nMatch >= minNumberOfMatches )
return true;
570 if ( minNumberOfMatches == 0 )
return true;
573 for (
const auto& chamberMatch : muon.
matches() )
577 const double trkX = chamberMatch.x;
578 const double errX = chamberMatch.xErr;
579 const double trkY = chamberMatch.y;
580 const double errY = chamberMatch.yErr;
582 for (
const auto& segment : chamberMatch.me0Matches )
585 const double me0X = segment.x;
586 const double me0ErrX = segment.xErr;
587 const double me0Y = segment.y;
588 const double me0ErrY = segment.yErr;
590 const double dX = fabs(me0X - trkX);
591 const double dY = fabs(me0Y - trkY);
592 const double pullX = dX/
std::sqrt(errX + me0ErrX);
593 const double pullY = dY/
std::sqrt(errY + me0ErrY);
595 if ( (dX < maxAbsDx
or pullX < maxAbsPullX) and (dY < maxAbsDy
or pullY < maxAbsPullY) )
603 return ( nMatch >= minNumberOfMatches );
608 if ( minNumberOfMatches == 0 )
return true;
611 for (
const auto& chamberMatch : muon.
matches() )
615 const double trkX = chamberMatch.x;
616 const double errX = chamberMatch.xErr;
617 const double trkY = chamberMatch.y;
618 const double errY = chamberMatch.yErr;
620 for (
const auto& segment : chamberMatch.gemMatches )
623 const double gemX = segment.x;
624 const double gemErrX = segment.xErr;
625 const double gemY = segment.y;
626 const double gemErrY = segment.yErr;
628 const double dX = fabs(gemX - trkX);
629 const double dY = fabs(gemY - trkY);
630 const double pullX = dX/
std::sqrt(errX + gemErrX);
631 const double pullY = dY/
std::sqrt(errY + gemErrY);
633 if ( (dX < maxAbsDx
or pullX < maxAbsPullX) and (dY < maxAbsDy
or pullY < maxAbsPullY) )
641 return ( nMatch >= minNumberOfMatches );
684 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,
true,
false);
687 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,
true,
false);
690 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,
false,
false);
693 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,
false,
false);
696 if (muon.
pt() < 8. && fabs(muon.
eta()) < 1.2)
697 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,
false,
false);
699 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,
false,
false);
702 if (muon.
pt() < 8. && fabs(muon.
eta()) < 1.2)
703 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,
false,
false);
705 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,
false,
false);
725 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,
false,
true);
728 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,
false,
true);
731 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,
false,
true);
734 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,
false,
true);
737 if (muon.
pt() < 8. && fabs(muon.
eta()) < 1.2)
738 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,
false,
false);
740 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,
true,
false);
743 if (muon.
pt() < 8. && fabs(muon.
eta()) < 1.2)
744 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,
false,
false);
746 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,
true,
false);
749 return muon.
isRPCMuon() &&
isGoodMuon(muon,
RPCMu, 2, 20, 4, 1e9, 1e9, 1e9, 1e9, arbitrationType,
false,
false);
755 return muon.
isME0Muon() &&
isGoodMuon(muon,
ME0Mu, 1, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, arbitrationType,
false,
false);
761 return muon.
isGEMMuon() &&
isGoodMuon(muon,
GEMMu, 1, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, arbitrationType,
false,
false);
769 double pullX,
double pullY,
bool checkAdjacentChambers)
773 unsigned int betterMuon = ( muon1.
pt() > muon2.
pt() ? 1 : 2 );
774 for ( std::vector<reco::MuonChamberMatch>::const_iterator chamber1 = muon1.
matches().begin();
775 chamber1 != muon1.
matches().end(); ++chamber1 )
776 for ( std::vector<reco::MuonChamberMatch>::const_iterator chamber2 = muon2.
matches().begin();
777 chamber2 != muon2.
matches().end(); ++chamber2 )
784 if ( chamber1->id == chamber2->id ){
786 if ( fabs(chamber1->x-chamber2->x) <
787 pullX *
sqrt(chamber1->xErr*chamber1->xErr+chamber2->xErr*chamber2->xErr) )
789 if ( betterMuon == 1 )
793 if ( nMatches1==0 || nMatches2==0 )
return true;
796 if ( fabs(chamber1->y-chamber2->y) <
797 pullY *
sqrt(chamber1->yErr*chamber1->yErr+chamber2->yErr*chamber2->yErr) )
799 if ( betterMuon == 1 )
803 if ( nMatches1==0 || nMatches2==0 )
return true;
806 if ( ! checkAdjacentChambers )
continue;
814 if ( id1.
ring() != id2.
ring() )
continue;
822 if ( fabs(chamber1->edgeX) > chamber1->xErr*pullX )
continue;
823 if ( fabs(chamber2->edgeX) > chamber2->xErr*pullX )
continue;
824 if ( chamber1->x * chamber2->x < 0 ) {
825 if ( betterMuon == 1 )
829 if ( nMatches1==0 || nMatches2==0 )
return true;
844 bool hits = muon.
innerTrack()->hitPattern().trackerLayersWithMeasurement() > 5 &&
845 muon.
innerTrack()->hitPattern().numberOfValidPixelHits() > 0;
850 return muID && hits && ip;
875 if(!muID)
return false;
877 bool layers = muon.
innerTrack()->hitPattern().trackerLayersWithMeasurement() > 5 &&
878 muon.
innerTrack()->hitPattern().pixelLayersWithMeasurement() > 0;
884 return layers && ip && ishighq;
891 if(!muID)
return false;
893 bool hits = muon.
innerTrack()->hitPattern().trackerLayersWithMeasurement() > 5 &&
894 muon.
innerTrack()->hitPattern().numberOfValidPixelHits() > 0;
900 return muID && hits && momQuality && ip;
908 for(std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = mu.
matches().begin();
909 chamberMatch != mu.
matches().end(); ++chamberMatch) {
910 if (chamberMatch->segmentMatches.empty())
continue;
911 for(std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch2 = mu2.
matches().begin();
912 chamberMatch2 != mu2.
matches().end(); ++chamberMatch2) {
913 if (chamberMatch2->segmentMatches.empty())
continue;
914 if (chamberMatch2->id() != chamberMatch->id())
continue;
915 for(std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin();
916 segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
917 if (!segmentMatch->isMask(segmentArbitrationMask))
continue;
918 for(std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch2 = chamberMatch2->segmentMatches.begin();
919 segmentMatch2 != chamberMatch2->segmentMatches.end(); ++segmentMatch2) {
920 if (!segmentMatch2->isMask(segmentArbitrationMask))
continue;
921 if ((segmentMatch->cscSegmentRef.isNonnull() && segmentMatch->cscSegmentRef == segmentMatch2->cscSegmentRef) ||
922 (segmentMatch-> dtSegmentRef.isNonnull() && segmentMatch-> dtSegmentRef == segmentMatch2-> dtSegmentRef) ) {
float chi2LocalPosition
chi2 value for the STA-TK matching of local position
virtual double pt() const final
transverse momentum
float segmentX(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
std::vector< LayerSetAndLayers > layers(const SeedingLayerSetsHits &sets)
virtual double eta() const final
momentum pseudorapidity
virtual TrackRef innerTrack() const
bool isTrackerMuon() const
bool isGlobalMuon() const
float trkKink
value of the kink algorithm applied to the inner track stub
bool isMatchesValid() const
bool isStandAloneMuon() const
float trkRelChi2
chi2 value for the inner track stub with respect to the global track
bool isMediumMuon(const reco::Muon &)
const Point & position() const
position
float caloCompatibility(const reco::Muon &muon)
bool isLooseMuon(const reco::Muon &)
SelectionType
Selector type.
bool overlap(const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
bool isSoftMuon(const reco::Muon &, const reco::Vertex &)
float trackDistErr(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
float dY(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
virtual TrackRef muonBestTrack() const
ArbitrationType
define arbitration schemes
float pullDxDz(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
MuonQuality combinedQuality() const
get energy deposition information
Abs< T >::type abs(const T &t)
float segmentCompatibility(const reco::Muon &muon, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
bool isQualityValid() const
float dX(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
float pullY(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
virtual TrackRef outerTrack() const
reference to Track reconstructed in the muon detector only
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
unsigned int stationMask(ArbitrationType type=SegmentAndTrackArbitration) const
int numberOfMatchedStations(ArbitrationType type=SegmentAndTrackArbitration) const
float staRelChi2
chi2 value for the outer track stub with respect to the global track
int sharedSegments(const reco::Muon &muon1, const reco::Muon &muon2, unsigned int segmentArbitrationMask=reco::MuonSegmentMatch::BestInChamberByDR)
bool isHighPtMuon(const reco::Muon &, const reco::Vertex &)
SelectionType selectionTypeFromString(const std::string &label)
a lightweight "map" for selection type string label and enum value
unsigned int RequiredStationMask(const reco::Muon &muon, double maxChamberDist, double maxChamberDistPull, reco::Muon::ArbitrationType arbitrationType)
std::vector< MuonChamberMatch > & matches()
get muon matching information
int numberOfMatches(ArbitrationType type=SegmentAndTrackArbitration) const
get number of chambers with matched segments
float pullDyDz(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
float trackDist(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
virtual TrackRef tunePMuonBestTrack() const
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
float caloCompatibility() const
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
float pullX(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const