Logo ROOT  
Reference Guide
tprofile2polyRealistic.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_hist
3/// \notebook
4/// Different charges depending on region
5///
6/// \macro_image
7/// \macro_code
8///
9/// \author Filip Ilic
10
11#include <iostream>
12#include <fstream>
13#include <TProfile2Poly.h>
14#include <TProfile2D.h>
15#include <TCanvas.h>
16#include <TRandom.h>
17
18using namespace std;
19
20void tprofile2polyRealistic(Int_t numEvents=100000)
21{
22 int NUM_LS = 8;
23 TCanvas *c1 = new TCanvas("c1", "moving charge", 900, 400);
24 TCanvas *c2 = new TCanvas("c2", "Merge Individual moving charge plots", 800, 400);
25
26 c1->Divide(NUM_LS, 3);
27 c2->Divide(3,1);
28
29 // -------------------- Construct Reference plot bins ------------------------
30 auto new_avg = new TProfile2Poly();
31
32 auto tot_avg_ls = new TProfile2Poly[NUM_LS];
33 auto det_avg_ls = new TProfile2Poly[NUM_LS];
34 auto det_err_ls = new TProfile2Poly[NUM_LS];
35 auto tot_merge = new TProfile2Poly();
36 auto det_avg_merge = new TProfile2Poly();
37 auto det_err_merge = new TProfile2Poly();
38
39 float minx = -15;
40 float maxx = 15;
41 float miny = -15;
42 float maxy = 15;
43 float binsz = 0.5;
44
45 for (float i = minx; i < maxx; i += binsz) {
46 for (float j = miny; j < maxy; j += binsz) {
47 tot_merge->AddBin(i, j, i + binsz, j + binsz);
48 for (int l=0; l<NUM_LS; ++l) {
49 tot_avg_ls[l].AddBin(i, j, i + binsz, j + binsz);
50 }
51 }
52 }
53
54 // -------------------- Construct detector bins ------------------------
55 auto h2p = new TH2Poly();
56 auto tp2p = new TProfile2Poly();
57 ifstream infile;
58 TString dir = gROOT->GetTutorialDir();
59 dir.Append("/hist/data/tprofile2poly_tutorial.data");
60 infile.open(dir.Data());
61
62 if (!infile) // Verify that the file was open successfully
63 {
64 std::cerr << dir.Data() << std::endl; // Report error
65 std::cerr << "Error code: " << strerror(errno) << std::endl; // Get some info as to why
66 return;
67 }
68 std::cout << " WE ARE AFTER LOADING DATA " << std::endl;
69
70 vector<pair<Double_t, Double_t>> allCoords;
71 Double_t a, b;
72 while (infile >> a >> b) {
73 pair<Double_t, Double_t> coord(a, b);
74 allCoords.push_back(coord);
75 }
76
77 if (allCoords.size() % 3 != 0) {
78 cout << "[ERROR] Bad file" << endl;
79 return;
80 }
81
82 Double_t x[3], y[3];
83 for (Int_t i = 0; i < allCoords.size(); i += 3) {
84 x[0] = allCoords[i + 0].first;
85 y[0] = allCoords[i + 0].second;
86 x[1] = allCoords[i + 1].first;
87 y[1] = allCoords[i + 1].second;
88 x[2] = allCoords[i + 2].first;
89 y[2] = allCoords[i + 2].second;
90
91 det_avg_merge->AddBin(3, x, y);
92 det_err_merge->AddBin(3, x, y);
93
94 for (int l=0; l<NUM_LS; ++l) {
95 det_avg_ls[l].AddBin(3, x, y);
96 det_err_ls[l].AddBin(3, x, y);
97 }
98 }
99
100 std::cout << " WE ARE AFTER ADDING BINS " << std::endl;
101
102 // -------------------- Simulate particles ------------------------
103 TRandom ran;
104
105 // moving error
106 Double_t xoffset1 = 0;
107 Double_t yoffset1 = 0;
108 Double_t xoffset2 = 0;
109 Double_t yoffset2 = 0;
110
111 for (int i = 0; i <= NUM_LS-1; ++i) { // LumiSection
112 std::cout << "[In Progress] LumiSection " << i << std::endl;
113 for (int j = 0; j < numEvents; ++j) { // Events
114 Double_t r1 = ran.Gaus(0, 10);
115 Double_t r2 = ran.Gaus(0, 8);
116 Double_t rok = ran.Gaus(10, 1);
117 Double_t rbad1 = ran.Gaus(8, 5);
118 Double_t rbad2 = ran.Gaus(-8, 5);
119
120 Double_t val = rok;
121
122 xoffset1 += 0.00002;
123 yoffset1 += 0.00002;
124
125 xoffset2 += 0.00003;
126 yoffset2 += 0.00004;
127
128 if (r2 > 3. - yoffset1 && r2 < 8. - yoffset1 &&
129 r1 > 1. + xoffset1 && r1 < 5. + xoffset1 ) {
130 val -= rbad1;
131 }
132
133 if (r2 > -10 + yoffset2 && r2 < -8 + yoffset2 &&
134 r1 > -6 + xoffset2 && r1 < 8 + xoffset2 ) {
135 val -= rbad2;
136 }
137
138 tot_avg_ls[i].Fill(r1, r2, val);
139 det_avg_ls[i].Fill(r1, r2, val);
140 det_err_ls[i].Fill(r1, r2, val);
141 }
142
143 std::string title;
144
145
146 c1->cd(i+1);
147 title = "Global View: Avg in LS " + to_string(i);
148 tot_avg_ls[i].SetTitle(title.c_str());
149 tot_avg_ls[i].SetStats(false);
150 tot_avg_ls[i].Draw("COLZ");
151 c1->Update();
152
153 c1->cd((i+1)+NUM_LS);
154 title = "Detector View: Avg in LS " + to_string(i);
155 det_avg_ls[i].SetTitle(title.c_str());
156 det_avg_ls[i].SetStats(false);
157 det_avg_ls[i].Draw("COLZ");
158 c1->Update();
159
160
161 c1->cd((i+1)+(NUM_LS*2));
162 title = "Detector View: Error in LS " + to_string(i);
163 det_err_ls[i].SetTitle(title.c_str());
164 det_err_ls[i].SetStats(false);
165 det_err_ls[i].SetContentToError();
166 det_err_ls[i].Draw("COLZ");
167 c1->Update();
168 }
169
170 std::vector<TProfile2Poly*> tot_avg_v;
171 std::vector<TProfile2Poly*> det_avg_v;
172 for (Int_t t=0; t<NUM_LS; t++){
173 tot_avg_v.push_back(&tot_avg_ls[t]);
174 det_avg_v.push_back(&det_avg_ls[t]);
175 }
176
177 std::cout << "[In Progress] Merging" << std::endl;
178
179 std::string title;
180
181 tot_merge->Merge(tot_avg_v);
182 c2->cd(1);
183 title = "Total average merge";
184 tot_merge->SetTitle(title.c_str());
185 tot_merge->Draw("COLZ");
186
187 det_avg_merge->Merge(det_avg_v);
188 c2->cd(2);
189 title = "Detector average merge";
190 det_avg_merge->SetTitle(title.c_str());
191 det_avg_merge->SetContentToAverage(); // implicit
192 det_avg_merge->Draw("COLZ");
193
194 det_err_merge->Merge(det_avg_v);
195 c2->cd(3);
196 title = "Detector error merge";
197 det_err_merge->SetTitle(title.c_str());
198 det_err_merge->SetContentToError();
199 det_err_merge->Draw("COLZ");
200}
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t b
#define gROOT
Definition: TROOT.h:404
The Canvas class.
Definition: TCanvas.h:23
2D Histogram with Polygonal Bins
Definition: TH2Poly.h:66
2D Profile Histogram with Polygonal Bins.
Definition: TProfile2Poly.h:58
This is the base class for the ROOT Random number generators.
Definition: TRandom.h:27
virtual Double_t Gaus(Double_t mean=0, Double_t sigma=1)
Samples a random number from the standard Normal (Gaussian) Distribution with the given mean and sigm...
Definition: TRandom.cxx:274
Basic string class.
Definition: TString.h:136
const char * Data() const
Definition: TString.h:369
TString & Append(const char *cs)
Definition: TString.h:564
Double_t y[n]
Definition: legend1.C:17
return c1
Definition: legend1.C:41
Double_t x[n]
Definition: legend1.C:17
return c2
Definition: legend2.C:14
auto * l
Definition: textangle.C:4
auto * a
Definition: textangle.C:12