/*-----------------------------------------------------------
/
/   rr_ver.c 
/
/   Program checks the RR format for CASP3 submissions
/   (Residue-Residue separation distance prediction)
/
/   Copyright by Adam Zemla (06/05/1998)
/   Modified by Zinoviy Dmytriv (2007)
/
/------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXRES           10000
#define MAXRRP           32000
#define MAXCHN               3

char *letter="ARNDCQEGHILKMFPSTWYV-";

typedef struct {
  char   aa[MAXRES];
  int    n_aa;
  float  confidence[MAXRRP];
  char   chi[MAXRRP];
  int    i[MAXRRP];
  char   chj[MAXRRP];
  int    j[MAXRRP];
  float  d1[MAXRRP];
  float  d2[MAXRRP];
  int    n_rrp;
  int    n_confidence;
} data_rrp;

typedef struct {
  char      name_chain;
  char      name[10];
  int       n_aa;
  int       aa_num[MAXRES];
  char      aa[MAXRES];
} t_chain;

typedef struct {
  char     target_name[10];
  t_chain  target[MAXCHN];
  int      target_n_chains;
  int      target_n_aa;
  int      model;
  int      end;
  int      n_method;
  int      errors;
  data_rrp rrp;
} rr_f;

int check_aa(char, char*, int);
void read_rr_f(rr_f *, char*);
void read_data_rrp(rr_f *, FILE*);
void check_rr_f(rr_f *);
void clean_rr_f(rr_f *);
void read_seq(char*, rr_f *);
void escape(int);

main(int argc, char *argv[]) 
{
  char rr_file[120];
  rr_f rr_data;
  
  if(argc<2){
    printf(" Usage: rr_ver <rr_file>\n");
    exit(0);
  }
  
  strcpy(rr_file,argv[1]);

  clean_rr_f(&rr_data);

  printf("# Reading prediction format RR\n\n");
  read_rr_f(&rr_data,rr_file);
  printf("\n# Reading prediction format RR             (DONE)\n");

  check_rr_f(&rr_data);

  if(rr_data.errors==0) {
    printf("\n# MODEL index: %d \n",rr_data.model);
    printf("\n# Total number of residues in model:             %5d ",rr_data.rrp.n_aa);
    printf("\n# Total number of RR contacts in model:          %5d ",rr_data.rrp.n_rrp);
    printf("\n# Number of RR contacts with nonzero confidence: %5d ",rr_data.rrp.n_confidence);
    printf("\n# Number of METHOD records:                      %5d \n",rr_data.n_method);
    printf("\n# No errors.\n\n");
  }
  else {
    printf("\n# Number of errors = %d.\n\n",rr_data.errors);
  }
}

void escape(int error)
{
  if(error>25) {
    printf("\n# Too many ERRORS ...");
    printf("\n#    Please check format for RR predictions.\n");
    exit(0);
  }
  return;
}

/*-----------------------------------------------------------
/
/   clean rr_f structure
/
/------------------------------------------------------------*/
void clean_rr_f(rr_f *rr_data)
{
  int i,j;

  strcpy(rr_data->target_name,"   ");
  rr_data->target_n_chains=0;
  rr_data->target_n_aa=0;
  rr_data->model=0;
  rr_data->end=0;
  rr_data->n_method=0;
  rr_data->errors=0;
  rr_data->rrp.n_rrp=0;
  rr_data->rrp.n_confidence=0;
  rr_data->rrp.n_aa=0;
  for(j=0;j<MAXRES;j++) {
    rr_data->rrp.aa[j]=' ';
  }
  for(i=0;i<MAXCHN;i++) {
    strcpy(rr_data->target[i].name,"   ");
    rr_data->target[i].name_chain=' ';
    rr_data->target[i].n_aa=0;
    for(j=0;j<MAXRES;j++) {
      rr_data->target[i].aa[j]=' ';
      rr_data->target[i].aa_num[j]=-9999;
    }
  }
  for(j=0;j<MAXRRP;j++) {
    rr_data->rrp.confidence[j]=0.0;
    rr_data->rrp.chi[j]='-';
    rr_data->rrp.i[j]=0;
    rr_data->rrp.chj[j]='-';
    rr_data->rrp.j[j]=0;
    rr_data->rrp.d1[j]=0.0;
    rr_data->rrp.d2[j]=0.0;
  }
  return;
}

