/* A software package to get pairwise alignments and generate projected regions */ #include #include #define max(x,y) ((x) >= (y) ? (x) : (y)) #define min(x,y) ((x) <= (y) ? (x) : (y)) #define NUMBER 100 /* maximum sequence piece number */ #define TRUE 1 #define FALSE 0 #define MAXBLOCKS 300 struct seq_struct { char *name; /* sequence name */ int from; /* start position */ int to; /* end position */ int len; /* length of the sequence */ int bfrom; /* projected base start */ int bto; /* projected base end */ int block[MAXBLOCKS][4];/* aligned blocks */ int bn; /* block number */ }; struct seq_struct seq[NUMBER+1]; int seq_no; int Width, *From, *To; char **Sname; extern int *Seq_Script[]; /* aligned sequence script */ extern int Entry_No[]; /* Number of script entries */ /* get_all - get all alignments */ int get_all(char *Rname, int width, char *ISname[], int *IFrom, int *ITo) { FILE *fp, *lav_fp, *ckopen(); char fname[30]; char *sname1, *sname2, *get_seqname(); int from1, to1, from2, to2, i, bn; Width = width; From = IFrom; To = ITo; Sname = ISname; fp = ckopen(Rname,"r"); seq_no = 0; while (fscanf(fp,"%s",&fname) != EOF) { lav_fp = ckopen(fname,"r"); lav_read_init(lav_fp); sname1 = get_seqname(&from1, &to1, 0); sname2 = get_seqname(&from2, &to2, 0);; while (get_alignment(lav_fp)) { bn = seq[seq_no].bn; seq[seq_no].name = sname2; seq[seq_no].from = seq[seq_no].from + from2 - 1; seq[seq_no].to = seq[seq_no].to + from2 - 1; seq[seq_no].len = seq[seq_no].block[bn-1][3]; /* printf("*******************************\n"); printf("seq_no: %d\n",seq_no); printf("name: %s\n",seq[seq_no].name); printf("from: %d\n",seq[seq_no].from); printf("to: %d\n",seq[seq_no].to); printf("len: %d\n",seq[seq_no].len); printf("bfrom: %d\n",seq[seq_no].bfrom); printf("bto: %d\n",seq[seq_no].bto); printf("bn: %d\n",bn); for (i=0; i rmost) rmost = P_index1[seq[sn].bto]; for (i=0; i0 && seq[sn].block[i][0] > seq[sn].block[i-1][2]+1) { /* horizontal line */ k = P_index2[seq[sn].block[i-1][3]]; for (j=seq[sn].block[i-1][2]+1; j0 && seq[sn].block[i][1] > seq[sn].block[i-1][3]+1) { /* vertical line */ k = P_index2[seq[sn].block[i][1]]; j1 = P_index1[seq[sn].block[i-1][2]]; /* update the upper bound */ RB[j1] = max(RB[j1], k); } /* print out diagonal lines */ for (j=seq[sn].block[i][0], i1=seq[sn].block[i][1]; j<=seq[sn].block[i][2]; ++j, ++i1) { k = P_index2[i1]; j1 = P_index1[j]; LB[j1] = max(LB[j1], k); RB[j1] = min(RB[j1], k); LDEF[j1] = RDEF[j1] = 1; } } } else { sn1 = get_sn(L1+m1); sn2 = get_sn(L2+m2); /* get the alignment between 1 and L2+m2 */ /* transfer the alignment into boundary lines */ bfrom = seq[sn2].bfrom; bto = seq[sn2].bto; j = bto - bfrom + 1; LL = (int *) ckalloc(j*sizeof(int)) - bfrom; RR = (int *) ckalloc(j*sizeof(int)) - bfrom; for (i=0; i0 && seq[sn2].block[i][0] > seq[sn2].block[i-1][2]+1) { /* horizontal line */ k = P_index2[seq[sn2].block[i-1][3]]; for (j=seq[sn2].block[i-1][2]+1; j0 && seq[sn2].block[i][1] > seq[sn2].block[i-1][3]+1) { /* vertical line */ k = P_index2[seq[sn2].block[i][1]]; /* update the upper bound */ j = seq[sn2].block[i-1][2]; RR[j] = k; } /* print out diagonal lines */ for (j=seq[sn2].block[i][0], i1=seq[sn2].block[i][1]; j<=seq[sn2].block[i][2]; ++j, ++i1) { k = P_index2[i1]; LL[j] = k; RR[j] = k; } } /* get the alignment between L1+m1 and 1 */ /* transfer the alignment into boundary lines */ /* define projected region */ for (i=0; i0 && seq[sn1].block[i][1] > seq[sn1].block[i-1][3]+1) { /* horizontal line */ k = seq[sn1].block[i-1][2]; for (j=seq[sn1].block[i-1][3]+1; j=bfrom && k<=bto) { LB[j1] = max(LB[j1],LL[k]); RB[j1] = min(RB[j1],RR[k]); LDEF[j1] = RDEF[j1] = 1; } else if (k0 && seq[sn1].block[i][0] > seq[sn1].block[i-1][2]+1) { /* vertical line */ k = seq[sn1].block[i][0]; j1 = P_index1[seq[sn1].block[i-1][3]]; /* update the upper bound */ if (k>=bfrom && k<=bto) { RB[j1] = RR[k]; RDEF[j1] = 1; } } /* print out diagonal lines */ for (j=seq[sn1].block[i][1], k=seq[sn1].block[i][0]; j<=seq[sn1].block[i][3]; ++j, ++k) { j1 = P_index1[j]; if (k>=bfrom && k<=bto) { LB[j1] = max(LB[j1],LL[k]); RB[j1] = min(RB[j1],RR[k]); LDEF[j1] = RDEF[j1] = 1; } else if (k=0; --i) if (RDEF[i]) pr = RB[i]; else RB[i] = pr; for (i=N1-1; i>0; --i) LB[i] = min(LB[i],LB[i+1]); for (i=1; i RB[i]) { t = (LB[i] + RB[i])/2; LB[i] = t; RB[i] = t; } lmost = max(0, lmost-Width); rmost = min(N1, rmost+Width); /* fprintf(stderr, "lmost=%d, rmost=%d\n",lmost,rmost); */ if (lmost > 0) pl = LB[lmost-1]; else pl = 0; if (rmost < N1) pr = RB[rmost+1]; else pr = N2; for (i=rmost; i>=lmost; --i) { ii = max(0,i-Width); if (LB[i]-Width > LB[ii]) LB[i] = max(pl, LB[ii]); else LB[i] = max(pl,LB[i]-Width); } for (i=lmost; i<=rmost; ++i) { ii = min(N1,i+Width); if (RB[i]+Width < RB[ii]) RB[i] = min(pr, RB[ii]); else RB[i] = min(pr,RB[i]+Width); } /* for (i=0; i<=N1; ++i) printf("i=%d, %d %d\n",i,LB[i],RB[i]); fflush(stdout); */ for (i=0; i RB[i]) { printf("i-1=%d, %d %d\n",i-1,LB[i-1],RB[i-1]); printf("i=%d, %d %d\n",i,LB[i],RB[i]); exit(1); } } if (LB[0] != 0) { printf("i=%d, %d %d\n",0,LB[0],RB[0]); exit(1); } if (RB[N1] != N2) { printf("i=%d, %d %d\n",N1,LB[N1],RB[N1]); printf("N2=%d\n",N2); exit(1); } */ free(P_index1); free(P_index2); free(LDEF); free(RDEF); if (lmost > rmost) { lmost = 0; rmost = N1; } *lp = lmost; *rp = rmost; } /* Padded_index - compute the new indexes in the alignment */ int Padded_index(int m, int *P_index) { int ci, i, j, k, c, *sp; P_index[0] = 0; ci = 1; j = 1; sp = Seq_Script[m]; for (k=0; k 0) { /* non-gap */ for (i=ci; i