File indexing completed on 2024-04-06 12:26:59
0001 #ifndef MuonIdentification_MuonArbitrationMethods_h
0002 #define MuonIdentification_MuonArbitrationMethods_h
0003
0004 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
0005 #include "DataFormats/MuonReco/interface/MuonChamberMatch.h"
0006
0007 #include <utility>
0008
0009
0010
0011
0012 struct SortMuonSegmentMatches {
0013
0014 SortMuonSegmentMatches(unsigned int flag) { flag_ = flag; }
0015
0016 bool operator()(std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> p1,
0017 std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> p2) {
0018 reco::MuonChamberMatch* cm1 = p1.first;
0019 reco::MuonSegmentMatch* sm1 = p1.second;
0020 reco::MuonChamberMatch* cm2 = p2.first;
0021 reco::MuonSegmentMatch* sm2 = p2.second;
0022
0023 if (flag_ == reco::MuonSegmentMatch::BestInChamberByDX || flag_ == reco::MuonSegmentMatch::BestInStationByDX ||
0024 flag_ == reco::MuonSegmentMatch::BelongsToTrackByDX)
0025 return fabs(sm1->x - cm1->x) < fabs(sm2->x - cm2->x);
0026 if (flag_ == reco::MuonSegmentMatch::BestInChamberByDR || flag_ == reco::MuonSegmentMatch::BestInStationByDR ||
0027 flag_ == reco::MuonSegmentMatch::BelongsToTrackByDR) {
0028 if ((!sm1->hasZed()) || (!sm2->hasZed()))
0029 return fabs(sm1->x - cm1->x) < fabs(sm2->x - cm2->x);
0030 return sqrt(pow(sm1->x - cm1->x, 2) + pow(sm1->y - cm1->y, 2)) <
0031 sqrt(pow(sm2->x - cm2->x, 2) + pow(sm2->y - cm2->y, 2));
0032 }
0033 if (flag_ == reco::MuonSegmentMatch::BestInChamberByDXSlope ||
0034 flag_ == reco::MuonSegmentMatch::BestInStationByDXSlope ||
0035 flag_ == reco::MuonSegmentMatch::BelongsToTrackByDXSlope)
0036 return fabs(sm1->dXdZ - cm1->dXdZ) < fabs(sm2->dXdZ - cm2->dXdZ);
0037 if (flag_ == reco::MuonSegmentMatch::BestInChamberByDRSlope ||
0038 flag_ == reco::MuonSegmentMatch::BestInStationByDRSlope ||
0039 flag_ == reco::MuonSegmentMatch::BelongsToTrackByDRSlope) {
0040 if ((!sm1->hasZed()) || (!sm2->hasZed()))
0041 return fabs(sm1->dXdZ - cm1->dXdZ) < fabs(sm2->dXdZ - cm2->dXdZ);
0042 return sqrt(pow(sm1->dXdZ - cm1->dXdZ, 2) + pow(sm1->dYdZ - cm1->dYdZ, 2)) <
0043 sqrt(pow(sm2->dXdZ - cm2->dXdZ, 2) + pow(sm2->dYdZ - cm2->dYdZ, 2));
0044 }
0045
0046 return false;
0047 }
0048
0049 unsigned int flag_;
0050 };
0051
0052 #endif