46 LogDebug(
"RoadSearch") <<
"Raw Clouds input size: " << input->size();
52 if ( input->empty() ){
53 LogDebug(
"RoadSearch") <<
"Found " << output.size() <<
" clouds.";
61 if ( 1==input->size() ){
63 LogDebug(
"RoadSearch") <<
"Found " << output.size() <<
" clouds.";
70 std::vector<bool> already_gone(input->size());
71 for (
unsigned int i=0;
i<input->size(); ++
i) {
72 already_gone[
i] =
false;
77 for ( RoadSearchCloudCollection::const_iterator raw_cloud = input->begin(); raw_cloud != input->end(); ++raw_cloud) {
80 if (already_gone[raw_cloud_ctr-1])
continue;
84 int second_cloud_ctr=raw_cloud_ctr;
85 for ( RoadSearchCloudCollection::const_iterator second_cloud = raw_cloud+1; second_cloud != input->end(); ++second_cloud) {
88 std::vector<const TrackingRecHit*> unshared_hits;
90 if ( already_gone[second_cloud_ctr-1] )
continue;
92 for ( RoadSearchCloud::RecHitVector::const_iterator second_cloud_hit = second_cloud->begin_hits();
93 second_cloud_hit != second_cloud->end_hits();
94 ++ second_cloud_hit ) {
95 bool is_shared =
false;
96 for ( RoadSearchCloud::RecHitVector::const_iterator lone_cloud_hit = lone_cloud.
begin_hits();
97 lone_cloud_hit != lone_cloud.
end_hits();
100 if ((*lone_cloud_hit)->geographicalId().rawId() == (*second_cloud_hit)->geographicalId().rawId())
101 if ((*lone_cloud_hit)->localPosition().x() == (*second_cloud_hit)->localPosition().x())
102 if ((*lone_cloud_hit)->localPosition().y() == (*second_cloud_hit)->localPosition().y())
103 {is_shared=
true;
break;}
105 if (!is_shared) unshared_hits.push_back(*second_cloud_hit);
107 if ( ((
float(unshared_hits.size())/
float(lone_cloud.
size())) >
109 ((float(unshared_hits.size())/
float(second_cloud->size())) > (1-
mergingFraction_))){
116 double f_lone_shared=double(second_cloud->size()-unshared_hits.size())/
double(lone_cloud.
size());
117 double f_second_shared=double(second_cloud->size()-unshared_hits.size())/
double(second_cloud->size());
119 if ( ( (static_cast<unsigned int>(f_lone_shared*1E9) > static_cast<unsigned int>(
mergingFraction_*1E9))||(static_cast<unsigned int>(f_second_shared*1E9) > static_cast<unsigned int>(
mergingFraction_*1E9)) )
122 LogDebug(
"RoadSearch") <<
" Merge CloudA: " << raw_cloud_ctr <<
" with CloudB: " << second_cloud_ctr
123 <<
" Shared fractions are " << f_lone_shared <<
" and " << f_second_shared;
128 for (
unsigned int k=0;
k<unshared_hits.size(); ++
k) {
129 lone_cloud.
addHit(unshared_hits[
k]);
132 already_gone[second_cloud_ctr-1]=
true;
138 output.push_back(lone_cloud);
142 LogDebug(
"RoadSearch") <<
"Found " << output.size() <<
" clean clouds.";
T getParameter(std::string const &) const
unsigned int size() const
RecHitVector::const_iterator begin_hits() const
void addHit(const TrackingRecHit *input)
RecHitVector::const_iterator end_hits() const
void run(const RoadSearchCloudCollection *input, const edm::EventSetup &es, RoadSearchCloudCollection &output)
Runs the algorithm.
RoadSearchCloudCleanerAlgorithm(const edm::ParameterSet &conf)
~RoadSearchCloudCleanerAlgorithm()
std::vector< RoadSearchCloud > RoadSearchCloudCollection
unsigned int maxRecHitsInCloud_