11 #ifndef PRIMATOLOGIST_PROBA_NORMAL_D_H 12 #define PRIMATOLOGIST_PROBA_NORMAL_D_H 18 #include <aims/math/mathelem.h> 20 #include <cartodata/volume/volume.h> 22 #include <cartobase/exception/assert.h> 37 template <
typename DataType,
typename WeightType,
typename MaskType>
40 _data((
carto::Volume<DataType>*)0),
41 _weight((
carto::Volume<WeightType>*)0),
42 _mask((
carto::Volume<MaskType>*)0),
50 template <
typename DataType,
typename WeightType,
typename MaskType>
57 template <
typename DataType,
typename WeightType,
typename MaskType>
59 const carto::VolumeRef<DataType> & data )
63 _vs_data.assign(4, 1.);
64 _data.header().getProperty(
"voxel_size", _vs_data);
68 template <
typename DataType,
typename WeightType,
typename MaskType>
70 const carto::VolumeRef<WeightType> & weight )
75 template <
typename DataType,
typename WeightType,
typename MaskType>
77 const carto::VolumeRef<MaskType> & mask )
81 _vs_mask.assign(4, 1.);
82 _mask.header().getProperty(
"voxel_size", _vs_mask);
88 template <
typename DataType,
typename WeightType,
typename MaskType>
94 template <
typename DataType,
typename WeightType,
typename MaskType>
100 template <
typename DataType,
typename WeightType,
typename MaskType>
108 template <
typename DataType,
typename WeightType,
typename MaskType>
111 return _distrib[0].getMu();
114 template <
typename DataType,
typename WeightType,
typename MaskType>
117 return _distrib[0].getSigma();
120 template <
typename DataType,
typename WeightType,
typename MaskType>
127 template <
typename DataType,
typename WeightType,
typename MaskType>
128 std::vector<NormalDistribution>
136 template <
typename DataType,
typename WeightType,
typename MaskType>
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) ) );
161 template <
typename DataType,
typename WeightType,
typename MaskType>
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] );
184 template <
typename DataType,
typename WeightType,
typename MaskType>
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 );
271 #define instantiate_normalestim_3( DataType, WeightType, MaskType ) \ 272 template class NormalEstimation<DataType,WeightType,MaskType>; 274 #define instantiate_normalestim_2( DataType, WeightType ) \ 275 instantiate_normalestim_3( DataType, WeightType, int8_t ) \ 276 instantiate_normalestim_3( DataType, WeightType, uint8_t ) \ 277 instantiate_normalestim_3( DataType, WeightType, int16_t ) \ 278 instantiate_normalestim_3( DataType, WeightType, uint16_t ) \ 279 instantiate_normalestim_3( DataType, WeightType, int32_t ) \ 280 instantiate_normalestim_3( DataType, WeightType, uint32_t ) \ 281 instantiate_normalestim_3( DataType, WeightType, int64_t ) \ 282 instantiate_normalestim_3( DataType, WeightType, uint64_t ) \ 283 instantiate_normalestim_3( DataType, WeightType, float ) \ 284 instantiate_normalestim_3( DataType, WeightType, double ) 286 #define instantiate_normalestim_1( DataType ) \ 287 instantiate_normalestim_2( DataType, int8_t ) \ 288 instantiate_normalestim_2( DataType, uint8_t ) \ 289 instantiate_normalestim_2( DataType, int16_t ) \ 290 instantiate_normalestim_2( DataType, uint16_t ) \ 291 instantiate_normalestim_2( DataType, int32_t ) \ 292 instantiate_normalestim_2( DataType, uint32_t ) \ 293 instantiate_normalestim_2( DataType, int64_t ) \ 294 instantiate_normalestim_2( DataType, uint64_t ) \ 295 instantiate_normalestim_2( DataType, float ) \ 296 instantiate_normalestim_2( DataType, double ) 300 #endif // PRIMATOLOGIST_PROBA_NORMAL_D_H void setBessel(bool bessel=true)
std::vector< NormalDistribution > getDistributionVector() const
void setRobust(bool robust=true)
void setMask(const carto::VolumeRef< MaskType > &mask=vol::empty< MaskType >())
void setData(const carto::VolumeRef< DataType > &data=vol::empty< DataType >())
void setSigma(double sigma)
NormalDistribution getDistribution() const
void fitOne(const carto::VolumeRef< WeightType > &volweight, NormalDistribution &distrib)
void setWeight(const carto::VolumeRef< WeightType > &weight=vol::empty< WeightType >())
void setMultiWeights(bool multi=true)
bool inMask(long x=0, long y=0, long z=0, long t=0)