From 6d9dd2acc845948fd86bee021359e12df5fc58f4 Mon Sep 17 00:00:00 2001
From: Florian Uhlig <f.uhlig@gsi.de>
Date: Tue, 5 Dec 2023 14:54:38 +0100
Subject: [PATCH] Add event based CI tests for MVD QA

Add CbmMvdQa to the reconstruction test to create residuals for the MVD.
Small fixes in CbmMvdQa to get the task running again. Attach tracks only of
requested. Fix issue when writting the output.
---
 analysis/detectors/mvd/qa/CbmMvdQa.cxx | 96 +++++++++++++++++---------
 macro/mvd/qa/CMakeLists.txt            | 14 ++--
 macro/mvd/qa/mvd_qa4_reco_event.C      |  2 -
 3 files changed, 70 insertions(+), 42 deletions(-)

diff --git a/analysis/detectors/mvd/qa/CbmMvdQa.cxx b/analysis/detectors/mvd/qa/CbmMvdQa.cxx
index 411296cf92..29af627019 100644
--- a/analysis/detectors/mvd/qa/CbmMvdQa.cxx
+++ b/analysis/detectors/mvd/qa/CbmMvdQa.cxx
@@ -119,13 +119,29 @@ InitStatus CbmMvdQa::Init()
   fBadTracks = new TClonesArray("CbmStsTrack", 5000);
   ioman->Register("BadTracks", "sts", fBadTracks, IsOutputBranchPersistent("BadTracks"));
 
-  fStsTrackMatches  = (TClonesArray*) ioman->GetObject("StsTrackMatch");
-  fStsTrackArray    = (TClonesArray*) ioman->GetObject("StsTrack");
-  fGlobalTrackArray = (TClonesArray*) ioman->GetObject("GlobalTrack");
+  if (useTrackQa) {
+    fStsTrackMatches  = (TClonesArray*) ioman->GetObject("StsTrackMatch");
+    fStsTrackArray    = (TClonesArray*) ioman->GetObject("StsTrack");
+    fGlobalTrackArray = (TClonesArray*) ioman->GetObject("GlobalTrack");
 
-  if (!fStsTrackArray) { Fatal("CbmMvdQa: StsTrackArray not found (!)", " That's bad. "); }
+    if (!fStsTrackArray) {
+      Fatal("CbmMvdQa: StsTrackArray not found (!)", " That's bad. ");
+    }
+
+    //    fPrimVtx         = (CbmVertex*) ioman->GetObject("PrimaryVertex");
+    // Get pointer to PrimaryVertex object from IOManager if it exists
+    // The old name for the object is "PrimaryVertex" the new one
+    // "PrimaryVertex." Check first for the new name
+    fPrimVtx = dynamic_cast<CbmVertex*>(ioman->GetObject("PrimaryVertex."));
+    if (nullptr == fPrimVtx) {
+      fPrimVtx = dynamic_cast<CbmVertex*>(ioman->GetObject("PrimaryVertex"));
+    }
+    if (nullptr == fPrimVtx) {
+      //      LOG(fatal) << "No primary vertex";
+    }
+  }
 
-  fMcPoints          = (TClonesArray*) ioman->GetObject("MvdPileUpMC");  // PileUp Mc points
+  fMcPoints          = (TClonesArray*) ioman->GetObject("MvdPoint");  // PileUp Mc points
   fMvdDigis          = (TClonesArray*) ioman->GetObject("MvdDigi");
   fMvdCluster        = (TClonesArray*) ioman->GetObject("MvdCluster");
   fMvdHits           = (TClonesArray*) ioman->GetObject("MvdHit");
@@ -135,16 +151,6 @@ InitStatus CbmMvdQa::Init()
   if (fMvdHits->GetEntriesFast() != fMvdHitMatchArray->GetEntriesFast())
     LOG(error) << "MvdHit and MvdHitMatch Arrays do not have the same size";
 
