CMS 3D CMS Logo

ThreeThresholdAlgorithm.cc
Go to the documentation of this file.
4 #include <cmath>
5 #include <numeric>
7 
9 
12  float chan,
13  float seed,
14  float cluster,
15  unsigned holes,
16  unsigned bad,
17  unsigned adj,
18  unsigned maxClusterSize,
19  bool removeApvShots,
20  float minGoodCharge)
21  : StripClusterizerAlgorithm(conditionsToken),
24  ClusterThresholdSquared(cluster * cluster),
25  MaxSequentialHoles(holes),
26  MaxSequentialBad(bad),
27  MaxAdjacentBad(adj),
29  RemoveApvShots(removeApvShots),
30  minGoodCharge(minGoodCharge) {}
31 
32 template <class digiDetSet>
33 inline void ThreeThresholdAlgorithm::clusterizeDetUnit_(const digiDetSet& digis, output_t::TSFastFiller& output) const {
34  const auto& cond = conditions();
35  if (cond.isModuleBad(digis.detId()))
36  return;
37 
38  auto const& det = cond.findDetId(digis.detId());
39  if (!det.valid())
40  return;
41 
42 #ifdef EDM_ML_DEBUG
43  if (!cond.isModuleUsable(digis.detId()))
44  edm::LogWarning("ThreeThresholdAlgorithm") << " id " << digis.detId() << " not usable???" << std::endl;
45 #endif
46 
47  typename digiDetSet::const_iterator scan(digis.begin()), end(digis.end());
48 
49  SiStripApvShotCleaner ApvCleaner;
50  if (RemoveApvShots) {
51  ApvCleaner.clean(digis, scan, end);
52  }
53 
54  output.reserve(16);
55  State state(det);
56  while (scan != end) {
57  while (scan != end && !candidateEnded(state, scan->strip()))
58  addToCandidate(state, *scan++);
60  }
61 }
62 
63 inline bool ThreeThresholdAlgorithm::candidateEnded(State const& state, const uint16_t& testStrip) const {
64  uint16_t holes = testStrip - state.lastStrip - 1;
65  return (((!state.ADCs.empty()) & // a candidate exists, and
66  (holes > MaxSequentialHoles) // too many holes if not all are bad strips, and
67  ) &&
68  (holes > MaxSequentialBad || // (too many bad strips anyway, or
69  !state.det().allBadBetween(state.lastStrip, testStrip) // not all holes are bad strips)
70  ));
71 }
72 
73 inline void ThreeThresholdAlgorithm::addToCandidate(State& state, uint16_t strip, uint8_t adc) const {
74  float Noise = state.det().noise(strip);
75  if (adc < static_cast<uint8_t>(Noise * ChannelThreshold) || state.det().bad(strip))
76  return;
77 
78  if (state.candidateLacksSeed)
79  state.candidateLacksSeed = adc < static_cast<uint8_t>(Noise * SeedThreshold);
80  if (state.ADCs.empty())
81  state.lastStrip = strip - 1; // begin candidate
82  while (++state.lastStrip < strip)
83  state.ADCs.push_back(0); // pad holes
84 
85  if (state.ADCs.size() <= MaxClusterSize)
86  state.ADCs.push_back(adc);
87  state.noiseSquared += Noise * Noise;
88 }
89 
90 template <class T>
92  if (candidateAccepted(state)) {
94  if (MaxAdjacentBad > 0)
96  if (minGoodCharge <= 0 ||
97  siStripClusterTools::chargePerCM(state.det().detId, state.ADCs.begin(), state.ADCs.end()) > minGoodCharge)
98  out.push_back(std::move(SiStripCluster(firstStrip(state), state.ADCs.begin(), state.ADCs.end())));
99  }
101 }
102 
104  return (!state.candidateLacksSeed && state.ADCs.size() <= MaxClusterSize &&
105  state.noiseSquared * ClusterThresholdSquared <=
106  std::pow(float(std::accumulate(state.ADCs.begin(), state.ADCs.end(), int(0))), 2.f));
107 }
108 
110  uint16_t strip = firstStrip(state);
111  for (auto& adc : state.ADCs) {
112 #ifdef EDM_ML_DEBUG
113  // if(adc > 255) throw InvalidChargeException( SiStripDigi(strip,adc) );
114 #endif
115  // if(adc > 253) continue; //saturated, do not scale
116  auto charge = int(float(adc) * state.det().weight(strip++) + 0.5f); //adding 0.5 turns truncation into rounding
117  if (adc < 254)
118  adc = (charge > 1022 ? 255 : (charge > 253 ? 254 : charge));
119  }
120 }
121 
123  uint8_t max = MaxAdjacentBad;
124  while (0 < max--) {
125  if (state.det().bad(firstStrip(state) - 1)) {
126  state.ADCs.insert(state.ADCs.begin(), 0);
127  }
128  if (state.det().bad(state.lastStrip + 1)) {
129  state.ADCs.push_back(0);
130  state.lastStrip++;
131  }
132  }
133 }
134 
136  output_t::TSFastFiller& output) const {
137  clusterizeDetUnit_(digis, output);
138 }
140  output_t::TSFastFiller& output) const {
141  clusterizeDetUnit_(digis, output);
142 }
143 
145  uint16_t strip,
146  uint8_t adc,
147  std::vector<SiStripCluster>& out) const {
148  if (candidateEnded(state, strip))
151 }
152 
153 void ThreeThresholdAlgorithm::stripByStripEnd(State& state, std::vector<SiStripCluster>& out) const {
155 }
void stripByStripEnd(State &state, std::vector< SiStripCluster > &out) const override
float chargePerCM(DetId detid, Iter a, Iter b)
void stripByStripAdd(State &state, uint16_t strip, uint8_t adc, std::vector< SiStripCluster > &out) const override
bool candidateAccepted(State const &state) const
void clearCandidate(State &state) const
void addToCandidate(State &state, const SiStripDigi &digi) const
const SiStripClusterizerConditions & conditions() const
void clusterizeDetUnit_(const T &, output_t::TSFastFiller &) const
void appendBadNeighbors(State &state) const
uint16_t firstStrip(State const &state) const
A Digi for the silicon strip detector, containing both strip and adc information, and suitable for st...
Definition: SiStripDigi.h:12
void clusterizeDetUnit(const edm::DetSet< SiStripDigi > &, output_t::TSFastFiller &) const override
void applyGains(State &state) const
chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, "NDC") lumi.SetBorderSize( 0 ) lumi...
void endCandidate(State &state, T &) const
while(__syncthreads_or(more))
Definition: output.py:1
bool clean(const edmNew::DetSet< SiStripDigi > &in, edmNew::DetSet< SiStripDigi >::const_iterator &scan, edmNew::DetSet< SiStripDigi >::const_iterator &end)
Log< level::Warning, false > LogWarning
long double T
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
def move(src, dest)
Definition: eostools.py:511
bool candidateEnded(State const &state, const uint16_t &) const
ThreeThresholdAlgorithm(const edm::ESGetToken< SiStripClusterizerConditions, SiStripClusterizerConditionsRcd > &, float, float, float, unsigned, unsigned, unsigned, unsigned, bool removeApvShots, float minGoodCharge)
uint16_t *__restrict__ uint16_t const *__restrict__ adc