diff --git a/core/qa/CbmQaConstants.h b/core/qa/CbmQaConstants.h
index 91f62f272f400d9076c5d90f1bcaff64f27a5f0f..488b9d8fecf5b8e0d7ccdbbb10eb36d2fccd2d95 100644
--- a/core/qa/CbmQaConstants.h
+++ b/core/qa/CbmQaConstants.h
@@ -7,6 +7,9 @@
 /// @since  04.04.2023
 /// @author Sergei Zharko <s.zharko@gsi.de>
 
+#ifndef CbmQaConstants_h
+#define CbmQaConstants_h 1
+
 namespace CbmQaConstants
 {
 
@@ -20,4 +23,6 @@ namespace CbmQaConstants
     constexpr double nm = cm * 1.e-7;
   }  // namespace unit
 
-}  // namespace CbmQaConstants
\ No newline at end of file
+}  // namespace CbmQaConstants
+
+#endif  // CbmQaConstants_h
diff --git a/reco/L1/CbmCaMCModule.cxx b/reco/L1/CbmCaMCModule.cxx
index ba105dc7e527ba0a59fff4d1bb469402e6a88a12..60ac9e5a06f3b2ecb5f49cf7112e4d5b3fb8a880 100644
--- a/reco/L1/CbmCaMCModule.cxx
+++ b/reco/L1/CbmCaMCModule.cxx
@@ -10,8 +10,8 @@
 #include "CbmCaMCModule.h"
 
 #include "CbmEvent.h"
-#include "CbmL1.h"  // for L1DetectorID
 #include "CbmL1Constants.h"
+#include "CbmL1DetectorID.h"
 #include "CbmL1Hit.h"
 #include "CbmMCDataManager.h"
 #include "CbmMCDataObject.h"
diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx
index c900f001af0ce51c7380ef8321b1955aa271ac8c..0804bbf7a39a2f7a1d6c4b4563cd9c6178bed626 100644
--- a/reco/L1/CbmL1.cxx
+++ b/reco/L1/CbmL1.cxx
@@ -955,12 +955,12 @@ void CbmL1::Reconstruct(CbmEvent* event)
   //  FieldApproxCheck();
   //  FieldIntegralCheck();
 
-  if (fVerbose > 1) { cout << "L1 Track finder..." << endl; }
+  if (fVerbose > 1) { LOG(info) << "L1 Track finder..."; }
   fpAlgo->CaTrackFinder();
   //       IdealTrackFinder();
   fTrackingTime = fpAlgo->fCaRecoTime;
 
-  if (fVerbose > 1) { cout << "L1 Track finder ok" << endl; }
+  if (fVerbose > 1) { LOG(info) << "L1 Track finder ok"; }
 
   // save reconstructed tracks
 
@@ -1001,7 +1001,7 @@ void CbmL1::Reconstruct(CbmEvent* event)
     fvRecoTracks.push_back(t);
   }
 
-  LOG(debug) << "CA Track Finder: " << fpAlgo->fCaRecoTime << " s/sub-ts" << endl;
+  LOG(debug) << "CA Track Finder: " << fpAlgo->fCaRecoTime << " s/sub-ts";
 
 
   if ((fPerformance) && (fSTAPDataMode < 2)) { InputPerformance(); }
@@ -1009,7 +1009,7 @@ void CbmL1::Reconstruct(CbmEvent* event)
 
   // output performance
   if (fPerformance) {
-    if (fVerbose > 1) { cout << "Performance..." << endl; }
+    if (fVerbose > 1) { LOG(info) << "Performance..."; }
     TrackMatch();
     EfficienciesPerformance();
     HistoPerformance();
@@ -1019,7 +1019,18 @@ void CbmL1::Reconstruct(CbmEvent* event)
     ///    WriteSIMDKFData();
   }
   if (fVerbose > 1) { LOG(info) << "Tracking performance... done"; }
-  if (fVerbose > 1) { LOG(info) << "End of L1"; }
+  if (fVerbose > 1) { LOG(info) << "End of CA"; }
+
+  static bool ask = 0;
+  char symbol;
+  if (ask) {
+    LOG(info) << "\nCA run (any/r/q) > ";
+    do {
+      std::cin.get(symbol);
+      if (symbol == 'r') ask = false;
+      if ((symbol == 'e') || (symbol == 'q')) exit(0);
+    } while (symbol != '\n');
+  }
 }
 
 // -----   Finish CbmStsFitPerformanceTask task   -----------------------------
