CMS 3D CMS Logo

List of all members | Classes | Public Types | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes
MuonIdProducer Class Reference

#include <MuonIdProducer.h>

Inheritance diagram for MuonIdProducer:
edm::stream::EDProducer<>

Classes

struct  ICTypes
 

Public Types

typedef reco::Muon::MuonTrackType TrackType
 
- Public Types inherited from edm::stream::EDProducer<>
using CacheTypes = CacheContexts< T... >
 
using GlobalCache = typename CacheTypes::GlobalCache
 
using HasAbility = AbilityChecker< T... >
 
using InputProcessBlockCache = typename CacheTypes::InputProcessBlockCache
 
using LuminosityBlockCache = typename CacheTypes::LuminosityBlockCache
 
using LuminosityBlockContext = LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCache >
 
using LuminosityBlockSummaryCache = typename CacheTypes::LuminosityBlockSummaryCache
 
using RunCache = typename CacheTypes::RunCache
 
using RunContext = RunContextT< RunCache, GlobalCache >
 
using RunSummaryCache = typename CacheTypes::RunSummaryCache
 

Public Member Functions

void beginRun (const edm::Run &, const edm::EventSetup &) override
 
 MuonIdProducer (const edm::ParameterSet &)
 
void produce (edm::Event &, const edm::EventSetup &) override
 
 ~MuonIdProducer () override
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
 EDProducer (const EDProducer &)=delete
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 
const EDProduceroperator= (const EDProducer &)=delete
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 
static double sectorPhi (const DetId &id)
 

Private Member Functions

bool approxEqual (const double a, const double b, const double tol=1E-3) const
 
void arbitrateMuons (reco::MuonCollection *, reco::CaloMuonCollection *)
 
unsigned int chamberId (const DetId &)
 
bool checkLinks (const reco::MuonTrackLinks *) const
 
void fillArbitrationInfo (reco::MuonCollection *, unsigned int muonType=reco::Muon::TrackerMuon)
 
void fillGlbQuality (edm::Event &, const edm::EventSetup &, reco::Muon &aMuon)
 
void fillMuonId (edm::Event &, const edm::EventSetup &, reco::Muon &, TrackDetectorAssociator::Direction direction=TrackDetectorAssociator::InsideOut)
 
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)
 
void fillTrackerKink (reco::Muon &aMuon)
 
std::vector< reco::MuonSegmentMatch > * getSegmentMatches (reco::MuonChamberMatch &chamber, unsigned int muonType) const
 get the segment matches of the appropriate type More...
 
void init (edm::Event &, const edm::EventSetup &)
 
bool isGoodCaloMuon (const reco::CaloMuon &muon)
 
bool isGoodGEMMuon (const reco::Muon &muon)
 
bool isGoodME0Muon (const reco::Muon &muon)
 
bool isGoodRPCMuon (const reco::Muon &muon)
 
bool isGoodTrack (const reco::Track &track)
 
bool isGoodTrackerMuon (const reco::Muon &muon)
 
reco::CaloMuon makeCaloMuon (const reco::Muon &)
 
reco::Muon makeMuon (edm::Event &iEvent, const edm::EventSetup &iSetup, const reco::TrackRef &track, TrackType type)
 
reco::Muon makeMuon (const reco::MuonTrackLinks &links)
 
reco::Muon makeMuon (const reco::Track &track)
 
int overlap (const reco::Muon &muon, const reco::Track &track)
 
double phiOfMuonInteractionRegion (const reco::Muon &muon) const
 

Private Attributes

bool addExtraSoftMuons_
 
bool arbClean_
 
bool arbitrateTrackerMuons_
 
double caloCut_
 
bool debugWithTruthMatching_
 
edm::Handle< reco::TrackToTrackMapdytCollectionHandle_
 
edm::EDGetTokenT< reco::TrackToTrackMapdytCollectionToken_
 
std::string ecalDepositName_
 
bool fillCaloCompatibility_
 
bool fillEnergy_
 
bool fillGlobalTrackQuality_
 
bool fillGlobalTrackRefits_
 
bool fillIsolation_
 
bool fillMatching_
 
bool fillShowerDigis_
 
bool fillTrackerKink_
 
edm::Handle< GEMRecHitCollectiongemHitHandle_
 
edm::EDGetTokenT< GEMRecHitCollectiongemHitToken_
 
const edm::ESGetToken< CSCGeometry, MuonGeometryRecordgeomTokenRun_
 
edm::Handle< edm::ValueMap< reco::MuonQuality > > glbQualHandle_
 
edm::EDGetTokenT< edm::ValueMap< reco::MuonQuality > > glbQualToken_
 
edm::ESGetToken< GlobalTrackingGeometry, GlobalTrackingGeometryRecordglobalGeomToken_
 
edm::InputTag globalTrackQualityInputTag_
 
std::string hcalDepositName_
 
std::string hoDepositName_
 
edm::Handle< reco::TrackCollectioninnerTrackCollectionHandle_
 
edm::EDGetTokenT< reco::TrackCollectioninnerTrackCollectionToken_
 
std::vector< edm::InputTaginputCollectionLabels_
 
std::vector< ICTypes::ICTypeKeyinputCollectionTypes_
 
std::string jetDepositName_
 
edm::Handle< reco::MuonTrackLinksCollectionlinkCollectionHandle_
 
edm::EDGetTokenT< reco::MuonTrackLinksCollectionlinkCollectionToken_
 
double maxAbsDx_
 
double maxAbsDy_
 
double maxAbsEta_
 
double maxAbsPullX2_
 
double maxAbsPullY2_
 
std::unique_ptr< MuonMeshmeshAlgo_
 
int minNumberOfMatches_
 
double minP_
 
double minPCaloMuon_
 
double minPt_
 
std::unique_ptr< reco::isodeposit::IsoDepositExtractormuIsoExtractorCalo_
 
std::unique_ptr< reco::isodeposit::IsoDepositExtractormuIsoExtractorJet_
 
std::unique_ptr< reco::isodeposit::IsoDepositExtractormuIsoExtractorTrack_
 
MuonCaloCompatibility muonCaloCompatibility_
 
edm::Handle< reco::MuonCollectionmuonCollectionHandle_
 
edm::EDGetTokenT< reco::MuonCollectionmuonCollectionToken_
 
edm::Handle< reco::TrackCollectionouterTrackCollectionHandle_
 
edm::EDGetTokenT< reco::TrackCollectionouterTrackCollectionToken_
 
TrackAssociatorParameters parameters_
 
edm::Handle< reco::TrackToTrackMappickyCollectionHandle_
 
edm::EDGetTokenT< reco::TrackToTrackMappickyCollectionToken_
 
const edm::ESGetToken< Propagator, TrackingComponentsRecordpropagatorToken_
 
double ptThresholdToFillCandidateP4WithGlobalFit_
 
edm::Handle< reco::VertexCollectionpvHandle_
 
edm::InputTag pvInputTag_
 
edm::EDGetTokenT< reco::VertexCollectionpvToken_
 
edm::Handle< RPCRecHitCollectionrpcHitHandle_
 
edm::EDGetTokenT< RPCRecHitCollectionrpcHitToken_
 
bool selectHighPurity_
 
double sigmaThresholdToFillCandidateP4WithGlobalFit_
 
bool storeCrossedHcalRecHits_
 
std::unique_ptr< MuonShowerDigiFillertheShowerDigiFiller_
 
std::unique_ptr< MuonTimingFillertheTimingFiller_
 
edm::Handle< reco::TrackToTrackMaptpfmsCollectionHandle_
 
edm::EDGetTokenT< reco::TrackToTrackMaptpfmsCollectionToken_
 
TrackDetectorAssociator trackAssociator_
 
std::string trackDepositName_
 
std::unique_ptr< MuonKinkFindertrackerKinkFinder_
 
bool writeIsoDeposits_
 

Detailed Description

Definition at line 68 of file MuonIdProducer.h.

Member Typedef Documentation

◆ TrackType

Definition at line 70 of file MuonIdProducer.h.

Constructor & Destructor Documentation

◆ MuonIdProducer()

MuonIdProducer::MuonIdProducer ( const edm::ParameterSet iConfig)
explicit

Definition at line 34 of file MuonIdProducer.cc.

References addExtraSoftMuons_, arbClean_, arbitrateTrackerMuons_, caloCut_, caloParams_cfi::caloParams, MuonCaloCompatibility::configure(), debugWithTruthMatching_, dytCollectionToken_, ecalDepositName_, deDxTools::esConsumes(), fillCaloCompatibility_, fillEnergy_, fillGlobalTrackQuality_, fillGlobalTrackRefits_, fillIsolation_, fillMatching_, fillShowerDigis_, fillTrackerKink_, gemHitToken_, get, edm::ParameterSet::getParameter(), glbQualToken_, globalGeomToken_, hcalDepositName_, hoDepositName_, mps_fire::i, MuonIdProducer::ICTypes::INNER_TRACKS, innerTrackCollectionToken_, inputCollectionLabels_, HLT_2022v15_cff::inputCollectionTypes, inputCollectionTypes_, DataMixerDataOnData_cff::inputLabel, jetDepositName_, linkCollectionToken_, MuonIdProducer::ICTypes::LINKS, TrackAssociatorParameters::loadParameters(), LogTrace, maxAbsDx_, maxAbsDy_, maxAbsEta_, maxAbsPullX2_, maxAbsPullY2_, meshAlgo_, minNumberOfMatches_, minP_, minPCaloMuon_, minPt_, muIsoExtractorCalo_, muIsoExtractorJet_, muIsoExtractorTrack_, muonCaloCompatibility_, muonCollectionToken_, MuonIdProducer::ICTypes::MUONS, MuonIdProducer::ICTypes::OUTER_TRACKS, outerTrackCollectionToken_, parameters_, pickyCollectionToken_, ptThresholdToFillCandidateP4WithGlobalFit_, offsetAnalyzerDQM_cff::pvTag, pvToken_, rpcHitToken_, selectHighPurity_, sigmaThresholdToFillCandidateP4WithGlobalFit_, storeCrossedHcalRecHits_, AlCaHLTBitMon_QueryRunRegistry::string, MuonIdProducer::ICTypes::TEV_DYT, MuonIdProducer::ICTypes::TEV_FIRSTHIT, MuonIdProducer::ICTypes::TEV_PICKY, theShowerDigiFiller_, theTimingFiller_, MuonIdProducer::ICTypes::toKey(), tpfmsCollectionToken_, trackDepositName_, trackerKinkFinder_, and writeIsoDeposits_.

