Exemple #1
0
void print_lav_job_header
   (FILE*		f,
	char*		_programName,
	char*		_name1,
	char*		_name2,
	char*		_args,
	scoreset*	scoring,
	sthresh*	hspThreshold,
	sthresh*	gappedThreshold,
	u8			dynamicMasking)
	{
	char*		programName = _programName;
	char*		name1       = _name1;
	char*		name2       = _name2;
	char*		args        = _args;

	if (programName == NULL) programName = "(no name)";
	if (name1       == NULL) name1       = "(no name)";
	if (name2       == NULL) name2       = "(no name)";
	if (args        == NULL) args        = "";

	fprintf            (f, "#:lav\n");
	fprintf            (f, "d {\n");
	fprintf            (f, "  \"%s %s %s %s\n", programName, name1, name2, args);
	print_score_matrix (f, scoring, false);
	fprintf            (f, "  O = " scoreFmtSimple
	                       ", E = " scoreFmtSimple
	                       ", K = %s"
	                       ", L = %s"
	                       ", M = %d\"\n",
	                       scoring->gapOpen, scoring->gapExtend,
	                       score_thresh_to_string (hspThreshold),
	                       score_thresh_to_string (gappedThreshold),
	                       dynamicMasking);
	fprintf            (f, "}\n");
	}
