From caa3df2278fcc5c2dec089ac7dc5864511650f8e Mon Sep 17 00:00:00 2001
From: Frederic Julian Linz <f.linz@gsi.de>
Date: Mon, 20 Feb 2023 11:00:55 +0000
Subject: [PATCH] T0 introduced to AT converter

Check cbm_header init before using it.
Added runtime error for MCEventList.
---
 .../CbmRecEventHeaderConverter.cxx                  |  7 ++++++-
 .../CbmRecEventHeaderConverter.h                    |  1 +
 .../CbmSimEventHeaderConverter.cxx                  | 13 +++++++++++--
 .../CbmSimEventHeaderConverter.h                    |  3 +++
 .../analysis_tree_converter/CbmTofHitsConverter.cxx |  4 ++--
 5 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/analysis/common/analysis_tree_converter/CbmRecEventHeaderConverter.cxx b/analysis/common/analysis_tree_converter/CbmRecEventHeaderConverter.cxx
index 496c622975..f0bd85f816 100644
--- a/analysis/common/analysis_tree_converter/CbmRecEventHeaderConverter.cxx
+++ b/analysis/common/analysis_tree_converter/CbmRecEventHeaderConverter.cxx
@@ -38,6 +38,7 @@ void CbmRecEventHeaderConverter::Init()
   RecEventHeaderBranch.AddField<float>("start_time", "Start time of the event, ns");
   RecEventHeaderBranch.AddField<float>("end_time", "End time of the event, ns");
   RecEventHeaderBranch.AddField<float>("match_weight", "");
+  RecEventHeaderBranch.AddField<float>("T0", "Reconstructed T0, ns");
 
   ivtx_chi2_     = RecEventHeaderBranch.GetFieldId("vtx_chi2");
   iEpsd_         = RecEventHeaderBranch.GetFieldId("Epsd");
@@ -46,6 +47,7 @@ void CbmRecEventHeaderConverter::Init()
   istart_time_   = RecEventHeaderBranch.GetFieldId("start_time");
   iend_time_     = RecEventHeaderBranch.GetFieldId("end_time");
   imatch_weight_ = RecEventHeaderBranch.GetFieldId("match_weight");
+  iT0_           = RecEventHeaderBranch.GetFieldId("T0");
 
   auto* man = AnalysisTree::TaskManager::GetInstance();
   man->AddBranch(rec_event_header_, RecEventHeaderBranch);
@@ -66,11 +68,12 @@ void CbmRecEventHeaderConverter::ProcessData(CbmEvent* event)
   rec_event_header_->SetField(GetPsdEnergy(event), iEpsd_);
 
   int evt_id;
-  float match_weight, start_time, end_time;
+  float match_weight, start_time, end_time, T0;
   if (event) {
     evt_id     = event->GetUniqueID();
     start_time = event->GetStartTime();
     end_time   = event->GetEndTime();
+    T0         = event->GetTzero();
     if (event->GetMatch()) match_weight = float(event->GetMatch()->GetMatchedLink().GetWeight());
     else
       match_weight = 0.;
@@ -79,11 +82,13 @@ void CbmRecEventHeaderConverter::ProcessData(CbmEvent* event)
     evt_id       = cbm_header_->GetEventID();
     start_time   = cbm_header_->GetT();
     end_time     = cbm_header_->GetT();
+    T0           = -999999.;
     match_weight = 1.;
   }
   rec_event_header_->SetField(evt_id, ievt_id_);
   rec_event_header_->SetField(start_time, istart_time_);
   rec_event_header_->SetField(end_time, iend_time_);
+  rec_event_header_->SetField(T0, iT0_);
   rec_event_header_->SetField(match_weight, imatch_weight_);
 }
 
diff --git a/analysis/common/analysis_tree_converter/CbmRecEventHeaderConverter.h b/analysis/common/analysis_tree_converter/CbmRecEventHeaderConverter.h
index 2276e1ec8e..ae61c45c20 100644
--- a/analysis/common/analysis_tree_converter/CbmRecEventHeaderConverter.h
+++ b/analysis/common/analysis_tree_converter/CbmRecEventHeaderConverter.h
@@ -41,6 +41,7 @@ private:
   int istart_time_ {AnalysisTree::UndefValueInt};
   int iend_time_ {AnalysisTree::UndefValueInt};
   int imatch_weight_ {AnalysisTree::UndefValueInt};
+  int iT0_ {AnalysisTree::UndefValueInt};
 
   ClassDef(CbmRecEventHeaderConverter, 1)
 };
diff --git a/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.cxx b/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.cxx
index 9e704094fe..cf8120b2c7 100644
--- a/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.cxx
+++ b/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.cxx
@@ -29,6 +29,8 @@ void CbmSimEventHeaderConverter::Init()
 
   cbm_mc_manager_ = dynamic_cast<CbmMCDataManager*>(ioman->GetObject("MCDataManager"));
   cbm_header_obj_ = cbm_mc_manager_->GetObject("MCEventHeader.");
+  cbm_mc_event_list_ = (CbmMCEventList*) ioman->GetObject("MCEventList.");
+  if (!cbm_mc_event_list_) { throw std::runtime_error("CbmSimEventHeaderConverter::Init - ERROR! No fMCEventList!"); }
 
   //  ***** SimEventHeader *******
   AnalysisTree::BranchConfig SimEventHeaderBranch("SimEventHeader", AnalysisTree::DetType::kEventHeader);
@@ -37,6 +39,7 @@ void CbmSimEventHeaderConverter::Init()
   SimEventHeaderBranch.AddFields<float>({"start_time", "end_time"}, "ns (?), event time");
   SimEventHeaderBranch.AddField<int>("run_id", "run identifier");
   SimEventHeaderBranch.AddField<int>("event_id", "event identifier");