35  : geomTokenRun_(esConsumes<edm::Transition::BeginRun>()),
36  propagatorToken_(esConsumes(edm::ESInputTag("", "SteppingHelixPropagatorAny"))) {
37  LogTrace("MuonIdentification") << "RecoMuon/MuonIdProducer :: Constructor called";
38 
39  produces<reco::MuonCollection>();
40  produces<reco::CaloMuonCollection>();
41  produces<reco::MuonTimeExtraMap>("combined");
42  produces<reco::MuonTimeExtraMap>("dt");
43  produces<reco::MuonTimeExtraMap>("csc");
44 
45  minPt_ = iConfig.getParameter<double>("minPt");
46  minP_ = iConfig.getParameter<double>("minP");
47  minPCaloMuon_ = iConfig.getParameter<double>("minPCaloMuon");
48  minNumberOfMatches_ = iConfig.getParameter<int>("minNumberOfMatches");
49  addExtraSoftMuons_ = iConfig.getParameter<bool>("addExtraSoftMuons");
50  maxAbsEta_ = iConfig.getParameter<double>("maxAbsEta");
51  maxAbsDx_ = iConfig.getParameter<double>("maxAbsDx");
52  maxAbsPullX2_ = iConfig.getParameter<double>("maxAbsPullX");
54  maxAbsDy_ = iConfig.getParameter<double>("maxAbsDy");
55  maxAbsPullY2_ = iConfig.getParameter<double>("maxAbsPullY");
57  fillCaloCompatibility_ = iConfig.getParameter<bool>("fillCaloCompatibility");
58  fillEnergy_ = iConfig.getParameter<bool>("fillEnergy");
59  storeCrossedHcalRecHits_ = iConfig.getParameter<bool>("storeCrossedHcalRecHits");
60  fillMatching_ = iConfig.getParameter<bool>("fillMatching");
61  fillIsolation_ = iConfig.getParameter<bool>("fillIsolation");
62  fillShowerDigis_ = iConfig.getParameter<bool>("fillShowerDigis");
63  writeIsoDeposits_ = iConfig.getParameter<bool>("writeIsoDeposits");
64  fillGlobalTrackQuality_ = iConfig.getParameter<bool>("fillGlobalTrackQuality");
65  fillGlobalTrackRefits_ = iConfig.getParameter<bool>("fillGlobalTrackRefits");
66  arbitrateTrackerMuons_ = iConfig.getParameter<bool>("arbitrateTrackerMuons");
67  selectHighPurity_ = iConfig.getParameter<bool>("selectHighPurity");
68  //SK: (maybe temporary) run it only if the global is also run
69  fillTrackerKink_ = false;
71  fillTrackerKink_ = iConfig.getParameter<bool>("fillTrackerKink");
72 
74  iConfig.getParameter<double>("ptThresholdToFillCandidateP4WithGlobalFit");
76  iConfig.getParameter<double>("sigmaThresholdToFillCandidateP4WithGlobalFit");
77  caloCut_ = iConfig.getParameter<double>("minCaloCompatibility"); //CaloMuons
78  arbClean_ = iConfig.getParameter<bool>("runArbitrationCleaner"); // muon mesh
79 
80  // Load TrackDetectorAssociator parameters
81  const edm::ParameterSet parameters = iConfig.getParameter<edm::ParameterSet>("TrackAssociatorParameters");
82  edm::ConsumesCollector iC = consumesCollector();
84 
85  // Load parameters for the TimingFiller
86  edm::ParameterSet timingParameters = iConfig.getParameter<edm::ParameterSet>("TimingFillerParameters");
87  theTimingFiller_ = std::make_unique<MuonTimingFiller>(timingParameters, consumesCollector());
88 
89  // Load parameters for the ShowerDigiFiller
91  edm::ParameterSet showerDigiParameters = iConfig.getParameter<edm::ParameterSet>("ShowerDigiFillerParameters");
92  theShowerDigiFiller_ = std::make_unique<MuonShowerDigiFiller>(showerDigiParameters, consumesCollector());
93  } else {
94  theShowerDigiFiller_ = std::make_unique<MuonShowerDigiFiller>(); // to be used to call fillDefault only
95  }
96 
98  // Load MuonCaloCompatibility parameters
99  const auto caloParams = iConfig.getParameter<edm::ParameterSet>("MuonCaloCompatibility");
101  }
102 
103  if (fillIsolation_) {
104  // Load MuIsoExtractor parameters
105  edm::ParameterSet caloExtractorPSet = iConfig.getParameter<edm::ParameterSet>("CaloExtractorPSet");
106  std::string caloExtractorName = caloExtractorPSet.getParameter<std::string>("ComponentName");
108  IsoDepositExtractorFactory::get()->create(caloExtractorName, caloExtractorPSet, consumesCollector());
109 
110  edm::ParameterSet trackExtractorPSet = iConfig.getParameter<edm::ParameterSet>("TrackExtractorPSet");
111  std::string trackExtractorName = trackExtractorPSet.getParameter<std::string>("ComponentName");
113  IsoDepositExtractorFactory::get()->create(trackExtractorName, trackExtractorPSet, consumesCollector());
114 
115  edm::ParameterSet jetExtractorPSet = iConfig.getParameter<edm::ParameterSet>("JetExtractorPSet");
116  std::string jetExtractorName = jetExtractorPSet.getParameter<std::string>("ComponentName");
118  IsoDepositExtractorFactory::get()->create(jetExtractorName, jetExtractorPSet, consumesCollector());
119  }
121  trackDepositName_ = iConfig.getParameter<std::string>("trackDepositName");
122  produces<reco::IsoDepositMap>(trackDepositName_);
123  ecalDepositName_ = iConfig.getParameter<std::string>("ecalDepositName");
124  produces<reco::IsoDepositMap>(ecalDepositName_);
125  hcalDepositName_ = iConfig.getParameter<std::string>("hcalDepositName");
126  produces<reco::IsoDepositMap>(hcalDepositName_);
127  hoDepositName_ = iConfig.getParameter<std::string>("hoDepositName");
128  produces<reco::IsoDepositMap>(hoDepositName_);
129  jetDepositName_ = iConfig.getParameter<std::string>("jetDepositName");
130  produces<reco::IsoDepositMap>(jetDepositName_);
131  }
132 
133  inputCollectionLabels_ = iConfig.getParameter<std::vector<edm::InputTag> >("inputCollectionLabels");
134  const auto inputCollectionTypes = iConfig.getParameter<std::vector<std::string> >("inputCollectionTypes");
135  if (inputCollectionLabels_.size() != inputCollectionTypes.size())
136  throw cms::Exception("ConfigurationError")
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.";
139  if (inputCollectionLabels_.size() > 7 || inputCollectionLabels_.empty())
140  throw cms::Exception("ConfigurationError") << "Number of input collections should be from 1 to 7.";
141 
142  debugWithTruthMatching_ = iConfig.getParameter<bool>("debugWithTruthMatching");
144  edm::LogWarning("MuonIdentification")
145  << "========================================================================\n"
146  << "Debugging mode with truth matching is turned on!!! Make sure you understand what you are doing!\n"
147  << "========================================================================\n";
148 
150  }
152  const auto& glbQualTag = iConfig.getParameter<edm::InputTag>("globalTrackQualityInputTag");
153  glbQualToken_ = consumes<edm::ValueMap<reco::MuonQuality> >(glbQualTag);
154  }
155 
156  if (fillTrackerKink_) {
158  std::make_unique<MuonKinkFinder>(iConfig.getParameter<edm::ParameterSet>("TrackerKinkFinderParameters"), iC);
159  }
160 
161  if (selectHighPurity_) {
162  const auto& pvTag = iConfig.getParameter<edm::InputTag>("pvInputTag");
163  pvToken_ = mayConsume<reco::VertexCollection>(pvTag);
164  }
165 
166  //create mesh holder
167  meshAlgo_ = std::make_unique<MuonMesh>(iConfig.getParameter<edm::ParameterSet>("arbitrationCleanerOptions"));
168 
169  edm::InputTag rpcHitTag("rpcRecHits");
170  rpcHitToken_ = consumes<RPCRecHitCollection>(rpcHitTag);
171 
172  edm::InputTag gemHitTag("gemRecHits");
173  gemHitToken_ = consumes<GEMRecHitCollection>(gemHitTag);
174 
175  //Consumes... UGH
177  for (unsigned int i = 0; i < inputCollectionLabels_.size(); ++i) {
178  const auto inputLabel = inputCollectionLabels_[i];
179  const auto inputType = ICTypes::toKey(inputCollectionTypes[i]); // Note: thorws exception if type is undefined.
180 
181  if (inputType == ICTypes::INNER_TRACKS) {
182  innerTrackCollectionToken_ = consumes<reco::TrackCollection>(inputLabel);
183  } else if (inputType == ICTypes::OUTER_TRACKS) {
184  outerTrackCollectionToken_ = consumes<reco::TrackCollection>(inputLabel);
185  } else if (inputType == ICTypes::LINKS) {
186  linkCollectionToken_ = consumes<reco::MuonTrackLinksCollection>(inputLabel);
187  } else if (inputType == ICTypes::MUONS) {
188  muonCollectionToken_ = consumes<reco::MuonCollection>(inputLabel);
189  } else if (inputType == ICTypes::TEV_FIRSTHIT) {
190  tpfmsCollectionToken_ = consumes<reco::TrackToTrackMap>(inputLabel);
191  } else if (fillGlobalTrackRefits_ && inputType == ICTypes::TEV_PICKY) {
192  pickyCollectionToken_ = consumes<reco::TrackToTrackMap>(inputLabel);
193  } else if (fillGlobalTrackRefits_ && inputType == ICTypes::TEV_DYT) {
194  dytCollectionToken_ = consumes<reco::TrackToTrackMap>(inputCollectionLabels_.at(i));
195  }
196 
197  inputCollectionTypes_[i] = inputType;
198  }
199 }
std::string hoDepositName_
std::string jetDepositName_
edm::EDGetTokenT< reco::TrackCollection > innerTrackCollectionToken_
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
edm::EDGetTokenT< edm::ValueMap< reco::MuonQuality > > glbQualToken_
std::unique_ptr< MuonKinkFinder > trackerKinkFinder_
edm::EDGetTokenT< RPCRecHitCollection > rpcHitToken_
const edm::ESGetToken< Propagator, TrackingComponentsRecord > propagatorToken_
bool fillCaloCompatibility_
std::string trackDepositName_
const edm::ESGetToken< CSCGeometry, MuonGeometryRecord > geomTokenRun_
void loadParameters(const edm::ParameterSet &, edm::ConsumesCollector &)
MuonCaloCompatibility muonCaloCompatibility_
edm::EDGetTokenT< reco::TrackToTrackMap > pickyCollectionToken_
bool arbitrateTrackerMuons_
std::unique_ptr< reco::isodeposit::IsoDepositExtractor > muIsoExtractorTrack_
std::unique_ptr< MuonTimingFiller > theTimingFiller_
#define LogTrace(id)
edm::ESGetToken< GlobalTrackingGeometry, GlobalTrackingGeometryRecord > globalGeomToken_
std::unique_ptr< reco::isodeposit::IsoDepositExtractor > muIsoExtractorCalo_
edm::EDGetTokenT< reco::TrackToTrackMap > tpfmsCollectionToken_
std::unique_ptr< MuonShowerDigiFiller > theShowerDigiFiller_
double ptThresholdToFillCandidateP4WithGlobalFit_
TrackAssociatorParameters parameters_
std::string ecalDepositName_
edm::EDGetTokenT< reco::MuonCollection > muonCollectionToken_
edm::EDGetTokenT< reco::TrackCollection > outerTrackCollectionToken_
edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkCollectionToken_
bool fillGlobalTrackRefits_
edm::EDGetTokenT< GEMRecHitCollection > gemHitToken_
static ICTypeKey toKey(const std::string &s)
void configure(const edm::ParameterSet &)
std::vector< ICTypes::ICTypeKey > inputCollectionTypes_
std::vector< edm::InputTag > inputCollectionLabels_
std::unique_ptr< reco::isodeposit::IsoDepositExtractor > muIsoExtractorJet_
bool fillGlobalTrackQuality_
std::string hcalDepositName_
bool storeCrossedHcalRecHits_
edm::EDGetTokenT< reco::VertexCollection > pvToken_
double sigmaThresholdToFillCandidateP4WithGlobalFit_
#define get
Log< level::Warning, false > LogWarning
bool debugWithTruthMatching_
std::unique_ptr< MuonMesh > meshAlgo_
edm::EDGetTokenT< reco::TrackToTrackMap > dytCollectionToken_

◆ ~MuonIdProducer()

MuonIdProducer::~MuonIdProducer ( )
override

Definition at line 201 of file MuonIdProducer.cc.

201  {
202  // TimingReport::current()->dump(std::cout);
203 }

Member Function Documentation

◆ approxEqual()

bool MuonIdProducer::approxEqual ( const double  a,
const double  b,
const double  tol = 1E-3 
) const
inlineprivate

Definition at line 130 of file MuonIdProducer.h.

References a, funct::abs(), and b.

Referenced by fillArbitrationInfo().

130  {
131  return std::abs(a - b) < tol;
132  }
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double b
Definition: hdecay.h:118
double a
Definition: hdecay.h:119

◆ arbitrateMuons()

void MuonIdProducer::arbitrateMuons ( reco::MuonCollection muons,
reco::CaloMuonCollection caloMuons 
)
private

Definition at line 1122 of file MuonIdProducer.cc.

References mergedMuons_cfi::caloMuons, reco::Muon::GEMMuon, isGoodCaloMuon(), makeCaloMuon(), gpuClustering::pixelStatus::mask, minNumberOfMatches_, PDWG_BPHSkim_cff::muons, reco::Muon::PFMuon, reco::Muon::SegmentAndTrackArbitration, and reco::Muon::TrackerMuon.

Referenced by produce().

1122  {
1124  // arbitrate TrackerMuons
1125  // if a muon was exclusively TrackerMuon check if it can be a calo muon
1126  for (reco::MuonCollection::iterator muon = muons->begin(); muon != muons->end();) {
1127  if (muon->isTrackerMuon()) {
1128  if (muon->numberOfMatches(arbitration) < minNumberOfMatches_) {
1129  // TrackerMuon failed arbitration
1130  // If not any other base type - erase the element
1131  // (PFMuon is not a base type)
1132  // GEMMuon should be a subset of TrackerMuon, so don't count it either
1134  if ((muon->type() & (~mask)) == 0) {
1135  const reco::CaloMuon& caloMuon = makeCaloMuon(*muon);
1136  if (isGoodCaloMuon(caloMuon))
1137  caloMuons->push_back(caloMuon);
1138  muon = muons->erase(muon);
1139  continue;
1140  } else {
1141  muon->setType(muon->type() & (~(reco::Muon::TrackerMuon | reco::Muon::GEMMuon)));
1142  }
1143  }
1144  }
1145  muon++;
1146  }
1147 }
constexpr uint32_t mask
Definition: gpuClustering.h:26
ArbitrationType
define arbitration schemes
Definition: Muon.h:187
reco::CaloMuon makeCaloMuon(const reco::Muon &)
static const unsigned int TrackerMuon
Definition: Muon.h:290
static const unsigned int PFMuon
Definition: Muon.h:293
static const unsigned int GEMMuon
Definition: Muon.h:295
bool isGoodCaloMuon(const reco::CaloMuon &muon)

◆ beginRun()

void MuonIdProducer::beginRun ( const edm::Run iRun,
const edm::EventSetup iSetup 
)
override

Definition at line 431 of file MuonIdProducer.cc.

References fillMatching_, fillShowerDigis_, geomTokenRun_, edm::EventSetup::getData(), meshAlgo_, and theShowerDigiFiller_.

431  {
432  meshAlgo_->setCSCGeometry(&iSetup.getData(geomTokenRun_));
433 
435  theShowerDigiFiller_->getES(iSetup);
436 }
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
const edm::ESGetToken< CSCGeometry, MuonGeometryRecord > geomTokenRun_
std::unique_ptr< MuonShowerDigiFiller > theShowerDigiFiller_
std::unique_ptr< MuonMesh > meshAlgo_

◆ chamberId()

unsigned int MuonIdProducer::chamberId ( const DetId id)
private

Definition at line 388 of file MuonIdProducer.cc.

References CSCDetId::chamberId(), MuonSubdetId::CSC, MuonSubdetId::DT, DetId::Muon, and DetId::rawId().

Referenced by overlap().

388  {
389  if (id.det() != DetId::Muon)
390  return 0;
391 
392  const auto subdetId = id.subdetId();
393  if (subdetId == MuonSubdetId::DT) {
394  return DTChamberId(id.rawId()).rawId();
395  } else if (subdetId == MuonSubdetId::CSC) {
396  return CSCDetId(id.rawId()).chamberId().rawId();
397  }
398 
399  return 0;
400 }
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
CSCDetId chamberId() const
Definition: CSCDetId.h:47
static constexpr int DT
Definition: MuonSubdetId.h:11
static constexpr int CSC
Definition: MuonSubdetId.h:12

◆ checkLinks()

bool MuonIdProducer::checkLinks ( const reco::MuonTrackLinks links) const
private

Definition at line 1465 of file MuonIdProducer.cc.

References electronStore::links.

Referenced by produce().

1465  {
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.";
1473  return false;
1474  }
1475  return true;
1476 }
Log< level::Warning, false > LogWarning

◆ fillArbitrationInfo()

void MuonIdProducer::fillArbitrationInfo ( reco::MuonCollection pOutputMuons,
unsigned int  muonType = reco::Muon::TrackerMuon 
)
private

Definition at line 1149 of file MuonIdProducer.cc.

References approxEqual(), arbClean_, reco::MuonSegmentMatch::Arbitrated, reco::MuonSegmentMatch::BelongsToTrackByDR, reco::MuonSegmentMatch::BelongsToTrackByDRSlope, reco::MuonSegmentMatch::BelongsToTrackByDX, reco::MuonSegmentMatch::BelongsToTrackByDXSlope, reco::MuonSegmentMatch::BelongsToTrackByME1aClean, reco::MuonSegmentMatch::BestInChamberByDR, reco::MuonSegmentMatch::BestInChamberByDRSlope, reco::MuonSegmentMatch::BestInChamberByDX, reco::MuonSegmentMatch::BestInChamberByDXSlope, reco::MuonSegmentMatch::BestInStationByDR, reco::MuonSegmentMatch::BestInStationByDRSlope, reco::MuonSegmentMatch::BestInStationByDX, reco::MuonSegmentMatch::BestInStationByDXSlope, relativeConstraints::chamber, MuonSubdetId::CSC, getSegmentMatches(), meshAlgo_, CSCDetId::ring(), jetUpdater_cfi::sort, plotscripts::stationIndex(), and reco::Muon::TrackerMuon.

Referenced by produce().

