21 #ifndef __MIA_3DDATAFIELD_HH
22 #define __MIA_3DDATAFIELD_HH 1
36 #include <miaconfig.h>
47 typedef std::shared_ptr<std::vector<T> > ref_data_type;
61 static const unsigned int m_elements;
67 void make_single_ref();
74 return m_data.unique();
81 typedef typename std::vector<T>::iterator iterator;
82 typedef typename std::vector<T>::const_iterator const_iterator;
83 typedef typename std::vector<T>::const_reference const_reference;
84 typedef typename std::vector<T>::reference reference;
85 typedef typename std::vector<T>::const_pointer const_pointer;
86 typedef typename std::vector<T>::pointer pointer;
87 typedef typename std::vector<T>::value_type value_type;
88 typedef typename std::vector<T>::size_type size_type;
89 typedef typename std::vector<T>::difference_type difference_type;
90 typedef typename atomic_data<T>::type atomic_type;
118 template <
typename Out>
122 template <
typename Out>
126 template <
typename Out>
163 return m_data->size();
170 value_type get_avg();
174 value_type strip_avg();
181 const_reference
operator()(
size_t x,
size_t y,
size_t z)
const
184 if (x < m_size.x && y < m_size.y && z < m_size.z) {
185 const std::vector<T>& data = *m_data;
186 return data[x+ m_size.x * (y + m_size.y * z)];
195 return (*
this)(l.
x,l.
y,l.
z);
203 assert(x < m_size.x && y < m_size.y && z < m_size.z);
204 return (*m_data)[x + m_size.x *(y + m_size.y * z)];
212 return (*
this)(l.
x,l.
y,l.
z);
216 void get_data_line_x(
int y,
int z, std::vector<T>& buffer)
const;
219 void get_data_line_y(
int x,
int z, std::vector<T>& buffer)
const;
222 void get_data_line_z(
int x,
int y, std::vector<T>& buffer)
const;
225 void put_data_line_x(
int y,
int z,
const std::vector<T> &buffer);
228 void put_data_line_y(
int x,
int z,
const std::vector<T> &buffer);
231 void put_data_line_z(
int x,
int y,
const std::vector<T> &buffer);
234 template <
class TMask>
235 void mask(
const TMask& m);
250 void read_xslice_flat(
size_t x, std::vector<atomic_type>& buffer)
const;
264 void read_yslice_flat(
size_t y, std::vector<atomic_type>& buffer)
const;
278 void read_zslice_flat(
size_t z, std::vector<atomic_type>& buffer)
const;
284 void write_zslice_flat(
size_t z,
const std::vector<atomic_type>& buffer);
291 void write_yslice_flat(
size_t y,
const std::vector<atomic_type>& buffer);
297 void write_xslice_flat(
size_t x,
const std::vector<atomic_type>& buffer);
344 return m_data->begin();
350 const_iterator
begin_at(
size_t x,
size_t y,
size_t z)
const
352 return m_data->begin() + (z * m_size.y + y) * m_size.x + x;
361 return m_data->end();
370 return m_data->begin();
400 return m_data->begin() + (z * m_size.y + y) * m_size.x + x;
409 return m_data->end();
423 assert(m_data.unique());
474 template <
typename Out>
477 const std::vector<T>& data = *m_data;
478 const int sizex = m_size.x;
480 if (x - 1 < m_size.x - 2 && y - 1 < m_size.y - 2 && z - 1 < m_size.z - 2) {
483 const T *H = &data[x + m_size.x * (y + m_size.y * z)];
486 Out((H[sizex] - H[-sizex]) * 0.5),
487 Out((H[m_xy] - H[-m_xy]) * 0.5));
495 template <
typename Out>
498 const int sizex = m_size.x;
500 const T *H = &(*m_data)[hardcode];
503 Out((H[sizex] - H[-sizex]) * 0.5),
504 Out((H[m_xy] - H[-m_xy]) * 0.5));
512 template <
typename Out>
517 return T3DVector<Out> (Out(((*m_data)[hardcode + 1] - (*m_data)[hardcode -1]) * 0.5),
518 Out(((*m_data)[hardcode + m_size.x] - (*m_data)[hardcode -m_size.x]) * 0.5),
519 Out(((*m_data)[hardcode + m_xy] - (*m_data)[hardcode -m_xy]) * 0.5));
523 template <
typename Out>
527 const int sizex = m_size.x;
528 const std::vector<T>& data = *m_data;
531 size_t x = size_t (p.
x);
534 size_t y = size_t (p.
y);
537 size_t z = size_t (p.
z);
542 if (x-1 < m_size.x-3 && y -1 < m_size.y-3 && z - 1 < m_size.z-3 ) {
544 const T *H000 = &data[x + sizex * y + m_xy * z];
546 const T* H_100 = &H000[-m_xy];
547 const T* H_101 = &H_100[1];
548 const T* H_110 = &H_100[sizex];
549 const T* H_111 = &H_110[1];
551 const T* H0_10 = &H000[-sizex];
552 const T* H0_11 = &H0_10[1];
554 const T* H00_1 = &H000[-1];
555 const T* H001 = &H000[ 1];
556 const T* H002 = &H000[ 2];
559 const T* H010 = &H000[sizex];
560 const T* H011 = &H010[ 1];
561 const T* H012 = &H010[ 2];
562 const T* H01_1 = &H010[-1];
564 const T* H020 = &H010[sizex];
565 const T* H021 = &H020[ 1];
567 const T* H100 = &H000[m_xy];
569 const T* H1_10 = &H100[sizex];
570 const T* H1_11 = &H1_10[1];
572 const T* H10_1 = &H100[-1];
573 const T* H101 = &H100[ 1];
574 const T* H102 = &H100[ 2];
576 const T* H110 = &H100[sizex];
577 const T* H111 = &H110[ 1];
578 const T* H112 = &H110[ 2];
579 const T* H11_1 = &H110[-1];
581 const T* H120 = &H110[sizex];
582 const T* H121 = &H120[ 1];
584 const T* H200 = &H100[m_xy];
585 const T* H201 = &H200[1];
586 const T* H210 = &H200[sizex];
587 const T* H211 = &H210[1];
591 Out((zm * (ym * (dx * (*H002 - *H000) + xm * (*H001 - *H00_1))+
592 dy * (dx * (*H012 - *H010) + xm * (*H011 - *H01_1)))+
593 dz * (ym * (dx * (*H102 - *H100) + xm * (*H101 - *H10_1))+
594 dy * (dx * (*H112 - *H110) + xm * (*H111 - *H11_1)))) * 0.5),
596 Out((zm * (ym * (xm * (*H010 - *H0_10) + dx * (*H011 - *H0_11))+
597 dy * (xm * (*H020 - *H000) + dx * (*H021 - *H001)))+
598 dz * (ym * (xm * (*H110 - *H1_10) + dx * (*H111 - *H1_11))+
599 dy * (xm * (*H120 - *H100) + dx * (*H121 - *H101)))) * 0.5),
600 Out((zm * (ym * (xm * (*H100 - *H_100) + dx * (*H101 - *H_101))+
601 dy * (xm * (*H110 - *H_110) + dx * (*H111 - *H_111)))+
602 dz * (ym * (xm * (*H200 - *H000) + dx * (*H201 - *H001))+
603 dy * (xm * (*H210 - *H010) + dx * (*H211 - *H011)))) * 0.5));