forked from LeviBarnes/GPUMultiscaleCLEAN
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMultiScaleGolden.h
More file actions
83 lines (73 loc) · 3.52 KB
/
MultiScaleGolden.h
File metadata and controls
83 lines (73 loc) · 3.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/// @copyright (c) 2011 CSIRO
/// Australia Telescope National Facility (ATNF)
/// Commonwealth Scientific and Industrial Research Organisation (CSIRO)
/// PO Box 76, Epping NSW 1710, Australia
/// atnf-enquiries@csiro.au
///
/// The ASKAP software distribution is free software: you can redistribute it
/// and/or modify it under the terms of the GNU General Public License as
/// published by the Free Software Foundation; either version 2 of the License,
/// or (at your option) any later version.
///
/// This program is distributed in the hope that it will be useful,
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
/// GNU General Public License for more details.
///
/// You should have received a copy of the GNU General Public License
/// along with this program; if not, write to the Free Software
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
///
/// @author Ben Humphreys <ben.humphreys@csiro.au>
#ifndef MULTISCALE_GOLDEN_H
#define MULTISCALE_GOLDEN_H
// System includes
#include <vector>
#include <cstddef>
class MultiScaleGolden {
public:
MultiScaleGolden(size_t n_scale_in);
/// Executes the MultiScale Clean
///
/// @param[in] dirty a vector containing the dirty image to be cleaned
/// @param[in] dirtyWidth the width of the dirty image in pixels (it has to be
/// square so this is also the height)
/// @param[in] psf a vector containing the PSF
/// @param[in] psfWidth the width of the PSF image in pixels (it has to be
/// square so this is also the height)
/// @param[inout] model the image to which model componenets will be added.
/// @param[out] residual the residual image.
void deconvolve(const std::vector<float>& dirty,
const size_t dirtyWidth,
const std::vector<float>* psf,
const size_t psfWidth,
const std::vector<float>* cross,
const size_t crossWidth,
std::vector<float>& model,
std::vector<float>* residual);
private:
size_t n_scale;
// Represents a pixel position as x and y coordinates
struct Position {
Position(int _x, int _y) : x(_x), y(_y) { };
int x;
int y;
};
// Finds the peak position and the value at the peak position
// in an STL vector.
static void findPeak(const std::vector<float>& image,
float& maxVal, size_t& maxPos);
// Subtracts the PSF from the residual image with PSF pixel "psfPeakPos"
// aligned with residual pixel "peakPos"
static void subtractPSF(const std::vector<float>& psf,
const size_t psfWidth,
std::vector<float>& residual,
const size_t residualWidth,
const size_t peakPos, const size_t psfPeakPos,
const float absPeakVal, const float gain);
// Converts a 1D array index to a 2D position.
static Position idxToPos(const int idx, const size_t width);
// Converts a 2D position to a 1D array index
static size_t posToIdx(const size_t width, const Position& pos);
};
#endif