From 45cf6444ddbab16f3285abf3687ea804c9d2efd8 Mon Sep 17 00:00:00 2001
From: Dominik Smith <d.smith@gsi.de>
Date: Mon, 12 Oct 2020 11:08:45 +0200
Subject: [PATCH] CbmMuchTransportQa: Added pie charts to display particle
 ratios.

---
 macro/run/run_qa.C                           |   1 +
 sim/detectors/much/qa/CbmMuchTransportQa.cxx | 117 ++++++++++++++++++-
 sim/detectors/much/qa/CbmMuchTransportQa.h   |  15 +++
 3 files changed, 131 insertions(+), 2 deletions(-)

diff --git a/macro/run/run_qa.C b/macro/run/run_qa.C
index c77ad24d82..dffdca3721 100644
--- a/macro/run/run_qa.C
+++ b/macro/run/run_qa.C
@@ -141,6 +141,7 @@ void run_qa(Int_t nEvents   = 0,
   run->SetSink(sink);
 
   TString monitorFile {sinkFile};
+
   monitorFile.ReplaceAll("qa", "qa.monitor");
   FairMonitor::GetMonitor()->EnableMonitor(kTRUE, monitorFile);
   // ------------------------------------------------------------------------
diff --git a/sim/detectors/much/qa/CbmMuchTransportQa.cxx b/sim/detectors/much/qa/CbmMuchTransportQa.cxx
index 0892cee664..772ea6349a 100644
--- a/sim/detectors/much/qa/CbmMuchTransportQa.cxx
+++ b/sim/detectors/much/qa/CbmMuchTransportQa.cxx
@@ -24,7 +24,6 @@
 #include "TDatabasePDG.h"
 #include "TParticlePDG.h"
 
-
 #include "TString.h"
 
 #include "TClonesArray.h"
@@ -32,6 +31,9 @@
 #include "CbmQaCanvas.h"
 #include "TH1.h"
 #include "TH2.h"
+#include "TLegend.h"
+#include "TPie.h"
+#include "TPieSlice.h"
 #include "TStyle.h"
 
 #include <cassert>
@@ -48,7 +50,9 @@ CbmMuchTransportQa::CbmMuchTransportQa(const char* name, Int_t verbose)
   , fvMcPointXY()
   , fvMcPointPhiZ()
   , fvMcPointRZ()
-  , fvFraction() {}
+  , fvFraction()
+  , fvMcPointPRatio()
+  , fvMcPointPrimRatio() {}
 // -------------------------------------------------------------------------
 
 
@@ -88,6 +92,13 @@ void CbmMuchTransportQa::DeInit() {
   }
   fvMcPointRZ.clear();
 
+  for (uint i = 0; i < fvMcPointPRatio.size(); i++) {
+    SafeDelete(fvMcPointPRatio[i]);
+  }
+  for (uint i = 0; i < fvMcPointPrimRatio.size(); i++) {
+    SafeDelete(fvMcPointPrimRatio[i]);
+  }
+
   SafeDelete(fhNtracks);
   SafeDelete(fhFractionPrim);
   SafeDelete(fhFractionSec);
@@ -100,10 +111,16 @@ void CbmMuchTransportQa::DeInit() {
   fvUsNtra.clear();
   fvFraction.clear();
 
+  fvMcPointPRatio.clear();
+  fvMcPointPrimRatio.clear();
+
   SafeDelete(fCanvStationXY);
   SafeDelete(fCanvStationPhiZ);
   SafeDelete(fCanvStationRZ);
 
+  SafeDelete(fCanvStationPRatio);
+  SafeDelete(fCanvStationPrimRatio);
+
   fNstations = 0;
   fOutFolder.Clear();
 }
@@ -206,6 +223,9 @@ InitStatus CbmMuchTransportQa::Init() {
   fvMcPointPhiZ.resize(fNstations);
   fvMcPointRZ.resize(fNstations);
 
+  fvMcPointPRatio.resize(fNstations);
+  fvMcPointPrimRatio.resize(fNstations);
+
   for (Int_t i = 0; i < fNstations; i++) {
     CbmMuchStation* station = CbmMuchGeoScheme::Instance()->GetStation(i);
     if (!station) {
@@ -246,6 +266,20 @@ InitStatus CbmMuchTransportQa::Init() {
                               rMin - 0.1 * dR,
                               rMax + 0.1 * dR);
     histFolder->Add(fvMcPointRZ[i]);
+
+    fvMcPointPRatio[i] =
+      new TPie(Form("fvMcPointPRatio%i", i + 1),
+               Form("McPoint Particle Ratios: Station %i", i + 1),
+               5);
+
+    //histFolder->Add(fvMcPointPRatio[i]);
+
+    fvMcPointPrimRatio[i] =
+      new TPie(Form("fvMcPointPrimRatio%i", i + 1),
+               Form("McPoint Primary/Secondary Track: Station %i", i + 1),
+               2);
+
+    //histFolder->Add(fvMcPointPrimRatio[i]);
   }
 
   fCanvStationXY =
@@ -263,6 +297,19 @@ InitStatus CbmMuchTransportQa::Init() {
   fCanvStationRZ->Divide2D(fNstations);
   fOutFolder.Add(fCanvStationRZ);
 
+  fCanvStationPRatio = new CbmQaCanvas(
+    "cMcPointPRatios", "Much: MC particle ratios", 2 * 400, 2 * 400);
+  fCanvStationPRatio->Divide2D(fNstations);
+  fOutFolder.Add(fCanvStationPRatio);
+
+  fCanvStationPrimRatio =
+    new CbmQaCanvas("cMcPointPrimRatios",
+                    "Much: MC primary/secondary track ratios",
+                    2 * 400,
+                    2 * 400);
+  fCanvStationPrimRatio->Divide2D(fNstations);
+  fOutFolder.Add(fCanvStationPrimRatio);
+
   gDirectory = oldDirectory;
 
   return kSUCCESS;
@@ -421,6 +468,54 @@ TFolder& CbmMuchTransportQa::GetQa() {
     fvFraction[i]->Scale(100.);
   }
 
+  for (Int_t i = 0; i < fNstations; i++) {
+    Double_t PRatios[] = {fhFractionEl->GetBinContent(i + 1),
+                          fhFractionPr->GetBinContent(i + 1),
+                          fhFractionPi->GetBinContent(i + 1),
+                          fhFractionMu->GetBinContent(i + 1),
+                          fhFractionKa->GetBinContent(i + 1)};
+
+    Int_t PRatiosColors[] = {4, 3, 2, 5, 6};
+
+    fvMcPointPRatio[i]->SetEntryVal(0, PRatios[0]);
+    fvMcPointPRatio[i]->SetEntryVal(1, PRatios[1]);
+    fvMcPointPRatio[i]->SetEntryVal(2, PRatios[2]);
+    fvMcPointPRatio[i]->SetEntryVal(3, PRatios[3]);
+    fvMcPointPRatio[i]->SetEntryVal(4, PRatios[4]);
+    fvMcPointPRatio[i]->SetEntryFillColor(0, PRatiosColors[0]);
+    fvMcPointPRatio[i]->SetEntryFillColor(1, PRatiosColors[1]);
+    fvMcPointPRatio[i]->SetEntryFillColor(2, PRatiosColors[2]);
+    fvMcPointPRatio[i]->SetEntryFillColor(3, PRatiosColors[3]);
+    fvMcPointPRatio[i]->SetEntryFillColor(4, PRatiosColors[4]);
+    fvMcPointPRatio[i]->GetSlice(0)->SetTitle(Form("e:   %.1f %%", PRatios[0]));
+    fvMcPointPRatio[i]->GetSlice(1)->SetTitle(Form("p:   %.1f %%", PRatios[1]));
+    fvMcPointPRatio[i]->GetSlice(2)->SetTitle(
+      Form("#pi:   %.1f %%", PRatios[2]));
+    fvMcPointPRatio[i]->GetSlice(3)->SetTitle(
+      Form("#mu:   %.1f %%", PRatios[3]));
+    fvMcPointPRatio[i]->GetSlice(4)->SetTitle(Form("K:   %.1f %%", PRatios[4]));
+    fvMcPointPRatio[i]->SetRadius(.33);
+    fvMcPointPRatio[i]->SetLabelsOffset(-.1);
+    fvMcPointPRatio[i]->SetLabelFormat("");
+
+    Double_t PrimRatios[] = {fhFractionPrim->GetBinContent(i + 1),
+                             fhFractionSec->GetBinContent(i + 1)};
+
+    Int_t PrimRatiosColors[] = {6, 4};
+
+    fvMcPointPrimRatio[i]->SetEntryVal(0, PrimRatios[0]);
+    fvMcPointPrimRatio[i]->SetEntryVal(1, PrimRatios[1]);
+    fvMcPointPrimRatio[i]->SetEntryFillColor(0, PrimRatiosColors[0]);
+    fvMcPointPrimRatio[i]->SetEntryFillColor(1, PrimRatiosColors[1]);
+    fvMcPointPrimRatio[i]->GetSlice(0)->SetTitle(
+      Form("Primary:   %.1f %%", PrimRatios[0]));
+    fvMcPointPrimRatio[i]->GetSlice(1)->SetTitle(
+      Form("Secondary: %.1f %%", PrimRatios[1]));
+    fvMcPointPrimRatio[i]->SetRadius(.33);
+    fvMcPointPrimRatio[i]->SetLabelsOffset(-.1);
+    fvMcPointPrimRatio[i]->SetLabelFormat("");
+  }
+
   for (Int_t i = 0; i < fNstations; i++) {
 
     fCanvStationXY->cd(i + 1);
@@ -435,6 +530,24 @@ TFolder& CbmMuchTransportQa::GetQa() {
     gStyle->SetOptStat(0);
     fvMcPointRZ[i]->DrawCopy("colz", "");
 
+    fCanvStationPRatio->cd(i + 1);
+    gStyle->SetOptStat(0);
+    fvMcPointPRatio[i]->DrawClone("nol <");
+
+    TLegend* PRatioPieLeg = fvMcPointPRatio[i]->MakeLegend();
+    PRatioPieLeg->SetY1(.56);
+    PRatioPieLeg->SetY2(.86);
+
+    fCanvStationPrimRatio->cd(i + 1);
+    gStyle->SetOptStat(0);
+    fvMcPointPrimRatio[i]->DrawClone("nol <");
+
+    TLegend* PrimRatioPieLeg = fvMcPointPrimRatio[i]->MakeLegend();
+    PrimRatioPieLeg->SetY1(.71);
+    PrimRatioPieLeg->SetY2(.86);
+    PrimRatioPieLeg->SetX1(.40);
+    PrimRatioPieLeg->SetX2(.90);
+
     gStyle->SetOptStat(1110);
   }
 
diff --git a/sim/detectors/much/qa/CbmMuchTransportQa.h b/sim/detectors/much/qa/CbmMuchTransportQa.h
index b6c113ffe9..f6232dfd20 100644
--- a/sim/detectors/much/qa/CbmMuchTransportQa.h
+++ b/sim/detectors/much/qa/CbmMuchTransportQa.h
@@ -17,6 +17,9 @@ class CbmMuchGeoScheme;
 class TClonesArray;
 class TH1F;
 class TH2F;
+class TPie;
+class TPieSlice;
+class TLegend;
 class CbmQaCanvas;
 
 /// QA for the MUCH detector after a "transport" step of the simulation.
@@ -94,12 +97,24 @@ private:
 
   std::vector<TH1F*> fvFraction;  /// pointers to the above histos
 
+  /// output pie charts
+
+  std::vector<TPie*>
+    fvMcPointPRatio;  /// MC point particle ratio pie charts [N stations]
+  std::vector<TPie*>
+    fvMcPointPrimRatio;  /// MC point particle ratio pie charts [N stations]
+
   // output canvaces with histogramm collections
 
   CbmQaCanvas* fCanvStationXY   = nullptr;
   CbmQaCanvas* fCanvStationPhiZ = nullptr;
   CbmQaCanvas* fCanvStationRZ   = nullptr;
 
+  // output canvaces with pie chart collections
+
+  CbmQaCanvas* fCanvStationPRatio    = nullptr;
+  CbmQaCanvas* fCanvStationPrimRatio = nullptr;
+
   ClassDef(CbmMuchTransportQa, 0)
 };
 
-- 
GitLab