Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 11:58:18

0001 #ifndef CalibFormats_SiStripObjects_SiStripHashedDetId_H
0002 #define CalibFormats_SiStripObjects_SiStripHashedDetId_H
0003 
0004 #include "DataFormats/DetId/interface/DetId.h"
0005 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
0006 #include <algorithm>
0007 #include <iomanip>
0008 #include <vector>
0009 #include <cstdint>
0010 
0011 class SiStripHashedDetId;
0012 std::ostream &operator<<(std::ostream &os, const SiStripHashedDetId &);
0013 
0014 /**
0015     @class SiStripHashedDetId
0016     @author R.Bainbridge
0017     @brief Provides dense hash map in place of DetId
0018 */
0019 class SiStripHashedDetId {
0020 public:
0021   // ---------- constructors ----------
0022 
0023   /** Constructor taking raw DetIds as input. */
0024   SiStripHashedDetId(const std::vector<uint32_t> &);
0025 
0026   /** Constructor taking DetIds as input. */
0027   SiStripHashedDetId(const std::vector<DetId> &);
0028 
0029   /** Copy constructor. */
0030   SiStripHashedDetId(const SiStripHashedDetId &);
0031 
0032   /** Assignment operator. */
0033   SiStripHashedDetId &operator=(const SiStripHashedDetId &other) {
0034     if (this != &other) {  // Self-assignment check
0035       this->id_ = 0;
0036       this->iter_ = other.begin();
0037       // auxilliary vector to store the list of raw IDs
0038       std::vector<uint32_t> raw_ids;
0039       raw_ids.reserve(other.size());
0040 
0041       // Copy elements from input vector to detIds_ vector
0042       std::copy(other.begin(), other.end(), std::back_inserter(raw_ids));
0043 
0044       this->init(raw_ids);
0045     }
0046     return *this;
0047   }
0048 
0049   /** Public default constructor. */
0050   SiStripHashedDetId();
0051 
0052   /** Default destructor. */
0053   ~SiStripHashedDetId();
0054 
0055   // ---------- typedefs ----------
0056 
0057   typedef std::vector<uint32_t>::const_iterator const_iterator;
0058 
0059   typedef std::vector<uint32_t>::iterator iterator;
0060 
0061   // ---------- public interface ----------
0062 
0063   /** Returns hashed index for given DetId. */
0064   inline uint32_t hashedIndex(uint32_t det_id);
0065 
0066   /** Returns raw (32-bit) DetId for given hashed index. */
0067   inline uint32_t unhashIndex(uint32_t hashed_index) const;
0068 
0069   /** Returns DetId object for given hashed index. */
0070   // inline DetId detId( uint32_t index ) const;
0071 
0072   inline const_iterator begin() const;
0073 
0074   inline const_iterator end() const;
0075 
0076   inline const size_t size() const { return detIds_.size(); }
0077 
0078 private:
0079   void init(const std::vector<uint32_t> &);
0080 
0081   /** Sorted list of all silicon strip tracker DetIds. */
0082   std::vector<uint32_t> detIds_;
0083 
0084   uint32_t id_;
0085 
0086   const_iterator iter_;
0087 };
0088 
0089 uint32_t SiStripHashedDetId::hashedIndex(uint32_t det_id) {
0090   const_iterator iter = end();
0091   if (det_id > id_) {
0092     iter = find(iter_, end(), det_id);
0093   } else {
0094     iter = find(begin(), iter_, det_id);
0095   }
0096   if (iter != end()) {
0097     id_ = det_id;
0098     iter_ = iter;
0099     return iter - begin();
0100   } else {
0101     id_ = 0;
0102     iter_ = begin();
0103     return sistrip::invalid32_;
0104   }
0105 }
0106 uint32_t SiStripHashedDetId::unhashIndex(uint32_t hashed_index) const {
0107   if (hashed_index < static_cast<uint32_t>(end() - begin())) {
0108     return detIds_[hashed_index];
0109   } else {
0110     return sistrip::invalid32_;
0111   }
0112 }
0113 SiStripHashedDetId::const_iterator SiStripHashedDetId::begin() const { return detIds_.begin(); }
0114 SiStripHashedDetId::const_iterator SiStripHashedDetId::end() const { return detIds_.end(); }
0115 
0116 #endif  // CalibFormats_SiStripObjects_SiStripHashedDetId_H