📄 block_multiple_alignment.cpp
字号:
newAlignedBlock->SetRangeOfRow(row, oldTo - newAlignedBlock->width + 1, oldTo); } InsertBlockAfter(info.block, newAlignedBlock); if (!CheckAlignedBlock(info.block) || !CheckAlignedBlock(newAlignedBlock)) ERRORMSG("BlockMultipleAlignment::SplitBlock() - split failed to create valid blocks"); UpdateBlockMapAndColors(); return true;}bool BlockMultipleAlignment::MergeBlocks(int fromAlignmentIndex, int toAlignmentIndex){ Block *expandedBlock = blockMap[fromAlignmentIndex].block, *lastBlock = blockMap[toAlignmentIndex].block; if (expandedBlock == lastBlock) return false; int i; for (i=fromAlignmentIndex; i<=toAlignmentIndex; ++i) if (!blockMap[i].block->IsAligned()) return false; TRACEMSG("merging block(s)"); for (i=0; i<NRows(); ++i) expandedBlock->SetRangeOfRow(i, expandedBlock->GetRangeOfRow(i)->from, lastBlock->GetRangeOfRow(i)->to); expandedBlock->width = lastBlock->GetRangeOfRow(0)->to - expandedBlock->GetRangeOfRow(0)->from + 1; Block *deletedBlock = NULL, *blockToDelete; for (i=fromAlignmentIndex; i<=toAlignmentIndex; ++i) { blockToDelete = blockMap[i].block; if (blockToDelete == expandedBlock) continue; if (blockToDelete != deletedBlock) { deletedBlock = blockToDelete; RemoveBlock(blockToDelete); } } if (!CheckAlignedBlock(expandedBlock)) ERRORMSG("BlockMultipleAlignment::MergeBlocks() - merge failed to create valid block"); UpdateBlockMapAndColors(); return true;}bool BlockMultipleAlignment::CreateBlock(int fromAlignmentIndex, int toAlignmentIndex, eUnalignedJustification justification){ const BlockInfo& info = blockMap[fromAlignmentIndex]; UnalignedBlock *prevUABlock = dynamic_cast<UnalignedBlock*>(info.block); if (!prevUABlock || info.block != blockMap[toAlignmentIndex].block) return false; int row, seqIndexFrom, seqIndexTo, newBlockWidth = toAlignmentIndex - fromAlignmentIndex + 1, origWidth = prevUABlock->width; vector < int > seqIndexesFrom(NRows()), seqIndexesTo(NRows()); const Sequence *seq; bool ignored; for (row=0; row<NRows(); ++row) { if (!GetSequenceAndIndexAt(fromAlignmentIndex, row, justification, &seq, &seqIndexFrom, &ignored) || !GetSequenceAndIndexAt(toAlignmentIndex, row, justification, &seq, &seqIndexTo, &ignored) || seqIndexFrom < 0 || seqIndexTo < 0 || seqIndexTo - seqIndexFrom + 1 != newBlockWidth) return false; seqIndexesFrom[row] = seqIndexFrom; seqIndexesTo[row] = seqIndexTo; } TRACEMSG("creating new aligned and unaligned blocks"); UnalignedBlock *nextUABlock = new UnalignedBlock(this); UngappedAlignedBlock *ABlock = new UngappedAlignedBlock(this); prevUABlock->width = nextUABlock->width = 0; bool deletePrevUABlock = true, deleteNextUABlock = true; const Block::Range *prevRange; int rangeWidth; for (row=0; row<NRows(); ++row) { prevRange = prevUABlock->GetRangeOfRow(row); nextUABlock->SetRangeOfRow(row, seqIndexesTo[row] + 1, prevRange->to); rangeWidth = prevRange->to - seqIndexesTo[row]; if (rangeWidth < 0) ERRORMSG("BlockMultipleAlignment::CreateBlock() - negative nextRange width"); else if (rangeWidth > 0) { if (rangeWidth > nextUABlock->width) nextUABlock->width = rangeWidth; deleteNextUABlock = false; } prevUABlock->SetRangeOfRow(row, prevRange->from, seqIndexesFrom[row] - 1); rangeWidth = seqIndexesFrom[row] - prevRange->from; if (rangeWidth < 0) ERRORMSG("BlockMultipleAlignment::CreateBlock() - negative prevRange width"); else if (rangeWidth > 0) { if (rangeWidth > prevUABlock->width) prevUABlock->width = rangeWidth; deletePrevUABlock = false; } ABlock->SetRangeOfRow(row, seqIndexesFrom[row], seqIndexesTo[row]); } ABlock->width = newBlockWidth; if (prevUABlock->width + ABlock->width + nextUABlock->width != origWidth) ERRORMSG("BlockMultipleAlignment::CreateBlock() - bad block widths sum"); InsertBlockAfter(prevUABlock, ABlock); InsertBlockAfter(ABlock, nextUABlock); if (deletePrevUABlock) { TRACEMSG("deleting zero-width unaligned block on left"); RemoveBlock(prevUABlock); } if (deleteNextUABlock) { TRACEMSG("deleting zero-width unaligned block on right"); RemoveBlock(nextUABlock); } if (!CheckAlignedBlock(ABlock)) ERRORMSG("BlockMultipleAlignment::CreateBlock() - failed to create valid block"); UpdateBlockMapAndColors(); return true;}bool BlockMultipleAlignment::DeleteBlock(int alignmentIndex){ Block *block = blockMap[alignmentIndex].block; if (!block || !block->IsAligned()) return false; TRACEMSG("deleting block"); Block *prevBlock = GetBlockBefore(block), *nextBlock = GetBlockAfter(block); // unaligned blocks on both sides - note that total alignment width can change! if (prevBlock && !prevBlock->IsAligned() && nextBlock && !nextBlock->IsAligned()) { const Block::Range *prevRange, *nextRange; int maxWidth = 0, width; for (int row=0; row<NRows(); ++row) { prevRange = prevBlock->GetRangeOfRow(row); nextRange = nextBlock->GetRangeOfRow(row); width = nextRange->to - prevRange->from + 1; prevBlock->SetRangeOfRow(row, prevRange->from, nextRange->to); if (width > maxWidth) maxWidth = width; } prevBlock->width = maxWidth; TRACEMSG("removing extra unaligned block"); RemoveBlock(nextBlock); } // unaligned block on left only else if (prevBlock && !prevBlock->IsAligned()) { const Block::Range *prevRange, *range; for (int row=0; row<NRows(); ++row) { prevRange = prevBlock->GetRangeOfRow(row); range = block->GetRangeOfRow(row); prevBlock->SetRangeOfRow(row, prevRange->from, range->to); } prevBlock->width += block->width; } // unaligned block on right only else if (nextBlock && !nextBlock->IsAligned()) { const Block::Range *range, *nextRange; for (int row=0; row<NRows(); ++row) { range = block->GetRangeOfRow(row); nextRange = nextBlock->GetRangeOfRow(row); nextBlock->SetRangeOfRow(row, range->from, nextRange->to); } nextBlock->width += block->width; } // no adjacent unaligned blocks else { TRACEMSG("creating new unaligned block"); Block *newBlock = CreateNewUnalignedBlockBetween(prevBlock, nextBlock); if (prevBlock) InsertBlockAfter(prevBlock, newBlock); else if (nextBlock) InsertBlockBefore(newBlock, nextBlock); else blocks.push_back(newBlock); } RemoveBlock(block); UpdateBlockMapAndColors(); return true;}bool BlockMultipleAlignment::DeleteAllBlocks(void){ if (blocks.size() == 0) return false; DELETE_ALL_AND_CLEAR(blocks, BlockList); InitCache(); AddUnalignedBlocks(); // one single unaligned block for whole alignment UpdateBlockMapAndColors(); return true;}bool BlockMultipleAlignment::DeleteRow(int row){ if (row < 0 || row >= NRows()) { ERRORMSG("BlockMultipleAlignment::DeleteRow() - row out of range"); return false; } // remove sequence from list SequenceList::iterator s = (const_cast<SequenceList*>(sequences))->begin(); for (int i=0; i<row; ++i) ++s; (const_cast<SequenceList*>(sequences))->erase(s); // delete row from all blocks, removing any zero-width blocks BlockList::iterator b = blocks.begin(), br, be = blocks.end(); while (b != be) { (*b)->DeleteRow(row); if ((*b)->width == 0) { br = b; ++b; TRACEMSG("deleting block resized to zero width"); RemoveBlock(*br); } else ++b; } // update total alignment width UpdateBlockMapAndColors(); InitCache(); return true;}void BlockMultipleAlignment::GetUngappedAlignedBlocks(UngappedAlignedBlockList *uabs) const{ uabs->clear(); uabs->reserve(blocks.size()); BlockList::const_iterator b, be = blocks.end(); for (b=blocks.begin(); b!=be; ++b) { UngappedAlignedBlock *uab = dynamic_cast<UngappedAlignedBlock*>(*b); if (uab) uabs->push_back(uab); } uabs->resize(uabs->size());}bool BlockMultipleAlignment::ExtractRows( const vector < int >& slavesToRemove, AlignmentList *pairwiseAlignments){ if (slavesToRemove.size() == 0) return false; // make a bool list of rows to remove, also checking to make sure slave list items are in range int i; vector < bool > removeRows(NRows(), false); for (i=0; i<slavesToRemove.size(); ++i) { if (slavesToRemove[i] > 0 && slavesToRemove[i] < NRows()) { removeRows[slavesToRemove[i]] = true; } else { ERRORMSG("BlockMultipleAlignment::ExtractRows() - can't extract row " << slavesToRemove[i]); return false; } } if (pairwiseAlignments) { TRACEMSG("creating new pairwise alignments"); SetDiagPostLevel(eDiag_Warning); // otherwise, info messages take a long time if lots of rows UngappedAlignedBlockList uaBlocks; GetUngappedAlignedBlocks(&uaBlocks); UngappedAlignedBlockList::const_iterator u, ue = uaBlocks.end(); for (i=0; i<slavesToRemove.size(); ++i) { // redraw molecule associated with removed row const Molecule *molecule = GetSequenceOfRow(slavesToRemove[i])->molecule; if (molecule) GlobalMessenger()->PostRedrawMolecule(molecule); // create new pairwise alignment from each removed row SequenceList *newSeqs = new SequenceList(2); (*newSeqs)[0] = (*sequences)[0]; (*newSeqs)[1] = (*sequences)[slavesToRemove[i]]; BlockMultipleAlignment *newAlignment = new BlockMultipleAlignment(newSeqs, alignmentManager); for (u=uaBlocks.begin(); u!=ue; ++u) { // only copy blocks that aren't flagged to be realigned if (markBlocks.find(*u) == markBlocks.end()) { UngappedAlignedBlock *newABlock = new UngappedAlignedBlock(newAlignment); const Block::Range *range = (*u)->GetRangeOfRow(0); newABlock->SetRangeOfRow(0, range->from, range->to); range = (*u)->GetRangeOfRow(slavesToRemove[i]); newABlock->SetRangeOfRow(1, range->from, range->to); newABlock->width = range->to - range->from + 1; newAlignment->AddAlignedBlockAtEnd(newABlock); } } if (!newAlignment->AddUnalignedBlocks() || !newAlignment->UpdateBlockMapAndColors()) { ERRORMSG("BlockMultipleAlignment::ExtractRows() - error creating new alignment"); return false; } // add aligned region info (for threader to use later on) if (uaBlocks.size() > 0) { int excess = 0; if (!RegistryGetInteger(REG_ADVANCED_SECTION, REG_FOOTPRINT_RES, &excess)) WARNINGMSG("Can't get footprint excess residues from registry"); newAlignment->alignSlaveFrom = uaBlocks.front()->GetRangeOfRow(slavesToRemove[i])->from - excess; if (newAlignment->alignSlaveFrom < 0) newAlignment->alignSlaveFrom = 0; newAlignment->alignSlaveTo = uaBlocks.back()->GetRangeOfRow(slavesToRemove[i])->to + excess; if (newAlignment->alignSlaveTo >= (*newSeqs)[1]->Length()) newAlignment->alignSlaveTo = (*newSeqs)[1]->Length() - 1; TRACEMSG((*newSeqs)[1]->identifier->ToString() << " aligned from " << newAlignment->alignSlaveFrom << " to " << newAlignment->alignSlaveTo); } pairwiseAlignments->push_back(newAlignment); } SetDiagPostLevel(eDiag_Info); } // remove sequences TRACEMSG("deleting sequences"); VectorRemoveElements(*(const_cast<SequenceList*>(sequences)), removeRows, slavesToRemove.size()); VectorRemoveElements(rowDoubles, removeRows, slavesToRemove.size()); VectorRemoveElements(rowStrings, removeRows, slavesToRemove.size()); // delete row from all blocks, removing any zero-width blocks TRACEMSG("deleting alignment rows from blocks"); BlockList::const_iterator b = blocks.begin(), br, be = blocks.end(); while (b != be) { (*b)->DeleteRows(removeRows, slavesToRemove.size()); if ((*b)->width == 0) { br = b; ++b; TRACEMSG("deleting block resized to zero width"); RemoveBlock(*br); } else ++b; } // update total alignment width UpdateBlockMapAndColors(); InitCache(); return true;}bool BlockMultipleAlignment::MergeAlignment(const BlockMultipleAlignment *newAlignment){ // check to see if the alignment is compatible - must have same master sequence // and blocks of new alignment must contain blocks of this alignment; at same time, // build up map of aligned blocks in new alignment that correspond to aligned blocks // of this object, for convenient lookup later if (newAlignment->GetMaster() != GetMaster()) return false; const Block::Range *newRange, *thisRange; BlockList::const_iterator nb, nbe = newAlignment->blocks.end(); BlockList::iterator b, be = blocks.end(); typedef map < UngappedAlignedBlock *, const UngappedAlignedBlock * > AlignedBlockMap;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -