Beispiel #1
0
    virtual void run(Voxel& voxel, VoxelData& data)
    {


        gradient_fun g(b_vec,data.space);
        fun f(b_vec,data.space);
        std::map<float,image::vector<3,float>,std::greater<float> > result;
        for (unsigned int index = 0;index < voxel.max_fiber_number;++index)
        {
            if (data.fa[index] <= 0.0)
                break;

            image::vector<3,float> initial_dir(voxel.ti.vertices[data.dir_index[index]]);
            image::optimization::gradient_descent(initial_dir,f,g,(double)0.01);
            double fa = -data.min_odf-f(initial_dir);
            initial_dir.normalize();
            if (std::abs(image::vector<3,float>(voxel.ti.vertices[data.dir_index[index]]) * initial_dir) < 0.939692623) // the angle greater than 20 degrees
                result[data.fa[index]] = image::vector<3,float>(voxel.ti.vertices[data.dir_index[index]]);
            else
                result[fa] = initial_dir;
        }

        std::map<float,image::vector<3,float>,std::greater<float> >::const_iterator iter = result.begin();
        std::map<float,image::vector<3,float>,std::greater<float> >::const_iterator end = result.end();
        for (unsigned int index = 0;iter != end;++index,++iter)
        {
            data.fa[index] = iter->first;
            data.dir[index] = iter->second;
        }

    }
Beispiel #2
0
int align_traceback(aligndatap data,
                    char *aln1,
                    char *aln2,
                    int bufferlen,
                    int (*stop)(aligndatap,int,int)) {
  int i,j,k,identity,dir,oi,oj;
  int alnpos,alnlen;
  alignmentp aobj;

/*
  if (stop == &align_stop_partialfree) {
    fprintf(stdout,"OK asp");
  } else if (stop == &align_stop_endsfree) {
    fprintf(stdout,"OK ase");
  } else if (stop == &align_stop_global) {
    fprintf(stdout,"OK asg");
  } else if (stop == &align_stop_local) {
    fprintf(stdout,"OK asl");
  } else {
    fprintf(stdout,"Lost value for stop: %x",stop);
  }
  fflush(stdout);
*/
    
/*   fprintf(stdout,"start traceback: str1=%s str2=%s\n",data->s1,data->s2);  */
  /* fprintf(stdout,"3.1..."); fflush(stdout); */
  aobj = data->alignment;

  identity = 0;
  i = aobj->end1+1;
  j = aobj->end2+1;
  /* fprintf(stdout," end1=%d   end2=%d\n",i,j); fflush(stdout); */
  /* fprintf(stdout,"3.2 (e1=%d, e2=%d)...",i,j); fflush(stdout); */
  alnpos = bufferlen-1;
  dir = initial_dir(data,i,j);
  while (!(*stop)(data,i,j)) {
    if (alnpos < 0) {
      fprintf(stderr,"traceback: alignment buffers too small, aborting\n");
      return -1;
    }
    oi = i; oj = j;
    switch (dir) {
      case UP:
        aln1[alnpos] = data->s1[--i];
        aln2[alnpos--] = '-';
        break;
      case DIAG:
        if (data->s1[--i] == data->s2[--j]) { identity++; }
        aln1[alnpos] = data->s1[i];
        aln2[alnpos--] = data->s2[j];
        break;
      case LEFT:
        aln1[alnpos] = '-';
        aln2[alnpos--] = data->s2[--j];
        break;
      default:
        fprintf(stderr,"dir(%d,%d) = %d\n",i,j,dir);
        exit(-1);
    }
    /* fprintf(stdout,"<%d,%d,%d",i,j,dir); fflush(stdout); */
    dir = direction(data,oi,oj,dir);
    /* fprintf(stdout,">"); fflush(stdout); */
    /* fprintf(stderr,"aln1[%d]: %c  aln2[%d]: %c\n",alnpos+1,aln1[alnpos+1],alnpos+1,aln2[alnpos+1]); */
  }
  aobj->start1 = i;
  aobj->start2 = j;
  /* fprintf(stdout,"3.3..."); fflush(stdout); */

  alnlen = bufferlen - alnpos - 1;
  for (k=0;k<alnlen;k++) {
    aln1[k] = aln1[k+alnpos+1];
    aln2[k] = aln2[k+alnpos+1];
  }
  /* fprintf(stdout,"3.4..."); fflush(stdout); */
  aln1[alnlen] = '\0';
  aln2[alnlen] = '\0';
  /* fprintf(stderr,"alnlen: %d\naln1: %s\naln2: %s\n",alnlen,aln1,aln2); */
  aobj->aln1 = aln1;
  aobj->aln2 = aln2;
  aobj->alignlen = alnlen;
  aobj->identity = identity;

  return alnlen;
}