35 muIsoExtractorCalo_(0),muIsoExtractorTrack_(0),muIsoExtractorJet_(0)
38 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: Constructor called";
40 produces<reco::MuonCollection>();
41 produces<reco::CaloMuonCollection>();
42 produces<reco::MuonTimeExtraMap>(
"combined");
43 produces<reco::MuonTimeExtraMap>(
"dt");
44 produces<reco::MuonTimeExtraMap>(
"csc");
65 if (fillGlobalTrackQuality_) fillTrackerKink_ = iConfig.
getParameter<
bool>(
"fillTrackerKink");
82 if (fillCaloCompatibility_){
102 if (fillIsolation_ && writeIsoDeposits_){
118 throw cms::Exception(
"ConfigurationError") <<
"Number of input collection labels is different from number of types. " <<
119 "For each collection label there should be exactly one collection type specified.";
121 throw cms::Exception(
"ConfigurationError") <<
"Number of input collections should be from 1 to 7.";
125 <<
"========================================================================\n"
126 <<
"Debugging mode with truth matching is turned on!!! Make sure you understand what you are doing!\n"
127 <<
"========================================================================\n";
128 if (fillGlobalTrackQuality_){
130 glbQualToken_ = consumes<edm::ValueMap<reco::MuonQuality> >(glbQualTag);
133 if (fillTrackerKink_) {
142 rpcHitToken_ = consumes<RPCRecHitCollection>(rpcHitTag);
263 LogTrace(
"MuonIdentification") <<
"Creating a muon from a track " << track.
get()->pt() <<
264 " Pt (GeV), eta: " << track.
get()->eta();
267 LogTrace(
"MuonIdentification") <<
"Muon created from a track ";
269 aMuon.setMuonTrack(type,track);
270 aMuon.setBestTrack(type);
271 aMuon.setTunePBestTrack(type);
273 LogTrace(
"MuonIdentification") <<
"Muon created from a track and setMuonBestTrack, setBestTrack and setTunePBestTrack called";
281 LogTrace(
"MuonIdentification") <<
"Creating a CaloMuon from a Muon";
295 LogTrace(
"MuonIdentification") <<
"Creating a muon from a link to tracks object";
302 bool useSigmaSwitch =
false;
311 if (tpfmsRef.
isNull() && pickyRef.isNull() && dytRef.isNull()){
312 edm::LogWarning(
"MakeMuonWithTEV")<<
"Failed to get TEV refits, fall back to sigma switch.";
313 useSigmaSwitch =
true;
316 useSigmaSwitch =
true;
325 tpfmsRef, pickyRef, dytRef,
328 aMuon =
makeMuon(*chosenTrack.first);
356 const double p = track.
p();
357 const double pt = track.
pt();
359 LogTrace(
"MuonIdentification") <<
"Skipped low momentum track (Pt,P): " << pt
360 <<
", " << track.
p() <<
" GeV";
365 const double eta = track.
eta();
366 const double absEta =
std::abs(eta);
368 LogTrace(
"MuonIdentification") <<
"Skipped track with large pseudo rapidity (Eta: " << track.
eta() <<
" )";
379 const auto subdetId =
id.subdetId();
384 return CSCDetId(
id.rawId()).chamberId().rawId();
395 track.
extra()->recHitsSize()==0 )
return 0;
397 int numberOfCommonDetIds = 0;
398 const std::vector<reco::MuonChamberMatch>&
matches( muon.
matches() );
401 if (
match.segmentMatches.empty() )
continue;
403 bool foundCommonDetId =
false;
404 for (
auto hit = track.
extra()->recHitsBegin();
412 foundCommonDetId =
true;
416 if ( foundCommonDetId ) {
417 ++numberOfCommonDetIds;
421 return numberOfCommonDetIds;
436 const int nHitsGood = goodMuon.
globalTrack()->hitPattern().numberOfValidMuonHits();
437 const int nHitsBad = badMuon.
globalTrack()->hitPattern().numberOfValidMuonHits();
438 if (
std::min(nHitsGood, nHitsBad) > 10 ) {
439 const double chi2Good = goodMuon.
globalTrack()->normalizedChi2();
440 const double chi2Bad = badMuon.
globalTrack()->normalizedChi2();
441 return ( chi2Good <= chi2Bad );
444 return (nHitsGood >= nHitsBad);
453 init(iEvent, iSetup);
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) )
continue;
473 for (
unsigned int j=
i+1;
j<nLink; ++
j ){
476 if ( iLink.trackerTrack() == jLink.trackerTrack() ) {
482 else goodmuons[
i] =
false;
487 for (
unsigned int i=0;
i<nLink-1; ++
i ) {
488 if ( !goodmuons[
i] )
continue;
490 if ( iLink.standAloneTrack().isNull() || !
checkLinks(&iLink))
continue;
491 for (
unsigned int j=i+1;
j<nLink; ++
j ) {
492 if ( !goodmuons[
j] )
continue;
495 if ( iLink.standAloneTrack() == jLink.standAloneTrack() ) {
497 else goodmuons[
i] =
false;
502 for (
unsigned int i=0;
i<nLink; ++
i ) {
503 if ( !goodmuons[
i] )
continue;
508 for (
auto muon : *outputMuons ) {
509 if (
muon.track() == iLink.trackerTrack() &&
510 muon.standAloneMuon() == iLink.standAloneTrack() &&
511 muon.combinedMuon() == iLink.globalTrack() ) {
517 outputMuons->push_back(
makeMuon(iLink) );
525 LogTrace(
"MuonIdentification") <<
"Creating tracker muons";
526 std::vector<TrackDetectorAssociator::Direction> directions1, directions2;
536 bool splitTrack =
false;
539 const auto&
directions = splitTrack ? directions1 : directions2;
543 fillMuonId(iEvent, iSetup, trackerMuon, direction);
559 for (
auto&
muon : *outputMuons )
570 LogTrace(
"MuonIdentification") <<
"Found a corresponding global muon. Set energy, matches and move on";
575 if ( goodTrackerMuon || goodRPCMuon ){
576 outputMuons->push_back( trackerMuon );
578 LogTrace(
"MuonIdentification") <<
"track failed minimal number of muon matches requirement";
581 caloMuons->push_back( caloMuon );
590 LogTrace(
"MuonIdentification") <<
"Looking for new muons among stand alone muon tracks";
597 for (
auto&
muon : *outputMuons )
599 if ( !
muon.standAloneMuon().isNull() ) {
601 if (
muon.standAloneMuon().get() == &outerTrack ) {
614 LogTrace(
"MuonIdentification") <<
"Found associated tracker muon. Set a reference and move on";
623 LogTrace(
"MuonIdentification") <<
"No associated stand alone track is found. Making a muon";
624 outputMuons->push_back(
makeMuon(iEvent, iSetup,
631 LogTrace(
"MuonIdentification") <<
"Dress up muons if it's necessary";
633 const int nMuons=outputMuons->size();
635 std::vector<reco::MuonTimeExtra> dtTimeColl(nMuons);
636 std::vector<reco::MuonTimeExtra> cscTimeColl(nMuons);
637 std::vector<reco::MuonTimeExtra> combinedTimeColl(nMuons);
638 std::vector<reco::IsoDeposit> trackDepColl(nMuons);
639 std::vector<reco::IsoDeposit> ecalDepColl(nMuons);
640 std::vector<reco::IsoDeposit> hcalDepColl(nMuons);
641 std::vector<reco::IsoDeposit> hoDepColl(nMuons);
642 std::vector<reco::IsoDeposit> jetDepColl(nMuons);
645 for (
unsigned int i=0;
i<outputMuons->size(); ++
i )
647 auto&
muon = outputMuons->at(
i);
655 if (
muon.isStandAloneMuon() ) {
662 LogTrace(
"MuonIdentification") <<
"THIS SHOULD NEVER HAPPEN";
681 trackDepColl[
i], ecalDepColl[i], hcalDepColl[i], hoDepColl[i], jetDepColl[i]);
699 muon.setTime(muonTime);
700 muon.setRPCTime(rpcTime);
701 dtTimeColl[
i] = dtTime;
702 cscTimeColl[
i] = cscTime;
703 combinedTimeColl[
i] = combinedTime;
706 LogTrace(
"MuonIdentification") <<
"number of muons produced: " << outputMuons->size();
712 std::unique_ptr<MapType > oMap(
new MapType());
714 typename MapType::Filler filler(*oMap);
715 filler.insert(refH, vec.begin(), vec.end());
721 fillMap(muonHandle, combinedTimeColl, iEvent,
"combined");
722 fillMap(muonHandle, dtTimeColl, iEvent,
"dt");
723 fillMap(muonHandle, cscTimeColl, iEvent,
"csc");
733 iEvent.
put(caloMuons);
760 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId";
766 else throw cms::Exception(
"FatalError") <<
"Failed to fill muon id information for a muon with undefined references to tracks";
771 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fillEnergy = "<<
fillEnergy_;
792 if (
hit->
id() != emMaxId)
continue;
798 if (
hit->
id() != hadMaxId)
continue;
807 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill muon match info ";
808 std::vector<reco::MuonChamberMatch> muonChamberMatches;
809 unsigned int nubmerOfMatchesAccordingToTrackAssociator = 0;
810 for (
const auto& chamber : info.
chambers )
815 const auto& lErr = chamber.tState.localError();
816 const auto& lPos = chamber.tState.localPosition();
817 const auto& lDir = chamber.tState.localDirection();
819 const auto& localError = lErr.positionError();
820 matchedChamber.
x = lPos.x();
821 matchedChamber.
y = lPos.y();
822 matchedChamber.
xErr =
sqrt( localError.xx() );
823 matchedChamber.
yErr =
sqrt( localError.yy() );
825 matchedChamber.
dXdZ = lDir.z()!=0?lDir.x()/lDir.z():9999;
826 matchedChamber.
dYdZ = lDir.z()!=0?lDir.y()/lDir.z():9999;
829 matchedChamber.
dXdZErr = trajectoryCovMatrix(1,1)>0?
sqrt(trajectoryCovMatrix(1,1)):0;
830 matchedChamber.
dYdZErr = trajectoryCovMatrix(2,2)>0?
sqrt(trajectoryCovMatrix(2,2)):0;
832 matchedChamber.
edgeX = chamber.localDistanceX;
833 matchedChamber.
edgeY = chamber.localDistanceY;
835 matchedChamber.
id = chamber.id;
836 if ( ! chamber.segments.empty() ) ++nubmerOfMatchesAccordingToTrackAssociator;
839 for (
const auto& segment : chamber.segments )
842 matchedSegment.
x = segment.segmentLocalPosition.x();
843 matchedSegment.
y = segment.segmentLocalPosition.y();
844 matchedSegment.
dXdZ = segment.segmentLocalDirection.z()?segment.segmentLocalDirection.x()/segment.segmentLocalDirection.z():0;
845 matchedSegment.
dYdZ = segment.segmentLocalDirection.z()?segment.segmentLocalDirection.y()/segment.segmentLocalDirection.z():0;
846 matchedSegment.
xErr = segment.segmentLocalErrorXX>0?
sqrt(segment.segmentLocalErrorXX):0;
847 matchedSegment.
yErr = segment.segmentLocalErrorYY>0?
sqrt(segment.segmentLocalErrorYY):0;
848 matchedSegment.
dXdZErr = segment.segmentLocalErrorDxDz>0?
sqrt(segment.segmentLocalErrorDxDz):0;
849 matchedSegment.
dYdZErr = segment.segmentLocalErrorDyDz>0?
sqrt(segment.segmentLocalErrorDyDz):0;
850 matchedSegment.
t0 = segment.t0;
851 matchedSegment.
mask = 0;
854 matchedSegment.
hasZed_ = segment.hasZed;
855 matchedSegment.
hasPhi_ = segment.hasPhi;
857 bool matchedX =
false;
858 bool matchedY =
false;
859 LogTrace(
"MuonIdentification") <<
" matching local x, segment x: " << matchedSegment.
x <<
860 ", chamber x: " << matchedChamber.
x <<
", max: " <<
maxAbsDx_;
861 LogTrace(
"MuonIdentification") <<
" matching local y, segment y: " << matchedSegment.
y <<
862 ", chamber y: " << matchedChamber.
y <<
", max: " <<
maxAbsDy_;
863 const double matchedSegChDx =
std::abs(matchedSegment.
x - matchedChamber.
x);
864 const double matchedSegChDy =
std::abs(matchedSegment.
y - matchedChamber.
y);
865 const double matchedSegChPullX = matchedSegChDx/std::hypot(matchedSegment.
xErr, matchedChamber.
xErr);
866 const double matchedSegChPullY = matchedSegChDy/std::hypot(matchedSegment.
yErr, matchedChamber.
yErr);
867 if (matchedSegment.
xErr>0 && matchedChamber.
xErr>0 )
868 LogTrace(
"MuonIdentification") <<
" xpull: " << matchedSegChPullX;
869 if (matchedSegment.
yErr>0 && matchedChamber.
yErr>0 )
870 LogTrace(
"MuonIdentification") <<
" ypull: " << matchedSegChPullY;
872 if (matchedSegChDx <
maxAbsDx_) matchedX =
true;
873 if (matchedSegChDy <
maxAbsDy_) matchedY =
true;
874 if (matchedSegment.
xErr>0 && matchedChamber.
xErr>0 && matchedSegChPullX <
maxAbsPullX_) matchedX =
true;
875 if (matchedSegment.
yErr>0 && matchedChamber.
yErr>0 && matchedSegChPullY <
maxAbsPullY_) matchedY =
true;
876 if (matchedX && matchedY) matchedChamber.
segmentMatches.push_back(matchedSegment);
878 muonChamberMatches.push_back(matchedChamber);
882 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill RPC info";
885 for (
const auto& chamber : info.
chambers )
887 if ( chamber.id.subdetId() != 3 )
continue;
888 const auto& lErr = chamber.tState.localError();
889 const auto& lPos = chamber.tState.localPosition();
890 const auto& lDir = chamber.tState.localDirection();
895 matchedChamber.
x = lPos.x();
896 matchedChamber.
y = lPos.y();
897 matchedChamber.
xErr =
sqrt( localError.
xx() );
898 matchedChamber.
yErr =
sqrt( localError.
yy() );
900 matchedChamber.
dXdZ = lDir.z()!=0?lDir.x()/lDir.z():9999;
901 matchedChamber.
dYdZ = lDir.z()!=0?lDir.y()/lDir.z():9999;
904 matchedChamber.
dXdZErr = trajectoryCovMatrix(1,1)>0?
sqrt(trajectoryCovMatrix(1,1)):0;
905 matchedChamber.
dYdZErr = trajectoryCovMatrix(2,2)>0?
sqrt(trajectoryCovMatrix(2,2)):0;
907 matchedChamber.
edgeX = chamber.localDistanceX;
908 matchedChamber.
edgeY = chamber.localDistanceY;
910 matchedChamber.
id = chamber.id;
916 if ( rpcRecHit.rawId() != chamber.id.rawId() )
continue;
918 rpcHitMatch.
x = rpcRecHit.localPosition().x();
919 rpcHitMatch.
mask = 0;
920 rpcHitMatch.
bx = rpcRecHit.BunchX();
922 const double absDx =
std::abs(rpcRecHit.localPosition().x()-chamber.tState.localPosition().x());
923 if( absDx <= 20
or absDx/
sqrt(localError.
xx()) <= 4 ) matchedChamber.
rpcMatches.push_back(rpcHitMatch);
926 muonChamberMatches.push_back(matchedChamber);
932 LogTrace(
"MuonIdentification") <<
"number of muon chambers: " << aMuon.
matches().size() <<
"\n"
933 <<
"number of chambers with segments according to the associator requirements: " <<
934 nubmerOfMatchesAccordingToTrackAssociator;
935 LogTrace(
"MuonIdentification") <<
"number of segment matches with the producer requirements: " <<
946 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > chamberPairs;
947 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > stationPairs;
948 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > arbitrationPairs;
951 for(
unsigned int muonIndex1 = 0; muonIndex1 < pOutputMuons->size(); ++muonIndex1 )
953 auto& muon1 = pOutputMuons->at(muonIndex1);
955 for (
auto& chamber1 : muon1.matches() )
957 if(chamber1.segmentMatches.empty())
continue;
958 chamberPairs.clear();
961 for (
auto& segment1 : chamber1.segmentMatches )
963 chamberPairs.push_back(std::make_pair(&chamber1, &segment1));
964 if(!segment1.isMask())
966 arbitrationPairs.clear();
967 arbitrationPairs.push_back(std::make_pair(&chamber1, &segment1));
971 if (muon1.isTrackerMuon()) {
973 for(
unsigned int muonIndex2 = muonIndex1+1; muonIndex2 < pOutputMuons->size(); ++muonIndex2 )
975 auto& muon2 = pOutputMuons->at(muonIndex2);
977 if ( !muon2.isTrackerMuon() )
continue;
979 for (
auto& chamber2 : muon2.matches() )
982 for (
auto& segment2 : chamber2.segmentMatches )
984 if(segment2.isMask())
continue;
994 arbitrationPairs.push_back(std::make_pair(&chamber2, &segment2));
1002 if(arbitrationPairs.empty())
continue;
1003 if(arbitrationPairs.size()==1) {
1018 for (
auto& ap : arbitrationPairs ) {
1026 CSCDetId(chamber1.id).ring() == 4) {
1027 for (
auto& segment2 : chamber1.segmentMatches ) {
1028 if( segment1.cscSegmentRef.isNull() || segment2.cscSegmentRef.isNull() )
continue;
1030 (segment2.mask & 0x1e0000) &&
1031 (segment1.mask & 0x1e0000) ) {
1041 if(chamberPairs.empty())
continue;
1042 if(chamberPairs.size()==1) {
1062 for(
int detectorIndex = 1; detectorIndex < 4; ++detectorIndex )
1064 stationPairs.clear();
1067 for (
auto& chamber : muon1.matches() )
1069 if(!(chamber.station()==
stationIndex && chamber.detector()==detectorIndex))
continue;
1070 if(chamber.segmentMatches.empty())
continue;
1072 for (
auto& segment : chamber.segmentMatches ) {
1073 stationPairs.push_back(std::make_pair(&chamber, &segment));
1077 if(stationPairs.empty())
continue;
1078 if(stationPairs.size()==1) {
1112 else throw cms::Exception(
"FatalError") <<
"Failed to compute muon isolation information for a muon with undefined references to tracks";
1121 if(caloDeps.size()!=3) {
1122 LogTrace(
"MuonIdentification") <<
"Failed to fill vector of calorimeter isolation deposits!";
1168 const double energy = hypot(track.
p(), 0.105658369);
1178 if ( muonId.
sector() <= 12 )
1180 if ( muonId.
sector() == 13 ) phi = 3/6.*
M_PI;
1181 if ( muonId.
sector() == 14 ) phi = 9/6.*
M_PI;
1195 if ( muon.
matches().empty() ) {
1198 return muon.
innerTrack()->outerPosition().phi();
1230 if (trackBAD || staBAD || glbBAD )
1232 edm::LogWarning(
"muonIDbadLinks") <<
"Global muon links to constituent tracks are invalid: trkBad "
1233 <<trackBAD <<
" standaloneBad "<<staBAD<<
" globalBad "<<glbBAD
1234 <<
". There should be no such object. Muon is skipped.";
std::string hoDepositName_
double p() const
momentum vector magnitude
T getParameter(std::string const &) const
static const unsigned int BelongsToTrackByME1aClean
std::string jetDepositName_
double candEnergy() const
Get energy or pT attached to cand trajectory.
bool isGoodRPCMuon(const reco::Muon &muon)
int numberOfMatchedRPCLayers(ArbitrationType type=RPCHitAndTrackArbitration) const
edm::EDGetTokenT< reco::TrackCollection > innerTrackCollectionToken_
reco::Muon makeMuon(edm::Event &iEvent, const edm::EventSetup &iSetup, const reco::TrackRef &track, TrackType type)
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_
static void truthMatchMuon(const edm::Event &iEvent, const edm::EventSetup &iSetup, reco::Muon &aMuon)
DTRecSegment4DRef dtSegmentRef
bool isNonnull() const
Checks for non-null.
reco::TrackRef trackerTrack() const
get the tracker's track which match with the stand alone muon tracks
void runMesh(std::vector< reco::Muon > *p)
static bool crossedIP(const reco::Track &track)
float sumPt
sum-pt of tracks
void setType(unsigned int type)
TrackDetectorAssociator trackAssociator_
CSCSegmentRef cscSegmentRef
const TrackExtraRef & extra() const
reference to "extra" object
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::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
static const unsigned int Arbitrated
segment mask flags
void fillMuonId(edm::Event &, const edm::EventSetup &, reco::Muon &, TrackDetectorAssociator::Direction direction=TrackDetectorAssociator::InsideOut)
friend struct const_iterator
reco::isodeposit::IsoDepositExtractor * muIsoExtractorCalo_
virtual TrackRef innerTrack() const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
edm::Handle< reco::MuonTrackLinksCollection > linkCollectionHandle_
edm::EDGetTokenT< RPCRecHitCollection > rpcHitToken_
bool isTrackerMuon() const
int overlap(const reco::Muon &muon, const reco::Track &track)
reco::TrackRef standAloneTrack() const
get the track built with the muon spectrometer alone
bool fillCaloCompatibility_
std::vector< const EcalRecHit * > ecalRecHits
hits in the cone
std::vector< DetId > crossedEcalIds
std::string trackDepositName_
void fillTiming(const reco::Muon &muon, reco::MuonTimeExtra &dtTime, reco::MuonTimeExtra &cscTime, reco::MuonTime &rpcTime, reco::MuonTimeExtra &combinedTime, edm::Event &iEvent, const edm::EventSetup &iSetup)
double phiOfMuonIneteractionRegion(const reco::Muon &muon) const
std::vector< CaloMuon > CaloMuonCollection
collection of Muon objects
void loadParameters(const edm::ParameterSet &, edm::ConsumesCollector &)
DetId findMaxDeposition(EnergyType)
Find detector elements with highest energy deposition.
virtual void produce(edm::Event &, const edm::EventSetup &) override
float hadVetoEt
hcal sum-et in the veto region in r-phi
virtual TrackRef track() const
reference to a Track
bool isGlobalMuon() const
virtual double phi() const final
momentum azimuthal angle
float emS9
energy deposited in 3x3 ECAL crystal shape around central crystal
double evaluate(const reco::Muon &)
MuonCaloCompatibility muonCaloCompatibility_
static const unsigned int BestInStationByDRSlope
bool isMatchesValid() const
tuple inputCollectionTypes
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
edm::EDGetTokenT< reco::TrackToTrackMap > pickyCollectionToken_
static std::string toStr(const ICTypeKey k)
double px() const
x coordinate of momentum vector
static const unsigned int BelongsToTrackByDXSlope
bool isStandAloneMuon() const
void setCalEnergy(const MuonEnergy &calEnergy)
set energy deposition information
void fillGlbQuality(edm::Event &, const edm::EventSetup &, reco::Muon &aMuon)
std::vector< DetId > crossedHcalIds
float trkRelChi2
chi2 value for the inner track stub with respect to the global track
std::auto_ptr< MuonKinkFinder > trackerKinkFinder_
double nXnEnergy(const DetId &, EnergyType, int gridSize=1)
get energy of the NxN shape (N = 2*gridSize + 1) around given detector element
float towerS9
total energy in 3x3 tower shape
static const unsigned int BestInStationByDR
MuonTime time() const
get DT/CSC combined timing information
std::vector< Muon > MuonCollection
collection of Muon objects
math::XYZPoint trkGlobPosAtHcal
float ecal_time
Calorimeter timing.
float ho
energy deposited in crossed HO towers
virtual void setTunePBestTrack(MuonTrackType muonType)
double depositWithin(double coneSize, const Vetos &vetos=Vetos(), bool skipDepositVeto=false) const
Get deposit.
bool approxEqual(const double a, const double b, const double tol=1E-3) const
void setCSCGeometry(const CSCGeometry *pg)
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
DetId hcal_id
DetId of the central HCAL tower with smallest depth.
edm::EDGetTokenT< reco::TrackToTrackMap > tpfmsCollectionToken_
const Point & vertex() const
reference point on the track. This method is DEPRECATED, please use referencePoint() instead ...
double ptThresholdToFillCandidateP4WithGlobalFit_
double eta() const
pseudorapidity of momentum vector
reco::Muon::MuonTrackTypePair sigmaSwitch(const reco::TrackRef &combinedTrack, const reco::TrackRef &trackerTrack, const double nSigma=2., const double ptThreshold=200.)
TrackAssociatorParameters parameters_
bool isCaloCompatibilityValid() const
void fillArbitrationInfo(reco::MuonCollection *)
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
double p() const
momentum vector magnitude
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
bool isGoodTrackerMuon(const reco::Muon &muon)
double pt() const
track transverse momentum
bool checkLinks(const reco::MuonTrackLinks *) const
Cos< T >::type cos(const T &t)
std::vector< TAMuonChamberMatch > chambers
int nJets
number of jets in the cone
std::vector< const HBHERecHit * > hcalRecHits
static const unsigned int BestInChamberByDX
std::string ecalDepositName_
MuonQuality combinedQuality() const
get energy deposition information
float timeAtIpOutIn
b) particle is moving from outside in
int nDof
number of muon stations used
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
static const unsigned int BestInChamberByDR
T const * get() const
Returns C++ pointer to the item.
bool isQualityValid() const
edm::Handle< reco::TrackToTrackMap > dytCollectionHandle_
edm::Handle< reco::TrackCollection > outerTrackCollectionHandle_
edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkCollectionToken_
double crossedEnergy(EnergyType)
energy in detector elements crossed by the track by types
bool isNull() const
Checks for null.
static const unsigned int BestInStationByDXSlope
math::XYZPointF hcal_position
bool fillGlobalTrackRefits_
static double sectorPhi(const DetId &id)
void setMuonTrack(const MuonTrackType &, const TrackRef &)
bool isEnergyValid() const
float hoVetoEt
ho sum-et in the veto region in r-phi
double pz() const
z coordinate of momentum vector
MuonEnergy calEnergy() const
get energy deposition information
reco::CaloMuon makeCaloMuon(const reco::Muon &)
virtual ~MuonIdProducer()
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
reco::isodeposit::IsoDepositExtractor * muIsoExtractorTrack_
void setCaloCompatibility(float input)
static const unsigned int RPCMuon
static ICTypeKey toKey(const std::string &s)
virtual TrackRef combinedMuon() const
reference to a stand-alone muon Track
static const unsigned int TrackerMuon
float emVetoEt
ecal sum-et in the veto region in r-phi
void configure(const edm::ParameterSet &)
reco::isodeposit::IsoDepositExtractor * muIsoExtractorJet_
bool isDuplicateOf(const CSCSegmentRef &lhs, const CSCSegmentRef &rhs) const
MuonTimingFiller * theTimingFiller_
std::vector< ICTypes::ICTypeKey > inputCollectionTypes_
float hadMax
maximal energy of HCAL tower in the 3x3 shape
static const unsigned int BelongsToTrackByDRSlope
virtual void setInnerTrack(const TrackRef &t)
set reference to Track
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
T const * product() const
void setCombinedQuality(const MuonQuality &combinedQuality)
set energy deposition information
std::vector< edm::InputTag > inputCollectionLabels_
std::vector< MuonChamberMatch > & matches()
get muon matching information
void setCalEnergy(const MuonEnergy &calEnergy)
set energy deposition information
int triggerSector() const
MuonIdProducer(const edm::ParameterSet &)
std::vector< reco::MuonSegmentMatch > segmentMatches
bool fillGlobalTrackQuality_
int numberOfMatches(ArbitrationType type=SegmentAndTrackArbitration) const
get number of chambers with matched segments
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_
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
std::pair< double, int > depositAndCountWithin(double coneSize, const Vetos &vetos=Vetos(), double threshold=-1e+36, bool skipDepositVeto=false) const
Get deposit.
edm::Handle< reco::TrackToTrackMap > tpfmsCollectionHandle_
static const unsigned int BestInStationByDX
TrackDetMatchInfo associate(const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
edm::Handle< reco::TrackCollection > innerTrackCollectionHandle_
unsigned int type() const
math::XYZPoint trkGlobPosAtEcal
Track position at different parts of the calorimeter.
int charge() const
track electric charge
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.
MuonTrackType
map for Global Muon refitters
virtual double eta() const final
momentum pseudorapidity
double sigmaThresholdToFillCandidateP4WithGlobalFit_
static const unsigned int StandAloneMuon
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
float caloCompatibility() const
bool validateGlobalMuonPair(const reco::MuonTrackLinks &goodMuon, const reco::MuonTrackLinks &badMuon)
bool debugWithTruthMatching_
virtual void setGlobalTrack(const TrackRef &t)
set reference to Track
float trackerVetoPt
(sum-)pt inside the veto region in r-phi
float hadS9
energy deposited in 3x3 HCAL tower shape around central tower
T get(const Candidate &c)
edm::Handle< reco::MuonCollection > muonCollectionHandle_
double py() const
y coordinate of momentum vector
edm::Handle< edm::ValueMap< reco::MuonQuality > > glbQualHandle_
virtual void beginRun(const edm::Run &, const edm::EventSetup &) override
reco::TrackRef globalTrack() const
get the combined track
virtual double pt() const final
transverse momentum
edm::Handle< reco::TrackToTrackMap > pickyCollectionHandle_
edm::EDGetTokenT< reco::TrackToTrackMap > dytCollectionToken_
virtual TrackRef standAloneMuon() const
reference to a stand-alone muon Track