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; } }
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; }