-  //    fPrimVtx         = (CbmVertex*) ioman->GetObject("PrimaryVertex");
-  // Get pointer to PrimaryVertex object from IOManager if it exists
-  // The old name for the object is "PrimaryVertex" the new one
-  // "PrimaryVertex." Check first for the new name
-  fPrimVtx = dynamic_cast<CbmVertex*>(ioman->GetObject("PrimaryVertex."));
-  if (nullptr == fPrimVtx) { fPrimVtx = dynamic_cast<CbmVertex*>(ioman->GetObject("PrimaryVertex")); }
-  if (nullptr == fPrimVtx) {
-    //      LOG(fatal) << "No primary vertex";
-  }
-
   fListMCTracks = (TClonesArray*) ioman->GetObject("MCTrack");
 
   if (!fMcPoints) {
@@ -549,7 +555,9 @@ void CbmMvdQa::ExecMCQa()
 
   for (Int_t i = 0; i < nrMcPoints; ++i) {
     CbmMvdPoint* curMc = (CbmMvdPoint*) fMcPoints->At(i);
-    if (curMc->GetZ() < fFirstMvdPos + 1) { fMC2F[0]->Fill(curMc->GetX(), curMc->GetY()); }
+    if (curMc->GetZ() < fFirstMvdPos + 1) {
+      fMC2F[0]->Fill(curMc->GetX(), curMc->GetY());
+    }
   }
 }
 // -------------------------------------------------------------------------
@@ -578,7 +586,8 @@ void CbmMvdQa::ExecDigiQa()
       Double_t lab[3]       = {0., 0., 0.};
       if (curSens->GetDetectorID() == curDigi->GetDetectorId()) {
         curSens->PixelToTop(curDigi->GetPixelX(), curDigi->GetPixelY(), lab);
-        if (curSens->GetZ() < 6) fDigi2F[1]->Fill(lab[0], lab[1]);
+        if (curSens->GetZ() < 6)
+          fDigi2F[1]->Fill(lab[0], lab[1]);
         else if (curSens->GetZ() < 11)
           fDigi2F[2]->Fill(lab[0], lab[1]);
         else if (curSens->GetZ() < 16)
@@ -586,7 +595,9 @@ void CbmMvdQa::ExecDigiQa()
         else
           fDigi2F[4]->Fill(lab[0], lab[1]);
 
-        if (lab[0] > -2 && lab[0] <= -0.5 && lab[1] >= -1.5 && lab[1] <= 1.5) { fDigi2F[0]->Fill(lab[0], lab[1]); }
+        if (lab[0] > -2 && lab[0] <= -0.5 && lab[1] >= -1.5 && lab[1] <= 1.5) {
+          fDigi2F[0]->Fill(lab[0], lab[1]);
+        }
       }
     }
   }
@@ -667,7 +678,8 @@ void CbmMvdQa::ExecTrackQa()
     stsTrack   = (CbmStsTrack*) fStsTrackArray->At(glTrack->GetStsTrackIndex());
     trackMatch = (CbmTrackMatchNew*) fStsTrackMatches->At(glTrack->GetStsTrackIndex());
     mcMatchId  = trackMatch->GetMatchedLink().GetIndex();
-    if (mcMatchId > -1) mcTrack = (CbmMCTrack*) fListMCTracks->At(mcMatchId);
+    if (mcMatchId > -1)
+      mcTrack = (CbmMCTrack*) fListMCTracks->At(mcMatchId);
     else
       continue;
 
