-
Notifications
You must be signed in to change notification settings - Fork 0
/
bascfunc.cpp
130 lines (105 loc) · 3.29 KB
/
bascfunc.cpp
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <vector>
#include <iostream>
#include <fstream>
#include <cmath>
#include "include/rainfall.hpp"
using namespace std;
double *dmap;
double *dbeam;
uint32_t naxis1;
uint32_t beamnaxis1;
uint32_t cra, cdec;
double noiseLevel;
inline uint32_t coords(uint32_t ra, uint32_t dec, uint32_t naxis) {
return naxis*dec + ra;
}
double getNoise() {
double mean, stdev;
mean = 0;
for (auto index=0;index<naxis1*naxis1;index++) {
mean+=dmap[index];
}
mean /= (naxis1*naxis1);
stdev = 0;
for (auto index=0;index<naxis1*naxis1;index++) {
stdev+=(dmap[index]-mean)*(dmap[index]-mean);
}
stdev /= (naxis1*naxis1)-1;
return sqrt(stdev);
}
double log_likelihood(atom *params, uint8_t natoms) {
double result = 0;
for (auto i=0;i<natoms;i++) {
uint32_t rabin_i = params[i].getParameter(0)*naxis1;
uint32_t decbin_i = params[i].getParameter(1)*naxis1;
double flux_i = params[i].getParameter(2);
flux_i = noiseLevel*(flux_i/(1.-flux_i));
result -= 2. * flux_i * dmap[coords(rabin_i, decbin_i,naxis1)];
for (auto j=0;j<natoms;j++) {
uint32_t dra = cra - (params[j].getParameter(0)*naxis1-rabin_i);
uint32_t ddec = cdec - (params[j].getParameter(1)*naxis1-decbin_i);
double flux_j = params[j].getParameter(2);
flux_j = noiseLevel*(flux_j/(1.-flux_j));
result += flux_i * flux_j * dbeam[coords(dra, ddec,beamnaxis1)];
}
}
return -0.5*result/(noiseLevel*noiseLevel);
}
class bascfunc : public procQueue {
vector <unity> x,y,F;
public:
bascfunc() {
fstream inputfile;
naxis1 = 1024;
beamnaxis1 = 1024;
cra = 512;
cdec = 512;
dmap = new double[naxis1*naxis1];
dbeam = new double[naxis1*naxis1*4];
inputfile.open("ex_image.txt");
for (auto ra=0;ra<naxis1;ra++) {
for (auto dec=0;dec<naxis1;dec++) {
inputfile >> dmap[coords(ra,dec,naxis1)];
}
}
inputfile.close();
inputfile.open("ex_psf.txt");
for (auto ra=0;ra<beamnaxis1;ra++) {
for (auto dec=0;dec<beamnaxis1;dec++) {
inputfile >> dbeam[coords(ra,dec,beamnaxis1)];
}
}
inputfile.close();
noiseLevel = getNoise();
cout << "Noise Level: " << noiseLevel << endl;
}
void clear() {
indices.push_back(bufferSize);
for (auto i=0;i<indices.size()-1;i++) {
uint32_t start = indices[i];
uint32_t length = indices[i+1]-start;
*result[i] = log_likelihood(&buffer[start], length);
}
}
void tick(model *m) {
x.push_back(m->getAtom(0)->getUnity(0));
y.push_back(m->getAtom(0)->getUnity(1));
F.push_back(m->getAtom(0)->getUnity(2));
}
~bascfunc() {
double meanf, upper, lower, stdf;
cout << "x: " << meanvalue(x)*naxis1 << " +- " << stdev(x)*naxis1 << endl;
cout << "y: " << meanvalue(y)*naxis1 << " +- " << stdev(y)*naxis1 << endl;
meanf = meanvalue(F);
meanf = noiseLevel*(meanf/(1.-meanf));
upper = meanvalue(F)+stdev(F);
lower = upper - 2*stdev(F);
upper = noiseLevel*(upper/(1.-upper));
lower = noiseLevel*(lower/(1.-lower));
stdf = 0.5*(upper-lower);
cout << "F: " << meanf << " +- " << stdf << endl;
delete[] dmap;
delete[] dbeam;
}
};
bascfunc *evaluator = new bascfunc;