int Cluster_ReadInfo::Cluster() { BufferedLine infile; if (infile.OpenFileRead( filename_ )) return Err(0); const char* ptr = infile.Line(); if (ptr == 0) return Err(1); ArgList infoLine( ptr, " " ); int nclusters = infoLine.getKeyInt("#Clustering:", -1); if (nclusters == -1) return Err(2); int nframes = infoLine.getKeyInt("clusters", -1); if (nframes == -1) return Err(3); if (nframes != (int)FrameDistances_.Nframes()) { mprinterr("Error: # frames in cluster info file (%i) does not match" " current # frames (%zu)\n", nframes, FrameDistances_.Nframes()); return 1; } // Scan down to clusters while (ptr[0] == '#') { ptr = infile.Line(); if (ptr == 0) return Err(1); // Save previous clustering info. Includes newline. if (ptr[1] == 'A' && ptr[2] == 'l' && ptr[3] == 'g') algorithm_.assign( ptr + 12 ); // Right past '#Algorithm: ' } // Read clusters ClusterDist::Cframes frames; for (int cnum = 0; cnum != nclusters; cnum++) { if (ptr == 0) return Err(1); frames.clear(); // TODO: Check for busted lines? for (int fidx = 0; fidx != nframes; fidx++) { if (ptr[fidx] == 'X') frames.push_back( fidx ); } AddCluster( frames ); mprintf("\tRead cluster %i, %zu frames.\n", cnum, frames.size()); ptr = infile.Line(); } infile.CloseFile(); mprintf("\tCalculating the distances between each cluster based on centroids.\n"); CalcClusterDistances(); return 0; }
static double AvgCalc_Std( DataSet_1D const& dsIn, ClusterDist::Cframes const& cframesIn ) { double val = 0.0; for (ClusterDist::Cframes_it frm = cframesIn.begin(); frm != cframesIn.end(); ++frm) val += dsIn.Dval( *frm ); return (val / (double)cframesIn.size()); }