-
Notifications
You must be signed in to change notification settings - Fork 0
/
histogrammer.C
99 lines (75 loc) · 2.37 KB
/
histogrammer.C
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
// Generate histogram from COMSOL electric field components
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <TH1D.h>
#include <TH2D.h>
#include <TFile.h>
#include <TTree.h>
#include <TCanvas.h>
void histogrammer() {
std::ifstream inFile("data/fieldcomp.txt");
if (!inFile.is_open()) {
std::cerr << "Unable to open file: do you have fieldcomp.txt in ./data?" << std::endl;
return;
}
// Define histograms
// 1D
TH1D *histX = new TH1D("histX", "Distribution of Ex", 100, 0, 80000);
TH1D *histY = new TH1D("histY", "Distribution of Ey", 100, 0, 80000);
TH1D *histZ = new TH1D("histZ", "Distribution of Ez", 100, 0, 80000);
TH1D *histNorm = new TH1D("histNorm", "Distribution of |E|", 100, 0, 240000);
// 2D
TH2D *histXY = new TH2D("histXY", "Distribution of Ex and Ey", 100, -8000, 8000, 100, -8000, 8000);
// Read data, discarding %comments
double x, y, z, Ex, Ey, Ez, normE;
std::string line;
while (std::getline(inFile, line)) {
if (line[0] == '%') continue;
std::istringstream ss(line);
if (ss >> x >> y >> z >> Ex >> Ey >> Ez >> normE) {
// only take points inside 1mm radius (where there should be uniformity)
// and only between the cathode and the anode
//if ((x*x + y*y) >= 1.0 && z <= 2.0 && z >= 45.155) {
if ((x*x + y*y) <= 1.0) {
histX->Fill(Ex);
histY->Fill(Ey);
histZ->Fill(Ez);
histNorm->Fill(normE);
histXY->Fill(Ex, Ey);
}
}
}
inFile.close();
// Create canvas, draw histograms
TCanvas *canvas1 = new TCanvas("canvas1", "Electric Field Distributions", 800, 600);
canvas1->Divide(3,1);
canvas1->cd(1);
histX->Draw();
canvas1->cd(2);
histY->Draw();
canvas1->cd(3);
histZ->Draw();
canvas1->SaveAs("histogram.pdf");
TCanvas *canvas2 = new TCanvas("canvas2", "Electric Field Distributions", 800, 600);
histXY->Draw("LEGO1");
// Save the canvas as an SVG file
canvas2->SaveAs("histogram2D.pdf");
TCanvas *canvas3 = new TCanvas("canvas3", "Electric Field Norm Distribution", 800, 600);
histNorm->Draw();
canvas3->SaveAs("histogramnorm.pdf");
delete histX;
delete histY;
delete histZ;
delete canvas1;
delete histXY;
delete canvas2;
delete histNorm;
delete canvas3;
}
// For compiling
int main() {
histogrammer();
return 0;
}