1 #ifndef _DivisiveClusterizer1D_H_
2 #define _DivisiveClusterizer1D_H_
34 float zsep = 0.05,
bool wei =
true );
38 std::pair < std::vector < Cluster1D<T> >, std::vector < const T * > >
operator()
39 (
const std::vector < Cluster1D<T> > & )
const;
78 :theZOffSet(zoffset), theNTkMin(ntkmin),
79 theUseError(useError), theZSeparation(zsep), theWei(wei)
97 std::pair < std::vector < Cluster1D<T> >, std::vector < const T * > >
99 (
const std::vector < Cluster1D<T> > &
input )
const
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) );
118 std::vector <
Cluster1D<T> > & totDiscardedTracks )
const
120 using namespace Clusterizer1DCommons;
122 std::vector < Cluster1D<T> >
input = inputo;
123 std::vector < Cluster1D<T> > discardedTracks;
124 if (
input.size() < (
unsigned int)theNTkMin)
126 insertTracks(
input, totDiscardedTracks);
131 std::vector < Cluster1D<T> > partOfPTracks;
132 partOfPTracks.push_back(
input.front());
134 ic !=
input.end(); ic++)
137 if ( fabs( (*ic).position().value()-(*(ic-1)).position().value() )
138 < (
double) theZSeparation )
140 partOfPTracks.push_back((*ic));
144 if(partOfPTracks.size() >= (
unsigned int)theNTkMin)
146 std::vector< Cluster1D<T> > clusters = makeCluster1Ds(partOfPTracks,
148 for (
typename std::vector<
Cluster1D<T> >::const_iterator iclus=clusters.begin();
149 iclus != clusters.end(); iclus++)
151 finalCluster1Ds.push_back(*iclus);
153 insertTracks(discardedTracks,totDiscardedTracks);
157 insertTracks(partOfPTracks,totDiscardedTracks);
159 partOfPTracks.clear();
160 partOfPTracks.push_back((*ic));
163 if (partOfPTracks.size() >= (
unsigned int)theNTkMin)
165 std::vector < Cluster1D<T> > clusters = makeCluster1Ds(partOfPTracks,
167 for (
typename std::vector<
Cluster1D<T> >::const_iterator iclus = clusters.begin();
168 iclus != clusters.end(); iclus++)
170 finalCluster1Ds.push_back(*iclus);
172 insertTracks(discardedTracks,totDiscardedTracks);
176 insertTracks(partOfPTracks,totDiscardedTracks);
179 sort(finalCluster1Ds.begin(), finalCluster1Ds.end(),
187 std::vector < Cluster1D<T> >
192 std::vector < Cluster1D<T> > finalCluster1Ds;
193 discardedTracks.clear();
194 std::vector<Cluster1D<T> > pvClu0 = clusters;
195 std::vector<Cluster1D<T> > pvCluNew = pvClu0;
199 int nDiscardedAtIteration = 100;
200 while ( nDiscardedAtIteration !=0 )
202 pvCluNew = theCleaner->clusters(pvClu0);
203 std::vector<Cluster1D<T> >
204 tracksAtIteration = theCleaner->discardedCluster1Ds();
205 nDiscardedAtIteration = tracksAtIteration.size();
206 if ( nDiscardedAtIteration!=0 )
208 insertTracks(tracksAtIteration,discardedTracks);
212 unsigned ntkclus = pvCluNew.size();
213 unsigned ndiscard = discardedTracks.size();
215 if ( ntkclus >= theNTkMin )
218 finalCluster1Ds.push_back( mergeCluster1Ds(pvCluNew) );
219 if ( ndiscard >= theNTkMin )
221 pvClu0 = discardedTracks;
222 discardedTracks.clear();
231 insertTracks(pvCluNew, discardedTracks);
235 return finalCluster1Ds;
243 if (clusou.size() == 0)
245 for (
typename std::vector<
Cluster1D<T> >::const_iterator iclu = clusou.begin();
246 iclu != clusou.end(); iclu++)
248 cludest.push_back(*iclu);
264 std::vector<const T* >
267 std::vector<const T* >
tracks;
268 for (
typename std::vector<
Cluster1D<T> >::const_iterator iclu = clu.begin();
269 iclu != clu.end(); iclu++)
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 )
275 tracks.push_back ( *
i );
287 for (
typename std::vector<
Cluster1D<T> >::iterator iclu = (clusters.begin())+1;
288 iclu != clusters.end(); iclu++)
291 result = (*theMerger)( old , *iclu );
pixeltemp::Cluster1DMerger< T > * theMerger
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
Cluster1D< T > mergeCluster1Ds(std::vector< Cluster1D< T > > &) const
XYZPointD XYZPoint
point in space with cartesian internal representation
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