Q3D-Calibration/include/FileHandler.h

102 lines
2.3 KiB
C
Raw Normal View History

#pragma once
#ifndef file_handler_h
#define file_handler_h
#include "GaussFit.h"
#include <TH1F.h>
using std::string;
using std::to_string;
class FileHandler {
public:
FileHandler();
FileHandler(string, int n_ = 6, int thMin_ = 800, int thMax_ = 4000);
~FileHandler();
public:
int n = 6, m = 8;
int thMin, thMax, pX;
string file;
double adcValue[6][8][2];
TH1F Left[6][8];
TH1F Right[6][8];
public:
double getADC(TH1F hist);
void solve();
void save();
void save(string);
private:
void init();
};
FileHandler::FileHandler() {}
FileHandler::FileHandler(string file_, int n_, int thMin_, int thMax_) {
file = file_;
n = n_;
thMin = thMin_;
thMax = thMax_;
}
FileHandler::~FileHandler() {}
void FileHandler::init() {
string L, R;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
L = "Left" + to_string(i) + to_string(j);
R = "Right" + to_string(i) + to_string(j);
Left[i][j] = TH1F(L.c_str(), L.c_str(), CHANNEL_NUMBER, 0, CHANNEL_NUMBER);
Right[i][j] = TH1F(R.c_str(), R.c_str(), CHANNEL_NUMBER, 0, CHANNEL_NUMBER);
}
}
double FileHandler::getADC(TH1F hist) {
int n, cnt = 0;
double *parma = new double[3];
GaussFit GF = GaussFit();
for (int k = 10; k < CHANNEL_NUMBER; k++) {
n = hist.GetBinContent(k);
if (n == 0) continue;
GF.addData(hist.GetBinCenter(k), n);
}
parma = GF.fit();
if (DEBUG) GF.draw();
return parma[1];
}
void FileHandler::solve() {
init();
readROOTData(file.c_str(), Left, Right, n, m, thMin, thMax);
if (DEBUG)
std::cout << getADC(Left[3][2]) << std::endl;
else
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
adcValue[i][j][0] = getADC(Left[i][j]);
adcValue[i][j][1] = getADC(Right[i][j]);
}
}
void FileHandler::save() {
string path = rmString(file, ".root") + ".csv";
save(path);
}
void FileHandler::save(string path) {
std::ofstream ofs(path);
ofs << "pX,X4,Bind,Left,Right" << std::endl;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
ofs << pX << "," << i << "," << j << "," << adcValue[i][j][0] << ","
<< adcValue[i][j][1] << std::endl;
}
#endif