diff --git a/Validation/RecoTrack/plugins/BuildFile.xml b/Validation/RecoTrack/plugins/BuildFile.xml index b0284ed3f3618..322b636ba73a0 100644 --- a/Validation/RecoTrack/plugins/BuildFile.xml +++ b/Validation/RecoTrack/plugins/BuildFile.xml @@ -22,6 +22,7 @@ + diff --git a/Validation/RecoTrack/plugins/TrackingNtuple.cc b/Validation/RecoTrack/plugins/TrackingNtuple.cc index 9a60ce7c7e442..b98d01a7dcbf7 100644 --- a/Validation/RecoTrack/plugins/TrackingNtuple.cc +++ b/Validation/RecoTrack/plugins/TrackingNtuple.cc @@ -55,6 +55,8 @@ #include "MagneticField/Engine/interface/MagneticField.h" #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h" +#include "DataFormats/Phase2TrackerCluster/interface/Phase2TrackerCluster1D.h" + #include "DataFormats/SiPixelDetId/interface/PixelChannelIdentifier.h" #include "DataFormats/SiStripCluster/interface/SiStripClusterTools.h" #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h" @@ -492,6 +494,7 @@ class TrackingNtuple : public edm::one::EDAnalyzer { using PixelMaskContainer = edm::ContainerMask>; using StripMaskContainer = edm::ContainerMask>; + using Phase2OTMaskContainer = edm::ContainerMask>; struct TPHitIndex { TPHitIndex(unsigned int tp = 0, unsigned int simHit = 0, float to = 0, unsigned int id = 0) @@ -681,6 +684,7 @@ class TrackingNtuple : public edm::one::EDAnalyzer { std::vector>> pixelUseMaskTokens_; std::vector>> stripUseMaskTokens_; + std::vector>> ph2OTUseMaskTokens_; std::string builderName_; const bool includeSeeds_; @@ -1287,6 +1291,7 @@ class TrackingNtuple : public edm::one::EDAnalyzer { std::vector ph2_radL; //http://cmslxr.fnal.gov/lxr/source/DataFormats/GeometrySurface/interface/MediumProperties.h std::vector ph2_bbxi; + std::vector ph2_usedMask; //////////////////// // invalid (missing/inactive/etc) hits @@ -1490,6 +1495,7 @@ TrackingNtuple::TrackingNtuple(const edm::ParameterSet& iConfig) auto const& maskVPset = iConfig.getUntrackedParameterSetVector("clusterMasks"); pixelUseMaskTokens_.reserve(maskVPset.size()); stripUseMaskTokens_.reserve(maskVPset.size()); + ph2OTUseMaskTokens_.reserve(maskVPset.size()); for (auto const& mask : maskVPset) { auto index = mask.getUntrackedParameter("index"); assert(index < 64); @@ -1498,6 +1504,9 @@ TrackingNtuple::TrackingNtuple(const edm::ParameterSet& iConfig) if (includeStripHits_) stripUseMaskTokens_.emplace_back( index, consumes(mask.getUntrackedParameter("src"))); + if (includePhase2OTHits_) + ph2OTUseMaskTokens_.emplace_back( + index, consumes(mask.getUntrackedParameter("src"))); } } @@ -1872,7 +1881,7 @@ TrackingNtuple::TrackingNtuple(const edm::ParameterSet& iConfig) t->Branch("ph2_zx", &ph2_zx); t->Branch("ph2_radL", &ph2_radL); t->Branch("ph2_bbxi", &ph2_bbxi); - t->Branch("ph2_bbxi", &ph2_bbxi); + t->Branch("ph2_usedMask", &ph2_usedMask); } //invalid hits t->Branch("inv_isBarrel", &inv_isBarrel); @@ -2299,6 +2308,7 @@ void TrackingNtuple::clearVariables() { ph2_zx.clear(); ph2_radL.clear(); ph2_bbxi.clear(); + ph2_usedMask.clear(); //invalid hits inv_isBarrel.clear(); inv_detId.clear(); @@ -3315,6 +3325,22 @@ void TrackingNtuple::fillPhase2OTHits(const edm::Event& iEvent, const TrackerTopology& tTopo, const SimHitRefKeyToIndex& simHitRefKeyToIndex, std::set& hitProductIds) { + std::vector> phase2OTMasks; + phase2OTMasks.reserve(ph2OTUseMaskTokens_.size()); + for (const auto& itoken : ph2OTUseMaskTokens_) { + edm::Handle aH; + iEvent.getByToken(itoken.second, aH); + phase2OTMasks.emplace_back(1 << itoken.first, aH.product()); + } + auto ph2OTUsedMask = [&phase2OTMasks](size_t key) { + uint64_t mask = 0; + for (auto const& m : phase2OTMasks) { + if (m.second->mask(key)) + mask |= m.first; + } + return mask; + }; + edm::Handle phase2OTHits; iEvent.getByToken(phase2OTRecHitToken_, phase2OTHits); for (auto it = phase2OTHits->begin(); it != phase2OTHits->end(); it++) { @@ -3350,6 +3376,7 @@ void TrackingNtuple::fillPhase2OTHits(const edm::Event& iEvent, ph2_zx.push_back(hit->globalPositionError().czx()); ph2_radL.push_back(hit->surface()->mediumProperties().radLen()); ph2_bbxi.push_back(hit->surface()->mediumProperties().xi()); + ph2_usedMask.push_back(ph2OTUsedMask(hit->firstClusterRef().key())); LogTrace("TrackingNtuple") << "phase2 OT cluster=" << key << " subdId=" << hitId.subdetId() << " lay=" << lay << " rawId=" << hitId.rawId() << " pos =" << hit->globalPosition();