int  main(int argc,char *argv[]) {
    char  alphabet[21] = "acdefghiklmnpqrstvwy";
    char *seq1;
    char *seq2;
    if (argc < 3) {
        printf("You need 2 arguments\n");
        return 0 ;
    } else {
        seq1 = argv[1] ;
        seq2 = argv[2] ;
    }

    printf("seq1 = %s\n", seq1);
    printf("seq2 = %s\n", seq2);

    int seq1_length = 0 ;
    int seq2_length = 0;
    while (seq1[seq1_length] != '\0') {
        seq1_length++;
    }
    printf("seq1_length = %d\n", seq1_length );
    while (seq2[seq2_length] != '\0') {
        seq2_length++;
    }
    printf("seq2_length = %d\n", seq2_length );

//  char *seq1 = "ppeaiccc";
//  char *seq2 = "ggeaicgg";

    int seq1_arr[seq1_length], seq2_arr[seq2_length]  ;
    int i, j;
    int score_matrix[seq2_length+1][seq1_length+1] ;
    int direction_matrix[seq2_length+1][seq1_length+1] ;
    int max_i=-1, max_j=-1, max_score=-1 ;
    int diagonal_score, left_score, up_score  ;
    int letter1, letter2;

    /* Convert residue characters to indices */
    printf("STRLEN = %d\n", STRLEN);
    printf("d_loc = %d\n", STRLEN);
    printf("seq1 = %s\n", seq1);
    printf("seq2 = %s\n", seq2);
    for (i=0; i < seq1_length; i++)
        for (j=0; j<20; j++)
            if (seq1[i] == alphabet[j])
                seq1_arr[i] = j;

    for (i=0; i < seq2_length; i++)
        for (j=0; j<20; j++)
            if (seq2[i] == alphabet[j])
                seq2_arr[i] = j;

    for (j=0; j <= seq1_length; j++) {
        score_matrix[0][j] = 0;
        direction_matrix[0][j]   = DIRECTION_NONE;
    }
    printf("rows = seq1_length  = %d\n", seq1_length);
    for (i=0; i <= seq2_length; i++ ) {
        score_matrix[i][0] = 0;
        direction_matrix[i][0]   = DIRECTION_NONE;
    }
    printf("cols = seq2_length  = %d\n", seq2_length);

    for (i=1; i <= seq2_length; i++) {
        for (j=1; j <= seq1_length; j++) {

            diagonal_score=0;
            left_score=0;
            up_score=0;
            letter1 = seq1_arr[i-1];
            letter2 = seq2_arr[j-1];
            // calculate match score

            if (letter1 == letter2)  {
                diagonal_score = score_matrix[i-1][j-1] + MATCH;
            }
            else {
                diagonal_score = score_matrix[i-1][j-1] + MISMATCH;
            }

            // calculate gap scores
            up_score   = score_matrix[i-1][j] + GAP;
            left_score = score_matrix[i][j-1] + GAP;

//       if (i==1 && j==1) {
//          printf("[%d,%d] diagonal_score: %d, up_score: %d, left_score: %d, letter1=%d, letter2=%d \n", i, j, diagonal_score, up_score, left_score, letter1, letter2 );
//            printf("%d [%d,%d] diagonal_score: %d, up_score: %d, left_score: %d,letter1=%d, letter2=%d \n", ARRAY_OFFSET(i,j,ncols), i, j, diagonal_score,
//                up_score, left_score, letter1, letter2 );
//      }
            if ((diagonal_score <= 0) && (up_score <= 0) && (left_score <= 0)) {
                score_matrix[i][j]   = 0;
//            printf("[%d,%d] diagonal_score: %d, up_score: %d, left_score: %d, score_matrix:%d \n", i, j, diagonal_score, up_score, left_score, score_matrix[i][j]);
                direction_matrix[i][j]   = DIRECTION_NONE;
                continue;
            }

            // choose best score
            if (diagonal_score >= up_score) {
                if (diagonal_score >= left_score) {
                    score_matrix[i][j]   = diagonal_score;
                    direction_matrix[i][j]   = DIRECTION_DIAGONAL;
                    //$matrix[$i][$j]{pointer} = "diagonal";
                }
                else {
                    score_matrix[i][j]   = left_score;
                    direction_matrix[i][j]   = DIRECTION_LEFT;
                    //$matrix[$i][$j]{pointer} = "left";
                }
            } else {
                if (up_score >= left_score) {
                    score_matrix[i][j]   = up_score;
                    direction_matrix[i][j]   = DIRECTION_UP;
                    //$matrix[$i][$j]{pointer} = "up";
                }
                else {
                    score_matrix[i][j]   = left_score;
                    direction_matrix[i][j]   = DIRECTION_LEFT;
                    //$matrix[$i][$j]{pointer} = "left";
                }
            }

//       printf("[%d,%d] diagonal_score: %d, up_score: %d, left_score: %d, score_matrix:%d \n", i, j, diagonal_score, up_score, left_score, score_matrix[i][j]);

            // set maximum score
            if (score_matrix[i][j] > max_score) {
                max_i     = i;
                max_j     = j;
                max_score = score_matrix[i][j];
            }
        }
    }


    printf("max_i = %d\n", max_i);
    printf("max_j = %d\n", max_j);
    printf("max_score = %d\n", max_score);

//  for (i=0; i <= seq2_length; i++) {
//    for (j=0; j <= seq1_length; j++) {
////        printf("score_matrix[%d][%d]  %d\n", i,j, score_matrix[i][j] );
//    }
//  }


    print_score_matrix(&score_matrix[0][0],  seq2_length+1, seq1_length+1  );
    print_score_matrix(&direction_matrix[0][0],  seq2_length+1, seq1_length+1  );
    printf("finished printing score matrix= %d\n", max_score);
//  trace-back

//char align1[SEQ1_LEN] = "ppeaiccc";
//char align2[SEQ1_LEN] = "ppeaiccc";
    int align1_arr[seq1_length], align2_arr[seq2_length]  ;

//align1 = "";
//align2 = "";

    j = max_j;
    i = max_i;

    int align1_index=0;
    int align2_index=0;

    while (1) {
        if (direction_matrix[i][j] == DIRECTION_NONE)
            break ;

        if (direction_matrix[i][j] ==  DIRECTION_DIAGONAL ) {
            align1_arr[align1_index] = seq1_arr[j-1]  ;
            align2_arr[align2_index] = seq2_arr[i-1]  ;
//        $align1 .= substr($seq1, $j-1, 1);
//        $align2 .= substr($seq2, $i-1, 1);
            i--;
            j--;
        }
        else if (direction_matrix[i][j] ==  DIRECTION_LEFT  ) {
            align1_arr[align1_index] = seq1_arr[j-1]  ;
            align2_arr[align2_index] = -1 ;
//        $align1 .= substr($seq1, $j-1, 1);
//        $align2 .= "-";
            j--;
        }
        else if (direction_matrix[i][j] ==  DIRECTION_UP ) {
            align1_arr[align1_index] = -1;
            align2_arr[align2_index] = seq2_arr[i-1]  ;
//        align1 .= "-";
//        align2 .= substr($seq2, $i-1, 1);
            i--;
        }
        align1_index++;
        align2_index++;

    }
    printf("align1_index = %d, align2_index = %d\n", align1_index, align2_index);
    char *align1 ;
    char *align2;
    align1 = (char *) calloc(seq1_length,sizeof(char) )  ;
    align2 = (char *) calloc(seq2_length,sizeof(char) )  ;
    for(i=0; i<align1_index; i++) {
        align1[align1_index-i-1] =  alphabet[align1_arr[i]] ;
    }

    printf("align1 = %s\n", align1);
    printf("align2 = %s\n", align1);


    /*
    $align1 = reverse $align1;
    $align2 = reverse $align2;
    print "$align1\n";
    print "$align2\n"

    */
    return 1;
}