37 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: Constructor called";
39 produces<reco::MuonCollection>();
40 produces<reco::CaloMuonCollection>();
41 produces<reco::MuonTimeExtraMap>(
"combined");
42 produces<reco::MuonTimeExtraMap>(
"dt");
43 produces<reco::MuonTimeExtraMap>(
"csc");
74 iConfig.
getParameter<
double>(
"ptThresholdToFillCandidateP4WithGlobalFit");
76 iConfig.
getParameter<
double>(
"sigmaThresholdToFillCandidateP4WithGlobalFit");
87 theTimingFiller_ = std::make_unique<MuonTimingFiller>(timingParameters, consumesCollector());
92 theShowerDigiFiller_ = std::make_unique<MuonShowerDigiFiller>(showerDigiParameters, consumesCollector());
137 <<
"Number of input collection labels is different from number of types. " 138 <<
"For each collection label there should be exactly one collection type specified.";
140 throw cms::Exception(
"ConfigurationError") <<
"Number of input collections should be from 1 to 7.";
145 <<
"========================================================================\n" 146 <<
"Debugging mode with truth matching is turned on!!! Make sure you understand what you are doing!\n" 147 <<
"========================================================================\n";
153 glbQualToken_ = consumes<edm::ValueMap<reco::MuonQuality> >(glbQualTag);
170 rpcHitToken_ = consumes<RPCRecHitCollection>(rpcHitTag);
173 gemHitToken_ = consumes<GEMRecHitCollection>(gemHitTag);
274 LogTrace(
"MuonIdentification") <<
"Creating a muon from a track " <<
track.get()->pt()
275 <<
" Pt (GeV), eta: " <<
track.get()->eta();
278 LogTrace(
"MuonIdentification") <<
"Muon created from a track ";
281 aMuon.setBestTrack(
type);
282 aMuon.setTunePBestTrack(
type);
285 <<
"Muon created from a track and setMuonBestTrack, setBestTrack and setTunePBestTrack called";
291 LogTrace(
"MuonIdentification") <<
"Creating a CaloMuon from a Muon";
296 if (
muon.isEnergyValid())
305 LogTrace(
"MuonIdentification") <<
"Creating a muon from a link to tracks object";
312 bool useSigmaSwitch =
false;
320 if (tpfmsRef.
isNull() && pickyRef.isNull() && dytRef.isNull()) {
321 edm::LogWarning(
"MakeMuonWithTEV") <<
"Failed to get TEV refits, fall back to sigma switch.";
322 useSigmaSwitch =
true;
325 useSigmaSwitch =
true;
328 if (useSigmaSwitch) {
330 links.trackerTrack(),
335 links.trackerTrack(),
341 aMuon =
makeMuon(*chosenTrack.first);
370 const double p =
track.p();
373 LogTrace(
"MuonIdentification") <<
"Skipped low momentum track (Pt,P): " <<
pt <<
", " <<
track.p() <<
" GeV";
381 LogTrace(
"MuonIdentification") <<
"Skipped track with large pseudo rapidity (Eta: " <<
track.eta() <<
" )";
392 const auto subdetId =
id.subdetId();
403 if (!
muon.isMatchesValid() ||
track.extra().isNull() ||
track.extra()->recHitsSize() == 0)
406 int numberOfCommonDetIds = 0;
407 const std::vector<reco::MuonChamberMatch>&
matches(
muon.matches());
409 if (
match.segmentMatches.empty())
412 bool foundCommonDetId =
false;
413 for (
auto hit =
track.extra()->recHitsBegin();
hit !=
track.extra()->recHitsEnd(); ++
hit) {
419 foundCommonDetId =
true;
423 if (foundCommonDetId) {
424 ++numberOfCommonDetIds;
428 return numberOfCommonDetIds;
439 const int nHitsGood = goodMuon.
globalTrack()->hitPattern().numberOfValidMuonHits();
440 const int nHitsBad = badMuon.
globalTrack()->hitPattern().numberOfValidMuonHits();
441 if (
std::min(nHitsGood, nHitsBad) > 10) {
442 const double chi2Good = goodMuon.
globalTrack()->normalizedChi2();
443 const double chi2Bad = badMuon.
globalTrack()->normalizedChi2();
444 return (chi2Good <= chi2Bad);
447 return (nHitsGood >= nHitsBad);
451 auto outputMuons = std::make_unique<reco::MuonCollection>();
452 auto caloMuons = std::make_unique<reco::CaloMuonCollection>();
464 outputMuons->push_back(
muon);
471 std::vector<bool> goodmuons(nLink,
true);
474 for (
unsigned int i = 0;
i < nLink - 1; ++
i) {
476 if (iLink.trackerTrack().isNull() || !
checkLinks(&iLink))
478 for (
unsigned int j =
i + 1;
j < nLink; ++
j) {
482 if (iLink.trackerTrack() == jLink.trackerTrack()) {
488 goodmuons[
j] =
false;
490 goodmuons[
i] =
false;
495 for (
unsigned int i = 0;
i < nLink - 1; ++
i) {
499 if (iLink.standAloneTrack().isNull() || !
checkLinks(&iLink))
501 for (
unsigned int j =
i + 1;
j < nLink; ++
j) {
507 if (iLink.standAloneTrack() == jLink.standAloneTrack()) {
509 goodmuons[
j] =
false;
511 goodmuons[
i] =
false;
516 for (
unsigned int i = 0;
i < nLink; ++
i) {
524 for (
const auto&
muon : *outputMuons) {
525 if (
muon.track() == iLink.trackerTrack() &&
muon.standAloneMuon() == iLink.standAloneTrack() &&
526 muon.combinedMuon() == iLink.globalTrack()) {
532 outputMuons->push_back(
makeMuon(iLink));
540 LogTrace(
"MuonIdentification") <<
"Creating tracker muons";
541 std::vector<TrackDetectorAssociator::Direction> directions1, directions2;
557 if (!(*recoVertices)[0].isFake())
561 bool splitTrack =
false;
564 const auto&
directions = splitTrack ? directions1 : directions2;
593 for (
auto&
muon : *outputMuons) {
611 LogTrace(
"MuonIdentification") <<
"Found a corresponding global muon. Set energy, matches and move on";
616 if (goodTrackerMuon || goodRPCMuon || goodGEMMuon || goodME0Muon) {
619 LogTrace(
"MuonIdentification") <<
"track failed minimal number of muon matches requirement";
631 LogTrace(
"MuonIdentification") <<
"Looking for new muons among stand alone muon tracks";
637 for (
auto&
muon : *outputMuons) {
638 if (!
muon.standAloneMuon().isNull()) {
640 if (
muon.standAloneMuon().get() == &outerTrack ||
641 (
muon.standAloneMuon()->extra().isNonnull() &&
642 muon.standAloneMuon()->extra().get() == outerTrack.extra().get())) {
655 LogTrace(
"MuonIdentification") <<
"Found associated tracker muon. Set a reference and move on";
664 LogTrace(
"MuonIdentification") <<
"No associated stand alone track is found. Making a muon";
665 outputMuons->push_back(
677 LogTrace(
"MuonIdentification") <<
"Dress up muons if it's necessary";
679 const int nMuons = outputMuons->size();
681 std::vector<reco::MuonTimeExtra> dtTimeColl(
nMuons);
682 std::vector<reco::MuonTimeExtra> cscTimeColl(
nMuons);
683 std::vector<reco::MuonTimeExtra> combinedTimeColl(
nMuons);
684 std::vector<reco::IsoDeposit> trackDepColl(
nMuons);
685 std::vector<reco::IsoDeposit> ecalDepColl(
nMuons);
686 std::vector<reco::IsoDeposit> hcalDepColl(
nMuons);
687 std::vector<reco::IsoDeposit> hoDepColl(
nMuons);
688 std::vector<reco::IsoDeposit> jetDepColl(
nMuons);
691 for (
unsigned int i = 0;
i < outputMuons->size(); ++
i) {
692 auto&
muon = outputMuons->at(
i);
698 if (
muon.isStandAloneMuon()) {
705 LogTrace(
"MuonIdentification") <<
"THIS SHOULD NEVER HAPPEN";
714 LogDebug(
"MuonIdentification") <<
"";
725 iEvent, iSetup,
muon, trackDepColl[
i], ecalDepColl[
i], hcalDepColl[
i], hoDepColl[
i], jetDepColl[
i]);
737 muonTime.
nDof = combinedTime.
nDof();
743 muon.setTime(muonTime);
744 muon.setRPCTime(rpcTime);
745 dtTimeColl[
i] = dtTime;
746 cscTimeColl[
i] = cscTime;
747 combinedTimeColl[
i] = combinedTime;
750 LogTrace(
"MuonIdentification") <<
"number of muons produced: " << outputMuons->size();
760 auto oMap = std::make_unique<MapType>();
762 typename MapType::Filler
filler(*oMap);
763 filler.insert(refH, vec.begin(), vec.end());
769 fillMap(muonHandle, combinedTimeColl,
iEvent,
"combined");
770 fillMap(muonHandle, dtTimeColl,
iEvent,
"dt");
771 fillMap(muonHandle, cscTimeColl,
iEvent,
"csc");
829 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId";
839 <<
"Failed to fill muon id information for a muon with undefined references to tracks";
843 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fillEnergy = " <<
fillEnergy_;
858 for (
auto hit :
info.crossedHcalRecHits) {
869 if (!
info.crossedEcalIds.empty())
871 if (!
info.crossedHcalIds.empty())
875 for (
const auto&
hit :
info.ecalRecHits) {
876 if (
hit->
id() != emMaxId)
882 for (
const auto&
hit :
info.hcalRecHits) {
883 if (
hit->
id() != hadMaxId)
894 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill muon match info ";
895 std::vector<reco::MuonChamberMatch> muonChamberMatches;
896 unsigned int nubmerOfMatchesAccordingToTrackAssociator = 0;
905 const auto& lErr =
chamber.tState.localError();
906 const auto& lPos =
chamber.tState.localPosition();
907 const auto& lDir =
chamber.tState.localDirection();
909 const auto& localError = lErr.positionError();
910 matchedChamber.
x = lPos.x();
911 matchedChamber.
y = lPos.y();
912 matchedChamber.
xErr =
sqrt(localError.xx());
913 matchedChamber.
yErr =
sqrt(localError.yy());
915 matchedChamber.
dXdZ = lDir.z() != 0 ? lDir.x() / lDir.z() : 9999;
916 matchedChamber.
dYdZ = lDir.z() != 0 ? lDir.y() / lDir.z() : 9999;
919 matchedChamber.
dXdZErr = trajectoryCovMatrix(1, 1) > 0 ?
sqrt(trajectoryCovMatrix(1, 1)) : 0;
920 matchedChamber.
dYdZErr = trajectoryCovMatrix(2, 2) > 0 ?
sqrt(trajectoryCovMatrix(2, 2)) : 0;
934 ++nubmerOfMatchesAccordingToTrackAssociator;
937 for (
const auto& segment :
chamber.segments) {
939 matchedSegment.
x = segment.segmentLocalPosition.x();
940 matchedSegment.
y = segment.segmentLocalPosition.y();
941 matchedSegment.
dXdZ =
942 segment.segmentLocalDirection.z() ? segment.segmentLocalDirection.x() / segment.segmentLocalDirection.z() : 0;
943 matchedSegment.
dYdZ =
944 segment.segmentLocalDirection.z() ? segment.segmentLocalDirection.y() / segment.segmentLocalDirection.z() : 0;
945 matchedSegment.
xErr = segment.segmentLocalErrorXX > 0 ?
sqrt(segment.segmentLocalErrorXX) : 0;
946 matchedSegment.
yErr = segment.segmentLocalErrorYY > 0 ?
sqrt(segment.segmentLocalErrorYY) : 0;
947 matchedSegment.
dXdZErr = segment.segmentLocalErrorDxDz > 0 ?
sqrt(segment.segmentLocalErrorDxDz) : 0;
948 matchedSegment.
dYdZErr = segment.segmentLocalErrorDyDz > 0 ?
sqrt(segment.segmentLocalErrorDyDz) : 0;
949 matchedSegment.
t0 = segment.t0;
950 matchedSegment.
mask = 0;
955 matchedSegment.
hasZed_ = segment.hasZed;
956 matchedSegment.
hasPhi_ = segment.hasPhi;
958 bool matchedX =
false;
959 bool matchedY =
false;
960 LogTrace(
"MuonIdentification") <<
" matching local x, segment x: " << matchedSegment.
x 961 <<
", chamber x: " << matchedChamber.
x <<
", max: " <<
maxAbsDx_;
962 LogTrace(
"MuonIdentification") <<
" matching local y, segment y: " << matchedSegment.
y 963 <<
", chamber y: " << matchedChamber.
y <<
", max: " <<
maxAbsDy_;
964 const double matchedSegChDx =
std::abs(matchedSegment.
x - matchedChamber.
x);
965 const double matchedSegChDy =
std::abs(matchedSegment.
y - matchedChamber.
y);
966 if (matchedSegment.
xErr > 0 && matchedChamber.
xErr > 0)
967 LogTrace(
"MuonIdentification") <<
" xpull: " 970 if (matchedSegment.
yErr > 0 && matchedChamber.
yErr > 0)
971 LogTrace(
"MuonIdentification") <<
" ypull: " 977 else if (matchedSegment.
xErr > 0 && matchedChamber.
xErr > 0) {
979 if (matchedSegChDx * matchedSegChDx <
maxAbsPullX2_ * invMatchedSegChPullX2)
984 else if (matchedSegment.
yErr > 0 && matchedChamber.
yErr > 0) {
986 if (matchedSegChDy * matchedSegChDy <
maxAbsPullY2_ * invMatchedSegChPullY2)
989 if (matchedX && matchedY) {
991 matchedChamber.
me0Matches.push_back(matchedSegment);
993 matchedChamber.
gemMatches.push_back(matchedSegment);
998 muonChamberMatches.push_back(matchedChamber);
1002 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill RPC info";
1007 const auto& lErr =
chamber.tState.localError();
1008 const auto& lPos =
chamber.tState.localPosition();
1009 const auto& lDir =
chamber.tState.localDirection();
1013 LocalError localError = lErr.positionError();
1014 matchedChamber.
x = lPos.x();
1015 matchedChamber.
y = lPos.y();
1019 matchedChamber.
dXdZ = lDir.z() != 0 ? lDir.x() / lDir.z() : 9999;
1020 matchedChamber.
dYdZ = lDir.z() != 0 ? lDir.y() / lDir.z() : 9999;
1023 matchedChamber.
dXdZErr = trajectoryCovMatrix(1, 1) > 0 ?
sqrt(trajectoryCovMatrix(1, 1)) : 0;
1024 matchedChamber.
dYdZErr = trajectoryCovMatrix(2, 2) > 0 ?
sqrt(trajectoryCovMatrix(2, 2)) : 0;
1036 if (rpcRecHit.rawId() !=
chamber.id.rawId())
1039 rpcHitMatch.
x = rpcRecHit.localPosition().x();
1040 rpcHitMatch.
mask = 0;
1041 rpcHitMatch.
bx = rpcRecHit.BunchX();
1043 const double absDx =
std::abs(rpcRecHit.localPosition().x() -
chamber.tState.localPosition().x());
1044 if (absDx <= 20
or absDx * absDx <= 16 * localError.
xx())
1045 matchedChamber.
rpcMatches.push_back(rpcHitMatch);
1048 muonChamberMatches.push_back(matchedChamber);
1053 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill GEM info";
1060 const auto& lErr =
chamber.tState.localError();
1061 const auto& lPos =
chamber.tState.localPosition();
1062 const auto& lDir =
chamber.tState.localDirection();
1066 LocalError localError = lErr.positionError();
1067 matchedChamber.
x = lPos.x();
1068 matchedChamber.
y = lPos.y();
1072 matchedChamber.
dXdZ = lDir.z() != 0 ? lDir.x() / lDir.z() : 9999;
1073 matchedChamber.
dYdZ = lDir.z() != 0 ? lDir.y() / lDir.z() : 9999;
1076 matchedChamber.
dXdZErr = trajectoryCovMatrix(1, 1) > 0 ?
sqrt(trajectoryCovMatrix(1, 1)) : 0;
1077 matchedChamber.
dYdZErr = trajectoryCovMatrix(2, 2) > 0 ?
sqrt(trajectoryCovMatrix(2, 2)) : 0;
1095 .rawId() !=
chamber.id.rawId())
1098 gemHitMatch.
x =
gemRecHit.localPosition().x();
1099 gemHitMatch.
mask = 0;
1103 if (absDx <= 5
or absDx * absDx <= 16 * localError.
xx())
1107 muonChamberMatches.push_back(matchedChamber);
1113 LogTrace(
"MuonIdentification") <<
"number of muon chambers: " << aMuon.
matches().size() <<
"\n" 1114 <<
"number of chambers with segments according to the associator requirements: " 1115 << nubmerOfMatchesAccordingToTrackAssociator;
1116 LogTrace(
"MuonIdentification") <<
"number of segment matches with the producer requirements: " 1127 if (
muon->isTrackerMuon()) {
1134 if ((
muon->type() & (~
mask)) == 0) {
1153 std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> > chamberPairs;
1154 std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> > stationPairs;
1155 std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> >
1159 for (
unsigned int muonIndex1 = 0; muonIndex1 < pOutputMuons->size(); ++muonIndex1) {
1160 auto& muon1 = pOutputMuons->at(muonIndex1);
1162 for (
auto& chamber1 : muon1.matches()) {
1164 std::vector<reco::MuonSegmentMatch>* segmentMatches1 =
getSegmentMatches(chamber1, muonType);
1166 if (segmentMatches1->empty())
1168 chamberPairs.clear();
1170 for (
auto& segment1 : *segmentMatches1) {
1171 chamberPairs.push_back(std::make_pair(&chamber1, &segment1));
1172 if (!segment1.isMask())
1174 arbitrationPairs.clear();
1175 arbitrationPairs.push_back(std::make_pair(&chamber1, &segment1));
1179 if (muon1.type() & muonType) {
1181 for (
unsigned int muonIndex2 = muonIndex1 + 1; muonIndex2 < pOutputMuons->size(); ++muonIndex2) {
1182 auto& muon2 = pOutputMuons->at(muonIndex2);
1184 if (!(muon2.type() & muonType))
1187 for (
auto& chamber2 : muon2.matches()) {
1189 std::vector<reco::MuonSegmentMatch>* segmentMatches2 =
getSegmentMatches(chamber2, muonType);
1190 for (
auto& segment2 : *segmentMatches2) {
1191 if (segment2.isMask())
1196 approxEqual(segment2.dXdZErr, segment1.dXdZErr) &&
1197 approxEqual(segment2.dYdZErr, segment1.dYdZErr)) {
1198 arbitrationPairs.push_back(std::make_pair(&chamber2, &segment2));
1206 if (arbitrationPairs.empty())
1208 if (arbitrationPairs.size() == 1) {
1215 sort(arbitrationPairs.begin(),
1216 arbitrationPairs.end(),
1219 sort(arbitrationPairs.begin(),
1220 arbitrationPairs.end(),
1223 sort(arbitrationPairs.begin(),
1224 arbitrationPairs.end(),
1227 sort(arbitrationPairs.begin(),
1228 arbitrationPairs.end(),
1231 for (
auto& ap : arbitrationPairs) {
1240 for (
auto& segment2 : chamber1.segmentMatches) {
1241 if (segment1.cscSegmentRef.isNull() || segment2.cscSegmentRef.isNull())
1243 if (
meshAlgo_->isDuplicateOf(segment1.cscSegmentRef, segment2.cscSegmentRef) &&
1244 (segment2.mask & 0x1e0000) && (segment1.mask & 0x1e0000)) {
1254 if (chamberPairs.empty())
1256 if (chamberPairs.size() == 1) {
1262 sort(chamberPairs.begin(),
1266 sort(chamberPairs.begin(),
1270 sort(chamberPairs.begin(),
1274 sort(chamberPairs.begin(),
1283 for (
int detectorIndex = 1; detectorIndex <= 5;
1286 stationPairs.clear();
1289 for (
auto&
chamber : muon1.matches()) {
1293 if (segmentMatches->empty())
1296 for (
auto& segment : *segmentMatches) {
1297 stationPairs.push_back(std::make_pair(&
chamber, &segment));
1301 if (stationPairs.empty())
1303 if (stationPairs.size() == 1) {
1309 sort(stationPairs.begin(),
1313 sort(stationPairs.begin(),
1317 sort(stationPairs.begin(),
1321 sort(stationPairs.begin(),
1353 <<
"Failed to compute muon isolation information for a muon with undefined references to tracks";
1362 if (caloDeps.size() != 3) {
1363 LogTrace(
"MuonIdentification") <<
"Failed to fill vector of calorimeter isolation deposits!";
1415 if (muonId.
sector() <= 12)
1417 if (muonId.
sector() == 13)
1419 if (muonId.
sector() == 14)
1432 if (
muon.isStandAloneMuon())
1433 return muon.standAloneMuon()->innerPosition().phi();
1435 if (
muon.matches().empty()) {
1436 if (
muon.innerTrack().isAvailable() &&
muon.innerTrack()->extra().isAvailable())
1437 return muon.innerTrack()->outerPosition().phi();
1466 const bool trackBAD =
links->trackerTrack().isNull();
1467 const bool staBAD =
links->standAloneTrack().isNull();
1468 const bool glbBAD =
links->globalTrack().isNull();
1469 if (trackBAD || staBAD || glbBAD) {
1470 edm::LogWarning(
"muonIDbadLinks") <<
"Global muon links to constituent tracks are invalid: trkBad " << trackBAD
1471 <<
" standaloneBad " << staBAD <<
" globalBad " << glbBAD
1472 <<
". There should be no such object. Muon is skipped.";
1480 desc.setAllowAnything();
1482 desc.add<
bool>(
"arbitrateTrackerMuons",
false);
1483 desc.add<
bool>(
"storeCrossedHcalRecHits",
false);
1484 desc.add<
bool>(
"fillShowerDigis",
false);
1493 descTrkAsoPar.
add<
bool>(
"useGEM",
false);
1494 descTrkAsoPar.
add<
bool>(
"useME0",
false);
std::string hoDepositName_
constexpr double deltaPhi(double phi1, double phi2)
MuonQuality combinedQuality() const
get energy deposition information
static const unsigned int BelongsToTrackByME1aClean
std::string jetDepositName_
bool isGoodRPCMuon(const reco::Muon &muon)
bool approxEqual(const double a, const double b, const double tol=1E-3) const
edm::EDGetTokenT< reco::TrackCollection > innerTrackCollectionToken_
reco::Muon makeMuon(edm::Event &iEvent, const edm::EventSetup &iSetup, const reco::TrackRef &track, TrackType type)
T getParameter(std::string const &) const
GEMSegmentRef gemSegmentRef
static const unsigned int GlobalMuon
void fillMuonIsolation(edm::Event &, const edm::EventSetup &, reco::Muon &aMuon, reco::IsoDeposit &trackDep, reco::IsoDeposit &ecalDep, reco::IsoDeposit &hcalDep, reco::IsoDeposit &hoDep, reco::IsoDeposit &jetDep)
edm::EDGetTokenT< edm::ValueMap< reco::MuonQuality > > glbQualToken_
DTRecSegment4DRef dtSegmentRef
TrackRef combinedMuon() const override
reference to a stand-alone muon Track
std::vector< reco::MuonSegmentMatch > gemMatches
static bool crossedIP(const reco::Track &track)
float sumPt
sum-pt of tracks
static void truthMatchMuon(const edm::Event &iEvent, const GlobalTrackingGeometry &iGeometry, reco::Muon &aMuon)
TrackDetectorAssociator trackAssociator_
CSCSegmentRef cscSegmentRef
std::unique_ptr< MuonKinkFinder > trackerKinkFinder_
static const unsigned int Arbitrated
segment mask flags
void fillMuonId(edm::Event &, const edm::EventSetup &, reco::Muon &, TrackDetectorAssociator::Direction direction=TrackDetectorAssociator::InsideOut)
void setAllowAnything()
allow any parameter label/value pairs
edm::Handle< reco::MuonTrackLinksCollection > linkCollectionHandle_
edm::EDGetTokenT< RPCRecHitCollection > rpcHitToken_
const edm::ESGetToken< Propagator, TrackingComponentsRecord > propagatorToken_
bool isGoodGEMMuon(const reco::Muon &muon)
int overlap(const reco::Muon &muon, const reco::Track &track)
bool fillCaloCompatibility_
std::string trackDepositName_
void fillArbitrationInfo(reco::MuonCollection *, unsigned int muonType=reco::Muon::TrackerMuon)
T const * product() const
std::vector< reco::MuonGEMHitMatch > gemHitMatches
std::vector< CaloMuon > CaloMuonCollection
collection of Muon objects
const edm::ESGetToken< CSCGeometry, MuonGeometryRecord > geomTokenRun_
void loadParameters(const edm::ParameterSet &, edm::ConsumesCollector &)
void produce(edm::Event &, const edm::EventSetup &) override
float hadVetoEt
hcal sum-et in the veto region in r-phi
float emS9
energy deposited in 3x3 ECAL crystal shape around central crystal
double p() const
momentum vector magnitude
double evaluate(const reco::Muon &)
bool isNonnull() const
Checks for non-null.
std::vector< Vertex > VertexCollection
collection of Vertex objects
MuonCaloCompatibility muonCaloCompatibility_
static const unsigned int BestInStationByDRSlope
edm::EDGetTokenT< reco::TrackToTrackMap > pickyCollectionToken_
static std::string toStr(const ICTypeKey k)
bool arbitrateTrackerMuons_
static const unsigned int BelongsToTrackByDXSlope
void setCalEnergy(const MuonEnergy &calEnergy)
set energy deposition information
void fillGlbQuality(edm::Event &, const edm::EventSetup &, reco::Muon &aMuon)
TrackRef track() const override
reference to a Track
float trkRelChi2
chi2 value for the inner track stub with respect to the global track
std::unique_ptr< reco::isodeposit::IsoDepositExtractor > muIsoExtractorTrack_
float towerS9
total energy in 3x3 tower shape
static const unsigned int BestInStationByDR
std::vector< Muon > MuonCollection
collection of Muon objects
bool isTrackerMuon() const override
std::unique_ptr< MuonTimingFiller > theTimingFiller_
float ecal_time
Calorimeter timing.
constexpr std::array< uint8_t, layerIndexSize > layer
float ho
energy deposited in crossed HO towers
virtual void setTunePBestTrack(MuonTrackType muonType)
double phiOfMuonInteractionRegion(const reco::Muon &muon) const
edm::ESGetToken< GlobalTrackingGeometry, GlobalTrackingGeometryRecord > globalGeomToken_
std::unique_ptr< reco::isodeposit::IsoDepositExtractor > muIsoExtractorCalo_
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
void init(edm::Event &, const edm::EventSetup &)
virtual void setInnerTrack(const TrackRef &t)
set reference to Track
float caloCompatibility() const
DetId hcal_id
DetId of the central HCAL tower with smallest depth.
edm::EDGetTokenT< reco::TrackToTrackMap > tpfmsCollectionToken_
std::vector< reco::MuonSegmentMatch > me0Matches
std::unique_ptr< MuonShowerDigiFiller > theShowerDigiFiller_
edm::Handle< reco::VertexCollection > pvHandle_
double ptThresholdToFillCandidateP4WithGlobalFit_
void addDefault(ParameterSetDescription const &psetDescription)
reco::Muon::MuonTrackTypePair sigmaSwitch(const reco::TrackRef &combinedTrack, const reco::TrackRef &trackerTrack, const double nSigma=2., const double ptThreshold=200.)
TrackAssociatorParameters parameters_
bool isGoodME0Muon(const reco::Muon &muon)
reco::Muon::MuonTrackTypePair tevOptimized(const reco::TrackRef &combinedTrack, const reco::TrackRef &trackerTrack, const reco::TrackRef &tpfmsTrack, const reco::TrackRef &pickyTrack, const reco::TrackRef &dytTrack, const double ptThreshold=200., const double tune1=17., const double tune2=40., const double dptcut=0.25)
void fillTrackerKink(reco::Muon &aMuon)
void setPropagator(const Propagator *)
use a user configured propagator
float emS25
energy deposited in 5x5 ECAL crystal shape around central crystal
reco::TrackRef globalTrack() const
get the combined track
static const unsigned int ME0Muon
ArbitrationType
define arbitration schemes
bool isGoodTrackerMuon(const reco::Muon &muon)
double candEnergy() const
Get energy or pT attached to cand trajectory.
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
int nJets
number of jets in the cone
static const unsigned int BestInChamberByDX
std::string ecalDepositName_
bool checkLinks(const reco::MuonTrackLinks *) const
float timeAtIpOutIn
b) particle is moving from outside in
int nDof
number of muon stations used
bool isCaloCompatibilityValid() const
Abs< T >::type abs(const T &t)
edm::EDGetTokenT< reco::MuonCollection > muonCollectionToken_
edm::EDGetTokenT< reco::TrackCollection > outerTrackCollectionToken_
edm::Handle< RPCRecHitCollection > rpcHitHandle_
float hoS9
energy deposited in 3x3 HO tower shape around central tower
std::vector< reco::MuonRPCHitMatch > rpcMatches
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
bool getData(T &iHolder) const
static const unsigned int BestInChamberByDR
TrackRef standAloneMuon() const override
reference to a stand-alone muon Track
ME0SegmentRef me0SegmentRef
virtual TrackRef innerTrack() const
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::Handle< reco::TrackToTrackMap > dytCollectionHandle_
bool isNull() const
Checks for null.
edm::Handle< reco::TrackCollection > outerTrackCollectionHandle_
edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkCollectionToken_
static const unsigned int BestInStationByDXSlope
math::XYZPointF hcal_position
bool fillGlobalTrackRefits_
static double sectorPhi(const DetId &id)
void setMuonTrack(const MuonTrackType &, const TrackRef &)
float hoVetoEt
ho sum-et in the veto region in r-phi
double depositWithin(double coneSize, const Vetos &vetos=Vetos(), bool skipDepositVeto=false) const
Get deposit.
edm::EDGetTokenT< GEMRecHitCollection > gemHitToken_
reco::CaloMuon makeCaloMuon(const reco::Muon &)
int nTracks
number of tracks in the cone (excluding veto region)
static const unsigned int BestInChamberByDXSlope
float emMax
maximal energy of ECAL crystal in the 5x5 shape
void setCaloCompatibility(float input)
static const unsigned int RPCMuon
int numberOfMatches(ArbitrationType type=SegmentAndTrackArbitration) const
get number of chambers with matched segments
static ICTypeKey toKey(const std::string &s)
std::vector< reco::MuonSegmentMatch > * getSegmentMatches(reco::MuonChamberMatch &chamber, unsigned int muonType) const
get the segment matches of the appropriate type
static const unsigned int TrackerMuon
float emVetoEt
ecal sum-et in the veto region in r-phi
void configure(const edm::ParameterSet &)
bool isQualityValid() const
std::vector< ICTypes::ICTypeKey > inputCollectionTypes_
float hadMax
maximal energy of HCAL tower in the 3x3 shape
constexpr uint32_t rawId() const
get the raw id
CSCDetId chamberId() const
static const unsigned int BelongsToTrackByDRSlope
edm::Handle< GEMRecHitCollection > gemHitHandle_
virtual void setInnerTrack(const TrackRef &t)
set reference to Track
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
void setCombinedQuality(const MuonQuality &combinedQuality)
set energy deposition information
std::vector< edm::InputTag > inputCollectionLabels_
static const unsigned int PFMuon
std::vector< MuonChamberMatch > & matches()
get muon matching information
std::unique_ptr< reco::isodeposit::IsoDepositExtractor > muIsoExtractorJet_
void setCalEnergy(const MuonEnergy &calEnergy)
set energy deposition information
MuonIdProducer(const edm::ParameterSet &)
void arbitrateMuons(reco::MuonCollection *, reco::CaloMuonCollection *)
std::vector< reco::MuonSegmentMatch > segmentMatches
bool fillGlobalTrackQuality_
DetId ecal_id
DetId of the central ECAL crystal.
virtual void setOuterTrack(const TrackRef &t)
set reference to Track
static const unsigned int BelongsToTrackByDR
std::string hcalDepositName_
~MuonIdProducer() override
unsigned int chamberId(const DetId &)
reco::TrackRef getTevRefitTrack(const reco::TrackRef &combinedTrack, const reco::TrackToTrackMap &map)
static const unsigned int BelongsToTrackByDX
void setIsolation(const MuonIsolation &isoR03, const MuonIsolation &isoR05)
virtual void setBestTrack(MuonTrackType muonType)
functor predicate for standard library sort algorithm
static const unsigned int GEMMuon
edm::Handle< reco::TrackToTrackMap > tpfmsCollectionHandle_
T const * get() const
Returns C++ pointer to the item.
static const unsigned int BestInStationByDX
TrackDetMatchInfo associate(const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
bool storeCrossedHcalRecHits_
edm::Handle< reco::TrackCollection > innerTrackCollectionHandle_
bool isGoodTrack(const reco::Track &track)
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
edm::EDGetTokenT< reco::VertexCollection > pvToken_
int triggerSector() const
MuonTrackType
map for Global Muon refitters
double sigmaThresholdToFillCandidateP4WithGlobalFit_
static const unsigned int StandAloneMuon
std::vector< HcalMuonRecHit > crossedHadRecHits
Log< level::Warning, false > LogWarning
std::pair< TrackRef, Muon::MuonTrackType > MuonTrackTypePair
void setMatches(const std::vector< MuonChamberMatch > &matches)
set muon matching information
math::XYZPointF ecal_position
Trajectory position at the calorimeter.
static const unsigned int BestInChamberByDRSlope
bool validateGlobalMuonPair(const reco::MuonTrackLinks &goodMuon, const reco::MuonTrackLinks &badMuon)
bool debugWithTruthMatching_
bool isGoodCaloMuon(const reco::CaloMuon &muon)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool isGlobalMuon() const override
virtual void setGlobalTrack(const TrackRef &t)
set reference to Track
Power< A, B >::type pow(const A &a, const B &b)
float trackerVetoPt
(sum-)pt inside the veto region in r-phi
float hadS9
energy deposited in 3x3 HCAL tower shape around central tower
edm::Handle< reco::MuonCollection > muonCollectionHandle_
std::pair< double, int > depositAndCountWithin(double coneSize, const Vetos &vetos=Vetos(), double threshold=-1e+36, bool skipDepositVeto=false) const
Get deposit.
edm::Handle< edm::ValueMap< reco::MuonQuality > > glbQualHandle_
void beginRun(const edm::Run &, const edm::EventSetup &) override
edm::Handle< reco::TrackToTrackMap > pickyCollectionHandle_
std::unique_ptr< MuonMesh > meshAlgo_
edm::EDGetTokenT< reco::TrackToTrackMap > dytCollectionToken_