diff --git a/reco/L1/catools/CaToolsMCTrack.h b/reco/L1/catools/CaToolsMCTrack.h
index 338ecaac1a861efa1b3d3844999654f1172c3130..3c474af8012bc113f4e3895f6ecc9a74839bac05 100644
--- a/reco/L1/catools/CaToolsMCTrack.h
+++ b/reco/L1/catools/CaToolsMCTrack.h
@@ -188,6 +188,9 @@ namespace ca::tools
     /// Gets z component of the track vertex [cm]
     double GetStartZ() const { return fPos[2]; }
 
+    /// @brief Gets track polar angle
+    double GetTheta() const { return std::acos(fMom[2] / GetP()); }
+
     /// Gets total number of stations with hits
     int GetTotNofStationsWithHit() const { return fTotNofStationsWithHit; }
 
diff --git a/reco/L1/qa/CbmCaOutputQa.cxx b/reco/L1/qa/CbmCaOutputQa.cxx
index b0c7ba4004fc5a7522b0de04f34db3fc87a3fc1b..549a52f2951f3fbc18f4c60483eaedbcc9e8d7ac 100644
--- a/reco/L1/qa/CbmCaOutputQa.cxx
+++ b/reco/L1/qa/CbmCaOutputQa.cxx
@@ -38,87 +38,14 @@ void OutputQa::FillHistograms()
 
   for (size_t iTrkReco = 0; iTrkReco < fvRecoTracks.size(); ++iTrkReco) {
     const auto& recoTrk = fvRecoTracks[iTrkReco];
+
     // Reject tracks, which do not contain hits
     if (recoTrk.GetNofHits() < 1) { continue; }
 
-    const auto& hitFst = (fvHits)[recoTrk.GetHitIndexes()[0]];                         // first hit of track
-    const auto& hitSnd = (fvHits)[recoTrk.GetHitIndexes()[1]];                         // second hit of track
-    const auto& hitLst = (fvHits)[recoTrk.GetHitIndexes()[recoTrk.GetNofHits() - 1]];  // last hit of track
-
-    // ***************************************************
-    // ** Histograms, requiring reconstructed data only **
-    // ***************************************************
-    //
-    fph_reco_p->Fill(recoTrk.GetP());
-    fph_reco_pt->Fill(recoTrk.GetPt());
-    fph_reco_phi->Fill(recoTrk.GetPhi());
-    fph_reco_tx->Fill(recoTrk.GetTx());
-    fph_reco_ty->Fill(recoTrk.GetTy());
-    fph_reco_nhits->Fill(recoTrk.GetNofHits());
-    fph_reco_fsta->Fill(hitFst.GetStationId());
-    fph_reco_fhitR->Fill(hitFst.GetR());
-
-
-    // ******************************************
-    // ** Histograms, requiring MC information **
-    // ******************************************
-    //
-    if (IsMCUsed()) { fph_reco_purity->Fill(100 * recoTrk.GetMaxPurity()); }
-
-    if (recoTrk.GetNDF() > 0) {
-      if (IsMCUsed() && recoTrk.IsGhost()) {
-        fph_ghost_chi2_ndf->Fill(recoTrk.GetChiSq() / recoTrk.GetNDF());
-        fph_ghost_prob->Fill(recoTrk.GetProb());
-      }
-      else {
-        int iTmc          = recoTrk.GetMCTrackIndexes()[0];  // Index of first MC-track
-        const auto& mcTrk = fMCData.GetTrack(iTmc);
-        // NOTE: reconstructed tracks usually have reference to only one MC-track
-        if (mcTrk.IsReconstructable()) {
-          fph_reco_chi2_ndf->Fill(recoTrk.GetChiSq() / recoTrk.GetNDF());
-          fph_reco_prob->Fill(recoTrk.GetProb());
-        }
-        else {
-          fph_rest_chi2_ndf->Fill(recoTrk.GetChiSq() / recoTrk.GetNDF());
-          fph_rest_prob->Fill(recoTrk.GetProb());
-        }
-      }
-    }  // recoTrk.GetNDF() > 0: end
-
-    if (IsMCUsed()) {
-      if (recoTrk.IsGhost()) {
-        fph_ghost_purity->Fill(100 * recoTrk.GetMaxPurity());
-        fph_ghost_p->Fill(recoTrk.GetP());
-        fph_ghost_pt->Fill(recoTrk.GetPt());
-        fph_ghost_phi->Fill(recoTrk.GetPhi());
-        fph_ghost_nhits->Fill(recoTrk.GetNofHits());
-        fph_ghost_fsta->Fill(hitFst.GetStationId());
-        fph_ghost_fhitR->Fill(hitFst.GetR());
-
-        // z-positions of the first and second hit stations
-        double z0 = fpParameters->GetStation(hitFst.GetStationId()).fZ[0];
-        double z1 = fpParameters->GetStation(hitSnd.GetStationId()).fZ[0];
-
-        if (fabs(z1 - z0) > 1.e-4) {  // test for z1 != z2
-          fph_ghost_tx->Fill((hitSnd.GetX() - hitFst.GetX()) / (z1 - z0));
-          fph_ghost_ty->Fill((hitSnd.GetY() - hitFst.GetY()) / (z1 - z0));
-        }
-
-        fph_ghost_nhits_vs_p->Fill(recoTrk.GetP(), recoTrk.GetNofHits());
-        fph_ghost_fsta_vs_p->Fill(recoTrk.GetP(), hitFst.GetStationId());
-        if (hitFst.GetStationId() <= hitLst.GetStationId()) {
-          fph_ghost_lsta_vs_fsta->Fill(hitFst.GetStationId(), hitLst.GetStationId());
-        }
-      }  // recoTrk.IsGhost(): end
-    }
-
-    // ********************************
-    // ** Different track categories **
-    // ********************************
-
     fvpTrackHistograms[ETrackType::kAll]->FillRecoTrack(iTrkReco);
 
     if (IsMCUsed()) {
+      if (recoTrk.IsGhost()) { fvpTrackHistograms[ETrackType::kGhost]->FillRecoTrack(iTrkReco); }
       int iTrkMC = recoTrk.GetMatchedMCTrackIndex();
       if (iTrkMC > -1) {
         const auto& mcTrk = fMCData.GetTrack(iTrkMC);
@@ -150,6 +77,11 @@ void OutputQa::FillHistograms()
   if (IsMCUsed()) {
     for (int iTrkMC = 0; iTrkMC < fMCData.GetNofTracks(); ++iTrkMC) {
       const auto& mcTrk = fMCData.GetTrack(iTrkMC);
+
+      // Cut tracks, which did not leave hits in tracker
+      if (mcTrk.GetNofHits() == 0) { continue; }
+
+      // Fill different track categories
       fvpTrackHistograms[ETrackType::kAll]->FillMCTrack(iTrkMC);
 
       int pdg        = mcTrk.GetPdgCode();
@@ -260,67 +192,15 @@ InitStatus OutputQa::InitHistograms()
     fvpTrackHistograms[type]->Init();
   };
 
+  RegisterTrackQa("ghost", ETrackType::kGhost, /*suppress MC*/ true);
   RegisterTrackQa("all", ETrackType::kAll);
-  RegisterTrackQa("prim", ETrackType::kPrim);
-  RegisterTrackQa("sec", ETrackType::kSec);
-  RegisterTrackQa("prim_pip", ETrackType::kPrimPIP);
-  RegisterTrackQa("prim_pim", ETrackType::kPrimPIM);
-  RegisterTrackQa("sec_pip", ETrackType::kSecPIP);
-  RegisterTrackQa("sec_pim", ETrackType::kSecPIM);
-
-
-  fph_reco_p     = MakeHistoFromConfig<TH1F>("reco_p");
-  fph_reco_pt    = MakeHistoFromConfig<TH1F>("reco_pt");
-  fph_reco_phi   = MakeHistoFromConfig<TH1F>("reco_phi");
-  fph_reco_tx    = MakeHistoFromConfig<TH1F>("reco_tx");
-  fph_reco_ty    = MakeHistoFromConfig<TH1F>("reco_ty");
-  fph_reco_nhits = MakeHistoFromConfig<TH1F>("reco_nhits");
-  fph_reco_fsta  = MakeHistoFromConfig<TH1F>("reco_fsta");
-  fph_reco_fhitR = MakeHistoFromConfig<TH1F>("reco_fhitR");
-
   if (IsMCUsed()) {
-    fph_reco_purity   = MakeHistoFromConfig<TH1F>("reco_purity");
-    fph_reco_chi2_ndf = MakeHistoFromConfig<TH1F>("reco_chi2_ndf");  // TODO: Can be filled without MC
-    fph_reco_prob     = MakeHistoFromConfig<TH1F>("reco_prob");      // TODO: Can be filled without MC
-    fph_rest_chi2_ndf = MakeHistoFromConfig<TH1F>("rest_chi2_ndf");
-    fph_rest_prob     = MakeHistoFromConfig<TH1F>("rest_prob");
-
-    fph_ghost_p            = MakeHistoFromConfig<TH1F>("ghost_p");
-    fph_ghost_pt           = MakeHistoFromConfig<TH1F>("ghost_pt");
-    fph_ghost_phi          = MakeHistoFromConfig<TH1F>("ghost_phi");
-    fph_ghost_nhits        = MakeHistoFromConfig<TH1F>("ghost_nhits");
-    fph_ghost_fsta         = MakeHistoFromConfig<TH1F>("ghost_fsta");
-    fph_ghost_purity       = MakeHistoFromConfig<TH1F>("ghost_purity");
-    fph_ghost_chi2_ndf     = MakeHistoFromConfig<TH1F>("ghost_chi2_ndf");
-    fph_ghost_prob         = MakeHistoFromConfig<TH1F>("ghost_prob");
-    fph_ghost_tx           = MakeHistoFromConfig<TH1F>("ghost_tx");
-    fph_ghost_ty           = MakeHistoFromConfig<TH1F>("ghost_ty");
-    fph_ghost_fhitR        = MakeHistoFromConfig<TH1F>("ghost_fhitR");
-    fph_ghost_nhits_vs_p   = MakeHistoFromConfig<TH2F>("ghost_nhits_vs_p");
-    fph_ghost_fsta_vs_p    = MakeHistoFromConfig<TH2F>("ghost_fsta_vs_p");
-    fph_ghost_lsta_vs_fsta = MakeHistoFromConfig<TH2F>("ghost_lsta_vs_fsta");
-
-    // Reconstructed tracks vs. MC quantities
-    fph_reco_pMC        = MakeHistoFromConfig<TH1F>("reco_pMC");
-    fph_reco_yMC        = MakeHistoFromConfig<TH1F>("reco_yMC");
-    fph_reco_pMC_vs_yMC = MakeHistoFromConfig<TH2F>("reco_pMC_vs_yMC");
-
-    // Residuals and pools of track parameters
-    fph_fst_res_x    = MakeHistoFromConfig<TH1F>("fst_res_x");
-    fph_fst_res_y    = MakeHistoFromConfig<TH1F>("fst_res_y");
-    fph_fst_res_tx   = MakeHistoFromConfig<TH1F>("fst_res_tx");
-    fph_fst_res_ty   = MakeHistoFromConfig<TH1F>("fst_res_ty");
-    fph_fst_res_qp   = MakeHistoFromConfig<TH1F>("fst_res_qp");
-    fph_fst_res_time = MakeHistoFromConfig<TH1F>("fst_res_time");
-    fph_fst_res_v    = MakeHistoFromConfig<TH1F>("fst_res_v");
-
-    fph_fst_pull_x    = MakeHistoFromConfig<TH1F>("fst_pull_x");
-    fph_fst_pull_y    = MakeHistoFromConfig<TH1F>("fst_pull_y");
-    fph_fst_pull_tx   = MakeHistoFromConfig<TH1F>("fst_pull_tx");
-    fph_fst_pull_ty   = MakeHistoFromConfig<TH1F>("fst_pull_ty");
-    fph_fst_pull_qp   = MakeHistoFromConfig<TH1F>("fst_pull_qp");
-    fph_fst_pull_time = MakeHistoFromConfig<TH1F>("fst_pull_time");
-    fph_fst_pull_v    = MakeHistoFromConfig<TH1F>("fst_pull_v");
+    RegisterTrackQa("prim", ETrackType::kPrim);
+    RegisterTrackQa("sec", ETrackType::kSec);
+    RegisterTrackQa("prim_pip", ETrackType::kPrimPIP);
+    RegisterTrackQa("prim_pim", ETrackType::kPrimPIM);
+    RegisterTrackQa("sec_pip", ETrackType::kSecPIP);
+    RegisterTrackQa("sec_pim", ETrackType::kSecPIM);
   }
 
   return kSUCCESS;
diff --git a/reco/L1/qa/CbmCaOutputQa.h b/reco/L1/qa/CbmCaOutputQa.h
index 930134f7415d08bc55d75e9ce9b1086c1b7eac54..cd7ebc203692728682545da907c23fd2b3843adf 100644
--- a/reco/L1/qa/CbmCaOutputQa.h
+++ b/reco/L1/qa/CbmCaOutputQa.h
@@ -32,9 +32,10 @@ namespace cbm::ca
     /// @brief Enumeration of track category
     enum ETrackType
     {
-      kAll,   ///< all tracks
-      kPrim,  ///< primary tracks
-      kSec,   ///< secondary tracks
+      kAll,    ///< all tracks
+      kGhost,  ///< ghost tracks (no MC is used)
+      kPrim,   ///< primary tracks
+      kSec,    ///< secondary tracks
       // kPrimEP,  ///< primary electron tracks
       // kPrimEM,  ///< primary positron tracks
       // kSecEP,   ///< secondary electron tracks
@@ -180,59 +181,6 @@ namespace cbm::ca
     std::array<std::unique_ptr<TrackTypeQa>, ETrackType::kEND> fvpTrackHistograms;
 
     std::array<std::tuple<Style_t, Marker_t, Color_t>, ETrackType::kEND> fvpTrackHistogramStyles;
-
-    // Reconstructed tracks
-    TH1F* fph_reco_p        = nullptr;  ///< Total momentum over charge of reconstructed tracks
-    TH1F* fph_reco_pt       = nullptr;  ///< Transverse momentum over charge of reconstructed tracks
-    TH1F* fph_reco_phi      = nullptr;  ///< Azimuthal angle of reconstructed tracks
-    TH1F* fph_reco_tx       = nullptr;  ///< Slope along x-axis of reconstructed tracks
-    TH1F* fph_reco_ty       = nullptr;  ///< Slope along y-axis of reconstructed tracks
-    TH1F* fph_reco_fhitR    = nullptr;  ///< Distance of the first hit from z-axis for reconstructed tracks
-    TH1F* fph_reco_nhits    = nullptr;  ///< Hit number of reconstructed tracks
-    TH1F* fph_reco_fsta     = nullptr;  ///< First station index of reconstructed tracks
-    TH1F* fph_reco_chi2_ndf = nullptr;  ///< Fit chi2 over NDF of reconstructed tracks
-    TH1F* fph_reco_prob     = nullptr;  ///< Fit probability of reconstructed tracks
-    TH1F* fph_rest_chi2_ndf = nullptr;  ///< Fit chi2 over NDF of non-reconstructable tracks
-    TH1F* fph_rest_prob     = nullptr;  ///< Fit probability of non-reconstructable tracks
-
-    // Ghost tracks
-    TH1F* fph_ghost_p            = nullptr;  ///< Total momentum over charge of ghost tracks
-    TH1F* fph_ghost_pt           = nullptr;  ///< Transverse momentum over charge of ghost tracks
-    TH1F* fph_ghost_phi          = nullptr;  ///< Azimuthal angle of ghost tracks
-    TH1F* fph_ghost_nhits        = nullptr;  ///< Hit number of ghost tracks
-    TH1F* fph_ghost_fsta         = nullptr;  ///< First station index of ghost tracks
-    TH1F* fph_ghost_purity       = nullptr;  ///< Purity of ghost tracks
-    TH1F* fph_ghost_chi2_ndf     = nullptr;  ///< Fit chi2 over NDF of ghost tracks
-    TH1F* fph_ghost_prob         = nullptr;  ///< Fit probability of ghost tracks
-    TH1F* fph_ghost_tx           = nullptr;  ///< Slope along x-axis of ghost tracks
-    TH1F* fph_ghost_ty           = nullptr;  ///< Slope along y-axis of ghost tracks
-    TH1F* fph_ghost_fhitR        = nullptr;  ///< Distance of the first hit from z-axis for ghost tracks
-    TH2F* fph_ghost_nhits_vs_p   = nullptr;  ///< Hit number vs. total momentum over charge of ghost tracks
-    TH2F* fph_ghost_fsta_vs_p    = nullptr;  ///< First station index vs. total momentum over charge for ghost tracks
-    TH2F* fph_ghost_lsta_vs_fsta = nullptr;  ///< Last station index vs. first station index of ghost tracks
-
-    // Reco tracks vs MC variables
-    TH1F* fph_reco_pMC        = nullptr;  ///< Reconstructed track distribution vs MC momemntum
-    TH1F* fph_reco_yMC        = nullptr;  ///< Reconstructed track distribution vs MC rapidity
-    TH2F* fph_reco_pMC_vs_yMC = nullptr;  ///< Reconstructed track phase space (MC mom vs rapidity)
-    TH1F* fph_reco_purity     = nullptr;  ///< Purity of reconstructed tracks (\note purity requires MC information)
-
-    // Residuals and pulls at the first track point
-    TH1F* fph_fst_res_x    = nullptr;  ///< Residual of x at first track point [cm]
-    TH1F* fph_fst_res_y    = nullptr;  ///< Residual of y at first track point [cm]
-    TH1F* fph_fst_res_tx   = nullptr;  ///< Residual of tx at first track point
-    TH1F* fph_fst_res_ty   = nullptr;  ///< Residual of ty at first track point
-    TH1F* fph_fst_res_qp   = nullptr;  ///< Residual of q/p at first track point  [GeV/ec]
-    TH1F* fph_fst_res_time = nullptr;  ///< Residual of time at first track point [ns]
-    TH1F* fph_fst_res_v    = nullptr;  ///< Residual of velocity at first track point [c]
-
-    TH1F* fph_fst_pull_x    = nullptr;  ///< Pull of x at first track point [cm]
-    TH1F* fph_fst_pull_y    = nullptr;  ///< Pull of y at first track point [cm]
-    TH1F* fph_fst_pull_tx   = nullptr;  ///< Pull of tx at first track point
-    TH1F* fph_fst_pull_ty   = nullptr;  ///< Pull of ty at first track point
-    TH1F* fph_fst_pull_qp   = nullptr;  ///< Pull of q/p at first track point  [GeV/ec]
-    TH1F* fph_fst_pull_time = nullptr;  ///< Pull of time at first track point [ns]
-    TH1F* fph_fst_pull_v    = nullptr;  ///< Pull of velocity at first track point [c]
   };
 }  // namespace cbm::ca
 
diff --git a/reco/L1/qa/CbmCaTrackTypeQa.cxx b/reco/L1/qa/CbmCaTrackTypeQa.cxx
index c69ce7aa16880da7101543e3df1086843b98bad4..eed783fb873e9fbf047ce6912d99920d5f5f9c44 100644
--- a/reco/L1/qa/CbmCaTrackTypeQa.cxx
+++ b/reco/L1/qa/CbmCaTrackTypeQa.cxx
@@ -37,6 +37,9 @@ void TrackTypeQa::Init()
   assert(fpvHits);
   assert(!fbUseMC || fpMCData);
 
+  //
+  // ** Distributions of reconstructed tracks vs. reconstructed quantities **
+  //
   fph_reco_p     = MakeHisto<TH1F>("reco_p", "", kBinsP, kLoP, kUpP);
   fph_reco_pt    = MakeHisto<TH1F>("reco_pt", "", kBinsPT, kLoPT, kUpPT);
   fph_reco_eta   = MakeHisto<TH1F>("reco_eta", "", kBinsETA, kLoETA, kUpETA);
@@ -48,36 +51,68 @@ void TrackTypeQa::Init()
   fph_reco_nhits = MakeHisto<TH1F>("reco_nhits", "", kBinsNHITS, kLoNHITS, kUpNHITS);
   // TODO: ...
 
-  fph_reco_p->SetTitle("Total momentum of reconstructed track;p_{reco} [GeV/c]");
-  fph_reco_pt->SetTitle("Transverse momentum of reconstructed track;p_{T}_{reco} [GeV/c]");
-  fph_reco_phi->SetTitle("Azimuthal angle of reconstructed track;#phi_{reco} [rad]");
-  fph_reco_theta->SetTitle("Polar angle of reconstructed track;#theta_{reco} [rad]");
-  fph_reco_tx->SetTitle("Slope along x-axis of reconstructed tracks;t_{x}");
-  fph_reco_ty->SetTitle("Slope along y-axis of reconstructed tracks;t_{y}");
+  fph_reco_p->SetTitle("Total momentum of reconstructed track;p^{reco} [GeV/c]");
+  fph_reco_pt->SetTitle("Transverse momentum of reconstructed track;p_{T}^{reco} [GeV/c]");
+  fph_reco_phi->SetTitle("Azimuthal angle of reconstructed track;#phi^{reco} [rad]");
+  fph_reco_theta->SetTitle("Polar angle of reconstructed track;#theta^{reco} [rad]");
+  fph_reco_tx->SetTitle("Slope along x-axis of reconstructed tracks;t_{x}^{reco}");
+  fph_reco_ty->SetTitle("Slope along y-axis of reconstructed tracks;t_{y}^{reco}");
   fph_reco_fhitR->SetTitle("Distance of the first hit from z-axis for reconstructed tracks");
   fph_reco_nhits->SetTitle("Hit number of reconstructed tracks");
 
   if (fbUseMC) {
+    //
+    // ** Distributions of reconstructed tracks vs. MC quantities **
+    //
     fph_reco_pMC     = MakeHisto<TH1F>("reco_pMC", "", kBinsP, kLoP, kUpP);
     fph_reco_yMC     = MakeHisto<TH1F>("reco_yMC", "", kBinsY, kLoY, kUpY);
     fph_reco_pMC_yMC = MakeHisto<TH2F>("reco_pMC_yMC", "", kBinsY, kLoY, kUpY, kBinsP, kLoP, kUpP);
     fph_reco_phiMC   = MakeHisto<TH1F>("reco_phiMC", "", kBinsPHI, kLoPHI, kUpPHI);
     fph_reco_thetaMC = MakeHisto<TH1F>("reco_thetaMC", "", kBinsTHETA, kLoTHETA, kUpTHETA);
 
-    fph_reco_pMC->SetTitle("MC total momentum of reconstructed track;p_{MC} [GeV/c]");
-    fph_reco_yMC->SetTitle("MC rapidity of reconstructed track;y_{MC}");
-    fph_reco_pMC_yMC->SetTitle("Transverse momentum of reconstructed track;y_{MC};p_{T}_{MC} [GeV/c]");
-    fph_reco_phiMC->SetTitle("Azimuthal angle of reconstructed track;#phi_{reco} [rad]");
-    fph_reco_thetaMC->SetTitle("Polar angle of reconstructed track;#theta_{reco} [rad]");
+    fph_reco_pMC->SetTitle("MC total momentum of reconstructed track;p^{MC} [GeV/c]");
+    fph_reco_yMC->SetTitle("MC rapidity of reconstructed track;y^{MC}");
+    fph_reco_pMC_yMC->SetTitle("Transverse momentum of reconstructed track;y^{MC};p_{T}^{MC} [GeV/c]");
+    fph_reco_phiMC->SetTitle("Azimuthal angle of reconstructed track;#phi^{MC} [rad]");
+    fph_reco_thetaMC->SetTitle("Polar angle of reconstructed track;#theta^{MC} [rad]");
 
     fph_mc_pMC     = MakeHisto<TH1F>("mc_pMC", "", kBinsP, kLoP, kUpP);
     fph_mc_yMC     = MakeHisto<TH1F>("mc_yMC", "", kBinsY, kLoY, kUpY);
     fph_mc_pMC_yMC = MakeHisto<TH2F>("mc_pMC_yMC", "", kBinsY, kLoY, kUpY, kBinsP, kLoP, kUpP);
 
-    fph_mc_pMC->SetTitle("MC total momentum of MC tracks;p_{MC} [GeV/c]");
-    fph_mc_yMC->SetTitle("MC rapidity of MC tracks;y_{MC}");
-    fph_mc_pMC_yMC->SetTitle("MC total momentum vs. MC rapidity of MC tracks;y_{MC};p_{MC} [GeV/c]");
-
+    fph_mc_pMC->SetTitle("MC total momentum of MC tracks;p^{MC} [GeV/c]");
+    fph_mc_yMC->SetTitle("MC rapidity of MC tracks;y^{MC}");
+    fph_mc_pMC_yMC->SetTitle("MC total momentum vs. MC rapidity of MC tracks;y^{MC};p^{MC} [GeV/c]");
+
+    //
+    // ** Efficiencies **
+    //
+    fph_eff_int     = MakeHisto<TProfile>("eff_int", "", 1, -0.5, 0.5, 0., 1.);
+    fph_eff_pMC     = MakeHisto<TProfile>("eff_pMC", "", kBinsP, kLoP, kUpP, 0., 1.);
+    fph_eff_yMC     = MakeHisto<TProfile>("eff_yMC", "", kBinsY, kLoY, kUpY, 0., 1.);
+    fph_eff_ptMC    = MakeHisto<TProfile>("eff_ptMC", "", kBinsPT, kLoPT, kUpPT, 0., 1.);
+    fph_eff_thetaMC = MakeHisto<TProfile>("eff_thetaMC", "", kBinsTHETA, kLoTHETA, kUpTHETA, 0., 1.);
+    fph_eff_phiMC   = MakeHisto<TProfile>("eff_phiMC", "", kBinsPHI, kLoPHI, kUpPHI, 0., 1.);
+    fph_eff_nhitsMC = MakeHisto<TProfile>("eff_nhitsMC", "", kBinsNHITS, kLoNHITS, kUpNHITS, 0., 1.);
+
+    fph_eff_int->SetTitle("Integrated efficiency;;#epsilon_{CA}");
+    fph_eff_pMC->SetTitle("Efficiency vs. MC total momentum;p_{MC} [GeV/c];#epsilon_{CA}");
+    fph_eff_yMC->SetTitle("Efficiency vs. MC rapidity;y_{MC};#epsilon");
+    fph_eff_ptMC->SetTitle("Efficiency vs. MC total momentum;p_{T}^{MC} [GeV/c];#epsilon_{CA}");
+    fph_eff_thetaMC->SetTitle("Efficiency vs. MC polar angle;#theta^{MC};#epsilon_{CA}");
+    fph_eff_phiMC->SetTitle("Efficiency vs. MC azimuthal angle;#phi^{MC};#epsilon_{CA}");
+    fph_eff_nhitsMC->SetTitle("Efficiency vs. MC number of stations with hits;N_{hit}^{MC};#epsilon_{CA}");
+
+    fph_eff_pMC_yMC = MakeHisto<TProfile2D>("eff_pMC_yMC", "", kBinsY, kLoY, kUpY, kBinsP, kLoP, kUpP, 0., 1.);
+    fph_eff_thetaMC_phiMC =
+      MakeHisto<TProfile2D>("eff_theta_phi", "", kBinsPHI, kLoPHI, kUpPHI, kBinsTHETA, kLoTHETA, kUpTHETA, 0., 1.);
+
+    fph_eff_pMC_yMC->SetTitle("Efficiency vs. MC total momentum and MC rapidity;y^{MC};#epsilon_{CA};p^{MC} [GeV/c]");
+    fph_eff_thetaMC_phiMC->SetTitle(
+      "Efficiency vs. MC polar and azimuthal angles;#phi^{MC} [rad];#theta^{MC} [rad];#epsilon_{CA}");
+    //
+    // ** Track fit parameter properties (residuals and pulls) **
+    //
     fpFitQaFirstHit = std::make_unique<TrackFitQa>("fst_hit", fsPrefix, fpFolderRoot);
     fpFitQaFirstHit->SetTitle("First hit");
     fpFitQaFirstHit->Init();
@@ -151,7 +186,27 @@ void TrackTypeQa::FillMCTrack(int iTrkMC, double weight)
   assert(fbUseMC);
 
   const MCTrack& mcTrack = fpMCData->GetTrack(iTrkMC);
+
+  // Only reconstructable tracks are considered (?)
+  if (!mcTrack.IsReconstructable()) { return; }
+
+  // ** Distributions **
   fph_mc_pMC->Fill(mcTrack.GetP(), weight);
   fph_mc_yMC->Fill(mcTrack.GetRapidity(), weight);
   fph_mc_pMC_yMC->Fill(mcTrack.GetRapidity(), mcTrack.GetP(), weight);
+
+  // ** Efficiencies **
+  bool bReco = mcTrack.IsReconstructed();
+
+  // NOTE: Weight is ignored in efficiencies
+  fph_eff_int->Fill(0., bReco);
+  fph_eff_pMC->Fill(mcTrack.GetP(), bReco);
+  fph_eff_yMC->Fill(mcTrack.GetRapidity(), bReco);
+  fph_eff_ptMC->Fill(mcTrack.GetPt(), bReco);
+  fph_eff_thetaMC->Fill(mcTrack.GetTheta(), bReco);
+  fph_eff_phiMC->Fill(mcTrack.GetPhi(), bReco);
+  fph_eff_nhitsMC->Fill(mcTrack.GetTotNofStationsWithHit(), bReco);
+
+  fph_eff_pMC_yMC->Fill(mcTrack.GetRapidity(), mcTrack.GetP(), bReco);
+  fph_eff_thetaMC_phiMC->Fill(mcTrack.GetPhi(), mcTrack.GetPhi(), bReco);
 }
diff --git a/reco/L1/qa/CbmCaTrackTypeQa.h b/reco/L1/qa/CbmCaTrackTypeQa.h
index c54479019fc2a9de4f6c2619033426fa40529fc2..13acc148490ab9147d28031f757609c450ebd12f 100644
--- a/reco/L1/qa/CbmCaTrackTypeQa.h
+++ b/reco/L1/qa/CbmCaTrackTypeQa.h
@@ -30,6 +30,7 @@ class CbmL1HitDebugInfo;
 class TH1F;
 class TH2F;
 class TProfile;
+class TProfile2D;
 
 namespace cbm::ca
 {
@@ -147,9 +148,17 @@ namespace cbm::ca
     TH1F* fph_mc_tyMC    = nullptr;  ///< Slope along y-axis of reconstructed tracks
 
     // ** Efficiencies **
-    TProfile* fph_eff_p     = nullptr;  ///< Track efficiency
-    TProfile* fph_eff_nhits = nullptr;
-    TProfile* fph_eff_pMC   = nullptr;
+    TProfile* fph_eff_int     = nullptr;  ///< Integrated efficiency
+    TProfile* fph_eff_pMC     = nullptr;  ///< Efficiency vs. MC momentum
+    TProfile* fph_eff_yMC     = nullptr;  ///< Efficiency vs. MC rapidity
+    TProfile* fph_eff_ptMC    = nullptr;  ///< Efficiency vs. MC transverse momentum
+    TProfile* fph_eff_thetaMC = nullptr;  ///< Efficiency vs. MC polar angle
+    TProfile* fph_eff_phiMC   = nullptr;  ///< Efficiency vs. MC azimuthal angle
+    TProfile* fph_eff_nhitsMC = nullptr;  ///< Efficiency vs. MC number of hits
+
+    TProfile2D* fph_eff_thetaMC_phiMC = nullptr;  ///< Efficiency vs. MC theta and MC phi
+    TProfile2D* fph_eff_pMC_yMC       = nullptr;  ///< Efficiency vs. MC momentum and MC rapidity
+    TProfile2D* fph_eff_tyMC_txMC     = nullptr;  ///< Efficiency vs. MC slopes
 
     // ** Fit QA **
     std::unique_ptr<TrackFitQa> fpFitQaFirstMCpoint = nullptr;
@@ -206,4 +215,4 @@ namespace cbm::ca
   };
 }  // namespace cbm::ca
 
-#endif  // CbmCaOutput
\ No newline at end of file
+#endif  // CbmCaOutput