1149  {
1150  //
1151  // apply segment flags
1152  //
1153  std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> > chamberPairs; // for chamber segment sorting
1154  std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> > stationPairs; // for station segment sorting
1155  std::vector<std::pair<reco::MuonChamberMatch*, reco::MuonSegmentMatch*> >
1156  arbitrationPairs; // for muon segment arbitration
1157 
1158  // muonIndex1
1159  for (unsigned int muonIndex1 = 0; muonIndex1 < pOutputMuons->size(); ++muonIndex1) {
1160  auto& muon1 = pOutputMuons->at(muonIndex1);
1161  // chamberIter1
1162  for (auto& chamber1 : muon1.matches()) {
1163  // segmentIter1
1164  std::vector<reco::MuonSegmentMatch>* segmentMatches1 = getSegmentMatches(chamber1, muonType);
1165 
1166  if (segmentMatches1->empty())
1167  continue;
1168  chamberPairs.clear();
1169 
1170  for (auto& segment1 : *segmentMatches1) {
1171  chamberPairs.push_back(std::make_pair(&chamber1, &segment1));
1172  if (!segment1.isMask()) // has not yet been arbitrated
1173  {
1174  arbitrationPairs.clear();
1175  arbitrationPairs.push_back(std::make_pair(&chamber1, &segment1));
1176 
1177  // find identical segments with which to arbitrate
1178  // tracker muons only
1179  if (muon1.type() & muonType) {
1180  // muonIndex2
1181  for (unsigned int muonIndex2 = muonIndex1 + 1; muonIndex2 < pOutputMuons->size(); ++muonIndex2) {
1182  auto& muon2 = pOutputMuons->at(muonIndex2);
1183  // tracker muons only
1184  if (!(muon2.type() & muonType))
1185  continue;
1186  // chamberIter2
1187  for (auto& chamber2 : muon2.matches()) {
1188  // segmentIter2
1189  std::vector<reco::MuonSegmentMatch>* segmentMatches2 = getSegmentMatches(chamber2, muonType);
1190  for (auto& segment2 : *segmentMatches2) {
1191  if (segment2.isMask())
1192  continue; // has already been arbitrated
1193  if (approxEqual(segment2.x, segment1.x) && approxEqual(segment2.y, segment1.y) &&
1194  approxEqual(segment2.dXdZ, segment1.dXdZ) && approxEqual(segment2.dYdZ, segment1.dYdZ) &&
1195  approxEqual(segment2.xErr, segment1.xErr) && approxEqual(segment2.yErr, segment1.yErr) &&
1196  approxEqual(segment2.dXdZErr, segment1.dXdZErr) &&
1197  approxEqual(segment2.dYdZErr, segment1.dYdZErr)) {
1198  arbitrationPairs.push_back(std::make_pair(&chamber2, &segment2));
1199  }
1200  } // segmentIter2
1201  } // chamberIter2
1202  } // muonIndex2
1203  }
1204 
1205  // arbitration segment sort
1206  if (arbitrationPairs.empty())
1207  continue; // this should never happen
1208  if (arbitrationPairs.size() == 1) {
1209  arbitrationPairs.front().second->setMask(reco::MuonSegmentMatch::BelongsToTrackByDRSlope);
1210  arbitrationPairs.front().second->setMask(reco::MuonSegmentMatch::BelongsToTrackByDXSlope);
1211  arbitrationPairs.front().second->setMask(reco::MuonSegmentMatch::BelongsToTrackByDR);
1212  arbitrationPairs.front().second->setMask(reco::MuonSegmentMatch::BelongsToTrackByDX);
1213  arbitrationPairs.front().second->setMask(reco::MuonSegmentMatch::Arbitrated);
1214  } else {
1215  sort(arbitrationPairs.begin(),
1216  arbitrationPairs.end(),
1218  arbitrationPairs.front().second->setMask(reco::MuonSegmentMatch::BelongsToTrackByDRSlope);
1219  sort(arbitrationPairs.begin(),
1220  arbitrationPairs.end(),
1222  arbitrationPairs.front().second->setMask(reco::MuonSegmentMatch::BelongsToTrackByDXSlope);
1223  sort(arbitrationPairs.begin(),
1224  arbitrationPairs.end(),
1226  arbitrationPairs.front().second->setMask(reco::MuonSegmentMatch::BelongsToTrackByDR);
1227  sort(arbitrationPairs.begin(),
1228  arbitrationPairs.end(),
1230  arbitrationPairs.front().second->setMask(reco::MuonSegmentMatch::BelongsToTrackByDX);
1231  for (auto& ap : arbitrationPairs) {
1232  ap.second->setMask(reco::MuonSegmentMatch::Arbitrated);
1233  }
1234  }
1235  }
1236 
1237  // setup me1a cleaning for later
1238  if (muonType == reco::Muon::TrackerMuon && chamber1.id.subdetId() == MuonSubdetId::CSC && arbClean_ &&
1239  CSCDetId(chamber1.id).ring() == 4) {
1240  for (auto& segment2 : chamber1.segmentMatches) {
1241  if (segment1.cscSegmentRef.isNull() || segment2.cscSegmentRef.isNull())
1242  continue;
1243  if (meshAlgo_->isDuplicateOf(segment1.cscSegmentRef, segment2.cscSegmentRef) &&
1244  (segment2.mask & 0x1e0000) && (segment1.mask & 0x1e0000)) {
1246  //if the track has lost the segment already through normal arbitration no need to do it again.
1247  }
1248  }
1249  } // mark all ME1/a duplicates that this track owns
1250 
1251  } // segmentIter1
1252 
1253  // chamber segment sort
1254  if (chamberPairs.empty())
1255  continue; // this should never happen
1256  if (chamberPairs.size() == 1) {
1257  chamberPairs.front().second->setMask(reco::MuonSegmentMatch::BestInChamberByDRSlope);
1258  chamberPairs.front().second->setMask(reco::MuonSegmentMatch::BestInChamberByDXSlope);
1259  chamberPairs.front().second->setMask(reco::MuonSegmentMatch::BestInChamberByDR);
1260  chamberPairs.front().second->setMask(reco::MuonSegmentMatch::BestInChamberByDX);
1261  } else {
1262  sort(chamberPairs.begin(),
1263  chamberPairs.end(),
1265  chamberPairs.front().second->setMask(reco::MuonSegmentMatch::BestInChamberByDRSlope);
1266  sort(chamberPairs.begin(),
1267  chamberPairs.end(),
1269  chamberPairs.front().second->setMask(reco::MuonSegmentMatch::BestInChamberByDXSlope);
1270  sort(chamberPairs.begin(),
1271  chamberPairs.end(),
1273  chamberPairs.front().second->setMask(reco::MuonSegmentMatch::BestInChamberByDR);
1274  sort(chamberPairs.begin(),
1275  chamberPairs.end(),
1277  chamberPairs.front().second->setMask(reco::MuonSegmentMatch::BestInChamberByDX);
1278  }
1279  } // chamberIter1
1280 
1281  // station segment sort
1282  for (int stationIndex = 1; stationIndex < 5; ++stationIndex) {
1283  for (int detectorIndex = 1; detectorIndex <= 5;
1284  ++detectorIndex) // 1-5, as in DataFormats/MuonDetId/interface/MuonSubdetId.h
1285  {
1286  stationPairs.clear();
1287 
1288  // chamberIter
1289  for (auto& chamber : muon1.matches()) {
1290  if (!(chamber.station() == stationIndex && chamber.detector() == detectorIndex))
1291  continue;
1292  std::vector<reco::MuonSegmentMatch>* segmentMatches = getSegmentMatches(chamber, muonType);
1293  if (segmentMatches->empty())
1294  continue;
1295 
1296  for (auto& segment : *segmentMatches) {
1297  stationPairs.push_back(std::make_pair(&chamber, &segment));
1298  }
1299  } // chamberIter
1300 
1301  if (stationPairs.empty())
1302  continue; // this may very well happen
1303  if (stationPairs.size() == 1) {
1304  stationPairs.front().second->setMask(reco::MuonSegmentMatch::BestInStationByDRSlope);
1305  stationPairs.front().second->setMask(reco::MuonSegmentMatch::BestInStationByDXSlope);
1306  stationPairs.front().second->setMask(reco::MuonSegmentMatch::BestInStationByDR);
1307  stationPairs.front().second->setMask(reco::MuonSegmentMatch::BestInStationByDX);
1308  } else {
1309  sort(stationPairs.begin(),
1310  stationPairs.end(),
1312  stationPairs.front().second->setMask(reco::MuonSegmentMatch::BestInStationByDRSlope);
1313  sort(stationPairs.begin(),
1314  stationPairs.end(),
1316  stationPairs.front().second->setMask(reco::MuonSegmentMatch::BestInStationByDXSlope);
1317  sort(stationPairs.begin(),
1318  stationPairs.end(),
1320  stationPairs.front().second->setMask(reco::MuonSegmentMatch::BestInStationByDR);
1321  sort(stationPairs.begin(),
1322  stationPairs.end(),
1324  stationPairs.front().second->setMask(reco::MuonSegmentMatch::BestInStationByDX);
1325  }
1326  }
1327  }
1328 
1329  } // muonIndex1
1330 
1331  if (arbClean_) {
1332  // clear old mesh, create and prune new mesh!
1333  meshAlgo_->clearMesh();
1334  meshAlgo_->runMesh(pOutputMuons);
1335  }
1336 }
static const unsigned int BelongsToTrackByME1aClean
bool approxEqual(const double a, const double b, const double tol=1E-3) const
static const unsigned int Arbitrated
segment mask flags
static const unsigned int BestInStationByDRSlope
static const unsigned int BelongsToTrackByDXSlope
static const unsigned int BestInStationByDR
static const unsigned int BestInChamberByDX
def stationIndex(name)
Definition: plotscripts.py:355
static const unsigned int BestInChamberByDR
static const unsigned int BestInStationByDXSlope
static const unsigned int BestInChamberByDXSlope
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
Definition: Muon.h:290
static const unsigned int BelongsToTrackByDRSlope
static const unsigned int BelongsToTrackByDR
static const unsigned int BelongsToTrackByDX
functor predicate for standard library sort algorithm
static const unsigned int BestInStationByDX
int ring() const
Definition: CSCDetId.h:68
static constexpr int CSC
Definition: MuonSubdetId.h:12
static const unsigned int BestInChamberByDRSlope
std::unique_ptr< MuonMesh > meshAlgo_

◆ fillDescriptions()

void MuonIdProducer::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 1478 of file MuonIdProducer.cc.

References edm::ParameterSetDescription::add(), edm::ConfigurationDescriptions::addDefault(), submitPVResolutionJobs::desc, HLT_2022v15_cff::InputTag, or, and edm::ParameterSetDescription::setAllowAnything().

1478  {
1480  desc.setAllowAnything();
1481 
1482  desc.add<bool>("arbitrateTrackerMuons", false);
1483  desc.add<bool>("storeCrossedHcalRecHits", false);
1484  desc.add<bool>("fillShowerDigis", false);
1485  desc.ifValue(
1486  edm::ParameterDescription<bool>("selectHighPurity", false, true),
1487  true >> (edm::ParameterDescription<edm::InputTag>("pvInputTag", edm::InputTag("offlinePrimaryVertices"), true)) or
1488  false >> (edm::ParameterDescription<edm::InputTag>("pvInputTag", edm::InputTag(""), true)));
1489 
1490  edm::ParameterSetDescription descTrkAsoPar;
1491  descTrkAsoPar.add<edm::InputTag>("GEMSegmentCollectionLabel", edm::InputTag("gemSegments"));
1492  descTrkAsoPar.add<edm::InputTag>("ME0SegmentCollectionLabel", edm::InputTag("me0Segments"));
1493  descTrkAsoPar.add<bool>("useGEM", false);
1494  descTrkAsoPar.add<bool>("useME0", false);
1495  descTrkAsoPar.setAllowAnything();
1496  desc.add<edm::ParameterSetDescription>("TrackAssociatorParameters", descTrkAsoPar);
1497 
1499  descJet.setAllowAnything();
1500  descJet.add<edm::ParameterSetDescription>("TrackAssociatorParameters", descTrkAsoPar);
1501  desc.add<edm::ParameterSetDescription>("JetExtractorPSet", descJet);
1502 
1504  descCalo.setAllowAnything();
1505  descCalo.add<edm::ParameterSetDescription>("TrackAssociatorParameters", descTrkAsoPar);
1506  desc.add<edm::ParameterSetDescription>("CaloExtractorPSet", descCalo);
1507 
1508  descriptions.addDefault(desc);
1509 }
void setAllowAnything()
allow any parameter label/value pairs
void addDefault(ParameterSetDescription const &psetDescription)
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
Definition: Activities.doc:12
ParameterDescriptionBase * add(U const &iLabel, T const &value)

◆ fillGlbQuality()

void MuonIdProducer::fillGlbQuality ( edm::Event iEvent,
const edm::EventSetup iSetup,
reco::Muon aMuon 
)
private

Definition at line 1444 of file MuonIdProducer.cc.

References reco::Muon::combinedMuon(), reco::Muon::combinedQuality(), edm::HandleBase::failedToGet(), glbQualHandle_, reco::Muon::isGlobalMuon(), edm::HandleBase::isValid(), LogDebug, reco::Muon::setCombinedQuality(), and reco::MuonQuality::trkRelChi2.

Referenced by produce().

1444  {
1446  aMuon.setCombinedQuality((*glbQualHandle_)[aMuon.combinedMuon()]);
1447  }
1448 
1449  LogDebug("MuonIdentification") << "tkChiVal " << aMuon.combinedQuality().trkRelChi2;
1450 }
MuonQuality combinedQuality() const
get energy deposition information
Definition: Muon.h:119
TrackRef combinedMuon() const override
reference to a stand-alone muon Track
Definition: Muon.h:52
float trkRelChi2
chi2 value for the inner track stub with respect to the global track
Definition: MuonQuality.h:15
bool failedToGet() const
Definition: HandleBase.h:72
void setCombinedQuality(const MuonQuality &combinedQuality)
set energy deposition information
Definition: Muon.h:121
bool isValid() const
Definition: HandleBase.h:70
bool isGlobalMuon() const override
Definition: Muon.h:303
edm::Handle< edm::ValueMap< reco::MuonQuality > > glbQualHandle_
#define LogDebug(id)

◆ fillMuonId()

void MuonIdProducer::fillMuonId ( edm::Event iEvent,
const edm::EventSetup iSetup,
reco::Muon aMuon,
TrackDetectorAssociator::Direction  direction = TrackDetectorAssociator::InsideOut 
)
private

Definition at line 825 of file MuonIdProducer.cc.

References funct::abs(), TrackDetectorAssociator::associate(), reco::MuonRPCHitMatch::bx, reco::MuonGEMHitMatch::bx, relativeConstraints::chamber, reco::HcalMuonRecHit::chi2, reco::MuonEnergy::crossedHadRecHits, reco::MuonSegmentMatch::cscSegmentRef, reco::HcalMuonRecHit::detId, reco::MuonSegmentMatch::dtSegmentRef, reco::MuonChamberMatch::dXdZ, reco::MuonSegmentMatch::dXdZ, reco::MuonChamberMatch::dXdZErr, reco::MuonSegmentMatch::dXdZErr, reco::MuonChamberMatch::dYdZ, reco::MuonSegmentMatch::dYdZ, reco::MuonChamberMatch::dYdZErr, reco::MuonSegmentMatch::dYdZErr, reco::MuonEnergy::ecal_id, reco::MuonEnergy::ecal_position, reco::MuonEnergy::ecal_time, TrackDetMatchInfo::EcalRecHits, reco::MuonChamberMatch::edgeX, reco::MuonChamberMatch::edgeY, reco::MuonEnergy::em, reco::MuonEnergy::emMax, reco::MuonEnergy::emS25, reco::MuonEnergy::emS9, reco::HcalMuonRecHit::energy, Exception, fillEnergy_, fillMatching_, fillShowerDigis_, MuonSubdetId::GEM, gemHitHandle_, reco::MuonChamberMatch::gemHitMatches, reco::MuonChamberMatch::gemMatches, muonGEMRecHitPSet::gemRecHit, reco::MuonSegmentMatch::gemSegmentRef, edm::Ref< C, T, F >::get(), reco::MuonEnergy::had, reco::MuonEnergy::hadMax, reco::MuonEnergy::hadS9, reco::MuonSegmentMatch::hasPhi_, reco::MuonSegmentMatch::hasZed_, reco::MuonEnergy::hcal_id, reco::MuonEnergy::hcal_position, reco::MuonEnergy::hcal_time, TrackDetMatchInfo::HcalRecHits, reco::MuonEnergy::ho, TrackDetMatchInfo::HORecHits, reco::MuonEnergy::hoS9, reco::MuonChamberMatch::id, hit::id, iEvent, info(), reco::Muon::isGEMMuon(), edm::Ref< C, T, F >::isNonnull(), reco::Muon::isRPCMuon(), reco::Muon::isTrackerMuon(), edm::HandleBase::isValid(), pixelTopology::layer, LogTrace, reco::MuonRPCHitMatch::mask, reco::MuonGEMHitMatch::mask, reco::MuonSegmentMatch::mask, reco::Muon::matches(), maxAbsDx_, maxAbsDy_, maxAbsPullX2_, maxAbsPullY2_, MuonSubdetId::ME0, reco::MuonChamberMatch::me0Matches, reco::MuonSegmentMatch::me0SegmentRef, reco::Muon::NoArbitration, reco::Muon::numberOfMatches(), or, parameters_, funct::pow(), MuonSubdetId::RPC, rpcHitHandle_, reco::MuonChamberMatch::rpcMatches, reco::MuonChamberMatch::segmentMatches, reco::Muon::setCalEnergy(), reco::Muon::setMatches(), mathSSE::sqrt(), reco::Muon::standAloneMuon(), relativeConstraints::station, storeCrossedHcalRecHits_, DetId::subdetId(), reco::MuonSegmentMatch::t0, theShowerDigiFiller_, reco::HcalMuonRecHit::time, reco::MuonEnergy::tower, reco::MuonEnergy::towerS9, TrackDetMatchInfo::TowerTotal, reco::Muon::track(), HLT_2022v15_cff::track, trackAssociator_, reco::MuonGEMHitMatch::x, reco::MuonRPCHitMatch::x, reco::MuonChamberMatch::x, reco::MuonSegmentMatch::x, reco::MuonChamberMatch::xErr, reco::MuonSegmentMatch::xErr, LocalError::xx(), reco::MuonChamberMatch::y, reco::MuonSegmentMatch::y, reco::MuonChamberMatch::yErr, reco::MuonSegmentMatch::yErr, and LocalError::yy().

Referenced by produce().

828  {
829  LogTrace("MuonIdentification") << "RecoMuon/MuonIdProducer :: fillMuonId";
830 
831  // perform track - detector association
832  const reco::Track* track = nullptr;
833  if (aMuon.track().isNonnull())
834  track = aMuon.track().get();
835  else if (aMuon.standAloneMuon().isNonnull())
836  track = aMuon.standAloneMuon().get();
837  else
838  throw cms::Exception("FatalError")
839  << "Failed to fill muon id information for a muon with undefined references to tracks";
840 
842 
843  LogTrace("MuonIdentification") << "RecoMuon/MuonIdProducer :: fillMuonId :: fillEnergy = " << fillEnergy_;
844 
845  if (fillEnergy_) {
846  reco::MuonEnergy muonEnergy;
847  muonEnergy.em = info.crossedEnergy(TrackDetMatchInfo::EcalRecHits);
848  muonEnergy.had = info.crossedEnergy(TrackDetMatchInfo::HcalRecHits);
849  muonEnergy.ho = info.crossedEnergy(TrackDetMatchInfo::HORecHits);
850  muonEnergy.tower = info.crossedEnergy(TrackDetMatchInfo::TowerTotal);
851  muonEnergy.emS9 = info.nXnEnergy(TrackDetMatchInfo::EcalRecHits, 1); // 3x3 energy
852  muonEnergy.emS25 = info.nXnEnergy(TrackDetMatchInfo::EcalRecHits, 2); // 5x5 energy
853  muonEnergy.hadS9 = info.nXnEnergy(TrackDetMatchInfo::HcalRecHits, 1); // 3x3 energy
854  muonEnergy.hoS9 = info.nXnEnergy(TrackDetMatchInfo::HORecHits, 1); // 3x3 energy
855  muonEnergy.towerS9 = info.nXnEnergy(TrackDetMatchInfo::TowerTotal, 1); // 3x3 energy
857  muonEnergy.crossedHadRecHits.clear();
858  for (auto hit : info.crossedHcalRecHits) {
860  mhit.energy = hit->energy();
861  mhit.chi2 = hit->chi2();
862  mhit.time = hit->time();
863  mhit.detId = hit->id();
864  muonEnergy.crossedHadRecHits.push_back(mhit);
865  }
866  }
867  muonEnergy.ecal_position = info.trkGlobPosAtEcal;
868  muonEnergy.hcal_position = info.trkGlobPosAtHcal;
869  if (!info.crossedEcalIds.empty())
870  muonEnergy.ecal_id = info.crossedEcalIds.front();
871  if (!info.crossedHcalIds.empty())
872  muonEnergy.hcal_id = info.crossedHcalIds.front();
873  // find maximal energy depositions and their time
874  DetId emMaxId = info.findMaxDeposition(TrackDetMatchInfo::EcalRecHits, 2); // max energy deposit in 5x5 shape
875  for (const auto& hit : info.ecalRecHits) {
876  if (hit->id() != emMaxId)
877  continue;
878  muonEnergy.emMax = hit->energy();
879  muonEnergy.ecal_time = hit->time();
880  }
881  DetId hadMaxId = info.findMaxDeposition(TrackDetMatchInfo::HcalRecHits, 1); // max energy deposit in 3x3 shape
882  for (const auto& hit : info.hcalRecHits) {
883  if (hit->id() != hadMaxId)
884  continue;
885  muonEnergy.hadMax = hit->energy();
886  muonEnergy.hcal_time = hit->time();
887  }
888  aMuon.setCalEnergy(muonEnergy);
889  }
890  if (!fillMatching_ && !aMuon.isTrackerMuon() && !aMuon.isRPCMuon() && !aMuon.isGEMMuon())
891  return;
892 
893  // fill muon match info
894  LogTrace("MuonIdentification") << "RecoMuon/MuonIdProducer :: fillMuonId :: fill muon match info ";
895  std::vector<reco::MuonChamberMatch> muonChamberMatches;
896  unsigned int nubmerOfMatchesAccordingToTrackAssociator = 0;
897  for (const auto& chamber : info.chambers) {
898  if (chamber.id.subdetId() == MuonSubdetId::RPC && rpcHitHandle_.isValid())
899  continue; // Skip RPC chambers, they are taken care of below)
900  if (chamber.id.subdetId() == MuonSubdetId::GEM && gemHitHandle_.isValid() &&
901  GEMDetId(chamber.id.rawId()).station() != 0)
902  continue; // Skip GE1/1 and 2/1 chambers, they are taken care of below)
903  reco::MuonChamberMatch matchedChamber;
904 
905  const auto& lErr = chamber.tState.localError();
906  const auto& lPos = chamber.tState.localPosition();
907  const auto& lDir = chamber.tState.localDirection();
908 
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());
914 
915  matchedChamber.dXdZ = lDir.z() != 0 ? lDir.x() / lDir.z() : 9999;
916  matchedChamber.dYdZ = lDir.z() != 0 ? lDir.y() / lDir.z() : 9999;
917  // DANGEROUS - compiler cannot guaranty parameters ordering
918  AlgebraicSymMatrix55 trajectoryCovMatrix = lErr.matrix();
919  matchedChamber.dXdZErr = trajectoryCovMatrix(1, 1) > 0 ? sqrt(trajectoryCovMatrix(1, 1)) : 0;
920  matchedChamber.dYdZErr = trajectoryCovMatrix(2, 2) > 0 ? sqrt(trajectoryCovMatrix(2, 2)) : 0;
921 
922  matchedChamber.edgeX = chamber.localDistanceX;
923  matchedChamber.edgeY = chamber.localDistanceY;
924 
925  matchedChamber.id = chamber.id;
926 
928  theShowerDigiFiller_->fill(matchedChamber);
929  } else {
930  theShowerDigiFiller_->fillDefault(matchedChamber);
931  }
932 
933  if (!chamber.segments.empty())
934  ++nubmerOfMatchesAccordingToTrackAssociator;
935 
936  // fill segments
937  for (const auto& segment : chamber.segments) {
938  reco::MuonSegmentMatch matchedSegment;
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;
951  matchedSegment.dtSegmentRef = segment.dtSegmentRef;
952  matchedSegment.cscSegmentRef = segment.cscSegmentRef;
953  matchedSegment.gemSegmentRef = segment.gemSegmentRef;
954  matchedSegment.me0SegmentRef = segment.me0SegmentRef;
955  matchedSegment.hasZed_ = segment.hasZed;
956  matchedSegment.hasPhi_ = segment.hasPhi;
957  // test segment
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: "
968  << matchedSegChDx / std::sqrt(std::pow(matchedSegment.xErr, 2) +
969  std::pow(matchedChamber.xErr, 2));
970  if (matchedSegment.yErr > 0 && matchedChamber.yErr > 0)
971  LogTrace("MuonIdentification") << " ypull: "
972  << matchedSegChDy / std::sqrt(std::pow(matchedSegment.yErr, 2) +
973  std::pow(matchedChamber.yErr, 2));
974 
975  if (matchedSegChDx < maxAbsDx_)
976  matchedX = true;
977  else if (matchedSegment.xErr > 0 && matchedChamber.xErr > 0) {
978  const double invMatchedSegChPullX2 = std::pow(matchedSegment.xErr, 2) + std::pow(matchedChamber.xErr, 2);
979  if (matchedSegChDx * matchedSegChDx < maxAbsPullX2_ * invMatchedSegChPullX2)
980  matchedX = true;
981  }
982  if (matchedSegChDy < maxAbsDy_)
983  matchedY = true;
984  else if (matchedSegment.yErr > 0 && matchedChamber.yErr > 0) {
985  const double invMatchedSegChPullY2 = std::pow(matchedSegment.yErr, 2) + std::pow(matchedChamber.yErr, 2);
986  if (matchedSegChDy * matchedSegChDy < maxAbsPullY2_ * invMatchedSegChPullY2)
987  matchedY = true;
988  }
989  if (matchedX && matchedY) {
990  if (matchedChamber.id.subdetId() == MuonSubdetId::ME0)
991  matchedChamber.me0Matches.push_back(matchedSegment);
992  else if (matchedChamber.id.subdetId() == MuonSubdetId::GEM)
993  matchedChamber.gemMatches.push_back(matchedSegment);
994  else
995  matchedChamber.segmentMatches.push_back(matchedSegment);
996  }
997  }
998  muonChamberMatches.push_back(matchedChamber);
999  }
1000 
1001  // Fill RPC info
1002  LogTrace("MuonIdentification") << "RecoMuon/MuonIdProducer :: fillMuonId :: fill RPC info";
1003  if (rpcHitHandle_.isValid()) {
1004  for (const auto& chamber : info.chambers) {
1005  if (chamber.id.subdetId() != MuonSubdetId::RPC)
1006  continue; // Consider RPC chambers only
1007  const auto& lErr = chamber.tState.localError();
1008  const auto& lPos = chamber.tState.localPosition();
1009  const auto& lDir = chamber.tState.localDirection();
1010 
1011  reco::MuonChamberMatch matchedChamber;
1012 
1013  LocalError localError = lErr.positionError();
1014  matchedChamber.x = lPos.x();
1015  matchedChamber.y = lPos.y();
1016  matchedChamber.xErr = sqrt(localError.xx());
1017  matchedChamber.yErr = sqrt(localError.yy());
1018 
1019  matchedChamber.dXdZ = lDir.z() != 0 ? lDir.x() / lDir.z() : 9999;
1020  matchedChamber.dYdZ = lDir.z() != 0 ? lDir.y() / lDir.z() : 9999;
1021  // DANGEROUS - compiler cannot guaranty parameters ordering
1022  AlgebraicSymMatrix55 trajectoryCovMatrix = lErr.matrix();
1023  matchedChamber.dXdZErr = trajectoryCovMatrix(1, 1) > 0 ? sqrt(trajectoryCovMatrix(1, 1)) : 0;
1024  matchedChamber.dYdZErr = trajectoryCovMatrix(2, 2) > 0 ? sqrt(trajectoryCovMatrix(2, 2)) : 0;
1025 
1026  matchedChamber.edgeX = chamber.localDistanceX;
1027  matchedChamber.edgeY = chamber.localDistanceY;
1028 
1029  theShowerDigiFiller_->fillDefault(matchedChamber);
1030 
1031  matchedChamber.id = chamber.id;
1032 
1033  for (const auto& rpcRecHit : *rpcHitHandle_) {
1034  reco::MuonRPCHitMatch rpcHitMatch;
1035 
1036  if (rpcRecHit.rawId() != chamber.id.rawId())
1037  continue;
1038 
1039  rpcHitMatch.x = rpcRecHit.localPosition().x();
1040  rpcHitMatch.mask = 0;
1041  rpcHitMatch.bx = rpcRecHit.BunchX();
1042 
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);
1046  }
1047 
1048  muonChamberMatches.push_back(matchedChamber);
1049  }
1050  }
1051 
1052  // Fill GEM info
1053  LogTrace("MuonIdentification") << "RecoMuon/MuonIdProducer :: fillMuonId :: fill GEM info";
1054  if (gemHitHandle_.isValid()) {
1055  for (const auto& chamber : info.chambers) {
1056  // only GE1/1 and 2/1 are for rechits, reject station 0 and segments (layer==0 for GEMSegment)
1057  if (chamber.id.subdetId() != MuonSubdetId::GEM || GEMDetId(chamber.id.rawId()).station() == 0 ||
1058  GEMDetId(chamber.id.rawId()).layer() == 0)
1059  continue; // Consider GEM chambers only
1060  const auto& lErr = chamber.tState.localError();
1061  const auto& lPos = chamber.tState.localPosition();
1062  const auto& lDir = chamber.tState.localDirection();
1063 
1064  reco::MuonChamberMatch matchedChamber;
1065 
1066  LocalError localError = lErr.positionError();
1067  matchedChamber.x = lPos.x();
1068  matchedChamber.y = lPos.y();
1069  matchedChamber.xErr = sqrt(localError.xx());
1070  matchedChamber.yErr = sqrt(localError.yy());
1071 
1072  matchedChamber.dXdZ = lDir.z() != 0 ? lDir.x() / lDir.z() : 9999;
1073  matchedChamber.dYdZ = lDir.z() != 0 ? lDir.y() / lDir.z() : 9999;
1074  // DANGEROUS - compiler cannot guaranty parameters ordering
1075  AlgebraicSymMatrix55 trajectoryCovMatrix = lErr.matrix();
1076  matchedChamber.dXdZErr = trajectoryCovMatrix(1, 1) > 0 ? sqrt(trajectoryCovMatrix(1, 1)) : 0;
1077  matchedChamber.dYdZErr = trajectoryCovMatrix(2, 2) > 0 ? sqrt(trajectoryCovMatrix(2, 2)) : 0;
1078 
1079  matchedChamber.edgeX = chamber.localDistanceX;
1080  matchedChamber.edgeY = chamber.localDistanceY;
1081 
1082  theShowerDigiFiller_->fillDefault(matchedChamber);
1083 
1084  matchedChamber.id = chamber.id;
1085 
1086  for (const auto& gemRecHit : *gemHitHandle_) {
1087  reco::MuonGEMHitMatch gemHitMatch;
1088 
1089  if (GEMDetId(gemRecHit.gemId().region(),
1090  gemRecHit.gemId().ring(),
1091  gemRecHit.gemId().station(),
1092  gemRecHit.gemId().layer(),
1093  gemRecHit.gemId().chamber(),
1094  0)
1095  .rawId() != chamber.id.rawId())
1096  continue;
1097 
1098  gemHitMatch.x = gemRecHit.localPosition().x();
1099  gemHitMatch.mask = 0;
1100  gemHitMatch.bx = gemRecHit.BunchX();
1101 
1102  const double absDx = std::abs(gemRecHit.localPosition().x() - chamber.tState.localPosition().x());
1103  if (absDx <= 5 or absDx * absDx <= 16 * localError.xx())
1104  matchedChamber.gemHitMatches.push_back(gemHitMatch);
1105  }
1106 
1107  muonChamberMatches.push_back(matchedChamber);
1108  }
1109  }
1110 
1111  aMuon.setMatches(muonChamberMatches);
1112 
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: "
1118 
1119  // fillTime( iEvent, iSetup, aMuon );
1120 }
GEMSegmentRef gemSegmentRef
DTRecSegment4DRef dtSegmentRef
static const TGPicture * info(bool iBackgroundIsBlack)
static constexpr int GEM
Definition: MuonSubdetId.h:14
std::vector< reco::MuonSegmentMatch > gemMatches
TrackDetectorAssociator trackAssociator_
CSCSegmentRef cscSegmentRef
std::vector< reco::MuonGEMHitMatch > gemHitMatches
float emS9
energy deposited in 3x3 ECAL crystal shape around central crystal
Definition: MuonEnergy.h:28
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
void setCalEnergy(const MuonEnergy &calEnergy)
set energy deposition information
Definition: Muon.h:108
TrackRef track() const override
reference to a Track
Definition: Muon.h:46
float towerS9
total energy in 3x3 tower shape
Definition: MuonEnergy.h:22
bool isTrackerMuon() const override
Definition: Muon.h:304
#define LogTrace(id)
float ecal_time
Calorimeter timing.
Definition: MuonEnergy.h:47
float ho
energy deposited in crossed HO towers
Definition: MuonEnergy.h:42
constexpr std::array< uint8_t, layerIndexSize< TrackerTraits > > layer
DetId hcal_id
DetId of the central HCAL tower with smallest depth.
Definition: MuonEnergy.h:60
float yy() const
Definition: LocalError.h:24
std::vector< reco::MuonSegmentMatch > me0Matches
int iEvent
Definition: GenABIO.cc:224
std::unique_ptr< MuonShowerDigiFiller > theShowerDigiFiller_
TrackAssociatorParameters parameters_
float emS25
energy deposited in 5x5 ECAL crystal shape around central crystal
Definition: MuonEnergy.h:30
T sqrt(T t)
Definition: SSEVec.h:19
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
Definition: Activities.doc:12
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
edm::Handle< RPCRecHitCollection > rpcHitHandle_
float hoS9
energy deposited in 3x3 HO tower shape around central tower
Definition: MuonEnergy.h:44
std::vector< reco::MuonRPCHitMatch > rpcMatches
static constexpr int ME0
Definition: MuonSubdetId.h:15
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
TrackRef standAloneMuon() const override
reference to a stand-alone muon Track
Definition: Muon.h:49
ME0SegmentRef me0SegmentRef
bool isRPCMuon() const
Definition: Muon.h:308
math::XYZPointF hcal_position
Definition: MuonEnergy.h:54
unsigned int id
float emMax
maximal energy of ECAL crystal in the 5x5 shape
Definition: MuonEnergy.h:32
Definition: DetId.h:17
bool isGEMMuon() const
Definition: Muon.h:309
int numberOfMatches(ArbitrationType type=SegmentAndTrackArbitration) const
get number of chambers with matched segments
float hadMax
maximal energy of HCAL tower in the 3x3 shape
Definition: MuonEnergy.h:40
edm::Handle< GEMRecHitCollection > gemHitHandle_
static constexpr int RPC
Definition: MuonSubdetId.h:13
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
std::vector< MuonChamberMatch > & matches()
get muon matching information
Definition: Muon.h:145
std::vector< reco::MuonSegmentMatch > segmentMatches
bool isValid() const
Definition: HandleBase.h:70
DetId ecal_id
DetId of the central ECAL crystal.
Definition: MuonEnergy.h:57
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:232
TrackDetMatchInfo associate(const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
bool storeCrossedHcalRecHits_
std::vector< HcalMuonRecHit > crossedHadRecHits
Definition: MuonEnergy.h:66
void setMatches(const std::vector< MuonChamberMatch > &matches)
set muon matching information
Definition: Muon.h:148
math::XYZPointF ecal_position
Trajectory position at the calorimeter.
Definition: MuonEnergy.h:53
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
float xx() const
Definition: LocalError.h:22
float hadS9
energy deposited in 3x3 HCAL tower shape around central tower
Definition: MuonEnergy.h:38

◆ fillMuonIsolation()

void MuonIdProducer::fillMuonIsolation ( edm::Event iEvent,
const edm::EventSetup iSetup,
reco::Muon aMuon,
reco::IsoDeposit trackDep,
reco::IsoDeposit ecalDep,
reco::IsoDeposit hcalDep,
reco::IsoDeposit hoDep,
reco::IsoDeposit jetDep 
)
private

Definition at line 1338 of file MuonIdProducer.cc.

References reco::IsoDeposit::candEnergy(), reco::IsoDeposit::depositAndCountWithin(), reco::IsoDeposit::depositWithin(), reco::MuonIsolation::emEt, reco::MuonIsolation::emVetoEt, Exception, edm::Ref< C, T, F >::get(), reco::MuonIsolation::hadEt, reco::MuonIsolation::hadVetoEt, reco::MuonIsolation::hoEt, reco::MuonIsolation::hoVetoEt, iEvent, edm::Ref< C, T, F >::isNonnull(), LogTrace, muIsoExtractorCalo_, muIsoExtractorJet_, muIsoExtractorTrack_, reco::MuonIsolation::nJets, reco::MuonIsolation::nTracks, reco::Muon::setIsolation(), reco::Muon::standAloneMuon(), reco::MuonIsolation::sumPt, reco::Muon::track(), HLT_2022v15_cff::track, reco::MuonIsolation::trackerVetoPt, and writeIsoDeposits_.

Referenced by produce().

1345  {
1346  const reco::Track* track = nullptr;
1347  if (aMuon.track().isNonnull())
1348  track = aMuon.track().get();
1349  else if (aMuon.standAloneMuon().isNonnull())
1350  track = aMuon.standAloneMuon().get();
1351  else
1352  throw cms::Exception("FatalError")
1353  << "Failed to compute muon isolation information for a muon with undefined references to tracks";
1354 
1355  reco::MuonIsolation isoR03, isoR05;
1356 
1357  // get deposits
1358  reco::IsoDeposit depTrk = muIsoExtractorTrack_->deposit(iEvent, iSetup, *track);
1359  std::vector<reco::IsoDeposit> caloDeps = muIsoExtractorCalo_->deposits(iEvent, iSetup, *track);
1360  reco::IsoDeposit depJet = muIsoExtractorJet_->deposit(iEvent, iSetup, *track);
1361 
1362  if (caloDeps.size() != 3) {
1363  LogTrace("MuonIdentification") << "Failed to fill vector of calorimeter isolation deposits!";
1364  return;
1365  }
1366 
1367  reco::IsoDeposit depEcal = caloDeps.at(0);
1368  reco::IsoDeposit depHcal = caloDeps.at(1);
1369  reco::IsoDeposit depHo = caloDeps.at(2);
1370 
1371  //no need to copy outside if we don't write them
1372  if (writeIsoDeposits_) {
1373  trackDep = depTrk;
1374  ecalDep = depEcal;
1375  hcalDep = depHcal;
1376  hoDep = depHo;
1377  jetDep = depJet;
1378  }
1379 
1380  isoR03.sumPt = depTrk.depositWithin(0.3);
1381  isoR03.emEt = depEcal.depositWithin(0.3);
1382  isoR03.hadEt = depHcal.depositWithin(0.3);
1383  isoR03.hoEt = depHo.depositWithin(0.3);
1384  isoR03.nTracks = depTrk.depositAndCountWithin(0.3).second;
1385  isoR03.nJets = depJet.depositAndCountWithin(0.3).second;
1386  isoR03.trackerVetoPt = depTrk.candEnergy();
1387  isoR03.emVetoEt = depEcal.candEnergy();
1388  isoR03.hadVetoEt = depHcal.candEnergy();
1389  isoR03.hoVetoEt = depHo.candEnergy();
1390 
1391  isoR05.sumPt = depTrk.depositWithin(0.5);
1392  isoR05.emEt = depEcal.depositWithin(0.5);
1393  isoR05.hadEt = depHcal.depositWithin(0.5);
1394  isoR05.hoEt = depHo.depositWithin(0.5);
1395  isoR05.nTracks = depTrk.depositAndCountWithin(0.5).second;
1396  isoR05.nJets = depJet.depositAndCountWithin(0.5).second;
1397  isoR05.trackerVetoPt = depTrk.candEnergy();
1398  isoR05.emVetoEt = depEcal.candEnergy();
1399  isoR05.hadVetoEt = depHcal.candEnergy();
1400  isoR05.hoVetoEt = depHo.candEnergy();
1401 
1402  aMuon.setIsolation(isoR03, isoR05);
1403 }
float hadEt
hcal sum-Et
Definition: MuonIsolation.h:8
float sumPt
sum-pt of tracks
Definition: MuonIsolation.h:6
float hadVetoEt
hcal sum-et in the veto region in r-phi
Definition: MuonIsolation.h:14
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
TrackRef track() const override
reference to a Track
Definition: Muon.h:46
std::unique_ptr< reco::isodeposit::IsoDepositExtractor > muIsoExtractorTrack_
#define LogTrace(id)
std::unique_ptr< reco::isodeposit::IsoDepositExtractor > muIsoExtractorCalo_
int iEvent
Definition: GenABIO.cc:224
double candEnergy() const
Get energy or pT attached to cand trajectory.
Definition: IsoDeposit.h:129
float emEt
ecal sum-Et
Definition: MuonIsolation.h:7
int nJets
number of jets in the cone
Definition: MuonIsolation.h:11
float hoEt
ho sum-Et
Definition: MuonIsolation.h:9
TrackRef standAloneMuon() const override
reference to a stand-alone muon Track
Definition: Muon.h:49
float hoVetoEt
ho sum-et in the veto region in r-phi
Definition: MuonIsolation.h:15
double depositWithin(double coneSize, const Vetos &vetos=Vetos(), bool skipDepositVeto=false) const
Get deposit.
Definition: IsoDeposit.cc:29
int nTracks
number of tracks in the cone (excluding veto region)
Definition: MuonIsolation.h:10
float emVetoEt
ecal sum-et in the veto region in r-phi
Definition: MuonIsolation.h:13
std::unique_ptr< reco::isodeposit::IsoDepositExtractor > muIsoExtractorJet_
void setIsolation(const MuonIsolation &isoR03, const MuonIsolation &isoR05)
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:232
float trackerVetoPt
(sum-)pt inside the veto region in r-phi
Definition: MuonIsolation.h:12
std::pair< double, int > depositAndCountWithin(double coneSize, const Vetos &vetos=Vetos(), double threshold=-1e+36, bool skipDepositVeto=false) const
Get deposit.
Definition: IsoDeposit.cc:37

◆ fillTrackerKink()

void MuonIdProducer::fillTrackerKink ( reco::Muon aMuon)
private

Definition at line 1452 of file MuonIdProducer.cc.

References reco::Muon::combinedQuality(), reco::Muon::innerTrack(), edm::Ref< C, T, F >::isNull(), reco::Muon::isQualityValid(), quality, reco::Muon::setCombinedQuality(), and trackerKinkFinder_.

Referenced by produce().

1452  {
1453  // skip muons with no tracks
1454  if (aMuon.innerTrack().isNull())
1455  return;
1456  // get quality from muon if already there, otherwise make empty one
1458  // fill it
1459  const bool filled = trackerKinkFinder_->fillTrkKink(quality, *aMuon.innerTrack());
1460  // if quality was there, or if we filled it, commit to the muon
1461  if (filled || aMuon.isQualityValid())
1462  aMuon.setCombinedQuality(quality);
1463 }
MuonQuality combinedQuality() const
get energy deposition information
Definition: Muon.h:119
std::unique_ptr< MuonKinkFinder > trackerKinkFinder_
string quality
virtual TrackRef innerTrack() const
Definition: Muon.h:45
bool isNull() const
Checks for null.
Definition: Ref.h:235
bool isQualityValid() const
Definition: Muon.h:117
void setCombinedQuality(const MuonQuality &combinedQuality)
set energy deposition information
Definition: Muon.h:121

◆ getSegmentMatches()

std::vector<reco::MuonSegmentMatch>* MuonIdProducer::getSegmentMatches ( reco::MuonChamberMatch chamber,
unsigned int  muonType 
) const
inlineprivate

get the segment matches of the appropriate type

Definition at line 135 of file MuonIdProducer.h.

References relativeConstraints::chamber, Exception, reco::Muon::GEMMuon, reco::Muon::ME0Muon, and reco::Muon::TrackerMuon.

Referenced by fillArbitrationInfo().

135  {
136  if (muonType == reco::Muon::TrackerMuon)
137  return &chamber.segmentMatches;
138  else if (muonType == reco::Muon::ME0Muon)
139  return &chamber.me0Matches;
140  else if (muonType == reco::Muon::GEMMuon)
141  return &chamber.gemMatches;
142  else
143  throw cms::Exception("getSegmentMatches called with unsupported muonType");
144  }
static const unsigned int ME0Muon
Definition: Muon.h:296
static const unsigned int TrackerMuon
Definition: Muon.h:290
static const unsigned int GEMMuon
Definition: Muon.h:295

◆ init()

void MuonIdProducer::init ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
private

Definition at line 205 of file MuonIdProducer.cc.

References edm::HandleBase::clear(), dytCollectionHandle_, dytCollectionToken_, Exception, fillGlobalTrackQuality_, fillGlobalTrackRefits_, fillTrackerKink_, gemHitHandle_, gemHitToken_, edm::EventSetup::getData(), glbQualHandle_, glbQualToken_, mps_fire::i, iEvent, MuonIdProducer::ICTypes::INNER_TRACKS, innerTrackCollectionHandle_, innerTrackCollectionToken_, inputCollectionLabels_, inputCollectionTypes_, DataMixerDataOnData_cff::inputLabel, edm::HandleBase::isValid(), linkCollectionHandle_, linkCollectionToken_, MuonIdProducer::ICTypes::LINKS, LogTrace, muonCollectionHandle_, muonCollectionToken_, MuonIdProducer::ICTypes::MUONS, MuonIdProducer::ICTypes::OUTER_TRACKS, outerTrackCollectionHandle_, outerTrackCollectionToken_, pickyCollectionHandle_, pickyCollectionToken_, propagatorToken_, pvHandle_, pvToken_, rpcHitHandle_, rpcHitToken_, selectHighPurity_, TrackDetectorAssociator::setPropagator(), MuonIdProducer::ICTypes::TEV_DYT, MuonIdProducer::ICTypes::TEV_FIRSTHIT, MuonIdProducer::ICTypes::TEV_PICKY, MuonIdProducer::ICTypes::toStr(), tpfmsCollectionHandle_, tpfmsCollectionToken_, trackAssociator_, and trackerKinkFinder_.

Referenced by produce().

205  {
210 
211  tpfmsCollectionHandle_.clear();
212  pickyCollectionHandle_.clear();
213  dytCollectionHandle_.clear();
214 
216 
217  if (fillTrackerKink_)
218  trackerKinkFinder_->init(iSetup);
219 
220  for (unsigned int i = 0; i < inputCollectionLabels_.size(); ++i) {
221  const auto& inputLabel = inputCollectionLabels_[i];
222  const auto inputType = inputCollectionTypes_[i];
223  if (inputType == ICTypes::INNER_TRACKS) {
226  throw cms::Exception("FatalError") << "Failed to get input track collection with label: " << inputLabel;
227  LogTrace("MuonIdentification") << "Number of input inner tracks: " << innerTrackCollectionHandle_->size();
228  } else if (inputType == ICTypes::OUTER_TRACKS) {
231  throw cms::Exception("FatalError") << "Failed to get input track collection with label: " << inputLabel;
232  LogTrace("MuonIdentification") << "Number of input outer tracks: " << outerTrackCollectionHandle_->size();
233  } else if (inputType == ICTypes::LINKS) {
236  throw cms::Exception("FatalError") << "Failed to get input link collection with label: " << inputLabel;
237  LogTrace("MuonIdentification") << "Number of input links: " << linkCollectionHandle_->size();
238  } else if (inputType == ICTypes::MUONS) {
241  throw cms::Exception("FatalError") << "Failed to get input muon collection with label: " << inputLabel;
242  LogTrace("MuonIdentification") << "Number of input muons: " << muonCollectionHandle_->size();
243  } else if (fillGlobalTrackRefits_ && inputType == ICTypes::TEV_FIRSTHIT) {
245  if (!tpfmsCollectionHandle_.isValid())
246  throw cms::Exception("FatalError") << "Failed to get input muon collection with label: " << inputLabel;
247  LogTrace("MuonIdentification") << "Number of input muons: " << tpfmsCollectionHandle_->size();
248  } else if (fillGlobalTrackRefits_ && inputType == ICTypes::TEV_PICKY) {
250  if (!pickyCollectionHandle_.isValid())
251  throw cms::Exception("FatalError") << "Failed to get input muon collection with label: " << inputLabel;
252  LogTrace("MuonIdentification") << "Number of input muons: " << pickyCollectionHandle_->size();
253  } else if (fillGlobalTrackRefits_ && inputType == ICTypes::TEV_DYT) {
255  if (!dytCollectionHandle_.isValid())
256  throw cms::Exception("FatalError") << "Failed to get input muon collection with label: " << inputLabel;
257  LogTrace("MuonIdentification") << "Number of input muons: " << dytCollectionHandle_->size();
258  } else
259  throw cms::Exception("FatalError") << "Unknown input collection type: #" << ICTypes::toStr(inputType);
260  }
261 
262  iEvent.getByToken(rpcHitToken_, rpcHitHandle_);
263  iEvent.getByToken(gemHitToken_, gemHitHandle_);
265  iEvent.getByToken(glbQualToken_, glbQualHandle_);
266  if (selectHighPurity_)
267  iEvent.getByToken(pvToken_, pvHandle_);
268 }
edm::EDGetTokenT< reco::TrackCollection > innerTrackCollectionToken_
edm::EDGetTokenT< edm::ValueMap< reco::MuonQuality > > glbQualToken_
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
TrackDetectorAssociator trackAssociator_
std::unique_ptr< MuonKinkFinder > trackerKinkFinder_
edm::Handle< reco::MuonTrackLinksCollection > linkCollectionHandle_
edm::EDGetTokenT< RPCRecHitCollection > rpcHitToken_
const edm::ESGetToken< Propagator, TrackingComponentsRecord > propagatorToken_
edm::EDGetTokenT< reco::TrackToTrackMap > pickyCollectionToken_
static std::string toStr(const ICTypeKey k)
#define LogTrace(id)
edm::EDGetTokenT< reco::TrackToTrackMap > tpfmsCollectionToken_
int iEvent
Definition: GenABIO.cc:224
edm::Handle< reco::VertexCollection > pvHandle_
void setPropagator(const Propagator *)
use a user configured propagator
edm::EDGetTokenT< reco::MuonCollection > muonCollectionToken_
edm::EDGetTokenT< reco::TrackCollection > outerTrackCollectionToken_
edm::Handle< RPCRecHitCollection > rpcHitHandle_
edm::Handle< reco::TrackToTrackMap > dytCollectionHandle_
edm::Handle< reco::TrackCollection > outerTrackCollectionHandle_
edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkCollectionToken_
bool fillGlobalTrackRefits_
edm::EDGetTokenT< GEMRecHitCollection > gemHitToken_
std::vector< ICTypes::ICTypeKey > inputCollectionTypes_
edm::Handle< GEMRecHitCollection > gemHitHandle_
std::vector< edm::InputTag > inputCollectionLabels_
bool fillGlobalTrackQuality_
bool isValid() const
Definition: HandleBase.h:70
edm::Handle< reco::TrackToTrackMap > tpfmsCollectionHandle_
edm::Handle< reco::TrackCollection > innerTrackCollectionHandle_
edm::EDGetTokenT< reco::VertexCollection > pvToken_
edm::Handle< reco::MuonCollection > muonCollectionHandle_
edm::Handle< edm::ValueMap< reco::MuonQuality > > glbQualHandle_
edm::Handle< reco::TrackToTrackMap > pickyCollectionHandle_
edm::EDGetTokenT< reco::TrackToTrackMap > dytCollectionToken_

◆ isGoodCaloMuon()

bool MuonIdProducer::isGoodCaloMuon ( const reco::CaloMuon muon)
private

Definition at line 793 of file MuonIdProducer.cc.

References reco::CaloMuon::caloCompatibility(), caloCut_, reco::CaloMuon::isCaloCompatibilityValid(), minPCaloMuon_, and reco::CaloMuon::p().

Referenced by arbitrateMuons(), and produce().

793  {
794  if (!caloMuon.isCaloCompatibilityValid() || caloMuon.caloCompatibility() < caloCut_ || caloMuon.p() < minPCaloMuon_)
795  return false;
796  return true;
797 }

◆ isGoodGEMMuon()

bool MuonIdProducer::isGoodGEMMuon ( const reco::Muon muon)
private

Definition at line 808 of file MuonIdProducer.cc.

References reco::Muon::GEMHitAndTrackArbitration, reco::Muon::GEMSegmentAndTrackArbitration, isGoodTrackerMuon(), minP_, and minPt_.

Referenced by produce().

808  {
809  // require GEMMuon to be a TrackerMuon
810  if (!isGoodTrackerMuon(muon))
811  return false;
812  if (muon.track()->pt() < minPt_ || muon.track()->p() < minP_)
813  return false;
814  return (muon.numberOfMatches(reco::Muon::GEMSegmentAndTrackArbitration) +
815  muon.numberOfMatches(reco::Muon::GEMHitAndTrackArbitration)) >= 1;
816 }
bool isGoodTrackerMuon(const reco::Muon &muon)

◆ isGoodME0Muon()

bool MuonIdProducer::isGoodME0Muon ( const reco::Muon muon)
private

Definition at line 818 of file MuonIdProducer.cc.

References reco::Muon::ME0SegmentAndTrackArbitration, and minP_.

Referenced by produce().

818  {
819  // need to update min cuts on pt
820  if (muon.track()->p() < minP_)
821  return false;
822  return (muon.numberOfMatches(reco::Muon::ME0SegmentAndTrackArbitration) >= 1);
823 }

◆ isGoodRPCMuon()

bool MuonIdProducer::isGoodRPCMuon ( const reco::Muon muon)
private

Definition at line 799 of file MuonIdProducer.cc.

References funct::abs(), addExtraSoftMuons_, minNumberOfMatches_, minP_, minPt_, and reco::Muon::RPCHitAndTrackArbitration.

Referenced by produce().

799  {
800  if (muon.track()->pt() < minPt_ || muon.track()->p() < minP_)
801  return false;
802  if (addExtraSoftMuons_ && muon.pt() < 5 && std::abs(muon.eta()) < 1.5 &&
803  muon.numberOfMatchedRPCLayers(reco::Muon::RPCHitAndTrackArbitration) > 1)
804  return true;
805  return (muon.numberOfMatchedRPCLayers(reco::Muon::RPCHitAndTrackArbitration) > minNumberOfMatches_);
806 }
Abs< T >::type abs(const T &t)
Definition: Abs.h:22

◆ isGoodTrack()

bool MuonIdProducer::isGoodTrack ( const reco::Track track)
private

Definition at line 368 of file MuonIdProducer.cc.

References funct::abs(), PVValHelper::eta, LogTrace, maxAbsEta_, minP_, minPCaloMuon_, minPt_, AlCaHLTBitMon_ParallelJobs::p, DiDispStaMuonMonitor_cfi::pt, and HLT_2022v15_cff::track.

Referenced by produce().

368  {
369  // Pt and absolute momentum requirement
370  const double p = track.p();
371  const double pt = track.pt();
372  if (pt < minPt_ || (p < minP_ && p < minPCaloMuon_)) {
373  LogTrace("MuonIdentification") << "Skipped low momentum track (Pt,P): " << pt << ", " << track.p() << " GeV";
374  return false;
375  }
376 
377  // Eta requirement
378  const double eta = track.eta();
379  const double absEta = std::abs(eta);
380  if (absEta > maxAbsEta_) {
381  LogTrace("MuonIdentification") << "Skipped track with large pseudo rapidity (Eta: " << track.eta() << " )";
382  return false;
383  }
384 
385  return true;
386 }
#define LogTrace(id)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22

◆ isGoodTrackerMuon()

bool MuonIdProducer::isGoodTrackerMuon ( const reco::Muon muon)
private

Definition at line 784 of file MuonIdProducer.cc.

References funct::abs(), addExtraSoftMuons_, minNumberOfMatches_, minP_, minPt_, and reco::Muon::NoArbitration.

Referenced by isGoodGEMMuon(), and produce().

784  {
785  if (muon.track()->pt() < minPt_ || muon.track()->p() < minP_)
786  return false;
787  if (addExtraSoftMuons_ && muon.pt() < 5 && std::abs(muon.eta()) < 1.5 &&
788  muon.numberOfMatches(reco::Muon::NoArbitration) >= 1)
789  return true;
790  return (muon.numberOfMatches(reco::Muon::NoArbitration) >= minNumberOfMatches_);
791 }
Abs< T >::type abs(const T &t)
Definition: Abs.h:22

◆ makeCaloMuon()

reco::CaloMuon MuonIdProducer::makeCaloMuon ( const reco::Muon muon)
private

Definition at line 290 of file MuonIdProducer.cc.

References MuonCaloCompatibility::evaluate(), fillCaloCompatibility_, LogTrace, muonCaloCompatibility_, reco::CaloMuon::setCalEnergy(), reco::CaloMuon::setCaloCompatibility(), and reco::CaloMuon::setInnerTrack().

Referenced by arbitrateMuons(), and produce().

290  {
291  LogTrace("MuonIdentification") << "Creating a CaloMuon from a Muon";
292 
293  reco::CaloMuon aMuon;
294  aMuon.setInnerTrack(muon.innerTrack());
295 
296  if (muon.isEnergyValid())
297  aMuon.setCalEnergy(muon.calEnergy());
298  // get calo compatibility
301  return aMuon;
302 }
bool fillCaloCompatibility_
double evaluate(const reco::Muon &)
MuonCaloCompatibility muonCaloCompatibility_
#define LogTrace(id)
void setCaloCompatibility(float input)
Definition: CaloMuon.h:46
virtual void setInnerTrack(const TrackRef &t)
set reference to Track
Definition: CaloMuon.h:30
void setCalEnergy(const MuonEnergy &calEnergy)
set energy deposition information
Definition: CaloMuon.h:37

◆ makeMuon() [1/3]

reco::Muon MuonIdProducer::makeMuon ( edm::Event iEvent,
const edm::EventSetup iSetup,
const reco::TrackRef track,
MuonIdProducer::TrackType  type 
)
private

Definition at line 270 of file MuonIdProducer.cc.

References LogTrace, and HLT_2022v15_cff::track.

Referenced by makeMuon(), and produce().

273  {
274  LogTrace("MuonIdentification") << "Creating a muon from a track " << track.get()->pt()
275  << " Pt (GeV), eta: " << track.get()->eta();
276  reco::Muon aMuon(makeMuon(*(track.get())));
277 
278  LogTrace("MuonIdentification") << "Muon created from a track ";
279 
280  aMuon.setMuonTrack(type, track);
281  aMuon.setBestTrack(type);
282  aMuon.setTunePBestTrack(type);
283 
284  LogTrace("MuonIdentification")
285  << "Muon created from a track and setMuonBestTrack, setBestTrack and setTunePBestTrack called";
286 
287  return aMuon;
288 }
reco::Muon makeMuon(edm::Event &iEvent, const edm::EventSetup &iSetup, const reco::TrackRef &track, TrackType type)
#define LogTrace(id)

◆ makeMuon() [2/3]

reco::Muon MuonIdProducer::makeMuon ( const reco::MuonTrackLinks links)
private

Definition at line 304 of file MuonIdProducer.cc.

References reco::Muon::DYT, dytCollectionHandle_, fillGlobalTrackRefits_, muon::getTevRefitTrack(), edm::Ref< C, T, F >::isNull(), electronStore::links, LogTrace, makeMuon(), reco::Muon::Picky, pickyCollectionHandle_, ptThresholdToFillCandidateP4WithGlobalFit_, reco::Muon::setBestTrack(), reco::Muon::setGlobalTrack(), reco::Muon::setInnerTrack(), reco::Muon::setMuonTrack(), reco::Muon::setOuterTrack(), reco::Muon::setTunePBestTrack(), muon::sigmaSwitch(), sigmaThresholdToFillCandidateP4WithGlobalFit_, muon::tevOptimized(), reco::Muon::TPFMS, tpfmsCollectionHandle_, and edm::helpers::KeyVal< K, V >::val.

304  {
305  LogTrace("MuonIdentification") << "Creating a muon from a link to tracks object";
306 
307  reco::Muon aMuon;
308  reco::Muon::MuonTrackTypePair chosenTrack;
309  reco::TrackRef tpfmsRef;
310  reco::TrackRef pickyRef;
311  reco::TrackRef dytRef;
312  bool useSigmaSwitch = false;
313 
314  if (tpfmsCollectionHandle_.isValid() && !tpfmsCollectionHandle_.failedToGet() && pickyCollectionHandle_.isValid() &&
315  !pickyCollectionHandle_.failedToGet()) {
316  tpfmsRef = muon::getTevRefitTrack(links.globalTrack(), *tpfmsCollectionHandle_);
317  pickyRef = muon::getTevRefitTrack(links.globalTrack(), *pickyCollectionHandle_);
318  dytRef = muon::getTevRefitTrack(links.globalTrack(), *dytCollectionHandle_);
319 
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;
323  }
324  } else {
325  useSigmaSwitch = true;
326  }
327 
328  if (useSigmaSwitch) {
329  chosenTrack = muon::sigmaSwitch(links.globalTrack(),
330  links.trackerTrack(),
333  } else {
334  chosenTrack = muon::tevOptimized(links.globalTrack(),
335  links.trackerTrack(),
336  tpfmsRef,
337  pickyRef,
338  dytRef,
340  }
341  aMuon = makeMuon(*chosenTrack.first);
342  aMuon.setInnerTrack(links.trackerTrack());
343  aMuon.setOuterTrack(links.standAloneTrack());
344  aMuon.setGlobalTrack(links.globalTrack());
345  aMuon.setBestTrack(chosenTrack.second);
346  aMuon.setTunePBestTrack(chosenTrack.second);
347 
349  if (tpfmsCollectionHandle_.isValid() && !tpfmsCollectionHandle_.failedToGet()) {
351  if (it != tpfmsCollectionHandle_->end())
352  aMuon.setMuonTrack(reco::Muon::TPFMS, (it->val));
353  }
354  if (pickyCollectionHandle_.isValid() && !pickyCollectionHandle_.failedToGet()) {
356  if (it != pickyCollectionHandle_->end())
357  aMuon.setMuonTrack(reco::Muon::Picky, (it->val));
358  }
359  if (dytCollectionHandle_.isValid() && !dytCollectionHandle_.failedToGet()) {
361  if (it != dytCollectionHandle_->end())
362  aMuon.setMuonTrack(reco::Muon::DYT, (it->val));
363  }
364  }
365  return aMuon;
366 }
reco::Muon makeMuon(edm::Event &iEvent, const edm::EventSetup &iSetup, const reco::TrackRef &track, TrackType type)
#define LogTrace(id)
virtual void setTunePBestTrack(MuonTrackType muonType)
Definition: Muon.h:88
virtual void setInnerTrack(const TrackRef &t)
set reference to Track
double ptThresholdToFillCandidateP4WithGlobalFit_
reco::Muon::MuonTrackTypePair sigmaSwitch(const reco::TrackRef &combinedTrack, const reco::TrackRef &trackerTrack, const double nSigma=2., const double ptThreshold=200.)
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)
Definition: MuonCocktails.cc:9
edm::Handle< reco::TrackToTrackMap > dytCollectionHandle_
bool isNull() const
Checks for null.
Definition: Ref.h:235
bool fillGlobalTrackRefits_
void setMuonTrack(const MuonTrackType &, const TrackRef &)
virtual void setOuterTrack(const TrackRef &t)
set reference to Track
reco::TrackRef getTevRefitTrack(const reco::TrackRef &combinedTrack, const reco::TrackToTrackMap &map)
virtual void setBestTrack(MuonTrackType muonType)
Definition: Muon.h:86
edm::Handle< reco::TrackToTrackMap > tpfmsCollectionHandle_
double sigmaThresholdToFillCandidateP4WithGlobalFit_
Log< level::Warning, false > LogWarning
std::pair< TrackRef, Muon::MuonTrackType > MuonTrackTypePair
Definition: Muon.h:38
virtual void setGlobalTrack(const TrackRef &t)
set reference to Track
edm::Handle< reco::TrackToTrackMap > pickyCollectionHandle_

◆ makeMuon() [3/3]

reco::Muon MuonIdProducer::makeMuon ( const reco::Track track)
private

Definition at line 1405 of file MuonIdProducer.cc.

References HCALHighEnergyHPDFilter_cfi::energy, mathSSE::sqrt(), and HLT_2022v15_cff::track.

1405  {
1406  const double energy = std::sqrt(track.p() * track.p() + 0.105658369 * 0.105658369);
1407  const math::XYZTLorentzVector p4(track.px(), track.py(), track.pz(), energy);
1408  return reco::Muon(track.charge(), p4, track.vertex());
1409 }
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
T sqrt(T t)
Definition: SSEVec.h:19

◆ overlap()

int MuonIdProducer::overlap ( const reco::Muon muon,
const reco::Track track 
)
private

Definition at line 402 of file MuonIdProducer.cc.

References chamberId(), match(), oniaPATMuonsWithTrigger_cff::matches, and HLT_2022v15_cff::track.

Referenced by produce().

402  {
403  if (!muon.isMatchesValid() || track.extra().isNull() || track.extra()->recHitsSize() == 0)
404  return 0;
405 
406  int numberOfCommonDetIds = 0;
407  const std::vector<reco::MuonChamberMatch>& matches(muon.matches());
408  for (const auto& match : matches) {
409  if (match.segmentMatches.empty())
410  continue;
411 
412  bool foundCommonDetId = false;
413  for (auto hit = track.extra()->recHitsBegin(); hit != track.extra()->recHitsEnd(); ++hit) {
414  // LogTrace("MuonIdentification") << "hit DetId: " << std::hex << hit->get()->geographicalId().rawId() <<
415  // "\t hit chamber DetId: " << getChamberId(hit->get()->geographicalId()) <<
416  // "\t segment DetId: " << match->id.rawId() << std::dec;
417 
418  if (chamberId((*hit)->geographicalId()) == match.id.rawId()) {
419  foundCommonDetId = true;
420  break;
421  }
422  }
423  if (foundCommonDetId) {
424  ++numberOfCommonDetIds;
425  break;
426  }
427  }
428  return numberOfCommonDetIds;
429 }
unsigned int chamberId(const DetId &)
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10

◆ phiOfMuonInteractionRegion()

double MuonIdProducer::phiOfMuonInteractionRegion ( const reco::Muon muon) const
private

Definition at line 1431 of file MuonIdProducer.cc.

References sectorPhi().

Referenced by produce().

1431  {
1432  if (muon.isStandAloneMuon())
1433  return muon.standAloneMuon()->innerPosition().phi();
1434  // the rest is tracker muon only
1435  if (muon.matches().empty()) {
1436  if (muon.innerTrack().isAvailable() && muon.innerTrack()->extra().isAvailable())
1437  return muon.innerTrack()->outerPosition().phi();
1438  else
1439  return muon.phi(); // makes little sense, but what else can I use
1440  }
1441  return sectorPhi(muon.matches().at(0).id);
1442 }
static double sectorPhi(const DetId &id)

◆ produce()

void MuonIdProducer::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
override

Definition at line 450 of file MuonIdProducer.cc.

References funct::abs(), TrackDetectorAssociator::Any, arbitrateMuons(), arbitrateTrackerMuons_, mergedMuons_cfi::caloMuons, checkLinks(), TrackDetectorAssociator::crossedIP(), debugWithTruthMatching_, reco::deltaPhi(), ecalDepositName_, makeMEIFBenchmarkPlots::ev, MuonCaloCompatibility::evaluate(), fillArbitrationInfo(), fillCaloCompatibility_, fillEnergy_, trigObjTnPSource_cfi::filler, fillGlbQuality(), fillGlobalTrackQuality_, fillIsolation_, fillMatching_, fillMuonId(), fillMuonIsolation(), fillShowerDigis_, fillTrackerKink(), fillTrackerKink_, reco::Muon::GEMMuon, edm::EventSetup::getData(), globalGeomToken_, reco::Muon::GlobalMuon, hcalDepositName_, reco::TrackBase::highPurity, hoDepositName_, mps_fire::i, iEvent, init(), reco::Muon::InnerTrack, innerTrackCollectionHandle_, TrackDetectorAssociator::InsideOut, isGoodCaloMuon(), isGoodGEMMuon(), isGoodME0Muon(), isGoodRPCMuon(), isGoodTrack(), isGoodTrackerMuon(), edm::HandleBase::isValid(), dqmiolumiharvest::j, jetDepositName_, linkCollectionHandle_, LogDebug, LogTrace, M_PI_2, makeCaloMuon(), makeMuon(), reco::Muon::ME0Muon, eostools::move(), muonCaloCompatibility_, muonCollectionHandle_, reco::MuonTime::nDof, reco::MuonTimeExtra::nDof(), custom_jme_cff::nMuons, reco::Muon::OuterTrack, outerTrackCollectionHandle_, TrackDetectorAssociator::OutsideIn, overlap(), phiOfMuonInteractionRegion(), edm::Handle< T >::product(), pvHandle_, reco::Muon::RPCMuon, selectHighPurity_, reco::Muon::StandAloneMuon, AlCaHLTBitMon_QueryRunRegistry::string, theShowerDigiFiller_, theTimingFiller_, reco::MuonTime::timeAtIpInOut, reco::MuonTimeExtra::timeAtIpInOut(), reco::MuonTime::timeAtIpInOutErr, reco::MuonTimeExtra::timeAtIpInOutErr(), reco::MuonTime::timeAtIpOutIn, reco::MuonTimeExtra::timeAtIpOutIn(), reco::MuonTime::timeAtIpOutInErr, reco::MuonTimeExtra::timeAtIpOutInErr(), HLT_2022v15_cff::track, trackDepositName_, susybsm::HSCParticleType::trackerMuon, reco::Muon::TrackerMuon, MuonIdTruthInfo::truthMatchMuon(), validateGlobalMuonPair(), and writeIsoDeposits_.

450  {
451  auto outputMuons = std::make_unique<reco::MuonCollection>();
452  auto caloMuons = std::make_unique<reco::CaloMuonCollection>();
453 
454  init(iEvent, iSetup);
455 
457  theShowerDigiFiller_->getDigis(iEvent);
458 
459  // loop over input collections
460 
461  // muons first - no cleaning, take as is.
463  for (const auto& muon : *muonCollectionHandle_) {
464  outputMuons->push_back(muon);
465  }
466  }
467 
468  // links second ( assume global muon type )
470  const auto nLink = linkCollectionHandle_->size();
471  std::vector<bool> goodmuons(nLink, true);
472  if (nLink > 1) {
473  // check for shared tracker tracks
474  for (unsigned int i = 0; i < nLink - 1; ++i) {
475  const auto& iLink = linkCollectionHandle_->at(i);
476  if (iLink.trackerTrack().isNull() || !checkLinks(&iLink))
477  continue;
478  for (unsigned int j = i + 1; j < nLink; ++j) {
479  const auto& jLink = linkCollectionHandle_->at(j);
480  if (!checkLinks(&jLink))
481  continue;
482  if (iLink.trackerTrack() == jLink.trackerTrack()) {
483  // Tracker track is the essential part that dominates muon resolution
484  // so taking either muon is fine. All that is important is to preserve
485  // the muon identification information. If number of hits is small,
486  // keep the one with large number of hits, otherwise take the smalest chi2/ndof
487  if (validateGlobalMuonPair(iLink, jLink))
488  goodmuons[j] = false;
489  else
490  goodmuons[i] = false;
491  }
492  }
493  }
494  // check for shared stand-alone muons.
495  for (unsigned int i = 0; i < nLink - 1; ++i) {
496  if (!goodmuons[i])
497  continue;
498  const auto& iLink = linkCollectionHandle_->at(i);
499  if (iLink.standAloneTrack().isNull() || !checkLinks(&iLink))
500  continue;
501  for (unsigned int j = i + 1; j < nLink; ++j) {
502  if (!goodmuons[j])
503  continue;
504  const auto& jLink = linkCollectionHandle_->at(j);
505  if (!checkLinks(&jLink))
506  continue;
507  if (iLink.standAloneTrack() == jLink.standAloneTrack()) {
508  if (validateGlobalMuonPair(iLink, jLink))
509  goodmuons[j] = false;
510  else
511  goodmuons[i] = false;
512  }
513  }
514  }
515  }
516  for (unsigned int i = 0; i < nLink; ++i) {
517  if (!goodmuons[i])
518  continue;
519  const auto& iLink = linkCollectionHandle_->at(i);
520  if (!checkLinks(&iLink))
521  continue;
522  // check if this muon is already in the list
523  bool newMuon = true;
524  for (const auto& muon : *outputMuons) {
525  if (muon.track() == iLink.trackerTrack() && muon.standAloneMuon() == iLink.standAloneTrack() &&
526  muon.combinedMuon() == iLink.globalTrack()) {
527  newMuon = false;
528  break;
529  }
530  }
531  if (newMuon) {
532  outputMuons->push_back(makeMuon(iLink));
533  outputMuons->back().setType(reco::Muon::GlobalMuon | reco::Muon::StandAloneMuon);
534  }
535  }
536  }
537 
538  // tracker and calo muons are next
540  LogTrace("MuonIdentification") << "Creating tracker muons";
541  std::vector<TrackDetectorAssociator::Direction> directions1, directions2;
542  directions1.push_back(TrackDetectorAssociator::InsideOut);
543  directions1.push_back(TrackDetectorAssociator::OutsideIn);
544  directions2.push_back(TrackDetectorAssociator::Any);
545 
546  const GlobalTrackingGeometry* geometry = nullptr;
548  geometry = &iSetup.getData(globalGeomToken_);
549  }
550 
551  for (unsigned int i = 0; i < innerTrackCollectionHandle_->size(); ++i) {
553  if (!isGoodTrack(track))
554  continue;
556  const reco::VertexCollection* recoVertices = pvHandle_.product();
557  if (!(*recoVertices)[0].isFake())
558  continue;
559  }
560  const auto& trackRef = reco::TrackRef(innerTrackCollectionHandle_, i);
561  bool splitTrack = false;
562  if (track.extra().isAvailable() && TrackDetectorAssociator::crossedIP(track))
563  splitTrack = true;
564  const auto& directions = splitTrack ? directions1 : directions2;
565  for (const auto direction : directions) {
566  // make muon
568  fillMuonId(iEvent, iSetup, trackerMuon, direction);
569 
571  // add MC hits to a list of matched segments.
572  // Since it's debugging mode - code is slow
574  }
575 
576  // check if this muon is already in the list
577  // have to check where muon hits are really located
578  // to match properly
579  bool newMuon = true;
580  const bool goodTrackerMuon = isGoodTrackerMuon(trackerMuon);
581  const bool goodRPCMuon = isGoodRPCMuon(trackerMuon);
582  const bool goodGEMMuon = isGoodGEMMuon(trackerMuon);
583  const bool goodME0Muon = isGoodME0Muon(trackerMuon);
584  if (goodTrackerMuon)
586  if (goodRPCMuon)
587  trackerMuon.setType(trackerMuon.type() | reco::Muon::RPCMuon);
588  if (goodGEMMuon)
589  trackerMuon.setType(trackerMuon.type() | reco::Muon::GEMMuon);
590  if (goodME0Muon)
591  trackerMuon.setType(trackerMuon.type() | reco::Muon::ME0Muon);
592 
593  for (auto& muon : *outputMuons) {
594  if (muon.innerTrack().get() == trackerMuon.innerTrack().get() &&
596  M_PI_2) {
597  newMuon = false;
598  muon.setMatches(trackerMuon.matches());
599  if (trackerMuon.isTimeValid())
600  muon.setTime(trackerMuon.time());
601  if (trackerMuon.isEnergyValid())
602  muon.setCalEnergy(trackerMuon.calEnergy());
603  if (goodTrackerMuon)
604  muon.setType(muon.type() | reco::Muon::TrackerMuon);
605  if (goodRPCMuon)
606  muon.setType(muon.type() | reco::Muon::RPCMuon);
607  if (goodGEMMuon)
608  muon.setType(muon.type() | reco::Muon::GEMMuon);
609  if (goodME0Muon)
610  muon.setType(muon.type() | reco::Muon::ME0Muon);
611  LogTrace("MuonIdentification") << "Found a corresponding global muon. Set energy, matches and move on";
612  break;
613  }
614  }
615  if (newMuon) {
616  if (goodTrackerMuon || goodRPCMuon || goodGEMMuon || goodME0Muon) {
617  outputMuons->push_back(trackerMuon);
618  } else {
619  LogTrace("MuonIdentification") << "track failed minimal number of muon matches requirement";
620  const reco::CaloMuon& caloMuon = makeCaloMuon(trackerMuon);
621  if (isGoodCaloMuon(caloMuon))
622  caloMuons->push_back(caloMuon);
623  }
624  }
625  }
626  }
627  }
628 
629  // and at last the stand alone muons
631  LogTrace("MuonIdentification") << "Looking for new muons among stand alone muon tracks";
632  for (unsigned int i = 0; i < outerTrackCollectionHandle_->size(); ++i) {
633  const auto& outerTrack = outerTrackCollectionHandle_->at(i);
634 
635  // check if this muon is already in the list of global muons
636  bool newMuon = true;
637  for (auto& muon : *outputMuons) {
638  if (!muon.standAloneMuon().isNull()) {
639  // global muon
640  if (muon.standAloneMuon().get() == &outerTrack ||
641  (muon.standAloneMuon()->extra().isNonnull() &&
642  muon.standAloneMuon()->extra().get() == outerTrack.extra().get())) {
643  newMuon = false;
644  break;
645  }
646  } else {
647  // tracker muon - no direct links to the standalone muon
648  // since we have only a few real muons in an event, matching
649  // the stand alone muon to the tracker muon by DetIds should
650  // be good enough for association. At the end it's up to a
651  // user to redefine the association and what it means. Here
652  // we would like to avoid obvious double counting and we
653  // tolerate a potential miss association
654  if (overlap(muon, outerTrack) > 0) {
655  LogTrace("MuonIdentification") << "Found associated tracker muon. Set a reference and move on";
656  newMuon = false;
658  muon.setType(muon.type() | reco::Muon::StandAloneMuon);
659  break;
660  }
661  }
662  }
663  if (newMuon) {
664  LogTrace("MuonIdentification") << "No associated stand alone track is found. Making a muon";
665  outputMuons->push_back(
667  outputMuons->back().setType(reco::Muon::StandAloneMuon);
668  }
669  }
670  }
671 
673  fillArbitrationInfo(outputMuons.get());
674  arbitrateMuons(outputMuons.get(), caloMuons.get());
675  }
676 
677  LogTrace("MuonIdentification") << "Dress up muons if it's necessary";
678 
679  const int nMuons = outputMuons->size();
680 
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);
689 
690  // Fill various information
691  for (unsigned int i = 0; i < outputMuons->size(); ++i) {
692  auto& muon = outputMuons->at(i);
693 
694  // Fill muonID
695  if ((fillMatching_ && !muon.isMatchesValid()) || (fillEnergy_ && !muon.isEnergyValid())) {
696  // predict direction based on the muon interaction region location
697  // if it's available
698  if (muon.isStandAloneMuon()) {
701  } else {
703  }
704  } else {
705  LogTrace("MuonIdentification") << "THIS SHOULD NEVER HAPPEN";
706  fillMuonId(iEvent, iSetup, muon);
707  }
708  }
709 
711  // Fill global quality information
712  fillGlbQuality(iEvent, iSetup, muon);
713  }
714  LogDebug("MuonIdentification") << "";
715 
716  if (fillTrackerKink_) {
718  }
719 
721  muon.setCaloCompatibility(muonCaloCompatibility_.evaluate(muon));
722 
723  if (fillIsolation_) {
725  iEvent, iSetup, muon, trackDepColl[i], ecalDepColl[i], hcalDepColl[i], hoDepColl[i], jetDepColl[i]);
726  }
727 
728  // fill timing information
729  reco::MuonTime muonTime;
730  reco::MuonTimeExtra dtTime;
731  reco::MuonTimeExtra cscTime;
732  reco::MuonTime rpcTime;
733  reco::MuonTimeExtra combinedTime;
734 
735  theTimingFiller_->fillTiming(muon, dtTime, cscTime, rpcTime, combinedTime, iEvent, iSetup);
736 
737  muonTime.nDof = combinedTime.nDof();
738  muonTime.timeAtIpInOut = combinedTime.timeAtIpInOut();
739  muonTime.timeAtIpInOutErr = combinedTime.timeAtIpInOutErr();
740  muonTime.timeAtIpOutIn = combinedTime.timeAtIpOutIn();
741  muonTime.timeAtIpOutInErr = combinedTime.timeAtIpOutInErr();
742 
743  muon.setTime(muonTime);
744  muon.setRPCTime(rpcTime);
745  dtTimeColl[i] = dtTime;
746  cscTimeColl[i] = cscTime;
747  combinedTimeColl[i] = combinedTime;
748  }
749 
750  LogTrace("MuonIdentification") << "number of muons produced: " << outputMuons->size();
751  if (fillMatching_) {
752  fillArbitrationInfo(outputMuons.get(), reco::Muon::TrackerMuon);
753  fillArbitrationInfo(outputMuons.get(), reco::Muon::ME0Muon);
754  fillArbitrationInfo(outputMuons.get(), reco::Muon::GEMMuon);
755  }
756  edm::OrphanHandle<reco::MuonCollection> muonHandle = iEvent.put(std::move(outputMuons));
757 
758  auto fillMap = [](auto refH, auto& vec, edm::Event& ev, const std::string& cAl = "") {
760  auto oMap = std::make_unique<MapType>();
761  {
762  typename MapType::Filler filler(*oMap);
763  filler.insert(refH, vec.begin(), vec.end());
764  vec.clear();
765  filler.fill();
766  }
767  ev.put(std::move(oMap), cAl);
768  };
769  fillMap(muonHandle, combinedTimeColl, iEvent, "combined");
770  fillMap(muonHandle, dtTimeColl, iEvent, "dt");
771  fillMap(muonHandle, cscTimeColl, iEvent, "csc");
772 
774  fillMap(muonHandle, trackDepColl, iEvent, trackDepositName_);
775  fillMap(muonHandle, ecalDepColl, iEvent, ecalDepositName_);
776  fillMap(muonHandle, hcalDepColl, iEvent, hcalDepositName_);
777  fillMap(muonHandle, hoDepColl, iEvent, hoDepositName_);
778  fillMap(muonHandle, jetDepColl, iEvent, jetDepositName_);
779  }
780 
781  iEvent.put(std::move(caloMuons));
782 }
std::string hoDepositName_
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
std::string jetDepositName_
bool isGoodRPCMuon(const reco::Muon &muon)
reco::Muon makeMuon(edm::Event &iEvent, const edm::EventSetup &iSetup, const reco::TrackRef &track, TrackType type)
static const unsigned int GlobalMuon
Definition: Muon.h:289
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)
static bool crossedIP(const reco::Track &track)
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
static void truthMatchMuon(const edm::Event &iEvent, const GlobalTrackingGeometry &iGeometry, reco::Muon &aMuon)
void fillMuonId(edm::Event &, const edm::EventSetup &, reco::Muon &, TrackDetectorAssociator::Direction direction=TrackDetectorAssociator::InsideOut)
edm::Handle< reco::MuonTrackLinksCollection > linkCollectionHandle_
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
Definition: Handle.h:70
double evaluate(const reco::Muon &)
#define M_PI_2
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
MuonCaloCompatibility muonCaloCompatibility_
float timeAtIpOutInErr() const
Definition: MuonTimeExtra.h:49
bool arbitrateTrackerMuons_
void fillGlbQuality(edm::Event &, const edm::EventSetup &, reco::Muon &aMuon)
float timeAtIpOutInErr
Definition: MuonTime.h:17
float timeAtIpInOutErr() const
Definition: MuonTimeExtra.h:44
float timeAtIpInOut() const
Definition: MuonTimeExtra.h:43
std::unique_ptr< MuonTimingFiller > theTimingFiller_
#define LogTrace(id)
double phiOfMuonInteractionRegion(const reco::Muon &muon) const
edm::ESGetToken< GlobalTrackingGeometry, GlobalTrackingGeometryRecord > globalGeomToken_
void init(edm::Event &, const edm::EventSetup &)
int iEvent
Definition: GenABIO.cc:224
std::unique_ptr< MuonShowerDigiFiller > theShowerDigiFiller_
edm::Handle< reco::VertexCollection > pvHandle_
bool isGoodME0Muon(const reco::Muon &muon)
void fillTrackerKink(reco::Muon &aMuon)
static const unsigned int ME0Muon
Definition: Muon.h:296
bool isGoodTrackerMuon(const reco::Muon &muon)
float timeAtIpInOutErr
Definition: MuonTime.h:14
std::string ecalDepositName_
bool checkLinks(const reco::MuonTrackLinks *) const
float timeAtIpOutIn
b) particle is moving from outside in
Definition: MuonTime.h:16
int nDof
number of muon stations used
Definition: MuonTime.h:9
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int nDof() const
number of measurements used in timing calculation
Definition: MuonTimeExtra.h:22
edm::Handle< reco::TrackCollection > outerTrackCollectionHandle_
reco::CaloMuon makeCaloMuon(const reco::Muon &)
static const unsigned int RPCMuon
Definition: Muon.h:294
static const unsigned int TrackerMuon
Definition: Muon.h:290
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:20
void arbitrateMuons(reco::MuonCollection *, reco::CaloMuonCollection *)
bool fillGlobalTrackQuality_
bool isValid() const
Definition: HandleBase.h:70
float timeAtIpOutIn() const
b) particle is moving from outside in
Definition: MuonTimeExtra.h:48
std::string hcalDepositName_
static const unsigned int GEMMuon
Definition: Muon.h:295
edm::Handle< reco::TrackCollection > innerTrackCollectionHandle_
bool isGoodTrack(const reco::Track &track)
static const unsigned int StandAloneMuon
Definition: Muon.h:291
bool validateGlobalMuonPair(const reco::MuonTrackLinks &goodMuon, const reco::MuonTrackLinks &badMuon)
bool debugWithTruthMatching_
float timeAtIpInOut
Definition: MuonTime.h:13
bool isGoodCaloMuon(const reco::CaloMuon &muon)
def move(src, dest)
Definition: eostools.py:511
edm::Handle< reco::MuonCollection > muonCollectionHandle_
#define LogDebug(id)

