11 #include <arich/utility/ARICHChannelHist.h>
12 #include <framework/logging/Logger.h>
23 ARICHChannelHist::ARICHChannelHist(
const char* name,
const char* title,
int type,
24 const std::vector<unsigned>& moduleIDs) : TH2Poly()
33 double rs[7] = {57.35, 65.81, 74.37, 82.868, 91.305, 99.794, 108.185};
34 unsigned nhapds[7] = {42, 48, 54, 60, 66, 72, 78};
35 unsigned chmap[144] = {88, 86, 96, 87, 75, 72, 97, 108, 73, 74, 98, 109, 84, 85, 120, 110, 76, 77, 132, 121, 136, 124, 99, 133, 125, 113, 122, 111, 101, 137, 134, 123, 89, 112, 100, 135, 52, 28, 3, 40, 41, 5, 15, 2, 17, 29, 27, 14, 4, 16, 1, 26, 53, 65, 0, 13, 48, 49, 39, 12, 61, 62, 25, 38, 63, 60, 24, 37, 64, 50, 51, 36, 91, 115, 140, 103, 102, 138, 128, 141, 126, 114, 116, 129, 139, 127, 142, 117, 90, 78, 143, 130, 95, 94, 104, 131, 82, 81, 118, 105, 80, 83, 119, 106, 79, 93, 92, 107, 55, 57, 47, 56, 68, 71, 46, 35, 70, 69, 45, 34, 59, 58, 23, 33, 67, 66, 11, 22, 7, 19, 44, 10, 18, 30, 21, 32, 42, 6, 9, 20, 54, 31, 43, 8};
36 double chns[12] = { -2.88, -2.37, -1.86, -1.35, -0.84, -0.33, 0.33, 0.84, 1.35, 1.86, 2.37, 2.88};
38 float size = 0.5 / 2. - 0.01;
39 if (
m_type == 1) size = 7.0 / 2. - 0.5;
40 if (
m_type == 2) size = 3.3 / 2.;
42 float X[5], Y[5], globX[5], globY[5];
43 X[0] = -size; Y[0] = -size;
44 X[1] = size; Y[1] = -size;
45 X[2] = size; Y[2] = size;
46 X[3] = -size; Y[3] = size;
47 X[4] = -size; Y[4] = -size;
53 std::vector<unsigned> ids;
54 if (moduleIDs.size() > 0) ids = moduleIDs;
56 for (
int hapdID = 1; hapdID < 421; hapdID++) {
57 ids.push_back(hapdID);
63 for (
int hapdID = 1; hapdID < 421; hapdID++) {
68 float dphi = 2.*M_PI / nhapds[iring];
69 float fi = dphi / 2. + ihapd * dphi;
70 TVector2 centerPos(r * cos(fi), r * sin(fi));
71 for (
int i = 0; i < 5; i++) {
72 float rotX = X[i] * cos(fi) - Y[i] * sin(fi);
73 float rotY = X[i] * sin(fi) + Y[i] * cos(fi);
74 globX[i] = rotX + centerPos.X();
75 globY[i] = rotY + centerPos.Y();
77 if (std::find(ids.begin(), ids.end(), hapdID) != ids.end()) {
80 TGraph* mybox =
new TGraph(5, globX, globY);
81 mybox->SetName((to_string(hapdID)).c_str());
85 if (ihapd == nhapds[iring]) { iring++; ihapd = 0;}
89 for (
int hapdID = 1; hapdID < 421; hapdID++) {
93 float dphi = 2.*M_PI / nhapds[iring];
94 float fi = dphi / 2. + ihapd * dphi;
96 for (
int chID = 0; chID < 144; chID++) {
98 unsigned chX = chmap[chID] % 12;
99 unsigned chY = chmap[chID] / 12;
100 TVector2 hapdPos(r * cos(fi), r * sin(fi));
101 TVector2 locPos(chns[chX], chns[chY]);
102 TVector2 centerPos = hapdPos + locPos.Rotate(fi);
104 for (
int i = 0; i < 5; i++) {
105 float rotX = X[i] * cos(fi) - Y[i] * sin(fi);
106 float rotY = X[i] * sin(fi) + Y[i] * cos(fi);
107 globX[i] = rotX + centerPos.X();
108 globY[i] = rotY + centerPos.Y();
110 if (std::find(ids.begin(), ids.end(), hapdID) != ids.end()) {
112 if (chID == 143) nhapd++;
113 TGraph* mybox =
new TGraph(5, globX, globY);
114 mybox->SetName((to_string(hapdID)).c_str());
119 if (ihapd == nhapds[iring]) { iring++; ihapd = 0;}
123 for (
int hapdID = 1; hapdID < 421; hapdID++) {
124 float dphi = 2.*M_PI / nhapds[iring];
125 float fi = dphi / 2. + ihapd * dphi;
127 TVector2 hapdPos(r * cos(fi), r * sin(fi));
128 for (
int chipID = 0; chipID < 4; chipID++) {
129 TVector2 locPos(-size + (chipID / 2)*size * 2, size - (chipID % 2)*size * 2);
130 TVector2 centerPos = hapdPos + locPos.Rotate(fi);
132 for (
int i = 0; i < 5; i++) {
133 float rotX = X[i] * cos(fi) - Y[i] * sin(fi);
134 float rotY = X[i] * sin(fi) + Y[i] * cos(fi);
135 globX[i] = rotX + centerPos.X();
136 globY[i] = rotY + centerPos.Y();
139 if (std::find(ids.begin(), ids.end(), hapdID) != ids.end()) {
141 if (chipID == 3) nhapd++;
142 TGraph* mybox =
new TGraph(5, globX, globY);
143 mybox->SetName((to_string(hapdID)).c_str());
148 if (ihapd == nhapds[iring]) { iring++; ihapd = 0;}
150 }
else std::cout <<
"Invalid histogram type! use 0 for channel bins or 1 for HAPD bins" << std::endl;
153 GetXaxis()->SetLimits(-115., 115.);
154 GetYaxis()->SetLimits(-115., 115.);
159 TH2Poly::Draw(option);
162 for (
int isec = 0; isec < 6; isec++) {
163 double x1 = rlin * cos(M_PI / 3.*isec);
164 double x2 = rlout * cos(M_PI / 3.*isec);
165 double y1 = rlin * sin(M_PI / 3.*isec);
166 double y2 = rlout * sin(M_PI / 3.*isec);
167 lines[isec] = TLine(x1, y1, x2, y2);
169 x1 = rlin * cos(M_PI / 3.*isec + M_PI / 6.);
170 y1 = rlin * sin(M_PI / 3.*isec + M_PI / 6.);
171 labels[isec] = TText(x1, y1, TString::Format(
"S-%d", isec + 1));
172 labels[isec].SetTextAlign(22);
173 labels[isec].SetTextSize(0.03);
181 unsigned chIndex = 0;
184 SetBinContent(chIndex, GetBinContent(chIndex) + weight);
189 unsigned chIndex = 0;
192 SetBinContent(chIndex, value);
202 SetBinContent(
m_hapd2binMap[hapdID - 1], GetBinContent(hapdID) + weight);
208 int nbins = hist->GetNbinsX();
210 if (nbins < 420) { B2ERROR(
"Number of bins in histogram small than number of ChannelHist bins!");
return;}
211 if (nbins == 420)
for (
int i = 0; i < nbins; i++)
setBinContent(i + 1, hist->GetBinContent(i + 1));
212 if (nbins == 420 * 4) {
213 for (
int i = 0; i < 420; i++) {
214 for (
int j = 0; j < 4; j++)
fillBin(i + 1, hist->GetBinContent(i * 4 + j + 1));
217 if (nbins == 420 * 144) {
218 for (
int i = 0; i < 420; i++) {
219 for (
int j = 0; j < 144; j++)
fillBin(i + 1, hist->GetBinContent(i * 144 + j + 1));
223 if (nbins < 420 * 144) { B2ERROR(
"Number of bins in histogram small than number of ChannelHist bins!");
return;}
224 for (
int i = 0; i < 420; i++) {
225 for (
int j = 0; j < 144; j++)
setBinContent(i + 1, j, hist->GetBinContent(i * 144 + j + 1));
228 if (nbins < 420 * 4) { B2ERROR(
"Number of bins in histogram small than number of ChannelHist bins!");
return;}
229 if (nbins == 420 * 4)
for (
int i = 0; i < nbins; i++)
setBinContent(i / 4 + 1, i % 4, hist->GetBinContent(i + 1));
230 if (nbins == 420 * 144) {
231 for (
int i = 0; i < 420; i++) {
232 for (
int j = 0; j < 144; j++)
fillBin(i + 1, j / 36, hist->GetBinContent(i * 144 + j + 1));
241 if (poly->GetNumberOfBins() == 0) {
242 for (
const auto && bin : *fBins) {
243 poly->AddBin((TGraph*)((TH2PolyBin*)bin)->GetPolygon());
246 if (poly->GetNumberOfBins() != GetNumberOfBins()) {std::cout <<
"Mismatch between number of bins in TH2Poly and ARICHChannelHist" << std::endl;
return;}
248 double max = poly->GetMaximum();
249 for (
int i = 1; i < GetNumberOfBins() + 1; i++) {
250 poly->SetBinContent(i, GetBinContent(i) > max ? max : GetBinContent(i));