CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes
TTClusterAlgorithm_official< T > Class Template Reference

Class for "official" algorithm to be used in TTClusterBuilder. More...

#include <TTClusterAlgorithm_official.h>

Inheritance diagram for TTClusterAlgorithm_official< T >:
TTClusterAlgorithm< T >

Public Member Functions

template<>
void Cluster (std::vector< std::vector< Ref_Phase2TrackerDigi_ > > &output, const std::vector< Ref_Phase2TrackerDigi_ > &input, bool isPS) const
 Clustering operations. More...
 
void Cluster (std::vector< std::vector< T > > &output, const std::vector< T > &input, bool isPS) const override
 Clustering operations. More...
 
template<>
void Cluster (std::vector< std::vector< Ref_Phase2TrackerDigi_ > > &output, const std::vector< Ref_Phase2TrackerDigi_ > &input, bool isPS) const
 Clustering operations. More...
 
 TTClusterAlgorithm_official (int aWidthCut)
 Constructor. More...
 
 ~TTClusterAlgorithm_official () override
 Destructor. More...
 
- Public Member Functions inherited from TTClusterAlgorithm< T >
virtual std::string AlgorithmName () const
 Algorithm name. More...
 
virtual void Cluster (std::vector< std::vector< T > > &output, const std::vector< T > &input) const
 Basic version common to all the algorithms but official. More...
 
 TTClusterAlgorithm (std::string fName)
 Constructors. More...
 
virtual ~TTClusterAlgorithm ()
 Destructor. More...
 

Private Member Functions

template<>
bool CompareClusters (const Ref_Phase2TrackerDigi_ &a, const Ref_Phase2TrackerDigi_ &b)
 Implementation of methods of TTClusterAlgorithm_official. More...
 
template<>
bool CompareClusters (const Ref_Phase2TrackerDigi_ &a, const Ref_Phase2TrackerDigi_ &b)
 Close class. More...
 

Static Private Member Functions

static bool CompareClusters (const T &a, const T &b)
 Cluster max width. More...
 

Private Attributes

int mWidthCut
 Data members. More...
 

Additional Inherited Members

- Protected Attributes inherited from TTClusterAlgorithm< T >
std::string className_
 Data members. More...
 

Detailed Description

template<typename T>
class TTClusterAlgorithm_official< T >

Class for "official" algorithm to be used in TTClusterBuilder.

2D clusters: make 1D and then attach them to each other if their pixels are close to each other, CW cut at the end After moving from SimDataFormats to DataFormats, the template structure of the class was maintained in order to accomodate any types other than PixelDigis in case there is such a need in the future.

Author
Nicola Pozzobon
Date
2013, Jul 12

Definition at line 32 of file TTClusterAlgorithm_official.h.

Constructor & Destructor Documentation

◆ TTClusterAlgorithm_official()

template<typename T >
TTClusterAlgorithm_official< T >::TTClusterAlgorithm_official ( int  aWidthCut)
inline

Constructor.

Definition at line 43 of file TTClusterAlgorithm_official.h.

References TTClusterAlgorithm_official< T >::mWidthCut.

43 : TTClusterAlgorithm<T>(__func__) { mWidthCut = aWidthCut; }
Base class for any algorithm to be used in TTClusterBuilder.

◆ ~TTClusterAlgorithm_official()

template<typename T >
TTClusterAlgorithm_official< T >::~TTClusterAlgorithm_official ( )
inlineoverride

Destructor.

Definition at line 46 of file TTClusterAlgorithm_official.h.

46 {}

Member Function Documentation

◆ Cluster() [1/3]

template<>
void TTClusterAlgorithm_official< Ref_Phase2TrackerDigi_ >::Cluster ( std::vector< std::vector< Ref_Phase2TrackerDigi_ > > &  output,
const std::vector< Ref_Phase2TrackerDigi_ > &  input,
bool  isPS 
) const

Clustering operations.

Prepare the output

Prepare a proper hit container

Map all the hits by column index

1D Clusters must be stored properly <column, first row index>

Loop over the mapped hits

Collect hits sharing column index and differing by 1 in row index

























Loop over single column

Nested loop

Check col/row and add to the cluster

End of nested loop

Sort the vector elements by row index

Put the cluster in the map

End of loop over single column

End of loop over mapped hits

Cluster over the second dimension only in PS modules!
