◆ sectorPhi()

double MuonIdProducer::sectorPhi ( const DetId id)
static

Definition at line 1411 of file MuonIdProducer.cc.

References MuonSubdetId::CSC, MuonSubdetId::DT, M_PI, phi, DTChamberId::sector(), and CSCDetId::triggerSector().

Referenced by phiOfMuonInteractionRegion().

1411  {
1412  double phi = 0;
1413  if (id.subdetId() == MuonSubdetId::DT) { // DT
1414  DTChamberId muonId(id.rawId());
1415  if (muonId.sector() <= 12)
1416  phi = (muonId.sector() - 1) / 6. * M_PI;
1417  if (muonId.sector() == 13)
1418  phi = 3 / 6. * M_PI;
1419  if (muonId.sector() == 14)
1420  phi = 9 / 6. * M_PI;
1421  }
1422  if (id.subdetId() == MuonSubdetId::CSC) { // CSC
1423  CSCDetId muonId(id.rawId());
1424  phi = M_PI / 4 + (muonId.triggerSector() - 1) / 3. * M_PI;
1425  }
1426  if (phi > M_PI)
1427  phi -= 2 * M_PI;
1428  return phi;
1429 }
#define M_PI
static constexpr int DT
Definition: MuonSubdetId.h:11
static constexpr int CSC
Definition: MuonSubdetId.h:12

Member Data Documentation

◆ addExtraSoftMuons_

bool MuonIdProducer::addExtraSoftMuons_
private

Definition at line 206 of file MuonIdProducer.h.

Referenced by isGoodRPCMuon(), isGoodTrackerMuon(), and MuonIdProducer().

◆ arbClean_

bool MuonIdProducer::arbClean_
private

Definition at line 280 of file MuonIdProducer.h.

Referenced by fillArbitrationInfo(), and MuonIdProducer().

◆ arbitrateTrackerMuons_

bool MuonIdProducer::arbitrateTrackerMuons_
private

Definition at line 225 of file MuonIdProducer.h.

Referenced by MuonIdProducer(), and produce().

◆ caloCut_

double MuonIdProducer::caloCut_
private

Definition at line 278 of file MuonIdProducer.h.

Referenced by isGoodCaloMuon(), and MuonIdProducer().

◆ debugWithTruthMatching_

bool MuonIdProducer::debugWithTruthMatching_
private

Definition at line 227 of file MuonIdProducer.h.

Referenced by MuonIdProducer(), and produce().

◆ dytCollectionHandle_

edm::Handle<reco::TrackToTrackMap> MuonIdProducer::dytCollectionHandle_
private

Definition at line 235 of file MuonIdProducer.h.

