示例#1
0
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;


}