//Add masses before first isotope void addPreisotopeWeights(const std::vector<double>& firstIsotopeMasses, std::vector<std::pair<double, double> >& isotopeSpec, // output UInt nrpeaks, double preIsotopePeaksWeight, // weight of pre isotope peaks double mannmass, double charge) { for (std::size_t i = 0; i < firstIsotopeMasses.size(); ++i) { double mul = 1.; for (UInt j = 0; j < nrpeaks; ++j, ++mul) { isotopeSpec.push_back( std::make_pair(firstIsotopeMasses[i] - (mul * mannmass) / charge, preIsotopePeaksWeight)); } } sortByFirst(isotopeSpec); }
vector<pair<int,svlObject2d> > CallButtonEnhancer::clusterCandidateObjects(svlObject2dFrame &objects) { svlObject2dFrame detect_centroids;; int numObjects = objects.size(); for (int i=0; i<numObjects; i++) { detect_centroids.push_back(objects[i]); } double numRemoved = removeOverlappingObjects(detect_centroids, CLUSTER_OVERLAP); cout << "Removed overlapping objects: " << numRemoved << " objects." << endl; int numClusters = detect_centroids.size(); cout << "Number remaining: " << detect_centroids.size() << endl; cout << "Number of clusters to use for Kmeans: " << numClusters << endl; cout << "Number of objects passed to Kmeans: " << numObjects << endl; // Find cluster centroids using Kmeans. svlKMeansT<svlPoint2d> kmeans; // Initialize point and centroid svlPoint2d vectors vector<svlPoint2d> points; vector<svlPoint2d> centroids; double h_mean=0; double w_mean=0; for (int i=0; i<numObjects; i++) { cout << "OBJECT " << i << "x = " << objects[i].x << " y = " << objects[i].y << " w = " << objects[i].w <<endl; points.push_back(svlPoint2d(objects[i].x,objects[i].y)); w_mean += objects[i].w; h_mean += objects[i].h; } h_mean = h_mean/numObjects; w_mean = w_mean/numObjects; double l_mean = (h_mean+w_mean)/2; for (int i=0; i<numClusters; i++) { centroids.push_back(svlPoint2d(detect_centroids[i].x,detect_centroids[i].y)); } vector<int> cluster_idx; kmeans.do_kmeans(points,centroids,&cluster_idx,numClusters,-1); cout << "kmeans successful" << endl; vector<pair<int,svlObject2d> > clusterCentroids; for (int i=0; i<numClusters; i++) { pair<int,svlObject2d> p; p = make_pair(0,svlObject2d(centroids[i].x,centroids[i].y,l_mean,l_mean,0)); clusterCentroids.push_back(p); } for (int i=0; i<numClusters; i++) { cout << "CENTROID " << i << "x = " << clusterCentroids[i].second.x << " y = " << clusterCentroids[i].second.y << " w = " << clusterCentroids[i].second.h <<endl; for (int j=0; j<numObjects; j++) { if(abs((objects[j].x + objects[j].w* 0.4 ) - (clusterCentroids[i].second.x + clusterCentroids[i].second.w* 0.4 )) < clusterCentroids[i].second.w * 0.4 && abs((objects[j].y + objects[j].h* 0.4 ) - (clusterCentroids[i].second.y + clusterCentroids[i].second.w* 0.4 )) < clusterCentroids[i].second.h* 0.4 ){ clusterCentroids[i].first++; } if(abs((objects[j].x + objects[j].w* 0.4 ) - (clusterCentroids[i].second.x + clusterCentroids[i].second.w* 0.4 )) > clusterCentroids[i].second.w * 0.4 && abs((objects[j].y + objects[j].h* 0.4 ) - (clusterCentroids[i].second.y + clusterCentroids[i].second.h* 0.4 )) < clusterCentroids[i].second.h* 0.4 ){ clusterCentroids[i].first-=2; } } } bool isAligned = false; for (int i=0; i<numClusters; i++) { isAligned=false; for (int j=0; j<numClusters; j++) { if(i!=j && abs(clusterCentroids[i].second.x - clusterCentroids[j].second.x) < clusterCentroids[i].second.w*0.4 && abs(clusterCentroids[i].second.y - clusterCentroids[j].second.y) < clusterCentroids[i].second.h*1.9 && abs(clusterCentroids[i].second.y - clusterCentroids[j].second.y) >= clusterCentroids[i].second.h*0.4){ isAligned = true; break; } } if(isAligned){ clusterCentroids[i].first+=5; } } sortByFirst(clusterCentroids); /* for (int i=0; i<objects.size(); i++) { clusterCentroids[cluster_idx[i]].second.x += objects[i].x; clusterCentroids[cluster_idx[i]].second.y += objects[i].y; clusterCentroids[cluster_idx[i]].second.w += objects[i].w; clusterCentroids[cluster_idx[i]].second.h += objects[i].h; clusterCentroids[cluster_idx[i]].second.pr += objects[i].pr; clusterCentroids[cluster_idx[i]].first--; //cout << objects[i].x << " " << objects[i].y << " " << cluster_idx[i] << endl; } for (int i=0; i<numClusters; i++) { clusterCentroids[i].second.x /= -clusterCentroids[i].first; clusterCentroids[i].second.y /= -clusterCentroids[i].first; clusterCentroids[i].second.w /= -clusterCentroids[i].first; clusterCentroids[i].second.h /= -clusterCentroids[i].first; clusterCentroids[i].second.pr /= -clusterCentroids[i].first; } // sort cluster centroids in decreasing order by number of points in cluster. // Change cluster count to positive numbers. for (int i=0; i<numClusters; i++) { clusterCentroids[i].first = -clusterCentroids[i].first; //cout << clusterCentroids[i].x << " " << clusterCentroids[i].y << " " // << clusterCentroids[i].w << " " << clusterCentroids[i].h << " " // << clusterCentroids[i].pr << " " << clusterCentroids[i].n << endl; } */ return clusterCentroids; }