Xmipp  v3.23.11-Nereus
Public Member Functions | Static Public Member Functions | List of all members
ExtremaFinder::SingleExtremaFinder< T > Class Template Reference

#include <single_extrema_finder.h>

Inheritance diagram for ExtremaFinder::SingleExtremaFinder< T >:
Inheritance graph
[legend]
Collaboration diagram for ExtremaFinder::SingleExtremaFinder< T >:
Collaboration graph
[legend]

Public Member Functions

 SingleExtremaFinder ()
 
virtual ~SingleExtremaFinder ()
 
 SingleExtremaFinder (SingleExtremaFinder &o)=delete
 
SingleExtremaFinderoperator= (const SingleExtremaFinder &other)=delete
 
SingleExtremaFinder const & operator= (SingleExtremaFinder &&o)=delete
 
 SingleExtremaFinder (SingleExtremaFinder &&o)
 
template<typename KERNEL >
void findBasic (const T *__restrict__ data, const KERNEL &k)
 
- Public Member Functions inherited from ExtremaFinder::AExtremaFinder< T >
 AExtremaFinder ()
 
virtual ~AExtremaFinder ()
 
void init (const ExtremaFinderSettings &settings, bool reuse)
 
void find (const T *data)
 
HWgetHW () const
 
const ExtremaFinderSettingsgetSettings () const
 
const std::vector< T > & getValues () const
 
const std::vector< float > & getPositions () const
 

Static Public Member Functions

static void sFindMax (const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values)
 
static void sFindLowest (const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values)
 
template<typename C >
static void sFindUniversal2DAroundCenter (const C &comp, T startVal, const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values, size_t maxDist)
 
static void sFindMax2DAroundCenter (const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values, size_t maxDist)
 
static void sFindLowest2DAroundCenter (const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values, size_t maxDist)
 

Additional Inherited Members

- Protected Member Functions inherited from ExtremaFinder::AExtremaFinder< T >
std::vector< T > & getValues ()
 
std::vector< float > & getPositions ()
 
constexpr bool isInitialized () const
 

Detailed Description

template<typename T>
class ExtremaFinder::SingleExtremaFinder< T >

Definition at line 40 of file single_extrema_finder.h.

Constructor & Destructor Documentation

◆ SingleExtremaFinder() [1/3]

template<typename T>
ExtremaFinder::SingleExtremaFinder< T >::SingleExtremaFinder ( )
inline

Definition at line 42 of file single_extrema_finder.h.

42  {
43  setDefault();
44  }

◆ ~SingleExtremaFinder()

template<typename T>
virtual ExtremaFinder::SingleExtremaFinder< T >::~SingleExtremaFinder ( )
inlinevirtual

Definition at line 46 of file single_extrema_finder.h.

46  {
47  release();
48  }

◆ SingleExtremaFinder() [2/3]

template<typename T>
ExtremaFinder::SingleExtremaFinder< T >::SingleExtremaFinder ( SingleExtremaFinder< T > &  o)
delete

◆ SingleExtremaFinder() [3/3]

template<typename T>
ExtremaFinder::SingleExtremaFinder< T >::SingleExtremaFinder ( SingleExtremaFinder< T > &&  o)
inline

Definition at line 53 of file single_extrema_finder.h.

53  {
54  m_cpu = o.m_cpu;
55  // clean original
56  o.setDefault();
57  }

Member Function Documentation

◆ findBasic()

template<typename T>
template<typename KERNEL >
void ExtremaFinder::SingleExtremaFinder< T >::findBasic ( const T *__restrict__  data,
const KERNEL &  k 
)

Definition at line 155 of file single_extrema_finder.cpp.

155  {
156  bool isReady = this->isInitialized();
157  if ( ! isReady) {
158  REPORT_ERROR(ERR_LOGIC_ERROR, "Not ready to execute. Call init() first");
159  }
160  k(data);
161 }
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
constexpr bool isInitialized() const
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
Some logical error in the pipeline.
Definition: xmipp_error.h:147

◆ operator=() [1/2]

template<typename T>
SingleExtremaFinder& ExtremaFinder::SingleExtremaFinder< T >::operator= ( const SingleExtremaFinder< T > &  other)
delete

◆ operator=() [2/2]

template<typename T>
SingleExtremaFinder const& ExtremaFinder::SingleExtremaFinder< T >::operator= ( SingleExtremaFinder< T > &&  o)
delete

◆ sFindLowest()

template<typename T>
void ExtremaFinder::SingleExtremaFinder< T >::sFindLowest ( const CPU cpu,
const Dimensions dims,
const T *  data,
float *  positions,
T *  values 
)
static

Definition at line 199 of file single_extrema_finder.cpp.

203  {
204  sFindUniversalChecks(dims, data, positions, values);
205 
206  if (dims.isPadded()) {
207  REPORT_ERROR(ERR_NOT_IMPLEMENTED, "Not implemented");
208  } else {
209  // locate minima
210  for (size_t n = 0; n < dims.n(); ++n) {
211  auto start = data + (n * dims.sizeSingle());
212  auto max = std::min_element(start, start + dims.sizeSingle());
213  auto pos = std::distance(start, max);
214  values[n] = *max;
215  positions[n] = pos;
216  }
217  }
218 }
Case or algorithm not implemented yet.
Definition: xmipp_error.h:177
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
constexpr bool isPadded() const
Definition: dimensions.h:153
CUDA_HD constexpr size_t sizeSingle() const
Definition: dimensions.h:100
void max(Image< double > &op1, const Image< double > &op2)
CUDA_HD constexpr size_t n() const
Definition: dimensions.h:78
TYPE distance(struct Point_T *p, struct Point_T *q)
Definition: point.cpp:28
int * n

◆ sFindLowest2DAroundCenter()