Referenced by init(), and makeMuon().

◆ dytCollectionToken_

edm::EDGetTokenT<reco::TrackToTrackMap> MuonIdProducer::dytCollectionToken_
private

Definition at line 244 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ ecalDepositName_

std::string MuonIdProducer::ecalDepositName_
private

Definition at line 264 of file MuonIdProducer.h.

Referenced by MuonIdProducer(), and produce().

◆ fillCaloCompatibility_

bool MuonIdProducer::fillCaloCompatibility_
private

Definition at line 215 of file MuonIdProducer.h.

Referenced by makeCaloMuon(), MuonIdProducer(), and produce().

◆ fillEnergy_

bool MuonIdProducer::fillEnergy_
private

Definition at line 216 of file MuonIdProducer.h.

Referenced by fillMuonId(), MuonIdProducer(), and produce().

◆ fillGlobalTrackQuality_

bool MuonIdProducer::fillGlobalTrackQuality_
private

Definition at line 269 of file MuonIdProducer.h.

Referenced by init(), MuonIdProducer(), and produce().

◆ fillGlobalTrackRefits_

bool MuonIdProducer::fillGlobalTrackRefits_
private

Definition at line 270 of file MuonIdProducer.h.

Referenced by init(), makeMuon(), and MuonIdProducer().

