File: aphotaper.cpp

package info (click to toggle)
munipack 0.6.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 33,104 kB
  • sloc: cpp: 29,677; sh: 4,909; f90: 2,872; makefile: 278; python: 140; xml: 72; awk: 12
file content (106 lines) | stat: -rw-r--r-- 2,313 bytes parent folder | download | duplicates (3)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*

  Apertures for the display of the perture photometry tool

  Copyright © 2019 F.Hroch (hroch@physics.muni.cz)

  This file is part of Munipack.

  Munipack 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 3 of the License, or
  (at your option) any later version.

  Munipack 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 Munipack.  If not, see <http://www.gnu.org/licenses/>.

*/

#include "aphot.h"
#include <wx/wx.h>
#include <cmath>
#include <cfloat>

using namespace std;


MuniApertures::MuniApertures(int n, int rmax, bool s)
{
  wxASSERT(n > 0);

  naper = n;
  aper = new double[naper];
  spiral = s;

  if( spiral ) {
    const double pi = 3.1415926536;
    double pitch = log(rmax) / pi;
    for(int i = 0; i < naper; i++) {
      double theta = i / (naper - 1.0) * pi;
      aper[i] = exp(pitch*theta);
    }
  }
  else {
    double dr = (rmax - 1.0) / (naper - 1.0);
    for(int i = 0; i < naper; i++) {
      aper[i] = 1 + i*dr;
    }
  }
}

// copy constructor
MuniApertures::MuniApertures(const MuniApertures& orig):
  naper(orig.naper), aper(new double[naper]), spiral(orig.spiral)
{
  copy(orig.aper,orig.aper+naper,aper);
}

// assign constructor
MuniApertures& MuniApertures::operator=(const MuniApertures& other)
{
  if( this != &other ) {
    int n = other.naper;
    double *tmp = new double[n];
    copy(other.aper,other.aper+n,tmp);
    if( naper > 0 )
      delete[] aper;
    naper = n;
    aper = tmp;
    spiral = other.spiral;
  }
  return *this;
}


MuniApertures::~MuniApertures()
{
  delete[] aper;
}

double MuniApertures::GetAper(int i) const
{
  wxASSERT(1 <= i && i <= naper);
  return aper[i-1];
}

bool MuniApertures::FindAper(double r, int tol, int *n) const
{
  bool found = false;
  double rmin = 2*tol;

  for(int i = 0; i < naper; i++) {
    double d = abs(r - aper[i]);
    if( d < rmin ) {
      found = true;
      rmin = d;
      *n = i + 1;
    }
  }

  return found;
}