File indexing completed on 2023-10-25 10:02:26
0001 #include "TkDoubleSensMeasurementDet.h"
0002
0003 #include "TrackingTools/MeasurementDet/interface/MeasurementDetException.h"
0004
0005 using namespace std;
0006
0007 TkDoubleSensMeasurementDet::TkDoubleSensMeasurementDet(const DoubleSensGeomDet* gdet,
0008 const PixelClusterParameterEstimator* cpe)
0009 : MeasurementDet(gdet), thePixelCPE(cpe), theFirstDet(nullptr), theSecondDet(nullptr) {}
0010
0011 void TkDoubleSensMeasurementDet::init(const MeasurementDet* firstDet, const MeasurementDet* secondDet) {
0012 theFirstDet = dynamic_cast<const TkPixelMeasurementDet*>(firstDet);
0013 theSecondDet = dynamic_cast<const TkPixelMeasurementDet*>(secondDet);
0014
0015 if ((theFirstDet == nullptr) || (theSecondDet == nullptr)) {
0016 throw MeasurementDetException(
0017 "TkDoubleSensMeasurementDet ERROR: Trying to glue a det which is not a TkPixelMeasurementDet");
0018 }
0019 }
0020
0021 TkDoubleSensMeasurementDet::RecHitContainer TkDoubleSensMeasurementDet::recHits(
0022 const TrajectoryStateOnSurface& ts, const MeasurementTrackerEvent& data) const {
0023 RecHitContainer result;
0024
0025 if (data.pixelData().handle()->data().empty())
0026 return result;
0027 LogTrace("MeasurementTracker") << " is not empty";
0028 if (!isActive(data))
0029 return result;
0030 LogTrace("MeasurementTracker") << " and is active";
0031
0032
0033 const detset& firstDetSet = data.pixelData().detSet(firstDet()->index());
0034 const detset& secondDetSet = data.pixelData().detSet(secondDet()->index());
0035 std::vector<bool> skipClustersUpper(data.pixelClustersToSkip().empty() ? 0 : secondDetSet.size(), false);
0036 std::vector<bool> skipClustersLower(data.pixelClustersToSkip().empty() ? 0 : firstDetSet.size(), false);
0037
0038 const SiPixelCluster* begin = nullptr;
0039 if (!data.pixelData().handle()->data().empty()) {
0040 begin = &(data.pixelData().handle()->data().front());
0041 }
0042 if (!data.pixelClustersToSkip().empty()) {
0043 if (!firstDetSet.empty()) {
0044 for (const_iterator cil = firstDetSet.begin(); cil != firstDetSet.end(); ++cil) {
0045 if (cil < begin) {
0046 edm::LogError("IndexMisMatch") << "TkDoubleSensMeasurementDet cannot create hit because of index mismatch.";
0047 return result;
0048 }
0049 unsigned int indexl = cil - begin;
0050 if (data.pixelClustersToSkip()[indexl]) {
0051 int iLocalL = std::distance(firstDetSet.begin(), cil);
0052 skipClustersLower[iLocalL] = true;
0053 }
0054 }
0055 }
0056 if (!secondDetSet.empty()) {
0057 for (const_iterator ciu = secondDetSet.begin(); ciu != secondDetSet.end(); ++ciu) {
0058 if (ciu < begin) {
0059 edm::LogError("IndexMisMatch") << "TkDoubleSensMeasurementDet cannot create hit because of index mismatch.";
0060 return result;
0061 }
0062 unsigned int indexu = ciu - begin;
0063 if (data.pixelClustersToSkip()[indexu]) {
0064 int iLocalU = std::distance(secondDetSet.begin(), ciu);
0065 skipClustersUpper[iLocalU] = true;
0066 }
0067 }
0068 }
0069 }
0070
0071 return result;
0072 }
0073
0074 bool TkDoubleSensMeasurementDet::measurements(const TrajectoryStateOnSurface& stateOnThisDet,
0075 const MeasurementEstimator& est,
0076 const MeasurementTrackerEvent& data,
0077 TempMeasurements& result) const {
0078 LogDebug("MeasurementTracker") << "TkDoubleSensMeasurementDet::measurements";
0079
0080 if (!isActive(data)) {
0081 result.add(theInactiveHit, 0.F);
0082 return true;
0083 }
0084
0085 LogTrace("MeasurementTracker") << " is active";
0086
0087 auto oldSize = result.size();
0088 MeasurementDet::RecHitContainer&& allHits = recHits(stateOnThisDet, data);
0089
0090 for (auto&& hit : allHits) {
0091 std::pair<bool, double> diffEst = est.estimate(stateOnThisDet, *hit);
0092 if (diffEst.first) {
0093 LogDebug("MeasurementTracker") << "New vh added with chi2: " << diffEst.second;
0094 result.add(std::move(hit), diffEst.second);
0095 }
0096 }
0097
0098 if (result.size() > oldSize)
0099 return true;
0100
0101
0102 result.add(theMissingHit, 0.F);
0103 LogDebug("MeasurementTracker") << "adding missing hit";
0104 return false;
0105 }