[Biococoa-dev] testing alignements
Charles PARNOT
charles.parnot at stanford.edu
Thu Mar 17 00:22:03 EST 2005
>I actually started writing the program by copying and pasting the code, but the alignement does not work. I will post the code on a separate message for Phil and you to have a look, because I have no idea how the algorithm works (Koen, you are not alone!).
Here is the code I used for testing purpose, but the alignement does not work, it seems
/*****************STARTING HERE***************/
/*
* TestAlignment.c
*
*/
#define DIAG (idxB - 1) * lenA + (idxA - 1)
#define LEFT idxB * lenA + (idxA - 1)
#define UP (idxB -1) * lenA + idxA
typedef enum {
kNone = 0,
kDiagonal,
kLeft,
kUp
} Pointers;
void alignSequences(char *seqA, char *seqB, int lenA, int lenB)
{
/* set up score matrix */
int *scoreMatrix = (int *)malloc( sizeof( int ) * 128 * 128 );
int match = 1;
int mismatch = -1;
int ii,jj;
for ( ii = 0; ii < 128 ; ii++ )
for ( jj = 0; jj < 128 ; jj++ )
if (ii == jj )
scoreMatrix[ii+128*jj] = match;
else
scoreMatrix[ii+128*jj] = mismatch;
int gapCosts = -1;
int *backtracking = (int *)malloc( sizeof( int ) * lenA * lenB );
int *dynMatrix = (int *)malloc( sizeof( int ) * lenA * lenB );
unsigned int idxA;
unsigned int idxB;
dynMatrix[ 0 ] = scoreMatrix[seqA[0]*128+seqB[0]];
backtracking[ 0 ] = kNone;
for ( idxA = 1; idxA < lenA; idxA++ ) {
backtracking[ idxA ] = kLeft;
dynMatrix[ idxA ] = idxA * gapCosts;
}
for ( idxB = 1; idxB < lenB; idxB++ ) {
backtracking[ idxB * lenA ] = kUp;
dynMatrix[ idxB * lenA ] = idxB * gapCosts;
}
for ( idxA = 1; idxA < lenA; idxA++ ) {
for ( idxB = 1; idxB < lenB; idxB++ ) {
unsigned int currPos = idxB * lenA + idxA;
int substitutionScore = scoreMatrix[seqA[idxA]*128+seqB[idxB]];
int diagScore = dynMatrix[ DIAG ] + substitutionScore;
int rightScore = dynMatrix[ LEFT ] + gapCosts;
int downScore = dynMatrix[ UP ] + gapCosts;
if ( diagScore >= rightScore ) {
if ( diagScore > downScore ) {
backtracking[ currPos ] = kDiagonal;
dynMatrix[ currPos ] = diagScore;
}
else {
backtracking[ currPos ] = kUp;
dynMatrix[ currPos ] = downScore;
}
}
else {
if ( rightScore > downScore ) {
backtracking[ currPos ] = kLeft;
dynMatrix[ currPos ] = rightScore;
}
else {
backtracking[ currPos ] = kUp;
dynMatrix[ currPos ] = downScore;
}
}
}
}
int i = lenA;
int j = lenB;
int k = 0;
char *a = ( char * ) malloc( (lenA + lenB) * sizeof(char));
char *b = ( char * ) malloc( (lenA + lenB) * sizeof(char));
while ( 1 ) {
// escape when origin is reached
if(backtracking[i * lenA + j ] == kNone) break;
switch(backtracking[i * lenA + j ]){
case kDiagonal :
a[k] = seqA[i - 1];
b[k] = seqB[j - 1];
i--;
j--;
k++;
break;
case kLeft :
a[k] = seqA[i - 1];
b[k] = '-';
i--;
k++;
break;
case kUp :
a[k] = '-';
b[k] = seqB[j - 1];
j--;
k++;
break;
}
}
for(i=k-1;i>=0;i--) printf("%c",a[i]);
printf("\n");
for(j=k-1;j>=0;j--) printf("%c",b[j]);
printf("\n");
}
void alignment1()
{
char *seqA = "ATGTAGTCTGATGATGAGATGACGT";
char *seqB = "ATGTCAGTCTGATGATGAGATGACGAT";
alignSequences(seqA,seqB,25,27);
}
int main (int argc, const char * argv[]) {
while(1<2) {
alignment1();
}
return 0;
}
/*****************ENDING HERE***************/
--
Help science go fast forward:
http://cmgm.stanford.edu/~cparnot/xgrid-stanford/
Charles Parnot
charles.parnot at stanford.edu
Room B157 in Beckman Center
279, Campus Drive
Stanford University
Stanford, CA 94305 (USA)
Tel +1 650 725 7754
Fax +1 650 725 8021
More information about the Biococoa-dev
mailing list