Belle II Software  release-05-01-25
EclPainterPolar.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2015 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Mikhail Remnev, Dmitry Matvienko *
7  * *
8  * This software is provided "as is" without any warranty. *
9  ***************************************************************************/
10 //This module
11 #include <ecl/modules/eclDisplay/EclPainterPolar.h>
12 
13 //Root
14 #include <TMath.h>
15 #include <TColor.h>
16 #include <TH2.h>
17 #include <TCrown.h>
18 #include <TText.h>
19 
20 //ECL
21 #include <ecl/modules/eclDisplay/geometry.h>
22 
23 
24 using namespace Belle2;
25 using namespace ECLDisplayUtility;
26 
28  EclPainter(data)
29 {
30  m_type = type;
31 
32  char obj_name[255];
33  getNewRootObjectName(obj_name, 255);
34  m_hist = new TH2F(obj_name, "title",
35  60, 0.0, 1.0, 60, 0.0, 1.0);
36 
37  Double_t deg2rad = TMath::Pi() / 180;
38 
39  m_segs = new TCrown*[36];
40  m_labels = new TText*[36];
41  char label_txt[32];
42  for (int i = 0; i < 36; i++) {
43  m_segs[i] = new TCrown(0.5, 0.5, 0.3, 0.4, (i - 9) * 10, (i - 8) * 10);
44 
45  float x = 0.475 + 0.45 * TMath::Cos(deg2rad * (i - 9) * 10);
46  float y = 0.48 + 0.44 * TMath::Sin(deg2rad * (i - 9) * 10);
47  snprintf(label_txt, 32, "%d", i * 10);
48  m_labels[i] = new TText(x, y, label_txt);
49  m_labels[i]->SetTextSize(0.03);
50  }
51 }
52 
54 {
55  delete m_hist;
56 }
57 
59 {
60  m_type = other.m_type;
61  m_hist = new TH2F(*other.m_hist);
62  m_segs = new TCrown*[36];
63  for (int i = 0; i < 36; i++) { m_segs[i] = other.m_segs[i]; }
64  m_labels = new TText*[36];
65  for (int i = 0; i < 36; i++) { m_labels[i] = other.m_labels[i]; }
66 }
67 
69 {
70  if (m_type == PHI)
71  return getData()->getPhiId(ch) / 4;
72  else if (m_type == THETA) {
73  int theta_id = getData()->getThetaId(ch);
74 
75  if (theta_id < 23)
76  return 3 + theta_id * 12 / 23;
77  else
78  return 21 + (theta_id - 23) * 12 / 23;
79  }
80 
81  return 0;
82 }
83 
85 {
86  const char* name[2][2] = {
87  {"Events per phi", "Events per theta"},
88  {"Energy per phi", "Energy per theta"}
89  };
90  const char* zname[2] = {"Event count", "Energy (MeV)"};
91 
92  TString title = TString(name[GetMode()][m_type]) + " (" +
94 
95  m_hist->SetTitle(title);
96  m_hist->SetZTitle(zname[GetMode()]);
97  m_hist->GetZaxis()->CenterTitle();
98 }
99 
101 {
102  EclPainter::getInformation(px, py, panel);
103 }
104 
106 {
107  return m_type;
108 }
109 
111 {
112  setTitles();
113 
114  EclData* data = getData();
115  const int* ev_counts = data->getEventCounts();
116  const float* energy_sums = data->getEnergySums();
117 
118  float seg_val[36];
119  TCrown** segs = m_segs;
120  for (int i = 0; i < 36; i++)
121  seg_val[i] = 0;
122 
123  for (int i = 1; i <= getData()->getCrystalCount(); i++) {
124  if (!data->isCrystalInSubsystem(i, getDisplayedSubsystem())) continue;
125  int id = channelToSegId(i);
126  if (GetMode())
127  seg_val[id] += energy_sums[i];
128  else
129  seg_val[id] += ev_counts[i];
130  }
131 
132  float max = 0;
133  float min = seg_val[0];
134  for (int i = 0; i < 36; i++) {
135  if (max < seg_val[i])
136  max = seg_val[i];
137  if (min > seg_val[i])
138  min = seg_val[i];
139  }
140 
141  Double_t r[5] = { 0.00, 0.00, 0.87, 1.00, 0.51 };
142  Double_t g[5] = { 0.00, 0.81, 1.00, 0.20, 0.00 };
143  Double_t b[5] = { 0.51, 1.00, 0.12, 0.00, 0.00 };
144  Double_t stop[5] = { 0.00, 0.34, 0.61, 0.84, 1.00 };
145 
146  int palette = TColor::CreateGradientColorTable(5, stop, r, g, b, 37);
147  m_hist->Reset();
148  m_hist->Fill(0.5, 0.05, 0.1);
149  m_hist->SetMaximum(max);
150  m_hist->SetMinimum(min);
151  m_hist->Draw("COLZ");
152 
153  for (int i = 0; i < 36; i++) {
154  float val = 36.0 * TMath::Log(1 + seg_val[i]) / TMath::Log(1 + max);
155  segs[i]->SetFillColor(palette + val);
156  segs[i]->Draw(/*"SAME"*/);
157  m_labels[i]->Draw();
158  }
159 }
Belle2::EclPainterPolar::cloneFrom
void cloneFrom(const EclPainterPolar &other)
Clone attributes from other EclPainterPolar.
Definition: EclPainterPolar.cc:58
Belle2::EclPainterPolar::m_hist
TH2F * m_hist
Histogram that generates Z-axis.
Definition: EclPainterPolar.h:53
Belle2::EclPainterPolar::setTitles
void setTitles()
Update titles of the histogram.
Definition: EclPainterPolar.cc:84
Belle2::EclPainter::getData
EclData * getData()
Return currently displayed EclData.
Definition: EclPainter.h:48
Belle2::EclPainterPolar
Painter for EclData, polar energy/event_count distribution.
Definition: EclPainterPolar.h:28
Belle2::EclPainter::getDisplayedSubsystem
EclData::EclSubsystem getDisplayedSubsystem()
Get currently displayed ECL subsystem.
Definition: EclPainter.cc:52
Belle2::EclPainterPolar::m_segs
TCrown ** m_segs
Phi (or theta) segments of the ECL.
Definition: EclPainterPolar.h:55
Belle2::EclData::getPhiId
int getPhiId(int ch)
ECL CellId -> phi_id.
Definition: EclData.cc:278
Belle2::EclPainter::getInformation
virtual void getInformation(int px, int py, MultilineWidget *panel)
Sets the information to be displayed in the provided MultilineWidget.
Definition: EclPainter.cc:73
Belle2::EclPainter
Painter for EclData, parent class, created with EclPainterFactory.
Definition: EclPainter.h:31
Belle2::EclPainterPolar::Draw
virtual void Draw() override
Redraw the canvas.
Definition: EclPainterPolar.cc:110
Belle2::EclPainterPolar::getInformation
virtual void getInformation(int px, int py, MultilineWidget *panel) override
Sets the information to be displayed in the provided MultilineWidget.
Definition: EclPainterPolar.cc:100
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::EclPainter::getNewRootObjectName
void getNewRootObjectName(char *buf, int size)
Make unique name for next root object.
Definition: EclPainter.cc:89
Belle2::MultilineWidget
Widget which contains the dynamic amount of TGLabel objects.
Definition: MultilineWidget.h:32
Belle2::EclPainterPolar::EclPainterPolar
EclPainterPolar(EclData *data, Type type)
Constructor for EclPainter subclass.
Definition: EclPainterPolar.cc:27
Belle2::EclData::getCrystalCount
static int getCrystalCount()
Get number of crystals in ECL.
Definition: EclData.cc:148
Belle2::EclPainterPolar::~EclPainterPolar
~EclPainterPolar()
Destructor for EclPainter subclass.
Definition: EclPainterPolar.cc:53
Belle2::EclPainterPolar::m_labels
TText ** m_labels
Labels for phi segments.
Definition: EclPainterPolar.h:57
Belle2::EclPainter::getSubsystemTitle
TString getSubsystemTitle(EclData::EclSubsystem subsys)
Return title of ECL subsystem to use in painter.
Definition: EclPainter.cc:57
Belle2::EclData::getThetaId
int getThetaId(int ch)
ECL CellId -> theta_id.
Definition: EclData.cc:288
Belle2::EclData
This class contains data for ECLSimHit's and provides several relevant conversion functions for bette...
Definition: EclData.h:41
Belle2::EclPainterPolar::m_type
Type m_type
Type for polar histogram.
Definition: EclPainterPolar.h:51
Belle2::EclPainterPolar::getType
Type getType()
Return subtype of ECLPainterPolar.
Definition: EclPainterPolar.cc:105
Belle2::EclPainterPolar::Type
Type
Type for polar histogram.
Definition: EclPainterPolar.h:33
Belle2::EclPainterPolar::channelToSegId
int channelToSegId(int channel)
Convert ECL channel id to id of the phi (theta) segment.
Definition: EclPainterPolar.cc:68