bsc-exc/exc2/Data.cc
2019-05-06 15:51:45 +02:00

81 lines
1.8 KiB
C++

#include "Data.hh"
#include <iostream>
#include <fstream>
#include <cassert>
using namespace std;
Data::Data(const std::string& filename) {
// read data from file
// return 1 if successful, 0 if otherwise
m_name = filename;
// open the file
ifstream file(filename);
// check if file opened correctly
if (!file.is_open()) {
throw "Error could not open file with name: " + filename;
}
int size = -1;
file >> size;
// read in data from file: m_siz+1 bin edges
for (int i = 0; i < size + 1; i++) {
double edge;
file >> edge;
m_bins.push_back(edge);
}
// read in data from file: m_siz bin contents
for (int i = 0; i < size; i++) {
double entries;
file >> entries;
m_data.push_back(entries);
}
for (int i = 0; i < size; i++) {
double uncertainty;
file >> uncertainty;
m_uncertainty.push_back(uncertainty);
}
// done! close the file
file.close();
};
int Data::checkCompatibility(const Data* in, int N) const {
assert(in->size() == size());
int fails = 0;
for (int i = 0; i < size(); i++) {
if (abs(in->measurement(i) - measurement(i)) > N * (in->uncertainty(i)
+ uncertainty(i))) {
fails++;
}
}
return fails;
}
Data operator+(const Data& a, const Data& b) {
assert(a.checkCompatibility(&b, 3) == 0);
vector<double> avg_y;
vector<double> avg_w;
for (unsigned int i = 0; i < a.size(); i++) {
double w1 = 1/(a.uncertainty(i) * a.uncertainty(i));
double w2 = 1/(b.uncertainty(i) * b.uncertainty(i));
avg_y.push_back((w1 * a.measurement(i) + w2 * b.measurement(i)) / (w1 + w2));
avg_w.push_back(sqrt(1/(w1 + w2)));
}
Data d;
d.m_bins = a.m_bins;
d.m_data = avg_y;
d.m_uncertainty = avg_w;
return d;
}
void Data::assertSizes() { assert(m_data.size() + 1 == m_bins.size()); }