CMS 3D CMS Logo

StripClusterizerAlgorithm.h
Go to the documentation of this file.
1 #ifndef RecoLocalTracker_StripClusterizerAlgorithm_h
2 #define RecoLocalTracker_StripClusterizerAlgorithm_h
3 
4 namespace edm {
5  class EventSetup;
6 }
7 class SiStripDigi;
16 #include <limits>
17 
19 
21 public:
22  static constexpr unsigned short invalidI = std::numeric_limits<unsigned short>::max();
23 
24  // state of detID
25  struct Det {
26  bool valid() const { return ind != invalidI; }
27  float noise(const uint16_t& strip) const { return SiStripNoises::getNoise(strip, noiseRange); }
28  float gain(const uint16_t& strip) const { return SiStripGain::getStripGain(strip, gainRange); }
29  bool bad(const uint16_t& strip) const { return quality->IsStripBad(qualityRange, strip); }
30  bool allBadBetween(uint16_t L, const uint16_t& R) const {
31  while (++L < R && bad(L)) {
32  };
33  return L == R;
34  }
39  uint32_t detId = 0;
40  unsigned short ind = invalidI;
41  };
42 
43  //state of the candidate cluster
44  struct State {
45  State(Det const& idet) : m_det(idet) { ADCs.reserve(128); }
46  Det const& det() const { return m_det; }
47  std::vector<uint8_t> ADCs;
48  uint16_t lastStrip = 0;
49  float noiseSquared = 0;
50  bool candidateLacksSeed = true;
51 
52  private:
53  Det const& m_det;
54  };
55 
57  virtual void initialize(const edm::EventSetup&);
58 
59  //Offline DetSet interface
61  void clusterize(const edm::DetSetVector<SiStripDigi>&, output_t&) const;
62  void clusterize(const edmNew::DetSetVector<SiStripDigi>&, output_t&) const;
63  virtual void clusterizeDetUnit(const edm::DetSet<SiStripDigi>&, output_t::TSFastFiller&) const = 0;
64  virtual void clusterizeDetUnit(const edmNew::DetSet<SiStripDigi>&, output_t::TSFastFiller&) const = 0;
65 
66  //HLT stripByStrip interface
67  virtual Det stripByStripBegin(uint32_t id) const = 0;
68 
69  virtual void addFed(Det const& det,
71  uint16_t ipair,
72  std::vector<SiStripCluster>& out) const {}
73  virtual void stripByStripAdd(State& state, uint16_t strip, uint8_t adc, std::vector<SiStripCluster>& out) const {}
74  virtual void stripByStripEnd(State& state, std::vector<SiStripCluster>& out) const {}
75 
76  virtual void addFed(State& state,
78  uint16_t ipair,
79  output_t::TSFastFiller& out) const {}
80  virtual void stripByStripAdd(State& state, uint16_t strip, uint8_t adc, output_t::TSFastFiller& out) const {}
81  virtual void stripByStripEnd(State& state, output_t::TSFastFiller& out) const {}
82 
84  public:
86  };
87 
88  SiStripDetCabling const* cabling() const { return theCabling; }
89  std::vector<uint32_t> const& allDetIds() const { return detIds; }
90 
91  std::vector<const FedChannelConnection*> const& currentConnection(const Det& det) const {
92  return connections[det.ind];
93  }
94 
95 protected:
96  StripClusterizerAlgorithm() : qualityLabel(""), noise_cache_id(0), gain_cache_id(0), quality_cache_id(0) {}
97 
98  Det findDetId(const uint32_t) const;
99  bool isModuleBad(const uint32_t& id) const { return qualityHandle->IsModuleBad(id); }
100  bool isModuleUsable(const uint32_t& id) const { return qualityHandle->IsModuleUsable(id); }
101 
103 
104 private:
105  template <class T>
106  void clusterize_(const T& input, output_t& output) const {
107  for (typename T::const_iterator it = input.begin(); it != input.end(); it++) {
108  output_t::TSFastFiller ff(output, it->detId());
109  clusterizeDetUnit(*it, ff);
110  if (ff.empty())
111  ff.abort();
112  }
113  }
114 
115  struct Index {
116  unsigned short gi = invalidI, ni = invalidI, qi = invalidI;
117  };
118  std::vector<uint32_t> detIds; // from cabling (connected and not bad)
119  std::vector<std::vector<const FedChannelConnection*> > connections;
120  std::vector<Index> indices;
124  SiStripDetCabling const* theCabling = nullptr;
125  uint32_t noise_cache_id, gain_cache_id, quality_cache_id;
126 };
127 #endif
static AlgebraicMatrix initialize()
edm::ESHandle< SiStripQuality > qualityHandle
std::vector< const FedChannelConnection * > const & currentConnection(const Det &det) const
std::vector< uint32_t > const & allDetIds() const
edm::ESHandle< SiStripGain > gainHandle
bool isModuleBad(const uint32_t &id) const
edm::ESHandle< SiStripNoises > noiseHandle
static std::string const input
Definition: EdmProvDump.cc:48
static float getNoise(uint16_t strip, const Range &range)
Definition: SiStripNoises.h:71
virtual void addFed(Det const &det, sistrip::FEDZSChannelUnpacker &unpacker, uint16_t ipair, std::vector< SiStripCluster > &out) const
virtual void stripByStripAdd(State &state, uint16_t strip, uint8_t adc, output_t::TSFastFiller &out) const
static float getStripGain(const uint16_t &strip, const SiStripApvGain::Range &range)
Definition: SiStripGain.h:73
Class containning control, module, detector and connection information, at the level of a FED channel...
bool bad(const uint16_t &strip) const
std::vector< std::vector< const FedChannelConnection * > > connections
std::pair< ContainerIterator, ContainerIterator > Range
void clusterize_(const T &input, output_t &output) const
edmNew::DetSetVector< SiStripCluster > output_t
constexpr int adc(sample_type sample)
get the ADC sample (12 bits)
A Digi for the silicon strip detector, containing both strip and adc information, and suitable for st...
Definition: SiStripDigi.h:12
bool allBadBetween(uint16_t L, const uint16_t &R) const
float gain(const uint16_t &strip) const
bool isModuleUsable(const uint32_t &id) const
SiStripDetCabling const * cabling() const
virtual void stripByStripEnd(State &state, output_t::TSFastFiller &out) const
HLT enums.
std::pair< ContainerIterator, ContainerIterator > Range
virtual void stripByStripEnd(State &state, std::vector< SiStripCluster > &out) const
std::pair< ContainerIterator, ContainerIterator > Range
Definition: SiStripNoises.h:47
long double T
virtual void addFed(State &state, sistrip::FEDZSChannelUnpacker &unpacker, uint16_t ipair, output_t::TSFastFiller &out) const
float noise(const uint16_t &strip) const
#define constexpr
virtual void stripByStripAdd(State &state, uint16_t strip, uint8_t adc, std::vector< SiStripCluster > &out) const