📄 workacc.c
字号:
/* copyright (c) 1996, 1997, 1998, 1999 William R. Pearson and the U. of Virginia *//* $Name: fa35_03_06 $ - $Id: workacc.c,v 1.20 2007/06/29 17:11:42 wrp Exp $ *//* Concurrent read version */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "defs.h"#include "param.h"#define XTERNAL#include "uascii.h"#include "upam.h"#undef XTERNALchar err_str[128];/* Initialization - set up defaults - assume protein sequence */void w_init (){ pascii=aascii;}#ifndef MPI_SRC/* allocate memory for pam matrix - identical to version in initfa/sw.c */alloc_pam (int d1, int d2, struct pstruct *ppst){ int i, *d2p; char err_str[128]; if ((ppst->pam2[0] = (int **) malloc (d1 * sizeof (int *))) == NULL) { sprintf(err_str,"Cannot allocate 2D pam matrix: %d",d1); return -1; } if ((ppst->pam2[1] = (int **) malloc (d1 * sizeof (int *))) == NULL) { sprintf(err_str,"Cannot allocate 2D pam matrix: %d",d1); return -1; } if ((d2p = pam12 = (int *) malloc (d1 * d2 * sizeof (int))) == NULL) { sprintf(err_str,"Cannot allocate 2D pam matrix: %d",d1); return -1; } for (i = 0; i < d1; i++, d2p += d2) ppst->pam2[0][i] = d2p; if ((d2p=pam12x= (int *) malloc (d1 * d2 * sizeof (int))) == NULL) { sprintf(err_str,"Cannot allocate 2d pam matrix: %d",d2); return -1; } for (i = 0; i < d1; i++, d2p += d2) ppst->pam2[1][i] = d2p; return 1;}int **alloc_pam2p(int len, int nsq) { int i; int **pam2p; if ((pam2p = (int **)calloc(len,sizeof(int *)))==NULL) { fprintf(stderr," Cannot allocate pam2p: %d\n",len); return NULL; } if((pam2p[0] = (int *)calloc((nsq+1)*len,sizeof(int)))==NULL) { fprintf(stderr, "Cannot allocate pam2p[0]: %d\n", (nsq+1)*len); free(pam2p); return NULL; } for (i=1; i<len; i++) { pam2p[i] = pam2p[0] + (i*(nsq+1)); } return pam2p;}void free_pam2p(int **pam2p) { if (pam2p) { free(pam2p[0]); free(pam2p); }}voidaancpy(char *to, char *from, int count, struct pstruct *ppst){ char *tp, *sq; int nsq; tp=to; if (ppst->ext_sq_set) { nsq = ppst->nsqx; sq = ppst->sqx; } else { nsq = ppst->nsq; sq = ppst->sq; } while (count-- && *from) { if (*from <= nsq) *tp++ = sq[*(from++)]; else *tp++ = *from++; } *tp='\0';}#endif/* copies from from to to shuffling */voidshuffle(unsigned char *from, unsigned char *to, int n){ int i,j; unsigned char tmp; if (from != to) memcpy((void *)to,(void *)from,(size_t)n); for (i=n; i>0; i--) { j = nrand(i); tmp = to[j]; to[j] = to[i-1]; to[i-1] = tmp; } to[n] = 0;}/* this shuffle is for FASTS *//* convert ',' -> '\0', shuffle each of the substrings */qshuffle(unsigned char *aa0, int n0, int nm0){ unsigned char **aa0start, *aap, tmp; int i,j,k, ns; if ((aa0start=(unsigned char **)calloc(nm0+1, sizeof(unsigned char *)))==NULL) { fprintf(stderr,"cannot calloc for qshuffle %d\n",nm0); exit(1); } aa0start[0]=aa0; for (k=1,i=0; i<n0; i++) { if (aa0[i]==EOSEQ || aa0[i]==ESS) { aa0[i]='\0'; aa0start[k++] = &aa0[i+1]; } } /* aa0start has the beginning of each substring */ for (k=0; k<nm0; k++) { aap=aa0start[k]; ns = strlen((char *)aap); for (i=ns; i>1; i--) { j = nrand(i); tmp = aap[j]; aap[j] = aap[i-1]; aap[i-1] = tmp; } aap[ns] = 0; } for (k=1; k<nm0; k++) {/* aap = aa0start[k]; while (*aap) fputc(ppst->sq[*aap++],stderr); fputc('\n',stderr);*/ aa0start[k][-1]=ESS; } free(aa0start);}/* copies from from to from shuffling */voidwshuffle(unsigned char *from, unsigned char *to, int n, int wsiz, int *ieven){ int i,j, k, mm; unsigned char tmp, *top; memcpy((void *)to,(void *)from,n); mm = n%wsiz; if (*ieven) { for (k=0; k<(n-wsiz); k += wsiz) { top = &to[k]; for (i=wsiz; i>0; i--) { j = nrand(i); tmp = top[j]; top[j] = top[i-1]; top[i-1] = tmp; } } top = &to[n-mm]; for (i=mm; i>0; i--) { j = nrand(i); tmp = top[j]; top[j] = top[i-1]; top[i-1] = tmp; } *ieven = 0; } else { for (k=n; k>=wsiz; k -= wsiz) { top = &to[k-wsiz]; for (i=wsiz; i>0; i--) { j = nrand(i); tmp = top[j]; top[j] = top[i-1]; top[i-1] = tmp; } } top = &to[0]; for (i=mm; i>0; i--) { j = nrand(i); tmp = top[j]; top[j] = top[i-1]; top[i-1] = tmp; } *ieven = 1; } to[n] = 0;}void initseq(char **seqc0, char **seqc0a, char **seqc1, char **seqca, int seqsiz) /* initialize arrays */{ *seqc0=(char *)calloc((size_t)(seqsiz+1)*4,sizeof(char)); *seqc0a= *seqc0+seqsiz+1; *seqc1= *seqc0a+seqsiz+1; *seqca= *seqc1+seqsiz+1; if (*seqc0==NULL) {fprintf(stderr,"cannot allocate consensus arrays %d\n",seqsiz); exit(1);}}void freeseq(char **seqc0, char **seqc1, char **seqca){ free(*seqc0);}#define ESS 49voidrevcomp(unsigned char *seq, int n, int *c_nt){ unsigned char tmp; int i, ni; for (i=0, ni = n-1; i< n/2; i++,ni--) { tmp = c_nt[seq[i]]; seq[i] = c_nt[seq[ni]]; seq[ni] = tmp; } if ((n%2)==1) { i = n/2; seq[i] = c_nt[seq[i]]; } seq[n]=0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -