Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-09 23:33:06

0001 #ifndef CalibFormats_SiStripObjects_StripClusterizerConditions_h
0002 #define CalibFormats_SiStripObjects_StripClusterizerConditions_h
0003 
0004 #include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
0005 #include "CalibFormats/SiStripObjects/interface/SiStripQuality.h"
0006 #include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
0007 
0008 /**
0009  * Cache of the noise and quality ranges per module, and the 1/gain value for each APV, for fast access by the clusterizer
0010  */
0011 class SiStripClusterizerConditions {
0012 public:
0013   static constexpr unsigned short invalidI = std::numeric_limits<unsigned short>::max();
0014 
0015   struct Det {
0016     bool valid() const { return ind != invalidI; }
0017     uint16_t rawNoise(const uint16_t strip) const { return rawNoises[strip]; }
0018     float noise(const uint16_t strip) const { return 0.1f * float(rawNoises[strip]); }
0019     float weight(const uint16_t strip) const { return m_weight[strip / 128]; }
0020     bool bad(const uint16_t strip) const { return qualityBits[strip]; }
0021     bool allBadBetween(uint16_t L, const uint16_t& R) const {
0022       while (++L < R && bad(L)) {
0023       };
0024       return L == R;
0025     }
0026     static constexpr uint16_t kMaxStrips = 768;
0027     SiStripQuality const* quality;
0028     SiStripQuality::Range qualityRange;
0029     std::array<bool, kMaxStrips> qualityBits = {};
0030     SiStripNoises::Range noiseRange;
0031     std::array<uint16_t, kMaxStrips> rawNoises = {};
0032     float m_weight[6];
0033     uint32_t detId = 0;
0034     unsigned short ind = invalidI;
0035   };
0036 
0037   explicit SiStripClusterizerConditions(const SiStripQuality* quality) : m_quality(quality) {}
0038 
0039   std::vector<uint32_t> const& allDetIds() const { return m_detIds; }
0040   auto const& allDets() const { return m_dets; }
0041 
0042   std::vector<const FedChannelConnection*> const& currentConnection(const Det& det) const {
0043     return m_connections[det.ind];
0044   }
0045 
0046   Det const& findDetId(const uint32_t id) const {
0047     auto b = m_detIds.begin();
0048     auto e = m_detIds.end();
0049     auto p = std::lower_bound(b, e, id);
0050     if (p == e || id != (*p)) {
0051 #ifdef NOT_ON_MONTECARLO
0052       edm::LogWarning("StripClusterizerAlgorithm")
0053           << "id " << id << " not connected. this is impossible on data " << std::endl;
0054 #endif
0055       static const Det dummy = Det();
0056       return dummy;
0057     }
0058     return m_dets[p - m_detIds.begin()];
0059   }
0060   bool isModuleBad(const uint32_t id) const { return m_quality->IsModuleBad(id); }
0061   bool isModuleUsable(const uint32_t id) const { return m_quality->IsModuleUsable(id); }
0062 
0063   void reserve(std::size_t length) {
0064     m_detIds.reserve(length);
0065     m_dets.reserve(length);
0066     m_connections.reserve(length);
0067   }
0068   void emplace_back(uint32_t id,
0069                     SiStripQuality::Range qualityRange,
0070                     SiStripNoises::Range noiseRange,
0071                     const std::vector<float>& invGains,
0072                     const std::vector<const FedChannelConnection*>& connections) {
0073     const unsigned short index = m_detIds.size();
0074     m_detIds.push_back(id);
0075     auto& det = m_dets.emplace_back();
0076     det.quality = m_quality;
0077     det.qualityRange = qualityRange;
0078     for (uint16_t s = 0U; s < det.kMaxStrips; ++s)
0079       det.qualityBits[s] = m_quality->IsStripBad(qualityRange, s);
0080     det.noiseRange = noiseRange;
0081     auto maxRange8 = (noiseRange.second - noiseRange.first) * 8;
0082     for (uint16_t s = 0U; s < det.kMaxStrips; ++s) {
0083       if (9 * s >= maxRange8)
0084         break;
0085       det.rawNoises[s] = SiStripNoises::getRawNoise(s, noiseRange);
0086     }
0087     for (uint32_t i = 0; i != invGains.size(); ++i) {
0088       det.m_weight[i] = invGains[i];
0089     }
0090     det.detId = id;
0091     det.ind = index;
0092     m_connections.push_back(connections);
0093   }
0094 
0095 private:
0096   const SiStripQuality* m_quality;
0097   std::vector<uint32_t> m_detIds;
0098   std::vector<Det> m_dets;
0099   std::vector<std::vector<const FedChannelConnection*>> m_connections;
0100 };
0101 
0102 #endif  // CalibFormats_SiStripObjects_StripClusterizerConditions_h