STIR 6.4.0
find_fwhm_in_image.inl
Go to the documentation of this file.
1//
2//
3/*
4 Copyright (C) 2004- 2009, Hammersmith Imanet
5 This file is part of STIR.
6
7 SPDX-License-Identifier: Apache-2.0
8
9 See STIR/LICENSE.txt for details
10*/
21#include <algorithm>
22#include "stir/warning.h"
23
24START_NAMESPACE_STIR
25
26template <class RandomAccessIterType>
27float
28find_level_width(const RandomAccessIterType& begin_iterator,
29 const RandomAccessIterType& current_max_iterator,
30 const RandomAccessIterType& end_iterator,
31 const float level_height)
32{
33 const int max_position = static_cast<int>(current_max_iterator - begin_iterator + 1);
34 RandomAccessIterType current_iter = current_max_iterator;
35 while (current_iter != end_iterator && *current_iter > level_height)
36 ++current_iter;
37 if (current_iter == end_iterator)
38 {
39 warning("find_level_width: level extends beyond border."
40 "Cannot find the real level-width of this point source!");
41 // go 1 back to remain inside the range
42 --current_iter;
43 }
44
45 // do linear interpolation to find position of level_height
46 float right_level_max = (*current_iter - level_height) / (*current_iter - *(current_iter - 1));
47 right_level_max = float(current_iter - (begin_iterator + max_position)) - right_level_max;
48
49 current_iter = current_max_iterator;
50 while (current_iter != begin_iterator && *current_iter > level_height)
51 --current_iter;
52 if (current_iter == begin_iterator && *current_iter > level_height)
53 {
54 warning("find_level_width: level extends beyond border."
55 "Cannot find the real level-width of this point source!");
56 }
57
58 float left_level_max = (*current_iter - level_height) / (*current_iter - *(current_iter + 1));
59 left_level_max += float(current_iter - (begin_iterator + max_position));
60
61 return right_level_max - left_level_max;
62}
63
64template <class RandomAccessIterType>
65float
66find_level_width(const RandomAccessIterType& begin_iterator, const RandomAccessIterType& end_iterator, const float level_height)
67{
68 return find_level_width(begin_iterator, std::max_element(begin_iterator, end_iterator), end_iterator, level_height);
69}
70END_NAMESPACE_STIR
void warning(const char *const s,...)
Print warning with format string a la printf.
Definition warning.cxx:41
float find_level_width(const RandomAccessIterType &begin_iterator, const RandomAccessIterType &max_iterator, const RandomAccessIterType &end_iterator, const float level_height)
find width at a level
Definition find_fwhm_in_image.inl:28
Declaration of stir::warning()