Project
Loading...
Searching...
No Matches
DCSPTemperature.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12// root includes
13#include "TStyle.h"
14#include "TCanvas.h"
15#include "TGraph.h"
16#include "TAxis.h"
17#include "TMultiGraph.h"
18#include "TLegend.h"
19
20// o2 includes
22#include "DataFormatsTPC/DCS.h"
23
24#include <fmt/format.h>
25
27
28using namespace o2::tpc::qc;
29
31{
32 while (mCanVec.size()) {
33 delete mCanVec.back();
34 mCanVec.pop_back();
35 }
36}
37
39{
40 gStyle->SetPalette(kRainBow);
41 gStyle->SetTitleSize(0.05, "XY");
42 gStyle->SetTitleOffset(1.05, "XY");
43
44 auto cStats = new TCanvas("c_temperature_stats", "c_temperature_stats", 1000, 1000);
45 auto cSensorsMultiGraph = new TCanvas("c_temperature_sensors", "c_temperature_sensors", 1000, 1000);
46
47 mCanVec.emplace_back(cStats);
48 mCanVec.emplace_back(cSensorsMultiGraph);
49
50 gStyle->SetTimeOffset(0);
51}
52
53void DCSPTemperature::processData(const std::vector<std::unique_ptr<o2::tpc::dcs::Temperature>>& data)
54{
55 int nPointA = 0;
56 int nPointC = 0;
57 int sensorCounter = 0;
58
59 auto grM = new TMultiGraph;
60 std::vector<TGraph*> grVec; // one graph per sensor
61 auto grStatsAMean = new TGraph;
62 auto grStatsAGradX = new TGraph;
63 auto grStatsAGradY = new TGraph;
64 auto grStatsCMean = new TGraph;
65 auto grStatsCGradX = new TGraph;
66 auto grStatsCGradY = new TGraph;
67
68 std::vector<int> pointCountersSensors;
69
70 for (int i = 0; i < 18; i++) {
71 pointCountersSensors.emplace_back(0);
72 grVec.emplace_back(new TGraph);
73 grVec.back()->SetNameTitle(fmt::format("tempSensor{}", i + 1).data(), fmt::format("Temperature Sensor {};;T (K)", i + 1).data());
74 grVec.back()->GetXaxis()->SetTimeDisplay(1);
75 grVec.back()->GetXaxis()->SetTimeFormat("#splitline{%d.%m.%y}{%H:%M:%S}");
76 grVec.back()->SetMarkerStyle(20);
77 }
78
79 for (const auto& t : data) {
80 sensorCounter = 0;
81 for (const auto sensor : t->raw) {
82 for (const auto& value : sensor.data) {
83 grVec.at(sensorCounter)->SetPoint(pointCountersSensors.at(sensorCounter), double(value.time) / 1000., value.value);
84 pointCountersSensors.at(sensorCounter)++;
85 }
86 sensorCounter++;
87 }
88 for (const auto& value : t->statsA.data) {
89 grStatsAMean->SetPoint(nPointA, double(value.time) / 1000., value.value.mean);
90 grStatsAGradX->SetPoint(nPointA, double(value.time) / 1000., value.value.gradX);
91 grStatsAGradY->SetPoint(nPointA, double(value.time) / 1000., value.value.gradY);
92 nPointA++;
93 }
94 for (const auto& value : t->statsC.data) {
95 grStatsCMean->SetPoint(nPointC, double(value.time) / 1000., value.value.mean);
96 grStatsCGradX->SetPoint(nPointC, double(value.time) / 1000., value.value.gradX);
97 grStatsCGradY->SetPoint(nPointC, double(value.time) / 1000., value.value.gradY);
98 nPointC++;
99 }
100 }
101
102 for (auto& gr : grVec) {
103 gr->Sort();
104 grM->Add(gr);
105 }
106
107 mCanVec.at(0)->Divide(2, 3);
108
109 grStatsAMean->SetTitle("Temperature mean (A-side);;T (K)");
110 grStatsAMean->SetMarkerStyle(20);
111 grStatsAMean->GetXaxis()->SetTimeDisplay(1);
112 grStatsAMean->GetXaxis()->SetTimeFormat("#splitline{%d.%m.%y}{%H:%M:%S}");
113 mCanVec.at(0)->cd(1);
114 grStatsAMean->Sort();
115 grStatsAMean->Draw("apl");
116
117 grStatsCMean->SetTitle("Temperature mean (C-side);;T (K)");
118 grStatsCMean->SetMarkerStyle(20);
119 grStatsCMean->GetXaxis()->SetTimeDisplay(1);
120 grStatsCMean->GetXaxis()->SetTimeFormat("#splitline{%d.%m.%y}{%H:%M:%S}");
121 mCanVec.at(0)->cd(2);
122 grStatsCMean->Sort();
123 grStatsCMean->Draw("apl");
124
125 grStatsAGradX->SetTitle("Temperature gradient X (A-side);;gradient (K/cm)");
126 grStatsAGradX->SetMarkerStyle(20);
127 grStatsAGradX->GetXaxis()->SetTimeDisplay(1);
128 grStatsAGradX->GetXaxis()->SetTimeFormat("#splitline{%d.%m.%y}{%H:%M:%S}");
129 mCanVec.at(0)->cd(3);
130 grStatsAGradX->Sort();
131 grStatsAGradX->Draw("apl");
132
133 grStatsCGradX->SetTitle("Temperature gradient X (C-side);;gradient (K/cm)");
134 grStatsCGradX->SetMarkerStyle(20);
135 grStatsCGradX->GetXaxis()->SetTimeDisplay(1);
136 grStatsCGradX->GetXaxis()->SetTimeFormat("#splitline{%d.%m.%y}{%H:%M:%S}");
137 mCanVec.at(0)->cd(4);
138 grStatsCGradX->Sort();
139 grStatsCGradX->Draw("apl");
140
141 grStatsAGradY->SetTitle("Temperature gradient Y (A-side);;gradient (K/cm)");
142 grStatsAGradY->SetMarkerStyle(20);
143 grStatsAGradY->GetXaxis()->SetTimeDisplay(1);
144 grStatsAGradY->GetXaxis()->SetTimeFormat("#splitline{%d.%m.%y}{%H:%M:%S}");
145 mCanVec.at(0)->cd(5);
146 grStatsAGradY->Sort();
147 grStatsAGradY->Draw("apl");
148
149 grStatsCGradY->SetTitle("Temperature gradient Y (C-side);;gradient (K/cm)");
150 grStatsCGradY->SetMarkerStyle(20);
151 grStatsCGradY->GetXaxis()->SetTimeDisplay(1);
152 grStatsCGradY->GetXaxis()->SetTimeFormat("#splitline{%d.%m.%y}{%H:%M:%S}");
153 mCanVec.at(0)->cd(6);
154 grStatsCGradY->Sort();
155 grStatsCGradY->Draw("apl");
156
157 TLegend* legend = new TLegend(0.85, 0.6, 0.9, 0.9);
158 for (int i = 0; i < grVec.size(); i++) {
159 legend->AddEntry(grVec.at(i), grVec.at(i)->GetName(), "p");
160 }
161
162 mCanVec.at(1)->cd();
163 grM->GetXaxis()->SetTimeDisplay(1);
164 grM->GetXaxis()->SetTimeFormat("#splitline{%d.%m.%y}{%H:%M:%S}");
165 grM->SetTitle("Raw temperature values;;T (K)");
166 grM->Draw("A pmc plc");
167 legend->Draw("same");
168 mCanVec.at(1)->Update();
169
171 grM->SetBit(TObject::kCanDelete);
172 grStatsAMean->SetBit(TObject::kCanDelete);
173 grStatsAGradX->SetBit(TObject::kCanDelete);
174 grStatsAGradY->SetBit(TObject::kCanDelete);
175 grStatsCMean->SetBit(TObject::kCanDelete);
176 grStatsCGradX->SetBit(TObject::kCanDelete);
177 grStatsCGradY->SetBit(TObject::kCanDelete);
178}
ClassImp(o2::tpc::qc::DCSPTemperature)
DCS data point data formats.
int32_t i
This class helps visualizing the data from the temperature sensors inside the TPC.
void initializeCanvases()
initializes the TCanvases that will later be shown on the QCG
void processData(const std::vector< std::unique_ptr< o2::tpc::dcs::Temperature > > &data)
fill graphs with temperature data and populate the canvases
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLboolean * data
Definition glcorearb.h:298