コード例 #1
0
//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);
}
コード例 #2
0
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;
}