pair<int, double> DistanceMatrix::compareAllWindows(vector<double> minDistVec1, vector<double> minDistVec2, vector<string> allowedAminoAcids1,vector<string> allowedAminoAcids2, int choice){ int length = listMW.size(); int bestIndex; MatrixWindow *bestWindow = NULL; double minLikeness = 1000000;//for choice == minRowWeighted or choice==minRowAndColWeighted double maxLikeness = -1.0;//for choice == correlation double deviationFromMaxLikeness = 0.5; vector<pair<double,int> > results; for (int i=0; i<length; i++){ MatrixWindow *win = listMW[i]; //cout << "Testing window: "<<endl<<win->toString()<<endl; double likeness; switch(choice){ case minRowWeighted: likeness = win->compareMinRowWeighted(minDistVec1); if(likeness<(minLikeness+deviationFromMaxLikeness) && abs(likeness - minLikeness) > 0.001){ minLikeness=likeness; bestWindow=win; bestIndex = i; results.push_back(pair<double,int>(minLikeness,bestIndex)); }//end if break; case minRowAndColWeighted: likeness = win-> compareMinRCWeighted(minDistVec1); if(likeness<(minLikeness+deviationFromMaxLikeness) && abs(likeness - minLikeness) > 0.001){ minLikeness=likeness; bestWindow=win; bestIndex = i; results.push_back(pair<double,int>(minLikeness,bestIndex)); }//end if break; case correlation: likeness = win->compareCorrelation(minDistVec1); if(likeness>(maxLikeness-deviationFromMaxLikeness) && abs(likeness-maxLikeness) > 0.001){ maxLikeness = likeness; bestWindow = win; bestIndex = i; results.push_back(pair<double,int>(maxLikeness,bestIndex)); } break; case correlationRowCol: if (win->getUpLeftResidueNumbers()[0] == win->getUpLeftResidueNumbers()[1]){ likeness = win -> compareCorrelationRowColAverage(minDistVec1); if(likeness>(maxLikeness-deviationFromMaxLikeness) && abs(likeness-maxLikeness) > 0.001){ maxLikeness = likeness; bestWindow = win; bestIndex = i; results.push_back(pair<double,int>(maxLikeness,bestIndex)); } } break; case correlationHeteroRowCol: likeness = win->compareCorrelationHeteroRowCol(minDistVec1, minDistVec2); if(likeness>(maxLikeness-deviationFromMaxLikeness) && abs(likeness-maxLikeness) > 0.001){ maxLikeness = likeness; bestWindow = win; bestIndex = i; results.push_back(pair<double,int>(maxLikeness,bestIndex)); } break; default: cout<< "Invalid int (choice) in function compareAllMinRowWeighted in DistanceMatrix."<<endl; exit(336); }//end switch //fprintf(stdout, "\t%8.3f\n", likeness); win=NULL; }//end for on i pair<int, double> indexAndLikeness (0, MslTools::doubleMax); if (results.size() == 0){ return indexAndLikeness; } // Sort the results if(choice==minRowWeighted || choice==minRowAndColWeighted){ sort(results.begin(), results.end()); } else{ sort(results.begin(), results.end(),greater<pair<double,int> >()); } // Apply Sequence Filtering to results. // Instead of results.size(), do results[0].first - 0.1 or something. int bestResultIndex = 0; if (allowedAminoAcids1.size() == listMW[0]->getWinSize() && allowedAminoAcids2.size() == listMW[0]->getWinSize()) { for (uint i = 0; i < results.size();i++){ if (listMW[results[i].second]->doesSequenceMatchRow(allowedAminoAcids1) && listMW[results[i].second]->doesSequenceMatchCol(allowedAminoAcids2)){ bestResultIndex = i; break; } } } else if (allowedAminoAcids1.size() == listMW[0]->getWinSize()){ for (uint i = 0; i < results.size();i++){ if (listMW[results[i].second]->doesSequenceMatchRow(allowedAminoAcids1)){ bestResultIndex = i; break; } } } else if (allowedAminoAcids2.size() == listMW[0]->getWinSize()){ for (uint i = 0; i < results.size();i++){ if (listMW[results[i].second]->doesSequenceMatchCol(allowedAminoAcids2)){ bestResultIndex = i; break; } } } indexAndLikeness.first = results[bestResultIndex].second; indexAndLikeness.second = results[bestResultIndex].first; bestWindow=NULL; return indexAndLikeness; }