CbmRoot
Loading...
Searching...
No Matches
CbmTofHitsConverter.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 "CbmDefs.h"
8#include "CbmEvent.h"
9#include "CbmGlobalTrack.h"
10#include "CbmMCDataArray.h"
11#include "CbmMCDataManager.h"
12#include "CbmTofHit.h"
13#include "CbmTrackMatchNew.h"
14
15#include <FairMCPoint.h>
16#include <FairRootManager.h>
17
18#include <TClonesArray.h>
19
20#include <AnalysisTree/Matching.hpp>
21#include <AnalysisTree/TaskManager.hpp>
22#include <cassert>
23
25
27{
28 assert(!out_branch_.empty());
29 auto* ioman = FairRootManager::Instance();
30
31 cbm_tof_hits_ = (TClonesArray*) ioman->GetObject("TofHit");
32 cbm_global_tracks_ = (TClonesArray*) ioman->GetObject("GlobalTrack");
33 cbm_tof_match_ = (TClonesArray*) ioman->GetObject("TofHitMatch");
34 // cbm_tof_points_ = (TClonesArray*) ioman->GetObject("TofPoint");
35 // cbm_mc_tracks_ = (TClonesArray*) ioman->GetObject("MCTrack");
36
37 cbm_mc_manager_ = dynamic_cast<CbmMCDataManager*>(ioman->GetObject("MCDataManager"));
38 cbm_mc_tracks_new_ = cbm_mc_manager_->InitBranch("MCTrack");
39 cbm_tof_points_new_ = cbm_mc_manager_->InitBranch("TofPoint");
40
41 AnalysisTree::BranchConfig tof_branch(out_branch_, AnalysisTree::DetType::kHit);
42 tof_branch.AddField<float>("mass2", "Mass squared");
43 tof_branch.AddField<float>("l", "Track lenght");
44 tof_branch.AddField<float>("t", "ps(?), Measured time ");
45 tof_branch.AddField<float>("qp_tof", "charge * momentum extrapoleted to TOF");
46 tof_branch.AddFields<float>({"dx", "dy", "dz"}, "Distance between TOF hit and extrapolated global track, cm");
47
48 i_mass2_ = tof_branch.GetFieldId("mass2");
49 i_qp_ = tof_branch.GetFieldId("qp_tof");
50 i_dx_ = tof_branch.GetFieldId("dx");
51 i_t_ = tof_branch.GetFieldId("t");
52 i_l_ = tof_branch.GetFieldId("l");
53
54 auto* man = AnalysisTree::TaskManager::GetInstance();
55 man->AddBranch(tof_hits_, tof_branch);
56 man->AddMatching(match_to_, out_branch_, vtx_tracks_2_tof_);
58}
59
60void CbmTofHitsConverter::ExtrapolateStraightLine(FairTrackParam* params, float z)
61{
62 const Float_t Tx = params->GetTx();
63 const Float_t Ty = params->GetTy();
64 const Float_t old_z = params->GetZ();
65 const Float_t dz = z - old_z;
66
67 const Float_t x = params->GetX() + Tx * dz;
68 const Float_t y = params->GetY() + Ty * dz;
69
70 params->SetPosition({x, y, z});
71}
72
74{
75 assert(cbm_tof_hits_);
76 tof_hits_->ClearChannels();
77 vtx_tracks_2_tof_->Clear();
78 tof_hits_2_mc_tracks_->Clear();
79
80 auto* out_config_ = AnalysisTree::TaskManager::GetInstance()->GetConfig();
81 const auto& branch = out_config_->GetBranchConfig(out_branch_);
82
83 auto rec_tracks_map = GetMatchMap(match_to_);
84 auto sim_tracks_map = GetMatchMap(mc_tracks_);
85
86 int file_id {0}, event_id {0};
87 if (event && event->GetMatch() && event->GetMatch()->GetNofLinks() > 0) {
88 file_id = event->GetMatch()->GetMatchedLink().GetFile();
89 event_id = event->GetMatch()->GetMatchedLink().GetEntry();
90 }
91 else {
92 event_id = FairRootManager::Instance()->GetEntryNr();
93 }
94
95 const int n_tracks = event ? event->GetNofData(ECbmDataType::kGlobalTrack) : cbm_global_tracks_->GetEntriesFast();
96 // const int n_tof_hits = event ? event->GetNofData(ECbmDataType::kTofHit) : cbm_tof_hits_->GetEntriesFast(); // FU, 02.08.22
97
98 if (n_tracks <= 0) {
99 LOG(warn) << "No global tracks!";
100 return;
101 }
102 tof_hits_->Reserve(n_tracks);
103
104 for (Int_t igt = 0; igt < n_tracks; igt++) {
105 const auto trackIndex = event ? event->GetIndex(ECbmDataType::kGlobalTrack, igt) : igt;
106 const auto* globalTrack = static_cast<const CbmGlobalTrack*>(cbm_global_tracks_->At(trackIndex));
107 const Int_t tofHitIndex = globalTrack->GetTofHitIndex();
108 if (tofHitIndex < 0) continue;
109
110 const auto* tofHit = static_cast<const CbmTofHit*>(cbm_tof_hits_->At(tofHitIndex));
111
112 FairTrackParam param_last = *(globalTrack->GetParamLast());
113 TVector3 p_tof;
114 param_last.Momentum(p_tof);
115
116 const Float_t p = p_tof.Mag();
117 const Int_t q = param_last.GetQp() > 0 ? 1 : -1;
118 const Float_t l = globalTrack->GetLength(); // l is calculated by global tracking
119 const Float_t time = tofHit->GetTime();
120 const Float_t beta = event ? l / ((time - event->GetTzero()) * 29.9792458) : 0;
121 const Float_t m2 = event ? p * p * (1. / (beta * beta) - 1.) : -1.;
122
123 const Float_t hitX = tofHit->GetX();
124 const Float_t hitY = tofHit->GetY();
125 const Float_t hitZ = tofHit->GetZ();
126
127 ExtrapolateStraightLine(&param_last, tofHit->GetZ());
128
129 auto& hit = tof_hits_->AddChannel(branch);
130 hit.SetPosition(hitX, hitY, hitZ);
131 hit.SetSignal(time);
132 hit.SetField(m2, i_mass2_);
133 hit.SetField(float(q * p_tof.Mag()), i_qp_);
134 hit.SetField(float(param_last.GetX() - hitX), i_dx_);
135 hit.SetField(float(param_last.GetY() - hitY), i_dx_ + 1);
136 hit.SetField(float(param_last.GetZ() - hitZ), i_dx_ + 2);
137 hit.SetField(l, i_l_);
138 hit.SetField(time, i_t_);
139
140 if (rec_tracks_map.empty()) { continue; }
141 const Int_t stsTrackIndex = globalTrack->GetStsTrackIndex();
142 if (rec_tracks_map.find(stsTrackIndex) != rec_tracks_map.end()) {
143 vtx_tracks_2_tof_->AddMatch(rec_tracks_map.find(stsTrackIndex)->second, hit.GetId());
144 }
145
146 const auto* tofMatch = dynamic_cast<CbmMatch*>(cbm_tof_match_->At(tofHitIndex));
147 if (tofMatch && tofMatch->GetNofLinks() > 0) {
148 const auto& link = tofMatch->GetMatchedLink();
149 if (link.GetFile() != file_id || link.GetEntry() != event_id) { // match from different event
150 LOG(warn) << "match from different event";
151 // continue;
152 }
153 const auto* tofPoint = dynamic_cast<FairMCPoint*>(cbm_tof_points_new_->Get(link));
154 // const auto* tofPoint = dynamic_cast<FairMCPoint*>(cbm_tof_points_->At(link.GetIndex()));
155
156 if (!tofPoint) { throw std::runtime_error("no TOF point"); }
157
158 Int_t mc_track_id = tofPoint->GetTrackID();
159 if (mc_track_id >= 0) {
160 auto it = sim_tracks_map.find(mc_track_id);
161 if (it != sim_tracks_map.end()) { // match is found
162 tof_hits_2_mc_tracks_->AddMatch(hit.GetId(), it->second);
163 }
164 }
165 }
166 }
167}
168
169
ClassImp(CbmTofHitsConverter)
float Float_t
int Int_t
std::string match_to_
AT branch to match.
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
Task class creating and managing CbmMCDataArray objects.
int32_t GetNofLinks() const
Definition CbmMatch.h:42
TClonesArray * cbm_tof_hits_
AnalysisTree::Matching * vtx_tracks_2_tof_
CbmMCDataArray * cbm_mc_tracks_new_
AnalysisTree::Matching * tof_hits_2_mc_tracks_
AnalysisTree::HitDetector * tof_hits_
CbmMCDataArray * cbm_tof_points_new_
const std::map< int, int > & GetMatchMap(const std::string &name) const
TClonesArray * cbm_tof_match_
TClonesArray * cbm_global_tracks_
void ProcessData(CbmEvent *event) final
static void ExtrapolateStraightLine(FairTrackParam *params, float z)
CbmMCDataManager * cbm_mc_manager_