Back to home page

Project CMSSW displayed by LXR

 
 

    


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   //find clusters to skip
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   // create a TrajectoryMeasurement with an invalid RecHit and zero estimate
0102   result.add(theMissingHit, 0.F);
0103   LogDebug("MeasurementTracker") << "adding missing hit";
0104   return false;
0105 }