Add the hits

Loop over the other elements of the map

Skip same element

Skip non-contiguous column

Column is contiguous Update the "last column index" This should be safe as maps are sorted structures by construction











Check that the cluster is good to be clustered Get first row










Get the max row in the cluster

Check if they overlap

If so, add the hits to the cluster!

End of nested loop

Check output Sort the vector by row index





one should add 1 to use <=

End of isPS

Check output Sort the vector by row index


one should add 1 to use <=

End of non-PS case

End of loop over mapped 1D Clusters

Definition at line 21 of file TTClusterAlgorithm_official.cc.

References funct::abs(), input, jetUpdater_cfi::sort, and groupFilesInBlocks::temp.

24  {
26  output.clear();
27 
29  std::map<unsigned int, std::vector<Ref_Phase2TrackerDigi_> > mapHitsByColumn;
30 
32  typename std::vector<Ref_Phase2TrackerDigi_>::const_iterator inputIterator;
33  inputIterator = input.begin();
34  while (inputIterator != input.end()) {
35  mapHitsByColumn[(**inputIterator).column()].push_back(*inputIterator);
36  ++inputIterator;
37  }
38 
40  std::map<std::pair<unsigned int, unsigned int>, std::vector<Ref_Phase2TrackerDigi_> > map1DCluByColRow;
41 
43  typename std::map<unsigned int, std::vector<Ref_Phase2TrackerDigi_> >::iterator mapIterHbC;
44  mapIterHbC = mapHitsByColumn.begin();
45  while (mapIterHbC != mapHitsByColumn.end()) {
48  typename std::vector<Ref_Phase2TrackerDigi_>::iterator inputIterator;
49  inputIterator = mapIterHbC->second.begin();
50 
52  while (inputIterator != mapIterHbC->second.end()) {
53  std::vector<Ref_Phase2TrackerDigi_> temp;
54  temp.push_back(*inputIterator);
55  inputIterator = mapIterHbC->second.erase(inputIterator);
56  typename std::vector<Ref_Phase2TrackerDigi_>::iterator inputIterator2;
57  inputIterator2 = inputIterator;
58 
60  while (inputIterator2 != mapIterHbC->second.end()) {
62  if ((temp.back()->column() == (**inputIterator2).column()) &&
63  ((**inputIterator2).row() - temp.back()->row() == 1)) {
64  temp.push_back(*inputIterator2);
65  inputIterator2 = mapIterHbC->second.erase(inputIterator2);
66  } else
67  break;
68 
69  }
70 
72  std::sort(temp.begin(), temp.end(), CompareClusters);
73 
75  map1DCluByColRow.insert(std::make_pair(std::make_pair(mapIterHbC->first, temp.at(0)->row()), temp));
76 
77  inputIterator = inputIterator2;
78 
79  }
80  ++mapIterHbC;
81 
82  }
83 
86  typename std::map<std::pair<unsigned int, unsigned int>, std::vector<Ref_Phase2TrackerDigi_> >::iterator
87  mapIter1DCbCR0;
88  typename std::map<std::pair<unsigned int, unsigned int>, std::vector<Ref_Phase2TrackerDigi_> >::iterator
89  mapIter1DCbCR1;
90  mapIter1DCbCR0 = map1DCluByColRow.begin();
91  unsigned int lastCol = mapIter1DCbCR0->first.first;
92 
93  while (mapIter1DCbCR0 != map1DCluByColRow.end()) {
95  std::vector<Ref_Phase2TrackerDigi_> candCluster;
96  candCluster.insert(candCluster.end(), mapIter1DCbCR0->second.begin(), mapIter1DCbCR0->second.end());
97 
98  if (isPS) {
100  mapIter1DCbCR1 = map1DCluByColRow.begin();
101 
102  while (mapIter1DCbCR1 != map1DCluByColRow.end()) {
104  if (mapIter1DCbCR1 == mapIter1DCbCR0) {
105  ++mapIter1DCbCR1;
106  continue;
107  }
108 
110  if (std::abs((int)(mapIter1DCbCR1->first.first) - (int)lastCol) != 1) {
111  ++mapIter1DCbCR1;
112  continue;
113  }
114 
118  lastCol = mapIter1DCbCR1->first.first;
119 
122  unsigned int iRow0 = mapIter1DCbCR0->first.second;
123  unsigned int iRow1 = mapIter1DCbCR1->first.second;
124 
126  unsigned int jRow0 = mapIter1DCbCR0->second.back()->row();
127  unsigned int jRow1 = mapIter1DCbCR1->second.back()->row();
128 
130  if ((iRow1 >= iRow0 && iRow1 <= jRow0) || (jRow1 >= iRow0 && jRow1 <= jRow0)) {
132  candCluster.insert(candCluster.end(), mapIter1DCbCR1->second.begin(), mapIter1DCbCR1->second.end());
133  map1DCluByColRow.erase(mapIter1DCbCR1++);
134  } else {
135  ++mapIter1DCbCR1;
136  }
137  }
138 
139  map1DCluByColRow.erase(mapIter1DCbCR0++);
140 
143  std::sort(candCluster.begin(), candCluster.end(), CompareClusters);
144  /*
145  std::cout << candCluster.at(0)->row() - candCluster.back()->row() << " / "
146  << static_cast<int>(candCluster.at(0)->row() - candCluster.back()->row()) << " / "
147  << abs( candCluster.at(0)->row() - candCluster.back()->row() ) << " / "
148  << std::abs( candCluster.at(0)->row() - candCluster.back()->row() ) << " / "
149  << mWidthCut << std::endl;
150  */
151  if (std::abs(static_cast<int>(candCluster.at(0)->row() - candCluster.back()->row())) <
152  mWidthCut ||
153  mWidthCut < 1) {
154  output.push_back(candCluster);
155  }
156  }
157  else {
158  map1DCluByColRow.erase(mapIter1DCbCR0++);
159 
162  std::sort(candCluster.begin(), candCluster.end(), CompareClusters);
163 
164  if (std::abs(static_cast<int>(candCluster.at(0)->row() - candCluster.back()->row())) <
165  mWidthCut ||
166  mWidthCut < 1) {
167  output.push_back(candCluster);
168  }
169  }
170  }
171 }
static bool CompareClusters(const T &a, const T &b)
Cluster max width.
static std::string const input
Definition: EdmProvDump.cc:50
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Definition: output.py:1