◆ fillIsolation_

bool MuonIdProducer::fillIsolation_
private

Definition at line 220 of file MuonIdProducer.h.

Referenced by MuonIdProducer(), and produce().

◆ fillMatching_

bool MuonIdProducer::fillMatching_
private

Definition at line 218 of file MuonIdProducer.h.

Referenced by beginRun(), fillMuonId(), MuonIdProducer(), and produce().

◆ fillShowerDigis_

bool MuonIdProducer::fillShowerDigis_
private

Definition at line 219 of file MuonIdProducer.h.

Referenced by beginRun(), fillMuonId(), MuonIdProducer(), and produce().

◆ fillTrackerKink_

bool MuonIdProducer::fillTrackerKink_
private

Definition at line 275 of file MuonIdProducer.h.

Referenced by init(), MuonIdProducer(), and produce().

◆ gemHitHandle_

edm::Handle<GEMRecHitCollection> MuonIdProducer::gemHitHandle_
private

Definition at line 252 of file MuonIdProducer.h.

Referenced by fillMuonId(), and init().

◆ gemHitToken_

edm::EDGetTokenT<GEMRecHitCollection> MuonIdProducer::gemHitToken_
private

Definition at line 248 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ geomTokenRun_

const edm::ESGetToken<CSCGeometry, MuonGeometryRecord> MuonIdProducer::geomTokenRun_
private

