readInput.c
上传用户:szpanda
上传日期:2016-03-09
资源大小:9k
文件大小:7k
源码类别:

DNA

开发平台:

C/C++

  1. /* File: readInput.c                       */ 
  2. /* Author:Qichan Ma, Student No.:250494898 */
  3. #include "globals.h"
  4. #include "readInput.h"
  5. /* read the residues, substitution score matrix & gap penalty from the input file */
  6. void readScore() {
  7.     FILE *in;
  8. char infile[20];
  9. printf("Please input the name of the file that includes the residues, substitution score matrix & gap penalty (e.g.: blosum62.txt): ");
  10. scanf("%s",infile);
  11. if((in = fopen(infile, "r")) == NULL)
  12. {
  13. printf("cannot open the filen");
  14. exit(0);
  15. }
  16.     int i;
  17.     /*  initialize the index array of letters */
  18.     for(i=0;i<26;i++)
  19.         alphaIndex[i] = -1;
  20.     residuesLen=0;  /* the number of the residues (say for protein, it's 20; for DNA/RNA, it's 4)*/
  21.     char ch;    
  22.     ch=getc(in);
  23.     if(ch == EOF) {
  24.         fprintf(stderr, "the score file is not rightn");
  25.         fclose(in);
  26.         exit(1);
  27.     }
  28.     while(ch!='r' && ch!='n') {
  29.         ch = getc(in);
  30.         if(ch == EOF) {
  31.             fprintf(stderr, "the score file is not rightn");
  32.             fclose(in);
  33.             exit(1);
  34.         }
  35.     }
  36.     while(!isalnum(ch)) {
  37.         ch = getc(in);
  38.         if(ch == EOF) {
  39.             fprintf(stderr, "the residues missedn");
  40.             fclose(in);
  41.             exit(1);
  42.         }
  43.     }
  44.     /* read the residues */
  45.     while(ch!='r' && ch!='n') {
  46.         if(isalnum(ch))
  47.             alphaIndex[ch-65]=residuesLen++;
  48.         ch = getc(in);
  49.         if(ch == EOF) {
  50.             fprintf(stderr, "the residues missedn");
  51.             fclose(in);
  52.             exit(1);
  53.         }        
  54.     }    
  55.     
  56.     /* the substitution score matrix */
  57.     score = (int **)malloc(residuesLen*sizeof(int *));
  58. for (i=0; i<residuesLen; i++)
  59.         score[i]=(int *)malloc(residuesLen*sizeof(int));
  60.   
  61.     int j, temp;
  62.     /* read the substitution score matrix */
  63.     for(i=0; i<residuesLen; i++) {
  64.         ch = getc(in);
  65.         if(ch == EOF) {
  66.             fprintf(stderr, "the score file is not rightn");
  67.             fclose(in);
  68.             exit(1);
  69.         } 
  70.         while(!isalpha(ch)) {
  71.             ch = getc(in);
  72.             if(ch == EOF) {
  73.                 fprintf(stderr, "the score file is not rightn");
  74.                 fclose(in);
  75.                 exit(1);
  76.             } 
  77.         }
  78.         for(j=0; j<=i; j++) {
  79.             if(fscanf(in, "%d", &temp) == EOF) {
  80.                 fprintf(stderr, "substitution score matrix is not rightn");
  81.     fclose(in);
  82.     exit(1);
  83. }
  84.     score[i][j]=temp;
  85.         }
  86.     }
  87.     for(i=0; i<residuesLen; i++)
  88.         for(j=i+1; j<residuesLen; j++)
  89.             score[i][j] = score[j][i];
  90.     ch = getc(in);
  91.     while(!isalpha(ch)) {
  92.         ch = getc(in);
  93.         if(ch == EOF) {
  94.             fprintf(stderr, "gap_initiation score missedn");
  95.             fclose(in);
  96.             exit(1);
  97.         }     
  98.     }
  99.     while(!isspace(ch)) {
  100.         ch = getc(in);
  101.         if(ch == EOF) {
  102.             fprintf(stderr, "gap_initiation score missedn");
  103.             fclose(in);
  104.             exit(1);
  105.         }     
  106.     }
  107.     /* read gap penalty */
  108.     if(fscanf(in, "%d", &temp) == EOF) {
  109.         fprintf(stderr, "gap_initiation score missedn");
  110.         fclose(in);
  111.         exit(1);
  112.     }
  113.     gap_ini = temp;  /* the gap penalty */
  114.  
  115.     ch = getc(in);
  116.     while(!isalpha(ch)) {
  117.         ch = getc(in);
  118.         if(ch == EOF) {
  119.             fprintf(stderr, "gap_extension score missedn");
  120.             fclose(in);
  121.             exit(1);
  122.         }     
  123.     }
  124.     while(!isspace(ch)) {
  125.         ch = getc(in);
  126.         if(ch == EOF) {
  127.             fprintf(stderr, "gap_extension score missedn");
  128.             fclose(in);
  129.             exit(1);
  130.         }     
  131.     }
  132.     /* read gap penalty */
  133.     if(fscanf(in, "%d", &temp) == EOF) {
  134.         fprintf(stderr, "gap_extension score missedn");
  135.         fclose(in);
  136.         exit(1);
  137.     }
  138.     gap_ext = temp;  /* the gap penalty */
  139. fclose(in); 
  140. }
  141. /* get the number of sequences */
  142. int getNumOfSeq(char *infile) {
  143.     FILE *in;
  144. if((in = fopen(infile, "r")) == NULL)
  145. {
  146. printf("cannot open the filen");
  147. exit(0);
  148. }    
  149.     
  150.     int lineNo = 0; /* the number of lines of the sequences file */
  151.     char temp[1000];
  152.     while(fgets(temp, 1000, in) != NULL)
  153.        lineNo++;   
  154.   /* the number of lines of the sequences file must be multiple of 3 */
  155.   float tmp = lineNo;
  156.   if(tmp/3.0 != (int)(tmp/3)) {
  157.         fprintf(stderr, "the sequences file is not rightn");
  158.         fclose(in);
  159.         exit(1);
  160.     }
  161.     
  162.   fclose(in);
  163.     return lineNo/3;  
  164. }
  165. /* read the sequences from the input file */
  166. void readSeq() {
  167.     FILE *in;
  168. char infile[20];
  169. printf("Please input the name of the sequences file (e.g.: protein.txt): ");
  170. scanf("%s",infile);
  171. if((in = fopen(infile, "r")) == NULL)
  172. {
  173. printf("cannot open the infilen");
  174. exit(0);
  175. }
  176.     /* the number of sequences */
  177.     numOfSeq = getNumOfSeq(infile);
  178.     /* the array of name of sequences */
  179.     seqName = (char **)malloc(numOfSeq*sizeof(char *));
  180.     /* the array of sequences */
  181.     seq = (char **)malloc(numOfSeq*sizeof(char *));
  182.     /* the length of the name of sequences */
  183.     int seqNameLen; 
  184.     /* the array of sequences' length */
  185.     seqLen = (int *)malloc(numOfSeq*sizeof(int));
  186.     char temp[1000];
  187.     int i=0, j=0, k=0;
  188.     /* read the sequences and the names of sequences from the input file */    
  189.     while(fgets(temp, 1000, in) != NULL) {
  190.         /* read the names of sequences */
  191.         if(fgets(temp, 1000, in) == NULL) {
  192.             fprintf(stderr, "the sequences file is not rightn");
  193.             fclose(in);
  194.             exit(1);
  195.         }
  196.         seqNameLen = strlen(temp);
  197.         temp[seqNameLen-1]='';
  198.         seqName[i]=(char *)malloc(seqNameLen*sizeof(char));
  199.         strcpy(seqName[i],temp);
  200.         
  201.         /* read the sequences */         
  202.         if(fgets(temp, 1000, in) == NULL) {
  203.             fprintf(stderr, "the sequences file is not rightn");
  204.             fclose(in);
  205.             exit(1);
  206.         }
  207.         seqLen[i] = 0;
  208.         for(j=0; !isalpha(temp[j]);j++);
  209.         for( ;isalpha(temp[j]);j++)
  210.             seqLen[i]++;
  211.         seq[i]=(char *)malloc((seqLen[i]+1)*sizeof(char));
  212.         for(j=0; !isalpha(temp[j]);j++);
  213.         for(k=0; isalpha(temp[j]);j++,k++) {
  214.             seq[i][k] = temp[j];
  215.             /* if the sequences contains illegal letter */
  216.             if(alphaIndex[seq[i][k]-65] == -1) {
  217.                 fprintf(stderr, "the sequences contain illegal lettern");
  218.                 fclose(in);
  219.                 exit(1);
  220.             }
  221.         }
  222.         seq[i][seqLen[i]]=''; 
  223.         i++; 
  224.     }   
  225. fclose(in); 
  226. }