Esempio n. 1
0
bool RemasterWithStructure(CCdCore* cd, string* msg)
{
    static const string msgHeader = "Remastering CD to ";

	CRef< CSeq_id > seqId;
	cd->GetSeqIDForRow(0,0,seqId);
	if (seqId->IsPdb())
		return false;
	AlignmentCollection ac(cd,CCdCore::USE_NORMAL_ALIGNMENT);
	int nrows = ac.GetNumRows();
	int i = 1;
	for (; i < nrows; i++)
	{
		ac.GetSeqIDForRow(i,seqId);
		if (seqId->IsPdb())
			break;
	}
	if ( i < nrows)
	{
		ReMasterCdWithoutUnifiedBlocks(cd, i, true);
        if (msg) {
            *msg = msgHeader + seqId->AsFastaString();
        }
		return true;
	}
	else
		return false;
}
Esempio n. 2
0
void SeqSwapper::swapSequences()
{
	int numNormal = m_cd->GetNumRows();
	LOG_POST("Clustering");
	vector< vector<int> * > clusters;
	makeClusters(m_clusteringThreshold, clusters);
	vector< pair<int, int> > replacementPairs;
	set<int> structures;
	LOG_POST("Clustering is done (made " << clusters.size() << " clusters)");
	LOG_POST("Find replacements by BLAST in each cluster");
	for (int i = 0; i < clusters.size(); i++)
	{
		vector<int>* cluster = clusters[i];
        if (cluster) {
            findReplacements(*cluster, replacementPairs, structures);
            delete cluster;
        }
	}
	LOG_POST("Done with BLAST in each cluster");
	set<int> usedPendings;
	
	vector<int> selectedNormalRows;
	int newMaster = -1;
	for (int p = 0; p < replacementPairs.size(); p++)
	{
		//debug
		CRef< CSeq_id > seqId;
		m_ac.GetSeqIDForRow(replacementPairs[p].first, seqId);
		string nid = seqId->AsFastaString();
		m_ac.GetSeqIDForRow(replacementPairs[p].second, seqId);
		string pid = seqId->AsFastaString();
		LOG_POST("replacing "<<nid<<" with "<<pid);
		//take care of master replacement
		if (replacementPairs[p].first == 0)
			newMaster = replacementPairs[p].second - numNormal;
		else
		{
			selectedNormalRows.push_back(replacementPairs[p].first);
			usedPendings.insert(replacementPairs[p].second - numNormal);
		}
	}
	m_cd->EraseTheseRows(selectedNormalRows);
	if (structures.size() > 0)
	{
		LOG_POST("Adding "<<structures.size()<<" structures");
		for (set<int>::iterator sit = structures.begin(); sit != structures.end(); sit++)
			usedPendings.insert(*sit - numNormal);
	}
	if (newMaster >= 0)
		promotePendingRows(usedPendings, &newMaster);
	else
		promotePendingRows(usedPendings);
	//findStructuralPendings(structures);
	
	if (newMaster > 0)
	{
		ReMasterCdWithoutUnifiedBlocks(m_cd, newMaster, true);
		vector<int> rows;
		rows.push_back(newMaster);
		m_cd->EraseTheseRows(rows);
	}
	m_cd->ResetPending();
	m_cd->EraseSequences();
}