Example #1
0
static void border(int *b,int i,int j,double d0,double d1,
	    double cut,double *cutp,int dirmode)
{
  int t;
  t=excluded(i,j,dirmode);
  switch (t)
    {
    case 0:
      if (((d0>=cut)&&(d1<cut))||((d0<cut)&&(d1>=cut)))
	{
	  set_exclude(i,j,dirmode,3);
	  *cutp=(cut-d0)/(d1-d0);
	  *b=4;
	}
      else
	{
	  *b=0;
	}
      break;
    case 1:
      *cutp=(cut-d0)/(d1-d0);
      *b=5;
      break;
    case 3:
      *cutp=(cut-d0)/(d1-d0);
      *b=3;
      break;
    default :
      /*      printf("Error in contour b=%d encountered\n",t);*/
      *b=0;
    }
}
Example #2
0
/*! Exclude a set of atoms from the clash detection score.

  When fitting a fragment or loop, the new loop will always score
  clashes against the atoms that it is replacing or those it is bonded
  too. These atoms may be excluded from the clash score by supplying
  the original fragment which is being replaced to this function.

  \param frag The atoms to exclude.
  \param rad  The radius to exclude.
*/
void ScoreClashes::set_exclude( const Chain& frag, double rad )
{
  std::vector<clipper::Coord_orth> coords;
  for ( int r = 0; r < frag.size(); r++ ) {
    if ( frag[r].flag() == Residue::NORMAL ) {
      coords.push_back( frag[r].coord_n() );
      coords.push_back( frag[r].coord_ca() );
      coords.push_back( frag[r].coord_c() );
    } else if ( frag[r].flag() == Residue::CALPHA ) {
      coords.push_back( frag[r].coord_ca() );
    }
  }
  set_exclude( coords, rad );
}
Example #3
0
void startcontour(double *data,int x,int y,double cut, double **cont,
		  int *index,int startdir[2],int *charact,int periodic,
		  int *boundary)
{
  int dirmode,dir[2],endcontour=0;
  double d0,d3,cutp;

  *boundary=0;
  *charact=0;
  dir[0]=startdir[0];
  dir[1]=startdir[1];
  if (dir[0]==0) dirmode=vertical; else dirmode=horizontal;
  set_exclude(x,y,dirmode,1);
  d0=data[(*ind)(x,y)];
  d3=data[(*ind)(x+abs(dir[1]),y+abs(dir[0]))];
  cutp=(cut-d0)/(d3-d0);
  (*cont)[*index*2]=x+abs(dir[1])*cutp;
  (*cont)[*index*2+1]=y+abs(dir[0])*cutp;
  (*index)++;
  if((*index)>=indexmax)
    {
      indexmax+=contl;
      *cont=(double*)realloc(*cont,(indexmax*2+10)*sizeof(double));
      if (*cont==NULL) { 
	fprintf(stderr,"Error in realloc in contour() for *cont\n"); 
	exit(1);}
      if (*index> 4*lattx*latty) {
	fprintf(stderr,
		"contour.c: startcontour:"
		"More contour points than lattice points %d",
		*index);
	return;
      }
    }
  
  for(;0==endcontour;(*index)++){
    
    if((*index)>=indexmax)
      {
	indexmax+=contl;
	*cont=(double*)realloc(*cont,(indexmax*2+10)*sizeof(double));
	if (*cont==NULL) { fprintf(stderr,"Error in malloc in contour()" 
				   " for *cont\n"); 
			   exit(1);}
	if (*index>4*lattx*latty) return; 
      }
    endcontour=next_contour(data,cut,&x,&y,dir,&(*cont)[*index*2],
			    &(*cont)[*index*2+1],charact,periodic,
			    boundary);
  }

  if((*index)>=indexmax)
    {
      indexmax+=contl;
      *cont=(double*)realloc(*cont,(indexmax*2+10)*sizeof(double));
      if (*cont==NULL) { fprintf(stderr,"Error in malloc in contour()" 
				 " for *cont\n"); 
			 exit(1);}
      if (*index>4*lattx*latty) return; 
    }
}
Example #4
0
void contour(double *data,int nox, int noy, double cut,
	     double **cont,int **length,int periodic,
	     long (*newind)(int, int),int *boundary)
{
  int i,j,L,dir[2],index=0,index_old,charact;

  if (newind==NULL) ind = &stdind;
  else ind = newind;
  lattx=nox;
  latty=noy;
  excl=(short*) malloc(lattx*latty*sizeof(short));
  if (excl==NULL) { fprintf(stderr,"Error in malloc in contour() for excl\n"); 
		    exit(1);}
  memset(excl,0,lattx*latty*sizeof(short));
  /* for (i=0;i<lattx*latty;i++) excl[i]=0;*/
  *length= (int*) malloc(11*2*sizeof(int)); /* ??? */
  if (*length==NULL) 
    { fprintf(stderr,"Error in malloc in contour() for *length\n"); 
      exit(1);}
  (*length)[0]=0;
  indexmax=contl;
  *cont=(double*) malloc((indexmax*2+10)*sizeof(double));
  if (*cont==NULL) 
    { fprintf(stderr,"Error in malloc in contour() for *cont\n"); 
      exit(1);}

  /* purely vertical Contours */
  dir[0]=1; dir[1]=0;
  for (i=0;i<noy-1;i++)
    {
      if (!excluded(0,i,horizontal)&&
	  (((data[(*ind)(0,i)]>=cut)&&(data[(*ind)(0,i+1)]<cut))
	   ||((data[(*ind)(0,i)]<cut)&&(data[(*ind)(0,i+1)]>=cut)))) 
	{
	  index_old=index;
	  startcontour(data,0,i,cut,cont,&index,dir,&charact,periodic,
		       boundary);
	  L=++(*length)[0];
	  if (L%10==0)
	    *length=realloc(*length,(L+11)*2*sizeof(int));
	  if (*length==NULL) 
	    { fprintf(stderr,"Error in realloc in contour() for *length\n"); 
	      exit(1);}
	  (*length)[L*2]=index-index_old;
	  (*length)[L*2+1]=charact;
	}
      else set_exclude(0,i,horizontal,2);
    }
/* Now we look for contours in the bulk (Only need horizontal, since 
     there are no purely vertical contours left... ) */
  dir[0]=0; dir[1]=1;
  for (i=0;i<lattx-1;i++)
    for (j=0;j<latty-1;j++)
      {
	if (!excluded(i,j,vertical)&&
	    (((data[(*ind)(i,j)]>=cut)&&(data[(*ind)(i+1,j)]<cut))
	     ||((data[(*ind)(i,j)]<cut)&&(data[(*ind)(i+1,j)]>=cut)))) 
	  {
	    index_old=index;
	    startcontour(data,i,j,cut,cont,&index,dir,&charact,periodic,
			 boundary);
	    L=++(*length)[0];
	    if (L%10==0) *length=realloc(*length,(L+11)*2*sizeof(int));
	    if (*length==NULL) { fprintf(stderr,
	       "Error in realloc in contour() for *length\n"); exit(1);}
	    (*length)[L*2]=index-index_old;
	    (*length)[L*2+1]=charact;
	  }
	else set_exclude(i,j,vertical,2);
      }
  free(excl);
}
Example #5
0
static int next_contour(double *data,double cut, int *i,int *j,
			int dir[2],double *x, double *y, int *charac,
			int periodic,int *boundary)
{
  double d0,d1,d2,d3,cutp[4];
  int k,dirmode,finish=0,dird[2],b[3],bsum,dirt,side,orient;


  /* Check  if contour is runing on the boundary. 
     If that is the case run on the boundary until new contour line
     or corner encountered. For the exclusion the contours
     run along -1 rather than 0.*/
  if (periodic==0){
    if ((dir[0] ==0)&&((*i==lattx-1)||(*i==-1))){
      *charac+=1;
      dirmode=vertical;
      if (*i==-1) {side=1;} 
      else        {side=0;}
      if (dir[1]==-1){ 
	for(*j-=1;(*j>=0)&&(data[(*ind)(*i+side,*j)]>cut);(*j)--);
	if (*j<0){
	  *i+=side;
	  *x=*i;
	  *y=0;
	  if (*i==0) dir[0]=1;
	  else dir[0]=-1;
	  dir[1]=0;
	  return 0;
	}
      }
      else{
	for((*j)++;(*j<latty)&&(data[(*ind)(*i+side,*j)]>cut);(*j)++);
	if (*j>=latty) {
	  *i+=side;
	  *j=latty-1;
	  *x=*i;
	  *y=*j;
	  if (*i==0) dir[0]=1;
	  else dir[0]=-1;
	  dir[1]=0;
	  return 0;
	}
      }
   
      d0=data[(*ind)(*i+side,*j)];
      d1=data[(*ind)(*i+side,*j-dir[1])]; 
      *x=*i+side;
      *y=*j-dir[1]*(cut-d0)/(d1-d0);
      *i+=side;
      if (dir[1]==1) (*j)--;
      if (*i==0) dir[0]=1;
      else dir[0]=-1;
      dir[1]=0;
      if (excluded(*i,*j,dirmode^1)==1) {
	set_exclude(*i,*j,dirmode^1,3);
	return 1;
      }
      else set_exclude(*i,*j,dirmode^1,3); /* was 2...*/
      return 0;
    }
    
    if ((dir[1]==0)&&((*j==latty-1)||(*j==-1))){
      *charac+=1;
      dirmode=horizontal;
      if (*j==-1) {side=1;} 
      else        {side=0;}
      if (dir[0]==-1){ 
	for((*i)--;(*i>=0)&&(data[(*ind)(*i,*j+side)]>cut);(*i)--);
	if (*i<0) {
	  *j+=side;
	  *x=0;
	  *y=*j;
	  if (*j==0) dir[1]=1;
	  else dir[1]=-1;
	  dir[0]=0;
	  return 0;
	}
      }
      else {
	for((*i)++;(*i<lattx)&&(data[(*ind)(*i,*j+side)]>cut);(*i)++);
	if (*i>=lattx) {
	  *j+=side;
	  *i=lattx-1;
	  *x=*i;
	  *y=*j;
	  if (*j==0) dir[1]=1;
	  else dir[1]=-1;
	  dir[0]=0;
	  return 0;
	}
      }
      
      d0=data[(*ind)(*i,*j+side)];
      d1=data[(*ind)(*i-dir[0],*j+side)]; 
      *x=*i-dir[0]*(cut-d0)/(d1-d0);
      *y=*j+side;
      *j+=side;
      if (dir[0]==1) (*i)--;
      if (*j==0) dir[1]=1;
      else dir[1]=-1;
      dir[0]=0;
      if (excluded(*i,*j,dirmode^1)==1) {
	set_exclude(*i,*j,dirmode^1,3);
	return 1;
      }
      else set_exclude(*i,*j,dirmode^1,3);/* was 2...*/
      return 0;
    }
  }
  
  if (dir[0]==0) dirmode=vertical; else dirmode=horizontal;
  if (dir[0]<0) dird[0]=-1; else dird[0]=0;
  if (dir[1]<0) dird[1]=-1; else dird[1]=0;
  d0=data[(*ind)(*i,*j)];
  d1=data[(*ind)(*i+dir[0],*j+dir[1])]; 
  d2=data[(*ind)(*i+dir[0]+abs(dir[1]),*j+dir[1]+abs(dir[0]))];
  d3=data[(*ind)(*i+abs(dir[1]),*j+abs(dir[0]))];
  if (d0>d3) orient=1; else orient=-1;

  border(b,*i+dird[0],*j+dird[1],d0,d1,cut,cutp,dirmode^1);
  border(b+1,*i+dir[0],*j+dir[1],d1,d2,cut,cutp+1,dirmode);
  border(b+2,*i+abs(dir[1])+dird[0],*j+abs(dir[0])+dird[1],
	 d3,d2,cut,cutp+2,dirmode^1);
  bsum=(b[0]&4)+(b[1]&4)+(b[2]&4);
  if ((12==bsum))
    {
/*      cutp[3]=(cut-d3)/(d0-d3);
      if (cutp[0]+cutp[2]<cutp[1]+cutp[3])*/
      if ((((d0+d1+d2+d3)/4-cut)*(d3-d0)>0))
	{
	  if (!(b[1]&1))
	  set_exclude(*i+dir[0],*j+dir[1],dirmode,0);
	  b[1]=0;
	  if (!(b[2]&1))
	  set_exclude(*i+abs(dir[1])+dird[0],
		      *j+abs(dir[0])+dird[1],dirmode^1,0);
	  b[2]=0;
	  if (b[0]==5) {finish=1; b[0]=4;}
	  set_exclude(*i+dird[0],*j+dird[1],dirmode^1,3);
	}
      else
	{
	  if (!(b[0]&1))
	  set_exclude(*i+dird[0],*j+dird[1],dirmode^1,0);
	  b[0]=0;
	  if (!(b[1]&1))
	  set_exclude(*i+dir[0],*j+dir[1],dirmode,0);
	  b[1]=0;
	  if (b[2]==5){ finish=1;b[2]=4;}
	  set_exclude(*i+abs(dir[1])+dird[0],
		      *j+abs(dir[0])+dird[1],dirmode^1,3);
	}
    }
  if (bsum==8) {for (k=0;k<3;k++) {if (b[k]==5) b[k]=0;}}
  if (bsum==0) printf("Error in contour: could not close contour: bsum=0");
  if (b[0]&4)
    {
      *charac+=orient;
      if (b[0]&1) 
	{
	  set_exclude(*i+dird[0],*j+dird[1],dirmode^1,3);
	  finish=1;
	}
      *x=*i+dir[0]*cutp[0];
      *y=*j+dir[1]*cutp[0];
      *i+=dird[0];
      *j+=dird[1];
      dirt=dir[0];
      dir[0]=-abs(dir[1]);
      dir[1]=-abs(dirt);
    }
  else if (b[1]&4)
    {
      if (b[1]&1)
	{
	  set_exclude(*i+dir[0],*j+dir[1],dirmode,3);
	  finish=1;
	}
      *x=*i+dir[0]+abs(dir[1])*cutp[1];
      *y=*j+dir[1]+abs(dir[0])*cutp[1];
      *i+=dir[0];
      *j+=dir[1];
    }
  else if (b[2]&4)
    {
      *charac-=orient;
      if (b[2]&1)
	{
	  set_exclude(*i+abs(dir[1])+dird[0],
		      *j+abs(dir[0])+dird[1],dirmode^1,3);
	  finish=1;
	}
      *x=*i+abs(dir[1])+dir[0]*cutp[2];
      *y=*j+abs(dir[0])+dir[1]*cutp[2];
      *i+=abs(dir[1])+dird[0];
      *j+=abs(dir[0])+dird[1];
      dirt=dir[0];
      dir[0]=abs(dir[1]);
      dir[1]=abs(dirt);
    }
  else
    {
      fprintf(stderr,"Error in contour: could not close contour:bsum=%d\n",
	      bsum);
      return 1;
    }

/* This condition checks   */
/* wether the contour runs */
/* into the boundary.      */

  if(periodic==0){
    if (((dir[0]==1)&&(*i==lattx-1))||((dir[0]==-1)&&(*i==0))){
      *boundary=1;
      *charac+=1;
      dir[0]=0;
      if (data[(*ind)(*i,*j)]>cut) dir[1]=-1;
      else dir[1]=1;
      if (*i==0) *i=-1;
    }
    else
      if (((dir[1]==1)&&(*j==latty-1))||((dir[1]==-1)&&(*j==0))){
	*boundary=1;
	*charac+=1;
	dir[1]=0;
	if (data[(*ind)(*i,*j)]>cut) dir[0]=-1;
	else dir[0]=1;
	if (*j==0) *j=-1;
      }
  }
  
  return finish;

}