File indexing completed on 2024-04-06 12:32:50
0001 #include "Validation/MuonGEMDigis/interface/GEMDigiMatcher.h"
0002
0003 using namespace std;
0004
0005 GEMDigiMatcher::GEMDigiMatcher(const edm::ParameterSet& pset, edm::ConsumesCollector&& iC) {
0006 const auto& gemSimLink = pset.getParameterSet("gemSimLink");
0007 simMuOnly_ = gemSimLink.getParameter<bool>("simMuOnly");
0008 discardEleHits_ = gemSimLink.getParameter<bool>("discardEleHits");
0009 verboseSimLink_ = gemSimLink.getParameter<int>("verbose");
0010
0011 const auto& gemDigi = pset.getParameterSet("gemStripDigi");
0012 minBXDigi_ = gemDigi.getParameter<int>("minBX");
0013 maxBXDigi_ = gemDigi.getParameter<int>("maxBX");
0014 matchDeltaStrip_ = gemDigi.getParameter<int>("matchDeltaStrip");
0015 verboseDigi_ = gemDigi.getParameter<int>("verbose");
0016 matchToSimLink_ = gemDigi.getParameter<bool>("matchToSimLink");
0017
0018 const auto& gemPad = pset.getParameterSet("gemPadDigi");
0019 minBXPad_ = gemPad.getParameter<int>("minBX");
0020 maxBXPad_ = gemPad.getParameter<int>("maxBX");
0021 verbosePad_ = gemPad.getParameter<int>("verbose");
0022
0023 const auto& gemCluster = pset.getParameterSet("gemPadCluster");
0024 minBXCluster_ = gemCluster.getParameter<int>("minBX");
0025 maxBXCluster_ = gemCluster.getParameter<int>("maxBX");
0026 verboseCluster_ = gemCluster.getParameter<int>("verbose");
0027
0028 const auto& gemCoPad = pset.getParameterSet("gemCoPadDigi");
0029 minBXCoPad_ = gemCoPad.getParameter<int>("minBX");
0030 maxBXCoPad_ = gemCoPad.getParameter<int>("maxBX");
0031 verboseCoPad_ = gemCoPad.getParameter<int>("verbose");
0032
0033
0034 muonSimHitMatcher_.reset(new GEMSimHitMatcher(pset, std::move(iC)));
0035
0036 if (matchToSimLink_)
0037 gemSimLinkToken_ =
0038 iC.consumes<edm::DetSetVector<GEMDigiSimLink>>(gemSimLink.getParameter<edm::InputTag>("inputTag"));
0039 gemDigiToken_ = iC.consumes<GEMDigiCollection>(gemDigi.getParameter<edm::InputTag>("inputTag"));
0040 gemPadToken_ = iC.consumes<GEMPadDigiCollection>(gemPad.getParameter<edm::InputTag>("inputTag"));
0041 gemClusterToken_ = iC.consumes<GEMPadDigiClusterCollection>(gemCluster.getParameter<edm::InputTag>("inputTag"));
0042 gemCoPadToken_ = iC.consumes<GEMCoPadDigiCollection>(gemCoPad.getParameter<edm::InputTag>("inputTag"));
0043
0044 geomToken_ = iC.esConsumes<GEMGeometry, MuonGeometryRecord>();
0045 }
0046
0047 void GEMDigiMatcher::init(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0048 muonSimHitMatcher_->init(iEvent, iSetup);
0049
0050 if (matchToSimLink_)
0051 iEvent.getByToken(gemSimLinkToken_, gemDigisSLH_);
0052 iEvent.getByToken(gemDigiToken_, gemDigisH_);
0053 iEvent.getByToken(gemPadToken_, gemPadsH_);
0054 iEvent.getByToken(gemClusterToken_, gemClustersH_);
0055 iEvent.getByToken(gemCoPadToken_, gemCoPadsH_);
0056
0057 const auto gemH = iSetup.getHandle(geomToken_);
0058 if (!gemH.isValid()) {
0059 gemGeometry_ = nullptr;
0060 edm::LogError("GEMDigiMatcher") << "Failed to initialize GEM geometry.";
0061 }
0062 gemGeometry_ = gemH.product();
0063 }
0064
0065
0066 void GEMDigiMatcher::match(const SimTrack& t, const SimVertex& v) {
0067
0068 muonSimHitMatcher_->match(t, v);
0069
0070
0071 const GEMDigiCollection& gemDigis = *gemDigisH_.product();
0072 const GEMPadDigiCollection& gemPads = *gemPadsH_.product();
0073 const GEMPadDigiClusterCollection& gemClusters = *gemClustersH_.product();
0074 const GEMCoPadDigiCollection& gemCoPads = *gemCoPadsH_.product();
0075
0076 clear();
0077
0078
0079 if (std::abs(t.momentum().eta()) < 1.55)
0080 return;
0081
0082
0083 if (matchToSimLink_) {
0084 const edm::DetSetVector<GEMDigiSimLink>& gemDigisSL = *gemDigisSLH_.product();
0085 matchDigisSLToSimTrack(gemDigisSL);
0086 }
0087 matchDigisToSimTrack(gemDigis);
0088 matchPadsToSimTrack(gemPads);
0089 matchClustersToSimTrack(gemClusters);
0090 matchCoPadsToSimTrack(gemCoPads);
0091 }
0092
0093 void GEMDigiMatcher::matchDigisSLToSimTrack(const edm::DetSetVector<GEMDigiSimLink>& digisSL) {
0094 if (verboseSimLink_)
0095 edm::LogInfo("GEMDigiMatcher") << "Matching simtrack to GEM simlinks" << endl;
0096
0097
0098 for (auto itsimlink = digisSL.begin(); itsimlink != digisSL.end(); itsimlink++) {
0099 GEMDetId p_id(itsimlink->id);
0100 for (auto sl = itsimlink->data.begin(); sl != itsimlink->data.end(); ++sl) {
0101
0102 const auto& detids(muonSimHitMatcher_->detIds());
0103 if (detids.find(p_id.rawId()) == detids.end())
0104 continue;
0105
0106
0107 if (muonSimHitMatcher_->hitsInDetId(p_id.rawId()).empty())
0108 continue;
0109
0110 if (verboseSimLink_)
0111 edm::LogInfo("GEMDigiMatcher") << "GEMDigiSimLink " << p_id << " " << sl->getStrip() << " " << sl->getBx()
0112 << " " << sl->getTrackId() << std::endl;
0113
0114
0115 if (simMuOnly_ && std::abs(sl->getParticleType()) != 13)
0116 continue;
0117
0118
0119 if (discardEleHits_ && std::abs(sl->getParticleType()) == 11)
0120 continue;
0121
0122
0123 for (const auto& simhit : muonSimHitMatcher_->hitsInDetId(p_id.rawId())) {
0124
0125 if (simhit.trackId() == sl->getTrackId() and simhit.particleType() == sl->getParticleType()) {
0126 detid_to_simLinks_[p_id.rawId()].push_back(*sl);
0127 if (verboseSimLink_)
0128 edm::LogInfo("GEMDigiMatcher") << "...was matched!" << endl;
0129 break;
0130 }
0131 }
0132 }
0133 }
0134 }
0135
0136 void GEMDigiMatcher::matchDigisToSimTrack(const GEMDigiCollection& digis) {
0137 if (verboseDigi_)
0138 edm::LogInfo("GEMDigiMatcher") << "Matching simtrack to GEM digis" << endl;
0139 for (auto id : muonSimHitMatcher_->detIds()) {
0140 GEMDetId p_id(id);
0141 const auto& hit_strips = muonSimHitMatcher_->hitStripsInDetId(id, matchDeltaStrip_);
0142 const auto& digis_in_det = digis.get(p_id);
0143
0144 for (auto d = digis_in_det.first; d != digis_in_det.second; ++d) {
0145 bool isMatched = false;
0146
0147
0148 if (d->bx() < minBXDigi_ || d->bx() > maxBXDigi_)
0149 continue;
0150
0151 if (verboseDigi_)
0152 edm::LogInfo("GEMDigiMatcher") << "GEMDigi " << p_id << " " << *d << endl;
0153
0154
0155 if (matchToSimLink_) {
0156
0157 for (const auto& sl : detid_to_simLinks_[p_id.rawId()]) {
0158 if (sl.getStrip() == d->strip() and sl.getBx() == d->bx()) {
0159 isMatched = true;
0160 break;
0161 }
0162 }
0163 }
0164
0165 else {
0166
0167 if (hit_strips.find(d->strip()) != hit_strips.end()) {
0168 isMatched = true;
0169 }
0170 }
0171 if (isMatched) {
0172 detid_to_digis_[p_id.rawId()].push_back(*d);
0173 chamber_to_digis_[p_id.chamberId().rawId()].push_back(*d);
0174 superchamber_to_digis_[p_id.superChamberId().rawId()].push_back(*d);
0175 if (verboseDigi_)
0176 edm::LogInfo("GEMDigiMatcher") << "...was matched!" << endl;
0177 }
0178 }
0179 }
0180 }
0181 void GEMDigiMatcher::matchPadsToSimTrack(const GEMPadDigiCollection& pads) {
0182 for (auto it = pads.begin(); it != pads.end(); ++it) {
0183 const GEMDetId& p_id = (*it).first;
0184 const auto& padsvec = (*it).second;
0185
0186 for (auto pad = padsvec.first; pad != padsvec.second; ++pad) {
0187
0188 if (pad->bx() < minBXPad_ || pad->bx() > maxBXPad_)
0189 continue;
0190
0191 if (verbosePad_)
0192 edm::LogInfo("GEMDigiMatcher") << "GEMPad " << p_id << " " << *pad << endl;
0193
0194 auto digivec = detid_to_digis_[p_id.rawId()];
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207 if (p_id.roll() % 2 == 1 && p_id.isGE21() && pad->nPartitions() == GEMPadDigi::GE21SplitStrip) {
0208
0209 GEMDetId p_id2(p_id.region(), p_id.ring(), p_id.station(), p_id.layer(), p_id.chamber(), p_id.roll() + 1);
0210
0211
0212 auto digivec2 = detid_to_digis_[p_id2.rawId()];
0213
0214
0215 digivec.insert(digivec.end(), digivec2.begin(), digivec2.end());
0216 }
0217 for (const auto& digi : digivec) {
0218
0219 const bool match8Partition(digi.strip() / 2 == pad->pad());
0220
0221
0222 const bool match16Partition(digi.strip() == pad->pad());
0223
0224
0225 const bool matchGE0(p_id.isME0() and match8Partition);
0226 const bool matchGE11(p_id.isGE11() and match8Partition);
0227 const bool matchGE21_8(p_id.isGE21() and pad->nPartitions() == GEMPadDigi::GE21 and match8Partition);
0228 const bool matchGE21_16(p_id.isGE21() and pad->nPartitions() == GEMPadDigi::GE21SplitStrip and
0229 match16Partition);
0230
0231
0232 if (matchGE0 or matchGE11 or matchGE21_8 or matchGE21_16) {
0233 detid_to_pads_[p_id.rawId()].push_back(*pad);
0234 chamber_to_pads_[p_id.chamberId().rawId()].push_back(*pad);
0235 superchamber_to_pads_[p_id.superChamberId().rawId()].push_back(*pad);
0236 if (verbosePad_)
0237 edm::LogInfo("GEMDigiMatcher") << "...was matched!" << endl;
0238 break;
0239 }
0240 }
0241 }
0242 }
0243 }
0244
0245 void GEMDigiMatcher::matchClustersToSimTrack(const GEMPadDigiClusterCollection& clusters) {
0246 for (auto it = clusters.begin(); it != clusters.end(); ++it) {
0247 const GEMDetId p_id = (*it).first;
0248 const auto clvec = (*it).second;
0249 for (auto cluster = clvec.first; cluster != clvec.second; ++cluster) {
0250 bool isMatched = false;
0251
0252
0253 if (cluster->bx() < minBXCluster_ || cluster->bx() > maxBXCluster_)
0254 continue;
0255
0256 if (verboseCluster_)
0257 edm::LogInfo("GEMDigiMatcher") << "GEMCluster " << p_id << " " << *cluster << endl;
0258
0259
0260 for (const auto& p : cluster->pads()) {
0261 for (const auto& pad : detid_to_pads_[p_id.rawId()]) {
0262 if (pad.pad() == p) {
0263 isMatched = true;
0264 }
0265 }
0266 }
0267 if (isMatched) {
0268 detid_to_clusters_[p_id.rawId()].push_back(*cluster);
0269 chamber_to_clusters_[p_id.chamberId().rawId()].push_back(*cluster);
0270 superchamber_to_clusters_[p_id.superChamberId().rawId()].push_back(*cluster);
0271 if (verboseCluster_)
0272 edm::LogInfo("GEMDigiMatcher") << "...was matched!" << endl;
0273 }
0274 }
0275 }
0276 }
0277
0278 void GEMDigiMatcher::matchCoPadsToSimTrack(const GEMCoPadDigiCollection& co_pads) {
0279
0280 for (auto d : superChamberIdsPad()) {
0281 GEMDetId id(d);
0282
0283 const auto& co_pads_in_det = co_pads.get(id);
0284 for (auto copad = co_pads_in_det.first; copad != co_pads_in_det.second; ++copad) {
0285
0286 if (copad->bx(1) < minBXCoPad_ || copad->bx(1) > maxBXCoPad_)
0287 continue;
0288
0289 if (verboseCoPad_)
0290 edm::LogInfo("GEMDigiMatcher") << "GEMCoPadDigi: " << id << " " << *copad << endl;
0291
0292 bool isMatchedL1 = false;
0293 bool isMatchedL2 = false;
0294 GEMDetId gemL1_id(id.region(), 1, id.station(), 1, id.chamber(), copad->roll());
0295 GEMDetId gemL2_id(id.region(), 1, id.station(), 2, id.chamber(), 0);
0296
0297
0298 for (const auto& p : padsInDetId(gemL1_id.rawId())) {
0299 if (p == copad->first()) {
0300 isMatchedL1 = true;
0301 }
0302 }
0303
0304
0305 for (const auto& p : padsInChamber(gemL2_id.rawId())) {
0306 if (p == copad->second()) {
0307 isMatchedL2 = true;
0308 }
0309 }
0310 if (isMatchedL1 and isMatchedL2) {
0311 superchamber_to_copads_[id.rawId()].push_back(*copad);
0312 if (verboseCoPad_)
0313 edm::LogInfo("GEMDigiMatcher") << "...was matched! " << endl;
0314 }
0315 }
0316 }
0317 }
0318
0319 std::set<unsigned int> GEMDigiMatcher::detIdsSimLink(int gem_type) const {
0320 return selectDetIds(detid_to_simLinks_, gem_type);
0321 }
0322
0323 std::set<unsigned int> GEMDigiMatcher::detIdsDigi(int gem_type) const {
0324 return selectDetIds(detid_to_digis_, gem_type);
0325 }
0326
0327 std::set<unsigned int> GEMDigiMatcher::detIdsPad(int gem_type) const { return selectDetIds(detid_to_pads_, gem_type); }
0328
0329 std::set<unsigned int> GEMDigiMatcher::detIdsCluster(int gem_type) const {
0330 return selectDetIds(detid_to_clusters_, gem_type);
0331 }
0332
0333 std::set<unsigned int> GEMDigiMatcher::chamberIdsDigi(int gem_type) const {
0334 return selectDetIds(chamber_to_digis_, gem_type);
0335 }
0336
0337 std::set<unsigned int> GEMDigiMatcher::chamberIdsPad(int gem_type) const {
0338 return selectDetIds(chamber_to_pads_, gem_type);
0339 }
0340
0341 std::set<unsigned int> GEMDigiMatcher::chamberIdsCluster(int gem_type) const {
0342 return selectDetIds(chamber_to_clusters_, gem_type);
0343 }
0344
0345 std::set<unsigned int> GEMDigiMatcher::superChamberIdsDigi(int gem_type) const {
0346 return selectDetIds(superchamber_to_digis_, gem_type);
0347 }
0348
0349 std::set<unsigned int> GEMDigiMatcher::superChamberIdsPad(int gem_type) const {
0350 return selectDetIds(superchamber_to_pads_, gem_type);
0351 }
0352
0353 std::set<unsigned int> GEMDigiMatcher::superChamberIdsCluster(int gem_type) const {
0354 return selectDetIds(superchamber_to_clusters_, gem_type);
0355 }
0356
0357 std::set<unsigned int> GEMDigiMatcher::superChamberIdsCoPad(int gem_type) const {
0358 return selectDetIds(superchamber_to_copads_, gem_type);
0359 }
0360
0361 const GEMDigiContainer& GEMDigiMatcher::digisInDetId(unsigned int detid) const {
0362 if (detid_to_digis_.find(detid) == detid_to_digis_.end())
0363 return no_gem_digis_;
0364 return detid_to_digis_.at(detid);
0365 }
0366
0367 const GEMDigiContainer& GEMDigiMatcher::digisInChamber(unsigned int detid) const {
0368 if (chamber_to_digis_.find(detid) == chamber_to_digis_.end())
0369 return no_gem_digis_;
0370 return chamber_to_digis_.at(detid);
0371 }
0372
0373 const GEMDigiContainer& GEMDigiMatcher::digisInSuperChamber(unsigned int detid) const {
0374 if (superchamber_to_digis_.find(detid) == superchamber_to_digis_.end())
0375 return no_gem_digis_;
0376 return superchamber_to_digis_.at(detid);
0377 }
0378
0379 const GEMPadDigiContainer& GEMDigiMatcher::padsInDetId(unsigned int detid) const {
0380 if (detid_to_pads_.find(detid) == detid_to_pads_.end())
0381 return no_gem_pads_;
0382 return detid_to_pads_.at(detid);
0383 }
0384
0385 const GEMPadDigiContainer& GEMDigiMatcher::padsInChamber(unsigned int detid) const {
0386 if (chamber_to_pads_.find(detid) == chamber_to_pads_.end())
0387 return no_gem_pads_;
0388 return chamber_to_pads_.at(detid);
0389 }
0390
0391 const GEMPadDigiContainer& GEMDigiMatcher::padsInSuperChamber(unsigned int detid) const {
0392 if (superchamber_to_pads_.find(detid) == superchamber_to_pads_.end())
0393 return no_gem_pads_;
0394 return superchamber_to_pads_.at(detid);
0395 }
0396
0397 const GEMPadDigiClusterContainer& GEMDigiMatcher::clustersInDetId(unsigned int detid) const {
0398 if (detid_to_clusters_.find(detid) == detid_to_clusters_.end())
0399 return no_gem_clusters_;
0400 return detid_to_clusters_.at(detid);
0401 }
0402
0403 const GEMPadDigiClusterContainer& GEMDigiMatcher::clustersInChamber(unsigned int detid) const {
0404 if (chamber_to_clusters_.find(detid) == chamber_to_clusters_.end())
0405 return no_gem_clusters_;
0406 return chamber_to_clusters_.at(detid);
0407 }
0408
0409 const GEMPadDigiClusterContainer& GEMDigiMatcher::clustersInSuperChamber(unsigned int detid) const {
0410 if (superchamber_to_clusters_.find(detid) == superchamber_to_clusters_.end())
0411 return no_gem_clusters_;
0412 return superchamber_to_clusters_.at(detid);
0413 }
0414
0415 const GEMCoPadDigiContainer& GEMDigiMatcher::coPadsInSuperChamber(unsigned int detid) const {
0416 if (superchamber_to_copads_.find(detid) == superchamber_to_copads_.end())
0417 return no_gem_copads_;
0418 return superchamber_to_copads_.at(detid);
0419 }
0420
0421 int GEMDigiMatcher::nLayersWithDigisInSuperChamber(unsigned int detid) const {
0422 set<int> layers;
0423 GEMDetId sch_id(detid);
0424 for (int iLayer = 1; iLayer <= 2; iLayer++) {
0425 GEMDetId ch_id(sch_id.region(), sch_id.ring(), sch_id.station(), iLayer, sch_id.chamber(), 0);
0426
0427 const auto& digis = digisInChamber(ch_id.rawId());
0428
0429 if (!digis.empty()) {
0430 layers.insert(iLayer);
0431 }
0432 }
0433 return layers.size();
0434 }
0435
0436 int GEMDigiMatcher::nLayersWithPadsInSuperChamber(unsigned int detid) const {
0437 set<int> layers;
0438 GEMDetId sch_id(detid);
0439 for (int iLayer = 1; iLayer <= 2; iLayer++) {
0440 GEMDetId ch_id(sch_id.region(), sch_id.ring(), sch_id.station(), iLayer, sch_id.chamber(), 0);
0441
0442 const auto& pads = padsInChamber(ch_id.rawId());
0443
0444 if (!pads.empty()) {
0445 layers.insert(iLayer);
0446 }
0447 }
0448 return layers.size();
0449 }
0450
0451 int GEMDigiMatcher::nLayersWithClustersInSuperChamber(unsigned int detid) const {
0452 set<int> layers;
0453 GEMDetId sch_id(detid);
0454 for (int iLayer = 1; iLayer <= 2; iLayer++) {
0455 GEMDetId ch_id(sch_id.region(), sch_id.ring(), sch_id.station(), iLayer, sch_id.chamber(), 0);
0456
0457 const auto& clusters = clustersInChamber(ch_id.rawId());
0458
0459 if (!clusters.empty()) {
0460 layers.insert(iLayer);
0461 }
0462 }
0463 return layers.size();
0464 }
0465
0466 int GEMDigiMatcher::nPads() const {
0467 int n = 0;
0468 const auto& ids = superChamberIdsPad();
0469 for (const auto& id : ids) {
0470 n += padsInSuperChamber(id).size();
0471 }
0472 return n;
0473 }
0474
0475 int GEMDigiMatcher::nCoPads() const {
0476 int n = 0;
0477 const auto& ids = superChamberIdsCoPad();
0478 for (const auto& id : ids) {
0479 n += coPadsInSuperChamber(id).size();
0480 }
0481 return n;
0482 }
0483
0484 std::set<int> GEMDigiMatcher::stripNumbersInDetId(unsigned int detid) const {
0485 set<int> result;
0486 const auto& digis = digisInDetId(detid);
0487 for (const auto& d : digis) {
0488 result.insert(d.strip());
0489 }
0490 return result;
0491 }
0492
0493 std::set<int> GEMDigiMatcher::padNumbersInDetId(unsigned int detid) const {
0494 set<int> result;
0495 const auto& digis = padsInDetId(detid);
0496 for (const auto& d : digis) {
0497 result.insert(d.pad());
0498 }
0499 return result;
0500 }
0501
0502 std::set<int> GEMDigiMatcher::partitionNumbers() const {
0503 std::set<int> result;
0504
0505 const auto& detids = detIdsDigi();
0506 for (const auto& id : detids) {
0507 const GEMDetId& idd(id);
0508 result.insert(idd.roll());
0509 }
0510 return result;
0511 }
0512
0513 std::set<int> GEMDigiMatcher::partitionNumbersWithCoPads() const {
0514 std::set<int> result;
0515
0516 const auto& detids = superChamberIdsCoPad();
0517 for (const auto& id : detids) {
0518 const GEMDetId& idd(id);
0519 result.insert(idd.roll());
0520 }
0521 return result;
0522 }
0523
0524 GlobalPoint GEMDigiMatcher::getGlobalPointDigi(unsigned int rawId, const GEMDigi& d) const {
0525 GEMDetId gem_id(rawId);
0526 const LocalPoint& gem_lp = gemGeometry_->etaPartition(gem_id)->centreOfStrip(d.strip());
0527 const GlobalPoint& gem_gp = gemGeometry_->idToDet(gem_id)->surface().toGlobal(gem_lp);
0528 return gem_gp;
0529 }
0530
0531 GlobalPoint GEMDigiMatcher::getGlobalPointPad(unsigned int rawId, const GEMPadDigi& tp) const {
0532 GEMDetId gem_id(rawId);
0533 const LocalPoint& gem_lp = gemGeometry_->etaPartition(gem_id)->centreOfPad(tp.pad());
0534 const GlobalPoint& gem_gp = gemGeometry_->idToDet(gem_id)->surface().toGlobal(gem_lp);
0535 return gem_gp;
0536 }
0537
0538 void GEMDigiMatcher::clear() {
0539 detid_to_simLinks_.clear();
0540
0541 detid_to_digis_.clear();
0542 chamber_to_digis_.clear();
0543 superchamber_to_digis_.clear();
0544
0545 detid_to_pads_.clear();
0546 chamber_to_pads_.clear();
0547 superchamber_to_pads_.clear();
0548
0549 detid_to_clusters_.clear();
0550 chamber_to_clusters_.clear();
0551 superchamber_to_clusters_.clear();
0552
0553 superchamber_to_copads_.clear();
0554 }