CMS 3D CMS Logo

TTClusterAlgorithm_official.cc
Go to the documentation of this file.
1 
11 
13 template< >
15 {
16  return ( a->row() < b->row() );
17 }
18 
20 template< >
21 void TTClusterAlgorithm_official< Ref_Phase2TrackerDigi_ >::Cluster( std::vector< std::vector< Ref_Phase2TrackerDigi_ > > &output,
22  const std::vector< Ref_Phase2TrackerDigi_ > &input,
23  bool isPS ) const
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  {
36  mapHitsByColumn[(**inputIterator).column()].push_back(*inputIterator);
37  ++inputIterator;
38  }
39 
41  std::map< std::pair< unsigned int, unsigned int >, std::vector< Ref_Phase2TrackerDigi_ > > map1DCluByColRow;
42 
44  typename std::map< unsigned int, std::vector< Ref_Phase2TrackerDigi_ > >::iterator mapIterHbC;
45  mapIterHbC = mapHitsByColumn.begin();
46  while ( mapIterHbC != mapHitsByColumn.end() )
47  {
50  typename std::vector< Ref_Phase2TrackerDigi_ >::iterator inputIterator;
51  inputIterator = mapIterHbC->second.begin();
52 
54  while( inputIterator != mapIterHbC->second.end() )
55  {
56  std::vector< Ref_Phase2TrackerDigi_ > temp;
57  temp.push_back(*inputIterator);
58  inputIterator = mapIterHbC->second.erase(inputIterator);
59  typename std::vector< Ref_Phase2TrackerDigi_ >::iterator inputIterator2;
60  inputIterator2 = inputIterator;
61 
63  while( inputIterator2 != mapIterHbC->second.end() )
64  {
66  if( (temp.back()->column() == (**inputIterator2).column()) &&
67  ((**inputIterator2).row() - temp.back()->row() == 1) )
68  {
69  temp.push_back(*inputIterator2);
70  inputIterator2 = mapIterHbC->second.erase(inputIterator2);
71  }
72  else
73  break;
74 
75  }
76 
78  std::sort( temp.begin(), temp.end(), CompareClusters );
79 
81  map1DCluByColRow.insert( std::make_pair( std::make_pair( mapIterHbC->first, temp.at(0)->row() ), temp ) );
82 
83  inputIterator = inputIterator2;
84 
85  }
86  ++mapIterHbC;
87 
88  }
89 
92  typename std::map< std::pair< unsigned int, unsigned int>, std::vector< Ref_Phase2TrackerDigi_ > >::iterator mapIter1DCbCR0;
93  typename std::map< std::pair< unsigned int, unsigned int>, std::vector< Ref_Phase2TrackerDigi_ > >::iterator mapIter1DCbCR1;
94  mapIter1DCbCR0 = map1DCluByColRow.begin();
95  unsigned int lastCol = mapIter1DCbCR0->first.first;
96 
97  while ( mapIter1DCbCR0 != map1DCluByColRow.end() )
98  {
100  std::vector< Ref_Phase2TrackerDigi_ > candCluster;
101  candCluster.insert( candCluster.end(), mapIter1DCbCR0->second.begin(), mapIter1DCbCR0->second.end() );
102 
103  if ( isPS )
104  {
106  mapIter1DCbCR1 = map1DCluByColRow.begin();
107 
108  while ( mapIter1DCbCR1 != map1DCluByColRow.end() )
109  {
111  if ( mapIter1DCbCR1 == mapIter1DCbCR0 )
112  {
113  ++mapIter1DCbCR1;
114  continue;
115  }
116 
118  if ( std::abs( (int)(mapIter1DCbCR1->first.first) - (int)lastCol ) != 1 )
119  {
120  ++mapIter1DCbCR1;
121  continue;
122  }
123 
127  lastCol = mapIter1DCbCR1->first.first;
128 
131  unsigned int iRow0 = mapIter1DCbCR0->first.second;
132  unsigned int iRow1 = mapIter1DCbCR1->first.second;
133 
135  unsigned int jRow0 = mapIter1DCbCR0->second.back()->row();
136  unsigned int jRow1 = mapIter1DCbCR1->second.back()->row();
137 
139  if ( ( iRow1 >= iRow0 && iRow1 <= jRow0 ) ||
140  ( jRow1 >= iRow0 && jRow1 <= jRow0 ) )
141  {
143  candCluster.insert( candCluster.end(), mapIter1DCbCR1->second.begin(), mapIter1DCbCR1->second.end() );
144  map1DCluByColRow.erase( mapIter1DCbCR1++ );
145  }
146  else
147  {
148  ++mapIter1DCbCR1;
149  }
150  }
151 
152  map1DCluByColRow.erase( mapIter1DCbCR0++ );
153 
156  std::sort( candCluster.begin(), candCluster.end(), CompareClusters );
157  /*
158  std::cout << candCluster.at(0)->row() - candCluster.back()->row() << " / "
159  << static_cast<int>(candCluster.at(0)->row() - candCluster.back()->row()) << " / "
160  << abs( candCluster.at(0)->row() - candCluster.back()->row() ) << " / "
161  << std::abs( candCluster.at(0)->row() - candCluster.back()->row() ) << " / "
162  << mWidthCut << std::endl;
163  */
164  if ( std::abs( static_cast<int>(candCluster.at(0)->row() - candCluster.back()->row()) ) < mWidthCut ||
165  mWidthCut < 1 )
166  {
167  output.push_back( candCluster );
168  }
169  }
170  else
171  {
172  map1DCluByColRow.erase( mapIter1DCbCR0++ );
173 
176  std::sort( candCluster.begin(), candCluster.end(), CompareClusters );
177 
178  if ( std::abs( static_cast<int>(candCluster.at(0)->row() - candCluster.back()->row()) ) < mWidthCut ||
179  mWidthCut < 1 )
180  {
181  output.push_back( candCluster );
182  }
183  }
184  }
185 }
186 
static bool CompareClusters(const T &a, const T &b)
Cluster max width.
static std::string const input
Definition: EdmProvDump.cc:48
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double b
Definition: hdecay.h:120
void Cluster(std::vector< std::vector< T > > &output, const std::vector< T > &input, bool isPS) const override
Clustering operations.
double a
Definition: hdecay.h:121