File indexing completed on 2024-04-06 12:24:08
0001 #include "PhysicsTools/RecoUtils/interface/CheckHitPattern.h"
0002
0003
0004 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0005 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
0006
0007
0008 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
0009 #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h"
0010
0011 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0012 #include "Geometry/Records/interface/TrackerTopologyRcd.h"
0013
0014 #include "TrackingTools/Records/interface/TransientTrackRecord.h"
0015 #include "DataFormats/Math/interface/deltaPhi.h"
0016
0017 #include "FWCore/Utilities/interface/Exception.h"
0018 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0019
0020 void CheckHitPattern::init(const TrackerTopology* tTopo,
0021 const TrackerGeometry& geom,
0022 const TransientTrackBuilder& builder) {
0023 trkTool_ = &builder;
0024
0025
0026
0027
0028 geomInitDone_ = true;
0029
0030 const TrackingGeometry::DetContainer& dets = geom.dets();
0031
0032
0033 for (unsigned int i = 0; i < dets.size(); i++) {
0034
0035 DetInfo detInfo = this->interpretDetId(dets[i]->geographicalId(), tTopo);
0036 uint32_t subDet = detInfo.first;
0037
0038
0039 double r_or_z;
0040 if (this->barrel(subDet)) {
0041 r_or_z = dets[i]->position().perp();
0042 } else {
0043 r_or_z = fabs(dets[i]->position().z());
0044 }
0045
0046
0047 double minRZ = 999.;
0048 double maxRZ = 0.;
0049 if (rangeRorZ_.find(detInfo) != rangeRorZ_.end()) {
0050 minRZ = rangeRorZ_[detInfo].first;
0051 maxRZ = rangeRorZ_[detInfo].second;
0052 }
0053
0054
0055 if (minRZ > r_or_z)
0056 minRZ = r_or_z;
0057 if (maxRZ < r_or_z)
0058 maxRZ = r_or_z;
0059 rangeRorZ_[detInfo] = std::pair<double, double>(minRZ, maxRZ);
0060 }
0061
0062 #ifdef DEBUG_CHECKHITPATTERN
0063 RZrangeMap::const_iterator d;
0064 for (d = rangeRorZ_.begin(); d != rangeRorZ_.end(); d++) {
0065 DetInfo detInfo = d->first;
0066 std::pair<double, double> rangeRZ = d->second;
0067 std::std::cout << "CHECKHITPATTERN: Tracker subdetector type=" << detInfo.first << " layer=" << detInfo.second
0068 << " has min r (or z) =" << rangeRZ.first << " and max r (or z) = " << rangeRZ.second
0069 << std::std::endl;
0070 }
0071 #endif
0072 }
0073
0074 CheckHitPattern::DetInfo CheckHitPattern::interpretDetId(DetId detId, const TrackerTopology* tTopo) {
0075
0076
0077 return DetInfo(detId.subdetId(), tTopo->layer(detId));
0078 }
0079
0080 bool CheckHitPattern::barrel(uint32_t subDet) {
0081
0082 return (subDet == StripSubdetector::TIB || subDet == StripSubdetector::TOB ||
0083 subDet == PixelSubdetector::PixelBarrel);
0084 }
0085
0086 CheckHitPattern::Result CheckHitPattern::operator()(const reco::Track& track, const VertexState& vert) const {
0087
0088
0089
0090
0091 if (!geomInitDone_)
0092 throw cms::Exception("CheckHitPattern::operator() called before CheckHitPattern::init");
0093
0094
0095
0096
0097
0098 reco::TransientTrack t_trk = trkTool_->build(track);
0099 GlobalVector p3_trk = t_trk.trajectoryStateClosestToPoint(vert.position()).momentum();
0100 bool trkGoesInsideOut =
0101 fabs(reco::deltaPhi<const GlobalVector, const GlobalPoint>(p3_trk, vert.position())) < 0.5 * M_PI;
0102
0103 LogDebug("CHP") << "TRACK: in-->out ? " << trkGoesInsideOut << " dxy=" << track.dxy() << " sz=" << track.dz()
0104 << " eta=" << track.eta() << " barrel hits=" << track.hitPattern().numberOfValidPixelHits() << "/"
0105 << track.hitPattern().numberOfValidStripTIBHits() << "/"
0106 << track.hitPattern().numberOfValidStripTOBHits();
0107 LogDebug("CHP") << "VERT: r=" << vert.position().perp() << " z=" << vert.position().z();
0108
0109
0110 const reco::HitPattern& hp = track.hitPattern();
0111
0112
0113
0114 unsigned int nHitBefore = 0;
0115 for (int i = 0; i < hp.numberOfAllHits(reco::HitPattern::TRACK_HITS); i++) {
0116 uint32_t hit = hp.getHitPattern(reco::HitPattern::TRACK_HITS, i);
0117 if (reco::HitPattern::trackerHitFilter(hit) && reco::HitPattern::validHitFilter(hit)) {
0118 uint32_t subDet = reco::HitPattern::getSubStructure(hit);
0119 uint32_t layer = reco::HitPattern::getLayer(hit);
0120 DetInfo detInfo(subDet, layer);
0121 auto maxRZ = (*rangeRorZ_.find(detInfo)).second.second;
0122
0123 if (this->barrel(subDet)) {
0124
0125 if (vert.position().perp() > maxRZ && trkGoesInsideOut)
0126 nHitBefore++;
0127 } else {
0128 if (fabs(vert.position().z()) > maxRZ)
0129 nHitBefore++;
0130 }
0131 }
0132 }
0133
0134
0135
0136 unsigned int nMissHitAfter = 0;
0137 for (int i = 0; i < hp.numberOfAllHits(reco::HitPattern::MISSING_INNER_HITS); i++) {
0138 uint32_t hit = hp.getHitPattern(reco::HitPattern::MISSING_INNER_HITS, i);
0139
0140 if (reco::HitPattern::trackerHitFilter(hit) && reco::HitPattern::missingHitFilter(hit)) {
0141 uint32_t subDet = reco::HitPattern::getSubStructure(hit);
0142 uint32_t layer = reco::HitPattern::getLayer(hit);
0143 DetInfo detInfo(subDet, layer);
0144 auto minRZ = (*rangeRorZ_.find(detInfo)).second.first;
0145
0146 if (this->barrel(subDet)) {
0147
0148
0149 if (vert.position().perp() < minRZ || !trkGoesInsideOut)
0150 nMissHitAfter++;
0151 } else {
0152 if (fabs(vert.position().z()) < minRZ)
0153 nMissHitAfter++;
0154 }
0155 }
0156 }
0157
0158 Result result;
0159 result.hitsInFrontOfVert = nHitBefore;
0160 result.missHitsAfterVert = nMissHitAfter;
0161 return result;
0162 }
0163
0164 void CheckHitPattern::print(const reco::Track& track) {
0165
0166 const reco::HitPattern& hp = track.hitPattern();
0167 std::cout << "=== Hits on Track ===" << std::endl;
0168 print(reco::HitPattern::TRACK_HITS, hp);
0169 std::cout << "=== Hits before track ===" << std::endl;
0170 print(reco::HitPattern::MISSING_INNER_HITS, hp);
0171 }
0172
0173 void CheckHitPattern::print(const reco::HitPattern::HitCategory category, const reco::HitPattern& hp) {
0174 for (int i = 0; i < hp.numberOfAllHits(category); i++) {
0175 uint32_t hit = hp.getHitPattern(category, i);
0176 if (reco::HitPattern::trackerHitFilter(hit)) {
0177 uint32_t subdet = reco::HitPattern::getSubStructure(hit);
0178 uint32_t layer = reco::HitPattern::getLayer(hit);
0179 std::cout << "hit " << i << " subdet=" << subdet << " layer=" << layer << " type " << hp.getHitType(hit)
0180 << std::endl;
0181 }
0182 }
0183 }