+  SimEventHeaderBranch.AddField<float>("T0", "MC event time, ns");
 
   ipsi_RP_     = SimEventHeaderBranch.GetFieldId("psi_RP");
   ib_          = SimEventHeaderBranch.GetFieldId("b");
@@ -44,6 +47,7 @@ void CbmSimEventHeaderConverter::Init()
   iend_time_   = SimEventHeaderBranch.GetFieldId("end_time");
   irun_id_     = SimEventHeaderBranch.GetFieldId("run_id");
   ievent_id_   = SimEventHeaderBranch.GetFieldId("event_id");
+  iT0_         = SimEventHeaderBranch.GetFieldId("T0");
 
   auto* man = AnalysisTree::TaskManager::GetInstance();
   man->AddBranch(sim_event_header_, SimEventHeaderBranch);
@@ -53,6 +57,7 @@ void CbmSimEventHeaderConverter::Init()
 void CbmSimEventHeaderConverter::ProcessData(CbmEvent* event)
 {
   FairMCEventHeader* cbm_header {nullptr};
+  int file_id {0}, event_id {0};
 
   if (event) {
     if (!event->GetMatch()) {
@@ -60,16 +65,19 @@ void CbmSimEventHeaderConverter::ProcessData(CbmEvent* event)
       return;
     }
     const auto& link = event->GetMatch()->GetMatchedLink();
+    file_id          = event->GetMatch()->GetMatchedLink().GetFile();
+    event_id         = event->GetMatch()->GetMatchedLink().GetEntry();
     cbm_header       = (FairMCEventHeader*) (cbm_header_obj_->Get(link));
   }
   else {
     cbm_header = (FairMCEventHeader*) (cbm_header_obj_->Get(0, FairRootManager::Instance()->GetEntryNr()));
   }
 
-  LOG(info) << "MCEvent " << cbm_header->GetEventID() << " " << cbm_header->GetT();
-
   if (!cbm_header) { throw std::runtime_error("CbmSimEventHeaderConverter::Exec - ERROR! No fHeader!"); }
 
+  LOG(info) << "MCEvent " << cbm_header->GetEventID() << " with T0 "
+            << cbm_mc_event_list_->GetEventTime(event_id, file_id);
+
   TVector3 pos {cbm_header->GetX(), cbm_header->GetY(), cbm_header->GetZ()};
   sim_event_header_->SetVertexPosition3(pos);
 
@@ -77,6 +85,7 @@ void CbmSimEventHeaderConverter::ProcessData(CbmEvent* event)
   sim_event_header_->SetField(float(cbm_header->GetB()), ib_);
   sim_event_header_->SetField(int(cbm_header->GetEventID()), ievent_id_);
   sim_event_header_->SetField(int(cbm_header->GetRunID()), irun_id_);
+  sim_event_header_->SetField(float(cbm_mc_event_list_->GetEventTime(event_id, file_id)), iT0_);
 
   if (event) {
     LOG(info) << "TIME: " << event->GetStartTime() << "  " << event->GetEndTime();
diff --git a/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.h b/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.h
index 7061742bda..f43eff6c3e 100644
--- a/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.h
+++ b/analysis/common/analysis_tree_converter/CbmSimEventHeaderConverter.h
@@ -6,6 +6,7 @@
 #define ANALYSIS_TREE_SIMEVENTHEADERCONVERTER_H_
 
 #include "CbmConverterTask.h"
+#include "CbmMCEventList.h"
 
 #include "AnalysisTree/EventHeader.hpp"
 
@@ -29,6 +30,7 @@ private:
   FairMCEventHeader* cbm_header_ {nullptr};
   CbmMCDataManager* cbm_mc_manager_ {nullptr};
   CbmMCDataObject* cbm_header_obj_ {nullptr};
+  CbmMCEventList* cbm_mc_event_list_ {nullptr};
 
   int ipsi_RP_ {AnalysisTree::UndefValueInt};
   int ib_ {AnalysisTree::UndefValueInt};
@@ -36,6 +38,7 @@ private:
   int iend_time_ {AnalysisTree::UndefValueInt};
   int irun_id_ {AnalysisTree::UndefValueInt};
   int ievent_id_ {AnalysisTree::UndefValueInt};
+  int iT0_ {AnalysisTree::UndefValueInt};
 
   ClassDef(CbmSimEventHeaderConverter, 1)
 };
diff --git a/analysis/common/analysis_tree_converter/CbmTofHitsConverter.cxx b/analysis/common/analysis_tree_converter/CbmTofHitsConverter.cxx
index 5426a09dba..8169f29309 100644
--- a/analysis/common/analysis_tree_converter/CbmTofHitsConverter.cxx
+++ b/analysis/common/analysis_tree_converter/CbmTofHitsConverter.cxx
@@ -120,8 +120,8 @@ void CbmTofHitsConverter::ProcessData(CbmEvent* event)
     const Int_t q      = param_last.GetQp() > 0 ? 1 : -1;
     const Float_t l    = globalTrack->GetLength();  // l is calculated by global tracking
     const Float_t time = tofHit->GetTime();
-    const Float_t beta = l / (time * 29.9792458);
-    const Float_t m2   = p * p * (1. / (beta * beta) - 1.);
+    const Float_t beta = event ? l / ((time - event->GetTzero()) * 29.9792458) : 0;
+    const Float_t m2   = event ? p * p * (1. / (beta * beta) - 1.) : -1.;
 
     const Float_t hitX = tofHit->GetX();
     const Float_t hitY = tofHit->GetY();
-- 
GitLab