12 #ifndef AIMS_REGISTRATION_DISPLACEMENT_FIELD_D_H
13 #define AIMS_REGISTRATION_DISPLACEMENT_FIELD_D_H
33 template<
class T>
inline
36 double &m,
double &s,
const T <h,
const T &hth)
41 T *first = (T*)(&im->at( i, j, k ));
44 int N = offset->getSizeX() * offset->getSizeY() * offset->getSizeZ();
48 for(oit =offset->begin(); oit != eoit; oit++)
53 if( (*pt<lth) || (*pt>hth) )
81 std::vector<int> dim = image->getSize();
84 for(k = 0; k < dim[2]; ++k)
85 for(j = 0; j < dim[1]; ++j)
86 for(i = 0; i < dim[0]; ++i)
88 if ((i < dim[0] - _nx) && (j < dim[1] - _ny)
89 && (k < dim[2] - _nz23d))
91 meanVar(image, _offset, i, j, k, m, s, _lthr, _hthr);
95 _sel.insert(std::pair<float, Point3d>(s,
Point3d(i,j, k)));
96 _moy.insert(std::pair<float, double>(s, m));
101 _selThresh = _sel.size() * cV;
120 _nz23d = (_nz == 1 ? 0 : _nz);
158 std::vector<int> dim = _offset->
getSize();
160 for(k=0; k < dim[2]; ++k)
161 for(j=0; j < dim[1]; ++j)
162 for(i=0; i < dim[0]; ++i)
164 _offset(i, j, k) = &_pyrRef->at(i, j, k) - &_pyrRef->at(0);
169 selectBlock(_pyrRef, scaleControl.
getcutVar());
179 _baryref[0] = _baryref[1] = _baryref[2] = 0.;
180 _barytest[0] = _barytest[1] =_barytest[2] = 0.;
183 double mLocalTest = 0, sLocalTest = 0;
208 std::vector<int> dim = _offset2->
getSize();
210 for(k=0; k < dim[2]; ++k)
211 for(j=0; j < dim[1]; ++j)
212 for(i=0; i < dim[0]; ++i)
214 _offset2(i, j, k) = &_pyrTest->at(i, j, k) - &_pyrTest->at(0);
226 std::multimap<float, Point3d>::reverse_iterator it = _sel.rbegin();
227 std::multimap<float, double>::reverse_iterator itm = _moy.rbegin();
229 std::vector<Point3df> pointstest, pointsref;
232 double norm_fctr = _offset->getSizeX() * _offset->getSizeY()
233 * _offset->getSizeZ() * _offset->getSizeX()
234 * _offset->getSizeY() * _offset->getSizeZ();
237 float puis_level = float(pow((
double) 2, (
double) _level));
240 int realPointNumber = 0 ;
241 int entLimit = int(_selThresh + .5);
263 int rank = COMM_WORLD.Get_rank();
264 int size = COMM_WORLD.Get_size();
265 int nbBlock = entLimit/size;
266 int nbBlockLeft = entLimit%size;
267 if(rank < nbBlockLeft) {
268 for(j = 0; j < rank * (nbBlock + 1); j++)
274 entLimit = nbBlock + 1;
277 for(j = 0;j < nbBlockLeft + rank * nbBlock;j++)
287 int recvCounts[size];
294 for(
int n = 0; n < entLimit; ++n, ++it, ++itm)
297 double mo = itm->second;
298 double sd = itm->first;
300 double n4_by_sd = norm_fctr * sd;
301 bool badPoint =
true;
303 double correlMax = 0;
307 for(k = -3; k < 4; ++k)
309 for(l = -3; l < 4;++l)
311 for(m = -3; m < 4; ++m)
316 (p[0]+k+_nx < _pyrTest->getSizeX() ) &&
317 (p[1]+l+_ny < _pyrTest->getSizeY() ) &&
318 (p[2]+m+ _nz23d < _pyrTest->getSizeZ()))
320 T *pRef = &_pyrRef->at(p);
321 T *pTest = &_pyrTest->at(p[0]+k, p[1]+l, p[2]+m);
323 meanVar(_pyrTest, _offset2, p[0]+k, p[1]+l, p[2]+m, mLocalTest, sLocalTest, _ltht, _htht);
331 for(oit = _offset.
begin(), oit2 = _offset2.
begin(); oit != oitend; oit++, oit2++)
332 correl += (*(pRef + *oit) - mo ) * ( *(pTest + *oit2 ) - mLocalTest);
337 correl /= (n4_by_sd * sLocalTest);
345 if ((correl == correlMax ) && (!badPoint))
348 field(p[0] + _nx/2, p[1] + _ny/2, p[2] + _nz23d/2) =
Point3d(0,0,0);
350 else if ((correl > correlMax ) && (!badPoint))
354 field( p[0] + _nx/2, p[1] + _ny/2, p[2] + _nz23d/2) =
Point3d(k*(int16_t)puis_level,
355 l*(int16_t)puis_level,
356 m*(int16_t)puis_level);
366 curRef[0] = ((float)p[0] +
float(_nx)/2.0) * puis_level;
367 curRef[1] = ((float)p[1] +
float(_ny)/2.0) * puis_level;
368 curRef[2] = ((float)p[2] +
float(_nz23d)/2.0) * puis_level;
370 curTest[0] = curRef[0] + float(field( p[0] + _nx/2, p[1] + _ny/2, p[2] + _nz23d/2)[0]);
371 curTest[1] = curRef[1] + float(field( p[0] + _nx/2, p[1] + _ny/2, p[2] + _nz23d/2)[1]);
372 curTest[2] = curRef[2] + float(field( p[0] + _nx/2, p[1] + _ny/2, p[2] + _nz23d/2)[2]);
384 if ((!badPoint) && (correlMax > _seuilCorrel) && (one_max))
387 pointsref.push_back(curRef);
388 pointstest.push_back(curTest);
391 _baryref[0] += curRef[0]; _baryref[1] += curRef[1]; _baryref[2] += curRef[2];
392 _barytest[0] += curTest[0]; _barytest[1] += curTest[1]; _barytest[2] += curTest[2];
398 field(p[0] + _nx/2, p[1] + _ny/2, p[2] + _nz23d/2) =
Point3d(0,0,0);
402 _pointstest = pointstest;
403 _pointsref = pointsref;
408 recvCounts[rank] = 6*realPointNumber;
409 COMM_WORLD.Allgather(IN_PLACE, 0, INT, recvCounts, 1, INT);
410 COMM_WORLD.Barrier();
413 for(i = 1; i < size; i++) {
414 dspls[i] = dspls[i-1] + recvCounts[i-1];
417 int totalNumFloats = dspls[size-1] + recvCounts[size-1];
418 pointsRecv =
new float[totalNumFloats];
419 for(i = 0; i < realPointNumber; i++)
421 for(
int j = 0; j < 3; j++)
423 pointsRecv[dspls[rank] + i*6 + j] = (_pointsref[i])[j];
424 pointsRecv[dspls[rank] + i*6 + 3 + j] = (_pointstest[i])[j];
427 _pointsref.clear();_pointstest.clear();
428 COMM_WORLD.Allgatherv(IN_PLACE, 0, INT, pointsRecv, recvCounts, dspls, FLOAT);
429 COMM_WORLD.Barrier();
430 for(
int i = 0; i < totalNumFloats; i += 6)
432 _pointsref.push_back(
Point3df(pointsRecv[i], pointsRecv[i+1], pointsRecv[i+2]));
433 _pointstest.push_back(
Point3df(pointsRecv[i+3], pointsRecv[i+4], pointsRecv[i+5]));
438 realPointNumber = totalNumFloats/6;
439 COMM_WORLD.Allreduce(IN_PLACE, _baryref, 3, DOUBLE, SUM);
440 COMM_WORLD.Allreduce(IN_PLACE, _barytest, 3, DOUBLE, SUM);
443 _baryref[0] /= realPointNumber;
444 _baryref[1] /= realPointNumber;
445 _baryref[2] /= realPointNumber;
446 _barytest[0] /= realPointNumber;
447 _barytest[1] /= realPointNumber;
448 _barytest[2] /= realPointNumber;
465 Ptesttrans->
setRef(testtrans);
498 std::vector<int> dim = _offset2->
getSize();
500 for(k = 0; k < dim[2]; ++k)
501 for(j = 0; j < dim[1]; ++j)
502 for(i = 0; i < dim[0]; ++i)
504 _offset(i, j, k) = &pyrRef->
at(i, j, k) - &pyrRef->
at(0);
505 _offset2(i, j, k) = &pyrTrans->
at(i, j, k) - &pyrTrans->
at(0);
509 double mRef = 0, sRef = 0, mTest = 0, sTest = 0;
521 double norm = _offset->getSizeX() * _offset->getSizeY() * _offset->getSizeZ()
522 * _offset->getSizeX() * _offset->getSizeY() * _offset->getSizeZ();
529 for(k = 0; k < dim[2]; ++k)
530 for(j = 0; j < dim[1]; ++j)
531 for(i = 0; i < dim[0]; ++i)
539 if ((i + _nx < dim[0]) && (j + _ny < dim[1]) && (k + _nz23d*_nz < dim[2]))
543 if (pyrTrans(i+_nx/2, j+_ny/2, k+_nz23d*_nz/2) < thresh)
545 T *pRef = &pyrRef->
at(i, j, k);
546 T *pTest = &pyrTrans->
at(i, j, k);
548 meanVar( pyrTrans, _offset2, i, j , k, mTest, sTest, _ltht, _htht);
549 meanVar( pyrRef, _offset, i, j , k, mRef, sRef, _lthr, _hthr);
550 double normS =
norm * (sRef*sTest);
558 for(oit = _offset.
begin(), oit2 = _offset2.
begin(); oit != eoit; oit++, oit2++)
560 correl += (*(pRef + *oit) - mRef ) * (*(pTest + *oit2 ) - mTest);
565 correl = sqrt(correl);
577 else pyrQuality(i+_nx/2, j+_ny/2, k+_nz23d*_nz/2) = 0;
carto::VolumeRef< T > getQuality(carto::rc_ptr< carto::Volume< T > > testtrans, carto::rc_ptr< carto::Volume< T > > ref, int level, T thresh=std::numeric_limits< T >::max())
void init(carto::rc_ptr< carto::Volume< T > > ref, ScaleControl &scaleControl, T *seuils)
carto::VolumeRef< Point3d > getField(carto::rc_ptr< carto::Volume< T > > test)
const carto::rc_ptr< carto::Volume< T > > item(int level) const
void setRef(carto::rc_ptr< carto::Volume< T > > ref)
void setVoxelSize(float vx, float vy=1., float vz=1., float vt=1.)
VolumeRef< T > deepcopy() const
std::vector< int > getSize() const
const T & at(long x, long y=0, long z=0, long t=0) const
blitz::Array< T, Volume< T >::DIM_MAX >::const_iterator const_iterator
blitz::Array< T, Volume< T >::DIM_MAX >::iterator iterator
reference_wrapper< T > ref(T &ref)
AIMSDATA_API float norm(const Tensor &thing)