1 #ifndef _DivisiveClusterizer1D_H_
2 #define _DivisiveClusterizer1D_H_
29 float zsep = 0.05,
bool wei =
true );
33 std::pair < std::vector < Cluster1D<T> >, std::vector < const T * > >
operator()
34 (
const std::vector < Cluster1D<T> > & )
const;
71 :theZOffSet(zoffset), theZSeparation(zsep), theNTkMin(ntkmin),
72 theWei(wei), theUseError(useError)
90 std::pair < std::vector < Cluster1D<T> >, std::vector < const T * > >
92 (
const std::vector < Cluster1D<T> > &
input )
const
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) );
111 std::vector <
Cluster1D<T> > & totDiscardedTracks )
const
113 using namespace Clusterizer1DCommons;
115 std::vector < Cluster1D<T> >
input = inputo;
116 std::vector < Cluster1D<T> > discardedTracks;
117 if (
input.size() < theNTkMin)
119 insertTracks(
input, totDiscardedTracks);
124 std::vector < Cluster1D<T> > partOfPTracks;
125 partOfPTracks.push_back(
input.front());
127 ic !=
input.end(); ic++)
130 if ( fabs( (*ic).position().value()-(*(ic-1)).position().value() )
131 < (
double) theZSeparation )
133 partOfPTracks.push_back((*ic));
137 if(partOfPTracks.size() >= theNTkMin)
139 std::vector< Cluster1D<T> > clusters = makeCluster1Ds(partOfPTracks,
141 for (
typename std::vector<
Cluster1D<T> >::const_iterator iclus=clusters.begin();
142 iclus != clusters.end(); iclus++)
144 finalCluster1Ds.push_back(*iclus);
146 insertTracks(discardedTracks,totDiscardedTracks);
150 insertTracks(partOfPTracks,totDiscardedTracks);
152 partOfPTracks.clear();
153 partOfPTracks.push_back((*ic));
156 if (partOfPTracks.size() >= theNTkMin)
158 std::vector < Cluster1D<T> > clusters = makeCluster1Ds(partOfPTracks,
160 for (
typename std::vector<
Cluster1D<T> >::const_iterator iclus = clusters.begin();
161 iclus != clusters.end(); iclus++)
163 finalCluster1Ds.push_back(*iclus);
165 insertTracks(discardedTracks,totDiscardedTracks);
169 insertTracks(partOfPTracks,totDiscardedTracks);
172 sort(finalCluster1Ds.begin(), finalCluster1Ds.end(),
180 std::vector < Cluster1D<T> >
185 std::vector < Cluster1D<T> > finalCluster1Ds;
186 discardedTracks.clear();
187 std::vector<Cluster1D<T> > pvClu0 = clusters;
188 std::vector<Cluster1D<T> > pvCluNew = pvClu0;
192 int nDiscardedAtIteration = 100;
193 while ( nDiscardedAtIteration !=0 )
195 pvCluNew = theCleaner->clusters(pvClu0);
196 std::vector<Cluster1D<T> >
197 tracksAtIteration = theCleaner->discardedCluster1Ds();
198 nDiscardedAtIteration = tracksAtIteration.size();
199 if ( nDiscardedAtIteration!=0 )
201 insertTracks(tracksAtIteration,discardedTracks);
205 unsigned ntkclus = pvCluNew.size();
206 unsigned ndiscard = discardedTracks.size();
208 if ( ntkclus >= theNTkMin )
211 finalCluster1Ds.push_back( mergeCluster1Ds(pvCluNew) );
212 if ( ndiscard >= theNTkMin )
214 pvClu0 = discardedTracks;
215 discardedTracks.clear();
224 insertTracks(pvCluNew, discardedTracks);
228 return finalCluster1Ds;
236 if (clusou.size() == 0)
238 for (
typename std::vector<
Cluster1D<T> >::const_iterator iclu = clusou.begin();
239 iclu != clusou.end(); iclu++)
241 cludest.push_back(*iclu);
257 std::vector<const T* >
260 std::vector<const T* >
tracks;
261 for (
typename std::vector<
Cluster1D<T> >::const_iterator iclu = clu.begin();
262 iclu != clu.end(); iclu++)
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 )
268 tracks.push_back ( *
i );
280 for (
typename std::vector<
Cluster1D<T> >::iterator iclu = (clusters.begin())+1;
281 iclu != clusters.end(); iclu++)
284 result = (*theMerger)( old , *iclu );
virtual DivisiveClusterizer1D * clone() const
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
Cluster1DCleaner< T > * theCleaner
DivisiveClusterizer1D(float zoffset=5., int ntkmin=5, bool useError=true, float zsep=0.05, bool wei=true)
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