Definition at line 255 of file MuonIdProducer.h.

Referenced by beginRun().

◆ glbQualHandle_

edm::Handle<edm::ValueMap<reco::MuonQuality> > MuonIdProducer::glbQualHandle_
private

Definition at line 253 of file MuonIdProducer.h.

Referenced by fillGlbQuality(), and init().

◆ glbQualToken_

edm::EDGetTokenT<edm::ValueMap<reco::MuonQuality> > MuonIdProducer::glbQualToken_
private

Definition at line 249 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ globalGeomToken_

edm::ESGetToken<GlobalTrackingGeometry, GlobalTrackingGeometryRecord> MuonIdProducer::globalGeomToken_
private

Definition at line 257 of file MuonIdProducer.h.

Referenced by MuonIdProducer(), and produce().

◆ globalTrackQualityInputTag_

edm::InputTag MuonIdProducer::globalTrackQualityInputTag_
private

Definition at line 271 of file MuonIdProducer.h.

◆ hcalDepositName_

std::string MuonIdProducer::hcalDepositName_
private

Definition at line 265 of file MuonIdProducer.h.

Referenced by MuonIdProducer(), and produce().

◆ hoDepositName_

std::string MuonIdProducer::hoDepositName_
private

Definition at line 266 of file MuonIdProducer.h.

Referenced by MuonIdProducer(), and produce().

◆ innerTrackCollectionHandle_

edm::Handle<reco::TrackCollection> MuonIdProducer::innerTrackCollectionHandle_
private

Definition at line 229 of file MuonIdProducer.h.

Referenced by init(), and produce().

◆ innerTrackCollectionToken_

edm::EDGetTokenT<reco::TrackCollection> MuonIdProducer::innerTrackCollectionToken_
private

Definition at line 238 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ inputCollectionLabels_

std::vector<edm::InputTag> MuonIdProducer::inputCollectionLabels_
private

Definition at line 193 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ inputCollectionTypes_

std::vector<ICTypes::ICTypeKey> MuonIdProducer::inputCollectionTypes_
private

Definition at line 194 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ jetDepositName_

std::string MuonIdProducer::jetDepositName_
private

Definition at line 267 of file MuonIdProducer.h.

Referenced by MuonIdProducer(), and produce().

◆ linkCollectionHandle_

edm::Handle<reco::MuonTrackLinksCollection> MuonIdProducer::linkCollectionHandle_
private

Definition at line 232 of file MuonIdProducer.h.

Referenced by init(), and produce().

◆ linkCollectionToken_

edm::EDGetTokenT<reco::MuonTrackLinksCollection> MuonIdProducer::linkCollectionToken_
private

Definition at line 241 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ maxAbsDx_

double MuonIdProducer::maxAbsDx_
private

Definition at line 209 of file MuonIdProducer.h.

Referenced by fillMuonId(), and MuonIdProducer().

◆ maxAbsDy_

double MuonIdProducer::maxAbsDy_
private

Definition at line 211 of file MuonIdProducer.h.

Referenced by fillMuonId(), and MuonIdProducer().

◆ maxAbsEta_

double MuonIdProducer::maxAbsEta_
private

Definition at line 205 of file MuonIdProducer.h.

Referenced by isGoodTrack(), and MuonIdProducer().

◆ maxAbsPullX2_

double MuonIdProducer::maxAbsPullX2_
private

Definition at line 210 of file MuonIdProducer.h.

Referenced by fillMuonId(), and MuonIdProducer().

◆ maxAbsPullY2_

double MuonIdProducer::maxAbsPullY2_
private

Definition at line 212 of file MuonIdProducer.h.

Referenced by fillMuonId(), and MuonIdProducer().

◆ meshAlgo_

std::unique_ptr<MuonMesh> MuonIdProducer::meshAlgo_
private

Definition at line 281 of file MuonIdProducer.h.

Referenced by beginRun(), fillArbitrationInfo(), and MuonIdProducer().

◆ minNumberOfMatches_

int MuonIdProducer::minNumberOfMatches_
private

Definition at line 204 of file MuonIdProducer.h.

Referenced by arbitrateMuons(), isGoodRPCMuon(), isGoodTrackerMuon(), and MuonIdProducer().

◆ minP_

double MuonIdProducer::minP_
private

◆ minPCaloMuon_

double MuonIdProducer::minPCaloMuon_
private

Definition at line 203 of file MuonIdProducer.h.

Referenced by isGoodCaloMuon(), isGoodTrack(), and MuonIdProducer().

◆ minPt_

double MuonIdProducer::minPt_
private

◆ muIsoExtractorCalo_

std::unique_ptr<reco::isodeposit::IsoDepositExtractor> MuonIdProducer::muIsoExtractorCalo_
private

Definition at line 260 of file MuonIdProducer.h.

Referenced by fillMuonIsolation(), and MuonIdProducer().

◆ muIsoExtractorJet_

std::unique_ptr<reco::isodeposit::IsoDepositExtractor> MuonIdProducer::muIsoExtractorJet_
private

Definition at line 262 of file MuonIdProducer.h.

Referenced by fillMuonIsolation(), and MuonIdProducer().

◆ muIsoExtractorTrack_

std::unique_ptr<reco::isodeposit::IsoDepositExtractor> MuonIdProducer::muIsoExtractorTrack_
private

Definition at line 261 of file MuonIdProducer.h.

Referenced by fillMuonIsolation(), and MuonIdProducer().

◆ muonCaloCompatibility_

MuonCaloCompatibility MuonIdProducer::muonCaloCompatibility_
private

Definition at line 259 of file MuonIdProducer.h.

Referenced by makeCaloMuon(), MuonIdProducer(), and produce().

◆ muonCollectionHandle_

edm::Handle<reco::MuonCollection> MuonIdProducer::muonCollectionHandle_
private

Definition at line 231 of file MuonIdProducer.h.

Referenced by init(), and produce().

◆ muonCollectionToken_

edm::EDGetTokenT<reco::MuonCollection> MuonIdProducer::muonCollectionToken_
private

Definition at line 240 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ outerTrackCollectionHandle_

edm::Handle<reco::TrackCollection> MuonIdProducer::outerTrackCollectionHandle_
private

Definition at line 230 of file MuonIdProducer.h.

Referenced by init(), and produce().

◆ outerTrackCollectionToken_

edm::EDGetTokenT<reco::TrackCollection> MuonIdProducer::outerTrackCollectionToken_
private

Definition at line 239 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ parameters_

TrackAssociatorParameters MuonIdProducer::parameters_
private

◆ pickyCollectionHandle_

edm::Handle<reco::TrackToTrackMap> MuonIdProducer::pickyCollectionHandle_
private

Definition at line 234 of file MuonIdProducer.h.

Referenced by init(), and makeMuon().

◆ pickyCollectionToken_

edm::EDGetTokenT<reco::TrackToTrackMap> MuonIdProducer::pickyCollectionToken_
private

Definition at line 243 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ propagatorToken_

const edm::ESGetToken<Propagator, TrackingComponentsRecord> MuonIdProducer::propagatorToken_
private

Definition at line 256 of file MuonIdProducer.h.

Referenced by init().

◆ ptThresholdToFillCandidateP4WithGlobalFit_

double MuonIdProducer::ptThresholdToFillCandidateP4WithGlobalFit_
private

Definition at line 222 of file MuonIdProducer.h.

Referenced by makeMuon(), and MuonIdProducer().

◆ pvHandle_

edm::Handle<reco::VertexCollection> MuonIdProducer::pvHandle_
private

Definition at line 236 of file MuonIdProducer.h.

Referenced by init(), and produce().

◆ pvInputTag_

edm::InputTag MuonIdProducer::pvInputTag_
private

Definition at line 273 of file MuonIdProducer.h.

◆ pvToken_

edm::EDGetTokenT<reco::VertexCollection> MuonIdProducer::pvToken_
private

Definition at line 245 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ rpcHitHandle_

edm::Handle<RPCRecHitCollection> MuonIdProducer::rpcHitHandle_
private

Definition at line 251 of file MuonIdProducer.h.

Referenced by fillMuonId(), and init().

◆ rpcHitToken_

edm::EDGetTokenT<RPCRecHitCollection> MuonIdProducer::rpcHitToken_
private

Definition at line 247 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ selectHighPurity_

bool MuonIdProducer::selectHighPurity_
private

Definition at line 274 of file MuonIdProducer.h.

Referenced by init(), MuonIdProducer(), and produce().

◆ sigmaThresholdToFillCandidateP4WithGlobalFit_

double MuonIdProducer::sigmaThresholdToFillCandidateP4WithGlobalFit_
private

Definition at line 223 of file MuonIdProducer.h.

Referenced by makeMuon(), and MuonIdProducer().

◆ storeCrossedHcalRecHits_

bool MuonIdProducer::storeCrossedHcalRecHits_
private

Definition at line 217 of file MuonIdProducer.h.

Referenced by fillMuonId(), and MuonIdProducer().

◆ theShowerDigiFiller_

std::unique_ptr<MuonShowerDigiFiller> MuonIdProducer::theShowerDigiFiller_
private

Definition at line 198 of file MuonIdProducer.h.

Referenced by beginRun(), fillMuonId(), MuonIdProducer(), and produce().

◆ theTimingFiller_

std::unique_ptr<MuonTimingFiller> MuonIdProducer::theTimingFiller_
private

Definition at line 196 of file MuonIdProducer.h.

Referenced by MuonIdProducer(), and produce().

◆ tpfmsCollectionHandle_

edm::Handle<reco::TrackToTrackMap> MuonIdProducer::tpfmsCollectionHandle_
private

Definition at line 233 of file MuonIdProducer.h.

Referenced by init(), and makeMuon().

◆ tpfmsCollectionToken_

edm::EDGetTokenT<reco::TrackToTrackMap> MuonIdProducer::tpfmsCollectionToken_
private

Definition at line 242 of file MuonIdProducer.h.

Referenced by init(), and MuonIdProducer().

◆ trackAssociator_

TrackDetectorAssociator MuonIdProducer::trackAssociator_
private

Definition at line 146 of file MuonIdProducer.h.

Referenced by fillMuonId(), and init().

◆ trackDepositName_

std::string MuonIdProducer::trackDepositName_
private

Definition at line 263 of file MuonIdProducer.h.

Referenced by MuonIdProducer(), and produce().

◆ trackerKinkFinder_

std::unique_ptr<MuonKinkFinder> MuonIdProducer::trackerKinkFinder_
private

Definition at line 276 of file MuonIdProducer.h.

Referenced by fillTrackerKink(), init(), and MuonIdProducer().

◆ writeIsoDeposits_

bool MuonIdProducer::writeIsoDeposits_
private

Definition at line 221 of file MuonIdProducer.h.

Referenced by fillMuonIsolation(), MuonIdProducer(), and produce().