<< s << '!')
50 #define WARNING_MESSAGE(s) ERR_POST(Warning << "block_align: "<< s)
51 #define INFO_MESSAGE(s) ERR_POST(Info << "block_align: "<< s)
53 #define NO_TRACEBACK kMax_UInt 67 typedefvector < ResidueRow >
Grid;
69 Matrix(
unsigned intnBlocks,
unsigned intnResidues) :
grid(nBlocks + 1)
70{
for(
unsigned int i=0;
i<nBlocks; ++
i)
grid[
i].
resize(nResidues + 1); }
77 unsigned intqueryFrom,
unsigned intqueryTo,
boolcheckGapSum)
82unfrozenBlocksLength = 0,
83prevFrozenBlock =
NONE,
100 ERROR_MESSAGE(
"Frozen block "<< (block+1) <<
" can't start < "<< (queryFrom+1));
104 ERROR_MESSAGE(
"Frozen block "<< (block+1) <<
" can't end > "<< (queryTo+1));
109 if(prevFrozenBlock !=
NONE) {
110 unsigned intprevFrozenBlockEnd =
115 ERROR_MESSAGE(
"Frozen block "<< (block+1) <<
" starts before end of prior frozen block, " 116 "or doesn't leave room for intervening unfrozen block(s)");
123 blocks->
freezeBlocks[block] > prevFrozenBlockEnd + 1 + unfrozenBlocksLength + maxGapsLength)
125 if(prevFrozenBlock == block - 1) {
126 WARNING_MESSAGE(
"Frozen block "<< (block+1) <<
" is further than allowed loop length" 127 " from adjacent frozen block "<< (prevFrozenBlock+1));
129 ERROR_MESSAGE(
"Frozen block "<< (block+1) <<
" is too far away from prior frozen block" 130 " given allowed intervening loop length(s) "<< maxGapsLength
131<<
" plus unfrozen block length(s) "<< unfrozenBlocksLength);
138prevFrozenBlock = block;
139unfrozenBlocksLength = maxGapsLength = 0;
148 unsigned intqueryFrom,
unsigned intqueryTo)
150 unsigned intblock, residue, prevResidue, lastBlock =
blocks->
nBlocks- 1;
155 for(block=0; block<=lastBlock; ++block) {
157firstPos[0] = queryFrom;
161lastPos[lastBlock - block] =
167 for(block=0; block<=lastBlock; ++block) {
173<< (block+1) <<
" does not leave room for unfrozen blocks");
181 for(residue=firstPos[0]; residue<=lastPos[0]; ++residue)
182matrix[0][residue - queryFrom].score = BlockScore(0, residue);
185 boolblockScoreCalculated;
186 for(block=1; block<=lastBlock; ++block) {
187 for(residue=firstPos[block]; residue<=lastPos[block]; ++residue) {
188blockScoreCalculated =
false;
190 for(prevResidue=firstPos[block - 1]; prevResidue<=lastPos[block - 1]; ++prevResidue) {
193 if(residue < prevResidue + blocks->blockSizes[block - 1])
207 if(!blockScoreCalculated) {
208score = BlockScore(block, residue);
211blockScoreCalculated =
true;
215sum = score + matrix[block - 1][prevResidue - queryFrom].score;
216 if(sum > matrix[block][residue - queryFrom].score) {
217matrix[block][residue - queryFrom].score = sum;
218matrix[block][residue - queryFrom].tracebackResidue = prevResidue;
230 unsigned intqueryFrom,
unsigned intqueryTo)
232 unsigned intblock, residue, prevResidue, lastBlock =
blocks->
nBlocks- 1;
233 intblockScore = 0, sum;
234 unsigned intloopPenalty;
238 for(block=0; block<=lastBlock; ++block) {
240firstPos[0] = queryFrom;
244lastPos[lastBlock - block] =
250 for(block=0; block<=lastBlock; ++block) {
256<< (block+1) <<
" does not leave room for unfrozen blocks");
264 for(residue=firstPos[0]; residue<=lastPos[0]; ++residue)
265matrix[0][residue - queryFrom].score = BlockScore(0, residue);
268 boolblockScoreCalculated;
269 for(block=1; block<=lastBlock; ++block) {
270 for(residue=firstPos[block]; residue<=lastPos[block]; ++residue) {
271blockScoreCalculated =
false;
273 for(prevResidue=firstPos[block - 1]; prevResidue<=lastPos[block - 1]; ++prevResidue) {
276 if(residue < prevResidue + blocks->blockSizes[block - 1])
289loopPenalty = LoopScore(block - 1, residue - prevResidue -
blocks->
blockSizes[block - 1]);
295 if(!blockScoreCalculated) {
296blockScore = BlockScore(block, residue);
299blockScoreCalculated =
true;
303sum = blockScore + matrix[block - 1][prevResidue - queryFrom].score - loopPenalty;
304 if(sum > matrix[block][residue - queryFrom].score) {
305matrix[block][residue - queryFrom].score = sum;
306matrix[block][residue - queryFrom].tracebackResidue = prevResidue;
318 unsigned intqueryFrom,
unsigned intqueryTo)
320 unsigned intblock, residue, prevResidue, lastBlock =
blocks->
nBlocks- 1, tracebackResidue = 0;
321 intscore, sum, bestPrevScore;
325 for(block=0; block<=lastBlock; ++block) {
327 ERROR_MESSAGE(
"Block "<< (block+1) <<
" too large for this query range");
334 for(residue=queryFrom; residue<=lastPos[0]; ++residue) {
335score = BlockScore(0, residue);
336matrix[0][residue - queryFrom].score = (score > 0) ? score : 0;
340 for(block=1; block<=lastBlock; ++block) {
341score = BlockScore(block, queryFrom);
342matrix[block][0].score = (score > 0) ? score : 0;
346 for(block=1; block<=lastBlock; ++block) {
347 for(residue=queryFrom+1; residue<=lastPos[block]; ++residue) {
350score = BlockScore(block, residue);
356 for(prevResidue=queryFrom; prevResidue<=lastPos[block - 1]; ++prevResidue) {
359 if(residue < prevResidue + blocks->blockSizes[block - 1])
367 if(matrix[block - 1][prevResidue - queryFrom].score > bestPrevScore) {
368bestPrevScore = matrix[block - 1][prevResidue - queryFrom].score;
369tracebackResidue = prevResidue;
374 if(bestPrevScore > 0 && (sum=bestPrevScore+score) > 0) {
375matrix[block][residue - queryFrom].score = sum;
376matrix[block][residue - queryFrom].tracebackResidue = tracebackResidue;
381matrix[block][residue - queryFrom].score = score;
391 unsigned intqueryFrom,
unsigned intqueryTo)
393 unsigned intblock, residue, prevResidue, loopPenalty,
395 intscore, sum, bestPrevScore;
399 for(block=0; block<=lastBlock; ++block) {
401 ERROR_MESSAGE(
"Block "<< (block+1) <<
" too large for this query range");
408 for(residue=queryFrom; residue<=lastPos[0]; ++residue) {
409score = BlockScore(0, residue);
410matrix[0][residue - queryFrom].score = (score > 0) ? score : 0;
414 for(block=1; block<=lastBlock; ++block) {
415score = BlockScore(block, queryFrom);
416matrix[block][0].score = (score > 0) ? score : 0;
420 for(block=1; block<=lastBlock; ++block) {
421 for(residue=queryFrom+1; residue<=lastPos[block]; ++residue) {
424score = BlockScore(block, residue);
430 for(prevResidue=queryFrom; prevResidue<=lastPos[block - 1]; ++prevResidue) {
433 if(residue < prevResidue + blocks->blockSizes[block - 1])
441loopPenalty = LoopScore(block - 1, residue - prevResidue -
blocks->
blockSizes[block - 1]);
446sum = matrix[block - 1][prevResidue - queryFrom].score - loopPenalty;
447 if(sum > bestPrevScore) {
449tracebackResidue = prevResidue;
454 if(bestPrevScore > 0 && (sum=bestPrevScore+score) > 0) {
455matrix[block][residue - queryFrom].score = sum;
456matrix[block][residue - queryFrom].tracebackResidue = tracebackResidue;
461matrix[block][residue - queryFrom].score = score;
472vector < unsigned int > blockPositions;
473 unsigned intblock = lastBlock, pos = lastBlockPos;
475blockPositions.push_back(pos);
476pos = matrix[block][pos - queryFrom].tracebackResidue;
479 unsigned intfirstBlock = block + 1;
482alignment->
score= matrix[lastBlock][lastBlockPos - queryFrom].score;
484alignment->
nBlocks= blockPositions.size();
485alignment->
blockPositions=
new unsigned int[blockPositions.size()];
486 for(block=0; block<blockPositions.size(); ++block)
487alignment->
blockPositions[block] = blockPositions[lastBlock - firstBlock - block];
497 ERROR_MESSAGE(
"TracebackGlobalAlignment() - NULL alignment handle");
504 unsigned intresidue, lastBlockPos = 0;
505 for(residue=queryFrom; residue<=queryTo; ++residue) {
506 if(matrix[
blocks->
nBlocks- 1][residue - queryFrom].score > score) {
507score = matrix[
blocks->
nBlocks- 1][residue - queryFrom].score;
508lastBlockPos = residue;
513 ERROR_MESSAGE(
"TracebackGlobalAlignment() - somehow failed to find any allowed global alignment");
527 ERROR_MESSAGE(
"TracebackLocalAlignment() - NULL alignment handle");
534 unsigned intblock, residue, lastBlock = 0, lastBlockPos = 0;
536 for(residue=queryFrom; residue<=queryTo; ++residue) {
537 if(matrix[block][residue - queryFrom].score > score) {
538score = matrix[block][residue - queryFrom].score;
540lastBlockPos = residue;
565 ERROR_MESSAGE(
"TracebackMultipleLocalAlignments() - NULL alignments handle");
570 unsigned intblock, residue;
573usedCells[block].
resize(queryTo - queryFrom + 1,
false);
576list < Traceback > tracebacks;
577 while(maxAlignments == 0 || tracebacks.size() < maxAlignments) {
581 unsigned intlastBlock = 0, lastBlockPos = 0;
583 for(residue=queryFrom; residue<=queryTo; ++residue) {
584 if(!usedCells[block][residue - queryFrom] &&
585matrix[block][residue - queryFrom].score > score)
587score = matrix[block][residue - queryFrom].score;
589lastBlockPos = residue;
599residue = lastBlockPos;
600 boolrepeated =
false;
602 if(usedCells[block][residue - queryFrom]) {
606usedCells[block][residue - queryFrom] =
true;
608residue = matrix[block][residue - queryFrom].tracebackResidue;
615tracebacks.resize(tracebacks.size() + 1);
616tracebacks.back().block = lastBlock;
617tracebacks.back().residue = lastBlockPos;
620 if(tracebacks.size() == 0) {
630 for(
a=0;
a<tracebacks.size(); ++
a)
631(*alignments)->alignments[
a].blockPositions =
NULL;
634list < Traceback >::const_iterator
t, te = tracebacks.end();
635 for(
t=tracebacks.begin(),
a=0;
t!=te; ++
t, ++
a) {
636 if(
TracebackAlignment(matrix,
t->block,
t->residue, queryFrom, &((*alignments)->alignments[
a]))
639++((*alignments)->nAlignments);
661 unsigned intqueryFrom,
unsigned intqueryTo,
665 ERROR_MESSAGE(
"DP_GlobalBlockAlign() - invalid parameters");
669 unsigned int i, sumBlockLen = 0;
672 if(sumBlockLen > queryTo - queryFrom + 1) {
673 ERROR_MESSAGE(
"DP_GlobalBlockAlign() - sum of block lengths longer than query region");
679 ERROR_MESSAGE(
"DP_GlobalBlockAlign() - ValidateFrozenBlockPositions() returned error");
687 ERROR_MESSAGE(
"DP_GlobalBlockAlign() - CalculateGlobalMatrix() failed");
697 unsigned intqueryFrom,
unsigned intqueryTo,
701!BlockScore || !LoopScore) {
702 ERROR_MESSAGE(
"DP_GlobalBlockAlignGeneric() - invalid parameters");
706 unsigned int i, sumBlockLen = 0;
709 if(sumBlockLen > queryTo - queryFrom + 1) {
710 ERROR_MESSAGE(
"DP_GlobalBlockAlignGeneric() - sum of block lengths longer than query region");
716 ERROR_MESSAGE(
"DP_GlobalBlockAlignGeneric() - ValidateFrozenBlockPositions() returned error");
724 ERROR_MESSAGE(
"DP_GlobalBlockAlignGeneric() - CalculateGlobalMatrixGeneric() failed");
733 unsigned intqueryFrom,
unsigned intqueryTo,
737 ERROR_MESSAGE(
"DP_LocalBlockAlign() - invalid parameters");
740 for(
unsigned intblock=0; block<
blocks->
nBlocks; ++block) {
742 WARNING_MESSAGE(
"DP_LocalBlockAlign() - frozen block specifications are ignored...");
751 ERROR_MESSAGE(
"DP_LocalBlockAlign() - CalculateLocalMatrix() failed");
760 unsigned intqueryFrom,
unsigned intqueryTo,
764 ERROR_MESSAGE(
"DP_LocalBlockAlignGeneric() - invalid parameters");
767 for(
unsigned intblock=0; block<
blocks->
nBlocks; ++block) {
769 WARNING_MESSAGE(
"DP_LocalBlockAlignGeneric() - frozen block specifications are ignored...");
778 ERROR_MESSAGE(
"DP_LocalBlockAlignGeneric() - CalculateLocalMatrixGeneric() failed");
787 unsigned intqueryFrom,
unsigned intqueryTo,
791 ERROR_MESSAGE(
"DP_MultipleLocalBlockAlign() - invalid parameters");
794 for(
unsigned intblock=0; block<
blocks->
nBlocks; ++block) {
796 WARNING_MESSAGE(
"DP_MultipleLocalBlockAlign() - frozen block specifications are ignored...");
805 ERROR_MESSAGE(
"DP_MultipleLocalBlockAlign() - CalculateLocalMatrix() failed");
814 unsigned intqueryFrom,
unsigned intqueryTo,
818 ERROR_MESSAGE(
"DP_MultipleLocalBlockAlignGeneric() - invalid parameters");
821 for(
unsigned intblock=0; block<
blocks->
nBlocks; ++block) {
823 WARNING_MESSAGE(
"DP_MultipleLocalBlockAlignGeneric() - frozen block specifications are ignored...");
832 ERROR_MESSAGE(
"DP_MultipleLocalBlockAlignGeneric() - CalculateLocalMatrixGeneric() failed");
847 for(
unsigned int i=0;
i<nBlocks; ++
i)
873 if(!alignments)
return;
882 unsigned intnLoops,
const unsigned int*loops,
883 doublepercentile,
unsigned intextension,
unsigned intcutoff)
885vector < unsigned int > loopLengths(nLoops);
886 unsigned intindex,
max;
887 for(index=0; index<nLoops; ++index)
888loopLengths[index] = loops[index];
890stable_sort(loopLengths.begin(), loopLengths.end());
892 if(percentile < 1.0) {
893index = (
unsigned int)(percentile * (nLoops - 1) + 0.5);
894 max= loopLengths[index] + extension;
896 max= ((
unsigned int)(percentile * loopLengths[nLoops - 1] + 0.5)) + extension;
899 if(cutoff > 0 &&
max> cutoff)
int TracebackAlignment(const Matrix &matrix, unsigned int lastBlock, unsigned int lastBlockPos, unsigned int queryFrom, DP_AlignmentResult *alignment)
int CalculateLocalMatrixGeneric(Matrix &matrix, const DP_BlockInfo *blocks, DP_BlockScoreFunction BlockScore, DP_LoopPenaltyFunction LoopScore, unsigned int queryFrom, unsigned int queryTo)
int TracebackMultipleLocalAlignments(const Matrix &matrix, const DP_BlockInfo *blocks, unsigned int queryFrom, unsigned int queryTo, DP_MultipleAlignmentResults **alignments, unsigned int maxAlignments)
int DP_LocalBlockAlign(const DP_BlockInfo *blocks, DP_BlockScoreFunction BlockScore, unsigned int queryFrom, unsigned int queryTo, DP_AlignmentResult **alignment)
int ValidateFrozenBlockPositions(const DP_BlockInfo *blocks, unsigned int queryFrom, unsigned int queryTo, bool checkGapSum)
int DP_MultipleLocalBlockAlignGeneric(const DP_BlockInfo *blocks, DP_BlockScoreFunction BlockScore, DP_LoopPenaltyFunction LoopScore, unsigned int queryFrom, unsigned int queryTo, DP_MultipleAlignmentResults **alignments, unsigned int maxAlignments)
int CalculateLocalMatrix(Matrix &matrix, const DP_BlockInfo *blocks, DP_BlockScoreFunction BlockScore, unsigned int queryFrom, unsigned int queryTo)
int CalculateGlobalMatrixGeneric(Matrix &matrix, const DP_BlockInfo *blocks, DP_BlockScoreFunction BlockScore, DP_LoopPenaltyFunction LoopScore, unsigned int queryFrom, unsigned int queryTo)
unsigned int DP_CalculateMaxLoopLength(unsigned int nLoops, const unsigned int *loops, double percentile, unsigned int extension, unsigned int cutoff)
void DP_DestroyBlockInfo(DP_BlockInfo *blocks)
int DP_GlobalBlockAlignGeneric(const DP_BlockInfo *blocks, DP_BlockScoreFunction BlockScore, DP_LoopPenaltyFunction LoopScore, unsigned int queryFrom, unsigned int queryTo, DP_AlignmentResult **alignment)
int DP_GlobalBlockAlign(const DP_BlockInfo *blocks, DP_BlockScoreFunction BlockScore, unsigned int queryFrom, unsigned int queryTo, DP_AlignmentResult **alignment)
void DP_DestroyAlignmentResult(DP_AlignmentResult *alignment)
#define WARNING_MESSAGE(s)
int TracebackGlobalAlignment(const Matrix &matrix, const DP_BlockInfo *blocks, unsigned int queryFrom, unsigned int queryTo, DP_AlignmentResult **alignment)
int TracebackLocalAlignment(const Matrix &matrix, const DP_BlockInfo *blocks, unsigned int queryFrom, unsigned int queryTo, DP_AlignmentResult **alignment)
void DP_DestroyMultipleAlignmentResults(DP_MultipleAlignmentResults *alignments)
int DP_LocalBlockAlignGeneric(const DP_BlockInfo *blocks, DP_BlockScoreFunction BlockScore, DP_LoopPenaltyFunction LoopScore, unsigned int queryFrom, unsigned int queryTo, DP_AlignmentResult **alignment)
DP_BlockInfo * DP_CreateBlockInfo(unsigned int nBlocks)
int CalculateGlobalMatrix(Matrix &matrix, const DP_BlockInfo *blocks, DP_BlockScoreFunction BlockScore, unsigned int queryFrom, unsigned int queryTo)
int DP_MultipleLocalBlockAlign(const DP_BlockInfo *blocks, DP_BlockScoreFunction BlockScore, unsigned int queryFrom, unsigned int queryTo, DP_MultipleAlignmentResults **alignments, unsigned int maxAlignments)
unsigned int tracebackResidue
virtual T * operator[](size_t i_)
vector< ResidueRow > Grid
vector< Cell > ResidueRow
Matrix(unsigned int nBlocks, unsigned int nResidues)
Include a standard set of the NCBI C++ Toolkit most basic headers.
#define END_SCOPE(ns)
End the previously defined scope.
#define BEGIN_SCOPE(ns)
Define a new scope.
unsigned int
A callback function used to compare two keys in a database.
if(yy_accept[yy_current_state])
void resize(vector< SMethodDef > &container)
Defines NCBI C++ diagnostic APIs, classes, and macros.
unsigned int * blockPositions
unsigned int * freezeBlocks
unsigned int * blockPositions
unsigned int * blockSizes
DP_AlignmentResult * alignments
#define STRUCT_DP_FOUND_ALIGNMENT
#define STRUCT_DP_PARAMETER_ERROR
#define STRUCT_DP_ALGORITHM_ERROR
unsigned int(* DP_LoopPenaltyFunction)(unsigned int loopNumber, unsigned int loopLength)
static const unsigned int DP_POSITIVE_INFINITY
static const int DP_NEGATIVE_INFINITY
int(* DP_BlockScoreFunction)(unsigned int block, unsigned int queryPos)
static const unsigned int DP_UNFROZEN_BLOCK
#define STRUCT_DP_NO_ALIGNMENT
static DP_BlockInfo * blocks
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4