@@ -690,7 +702,8 @@ void CbmMvdQa::ExecTrackQa()
     if (hasHitFirst) {
       if (mcP < 1.5) {
         fnrTrackslowP++;
-        if (mcP >= 1) fhigh++;
+        if (mcP >= 1)
+          fhigh++;
         else if (mcP >= 0.5)
           fmid++;
         else
@@ -749,22 +762,27 @@ void CbmMvdQa::ExecTrackQa()
 
       if (glQP >= 0) {
         fTracks1F[22]->Fill(glX);
-        if (mcP >= 1) fTracks1F[26]->Fill(glX);
+        if (mcP >= 1)
+          fTracks1F[26]->Fill(glX);
         else
           fTracks1F[27]->Fill(glX);
       }
       if (glQP < 0) {
         fTracks1F[23]->Fill(glX);
-        if (mcP >= 1) fTracks1F[28]->Fill(glX);
+        if (mcP >= 1)
+          fTracks1F[28]->Fill(glX);
         else
           fTracks1F[29]->Fill(glX);
       }
-      if (ChiSqOverNDF > 1) fTracks1F[24]->Fill(glX);
+      if (ChiSqOverNDF > 1)
+        fTracks1F[24]->Fill(glX);
       else
         fTracks1F[25]->Fill(glX);
     }
 
-    if (ChiSqOverNDF > 1) { fTracks1F[20]->Fill(sqrt((glX * glX) + (glY * glY))); }
+    if (ChiSqOverNDF > 1) {
+      fTracks1F[20]->Fill(sqrt((glX * glX) + (glY * glY)));
+    }
     else {
       fTracks1F[21]->Fill(sqrt((glX * glX) + (glY * glY)));
     }
@@ -779,7 +797,8 @@ void CbmMvdQa::ExecTrackQa()
       if (trueOverAll == 1.) fTracks2F[4]->Fill(mcP, mcP - glP);
     }
 
-    if (hasHitFirst) fTracks2F[5]->Fill(mcP, mcP - glP);
+    if (hasHitFirst)
+      fTracks2F[5]->Fill(mcP, mcP - glP);
     else
       fTracks2F[6]->Fill(mcP, mcP - glP);
 
@@ -788,7 +807,8 @@ void CbmMvdQa::ExecTrackQa()
       if (ChiSqOverNDF <= 1) fTracks2F[8]->Fill(hitFirst[0], hitFirst[1]);
       if (mcP < 1.5) {
         fTracks2F[9]->Fill(0.1, 0.1);
-        if (mcP >= 1) fTracks2F[11]->Fill(1.25, 0.1);
+        if (mcP >= 1)
+          fTracks2F[11]->Fill(1.25, 0.1);
         else if (mcP >= 0.5)
           fTracks2F[11]->Fill(0.75, 0.1);
         else
@@ -801,7 +821,8 @@ void CbmMvdQa::ExecTrackQa()
     if (hasHitFirstTrue) {
       if (mcP < 1.5) {
         fTracks2F[9]->Fill(0.1, 0.70);
-        if (mcP >= 1) fTracks2F[11]->Fill(1.25, 0.7);
+        if (mcP >= 1)
+          fTracks2F[11]->Fill(1.25, 0.7);
         else if (mcP >= 0.5)
           fTracks2F[11]->Fill(0.75, 0.7);
         else
@@ -847,7 +868,9 @@ Bool_t CbmMvdQa::HasHitFirstTrue(Int_t MCtrackID, CbmStsTrack* stsTrack)
   const CbmMvdPoint* point = nullptr;
   for (Int_t iHit = 0; iHit < nrOfMvdHits; iHit++) {
     CbmMatch* mvdMatch = (CbmMatch*) fMvdHitMatchArray->At(stsTrack->GetMvdHitIndex(iHit));
-    if (mvdMatch) { nrOfLinks = mvdMatch->GetNofLinks(); }
+    if (mvdMatch) {
+      nrOfLinks = mvdMatch->GetNofLinks();
+    }
     else {
       continue;  // any kind of error in the matching
     }
@@ -859,7 +882,9 @@ Bool_t CbmMvdQa::HasHitFirstTrue(Int_t MCtrackID, CbmStsTrack* stsTrack)
       }
       else
         mcTrackId = point->GetTrackID();
-      if (mcTrackId == MCtrackID && point->GetZOut() < fFirstMvdPos + 1) { return kTRUE; }
+      if (mcTrackId == MCtrackID && point->GetZOut() < fFirstMvdPos + 1) {
+        return kTRUE;
+      }
     }
   }
 
@@ -875,7 +900,9 @@ void CbmMvdQa::GetFirstMCPos(CbmStsTrack* stsTrack, Float_t* pos)
   const CbmMvdPoint* point = nullptr;
   for (Int_t iHit = 0; iHit < nrOfMvdHits; iHit++) {
     CbmMatch* mvdMatch = (CbmMatch*) fMvdHitMatchArray->At(stsTrack->GetMvdHitIndex(iHit));
-    if (mvdMatch) { nrOfLinks = mvdMatch->GetNofLinks(); }
+    if (mvdMatch) {
+      nrOfLinks = mvdMatch->GetNofLinks();
+    }
     else {
       continue;  // any kind of error in the matching
     }
@@ -926,7 +953,9 @@ void CbmMvdQa::SetMatches(Int_t MCtrackID, CbmStsTrack* stsTrack)
       }
       else
         mcTrackId = point->GetTrackID();
-      if (mcTrackId == MCtrackID) { hasTrack = kTRUE; }
+      if (mcTrackId == MCtrackID) {
+        hasTrack = kTRUE;
+      }
     }
     if (!hasTrack) falseCounter++;
   }
