⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 block_multiple_alignment.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        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 + -