/*-----------------------------------------------------------
/
/   read_rr_f - read the RR predictions format
/
/------------------------------------------------------------*/
void read_rr_f(rr_f *rr_data, char* fname)
{
  int i, begflag, authflag;
  char keyword[500], line[500], name[30], model_nb[100];
  FILE *fp;

  if((fp = fopen(fname,"r"))==NULL) {
    printf("\n# error opening file %s for read\n\n",fname);
    exit(0);
  }

  /* Read in the rr_data
  -------------------------------------------*/
  begflag=0;
  authflag=0;
  while(fgets(line,500,fp)!=NULL) {
    strcpy(keyword,"   ");
    strcpy(name,"   ");
    strcpy(model_nb,"#   ");
    sscanf(line,"%s",keyword);
    if(!strncmp(keyword,"PFRMAT\0",7)) {

      for(i=0;i<500;i++)
        if(line[i]=='%' || line[i]=='"' || 
           line[i]=='/' || line[i]=='\\') line[i]=' ';
      printf(line);

      begflag=1;
      sscanf(line,"%s %s",keyword,name);
      if(strncmp(name,"RR\0",3)) {
        printf("\n# ERROR! Wrong specification of the RR format category");
        printf("\nPFRMAT RR      # was expected\n\n");
        exit(0);
      }
    }
    else if(!strncmp(keyword,"TARGET\0",7)) {

      for(i=0;i<500;i++)
        if(line[i]=='%' || line[i]=='"' || 
           line[i]=='/' || line[i]=='\\') line[i]=' ';
      printf(line);

      if(begflag<1) {
        printf("\n# ERROR! Unacceptable order of the RR prediction data records");
        printf("\nPFRMAT RR                # the first line");
        printf("\nTARGET Txxxx             # the second line");
        printf("\nAUTHOR xxxx-xxxx-xxxx    # the third line was expected\n\n");
        exit(0);
      }
      begflag=2;
      sscanf(line,"%s %s",keyword,name);
      strcpy(rr_data->target_name,name);
      read_seq(name,rr_data);
    }
    else if(!strncmp(keyword,"AUTHOR\0",7)) {
      if(begflag<1) {
        printf("\n# ERROR! Unacceptable order of the RR prediction data records");
        printf("\nPFRMAT RR                # the first line");
        printf("\nTARGET Txxxx             # the second line");
        printf("\nAUTHOR xxxx-xxxx-xxxx    # the third line was expected\n\n");
        exit(0);
      }
      for(i=0;i<500;i++)
        if(line[i]=='%' || line[i]=='"' || 
           line[i]=='/' || line[i]=='\\') line[i]=' ';
      printf(line);
      authflag=1;
    }
    else if(!strncmp(keyword,"REMARK\0",7)) {
      if(begflag<1) {
        printf("\n# ERROR! Unacceptable order of the RR prediction data records");
        printf("\nPFRMAT RR                # the first line");
        printf("\nTARGET Txxxx             # the second line");
        printf("\nAUTHOR xxxx-xxxx-xxxx    # the third line was expected\n\n");
        exit(0);
      }
      for(i=0;i<500;i++)
        if(line[i]=='%' || line[i]=='"' || 
           line[i]=='/' || line[i]=='\\') line[i]=' ';
      printf(line);
    }
    else if(!strncmp(keyword,"METHOD\0",7)) {
      if(begflag<1) {
        printf("\n# ERROR! Unacceptable order of the RR prediction data records");
        printf("\nPFRMAT RR                # the first line");
        printf("\nTARGET Txxxx             # the second line");
        printf("\nAUTHOR xxxx-xxxx-xxxx    # the third line was expected\n\n");
        exit(0);
      }
      rr_data->n_method++;
    }
    else if(!strncmp(keyword,"MODEL\0",6)) {
      if(begflag<2 || authflag!=1) {
        printf("\n# ERROR! Unacceptable order of the RR prediction data records");
        printf("\nPFRMAT RR                # the first line");
        printf("\nTARGET Txxxx             # the second line");
        printf("\nAUTHOR xxxx-xxxx-xxxx    # the third line was expected\n\n");
        exit(0);
      }
      i=0;
      sscanf(line,"%s %s",keyword,model_nb);
      sscanf(model_nb,"%d",&i);
      if(model_nb[1]!=' ' && model_nb[1]!='\0' && model_nb[1]!='\n') {
        printf("\n# ERROR! Unacceptable index of the prediction MODEL\n\n");
        rr_data->errors++;
        escape(rr_data->errors);
      }
      if(i>0 && i<=5) {
        begflag=3;
        rr_data->model=i;
        printf("\n# Reading MODEL %2d\n",i);
        read_data_rrp(rr_data,fp);
        break;
      }
      else {
        printf("\n# ERROR! Unacceptable index of the RR prediction MODEL\n\n");
        exit(0);
      }
    }
    else if(!strncmp(keyword,"END\0",4)) {
      rr_data->end=1;
      break;
    }
    else if(strncmp(keyword," ",1)) {

      for(i=0;i<500;i++)
        if(line[i]=='%' || line[i]=='"' || 
           line[i]=='/' || line[i]=='\\') line[i]=' ';
      printf(line);

      printf("\n# ERROR! Unknown record keyword in this section of the prediction.");
      printf("\n#        Check RR format description.\n\n");
      rr_data->errors++;
      escape(rr_data->errors);
    }
  }
  if(begflag!=3) {
    printf("\n# ERROR! There is no RR prediction data in this file\n\n");
    exit(0);
  }
  if(rr_data->end==0) {
    printf("\n# ERROR! There is no END record in this file\n\n");
    exit(0);
  }
  if(authflag!=1) {
    printf("\n# ERROR! Check AUTHOR record in this file\n\n");
    exit(0);
  }
  if(rr_data->n_method==0) {
    printf("\n# ERROR! There is no METHOD records in this file\n\n");
    exit(0);
  }
  fclose(fp);

  return;
}

/*-----------------------------------------------------------
/
/   read_seq - read a sequence file
/
/------------------------------------------------------------*/
void read_seq(char* tname, rr_f *rr_data)
{
  int i, k, n_aa, old_res, new_res;
  char chain, sub[10];
  FILE *fp;
  char line[MAXRES], fname[20], lname[20], keyword[10];

  chain=' ';
  strcpy(lname,tname);
  strcpy(fname,"TARGETS/");
  strcat(fname,lname);
  strcat(fname,".seq.txt");
  if((fp = fopen(fname,"r"))==NULL) {
    for(i=0;i<20;i++) if(lname[i]=='t') lname[i]='T';
    strcpy(fname,"TARGETS/");
    strcat(fname,lname);
    strcat(fname,".seq.txt");
    if((fp = fopen(fname,"r"))==NULL) {
      for(i=0;i<20;i++) if(lname[i]=='T') lname[i]='t';
      strcpy(fname,"TARGETS/");
      strcat(fname,lname);
      strcat(fname,".seq.txt");
      if((fp = fopen(fname,"r"))==NULL) {
        printf("\n# ERROR! There is no target name:  %s",tname);
        printf("\n# TARGET Txxxx was expected\n\n");
        exit(0);
      }
    }
  }

  k=0;
  n_aa=0;
  while ((fgets(line, MAXRES, fp) != NULL)) {    
    if (strncmp(line, ">", 1) == 0) {
      chain=' ';
      if(line[6]=='_' && isalnum(line[7])!=0) {
        chain=line[7];
        if(isalpha(chain)==0) {
          printf("\n# ERROR! Wrong chain %c specification in the target:  %s",chain,tname);
          printf("\n#        Please send a message to the CASP organizers. \n\n");
          exit(0);
        }
      }
      rr_data->target[k].n_aa=n_aa;
      k=rr_data->target_n_chains;
      rr_data->target[k].name_chain=chain;
      for(i=0;i<10;i++) sub[i]=0;
      strncpy(sub,&line[1],8);
      sscanf(sub,"%s",rr_data->target[k].name);
      rr_data->target_n_chains++;
      if(rr_data->target_n_chains>MAXCHN) {
        printf("\n# ERROR! Too many chains in the target:  %s",tname);
        printf("\n#        Please send a message to the CASP organizers. \n\n");
        exit(0);
      }
      n_aa=0;
    }
    else {
      i=0;
      while (line[i]!='\n') {
        if(line[i]!='\0' && line[i]!=' ') {
          if(check_aa(line[i],letter,21)<20) {
            rr_data->target[k].aa[n_aa]=line[i];
            n_aa++;
            rr_data->target[k].n_aa++;
          }
          else {
            printf("\n# ERROR! Wrong amino acid code %c in the target:  %s ",line[i],tname);
            printf("\n#        Please send a message to the CASP organizers. \n\n");
            fclose(fp);
            exit(0);
          }            
        }
        i++;
      }
      rr_data->target[k].n_aa=n_aa;
    }
  }
  fclose(fp);
  for(k=0;k<rr_data->target_n_chains;k++) {
    rr_data->target_n_aa=rr_data->target_n_aa+rr_data->target[k].n_aa;
  }

  strcpy(lname,tname);
  strcpy(fname,"TARGETS/");
  strcat(fname,lname);
  strcat(fname,".pdb.txt");
  if((fp = fopen(fname,"r"))==NULL) {
    for(i=0;i<20;i++) if(lname[i]=='t') lname[i]='T';
    strcpy(fname,"TARGETS/");
    strcat(fname,lname);
    strcat(fname,".pdb.txt");
    if((fp = fopen(fname,"r"))==NULL) {
      for(i=0;i<20;i++) if(lname[i]=='T') lname[i]='t';
      strcpy(fname,"TARGETS/");
      strcat(fname,lname);
      strcat(fname,".pdb.txt");
      if((fp = fopen(fname,"r"))==NULL) {
        printf("\n# ERROR! There is no target name:  %s",tname);
        printf("\n# TARGET Txxxx was expected\n\n");
        exit(0);
      }
    }
  }

  chain='-';
  k=-1;
  n_aa=0;
  old_res=-9999;
  while ((fgets(line, MAXRES, fp) != NULL)) {    
    for(i=0;i<10;i++) keyword[i]=0;
    sscanf(line,"%s",keyword);
    if(!strncmp(keyword,"ATOM\0",5))   {
      if(chain != line[21]) {
        chain=line[21];
        k++;
        n_aa=0;
      }
      for(i=0;i<10;i++) keyword[i]=0;
      strncpy(keyword,&line[22],4);
      sscanf(keyword,"%d",&new_res);
      if(new_res != old_res) {
        rr_data->target[k].aa_num[n_aa]=new_res;
        old_res=new_res;
        n_aa++;
      }
    }
  }
  fclose(fp);

  return;
}

/*-----------------------------------------------------------
/
/   check_rr_f - checks the RR prediction file format
/
/------------------------------------------------------------*/
void check_rr_f(rr_f *rr_data)
{
  int i, j, k, kr, l, ok;

  printf("\n# Checking the RR prediction MODEL %2d\n",rr_data->model);
  for(k=0;k<rr_data->target_n_chains;k++) {
    j=rr_data->target[k].n_aa-1;
    if(rr_data->target[k].aa_num[0]!=1) {
      printf("\n# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
      printf("\n# !!!                       !!!");
      printf("\n# !!!  VERY IMPORTANT NOTE  !!!");
      printf("\n# !!!                       !!!");
      printf("\n# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
      if(rr_data->target_n_chains>1) {
        printf("\n# The residue numbering of the  TARGET:  %s (chain: %c)  is not standard: ",
                    rr_data->target_name,rr_data->target[k].name_chain);
      }
      else {
        printf("\n# The residue numbering of the  TARGET:  %s  is not standard: ",
                    rr_data->target_name);
      }
      printf("\n#   the first residue in the TARGET is:  %c %4d ",
                    rr_data->target[k].aa[0],rr_data->target[k].aa_num[0]);
      printf("\n#   the last  residue in the TARGET is:  %c %4d ",
                    rr_data->target[k].aa[j],rr_data->target[k].aa_num[j]);
      printf("\n# Check residue numbering in template PDB file for this TARGET.");
      printf("\n# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
      printf("\n# !!!                       !!!");
      printf("\n# !!!  VERY IMPORTANT NOTE  !!!");
      printf("\n# !!!                       !!!");
      printf("\n# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
      printf("\n# Be sure if the numbering of residues in your ");
      printf("\n# prediction corresponds to this numbering scheme. \n\n");
    }
    for(i=0;i<rr_data->rrp.n_rrp;i++) {
      ok=0;
      kr=rr_data->rrp.i[i];
      for(l=0;l<rr_data->target[k].n_aa;l++) {
        if(kr==rr_data->target[k].aa_num[l]) {
          ok=1;
          break;
        }
      }
      if(ok==0) {
        printf("# ERROR! Check residue number:  %d\n",kr);
        printf("#        There is no such a residue in TARGET\n");
        printf("#        Check residue numbering in template PDB file for TARGET: %s\n\n",rr_data->target_name);
        exit(0);
      }
      ok=0;
      kr=rr_data->rrp.j[i];
      for(l=0;l<rr_data->target[k].n_aa;l++) {
        if(kr==rr_data->target[k].aa_num[l]) {
          ok=1;
          break;
        }
      }
      if(ok==0) {
        printf("# ERROR! Check residue number:  %d\n",kr);
        printf("#        There is no such a residue in TARGET\n");
        printf("#        Check residue numbering in template PDB file for TARGET: %s\n\n",rr_data->target_name);
        exit(0);
      }
    }
  }
  if(rr_data->rrp.n_aa!=rr_data->target_n_aa) {
    printf("# ERROR! Check the number %d of residues in the model. (In TARGET: %d)\n",
              rr_data->rrp.n_aa,rr_data->target_n_aa);
    rr_data->errors++;
    escape(rr_data->errors);
  }
  if(rr_data->rrp.n_aa==0 || rr_data->rrp.n_confidence==0) {
    printf("# ERROR! Check the number of considered RR contacts in the model.\n");
    rr_data->errors++;
    escape(rr_data->errors);
    return;
  }
  j=-1;
  k=0;
  for(i=0;i<rr_data->rrp.n_aa;i++) {
    j++;
    if(j==rr_data->target[k].n_aa) {
      k++;
      j=0;
    }
    if(k+1>rr_data->target_n_chains) {
      printf("\n# ERROR! Check the number of residues and residue sequence");
      printf("\n#        inside the MODEL section. \n\n");
      exit(0);
    }
    if(rr_data->target[k].aa[j]!=rr_data->rrp.aa[i]) {
      printf("\n# ERROR! Check residue %c inside the MODEL section. \n",
                rr_data->rrp.aa[i]);
      printf("#        This residue should correspond to the target residue: %c  %d \n",
                rr_data->target[k].aa[j],rr_data->target[k].aa_num[j]);
      rr_data->errors++;
      escape(rr_data->errors);
    }
  }
  if(rr_data->target_n_chains==1) {
    j=rr_data->target[0].n_aa-1;
    for(i=0;i<rr_data->rrp.n_rrp;i++) {
      if(rr_data->rrp.i[i]<rr_data->target[0].aa_num[0] ||
         rr_data->rrp.i[i]>=rr_data->rrp.j[i] ||
         rr_data->rrp.j[i]>rr_data->target[0].aa_num[j]) {
        printf("# ERROR! Check RR indices %c%d %c%d (%d <= i < j <= %-d  is expected)\n",
                  rr_data->rrp.chi[i],rr_data->rrp.i[i],rr_data->rrp.chj[i],rr_data->rrp.j[i],
                  rr_data->target[0].aa_num[0],rr_data->target[0].aa_num[j]);
        rr_data->errors++;
        escape(rr_data->errors);
      }
    }
  }
  else {
    j=rr_data->target[0].n_aa-1;
    k=rr_data->target[1].n_aa-1;
    for(i=0;i<rr_data->rrp.n_rrp;i++) {
      if(rr_data->rrp.i[i]<rr_data->target[0].aa_num[0] ||
         rr_data->rrp.j[i]<rr_data->target[1].aa_num[0] ||
         rr_data->rrp.i[i]>rr_data->target[0].aa_num[j] ||
         rr_data->rrp.j[i]>rr_data->target[1].aa_num[k]) {
        printf("# ERROR! Check RR indices %c%d %c%d \n",
                  rr_data->rrp.chi[i],rr_data->rrp.i[i],rr_data->rrp.chj[i],rr_data->rrp.j[i]);
        printf("#        %d <= i <= %-d   and   %d <= j <= %-d   is expected\n",
                  rr_data->target[0].aa_num[0],rr_data->target[0].aa_num[j],
                  rr_data->target[1].aa_num[0],rr_data->target[1].aa_num[k]);
        rr_data->errors++;
        escape(rr_data->errors);
      }
    }
  }
  for(i=0;i<rr_data->rrp.n_rrp;i++) {
    if(rr_data->rrp.d1[i]<0.0 ||
       rr_data->rrp.d1[i]>=rr_data->rrp.d2[i]) {
      printf("# ERROR! Check RR distances %5.2f %5.2f (0.0 <= d1 < d2  is expected)\n",
                rr_data->rrp.d1[i],rr_data->rrp.d2[i]);
      rr_data->errors++;
      escape(rr_data->errors);
    }
    if(rr_data->rrp.confidence[i]<0.0 || rr_data->rrp.confidence[i]>1.0) {
      printf("# ERROR! Check probability = %5.2f for RR contact line number %d\n",
                rr_data->rrp.confidence[i],i+1);
      rr_data->errors++;
      escape(rr_data->errors);
    }
  }
  printf("# Checking the RR prediction MODEL %2d      (DONE)\n",rr_data->model);
  return;
}

/*-----------------------------------------------------------
/
/   check_aa - checks an amino acid
/
/------------------------------------------------------------*/
int check_aa(char token, char* letter, int n)
{
  int i;

  for(i=0;i<n;i++) {
    if(letter[i]==token)
      return i;
  }
  return n;
}

/*-----------------------------------------------------------
/
/   read_data_rrp - read the RR predictions file format.
/                   Five column RR CASP3 format.
/
/------------------------------------------------------------*/
void read_data_rrp(rr_f *rr_data, FILE* fp)
{
  int i, j, k, n_aa, n_rrp, seq, n_line;
  float conf, d1, d2;
  char line[500], keyword[500], sub[10], subi[10], subj[10];

  seq=0;
  n_line=0;
  n_aa=0;
  n_rrp=0;
  rr_data->rrp.n_aa=n_aa;
  rr_data->rrp.n_rrp=n_rrp;
  while (fgets(line, 500, fp) != NULL) {
    strcpy(keyword,"   ");
    sscanf(line,"%s",keyword);   
    if(seq==0 && keyword[0]!=' ' && keyword[0]!='#') {
      n_line++;
      i=0;
      while (line[i]!='\n' && line[i]!='#') {
        if(line[i]!='\0' && line[i]!=' ' && line[i]!='\r') {
          if(check_aa(line[i],letter,21)<20) {
            rr_data->rrp.aa[n_aa]=line[i];
            n_aa++;
            rr_data->rrp.n_aa=n_aa;
          }
          else {
            // printf("\n# ERROR! Check RR format. Wrong %d residue code: %c",n_aa+1,line[i]);
			printf("\n# ERROR! Check RR format. Wrong residue code in position %d in the sequence: %c",n_aa+1,line[i]);
			printf("\n#        Line: %s", line);
            printf("#        Check completeness of target sequence in MODEL section!");
            printf("\n#        Total number of residues in target sequence: %d\n\n",rr_data->target_n_aa);
            fclose(fp);
            exit(0);
          }            
        }
        i++;
      }
      if(n_aa>=rr_data->target_n_aa) {
        seq=1;
      }
    }
    else if(!strncmp(keyword, "END\0", 4))  {
      rr_data->end=1;
      return;
    }
    else if(keyword[0]=='#') {}
    else if(!strncmp(keyword,"REMARK\0",7)) {}
    else if(!strncmp(keyword,"PARENT\0",7) ||
            !strncmp(keyword,"TER\0",4)) {
      for(i=0;i<500;i++)
        if(line[i]=='%' || line[i]=='"' || 
           line[i]=='/' || line[i]=='\\') line[i]=' ';
      printf(line);

      printf("\n# ERROR! Unknown record in the MODEL - END section.");
      printf("\n#        Check five column RR format.\n\n");
      rr_data->errors++;
      escape(rr_data->errors);
    }
    else if(!strncmp(keyword,"METHOD\0",7)) {
      rr_data->n_method++;
    }
    else {
      for(i=0;i<10;i++) {
        subi[i]=' ';
        subj[i]=' ';
      }
      i=-9999;
      j=-9999;
      d1=-1.0;
      d2=-1.0;
      conf=-1.0;
      sscanf(line,"%s %s %f %f %f",subi,subj,&d1,&d2,&conf);

      // if(rr_data->target[0].name_chain==' ') {
        // sscanf(subi,"%d",&i);
        // sscanf(subj,"%d",&j);
        // rr_data->rrp.chi[n_rrp]=' ';
        // rr_data->rrp.chj[n_rrp]=' ';
        // if(isalpha(subi[0])!=0 || isalpha(subj[0])!=0) {
          // i=-9999;
        // }
      // }
      // else {
	  k=0;
        if(isalpha(subi[0])!=0 || isalpha(subj[0])!=0) {
          rr_data->rrp.chi[n_rrp]=subi[0];
          rr_data->rrp.chj[n_rrp]=subj[0];
          k=1;
        }
        else {
          rr_data->rrp.chi[n_rrp]=' ';
          rr_data->rrp.chj[n_rrp]=' ';
          k=0;
        }
        strncpy(sub,&subi[k],6);
        sscanf(sub,"%d",&i);
        strncpy(sub,&subj[k],6);
        sscanf(sub,"%d",&j);
		
      // }
      if(rr_data->target_n_chains==1) {
        if(rr_data->rrp.chi[n_rrp]!=rr_data->rrp.chj[n_rrp]) {
          i=-9999;
        }
        if(rr_data->rrp.chi[n_rrp]!=rr_data->target[0].name_chain &&
           rr_data->rrp.chi[n_rrp]!=' ') {
          i=-9999;
        }
      }
      if(rr_data->target_n_chains>1) {
        if(rr_data->rrp.chi[n_rrp]==rr_data->rrp.chj[n_rrp]) {
          i=-9999;
        }
      }
      if(i==-9999 || j==-9999 || d1<0.0 || d2<0.0 || conf<0.0 || conf>1.0) {
        for(k=0;k<500;k++)
          if(line[k]=='%' || line[k]=='"' || 
             line[k]=='/' || line[k]=='\\') line[k]=' ';
        printf(line);

        printf("\n# ERROR! Check the line %d in the MODEL section. ",n_rrp+1+n_line);
        if(rr_data->target[0].name_chain!=' ') {
          printf("Check chain ID.");
        }           
        if(keyword[0]==' ') {
          printf("\n#        The blank records are not allowed.");
        }
        printf("\n#        Check RR format description.\n\n");
        exit(0);
      }           
      if(n_rrp>0) {
        if(rr_data->rrp.chi[n_rrp]!=rr_data->rrp.chi[n_rrp-1]) {
          for(k=0;k<500;k++)
            if(line[k]=='%' || line[k]=='"' || 
               line[k]=='/' || line[k]=='\\') line[k]=' ';
          printf(line);

          printf("\n# ERROR! Check the lines %d and %d in the MODEL section. ",
                      n_rrp+n_line,n_rrp+1+n_line);
          printf("\n#        Not consistent chain ID specification.");
          printf("\n#        Check RR format description.\n\n");
          exit(0);
        }           
      }           
      rr_data->rrp.i[n_rrp]=i;
      rr_data->rrp.j[n_rrp]=j;
      rr_data->rrp.d1[n_rrp]=d1;
      rr_data->rrp.d2[n_rrp]=d2;
      rr_data->rrp.confidence[n_rrp]=conf;
      n_rrp++;
      rr_data->rrp.n_rrp=n_rrp;
      if(conf>0.0 && conf<=1.0) rr_data->rrp.n_confidence++;
      if(n_rrp>MAXRRP) {
        printf("\n# ERROR! Check RR format. ");
        printf("\n#        The limit of lines in MODEL section is %d\n\n",MAXRRP);
        fclose(fp);
        exit(0);
      }
    }
  }
  return ;
}
