CbmRoot
Loading...
Searching...
No Matches
CbmRichRingsConverter.cxx
Go to the documentation of this file.
1/* Copyright (C) 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 "AnalysisTree/Matching.hpp"
8#include "CbmDefs.h"
9#include "CbmEvent.h"
10#include "CbmGlobalTrack.h"
11#include "CbmRichRing.h"
12
13#include <FairMCPoint.h>
14#include <FairRootManager.h>
15
16#include <TClonesArray.h>
17
18#include <AnalysisTree/TaskManager.hpp>
19#include <cassert>
20#include <vector>
21
23{
24
25 assert(!out_branch_.empty());
26 auto* ioman = FairRootManager::Instance();
27
28 cbm_rich_rings_ = (TClonesArray*) ioman->GetObject("RichRing");
29 cbm_global_tracks_ = (TClonesArray*) ioman->GetObject("GlobalTrack");
30
31 AnalysisTree::BranchConfig rich_branch(out_branch_, AnalysisTree::DetType::kHit);
32 rich_branch.AddField<float>("radius");
33 rich_branch.AddFields<int>({"n_hits", "n_hits_on_ring"});
34 rich_branch.AddFields<float>({"axis_a", "axis_b"});
35 rich_branch.AddFields<float>({"center_x", "center_y"});
36 rich_branch.AddField<float>("chi2_ov_ndf", "chi2/ndf ring fit");
37 rich_branch.AddField<float>("phi_ellipse", "phi rotation angle of ellipse");
38 rich_branch.AddField<float>("radial_pos", "sqrt(x**2+abs(y-110)**2)");
39 rich_branch.AddField<float>("radial_angle", "(0||1||2)*pi +- atan( abs((+-100-y)/-x) )");
40
41 i_r_ = rich_branch.GetFieldId("radius");
42 i_n_hits_ = rich_branch.GetFieldId("n_hits");
43 i_axis_ = rich_branch.GetFieldId("axis_a");
44 i_center_ = rich_branch.GetFieldId("center_x");
45 i_chi2_ = rich_branch.GetFieldId("chi2_ov_ndf");
46 i_radial_angle_ = rich_branch.GetFieldId("radial_angle");
47 i_radial_pos_ = rich_branch.GetFieldId("radial_pos");
48 i_phi_ellipse_ = rich_branch.GetFieldId("phi_ellipse");
49
50 auto* man = AnalysisTree::TaskManager::GetInstance();
51 man->AddBranch(rich_rings_, rich_branch);
52 man->AddMatching(match_to_, out_branch_, vtx_tracks_2_rich_);
53}
54
56{
57 assert(cbm_rich_rings_);
58 rich_rings_->ClearChannels();
59 vtx_tracks_2_rich_->Clear();
60
61 auto* out_config_ = AnalysisTree::TaskManager::GetInstance()->GetConfig();
62 const auto& branch = out_config_->GetBranchConfig(out_branch_);
63
64 const auto it = indexes_map_->find(match_to_);
65 if (it == indexes_map_->end()) { throw std::runtime_error(match_to_ + " is not found to match with RICH rings"); }
66 auto rec_tracks_map = it->second;
67
68 const int n_tracks = event ? event->GetNofData(ECbmDataType::kGlobalTrack) : cbm_global_tracks_->GetEntriesFast();
69 if (n_tracks <= 0) {
70 LOG(warn) << "No global tracks!";
71 return;
72 }
73 rich_rings_->Reserve(n_tracks);
74
75 for (Int_t igt = 0; igt < n_tracks; igt++) {
76 const auto trackIndex = event ? event->GetIndex(ECbmDataType::kGlobalTrack, igt) : igt;
77 const auto* global_track = static_cast<const CbmGlobalTrack*>(cbm_global_tracks_->At(trackIndex));
78
79 Int_t i_rich = global_track->GetRichRingIndex();
80 if (i_rich < 0) continue;
81 auto rich_ring = static_cast<CbmRichRing*>(cbm_rich_rings_->At(i_rich));
82 if (rich_ring == nullptr) {
83 LOG(warn) << "No RICH ring!";
84 continue;
85 }
86
87 auto& ring = rich_rings_->AddChannel(branch);
88 ring.SetPosition(rich_ring->GetCenterX(), rich_ring->GetCenterY(), 0.f);
89 ring.SetField(int(rich_ring->GetNofHits()), i_n_hits_);
90 ring.SetField(int(rich_ring->GetNofHitsOnRing()), i_n_hits_ + 1);
91 ring.SetField(float(rich_ring->GetAaxis()), i_axis_);
92 ring.SetField(float(rich_ring->GetBaxis()), i_axis_ + 1);
93 ring.SetField(float(rich_ring->GetCenterX()), i_center_);
94 ring.SetField(float(rich_ring->GetCenterY()), i_center_ + 1);
95 ring.SetField(float(rich_ring->GetRadius()), i_r_);
96 ring.SetField(float(rich_ring->GetNDF() > 0. ? rich_ring->GetChi2() / rich_ring->GetNDF() : -999.), i_chi2_);
97 ring.SetField(float(rich_ring->GetRadialAngle()), i_radial_angle_);
98 ring.SetField(float(rich_ring->GetRadialPosition()), i_radial_pos_);
99 ring.SetField(float(rich_ring->GetPhi()), i_phi_ellipse_);
100
101 if (rec_tracks_map.empty()) { continue; }
102 const Int_t stsTrackIndex = global_track->GetStsTrackIndex();
103 if (rec_tracks_map.find(stsTrackIndex) != rec_tracks_map.end()) {
104 vtx_tracks_2_rich_->AddMatch(rec_tracks_map.find(stsTrackIndex)->second, ring.GetId());
105 }
106 }
107}
108
int Int_t
std::string match_to_
AT branch to match.
std::string out_branch_
std::map< std::string, MapType > * indexes_map_
from other tasks
Class characterising one event by a collection of links (indices) to data objects,...
Definition CbmEvent.h:34
AnalysisTree::HitDetector * rich_rings_
AnalysisTree::Matching * vtx_tracks_2_rich_
void ProcessData(CbmEvent *event) final