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 )
205 if( inMask(x, y, z, t) )
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 )
236 if( inMask(x, y, z, t) )
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 )
void setSigma(double sigma)
void setMask(const carto::VolumeRef< MaskType > &mask=vol::empty< MaskType >())
void setMultiWeights(bool multi=true)
void setWeight(const carto::VolumeRef< WeightType > &weight=vol::empty< WeightType >())
void fitOne(const carto::VolumeRef< WeightType > &volweight, NormalDistribution &distrib)
bool inMask(long x=0, long y=0, long z=0, long t=0)
std::vector< NormalDistribution > getDistributionVector() const
void setBessel(bool bessel=true)
void setRobust(bool robust=true)
NormalDistribution getDistribution() const
void setData(const carto::VolumeRef< DataType > &data=vol::empty< DataType >())