@@ -941,14 +970,15 @@ void CbmMvdQa::SetMatches(Int_t MCtrackID, CbmStsTrack* stsTrack)
 //-----------------------------------------------------------------------------------------
 void CbmMvdQa::Finish()
 {
-  foutFile->cd();
+
+  //  foutFile->cd();
 
   if (useMcQa) FinishMCQa();
   if (useDigiQa) FinishDigiQa();
   if (useHitQa) FinishHitQa();
   if (useTrackQa) FinishTrackQa();
 
-  foutFile->Write();
+  //  foutFile->Write();
 }
 //-----------------------------------------------------------------------------------------
 
diff --git a/macro/mvd/qa/CMakeLists.txt b/macro/mvd/qa/CMakeLists.txt
index cbecc2c9df..96f0d9dc5f 100644
--- a/macro/mvd/qa/CMakeLists.txt
+++ b/macro/mvd/qa/CMakeLists.txt
@@ -56,13 +56,13 @@ SET_TESTS_PROPERTIES(mvd_qa3_digitize_event PROPERTIES
         FIXTURES_SETUP fixture_mvd_qa4_reco_event
 )
 
-#GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/mvd/qa/mvd_qa4_reco_event.C)
-#add_test(mvd_qa4_reco_event ${CBMROOT_BINARY_DIR}/macro/mvd/qa/mvd_qa4_reco_event.sh)
-#SET_TESTS_PROPERTIES(mvd_qa4_reco_event PROPERTIES
-#        TIMEOUT "300"
-#        PASS_REGULAR_EXPRESSION "Test Passed;All ok"
-#        FIXTURES_REQUIRED fixture_mvd_qa4_reco_event
-#)
+GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/mvd/qa/mvd_qa4_reco_event.C)
+add_test(mvd_qa4_reco_event ${CBMROOT_BINARY_DIR}/macro/mvd/qa/mvd_qa4_reco_event.sh)
+SET_TESTS_PROPERTIES(mvd_qa4_reco_event PROPERTIES
+        TIMEOUT "300"
+        PASS_REGULAR_EXPRESSION "Test Passed;All ok"
+        FIXTURES_REQUIRED fixture_mvd_qa4_reco_event
+)
 
 Install(FILES mvd_qa1_transUrqmd.C mvd_qa2_transDelta.C mvd_qa3_digitize.C mvd_qa4_reco.C
         DESTINATION share/cbmroot/macro/mvd
diff --git a/macro/mvd/qa/mvd_qa4_reco_event.C b/macro/mvd/qa/mvd_qa4_reco_event.C
index a19f599813..9e4ad9c2e9 100644
--- a/macro/mvd/qa/mvd_qa4_reco_event.C
+++ b/macro/mvd/qa/mvd_qa4_reco_event.C
@@ -99,14 +99,12 @@ void mvd_qa4_reco_event(const char* setup = "sis100_electron")
   mvd_hit->SetMode(ECbmRecoMode::EventByEvent);
   fRun->AddTask(mvd_hit);
 
-/*
   CbmMatchRecoToMC* match = new CbmMatchRecoToMC();
   fRun->AddTask(match);
 
   CbmMvdQa* qaTask = new CbmMvdQa("CbmMvdQa");
   qaTask->SetUseHitQa();
   fRun->AddTask(qaTask);
-*/
   //----------------------------------------------------------------------------
   // -----  Parameter database   -----------------------------------------------
   FairRuntimeDb* rtdb       = fRun->GetRuntimeDb();
-- 
GitLab