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 "CbmFsdHit.h"
8#include "CbmPsdHit.h"
9#include "CbmVertex.h"
10#include "FairMCEventHeader.h"
11#include "FairRootManager.h"
12#include "TClonesArray.h"
13#include "cassert"
14#include "iostream"
15
16#include <AnalysisTree/TaskManager.hpp>
17
19
21{
22 assert(!out_branch_.empty());
23 auto* ioman = FairRootManager::Instance();
24 assert(ioman != nullptr);
25 cbm_header_ = (FairMCEventHeader*) ioman->GetObject("MCEventHeader.");
26 cbm_sts_tracks_ = (TClonesArray*) ioman->GetObject("StsTrack");
27 cbm_fsd_hits_ = (TClonesArray*) ioman->GetObject("FsdHit");
28 cbm_psd_hits_ = (TClonesArray*) ioman->GetObject("PsdHit");
29 fTimeSlice = static_cast<CbmTimeSlice*>(ioman->GetObject("TimeSlice."));
30
31 // ***** RecEventHeader *******
32 AnalysisTree::BranchConfig RecEventHeaderBranch("RecEventHeader", AnalysisTree::DetType::kEventHeader);
33 RecEventHeaderBranch.AddField<float>("vtx_chi2", "primiry vertex fit chi^2/NDF");
34 RecEventHeaderBranch.AddField<float>("Efsd", "GeV, full energy deposit in FSD without electrons");
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 iEfsd_ = RecEventHeaderBranch.GetFieldId("Efsd");
47 iEpsd_ = RecEventHeaderBranch.GetFieldId("Epsd");
48 iM_ = RecEventHeaderBranch.GetFieldId("M");
49 iMCEvents_ = RecEventHeaderBranch.GetFieldId("nMCEvents");
50 ievt_id_ = RecEventHeaderBranch.GetFieldId("evt_id");
51 istart_time_ = RecEventHeaderBranch.GetFieldId("start_time");
52 iend_time_ = RecEventHeaderBranch.GetFieldId("end_time");
53 imatch_weight_ = RecEventHeaderBranch.GetFieldId("match_weight");
54 iT0_ = RecEventHeaderBranch.GetFieldId("T0");
55 iTStartTS_ = RecEventHeaderBranch.GetFieldId("tStartTS");
56
57 auto* man = AnalysisTree::TaskManager::GetInstance();
58 man->AddBranch(rec_event_header_, RecEventHeaderBranch);
59 rec_event_header_->Init(RecEventHeaderBranch);
60}
61
63{
64 if (event) { cbm_prim_vertex_ = event->GetVertex(); }
65 if (!cbm_prim_vertex_) {
66 throw std::runtime_error("No event vertex in CbmEvent");
67 }
68
69 rec_event_header_->SetVertexPosition3({cbm_prim_vertex_->GetX(), cbm_prim_vertex_->GetY(), cbm_prim_vertex_->GetZ()});
70 rec_event_header_->SetField(float(cbm_prim_vertex_->GetChi2() / cbm_prim_vertex_->GetNDF()), ivtx_chi2_);
71
72 const int n_sts_tracks = event ? event->GetNofStsTracks() : cbm_sts_tracks_->GetEntries();
73 rec_event_header_->SetField(n_sts_tracks, iM_);
74 rec_event_header_->SetField(GetFsdEnergy(event), iEfsd_);
75 rec_event_header_->SetField(GetPsdEnergy(event), iEpsd_);
76
77 int nMCEvents, evt_id;
78 float match_weight, start_time, end_time, T0, tStartTS;
79 if (event) {
80 evt_id = event->GetUniqueID();
81 start_time = event->GetStartTime();
82 end_time = event->GetEndTime();
83 T0 = event->GetTzero();
84
85 tStartTS = fTimeSlice->GetStartTime();
86
87 if (event->GetMatch() && event->GetMatch()->GetNofLinks() > 0) {
88 match_weight = float(event->GetMatch()->GetMatchedLink().GetWeight());
89 nMCEvents = event->GetMatch()->GetNofLinks();
90 }
91 else {
92 match_weight = 0.;
93 nMCEvents = 0;
94 }
95 }
96 else {
97 evt_id = cbm_header_->GetEventID();
98 start_time = cbm_header_->GetT();
99 end_time = cbm_header_->GetT();
100 T0 = -999999.;
101 tStartTS = -1.;
102 match_weight = 1.;
103 nMCEvents = 1;
104 }
105 rec_event_header_->SetField(evt_id, ievt_id_);
106 rec_event_header_->SetField(start_time, istart_time_);
107 rec_event_header_->SetField(end_time, iend_time_);
108 rec_event_header_->SetField(T0, iT0_);
109 rec_event_header_->SetField(tStartTS, iTStartTS_);
110 rec_event_header_->SetField(match_weight, imatch_weight_);
111 rec_event_header_->SetField(nMCEvents, iMCEvents_);
112}
113
115{
116 float fsd_energy{0.f};
117 const int nFsdHits = event ? event->GetNofData(ECbmDataType::kFsdHit) : cbm_fsd_hits_->GetEntriesFast();
118 for (int i = 0; i < nFsdHits; ++i) {
119 auto* hit = (CbmFsdHit*) cbm_fsd_hits_->At(i);
120
121 // Second condition is to remove background electrons from energy calculation
122 if (!hit || hit->GetEdep() < 0.0075) continue;
123 fsd_energy += hit->GetEdep();
124 }
125 return fsd_energy;
126}
127
128
130{
131 //TODO avoid duplicating the code with PsdModulesConverter
132 float psd_energy {0.f};
133 const int nPsdHits = event ? event->GetNofData(ECbmDataType::kPsdHit) : cbm_psd_hits_->GetEntriesFast();
134 for (int i = 0; i < nPsdHits; ++i) {
135 auto* hit = (CbmPsdHit*) cbm_psd_hits_->At(i);
136 if (hit == nullptr) continue;
137 psd_energy += hit->GetEdep();
138 }
139 return psd_energy;
140}
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
TClonesArray * cbm_fsd_hits_
non-owning pointer
CbmVertex * cbm_prim_vertex_
non-owning pointer
CbmTimeSlice * fTimeSlice
non-owning pointer
Bookkeeping of time-slice content.