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);
270 LogTrace(
"MuonIdentification") <<
"Creating a muon from a track " <<
track.get()->pt()
271 <<
" Pt (GeV), eta: " <<
track.get()->eta();
274 LogTrace(
"MuonIdentification") <<
"Muon created from a track ";
277 aMuon.setBestTrack(
type);
278 aMuon.setTunePBestTrack(
type);
281 <<
"Muon created from a track and setMuonBestTrack, setBestTrack and setTunePBestTrack called";
287 LogTrace(
"MuonIdentification") <<
"Creating a CaloMuon from a Muon";
292 if (
muon.isEnergyValid())
301 LogTrace(
"MuonIdentification") <<
"Creating a muon from a link to tracks object";
308 bool useSigmaSwitch =
false;
316 if (tpfmsRef.
isNull() && pickyRef.isNull() && dytRef.isNull()) {
317 edm::LogWarning(
"MakeMuonWithTEV") <<
"Failed to get TEV refits, fall back to sigma switch.";
318 useSigmaSwitch =
true;
321 useSigmaSwitch =
true;
324 if (useSigmaSwitch) {
326 links.trackerTrack(),
331 links.trackerTrack(),
337 aMuon =
makeMuon(*chosenTrack.first);
366 const double p =
track.p();
369 LogTrace(
"MuonIdentification") <<
"Skipped low momentum track (Pt,P): " <<
pt <<
", " <<
track.p() <<
" GeV";
377 LogTrace(
"MuonIdentification") <<
"Skipped track with large pseudo rapidity (Eta: " <<
track.eta() <<
" )";
388 const auto subdetId =
id.subdetId();
399 if (!
muon.isMatchesValid() ||
track.extra().isNull() ||
track.extra()->recHitsSize() == 0)
402 int numberOfCommonDetIds = 0;
403 const std::vector<reco::MuonChamberMatch>&
matches(
muon.matches());
405 if (
match.segmentMatches.empty())
408 bool foundCommonDetId =
false;
409 for (
auto hit =
track.extra()->recHitsBegin();
hit !=
track.extra()->recHitsEnd(); ++
hit) {
415 foundCommonDetId =
true;
419 if (foundCommonDetId) {
420 ++numberOfCommonDetIds;
424 return numberOfCommonDetIds;
435 const int nHitsGood = goodMuon.
globalTrack()->hitPattern().numberOfValidMuonHits();
436 const int nHitsBad = badMuon.
globalTrack()->hitPattern().numberOfValidMuonHits();
437 if (
std::min(nHitsGood, nHitsBad) > 10) {
438 const double chi2Good = goodMuon.
globalTrack()->normalizedChi2();
439 const double chi2Bad = badMuon.
globalTrack()->normalizedChi2();
440 return (chi2Good <= chi2Bad);
443 return (nHitsGood >= nHitsBad);
447 auto outputMuons = std::make_unique<reco::MuonCollection>();
448 auto caloMuons = std::make_unique<reco::CaloMuonCollection>();
460 outputMuons->push_back(
muon);
467 std::vector<bool> goodmuons(nLink,
true);
470 for (
unsigned int i = 0;
i < nLink - 1; ++
i) {
472 if (iLink.trackerTrack().isNull() || !
checkLinks(&iLink))
474 for (
unsigned int j =
i + 1;
j < nLink; ++
j) {
478 if (iLink.trackerTrack() == jLink.trackerTrack()) {
484 goodmuons[
j] =
false;
486 goodmuons[
i] =
false;
491 for (
unsigned int i = 0;
i < nLink - 1; ++
i) {
495 if (iLink.standAloneTrack().isNull() || !
checkLinks(&iLink))
497 for (
unsigned int j =
i + 1;
j < nLink; ++
j) {
503 if (iLink.standAloneTrack() == jLink.standAloneTrack()) {
505 goodmuons[
j] =
false;
507 goodmuons[
i] =
false;
512 for (
unsigned int i = 0;
i < nLink; ++
i) {
520 for (
const auto&
muon : *outputMuons) {
521 if (
muon.track() == iLink.trackerTrack() &&
muon.standAloneMuon() == iLink.standAloneTrack() &&
522 muon.combinedMuon() == iLink.globalTrack()) {
528 outputMuons->push_back(
makeMuon(iLink));
536 LogTrace(
"MuonIdentification") <<
"Creating tracker muons";
537 std::vector<TrackDetectorAssociator::Direction> directions1, directions2;
553 if (!(*recoVertices)[0].isFake())
557 bool splitTrack =
false;
560 const auto&
directions = splitTrack ? directions1 : directions2;
589 for (
auto&
muon : *outputMuons) {
607 LogTrace(
"MuonIdentification") <<
"Found a corresponding global muon. Set energy, matches and move on";
612 if (goodTrackerMuon || goodRPCMuon || goodGEMMuon || goodME0Muon) {
615 LogTrace(
"MuonIdentification") <<
"track failed minimal number of muon matches requirement";
627 LogTrace(
"MuonIdentification") <<
"Looking for new muons among stand alone muon tracks";
633 for (
auto&
muon : *outputMuons) {
634 if (!
muon.standAloneMuon().isNull()) {
636 if (
muon.standAloneMuon().get() == &outerTrack) {
649 LogTrace(
"MuonIdentification") <<
"Found associated tracker muon. Set a reference and move on";
658 LogTrace(
"MuonIdentification") <<
"No associated stand alone track is found. Making a muon";
659 outputMuons->push_back(
671 LogTrace(
"MuonIdentification") <<
"Dress up muons if it's necessary";
673 const int nMuons = outputMuons->size();
675 std::vector<reco::MuonTimeExtra> dtTimeColl(
nMuons);
676 std::vector<reco::MuonTimeExtra> cscTimeColl(
nMuons);
677 std::vector<reco::MuonTimeExtra> combinedTimeColl(
nMuons);
678 std::vector<reco::IsoDeposit> trackDepColl(
nMuons);
679 std::vector<reco::IsoDeposit> ecalDepColl(
nMuons);
680 std::vector<reco::IsoDeposit> hcalDepColl(
nMuons);
681 std::vector<reco::IsoDeposit> hoDepColl(
nMuons);
682 std::vector<reco::IsoDeposit> jetDepColl(
nMuons);
685 for (
unsigned int i = 0;
i < outputMuons->size(); ++
i) {
686 auto&
muon = outputMuons->at(
i);
692 if (
muon.isStandAloneMuon()) {
699 LogTrace(
"MuonIdentification") <<
"THIS SHOULD NEVER HAPPEN";
708 LogDebug(
"MuonIdentification") <<
"";
719 iEvent, iSetup,
muon, trackDepColl[
i], ecalDepColl[
i], hcalDepColl[
i], hoDepColl[
i], jetDepColl[
i]);
731 muonTime.
nDof = combinedTime.
nDof();
737 muon.setTime(muonTime);
738 muon.setRPCTime(rpcTime);
739 dtTimeColl[
i] = dtTime;
740 cscTimeColl[
i] = cscTime;
741 combinedTimeColl[
i] = combinedTime;
744 LogTrace(
"MuonIdentification") <<
"number of muons produced: " << outputMuons->size();
754 auto oMap = std::make_unique<MapType>();
756 typename MapType::Filler
filler(*oMap);
757 filler.insert(refH, vec.begin(), vec.end());
763 fillMap(muonHandle, combinedTimeColl,
iEvent,
"combined");
764 fillMap(muonHandle, dtTimeColl,
iEvent,
"dt");
765 fillMap(muonHandle, cscTimeColl,
iEvent,
"csc");
819 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId";
829 <<
"Failed to fill muon id information for a muon with undefined references to tracks";
833 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fillEnergy = " <<
fillEnergy_;
848 for (
auto hit :
info.crossedHcalRecHits) {
859 if (!
info.crossedEcalIds.empty())
861 if (!
info.crossedHcalIds.empty())
865 for (
const auto&
hit :
info.ecalRecHits) {
866 if (
hit->
id() != emMaxId)
872 for (
const auto&
hit :
info.hcalRecHits) {
873 if (
hit->
id() != hadMaxId)
884 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill muon match info ";
885 std::vector<reco::MuonChamberMatch> muonChamberMatches;
886 unsigned int nubmerOfMatchesAccordingToTrackAssociator = 0;
892 const auto& lErr =
chamber.tState.localError();
893 const auto& lPos =
chamber.tState.localPosition();
894 const auto& lDir =
chamber.tState.localDirection();
896 const auto& localError = lErr.positionError();
897 matchedChamber.
x = lPos.x();
898 matchedChamber.
y = lPos.y();
899 matchedChamber.
xErr =
sqrt(localError.xx());
900 matchedChamber.
yErr =
sqrt(localError.yy());
902 matchedChamber.
dXdZ = lDir.z() != 0 ? lDir.x() / lDir.z() : 9999;
903 matchedChamber.
dYdZ = lDir.z() != 0 ? lDir.y() / lDir.z() : 9999;
906 matchedChamber.
dXdZErr = trajectoryCovMatrix(1, 1) > 0 ?
sqrt(trajectoryCovMatrix(1, 1)) : 0;
907 matchedChamber.
dYdZErr = trajectoryCovMatrix(2, 2) > 0 ?
sqrt(trajectoryCovMatrix(2, 2)) : 0;
921 ++nubmerOfMatchesAccordingToTrackAssociator;
924 for (
const auto& segment :
chamber.segments) {
926 matchedSegment.
x = segment.segmentLocalPosition.x();
927 matchedSegment.
y = segment.segmentLocalPosition.y();
928 matchedSegment.
dXdZ =
929 segment.segmentLocalDirection.z() ? segment.segmentLocalDirection.x() / segment.segmentLocalDirection.z() : 0;
930 matchedSegment.
dYdZ =
931 segment.segmentLocalDirection.z() ? segment.segmentLocalDirection.y() / segment.segmentLocalDirection.z() : 0;
932 matchedSegment.
xErr = segment.segmentLocalErrorXX > 0 ?
sqrt(segment.segmentLocalErrorXX) : 0;
933 matchedSegment.
yErr = segment.segmentLocalErrorYY > 0 ?
sqrt(segment.segmentLocalErrorYY) : 0;
934 matchedSegment.
dXdZErr = segment.segmentLocalErrorDxDz > 0 ?
sqrt(segment.segmentLocalErrorDxDz) : 0;
935 matchedSegment.
dYdZErr = segment.segmentLocalErrorDyDz > 0 ?
sqrt(segment.segmentLocalErrorDyDz) : 0;
936 matchedSegment.
t0 = segment.t0;
937 matchedSegment.
mask = 0;
942 matchedSegment.
hasZed_ = segment.hasZed;
943 matchedSegment.
hasPhi_ = segment.hasPhi;
945 bool matchedX =
false;
946 bool matchedY =
false;
947 LogTrace(
"MuonIdentification") <<
" matching local x, segment x: " << matchedSegment.
x 948 <<
", chamber x: " << matchedChamber.
x <<
", max: " <<
maxAbsDx_;
949 LogTrace(
"MuonIdentification") <<
" matching local y, segment y: " << matchedSegment.
y 950 <<
", chamber y: " << matchedChamber.
y <<
", max: " <<
maxAbsDy_;
951 const double matchedSegChDx =
std::abs(matchedSegment.
x - matchedChamber.
x);
952 const double matchedSegChDy =
std::abs(matchedSegment.
y - matchedChamber.
y);
953 if (matchedSegment.
xErr > 0 && matchedChamber.
xErr > 0)
954 LogTrace(
"MuonIdentification") <<
" xpull: " 957 if (matchedSegment.
yErr > 0 && matchedChamber.
yErr > 0)
958 LogTrace(
"MuonIdentification") <<
" ypull: " 964 else if (matchedSegment.
xErr > 0 && matchedChamber.
xErr > 0) {
966 if (matchedSegChDx * matchedSegChDx <
maxAbsPullX2_ * invMatchedSegChPullX2)
971 else if (matchedSegment.
yErr > 0 && matchedChamber.
yErr > 0) {
973 if (matchedSegChDy * matchedSegChDy <
maxAbsPullY2_ * invMatchedSegChPullY2)
976 if (matchedX && matchedY) {
978 matchedChamber.
me0Matches.push_back(matchedSegment);
980 matchedChamber.
gemMatches.push_back(matchedSegment);
985 muonChamberMatches.push_back(matchedChamber);
989 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill RPC info";
994 const auto& lErr =
chamber.tState.localError();
995 const auto& lPos =
chamber.tState.localPosition();
996 const auto& lDir =
chamber.tState.localDirection();
1000 LocalError localError = lErr.positionError();
1001 matchedChamber.
x = lPos.x();
1002 matchedChamber.
y = lPos.y();
1006 matchedChamber.
dXdZ = lDir.z() != 0 ? lDir.x() / lDir.z() : 9999;
1007 matchedChamber.
dYdZ = lDir.z() != 0 ? lDir.y() / lDir.z() : 9999;
1010 matchedChamber.
dXdZErr = trajectoryCovMatrix(1, 1) > 0 ?
sqrt(trajectoryCovMatrix(1, 1)) : 0;
1011 matchedChamber.
dYdZErr = trajectoryCovMatrix(2, 2) > 0 ?
sqrt(trajectoryCovMatrix(2, 2)) : 0;
1023 if (rpcRecHit.rawId() !=
chamber.id.rawId())
1026 rpcHitMatch.
x = rpcRecHit.localPosition().x();
1027 rpcHitMatch.
mask = 0;
1028 rpcHitMatch.
bx = rpcRecHit.BunchX();
1030 const double absDx =
std::abs(rpcRecHit.localPosition().x() -
chamber.tState.localPosition().x());
1031 if (absDx <= 20
or absDx * absDx <= 16 * localError.
xx())
1032 matchedChamber.
rpcMatches.push_back(rpcHitMatch);
1035 muonChamberMatches.push_back(matchedChamber);
1041 LogTrace(
"MuonIdentification") <<
"number of muon chambers: " << aMuon.
matches().size() <<
"\n" 1042 <<
"number of chambers with segments according to the associator requirements: " 1043 << nubmerOfMatchesAccordingToTrackAssociator;
1044 LogTrace(
"MuonIdentification") <<
"number of segment matches with the producer requirements: " 1055 if (
muon->isTrackerMuon()) {
1061 if ((
muon->type() & (~mask)) == 0) {
1068 muon->setType(
muon->type() & (~
reco::Muon::TrackerMuon));
1080 std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> > chamberPairs;
1081 std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> > stationPairs;
1082 std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> >
1086 for (
unsigned int muonIndex1 = 0; muonIndex1 < pOutputMuons->size(); ++muonIndex1) {
1087 auto& muon1 = pOutputMuons->at(muonIndex1);
1089 for (
auto& chamber1 : muon1.matches()) {
1091 std::vector<reco::MuonSegmentMatch>* segmentMatches1 =
getSegmentMatches(chamber1, muonType);
1093 if (segmentMatches1->empty())
1095 chamberPairs.clear();
1097 for (
auto& segment1 : *segmentMatches1) {
1098 chamberPairs.push_back(std::make_pair(&chamber1, &segment1));
1099 if (!segment1.isMask())
1101 arbitrationPairs.clear();
1102 arbitrationPairs.push_back(std::make_pair(&chamber1, &segment1));
1106 if (muon1.type() & muonType) {
1108 for (
unsigned int muonIndex2 = muonIndex1 + 1; muonIndex2 < pOutputMuons->size(); ++muonIndex2) {
1109 auto& muon2 = pOutputMuons->at(muonIndex2);
1111 if (!(muon2.type() & muonType))
1114 for (
auto& chamber2 : muon2.matches()) {
1116 std::vector<reco::MuonSegmentMatch>* segmentMatches2 =
getSegmentMatches(chamber2, muonType);
1117 for (
auto& segment2 : *segmentMatches2) {
1118 if (segment2.isMask())
1123 approxEqual(segment2.dXdZErr, segment1.dXdZErr) &&
1124 approxEqual(segment2.dYdZErr, segment1.dYdZErr)) {
1125 arbitrationPairs.push_back(std::make_pair(&chamber2, &segment2));
1133 if (arbitrationPairs.empty())
1135 if (arbitrationPairs.size() == 1) {
1142 sort(arbitrationPairs.begin(),
1143 arbitrationPairs.end(),
1146 sort(arbitrationPairs.begin(),
1147 arbitrationPairs.end(),
1150 sort(arbitrationPairs.begin(),
1151 arbitrationPairs.end(),
1154 sort(arbitrationPairs.begin(),
1155 arbitrationPairs.end(),
1158 for (
auto& ap : arbitrationPairs) {
1167 for (
auto& segment2 : chamber1.segmentMatches) {
1168 if (segment1.cscSegmentRef.isNull() || segment2.cscSegmentRef.isNull())
1170 if (
meshAlgo_->isDuplicateOf(segment1.cscSegmentRef, segment2.cscSegmentRef) &&
1171 (segment2.mask & 0x1e0000) && (segment1.mask & 0x1e0000)) {
1181 if (chamberPairs.empty())
1183 if (chamberPairs.size() == 1) {
1189 sort(chamberPairs.begin(),
1193 sort(chamberPairs.begin(),
1197 sort(chamberPairs.begin(),
1201 sort(chamberPairs.begin(),
1210 for (
int detectorIndex = 1; detectorIndex <= 5;
1213 stationPairs.clear();
1216 for (
auto&
chamber : muon1.matches()) {
1220 if (segmentMatches->empty())
1223 for (
auto& segment : *segmentMatches) {
1224 stationPairs.push_back(std::make_pair(&
chamber, &segment));
1228 if (stationPairs.empty())
1230 if (stationPairs.size() == 1) {
1236 sort(stationPairs.begin(),
1240 sort(stationPairs.begin(),
1244 sort(stationPairs.begin(),
1248 sort(stationPairs.begin(),
1280 <<
"Failed to compute muon isolation information for a muon with undefined references to tracks";
1289 if (caloDeps.size() != 3) {
1290 LogTrace(
"MuonIdentification") <<
"Failed to fill vector of calorimeter isolation deposits!";
1342 if (muonId.
sector() <= 12)
1344 if (muonId.
sector() == 13)
1346 if (muonId.
sector() == 14)
1359 if (
muon.isStandAloneMuon())
1360 return muon.standAloneMuon()->innerPosition().phi();
1362 if (
muon.matches().empty()) {
1363 if (
muon.innerTrack().isAvailable() &&
muon.innerTrack()->extra().isAvailable())
1364 return muon.innerTrack()->outerPosition().phi();
1393 const bool trackBAD =
links->trackerTrack().isNull();
1394 const bool staBAD =
links->standAloneTrack().isNull();
1395 const bool glbBAD =
links->globalTrack().isNull();
1396 if (trackBAD || staBAD || glbBAD) {
1397 edm::LogWarning(
"muonIDbadLinks") <<
"Global muon links to constituent tracks are invalid: trkBad " << trackBAD
1398 <<
" standaloneBad " << staBAD <<
" globalBad " << glbBAD
1399 <<
". There should be no such object. Muon is skipped.";
1407 desc.setAllowAnything();
1409 desc.add<
bool>(
"arbitrateTrackerMuons",
false);
1410 desc.add<
bool>(
"storeCrossedHcalRecHits",
false);
1411 desc.add<
bool>(
"fillShowerDigis",
false);
1420 descTrkAsoPar.
add<
bool>(
"useGEM",
false);
1421 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< 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.
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.
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
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_