template<typename T>
void ExtremaFinder::SingleExtremaFinder< T >::sFindLowest2DAroundCenter ( const CPU cpu,
const Dimensions dims,
const T *  data,
float *  positions,
T *  values,
size_t  maxDist 
)
static

Definition at line 234 of file single_extrema_finder.cpp.

240  {
241  sFindUniversal2DAroundCenter(std::less<T>(),
243  cpu, dims, data, positions, values, maxDist);
244 }
static void sFindUniversal2DAroundCenter(const C &comp, T startVal, const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values, size_t maxDist)
void max(Image< double > &op1, const Image< double > &op2)

◆ sFindMax()

template<typename T>
void ExtremaFinder::SingleExtremaFinder< T >::sFindMax ( const CPU cpu,
const Dimensions dims,
const T *  data,
float *  positions,
T *  values 
)
static

Definition at line 177 of file single_extrema_finder.cpp.

181  {
182  sFindUniversalChecks(dims, data, positions, values);
183 
184  if (dims.isPadded()) {
185  REPORT_ERROR(ERR_NOT_IMPLEMENTED, "Not implemented");
186  } else {
187  // locate max
188  for (size_t n = 0; n < dims.n(); ++n) {
189  auto start = data + (n * dims.sizeSingle());
190  auto max = std::max_element(start, start + dims.sizeSingle());
191  auto pos = std::distance(start, max);
192  values[n] = *max;
193  positions[n] = pos;
194  }
195  }
196 }
Case or algorithm not implemented yet.
Definition: xmipp_error.h:177
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
constexpr bool isPadded() const
Definition: dimensions.h:153
CUDA_HD constexpr size_t sizeSingle() const
Definition: dimensions.h:100
void max(Image< double > &op1, const Image< double > &op2)
CUDA_HD constexpr size_t n() const
Definition: dimensions.h:78
TYPE distance(struct Point_T *p, struct Point_T *q)
Definition: point.cpp:28
int * n

◆ sFindMax2DAroundCenter()

template<typename T>
void ExtremaFinder::SingleExtremaFinder< T >::sFindMax2DAroundCenter ( const CPU cpu,
const Dimensions dims,
const T *  data,
float *  positions,
T *  values,
size_t  maxDist 
)
static

Definition at line 221 of file single_extrema_finder.cpp.

227  {
228  sFindUniversal2DAroundCenter(std::greater<T>(),
229  std::numeric_limits<T>::lowest(),
230  cpu, dims, data, positions, values, maxDist);
231 }
static void sFindUniversal2DAroundCenter(const C &comp, T startVal, const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values, size_t maxDist)

◆ sFindUniversal2DAroundCenter()

template<typename T >
template<typename C >
void ExtremaFinder::SingleExtremaFinder< T >::sFindUniversal2DAroundCenter ( const C &  comp,
startVal,
const CPU cpu,
const Dimensions dims,
const T *  data,
float *  positions,
T *  values,
size_t  maxDist 
)
static

Definition at line 248 of file single_extrema_finder.cpp.

256  {
257  // check input
258  assert(dims.is2D());
259  assert( ! dims.isPadded());
260  assert(dims.sizeSingle() > 0);
261  assert(dims.n() > 0);
262  assert(nullptr != data);
263  assert((nullptr != positions) || (nullptr != values));
264  assert(0 < maxDist);
265  const size_t xHalf = dims.x() / 2;
266  const size_t yHalf = dims.y() / 2;
267  assert((2 * xHalf) > maxDist);
268  assert((2 * yHalf) > maxDist);
269 
270  const auto min = std::pair<size_t, size_t>(
271  std::max((size_t)0, xHalf - maxDist),
272  std::max((size_t)0, yHalf - maxDist)
273  );
274 
275  const auto max = std::pair<size_t, size_t>(
276  std::min(dims.x() - 1, xHalf + maxDist),
277  std::min(dims.y() - 1, yHalf + maxDist)
278  );
279 
280  const size_t maxDistSq = maxDist * maxDist;
281  for (size_t n = 0; n < dims.n(); ++n) {
282  size_t offsetN = n * dims.xyzPadded();
283  T extrema = startVal;
284  float pos = -1;
285  // iterate through the center
286  for (size_t y = min.second; y <= max.second; ++y) {
287  size_t offsetY = y * dims.x();
288  int logicY = (int)y - yHalf;
289  size_t ySq = logicY * logicY;
290  for (size_t x = min.first; x <= max.first; ++x) {
291  int logicX = (int)x - xHalf;
292  // continue if the Euclidean distance is too far
293  if ((ySq + (logicX * logicX)) > maxDistSq) continue;
294  // get current value and update, if necessary
295  T tmp = data[offsetN + offsetY + x];
296  if (comp(tmp, extrema)) {
297  extrema = tmp;
298  pos = offsetY + x;
299  }
300  }
301  }
302  // store results
303  if (nullptr != positions) {
304  positions[n] = pos;
305  }
306  if (nullptr != values) {
307  values[n] = extrema;
308  }
309  }
310 }
CUDA_HD constexpr bool is2D() const
Definition: dimensions.h:162
constexpr size_t xyzPadded() const
Definition: dimensions.h:95
void min(Image< double > &op1, const Image< double > &op2)
constexpr bool isPadded() const
Definition: dimensions.h:153
static double * y
doublereal * x
CUDA_HD constexpr size_t x() const
Definition: dimensions.h:51
CUDA_HD constexpr size_t sizeSingle() const
Definition: dimensions.h:100
void max(Image< double > &op1, const Image< double > &op2)
CUDA_HD constexpr size_t y() const
Definition: dimensions.h:60
CUDA_HD constexpr size_t n() const
Definition: dimensions.h:78
int * n

The documentation for this class was generated from the following files: