File indexing completed on 2025-01-04 00:29:49
0001 #include "boost/program_options.hpp"
0002 #include "boost/tokenizer.hpp"
0003 #include "TROOT.h"
0004 #include "TTree.h"
0005 #include "TFile.h"
0006 #include "TStyle.h"
0007 #include "TCanvas.h"
0008 #include "TH1F.h"
0009 #include "TH2F.h"
0010 #include "TGraph.h"
0011 #include "TLine.h"
0012 #include "TPad.h"
0013 #include <iostream>
0014 #include <fstream>
0015 #include <string>
0016 #include <vector>
0017 #include <cfloat>
0018
0019 using namespace std;
0020 using namespace boost;
0021
0022 class RootPlot {
0023 public:
0024 static const int DEFAULT_AXIS = 111;
0025 static const int TIME_AXIS = 222;
0026
0027 RootPlot(string type, string format, string file, float hmin = 0., float hmax = 0.) {
0028 m_isInit = false;
0029 m_type = type;
0030 m_outputFormat = format;
0031 m_outputFile = file + "." + format;
0032 m_outputRoot = file + ".root";
0033 m_title = "rootplot Plot";
0034 m_xtitle = "X";
0035 m_ytitle = "Y";
0036 m_xAxisType = DEFAULT_AXIS;
0037 m_debug = 1;
0038 m_T0 = TDatime(2005, 01, 01, 00, 00, 00);
0039 m_hmin = hmin;
0040 m_hmax = hmax;
0041 };
0042
0043 ~RootPlot() {};
0044
0045 void init() {
0046 m_nbins[0] = m_nbins[1] = 100;
0047 m_mins[0] = m_mins[1] = FLT_MAX;
0048 m_maxs[0] = m_maxs[1] = FLT_MIN;
0049 m_data[0] = 0;
0050 m_data[1] = 0;
0051 m_data[2] = 0;
0052 m_data[3] = 0;
0053 m_data[4] = 0;
0054
0055 gROOT->SetStyle("Plain");
0056 gStyle->SetOptStat(111111);
0057 gStyle->SetOptFit();
0058 gStyle->SetPalette(1, nullptr);
0059
0060 int pCol[2] = {2, 3};
0061 if ((m_type == "Map" || m_type == "EBEEMap") && (TString(m_title).Contains("status"))) {
0062 gStyle->SetPalette(2, pCol);
0063 }
0064
0065 m_rootfile = new TFile(m_outputRoot.c_str(), "RECREATE");
0066 m_tree = new TTree("t1", "rootplot tree");
0067
0068 if (m_type == "TH1F") {
0069 m_nfields = 1;
0070 m_tree->Branch("x", &m_data[0], "x/F");
0071 } else if (m_type == "TH2F") {
0072 m_nfields = 2;
0073 m_tree->Branch("x", &m_data[0], "x/F");
0074 m_tree->Branch("y", &m_data[1], "y/F");
0075 } else if (m_type == "TGraph") {
0076 m_nfields = 2;
0077 m_tree->Branch("x", &m_data[0], "x/F");
0078 m_tree->Branch("y", &m_data[1], "y/F");
0079 } else if (m_type == "Map") {
0080 m_nfields = 2;
0081 m_tree->Branch("x", &m_data[0], "x/F");
0082 m_tree->Branch("y", &m_data[1], "y/F");
0083 } else if (m_type == "EBEEMap") {
0084 m_nfields = 5;
0085 m_tree->Branch("ism_z", &m_data[0], "ism_z/F");
0086 m_tree->Branch("chnum_x", &m_data[1], "chnum_x/F");
0087 m_tree->Branch("var", &m_data[2], "var/F");
0088 m_tree->Branch("null_y", &m_data[3], "z/F");
0089 m_tree->Branch("isEB", &m_data[4], "isEB/F");
0090 }
0091 };
0092
0093 void setTitle(string title) { m_title = title; }
0094 void setXTitle(string xtitle) { m_xtitle = xtitle; }
0095 void setYTitle(string ytitle) { m_ytitle = ytitle; }
0096 void setDebug(int debug) { m_debug = debug; }
0097 void setXAxisType(int code) { m_xAxisType = code; }
0098
0099 void parseAndFill(std::string str) {
0100 if (!m_isInit) {
0101 this->init();
0102 m_isInit = true;
0103 }
0104
0105 if (str[0] == '#') {
0106
0107 return;
0108 }
0109
0110 if (m_debug) {
0111 cout << "[data] " << flush;
0112 }
0113
0114 typedef boost::tokenizer<boost::escaped_list_separator<char> > tokenizer;
0115 escaped_list_separator<char> sep('\\', ' ', '\"');
0116 tokenizer tokens(str, sep);
0117 float datum;
0118 int cnt = 0;
0119
0120 for (tokenizer::iterator tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter) {
0121 if (cnt > m_nfields) {
0122 continue;
0123 }
0124
0125 if (m_debug) {
0126 cout << "<" << *tok_iter << ">" << flush;
0127 }
0128
0129 if (m_xAxisType == TIME_AXIS && cnt == 0) {
0130 TDatime d((*tok_iter).c_str());
0131 datum = (Float_t)(d.Convert() - m_T0.Convert());
0132 } else {
0133 datum = atof((*tok_iter).c_str());
0134 }
0135
0136 if (m_type != "EBEEMap") {
0137 if (datum < m_mins[cnt]) {
0138 m_mins[cnt] = datum;
0139 }
0140 if (datum > m_maxs[cnt]) {
0141 m_maxs[cnt] = datum;
0142 }
0143 }
0144
0145 m_data[cnt] = datum;
0146
0147 cnt++;
0148 }
0149
0150 if (m_debug) {
0151 cout << endl;
0152 }
0153 m_tree->Fill();
0154 };
0155
0156 void draw() {
0157 for (int i = 0; i < m_nfields; i++) {
0158 if (m_mins[i] == m_maxs[i]) {
0159 m_mins[i] -= m_mins[i] * (0.05);
0160 m_maxs[i] += m_mins[i] * (0.05);
0161 }
0162 }
0163
0164 if (m_debug) {
0165 cout << "[draw()]:" << endl;
0166 cout << " m_type: " << m_type << endl;
0167 cout << " m_outputFormat: " << m_outputFormat << endl;
0168 cout << " m_outputFile: " << m_outputFile << endl;
0169 cout << " m_outputRoot: " << m_outputRoot << endl;
0170 cout << " m_title: " << m_title << endl;
0171 cout << " m_xtitle: " << m_xtitle << endl;
0172 cout << " m_ytitle: " << m_ytitle << endl;
0173 cout << " m_xAxisType: " << m_xAxisType << endl;
0174 cout << " m_nfields: " << m_nfields << endl;
0175 cout << " m_nbins[]: " << m_nbins[0] << " " << m_nbins[1] << endl;
0176 cout << " m_mins[]: " << m_mins[0] << " " << m_mins[1] << endl;
0177 cout << " m_maxs[]: " << m_maxs[0] << " " << m_maxs[1] << endl;
0178 }
0179
0180 m_tree->Write();
0181
0182
0183
0184 if (m_type == "TH1F") {
0185 this->drawTH1F();
0186 } else if (m_type == "TH2F") {
0187 this->drawTH2F();
0188 } else if (m_type == "TGraph") {
0189 this->drawTGraph();
0190 } else if (m_type == "Map") {
0191 this->drawMap();
0192 } else if (m_type == "EBEEMap") {
0193 this->drawEBEEMap();
0194 }
0195
0196 m_isInit = false;
0197 };
0198
0199 void drawTH1F() {
0200 TCanvas c1("c1", "rootplot", 200, 10, 450, 300);
0201 c1.SetGrid();
0202
0203 if ((TString(m_title).Contains("status"))) {
0204 m_mins[0] = -0.001;
0205 m_maxs[0] = 1.001;
0206 }
0207
0208 TH1F* plot = new TH1F("rootplot", m_title.c_str(), m_nbins[0], m_mins[0], m_maxs[0]);
0209 plot->GetXaxis()->SetTitle(m_xtitle.c_str());
0210 plot->GetYaxis()->SetTitle(m_ytitle.c_str());
0211
0212 if (m_xAxisType == TIME_AXIS) {
0213 TAxis* axis = plot->GetXaxis();
0214 setTimeAxis(axis);
0215 }
0216
0217 m_tree->Draw("x >> rootplot");
0218
0219 plot->Draw();
0220 c1.Print(m_outputFile.c_str(), m_outputFormat.c_str());
0221
0222 plot->Write();
0223 };
0224
0225 void drawTH2F() {
0226 TCanvas c1("c1", "rootplot", 200, 10, 600, 400);
0227 c1.SetGrid();
0228
0229 TH2F* plot =
0230 new TH2F("rootplot", m_title.c_str(), m_nbins[0], m_mins[0], m_maxs[0], m_nbins[1], m_mins[1], m_maxs[1]);
0231 plot->GetXaxis()->SetTitle(m_xtitle.c_str());
0232 plot->GetYaxis()->SetTitle(m_ytitle.c_str());
0233
0234 if (m_xAxisType == TIME_AXIS) {
0235 TAxis* axis = plot->GetXaxis();
0236 setTimeAxis(axis);
0237 }
0238
0239 m_tree->Draw("x:y >> rootplot");
0240
0241 plot->Draw();
0242 c1.Print(m_outputFile.c_str(), m_outputFormat.c_str());
0243
0244 plot->Write();
0245 }
0246
0247 void drawTGraph() {
0248 TCanvas c1("c1", "rootplot", 200, 10, 600, 400);
0249 c1.SetGrid();
0250
0251 Int_t n = (Int_t)m_tree->GetEntries();
0252 TGraph* plot = new TGraph(n);
0253
0254 Float_t x, y;
0255 m_tree->SetBranchAddress("x", &x);
0256 m_tree->SetBranchAddress("y", &y);
0257 for (Int_t i = 0; i < n; i++) {
0258 m_tree->GetEntry(i);
0259 plot->SetPoint(i, x, y);
0260 }
0261
0262 if (m_xAxisType == TIME_AXIS) {
0263 TAxis* axis = plot->GetXaxis();
0264 setTimeAxis(axis);
0265 }
0266
0267 plot->SetTitle(m_title.c_str());
0268 plot->GetXaxis()->SetTitle(m_xtitle.c_str());
0269 plot->GetYaxis()->SetTitle(m_ytitle.c_str());
0270 plot->SetMarkerStyle(21);
0271 plot->Draw("AP");
0272
0273 c1.Print(m_outputFile.c_str(), m_outputFormat.c_str());
0274 plot->Write();
0275 };
0276
0277 void drawMap() {
0278 gStyle->SetOptStat(0);
0279
0280 const Int_t csize = 250;
0281 TCanvas c1("c1", "rootplot", Int_t(85. / 20. * csize), csize);
0282 TH2F* plot = new TH2F("rootplot", m_title.c_str(), 85, 0.0001, 85.0001, 20, 0.0001, 20.0001);
0283 plot->GetXaxis()->SetTitle(m_xtitle.c_str());
0284 plot->GetYaxis()->SetTitle(m_ytitle.c_str());
0285
0286 Float_t x, y;
0287 m_tree->SetBranchAddress("x", &x);
0288 m_tree->SetBranchAddress("y", &y);
0289
0290
0291 Int_t n = (Int_t)m_tree->GetEntries();
0292 for (Int_t i = 0; i < n; i++) {
0293 m_tree->GetEntry(i);
0294
0295 Float_t xmap = Float_t(Int_t(x - 1) / 20) + 1;
0296 Float_t ymap = Float_t(Int_t(x - 1) % 20) + 1;
0297 plot->Fill(xmap, ymap, y);
0298 }
0299
0300
0301 plot->SetTitle(m_title.c_str());
0302 if ((TString(m_title).Contains("status"))) {
0303 plot->SetMinimum(-0.001);
0304 plot->SetMaximum(1.001);
0305 } else if (!(m_hmin == 0 && m_hmax == 0)) {
0306 plot->SetMinimum(m_hmin);
0307 plot->SetMaximum(m_hmax);
0308 }
0309
0310 plot->GetXaxis()->SetTitle("#phi");
0311 plot->GetYaxis()->SetTitle("#eta");
0312 plot->GetZaxis()->SetTitle(m_ytitle.c_str());
0313 plot->GetXaxis()->SetNdivisions(17);
0314 plot->GetYaxis()->SetNdivisions(4);
0315 c1.SetGridx();
0316 c1.SetGridy();
0317 plot->Draw("colz");
0318
0319
0320 TH2C* labelGrid = new TH2C("labelGrid", "label grid for SM", 85, 0., 85., 20, 0., 20.);
0321 for (Int_t i = 0; i < 68; i++) {
0322 Float_t X = (i / 4) * 5 + 2;
0323 Float_t Y = (i % 4) * 5 + 2;
0324 labelGrid->Fill(X, Y, i + 1);
0325 }
0326 labelGrid->SetMinimum(0.1);
0327 labelGrid->SetMarkerSize(4);
0328 labelGrid->Draw("text,same");
0329
0330 c1.Print(m_outputFile.c_str(), m_outputFormat.c_str());
0331 plot->Write();
0332 };
0333
0334 void drawEBEEMap() {
0335 const Int_t csize = 900;
0336
0337 TCanvas c1("c1", "rootplot", csize, csize);
0338 TPad p1("EBPad", "EBPad", 0., 0.5, 1., 1.);
0339 p1.Draw();
0340 TPad p2("EEPlusPad", "EEPlusPad", 0., 0., 0.48, 0.5);
0341 p2.Draw();
0342 TPad p3("EEPlusPad", "EEPlusPad", 0.50, 0., 0.98, 0.5);
0343 p3.Draw();
0344
0345
0346 TH2F* EBPlot = new TH2F("rootplotEB", m_title.c_str(), 360, 0., 360., 170, -85., 85.);
0347 EBPlot->GetXaxis()->SetTitle("i#phi");
0348 EBPlot->GetYaxis()->SetTitle("i#eta");
0349 EBPlot->GetZaxis()->SetTitle(m_ytitle.c_str());
0350 EBPlot->GetXaxis()->SetNdivisions(18, kFALSE);
0351 EBPlot->GetYaxis()->SetNdivisions(2);
0352
0353
0354 TH2F* EEPlot_plus = new TH2F("rootplotEE+", m_title.c_str(), 100, 0., 100., 100, 0., 100.);
0355 EEPlot_plus->GetXaxis()->SetTitle("ix");
0356 EEPlot_plus->GetYaxis()->SetTitleOffset(1.3);
0357 EEPlot_plus->GetYaxis()->SetTitle("iy");
0358 EEPlot_plus->GetZaxis()->SetTitle(m_ytitle.c_str());
0359 EEPlot_plus->GetXaxis()->SetNdivisions(10, kTRUE);
0360 EEPlot_plus->GetYaxis()->SetNdivisions(10);
0361
0362
0363 TH2F* EEPlot_minus = new TH2F("rootplotEE-", m_title.c_str(), 100, 0., 100., 100, 0., 100.);
0364 EEPlot_minus->GetXaxis()->SetTitle("ix");
0365 EEPlot_minus->GetYaxis()->SetTitle("iy");
0366 EEPlot_minus->GetYaxis()->SetTitleOffset(1.3);
0367 EEPlot_minus->GetZaxis()->SetTitle(m_ytitle.c_str());
0368 EEPlot_minus->GetXaxis()->SetNdivisions(10, kTRUE);
0369 EEPlot_minus->GetYaxis()->SetNdivisions(10);
0370
0371 Float_t chnum_x, var, ism_z, isEB, null_y;
0372 m_tree->SetBranchAddress("ism_z", &ism_z);
0373 m_tree->SetBranchAddress("chnum_x", &chnum_x);
0374 m_tree->SetBranchAddress("var", &var);
0375 m_tree->SetBranchAddress("isEB", &isEB);
0376 m_tree->SetBranchAddress("null_y", &null_y);
0377
0378
0379 Int_t n = (Int_t)m_tree->GetEntries();
0380 for (Int_t i = 0; i < n; i++) {
0381 m_tree->GetEntry(i);
0382
0383 if (isEB) {
0384 Float_t iex = -1;
0385 Float_t ipx = -1;
0386 for (unsigned int i = 1; i <= 36; i++) {
0387 if (i == ism_z) {
0388 Float_t ie = Float_t(Int_t(chnum_x - 1) / 20) + 1;
0389 Float_t ip = Float_t(Int_t(chnum_x - 1) % 20) + 1;
0390
0391 if (ism_z <= 18) {
0392 iex = ie - 1;
0393 ipx = (20 - ip) + 20 * (ism_z - 1);
0394 } else {
0395 iex = -1 * ie;
0396 ipx = ip + 20 * (ism_z - 19) - 1;
0397 }
0398
0399 EBPlot->Fill(ipx, iex, var);
0400 }
0401 }
0402 }
0403
0404
0405 else {
0406
0407 if (ism_z == 1)
0408 EEPlot_plus->Fill(chnum_x - 0.5, null_y - 0.5, var);
0409
0410 if (ism_z == -1)
0411 EEPlot_minus->Fill(chnum_x - 0.5, null_y - 0.5, var);
0412 }
0413
0414 }
0415
0416
0417
0418 gStyle->SetOptStat("e");
0419 gStyle->SetPaintTextFormat("+g");
0420
0421 EBPlot->SetTitle(m_title.c_str());
0422 EEPlot_plus->SetTitle(m_title.c_str());
0423 EEPlot_minus->SetTitle(m_title.c_str());
0424
0425 if ((TString(m_title).Contains("status"))) {
0426 EBPlot->SetMinimum(-0.001);
0427 EBPlot->SetMaximum(1.001);
0428 EEPlot_plus->SetMinimum(-0.001);
0429 EEPlot_plus->SetMaximum(1.001);
0430 EEPlot_minus->SetMinimum(-0.001);
0431 EEPlot_minus->SetMaximum(1.001);
0432
0433 } else if (!(m_hmin == 0 && m_hmax == 0)) {
0434 EBPlot->SetMinimum(m_hmin);
0435 EBPlot->SetMaximum(m_hmax);
0436 EEPlot_plus->SetMinimum(m_hmin);
0437 EEPlot_plus->SetMaximum(m_hmax);
0438 EEPlot_minus->SetMinimum(m_hmin);
0439 EEPlot_minus->SetMaximum(m_hmax);
0440 }
0441
0442 p1.cd();
0443 gPad->SetGridx();
0444 gPad->SetGridy();
0445 EBPlot->Draw("colz");
0446
0447
0448 TH2C* labelGrid = new TH2C("labelGrid", "label grid for SM", 18, 0., 360., 2, -85., 85.);
0449 for (Int_t sm = 1; sm <= 36; sm++) {
0450 int X = (sm <= 18) ? sm : sm - 18;
0451 int Y = (sm <= 18) ? 2 : 1;
0452 double posSM = (sm <= 18) ? sm : -1 * (sm - 18);
0453 labelGrid->SetBinContent(X, Y, posSM);
0454 }
0455 labelGrid->SetMarkerSize(2);
0456 labelGrid->Draw("text,same");
0457
0458 c1.Print(m_outputFile.c_str(), m_outputFormat.c_str());
0459 EBPlot->Write();
0460
0461
0462
0463 int ixSectorsEE[202] = {
0464 61, 61, 60, 60, 59, 59, 58, 58, 57, 57, 55, 55, 45, 45, 43, 43, 42, 42, 41, 41, 40, 40, 39, 39, 40, 40,
0465 41, 41, 42, 42, 43, 43, 45, 45, 55, 55, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 0, 100, 100, 97, 97, 95,
0466 95, 92, 92, 87, 87, 85, 85, 80, 80, 75, 75, 65, 65, 60, 60, 40, 40, 35, 35, 25, 25, 20, 20, 15, 15, 13,
0467 13, 8, 8, 5, 5, 3, 3, 0, 0, 3, 3, 5, 5, 8, 8, 13, 13, 15, 15, 20, 20, 25, 25, 35, 35, 40,
0468 40, 60, 60, 65, 65, 75, 75, 80, 80, 85, 85, 87, 87, 92, 92, 95, 95, 97, 97, 100, 100, 0, 61, 65, 65, 70,
0469 70, 80, 80, 90, 90, 92, 0, 61, 65, 65, 90, 90, 97, 0, 57, 60, 60, 65, 65, 70, 70, 75, 75, 80, 80, 0,
0470 50, 50, 0, 43, 40, 40, 35, 35, 30, 30, 25, 25, 20, 20, 0, 39, 35, 35, 10, 10, 3, 0, 39, 35, 35, 30,
0471 30, 20, 20, 10, 10, 8, 0, 45, 45, 40, 40, 35, 35, 0, 55, 55, 60, 60, 65, 65};
0472
0473 int iySectorsEE[202] = {
0474 50, 55, 55, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 60, 60, 59, 59, 58, 58, 57, 57, 55, 55, 45, 45, 43,
0475 43, 42, 42, 41, 41, 40, 40, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 45, 45, 50, 0, 50, 60, 60, 65, 65,
0476 75, 75, 80, 80, 85, 85, 87, 87, 92, 92, 95, 95, 97, 97, 100, 100, 97, 97, 95, 95, 92, 92, 87, 87, 85, 85,
0477 80, 80, 75, 75, 65, 65, 60, 60, 40, 40, 35, 35, 25, 25, 20, 20, 15, 15, 13, 13, 8, 8, 5, 5, 3, 3,
0478 0, 0, 3, 3, 5, 5, 8, 8, 13, 13, 15, 15, 20, 20, 25, 25, 35, 35, 40, 40, 50, 0, 45, 45, 40, 40,
0479 35, 35, 30, 30, 25, 25, 0, 50, 50, 55, 55, 60, 60, 0, 60, 60, 65, 65, 70, 70, 75, 75, 85, 85, 87, 0,
0480 61, 100, 0, 60, 60, 65, 65, 70, 70, 75, 75, 85, 85, 87, 0, 50, 50, 55, 55, 60, 60, 0, 45, 45, 40, 40,
0481 35, 35, 30, 30, 25, 25, 0, 39, 30, 30, 15, 15, 5, 0, 39, 30, 30, 15, 15, 5};
0482
0483
0484 TH2C labelGrid1("labelGrid1", "label grid for EE -", 10, 0., 100., 10, 0., 100.);
0485 for (int i = 1; i <= 10; i++) {
0486 for (int j = 1; j <= 10; j++) {
0487 labelGrid1.SetBinContent(i, j, -10);
0488 }
0489 }
0490
0491 labelGrid1.SetBinContent(2, 5, -3);
0492 labelGrid1.SetBinContent(2, 7, -2);
0493 labelGrid1.SetBinContent(4, 9, -1);
0494 labelGrid1.SetBinContent(7, 9, -9);
0495 labelGrid1.SetBinContent(9, 7, -8);
0496 labelGrid1.SetBinContent(9, 5, -7);
0497 labelGrid1.SetBinContent(8, 3, -6);
0498 labelGrid1.SetBinContent(6, 2, -5);
0499 labelGrid1.SetBinContent(3, 3, -4);
0500 labelGrid1.SetMarkerSize(2);
0501 labelGrid1.SetMinimum(-9.01);
0502 labelGrid1.SetMaximum(-0.01);
0503
0504 TH2C labelGrid2("labelGrid2", "label grid for EE +", 10, 0., 100., 10, 0., 100.);
0505
0506 for (int i = 1; i <= 10; i++) {
0507 for (int j = 1; j <= 10; j++) {
0508 labelGrid2.SetBinContent(i, j, -10);
0509 }
0510 }
0511
0512 labelGrid2.SetBinContent(2, 5, +3);
0513 labelGrid2.SetBinContent(2, 7, +2);
0514 labelGrid2.SetBinContent(4, 9, +1);
0515 labelGrid2.SetBinContent(7, 9, +9);
0516 labelGrid2.SetBinContent(9, 7, +8);
0517 labelGrid2.SetBinContent(9, 5, +7);
0518 labelGrid2.SetBinContent(8, 3, +6);
0519 labelGrid2.SetBinContent(5, 2, +5);
0520 labelGrid2.SetBinContent(3, 3, +4);
0521
0522 labelGrid2.SetMarkerSize(2);
0523 labelGrid2.SetMinimum(+0.01);
0524 labelGrid2.SetMaximum(+9.01);
0525
0526
0527 p2.cd();
0528 gPad->SetGridx();
0529 gPad->SetGridy();
0530 EEPlot_plus->Draw("colz");
0531 labelGrid2.Draw("text,same");
0532
0533
0534
0535 TLine l;
0536 l.SetLineWidth(1);
0537 for (int i = 0; i < 201; i = i + 1) {
0538 if ((ixSectorsEE[i] != 0 || iySectorsEE[i] != 0) && (ixSectorsEE[i + 1] != 0 || iySectorsEE[i + 1] != 0)) {
0539 l.DrawLine(ixSectorsEE[i], iySectorsEE[i], ixSectorsEE[i + 1], iySectorsEE[i + 1]);
0540 }
0541 }
0542
0543
0544 p3.cd();
0545 gPad->SetGridx();
0546 gPad->SetGridy();
0547 EEPlot_minus->Draw("colz");
0548 labelGrid1.Draw("text,same");
0549
0550
0551 for (int i = 0; i < 201; i = i + 1) {
0552 if ((ixSectorsEE[i] != 0 || iySectorsEE[i] != 0) && (ixSectorsEE[i + 1] != 0 || iySectorsEE[i + 1] != 0)) {
0553 l.DrawLine(ixSectorsEE[i], iySectorsEE[i], ixSectorsEE[i + 1], iySectorsEE[i + 1]);
0554 }
0555 }
0556
0557
0558 c1.Print(m_outputFile.c_str(), m_outputFormat.c_str());
0559 };
0560
0561 void setTimeAxis(TAxis* axis) {
0562 axis->SetTimeOffset(m_T0.Convert());
0563 axis->SetTimeDisplay(1);
0564 axis->SetTimeFormat("#splitline{%d/%m}{%H:%M:%S}");
0565 axis->SetLabelOffset(0.02);
0566 axis->SetLabelSize(0.03);
0567 }
0568
0569 private:
0570 RootPlot() {};
0571
0572 bool m_isInit;
0573 TFile* m_rootfile;
0574 TTree* m_tree;
0575 string m_type;
0576 string m_outputFormat;
0577 string m_outputFile;
0578 string m_outputRoot;
0579 string m_title;
0580 string m_xtitle;
0581 string m_ytitle;
0582 float m_hmin;
0583 float m_hmax;
0584 int m_xAxisType;
0585 int m_debug;
0586 int m_nfields;
0587 int m_nbins[2];
0588 float m_mins[2];
0589 float m_maxs[2];
0590 Float_t m_data[5];
0591
0592 TDatime m_T0;
0593 };
0594
0595 void arg_error(string msg) {
0596 cerr << "ERROR: " << msg << endl;
0597 cerr << "Use 'ECALrootPlotter -h' for help" << endl;
0598 exit(1);
0599 }
0600
0601 int main(int argc, char* argv[]) {
0602
0603 program_options::options_description desc("options");
0604 program_options::options_description visible(
0605 "Usage: ECALrootPlotter [options] [Plot Type] [Output Format] [Output File] \noptions");
0606 visible.add_options()("time,t", "X axis takes time values")(
0607 "file,f", program_options::value<string>(), "input file name")(
0608 "title,T", program_options::value<string>(), "Set plot title")(
0609 "xtitle,X", program_options::value<string>(), "X axis title")(
0610 "ytitle,Y", program_options::value<string>(), "Y axis title")("debug", "Print debug information")("help,h",
0611 "help message");
0612 program_options::options_description hidden("argument");
0613 hidden.add_options()("type", program_options::value<string>(), "Type of ROOT plot")(
0614 "format", program_options::value<string>(), "Output format")(
0615 "output", program_options::value<string>(), "Output file")("hmin", program_options::value<float>(), "histo_min")(
0616 "hmax", program_options::value<float>(), "histo_max");
0617 desc.add(visible).add(hidden);
0618 program_options::positional_options_description pd;
0619 pd.add("type", 1);
0620 pd.add("format", 1);
0621 pd.add("output", 1);
0622 pd.add("hmin", 1);
0623 pd.add("hmax", 1);
0624 program_options::variables_map vm;
0625 try {
0626 program_options::store(program_options::command_line_parser(argc, argv).options(desc).positional(pd).run(), vm);
0627 program_options::notify(vm);
0628 } catch (const program_options::error& e) {
0629 cerr << e.what() << endl;
0630 return 1;
0631 }
0632
0633 if (vm.count("help")) {
0634 cout << visible << endl;
0635 return 0;
0636 }
0637
0638 string type, outputFile, outputFormat;
0639 string file = "";
0640 string title = "";
0641 string xtitle = "";
0642 string ytitle = "";
0643 float histo_min = 0;
0644 float histo_max = 0;
0645 int axisCode = RootPlot::DEFAULT_AXIS;
0646 int debug = 0;
0647
0648 if (vm.count("type")) {
0649 type = vm["type"].as<string>();
0650 if (type != "TH1F" && type != "TH2F" && type != "TGraph" && type != "Map" && type != "EBEEMap") {
0651 cerr << "ERROR: Plot type " << type << " is not valid." << endl;
0652 arg_error(
0653 "Valid types are:\n"
0654 " 'TH1F' (1 col data)\n"
0655 " 'TH2F' (2 col data)\n"
0656 " 'TGraph' (2 col data)\n"
0657 " 'Map' (2 col data)\n"
0658 " 'EBEEMap' (5 col data)\n");
0659 }
0660 } else {
0661 arg_error(
0662 "type is required.\n"
0663 "Valid types are:\n"
0664 " 'TH1F' (1 col data)\n"
0665 " 'TH2F' (2 col data)\n"
0666 " 'TGraph' (2 col data)\n"
0667 " 'Map' (2 col data)\n"
0668 " 'EBEEMap' (5 col data)");
0669 }
0670 if (vm.count("format")) {
0671 outputFormat = vm["format"].as<string>();
0672 } else {
0673 arg_error("format is required");
0674 }
0675 if (vm.count("output")) {
0676 outputFile = vm["output"].as<string>();
0677 } else {
0678 arg_error("output is required");
0679 }
0680 if (vm.count("hmin")) {
0681 histo_min = vm["hmin"].as<float>();
0682 }
0683 if (vm.count("hmax")) {
0684 histo_max = vm["hmax"].as<float>();
0685 }
0686 if (vm.count("file")) {
0687 file = vm["file"].as<string>();
0688 }
0689
0690 if (vm.count("time")) {
0691 axisCode = RootPlot::TIME_AXIS;
0692 }
0693 if (vm.count("title")) {
0694 title = vm["title"].as<string>();
0695 }
0696 if (vm.count("xtitle")) {
0697 xtitle = vm["xtitle"].as<string>();
0698 }
0699 if (vm.count("ytitle")) {
0700 ytitle = vm["ytitle"].as<string>();
0701 }
0702 if (vm.count("debug")) {
0703 debug = 1;
0704 }
0705
0706 string path = "";
0707 if ((int)file.find('/') >= 0) {
0708 path = file.substr(0, file.rfind('/'));
0709 }
0710 outputFile = path + "/" + outputFile;
0711
0712
0713 size_t t;
0714 while ((t = title.find('_')) != string::npos)
0715 title[t] = ' ';
0716 while ((t = xtitle.find('_')) != string::npos)
0717 xtitle[t] = ' ';
0718 while ((t = ytitle.find('_')) != string::npos)
0719 ytitle[t] = ' ';
0720
0721 if (debug) {
0722 cout << "Debug info: " << endl;
0723 cout << " type: " << type << endl;
0724 cout << " format: " << outputFormat << endl;
0725 cout << " output: " << outputFile << endl;
0726 cout << " axisCode: " << axisCode << endl;
0727 cout << " title: " << title << endl;
0728 cout << " xtitle: " << xtitle << endl;
0729 cout << " ytitle: " << ytitle << endl;
0730 cout << " map min: " << histo_min << endl;
0731 cout << " map max: " << histo_max << endl;
0732 cout << " input: " << file << endl;
0733 }
0734
0735
0736 try {
0737 RootPlot rootplot(type, outputFormat, outputFile, histo_min, histo_max);
0738 rootplot.setXAxisType(axisCode);
0739 rootplot.setTitle(title);
0740 rootplot.setXTitle(xtitle);
0741 rootplot.setYTitle(ytitle);
0742 rootplot.setDebug(debug);
0743
0744 string line;
0745
0746 ifstream* finput = (ifstream*)&cin;
0747 if (!file.empty()) {
0748 finput = new ifstream(file.c_str());
0749 }
0750 while (getline(*finput, line) && finput->good() && !finput->eof()) {
0751 rootplot.parseAndFill(line);
0752 }
0753
0754 if (finput->bad() || !finput->eof()) {
0755 cerr << "Input error." << endl;
0756 }
0757
0758 finput->close();
0759
0760 if (!file.empty()) {
0761 delete finput;
0762 }
0763 rootplot.draw();
0764
0765 } catch (std::exception& e) {
0766 cerr << "ERROR: " << e.what() << endl;
0767 }
0768 }