CbmRoot
Loading...
Searching...
No Matches
CbmRecEventHeaderConverter.cxx
Go to the documentation of this file.
1/* Copyright (C) 2020-2021 Physikalisches Institut, Eberhard Karls Universitaet Tuebingen, Tuebingen
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Viktor Klochkov [committer] */
4
6
7#include "CbmPsdHit.h"
8#include "CbmVertex.h"
9
10#include "FairMCEventHeader.h"
11#include "FairRootManager.h"
12
13#include "TClonesArray.h"
14
15#include <AnalysisTree/TaskManager.hpp>
16
17#include "cassert"
18#include "iostream"
19
21
23{
24 assert(!out_branch_.empty());
25 auto* ioman = FairRootManager::Instance();
26 assert(ioman != nullptr);
27 cbm_header_ = (FairMCEventHeader*) ioman->GetObject("MCEventHeader.");
28 cbm_sts_tracks_ = (TClonesArray*) ioman->GetObject("StsTrack");
29 cbm_psd_hits_ = (TClonesArray*) ioman->GetObject("PsdHit");
30 fTimeSlice = static_cast<CbmTimeSlice*>(ioman->GetObject("TimeSlice."));
31
32 // ***** RecEventHeader *******
33 AnalysisTree::BranchConfig RecEventHeaderBranch("RecEventHeader", AnalysisTree::DetType::kEventHeader);
34 RecEventHeaderBranch.AddField<float>("vtx_chi2", "primiry vertex fit chi^2/NDF");
35 RecEventHeaderBranch.AddField<float>("Epsd", "GeV, full energy deposit in PSD");
36 RecEventHeaderBranch.AddField<int>("M", "total multiplicity in STS(+MVD)");
37 RecEventHeaderBranch.AddField<int>("nMCEvents", "Number of MC events that contributed");
38 RecEventHeaderBranch.AddField<int>("evt_id", "event identifier");
39 RecEventHeaderBranch.AddFields<float>({"start_time", "end_time"}, "Start and end time of the event, ns");
40 RecEventHeaderBranch.AddField<float>("match_weight",
41 "Weight of matched event"); // TODO: Add info how it is calculated
42 RecEventHeaderBranch.AddField<float>("T0", "Reconstructed T0, ns");
43 RecEventHeaderBranch.AddField<float>("tStartTS", "TS start time, ns");
44
45 ivtx_chi2_ = RecEventHeaderBranch.GetFieldId("vtx_chi2");
46 iEpsd_ = RecEventHeaderBranch.GetFieldId("Epsd");
47 iM_ = RecEventHeaderBranch.GetFieldId("M");
48 iMCEvents_ = RecEventHeaderBranch.GetFieldId("nMCEvents");
49 ievt_id_ = RecEventHeaderBranch.GetFieldId("evt_id");
50 istart_time_ = RecEventHeaderBranch.GetFieldId("start_time");
51 iend_time_ = RecEventHeaderBranch.GetFieldId("end_time");
52 imatch_weight_ = RecEventHeaderBranch.GetFieldId("match_weight");
53 iT0_ = RecEventHeaderBranch.GetFieldId("T0");
54 iTStartTS_ = RecEventHeaderBranch.GetFieldId("tStartTS");
55
56 auto* man = AnalysisTree::TaskManager::GetInstance();
57 man->AddBranch(rec_event_header_, RecEventHeaderBranch);
58 rec_event_header_->Init(RecEventHeaderBranch);
59}
60
62{
63 if (event) { cbm_prim_vertex_ = event->GetVertex(); }
64 if (!cbm_prim_vertex_) {
65 throw std::runtime_error("No event vertex in CbmEvent");
66 }
67
70
71 const int n_sts_tracks = event ? event->GetNofStsTracks() : cbm_sts_tracks_->GetEntries();
72 rec_event_header_->SetField(n_sts_tracks, iM_);
73 rec_event_header_->SetField(GetPsdEnergy(event), iEpsd_);
74
75 int nMCEvents, evt_id;
76 float match_weight, start_time, end_time, T0, tStartTS;
77 if (event) {
78 evt_id = event->GetUniqueID();
79 start_time = event->GetStartTime();
80 end_time = event->GetEndTime();
81 T0 = event->GetTzero();
82
83 tStartTS = fTimeSlice->GetStartTime();
84
85 if (event->GetMatch() && event->GetMatch()->GetNofLinks() > 0) {
86 match_weight = float(event->GetMatch()->GetMatchedLink().GetWeight());
87 nMCEvents = event->GetMatch()->GetNofLinks();
88 }
89 else {
90 match_weight = 0.;
91 nMCEvents = 0;
92 }
93 }
94 else {
95 evt_id = cbm_header_->GetEventID();
96 start_time = cbm_header_->GetT();
97 end_time = cbm_header_->GetT();
98 T0 = -999999.;
99 tStartTS = -1.;
100 match_weight = 1.;
101 nMCEvents = 1;
102 }
103 rec_event_header_->SetField(evt_id, ievt_id_);
104 rec_event_header_->SetField(start_time, istart_time_);
105 rec_event_header_->SetField(end_time, iend_time_);
106 rec_event_header_->SetField(T0, iT0_);
107 rec_event_header_->SetField(tStartTS, iTStartTS_);
108 rec_event_header_->SetField(match_weight, imatch_weight_);
109 rec_event_header_->SetField(nMCEvents, iMCEvents_);
110}
111
113{
114 //TODO avoid duplicating the code with PsdModulesConverter
115 float psd_energy {0.f};
116 const int nPsdHits = event ? event->GetNofData(ECbmDataType::kPsdHit) : cbm_psd_hits_->GetEntriesFast();
117 for (int i = 0; i < nPsdHits; ++i) {
118 auto* hit = (CbmPsdHit*) cbm_psd_hits_->At(i);
119 if (hit == nullptr) continue;
120 psd_energy += hit->GetEdep();
121 }
122 return psd_energy;
123}
ClassImp(CbmRecEventHeaderConverter)
std::string out_branch_
Class characterising one event by a collection of links (indices) to data objects,...
Definition CbmEvent.h:34
CbmMatch * GetMatch() const
Definition CbmEvent.h:98
int32_t GetNofLinks() const
Definition CbmMatch.h:42
const CbmLink & GetMatchedLink() const
Definition CbmMatch.h:41
AnalysisTree::EventHeader * rec_event_header_
TClonesArray * cbm_psd_hits_
non-owning pointer
FairMCEventHeader * cbm_header_
non-owning pointer
void ProcessData(CbmEvent *event) final
TClonesArray * cbm_sts_tracks_
non-owning pointer
CbmVertex * cbm_prim_vertex_
non-owning pointer
CbmTimeSlice * fTimeSlice
non-owning pointer
Bookkeeping of time-slice content.
double GetStartTime() const
double GetZ() const
Definition CbmVertex.h:69
double GetChi2() const
Definition CbmVertex.h:70
int32_t GetNDF() const
Definition CbmVertex.h:71
double GetY() const
Definition CbmVertex.h:68
double GetX() const
Definition CbmVertex.h:67