138 long x,
long y,
long z,
long t )
144 x = (long)((
double)x * _vs_data[0] / _vs_mask[0]);
146 y = (long)((
double)y * _vs_data[1] / _vs_mask[1]);
148 z = (long)((
double)z * _vs_data[2] / _vs_mask[2]);
150 t = (long)((
double)t * _vs_data[3] / _vs_mask[3]);
152 return 0 <= x && x < _mask.getSizeX() &&
153 0 <= y && y < _mask.getSizeY() &&
154 0 <= z && z < _mask.getSizeZ() &&
155 0 <= t && ( ( t < _mask.getSizeT() && _mask(x, y, z, t) ) ||
156 ( _mask.getSizeT() == 1 && _mask(x, y, z) ) );
167 _distrib.resize( _weight.getSizeT() );
170 for(
int t = 0; t < ( _weight.get() ? _weight.getSizeT() : 1 ); ++t )
171 fitOne( _weight.view( Point4di(0, 0, 0, t),
172 Point4di( _weight.getSizeX(),
174 _weight.getSizeZ(), 1 ) ),
180 fitOne( _weight, _distrib[0] );
186 const carto::VolumeRef<WeightType> & volweight,
189 if( _weight.get() ) {
190 ASSERT( _data.getSizeX() <= volweight.getSizeX() );
191 ASSERT( _data.getSizeY() <= volweight.getSizeY() );
192 ASSERT( _data.getSizeZ() <= volweight.getSizeZ() );
193 ASSERT( _data.getSizeT() <= volweight.getSizeT() );
196 double data, weight, sum_weight = 0.;
201 for(
int t = 0; t < _data.getSizeT(); ++t )
202 for(
int z = 0; z < _data.getSizeZ(); ++z )
203 for(
int y = 0; y < _data.getSizeY(); ++y )
204 for(
int x = 0; x < _data.getSizeX(); ++x )
207 data = (double)_data(x, y, z, t);
208 weight = ( _weight ? (double)volweight(x, y, z, t) : 1. );
209 sum_weight += weight;
211 sigma += weight * sqr( data );
218 sigma = std::sqrt( sigma );
221 double mean_weight = sum_weight / count;
222 sigma *= sum_weight / ( sum_weight - mean_weight );
227 double prev_mu = mu, prev_sigma = sigma;
232 for(
int t = 0; t < _data.getSizeT(); ++t )
233 for(
int z = 0; z < _data.getSizeZ(); ++z )
234 for(
int y = 0; y < _data.getSizeY(); ++y )
235 for(
int x = 0; x < _data.getSizeX(); ++x )
238 data = (double)_data(x, y, z, t);
239 if( std::abs( prev_mu - data ) < prev_sigma * 3. )
241 weight = ( _weight ? (double)volweight(x, y, z, t) : 1. );
242 sum_weight += weight;
244 sigma += weight * aims::sqr( data );
250 sigma -= aims::sqr( mu );
251 sigma = std::sqrt( sigma );
254 double mean_weight = sum_weight /
255 ( _data.getSizeT() * _data.getSizeZ() *
256 _data.getSizeY() * _data.getSizeX() );
257 sigma *= sum_weight / ( sum_weight - mean_weight );