◆ Cluster() [2/3]

template<typename T >
void TTClusterAlgorithm_official< T >::Cluster ( std::vector< std::vector< T > > &  output,
const std::vector< T > &  input,
bool  isPS 
) const
overridevirtual

Clustering operations.

Reimplemented from TTClusterAlgorithm< T >.

◆ Cluster() [3/3]

template<>
void TTClusterAlgorithm_official< Ref_Phase2TrackerDigi_ >::Cluster ( std::vector< std::vector< Ref_Phase2TrackerDigi_ > > &  output,
const std::vector< Ref_Phase2TrackerDigi_ > &  input,
bool  isPS 
) const

Clustering operations.

◆ CompareClusters() [1/3]

template<>
bool TTClusterAlgorithm_official< Ref_Phase2TrackerDigi_ >::CompareClusters ( const Ref_Phase2TrackerDigi_ a,
const Ref_Phase2TrackerDigi_ b 
)
private

Implementation of methods of TTClusterAlgorithm_official.

Here, in the source file, the methods which do depend on the specific type <T> that can fit the template.

Author
Nicola Pozzobon
Date
2013, Jul 12Function to compare clusters and sort them by row

Definition at line 14 of file TTClusterAlgorithm_official.cc.

References a, and b.

15  {
16  return (a->row() < b->row());
17 }
double b
Definition: hdecay.h:120
double a
Definition: hdecay.h:121

◆ CompareClusters() [2/3]

template<typename T >
static bool TTClusterAlgorithm_official< T >::CompareClusters ( const T a,
const T b 
)
staticprivate

Cluster max width.

Function to compare clusters and sort them by row

◆ CompareClusters() [3/3]

template<>
bool TTClusterAlgorithm_official< Ref_Phase2TrackerDigi_ >::CompareClusters ( const Ref_Phase2TrackerDigi_ a,
const Ref_Phase2TrackerDigi_ b 
)
private

Close class.

Implementation of methods

Here, in the header file, the methods which do not depend on the specific type <T> that can fit the template. Other methods, with type-specific features, are implemented in the source file.Function to compare clusters and sort them by row

Member Data Documentation

◆ mWidthCut

template<typename T >
int TTClusterAlgorithm_official< T >::mWidthCut
private