CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DivisiveClusterizer1D.h
Go to the documentation of this file.
1 #ifndef _DivisiveClusterizer1D_H_
2 #define _DivisiveClusterizer1D_H_
3 
9 
13 template < class T>
15 {
16 public:
28  DivisiveClusterizer1D( float zoffset = 5., int ntkmin = 5, bool useError = true,
29  float zsep = 0.05, bool wei = true );
30 
32 
33  std::pair < std::vector < Cluster1D<T> >, std::vector < const T * > > operator()
34  ( const std::vector < Cluster1D<T> > & ) const;
35  virtual DivisiveClusterizer1D * clone() const;
36 
37 private:
38  //methods
39  void findCandidates( const std::vector < Cluster1D<T> >&,
40  std::vector < Cluster1D<T> >&,
41  std::vector < Cluster1D<T> >&) const;
42  std::vector<Cluster1D<T> > makeCluster1Ds( std::vector < Cluster1D<T> > &,
43  std::vector < Cluster1D<T> >& ) const;
44  void insertTracks( std::vector < Cluster1D<T> >& ,
45  std::vector < Cluster1D<T> >& ) const;
46  std::vector<const T* > takeTracks( const std::vector < Cluster1D<T> >&) const;
47  Cluster1D<T> mergeCluster1Ds(std::vector < Cluster1D<T> >& ) const;
48  //data members
49  // std::vector<Cluster1D<T> > theCluster1Ds;
50  // std::vector<Cluster1D<T> > theTotalDiscardedTracks;
51  // std::vector<Cluster1D<T> > theDiscardedTracks;
54  float theZOffSet;
56  unsigned theNTkMin;
57  bool theWei;
59 };
60 
61 /*
62  * implementation
63  *
64  */
65 
66 template <class T>
68  int ntkmin,
69  bool useError,
70  float zsep, bool wei)
71  :theZOffSet(zoffset), theZSeparation(zsep), theNTkMin(ntkmin),
72  theWei(wei), theUseError(useError)
73 {
74  // theDiscardedTracks.clear();
75  // theTotalDiscardedTracks.clear();
76  // theCluster1Ds.clear();
77  TrivialWeightEstimator<T> weightEstimator;
78  theMerger = new Cluster1DMerger<T>( weightEstimator );
80 }
81 
82 template <class T>
84 {
85  delete theMerger;
86  delete theCleaner;
87 }
88 
89 template <class T>
90 std::pair < std::vector < Cluster1D<T> >, std::vector < const T * > >
92 ( const std::vector < Cluster1D<T> > & input ) const
93 {
94  std::vector < Cluster1D<T> > discardedCluster1Ds;
95  std::vector < Cluster1D<T> > output;
96  findCandidates ( input, output, discardedCluster1Ds );
97  return std::pair < std::vector < Cluster1D<T> >, std::vector < const T * > >
98  ( output, takeTracks(discardedCluster1Ds) );
99 }
100 
101 template <class T>
103 {
104  return new DivisiveClusterizer1D<T> ( * this );
105 }
106 
107 template <class T>
108 void
110  std::vector < Cluster1D<T> > & finalCluster1Ds ,
111  std::vector < Cluster1D<T> > & totDiscardedTracks ) const
112 {
113  using namespace Clusterizer1DCommons;
114 
115  std::vector < Cluster1D<T> > input = inputo;
116  std::vector < Cluster1D<T> > discardedTracks;
117  if ( input.size() < theNTkMin)
118  {
119  insertTracks( input, totDiscardedTracks);
120  return;
121  }
122  sort( input.begin(), input.end(), ComparePairs<T>());
123  int ncount =0;
124  std::vector < Cluster1D<T> > partOfPTracks;
125  partOfPTracks.push_back(input.front());
126  for( typename std::vector < Cluster1D<T> >::const_iterator ic=(input.begin())+1;
127  ic != input.end(); ic++)
128  {
129  ncount++;
130  if ( fabs( (*ic).position().value()-(*(ic-1)).position().value() )
131  < (double) theZSeparation )
132  {
133  partOfPTracks.push_back((*ic));
134  }
135  else
136  {
137  if(partOfPTracks.size() >= theNTkMin)
138  {
139  std::vector< Cluster1D<T> > clusters = makeCluster1Ds(partOfPTracks,
140  discardedTracks);
141  for (typename std::vector< Cluster1D<T> >::const_iterator iclus=clusters.begin();
142  iclus != clusters.end(); iclus++)
143  {
144  finalCluster1Ds.push_back(*iclus);
145  }
146  insertTracks(discardedTracks,totDiscardedTracks);
147  }
148  else
149  {
150  insertTracks(partOfPTracks,totDiscardedTracks);
151  }
152  partOfPTracks.clear();
153  partOfPTracks.push_back((*ic));
154  }
155  }
156  if (partOfPTracks.size() >= theNTkMin)
157  {
158  std::vector < Cluster1D<T> > clusters = makeCluster1Ds(partOfPTracks,
159  discardedTracks);
160  for (typename std::vector< Cluster1D<T> >::const_iterator iclus = clusters.begin();
161  iclus != clusters.end(); iclus++)
162  {
163  finalCluster1Ds.push_back(*iclus);
164  }
165  insertTracks(discardedTracks,totDiscardedTracks);
166  }
167  else
168  {
169  insertTracks(partOfPTracks,totDiscardedTracks);
170  }
171 
172  sort(finalCluster1Ds.begin(), finalCluster1Ds.end(),
173  ComparePairs<T>() );
174  // reverse(theCluster1Ds.begin(), theCluster1Ds.end());
175 
176  return;
177 }
178 
179 template <class T>
180 std::vector < Cluster1D<T> >
182  std::vector < Cluster1D<T> >& discardedTracks) const
183 {
184 
185  std::vector < Cluster1D<T> > finalCluster1Ds;
186  discardedTracks.clear();
187  std::vector<Cluster1D<T> > pvClu0 = clusters;
188  std::vector<Cluster1D<T> > pvCluNew = pvClu0;
189  bool stop = false;
190  while (!stop)
191  {
192  int nDiscardedAtIteration = 100;
193  while ( nDiscardedAtIteration !=0 )
194  {
195  pvCluNew = theCleaner->clusters(pvClu0);
196  std::vector<Cluster1D<T> >
197  tracksAtIteration = theCleaner->discardedCluster1Ds();
198  nDiscardedAtIteration = tracksAtIteration.size();
199  if ( nDiscardedAtIteration!=0 )
200  {
201  insertTracks(tracksAtIteration,discardedTracks);
202  pvClu0 = pvCluNew;
203  }
204  } // while nDiscardedAtIteration
205  unsigned ntkclus = pvCluNew.size();
206  unsigned ndiscard = discardedTracks.size();
207 
208  if ( ntkclus >= theNTkMin )
209  {
210  //save the cluster
211  finalCluster1Ds.push_back( mergeCluster1Ds(pvCluNew) );
212  if ( ndiscard >= theNTkMin )
213  { //make a new cluster and reset
214  pvClu0 = discardedTracks;
215  discardedTracks.clear();
216  }
217  else
218  { //out of loop
219  stop = true;
220  }
221  }
222  else
223  {
224  insertTracks(pvCluNew, discardedTracks);
225  stop = true;
226  }
227  }// while stop
228  return finalCluster1Ds;
229 }
230 
231 template <class T>
232 void
234  std::vector< Cluster1D<T> >& cludest) const
235 {
236  if (clusou.size() == 0)
237  return;
238  for ( typename std::vector< Cluster1D<T> >::const_iterator iclu = clusou.begin();
239  iclu != clusou.end(); iclu++)
240  {
241  cludest.push_back(*iclu);
242  }
243  /*
244  for ( typename std::vector< Cluster1D<T> >::const_iterator iclu = clu.begin();
245  iclu != clu.end(); iclu++){
246  if (total) {
247  theTotalDiscardedTracks.push_back(*iclu);
248  }else {
249  theDiscardedTracks.push_back(*iclu);
250  }
251  }
252  */
253  return;
254 }
255 
256 template <class T>
257 std::vector<const T* >
258 DivisiveClusterizer1D<T>::takeTracks( const std::vector< Cluster1D<T> > & clu ) const
259 {
260  std::vector<const T* > tracks;
261  for ( typename std::vector< Cluster1D<T> >::const_iterator iclu = clu.begin();
262  iclu != clu.end(); iclu++)
263  {
264  std::vector < const T * > clutks = iclu->tracks();
265  for ( typename std::vector< const T * >::const_iterator i=clutks.begin();
266  i!=clutks.end() ; ++i )
267  {
268  tracks.push_back ( *i );
269  }
270  }
271  return tracks;
272 }
273 
274 template <class T>
276 DivisiveClusterizer1D<T>::mergeCluster1Ds( std::vector < Cluster1D<T> >& clusters ) const
277 {
278 
279  Cluster1D<T> result = clusters.front();
280  for ( typename std::vector< Cluster1D<T> >::iterator iclu = (clusters.begin())+1;
281  iclu != clusters.end(); iclu++)
282  {
283  Cluster1D<T> old = result;
284  result = (*theMerger)( old , *iclu );
285  }
286  return result;
287 }
288 
289 #endif
virtual DivisiveClusterizer1D * clone() const
int i
Definition: DBlmapReader.cc:9
std::vector< const T * > takeTracks(const std::vector< Cluster1D< T > > &) const
std::vector< Cluster1D< T > > makeCluster1Ds(std::vector< Cluster1D< T > > &, std::vector< Cluster1D< T > > &) const
tuple result
Definition: query.py:137
Cluster1DCleaner< T > * theCleaner
DivisiveClusterizer1D(float zoffset=5., int ntkmin=5, bool useError=true, float zsep=0.05, bool wei=true)
tuple tracks
Definition: testEve_cfg.py:39
Cluster1DMerger< T > * theMerger
Cluster1D< T > mergeCluster1Ds(std::vector< Cluster1D< T > > &) const
void findCandidates(const std::vector< Cluster1D< T > > &, std::vector< Cluster1D< T > > &, std::vector< Cluster1D< T > > &) const
void insertTracks(std::vector< Cluster1D< T > > &, std::vector< Cluster1D< T > > &) const