HoughBaseAlg.h
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 // HoughBaseAlg.h
3 //
4 // HoughBaseAlg class
5 //
6 // Ben Carls (bcarls@fnal.gov)
7 // Some optimization by Gianluca Petrillo (petrillo@fnal.gov)
8 //
9 // Hough transform algorithm
10 // ============================================================================
11 //
12 // This implementation is a pattern recognition algorithm trying to detect
13 // straight lines in a image.
14 // In our application, the image is a hitmap on a wire plane, represented by
15 // wire number as one coordinate and drift time as the other.
16 // For each hit coordinate, all straight lines through that coordinate are
17 // recorded on counters, one for each line. If a counter rises to two, it
18 // mesans that there are two hits who can cast that line, i.e. there are two
19 // hits on that line.
20 // A line can be represented by two independent parameters, therefore we need a
21 // two-dimension parameter space to represent all of them (two degrees of
22 // freedom).
23 // Since there are infinite straight lines, each counter represents not just
24 // one line but a small region of parameter space.
25 // Passing by one point constraints one of the two parameters, therefore the
26 // parameter set of a generic line passing by a given point has one degree of
27 // freedom.
28 // We follow the custom of choosing as parameters of an arbitrary line passing
29 // through a point (x, y) the angle (from "x" axis) of the line, and the
30 // distance of the line from the chosen point. Fixing the point, we can assign
31 // freedom to the angle (that has a limited range by definition) and then
32 // the distance will be defined by some functional form d(angle).
33 // The shape (d vs. a) of the set of parameters of all lines passing by a point
34 // is a sinusoidal curve. We can define the angle to be between 0 and pi
35 // (half a period) and the distance potentially covers the whole real axis
36 // (but actually it will be never larger than the distance of the selected
37 // point from the origin).
38 //
39 // The implementation of the algorithm is based on a "accumulator", the set
40 // of counters of how many hits are passed by a given line (represented by
41 // its tow parameters). The accumulator is a two-dimensional container of
42 // counters, with the first dimension given by the angle and the second by the
43 // distance.
44 // In this scenario, all angles are sampled, therefore each angle will have
45 // at least one count per hit (somewhere at some distance d).
46 // Each angle will see one entry per hit.
47 // We choose to have a large number of sampled angles (the current standard
48 // configuration says 10800), therefore most of the counters will be empty.
49 // The sinusoidal shape can be steep enough that got example the angle a(1)
50 // has d(a1)=30 and the next angle (a2) has d(a2)=50. In this case we cover
51 // also the distances between 31 and 50, (assigning them, as an approximation,
52 // to a2). In this way we don't leave gaps and make sure that each two
53 // sinusoidal curves cross in at least one point, or, equivalently, that we
54 // can always find at least one straight line throw any two points.
55 // This translates in having very often the counts at a given angle clustered
56 // around some distances.
57 //
58 // We need to discretize the angles and the distances. Tests show that for a
59 // "natural" plane size of 9600 (TDC counts) x ~3000 (wires), we need to use
60 // O(10000) angles and to oversample the distance, that typically goes in the
61 // range [0-10000], by some factor (5 in the default parameters).
62 // The oversampling factor is just an artifact of the fact that we use integral
63 // distances but we want to have a resolution better than "1" -- we just
64 // multiply the distance by e.g. 5 and we get that the distace "1" actually
65 // means 1/5 = 0.2.
66 // Note that the algorithm is usually applied to subsets of that plane rather
67 // than on the full plane, making the typical distance range somehow smaller.
68 //
69 // The fastest data structure for the accumulator is a two-dimensional array.
70 // The proper size of this array would be some gigabyte, that makes this
71 // approach unfeasible. Since the dimension of angles has a very clear number
72 // of "bins" (covering always a fixed 0-pi range), but for each given angle
73 // the counters actually used are a few, a sparse structure (associative
74 // container, or "map") is used to describe all the counters at a given angle,
75 // with key the parameter r (discretized).
76 // Since all the angles always have data, the outer container is a vector
77 // whose index is the parameter a (also discretized).
78 // Therefore, for a given line (a, r), we can find how many hits pass though
79 // it by finding the associative container of the angle a from a vector,
80 // and in there looking for an entry with d as key: accum[a][d].
81 //
82 // Optimization
83 // ----------------------------------------------------------------------------
84 //
85 // Given the constraints and data structure described above, it turns out that
86 // a lot of time is spent creating new counters. On each hit, and each angle,
87 // one or more elements of the associative containers must be created.
88 // In total, millions of counter instances ar used at once.
89 // The standard C++ implementation of it, std::map, dynamically a new node
90 // each time a new counter is required, and in the end it frees them one by
91 // one. Both operations are very time-demanding.
92 // We used a custom memory allocator (BulkAllocator) that prepares memory
93 // for chunks of nodes and then returns a preallocated space at each request
94 // for a new node. The allocator is designed to be fast, giving up features:
95 // nodes are never really freed, that saves a lot of book-keeping.
96 // A lot of tricky aspects of it are documented in its own header file.
97 // Also freeing the memory is fast, since it implies the deletion of a few
98 // (very large) chunks rather than millions.
99 // The other aspect taking a lot of time is the lookup of a counter: where is
100 // counter (a,d)? the location of a is fast (constant time, from a vector).
101 // The location of d is the next best thing, a binary tree with log(N) access
102 // time. Unfortunately a balanced tree needs to be rebalanced often, and that
103 // takes a lot of time. Also, N may be "small" (O(1000)), but there are still
104 // million insertions and look ups.
105 // We use here a replacement of the plain map. Since it often happens that,
106 // to "fill the gaps", sequential counters are allocated and increased,
107 // we have blocks of couners allocated together (in the current version, 64
108 // of them). This can save memory in case of crowded spaces: the overhead
109 // for each node is 40 bytes, whether it is a single counter or a block of
110 // 64). Look up within the same block becomes constant-time.
111 // Also, to access sequences of counters, special code is used so that we
112 // take advantage of the result from the previous look up to perform the next
113 // one, including also the insertion of a new counter block after an existing
114 // one.
115 // Finally, the algorithm acts when it finds a relatively small number of
116 // aligned hits, afterward removing the hits already clustered. The hit count
117 // keeps small all the time: we use a signed char as basic data type for
118 // the counters, allowing a maximum of 127 aligned hits. This saves a lot of
119 // memory, at the cost of a small slow-down for large (e.g. 64-bit) bus
120 // architectures. No check is performed for overflow; that can also be
121 // implemented at a small cost.
122 //
123 //
124 ////////////////////////////////////////////////////////////////////////
125 #ifndef HOUGHBASEALG_H
126 #define HOUGHBASEALG_H
127 
128 #include <array>
129 #include <map>
130 #include <utility> // std::pair<>
131 #include <vector>
132 
136 #include "fhiclcpp/fwd.h"
137 
139 
140 namespace CLHEP {
141  class HepRandomEngine;
142 }
143 namespace detinfo {
144  class DetectorClocksData;
145  class DetectorPropertiesData;
146 }
147 namespace recob {
148  class Hit;
149  class Cluster;
150 }
151 
152 struct houghCorner {
153  double strength = 0;
154  double p0 = 0;
155  double p1 = 0;
156  houghCorner(double strengthTemp = 0, double p0Temp = 0, double p1Temp = 0)
157  {
158  strength = strengthTemp;
159  p0 = p0Temp;
160  p1 = p1Temp;
161  }
162 
163  bool
164  operator<(const houghCorner& houghCornerComp) const
165  {
166  return (strength < houghCornerComp.strength);
167  }
168 };
169 
170 // This stores information about merged lines
171 struct mergedLines {
172  double totalQ = 0;
173  double pMin0 = 0;
174  double pMin1 = 0;
175  double pMax0 = 0;
176  double pMax1 = 0;
177  int clusterNumber = -999999;
178  double showerLikeness = 0;
179  mergedLines(double totalQTemp = 0,
180  double pMin0Temp = 0,
181  double pMin1Temp = 0,
182  double pMax0Temp = 0,
183  double pMax1Temp = 0,
184  double clusterNumberTemp = -999999,
185  double showerLikenessTemp = 0)
186  {
187  totalQ = totalQTemp;
188  pMin0 = pMin0Temp;
189  pMin1 = pMin1Temp;
190  pMax0 = pMax0Temp;
191  pMax1 = pMax1Temp;
192  clusterNumber = clusterNumberTemp;
193  showerLikeness = showerLikenessTemp;
194  }
195 };
196 
197 struct protoTrack {
198  int clusterNumber = 999999;
199  int planeNumber = 999999;
200  int oldClusterNumber = 999999;
201  float clusterSlope = 999999;
202  float clusterIntercept = 999999;
203  float totalQ = -999999;
204  float pMin0 = 999999;
205  float pMin1 = 999999;
206  float pMax0 = -999999;
207  float pMax1 = -999999;
208  float iMinWire = 999999;
209  float iMaxWire = -999999;
210  float minWire = 999999;
211  float maxWire = -999999;
212  float isolation = -999999;
213  float showerLikeness = -999999;
214  bool merged = false;
215  bool showerMerged = false;
216  bool mergedLeft = false;
217  bool mergedRight = false;
218  std::vector<art::Ptr<recob::Hit>> hits;
220 
221  void
222  Init(unsigned int num = 999999,
223  unsigned int pnum = 999999,
224  float slope = 999999,
225  float intercept = 999999,
226  float totalQTemp = -999999,
227  float Min0 = 999999,
228  float Min1 = 999999,
229  float Max0 = -999999,
230  float Max1 = -999999,
231  int iMinWireTemp = 999999,
232  int iMaxWireTemp = -999999,
233  int minWireTemp = 999999,
234  int maxWireTemp = -999999,
236  {
237  clusterNumber = num;
238  planeNumber = pnum;
239  oldClusterNumber = num;
240  clusterSlope = slope;
241  clusterIntercept = intercept;
242  totalQ = totalQTemp;
243  pMin0 = Min0;
244  pMin1 = Min1;
245  pMax0 = Max0;
246  pMax1 = Max1;
247  iMinWire = iMinWireTemp;
248  iMaxWire = iMaxWireTemp;
249  minWire = minWireTemp;
250  maxWire = maxWireTemp;
251  merged = false;
252  showerMerged = false;
253  showerLikeness = 0;
254  hits.swap(hitsTemp);
255  }
256 };
257 
258 namespace cluster {
259 
260  /**
261  * @brief CountersMap with access optimized for Hough Transform algorithm
262  * @param KEY the type of the key of the counters map
263  * @param COUNTER the type of a basic counter (can be signed or unsigned)
264  * @param BLOCKSIZE the number of counters in a cluster
265  * @param ALLOC allocator for the underlying STL map
266  * @param SUBCOUNTERS split each counter in subcounters (not implemented yet)
267  * @see CountersMap
268  *
269  * In addition to the standard CountersMap interface, a special range
270  * increment, increment with max detection and decrement methods are provided.
271  */
272  template <typename KEY,
273  typename COUNTER,
274  size_t SIZE,
275  typename ALLOC = std::allocator<std::pair<KEY, std::array<COUNTER, SIZE>>>,
276  unsigned int SUBCOUNTERS = 1>
277  class HoughTransformCounters : public lar::CountersMap<KEY, COUNTER, SIZE, ALLOC, SUBCOUNTERS> {
278  public:
279  /// This class
281  /// Base class
283 
284  // import useful types
285  using BaseMap_t = typename Base_t::BaseMap_t;
287  using Key_t = typename Base_t::Key_t;
291 
292  /// Pair identifying a counter and its current value
293  using PairValue_t = std::pair<const_iterator, SubCounter_t>;
294 
295  /// Default constructor (empty map)
297 
298  /// Constructor, specifies an allocator
300 
301  /**
302  * @brief Sets the specified counter to a count value
303  * @param key key of the counter to be set
304  * @param value the count value
305  * @return new value of the counter
306  */
309  {
310  return Base_t::set(key, value);
311  }
312 
313  /**
314  * @brief Increments by 1 the specified counter
315  * @param key key of the counter to be increased
316  * @return new value of the counter
317  */
320  {
321  return Base_t::increment(key);
322  }
323 
324  /**
325  * @brief Decrements by 1 the specified counter
326  * @param key key of the counter to be decreased
327  * @return new value of the counter
328  */
331  {
332  return Base_t::decrement(key);
333  }
334 
335  /**
336  * @brief Sets the specified range of counters to a count value
337  * @param key_begin key of the first counter to be set
338  * @param key_end key of the first counter not to be set
339  * @param value the count value
340  * @return new value of all the counters
341  * @see increment(), decrement(), increment_and_get_max()
342  */
344  set(Key_t key_begin, Key_t key_end, SubCounter_t value)
345  {
346  return unchecked_set_range(key_begin, key_end, value);
347  }
348 
349  /**
350  * @brief Increments by 1 the specified range of counters
351  * @param key_begin key of the first counter to be increased
352  * @param key_end key of the first counter not to be increased
353  * @see decrement(), increment_and_get_max()
354  */
355  void increment(Key_t key_begin, Key_t key_end);
356 
357  /**
358  * @brief Increments by 1 the specified counters and returns the maximum
359  * @param key_begin key of the first counter to be increased
360  * @param key_end key of the first counter not to be increased
361  * @return pair with an iterator to the largest counter and its value
362  * @see increment(Key_t, Key_t)
363  *
364  * This method works like the corresponding increment() method, and in
365  * addition it returns the location of the counter with the largest count
366  * (after the increase).
367  * The return value consist of a pair: the second is the largest counter
368  * value in the range after the increase, the first member is the constant
369  * iterator pointing to the first (lowest key) counter with that (get its
370  * key with const_iterator::key() method).
371  *
372  * If no maximum is found, the maximum in the return value is equal to
373  * current_max, while the iterator points to the end of the map (end()).
374  * Note that if all the counters are at the minimum possible value, no
375  * maximum will be returned.
376  */
378  increment_and_get_max(Key_t key_begin, Key_t key_end)
379  {
380  return unchecked_add_range_max(key_begin, key_end, +1);
381  }
382 
383  /**
384  * @brief Increments by 1 the specified counters and returns the maximum
385  * @param key_begin key of the first counter to be increased
386  * @param key_end key of the first counter not to be increased
387  * @param current_max only counters larger than this will be considered
388  * @return pair with an iterator to the largest counter and its value
389  * @see increment(Key_t, Key_t), increment_and_get_max(Key_t, Key_t)
390  *
391  * This method works like increment_and_get_max() method, except that it
392  * does not update the maximum if it's not (strictly) larger than
393  * current_max. If no such a maximum is found, the maximum in the return
394  * value is equal to current_max, while the iterator points to the end of
395  * the map (end()).
396  */
398  increment_and_get_max(Key_t key_begin, Key_t key_end, SubCounter_t current_max)
399  {
400  return unchecked_add_range_max(key_begin, key_end, +1, current_max);
401  }
402 
403  /**
404  * @brief Decrements by 1 the specified range of counters
405  * @param key_begin key of the first counter to be increased
406  * @param key_end key of the first counter not to be increased
407  * @see increment()
408  */
409  void decrement(Key_t key_begin, Key_t key_end);
410 
411  /**
412  * @brief Returns the largest counter
413  * @param current_max only counters larger than this will be considered
414  * @return pair with an iterator to the largest counter and its value
415  * @see get_max(), increment_and_get_max(Key_t, Key_t)
416  *
417  * All counters are parsed, and the first one with the largest count
418  * is returned.
419  * The return value consist of a pair: the second is the largest counter
420  * value, the first member is the constant iterator pointing to the first
421  * (lowest key) counter with that (get its key with const_iterator::key()
422  * method).
423  *
424  * This method does not update the maximum if it's not (strictly) larger
425  * than current_max. If no such a maximum is found, the maximum in the
426  * return value is equal to current_max, while the iterator points to the
427  * end of the map (end()).
428  */
429  PairValue_t get_max(SubCounter_t current_max) const;
430 
431  /**
432  * @brief Increments by 1 the specified counters and returns the maximum
433  * @param current_max only counters larger than this will be considered
434  * @return pair with an iterator to the largest counter and its value
435  * @see get_max(SubCounter_t), increment_and_get_max(Key_t, Key_t)
436  *
437  * This method works like get_max() method, except that it
438  * does not update the maximum if it's not (strictly) larger than
439  * current_max. If no such a maximum is found, the maximum in the return
440  * value is equal to current_max, while the iterator points to the end of
441  * the map (end()).
442  */
443  PairValue_t get_max() const;
444 
445  protected:
447 
448  private:
449  SubCounter_t unchecked_set_range(Key_t key_begin,
450  Key_t key_end,
452  typename BaseMap_t::iterator start);
453  SubCounter_t unchecked_set_range(Key_t key_begin, Key_t key_end, SubCounter_t value);
454  PairValue_t unchecked_add_range_max(
455  Key_t key_begin,
456  Key_t key_end,
457  SubCounter_t delta,
458  typename BaseMap_t::iterator start,
460  PairValue_t unchecked_add_range_max(
461  Key_t key_begin,
462  Key_t key_end,
463  SubCounter_t delta,
465 
466  }; // class HoughTransformCounters
467 
468  class HoughBaseAlg {
469  public:
470  /// Data structure collecting charge information to be filled in cluster
471  struct ChargeInfo_t {
472  float integral = 0.0F;
473  float integral_stddev = 0.0F;
474  float summedADC = 0.0F;
475  float summedADC_stddev = 0.0F;
476 
477  ChargeInfo_t(float in, float in_stdev, float sum, float sum_stdev)
478  : integral(in), integral_stddev(in_stdev), summedADC(sum), summedADC_stddev(sum_stdev)
479  {}
480  }; // ChargeInfo_t
481 
482  explicit HoughBaseAlg(fhicl::ParameterSet const& pset);
483  virtual ~HoughBaseAlg() = default;
484 
485  size_t FastTransform(const std::vector<art::Ptr<recob::Cluster>>& clusIn,
486  std::vector<recob::Cluster>& ccol,
488  CLHEP::HepRandomEngine& engine,
489  art::Event const& evt,
490  std::string const& label);
491 
492  size_t Transform(const detinfo::DetectorClocksData& clockData,
493  detinfo::DetectorPropertiesData const& detProp,
494  std::vector<art::Ptr<recob::Hit>> const& hits,
495  CLHEP::HepRandomEngine& engine,
496  std::vector<unsigned int>* fpointId_to_clusterId,
497  unsigned int clusterId, // The id of the cluster we are examining
498  unsigned int* nClusters,
499  std::vector<protoTrack>* protoTracks);
500 
501  // interface to look for lines only on a set of hits,without slope and
502  // totalQ arrays
503  size_t FastTransform(detinfo::DetectorClocksData const& clockData,
504  detinfo::DetectorPropertiesData const& detProp,
505  std::vector<art::Ptr<recob::Hit>> const& clusIn,
507  CLHEP::HepRandomEngine& engine);
508 
509  // interface to look for lines only on a set of hits
510  size_t FastTransform(detinfo::DetectorClocksData const& clockData,
511  detinfo::DetectorPropertiesData const& detProp,
512  std::vector<art::Ptr<recob::Hit>> const& clusIn,
514  CLHEP::HepRandomEngine& engine,
515  std::vector<double>& slope,
516  std::vector<ChargeInfo_t>& totalQ);
517 
518  size_t Transform(std::vector<art::Ptr<recob::Hit>> const& hits);
519 
520  size_t Transform(detinfo::DetectorPropertiesData const& detProp,
521  std::vector<art::Ptr<recob::Hit>> const& hits,
522  double& slope,
523  double& intercept);
524 
525  friend class HoughTransformClus;
526 
527  private:
528  void HLSSaveBMPFile(char const*, unsigned char*, int, int);
529 
530  int fMaxLines; ///< Max number of lines that can be found
531  int fMinHits; ///< Min number of hits in the accumulator to consider
532  ///< (number of hits required to be considered a line).
533  int fSaveAccumulator; ///< Save bitmap image of accumulator for debugging?
534  int fNumAngleCells; ///< Number of angle cells in the accumulator
535  ///< (a measure of the angular resolution of the line finder).
536  ///< If this number is too large than the number of votes
537  ///< that fall into the "correct" bin will be small and consistent with noise.
538  float
539  fMaxDistance; ///< Max distance that a hit can be from a line to be considered part of that line
540  float fMaxSlope; ///< Max slope a line can have
541  int
542  fRhoZeroOutRange; ///< Range in rho over which to zero out area around previously found lines in the accumulator
543  int
544  fThetaZeroOutRange; ///< Range in theta over which to zero out area around previously found lines in the accumulator
545  float fRhoResolutionFactor; ///< Factor determining the resolution in rho
546  int
547  fPerCluster; ///< Tells the original Hough algorithm to look at clusters individually, or all hits
548  ///< at once
549  int
550  fMissedHits; ///< Number of wires that are allowed to be missed before a line is broken up into
551  ///< segments
552  float
553  fMissedHitsDistance; ///< Distance between hits in a hough line before a hit is considered missed
554  float
555  fMissedHitsToLineSize; ///< Ratio of missed hits to line size for a line to be considered a fake
556  };
557 
558 } // namespace
559 
560 #endif // HOUGHBASEALG_H
intermediate_table::iterator iterator
typename Traits_t::CounterBlock_t CounterBlock_t
Definition: CountersMap.h:165
float fRhoResolutionFactor
Factor determining the resolution in rho.
Definition: HoughBaseAlg.h:545
Reconstruction base classes.
KEY Key_t
type of counter key in the map
Definition: CountersMap.h:147
std::string string
Definition: nybbler.cc:12
typename Base_t::CounterKey_t CounterKey_t
Definition: HoughBaseAlg.h:446
struct vector vector
intermediate_table::const_iterator const_iterator
Cluster finding and building.
std::pair< const_iterator, SubCounter_t > PairValue_t
Pair identifying a counter and its current value.
Definition: HoughBaseAlg.h:293
mergedLines(double totalQTemp=0, double pMin0Temp=0, double pMin1Temp=0, double pMax0Temp=0, double pMax1Temp=0, double clusterNumberTemp=-999999, double showerLikenessTemp=0)
Definition: HoughBaseAlg.h:179
Data structure collecting charge information to be filled in cluster.
Definition: HoughBaseAlg.h:471
int fMaxLines
Max number of lines that can be found.
Definition: HoughBaseAlg.h:530
ChargeInfo_t(float in, float in_stdev, float sum, float sum_stdev)
Definition: HoughBaseAlg.h:477
float fMissedHitsDistance
Distance between hits in a hough line before a hit is considered missed.
Definition: HoughBaseAlg.h:553
int fNumAngleCells
that fall into the "correct" bin will be small and consistent with noise.
Definition: HoughBaseAlg.h:534
bool operator<(ProductInfo const &a, ProductInfo const &b)
Definition: ProductInfo.cc:51
int fSaveAccumulator
Save bitmap image of accumulator for debugging?
Definition: HoughBaseAlg.h:533
typename Traits_t::template BaseMap_t< typename std::allocator_traits< Allocator_t >::template rebind_alloc< typename Traits_t::MapValue_t > > BaseMap_t
Type of the map used in the implementation.
Definition: CountersMap.h:171
def key(type, name=None)
Definition: graph.py:13
PairValue_t increment_and_get_max(Key_t key_begin, Key_t key_end, SubCounter_t current_max)
Increments by 1 the specified counters and returns the maximum.
Definition: HoughBaseAlg.h:398
HoughTransformCounters(Allocator_t alloc)
Constructor, specifies an allocator.
Definition: HoughBaseAlg.h:299
float fMaxDistance
Max distance that a hit can be from a line to be considered part of that line.
Definition: HoughBaseAlg.h:539
float fMaxSlope
Max slope a line can have.
Definition: HoughBaseAlg.h:540
General LArSoft Utilities.
SubCounter_t decrement(Key_t key)
Decrements by 1 the specified counter.
Definition: HoughBaseAlg.h:330
HoughTransformCounters()
Default constructor (empty map)
Definition: HoughBaseAlg.h:296
int fRhoZeroOutRange
Range in rho over which to zero out area around previously found lines in the accumulator.
Definition: HoughBaseAlg.h:542
double strength
Definition: HoughBaseAlg.h:153
CountersMap with access optimized for Hough Transform algorithm.
Definition: HoughBaseAlg.h:277
ALLOC Allocator_t
type of the single counter
Definition: CountersMap.h:149
Structure with the index of the counter, split as needed.
Definition: CountersMap.h:296
T min(sqlite3 *const db, std::string const &table_name, std::string const &column_name)
Definition: statistics.h:55
Contains all timing reference information for the detector.
std::vector< art::Ptr< recob::Hit > > hits
Definition: HoughBaseAlg.h:218
SubCounter_t increment(Key_t key)
Increments by 1 the specified counter.
Definition: HoughBaseAlg.h:319
void Init(unsigned int num=999999, unsigned int pnum=999999, float slope=999999, float intercept=999999, float totalQTemp=-999999, float Min0=999999, float Min1=999999, float Max0=-999999, float Max1=-999999, int iMinWireTemp=999999, int iMaxWireTemp=-999999, int minWireTemp=999999, int maxWireTemp=-999999, std::vector< art::Ptr< recob::Hit >> hitsTemp=std::vector< art::Ptr< recob::Hit >>())
Definition: HoughBaseAlg.h:222
Map storing counters in a compact way.
Definition: CountersMap.h:138
Map of counters, stored compactly.
TCEvent evt
Definition: DataStructs.cxx:7
int fThetaZeroOutRange
Range in theta over which to zero out area around previously found lines in the accumulator.
Definition: HoughBaseAlg.h:544
typename Base_t::const_iterator const_iterator
Definition: HoughBaseAlg.h:290
PairValue_t increment_and_get_max(Key_t key_begin, Key_t key_end)
Increments by 1 the specified counters and returns the maximum.
Definition: HoughBaseAlg.h:378
houghCorner(double strengthTemp=0, double p0Temp=0, double p1Temp=0)
Definition: HoughBaseAlg.h:156
float fMissedHitsToLineSize
Ratio of missed hits to line size for a line to be considered a fake.
Definition: HoughBaseAlg.h:555