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