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) {
653 LogTrace(
"MuonIdentification") <<
"Found associated tracker muon. Set a reference and move on";
662 LogTrace(
"MuonIdentification") <<
"No associated stand alone track is found. Making a muon";
663 outputMuons->push_back(
675 LogTrace(
"MuonIdentification") <<
"Dress up muons if it's necessary";
677 const int nMuons = outputMuons->size();
679 std::vector<reco::MuonTimeExtra> dtTimeColl(
nMuons);
680 std::vector<reco::MuonTimeExtra> cscTimeColl(
nMuons);
681 std::vector<reco::MuonTimeExtra> combinedTimeColl(
nMuons);
682 std::vector<reco::IsoDeposit> trackDepColl(
nMuons);
683 std::vector<reco::IsoDeposit> ecalDepColl(
nMuons);
684 std::vector<reco::IsoDeposit> hcalDepColl(
nMuons);
685 std::vector<reco::IsoDeposit> hoDepColl(
nMuons);
686 std::vector<reco::IsoDeposit> jetDepColl(
nMuons);
689 for (
unsigned int i = 0;
i < outputMuons->size(); ++
i) {
690 auto&
muon = outputMuons->at(
i);
696 if (
muon.isStandAloneMuon()) {
703 LogTrace(
"MuonIdentification") <<
"THIS SHOULD NEVER HAPPEN";
712 LogDebug(
"MuonIdentification") <<
"";
723 iEvent, iSetup,
muon, trackDepColl[
i], ecalDepColl[
i], hcalDepColl[
i], hoDepColl[
i], jetDepColl[
i]);
735 muonTime.
nDof = combinedTime.
nDof();
741 muon.setTime(muonTime);
742 muon.setRPCTime(rpcTime);
743 dtTimeColl[
i] = dtTime;
744 cscTimeColl[
i] = cscTime;
745 combinedTimeColl[
i] = combinedTime;
748 LogTrace(
"MuonIdentification") <<
"number of muons produced: " << outputMuons->size();
758 auto oMap = std::make_unique<MapType>();
760 typename MapType::Filler
filler(*oMap);
761 filler.insert(refH, vec.begin(), vec.end());
767 fillMap(muonHandle, combinedTimeColl,
iEvent,
"combined");
768 fillMap(muonHandle, dtTimeColl,
iEvent,
"dt");
769 fillMap(muonHandle, cscTimeColl,
iEvent,
"csc");
827 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId";
837 <<
"Failed to fill muon id information for a muon with undefined references to tracks";
841 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fillEnergy = " <<
fillEnergy_;
856 for (
auto hit :
info.crossedHcalRecHits) {
867 if (!
info.crossedEcalIds.empty())
869 if (!
info.crossedHcalIds.empty())
873 for (
const auto&
hit :
info.ecalRecHits) {
874 if (
hit->
id() != emMaxId)
880 for (
const auto&
hit :
info.hcalRecHits) {
881 if (
hit->
id() != hadMaxId)
892 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill muon match info ";
893 std::vector<reco::MuonChamberMatch> muonChamberMatches;
894 unsigned int nubmerOfMatchesAccordingToTrackAssociator = 0;
903 const auto& lErr =
chamber.tState.localError();
904 const auto& lPos =
chamber.tState.localPosition();
905 const auto& lDir =
chamber.tState.localDirection();
907 const auto& localError = lErr.positionError();
908 matchedChamber.
x = lPos.x();
909 matchedChamber.
y = lPos.y();
910 matchedChamber.
xErr =
sqrt(localError.xx());
911 matchedChamber.
yErr =
sqrt(localError.yy());
913 matchedChamber.
dXdZ = lDir.z() != 0 ? lDir.x() / lDir.z() : 9999;
914 matchedChamber.
dYdZ = lDir.z() != 0 ? lDir.y() / lDir.z() : 9999;
917 matchedChamber.
dXdZErr = trajectoryCovMatrix(1, 1) > 0 ?
sqrt(trajectoryCovMatrix(1, 1)) : 0;
918 matchedChamber.
dYdZErr = trajectoryCovMatrix(2, 2) > 0 ?
sqrt(trajectoryCovMatrix(2, 2)) : 0;
932 ++nubmerOfMatchesAccordingToTrackAssociator;
935 for (
const auto& segment :
chamber.segments) {
937 matchedSegment.
x = segment.segmentLocalPosition.x();
938 matchedSegment.
y = segment.segmentLocalPosition.y();
939 matchedSegment.
dXdZ =
940 segment.segmentLocalDirection.z() ? segment.segmentLocalDirection.x() / segment.segmentLocalDirection.z() : 0;
941 matchedSegment.
dYdZ =
942 segment.segmentLocalDirection.z() ? segment.segmentLocalDirection.y() / segment.segmentLocalDirection.z() : 0;
943 matchedSegment.
xErr = segment.segmentLocalErrorXX > 0 ?
sqrt(segment.segmentLocalErrorXX) : 0;
944 matchedSegment.
yErr = segment.segmentLocalErrorYY > 0 ?
sqrt(segment.segmentLocalErrorYY) : 0;
945 matchedSegment.
dXdZErr = segment.segmentLocalErrorDxDz > 0 ?
sqrt(segment.segmentLocalErrorDxDz) : 0;
946 matchedSegment.
dYdZErr = segment.segmentLocalErrorDyDz > 0 ?
sqrt(segment.segmentLocalErrorDyDz) : 0;
947 matchedSegment.
t0 = segment.t0;
948 matchedSegment.
mask = 0;
953 matchedSegment.
hasZed_ = segment.hasZed;
954 matchedSegment.
hasPhi_ = segment.hasPhi;
956 bool matchedX =
false;
957 bool matchedY =
false;
958 LogTrace(
"MuonIdentification") <<
" matching local x, segment x: " << matchedSegment.
x 959 <<
", chamber x: " << matchedChamber.
x <<
", max: " <<
maxAbsDx_;
960 LogTrace(
"MuonIdentification") <<
" matching local y, segment y: " << matchedSegment.
y 961 <<
", chamber y: " << matchedChamber.
y <<
", max: " <<
maxAbsDy_;
962 const double matchedSegChDx =
std::abs(matchedSegment.
x - matchedChamber.
x);
963 const double matchedSegChDy =
std::abs(matchedSegment.
y - matchedChamber.
y);
964 if (matchedSegment.
xErr > 0 && matchedChamber.
xErr > 0)
965 LogTrace(
"MuonIdentification") <<
" xpull: " 968 if (matchedSegment.
yErr > 0 && matchedChamber.
yErr > 0)
969 LogTrace(
"MuonIdentification") <<
" ypull: " 975 else if (matchedSegment.
xErr > 0 && matchedChamber.
xErr > 0) {
977 if (matchedSegChDx * matchedSegChDx <
maxAbsPullX2_ * invMatchedSegChPullX2)
982 else if (matchedSegment.
yErr > 0 && matchedChamber.
yErr > 0) {
984 if (matchedSegChDy * matchedSegChDy <
maxAbsPullY2_ * invMatchedSegChPullY2)
987 if (matchedX && matchedY) {
989 matchedChamber.
me0Matches.push_back(matchedSegment);
991 matchedChamber.
gemMatches.push_back(matchedSegment);
996 muonChamberMatches.push_back(matchedChamber);
1000 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill RPC info";
1005 const auto& lErr =
chamber.tState.localError();
1006 const auto& lPos =
chamber.tState.localPosition();
1007 const auto& lDir =
chamber.tState.localDirection();
1011 LocalError localError = lErr.positionError();
1012 matchedChamber.
x = lPos.x();
1013 matchedChamber.
y = lPos.y();
1017 matchedChamber.
dXdZ = lDir.z() != 0 ? lDir.x() / lDir.z() : 9999;
1018 matchedChamber.
dYdZ = lDir.z() != 0 ? lDir.y() / lDir.z() : 9999;
1021 matchedChamber.
dXdZErr = trajectoryCovMatrix(1, 1) > 0 ?
sqrt(trajectoryCovMatrix(1, 1)) : 0;
1022 matchedChamber.
dYdZErr = trajectoryCovMatrix(2, 2) > 0 ?
sqrt(trajectoryCovMatrix(2, 2)) : 0;
1034 if (rpcRecHit.rawId() !=
chamber.id.rawId())
1037 rpcHitMatch.
x = rpcRecHit.localPosition().x();
1038 rpcHitMatch.
mask = 0;
1039 rpcHitMatch.
bx = rpcRecHit.BunchX();
1041 const double absDx =
std::abs(rpcRecHit.localPosition().x() -
chamber.tState.localPosition().x());
1042 if (absDx <= 20
or absDx * absDx <= 16 * localError.
xx())
1043 matchedChamber.
rpcMatches.push_back(rpcHitMatch);
1046 muonChamberMatches.push_back(matchedChamber);
1051 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill GEM info";
1058 const auto& lErr =
chamber.tState.localError();
1059 const auto& lPos =
chamber.tState.localPosition();
1060 const auto& lDir =
chamber.tState.localDirection();
1064 LocalError localError = lErr.positionError();
1065 matchedChamber.
x = lPos.x();
1066 matchedChamber.
y = lPos.y();
1070 matchedChamber.
dXdZ = lDir.z() != 0 ? lDir.x() / lDir.z() : 9999;
1071 matchedChamber.
dYdZ = lDir.z() != 0 ? lDir.y() / lDir.z() : 9999;
1074 matchedChamber.
dXdZErr = trajectoryCovMatrix(1, 1) > 0 ?
sqrt(trajectoryCovMatrix(1, 1)) : 0;
1075 matchedChamber.
dYdZErr = trajectoryCovMatrix(2, 2) > 0 ?
sqrt(trajectoryCovMatrix(2, 2)) : 0;
1093 .rawId() !=
chamber.id.rawId())
1096 gemHitMatch.
x =
gemRecHit.localPosition().x();
1097 gemHitMatch.
mask = 0;
1101 if (absDx <= 5
or absDx * absDx <= 16 * localError.
xx())
1105 muonChamberMatches.push_back(matchedChamber);
1111 LogTrace(
"MuonIdentification") <<
"number of muon chambers: " << aMuon.
matches().size() <<
"\n" 1112 <<
"number of chambers with segments according to the associator requirements: " 1113 << nubmerOfMatchesAccordingToTrackAssociator;
1114 LogTrace(
"MuonIdentification") <<
"number of segment matches with the producer requirements: " 1125 if (
muon->isTrackerMuon()) {
1132 if ((
muon->type() & (~
mask)) == 0) {
1151 std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> > chamberPairs;
1152 std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> > stationPairs;
1153 std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> >
1157 for (
unsigned int muonIndex1 = 0; muonIndex1 < pOutputMuons->size(); ++muonIndex1) {
1158 auto& muon1 = pOutputMuons->at(muonIndex1);
1160 for (
auto& chamber1 : muon1.matches()) {
1162 std::vector<reco::MuonSegmentMatch>* segmentMatches1 =
getSegmentMatches(chamber1, muonType);
1164 if (segmentMatches1->empty())
1166 chamberPairs.clear();
1168 for (
auto& segment1 : *segmentMatches1) {
1169 chamberPairs.push_back(std::make_pair(&chamber1, &segment1));
1170 if (!segment1.isMask())
1172 arbitrationPairs.clear();
1173 arbitrationPairs.push_back(std::make_pair(&chamber1, &segment1));
1177 if (muon1.type() & muonType) {
1179 for (
unsigned int muonIndex2 = muonIndex1 + 1; muonIndex2 < pOutputMuons->size(); ++muonIndex2) {
1180 auto& muon2 = pOutputMuons->at(muonIndex2);
1182 if (!(muon2.type() & muonType))
1185 for (
auto& chamber2 : muon2.matches()) {
1187 std::vector<reco::MuonSegmentMatch>* segmentMatches2 =
getSegmentMatches(chamber2, muonType);
1188 for (
auto& segment2 : *segmentMatches2) {
1189 if (segment2.isMask())
1194 approxEqual(segment2.dXdZErr, segment1.dXdZErr) &&
1195 approxEqual(segment2.dYdZErr, segment1.dYdZErr)) {
1196 arbitrationPairs.push_back(std::make_pair(&chamber2, &segment2));
1204 if (arbitrationPairs.empty())
1206 if (arbitrationPairs.size() == 1) {
1213 sort(arbitrationPairs.begin(),
1214 arbitrationPairs.end(),
1217 sort(arbitrationPairs.begin(),
1218 arbitrationPairs.end(),
1221 sort(arbitrationPairs.begin(),
1222 arbitrationPairs.end(),
1225 sort(arbitrationPairs.begin(),
1226 arbitrationPairs.end(),
1229 for (
auto& ap : arbitrationPairs) {
1238 for (
auto& segment2 : chamber1.segmentMatches) {
1239 if (segment1.cscSegmentRef.isNull() || segment2.cscSegmentRef.isNull())
1241 if (
meshAlgo_->isDuplicateOf(segment1.cscSegmentRef, segment2.cscSegmentRef) &&
1242 (segment2.mask & 0x1e0000) && (segment1.mask & 0x1e0000)) {
1252 if (chamberPairs.empty())
1254 if (chamberPairs.size() == 1) {
1260 sort(chamberPairs.begin(),
1264 sort(chamberPairs.begin(),
1268 sort(chamberPairs.begin(),
1272 sort(chamberPairs.begin(),
1281 for (
int detectorIndex = 1; detectorIndex <= 5;
1284 stationPairs.clear();
1287 for (
auto&
chamber : muon1.matches()) {
1291 if (segmentMatches->empty())
1294 for (
auto& segment : *segmentMatches) {
1295 stationPairs.push_back(std::make_pair(&
chamber, &segment));
1299 if (stationPairs.empty())
1301 if (stationPairs.size() == 1) {
1307 sort(stationPairs.begin(),
1311 sort(stationPairs.begin(),
1315 sort(stationPairs.begin(),
1319 sort(stationPairs.begin(),
1351 <<
"Failed to compute muon isolation information for a muon with undefined references to tracks";
1360 if (caloDeps.size() != 3) {
1361 LogTrace(
"MuonIdentification") <<
"Failed to fill vector of calorimeter isolation deposits!";
1413 if (muonId.
sector() <= 12)
1415 if (muonId.
sector() == 13)
1417 if (muonId.
sector() == 14)
1430 if (
muon.isStandAloneMuon())
1431 return muon.standAloneMuon()->innerPosition().phi();
1433 if (
muon.matches().empty()) {
1434 if (
muon.innerTrack().isAvailable() &&
muon.innerTrack()->extra().isAvailable())
1435 return muon.innerTrack()->outerPosition().phi();
1464 const bool trackBAD =
links->trackerTrack().isNull();
1465 const bool staBAD =
links->standAloneTrack().isNull();
1466 const bool glbBAD =
links->globalTrack().isNull();
1467 if (trackBAD || staBAD || glbBAD) {
1468 edm::LogWarning(
"muonIDbadLinks") <<
"Global muon links to constituent tracks are invalid: trkBad " << trackBAD
1469 <<
" standaloneBad " << staBAD <<
" globalBad " << glbBAD
1470 <<
". There should be no such object. Muon is skipped.";
1478 desc.setAllowAnything();
1480 desc.add<
bool>(
"arbitrateTrackerMuons",
false);
1481 desc.add<
bool>(
"storeCrossedHcalRecHits",
false);
1482 desc.add<
bool>(
"fillShowerDigis",
false);
1491 descTrkAsoPar.
add<
bool>(
"useGEM",
false);
1492 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_