CbmRoot
Loading...
Searching...
No Matches
CbmStsCorrelation.cxx
Go to the documentation of this file.
1/* Copyright (C) 2023 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Dario Ramirez [committer] */
4
5#include "CbmStsCorrelation.h"
6
7#include "CbmPixelHit.h"
8#include "CbmStsAddress.h"
9#include "TPaveStats.h"
10#include "TStyle.h"
11
13{
14
15 for (auto& [element_i, geo_i] : fStsGeoInfo) {
16 for (auto& [element_j, geo_j] : fStsGeoInfo) {
17
18 std::string h_name_base = "";
19 std::string obj_x, obj_y;
20 if (element_i < 8 && element_j < 8) {
21 if (element_i >= element_j) continue;
22 obj_x = Form("Sts%d", element_i);
23 obj_y = Form("Sts%d", element_j);
24 h_name_base = Form("Sts%d:Sts%d", element_i, element_j);
25 }
26 else if (element_i > 8 && element_j > 8) {
27 int32_t unit_i = CbmStsAddress::GetElementId(element_i, kStsUnit);
28 int32_t unit_j = CbmStsAddress::GetElementId(element_j, kStsUnit);
29
30 if (unit_i >= unit_j) continue;
31
32 obj_x = Form("Sts0x%x", element_i);
33 obj_y = Form("Sts0x%x", element_j);
34 h_name_base = Form("Sts0x%x:Sts0x%x", element_i, element_j);
35 }
36
37 if (!h_name_base.length()) continue;
38 LOG(debug) << Form("Booking for %s", h_name_base.c_str());
39
40 double x_min_i = geo_i[0];
41 double x_max_i = geo_i[1];
42 double y_min_i = geo_i[2];
43 double y_max_i = geo_i[3];
44
45 unsigned int nb_bins_x_i = (x_max_i - x_min_i) / cbm_sts_utils::kStsDx;
46 unsigned int nb_bins_y_i = (y_max_i - y_min_i) / cbm_sts_utils::kStsDy;
47
48 double x_min_j = geo_j[0];
49 double x_max_j = geo_j[1];
50 double y_min_j = geo_j[2];
51 double y_max_j = geo_j[3];
52
53 LOG(debug) << Form("XX_[%0.3f, %0.3f]:[%0.3f, %0.3f]", x_min_i, x_max_i, x_min_j, x_max_j);
54 LOG(debug) << Form("YY_[%0.3f, %0.3f]:[%0.3f, %0.3f]", y_min_i, y_max_i, y_min_j, y_max_j);
55
56 unsigned int nb_bins_x_j = (x_max_j - x_min_j) / cbm_sts_utils::kStsDx;
57 unsigned int nb_bins_y_j = (y_max_j - y_min_j) / cbm_sts_utils::kStsDy;
58
59 std::string h_name;
60 h_name = Form("%s_XX", h_name_base.c_str());
61 fH2D[h_name] =
62 std::make_unique<TH2D>(h_name.c_str(), "", nb_bins_x_i, x_min_i, x_max_i, nb_bins_x_j, x_min_j, x_max_j);
63 fH2D[h_name]->GetXaxis()->SetTitle(Form("X_{%s} [cm]", obj_x.c_str()));
64 fH2D[h_name]->GetYaxis()->SetTitle(Form("X_{%s} [cm]", obj_y.c_str()));
65 fH2D[h_name]->GetXaxis()->CenterTitle(true);
66 fH2D[h_name]->GetYaxis()->CenterTitle(true);
67
68 h_name = Form("%s_YY", h_name_base.c_str());
69 fH2D[h_name] =
70 std::make_unique<TH2D>(h_name.c_str(), "", nb_bins_y_i, y_min_i, y_max_i, nb_bins_y_j, y_min_j, y_max_j);
71 fH2D[h_name]->GetXaxis()->SetTitle(Form("Y_{%s} [cm]", obj_x.c_str()));
72 fH2D[h_name]->GetYaxis()->SetTitle(Form("Y_{%s} [cm]", obj_y.c_str()));
73 fH2D[h_name]->GetXaxis()->CenterTitle(true);
74 fH2D[h_name]->GetYaxis()->CenterTitle(true);
75 }
76 }
77}
78
80{
81 bool is_mc_data = false;
82 if (!fStsHits.size()) return;
83 for (int sts_unit_i = 0; sts_unit_i < nb_sts_station_ - 1; sts_unit_i++) {
84 for (int sts_unit_j = sts_unit_i + 1; sts_unit_j < nb_sts_station_; sts_unit_j++) {
85 LOG(debug) << Form("Building correlations for STS%d:STS%d: %ld\t%ld", sts_unit_i, sts_unit_j,
86 fStsHits[sts_unit_i].size(), fStsHits[sts_unit_j].size());
87 for (auto sts_hit_i : fStsHits[sts_unit_i]) {
88 int32_t sts_address_i = sts_hit_i->GetAddress();
89 double sts_i_x = sts_hit_i->GetX();
90 double sts_i_y = sts_hit_i->GetY();
91
92 CbmStsHit* closest_hit = nullptr;
93 double abs_time_diff = 999;
94 for (auto sts_hit_j : fStsHits[sts_unit_j]) {
95
96 if (is_mc_data) {
97 int32_t sts_address_j = sts_hit_j->GetAddress();
98 double sts_j_x = sts_hit_j->GetX();
99 double sts_j_y = sts_hit_j->GetY();
100
101 fH2D[Form("Sts%d:Sts%d_YY", sts_unit_i, sts_unit_j)]->Fill(sts_i_y, sts_j_y);
102 fH2D[Form("Sts%d:Sts%d_XX", sts_unit_i, sts_unit_j)]->Fill(sts_i_x, sts_j_x);
103 fH2D[Form("Sts0x%x:Sts0x%x_YY", sts_address_i, sts_address_j)]->Fill(sts_i_y, sts_j_y);
104 fH2D[Form("Sts0x%x:Sts0x%x_XX", sts_address_i, sts_address_j)]->Fill(sts_i_x, sts_j_x);
105 }
106 else {
107
108 double dt = std::abs(sts_hit_i->GetTime() - sts_hit_j->GetTime());
109 if (abs_time_diff > dt) {
110 abs_time_diff = dt;
111 closest_hit = sts_hit_j;
112 }
113 }
114 }
115 if (!is_mc_data && closest_hit != nullptr) {
116 int32_t sts_address_j = closest_hit->GetAddress();
117 double sts_j_x = closest_hit->GetX();
118 double sts_j_y = closest_hit->GetY();
119
120 fH2D[Form("Sts%d:Sts%d_YY", sts_unit_i, sts_unit_j)]->Fill(sts_i_y, sts_j_y);
121 fH2D[Form("Sts%d:Sts%d_XX", sts_unit_i, sts_unit_j)]->Fill(sts_i_x, sts_j_x);
122 fH2D[Form("Sts0x%x:Sts0x%x_YY", sts_address_i, sts_address_j)]->Fill(sts_i_y, sts_j_y);
123 fH2D[Form("Sts0x%x:Sts0x%x_XX", sts_address_i, sts_address_j)]->Fill(sts_i_x, sts_j_x);
124 }
125 }
126 }
127 }
128 fStsHits.clear();
129}
130
132{
133 if (fAnalysisCuts != nullptr && !fAnalysisCuts->CheckEvent(evt)) return;
134
135 int nb_sts_hits = evt->GetNofData(ECbmDataType::kStsHit);
136 LOG(debug) << Form("Processing event with %d StsHit", nb_sts_hits);
137 for (int hit_evt_idx = 0; hit_evt_idx < nb_sts_hits; hit_evt_idx++) {
138 int sts_hit_idx = evt->GetIndex(ECbmDataType::kStsHit, hit_evt_idx);
139 CbmStsHit* hit = (CbmStsHit*) fStsHitArray->UncheckedAt(sts_hit_idx);
140 ProcessHit(hit);
141 }
142}
143
145{
146 if (hit == nullptr) return;
147
148 if (fAnalysisCuts != nullptr && !fAnalysisCuts->CheckStsHit(hit, fStsCluArray)) return;
149
150 int32_t address = hit->GetAddress();
151 int32_t unit = CbmStsAddress::GetElementId(address, kStsUnit);
152
153 fStsHits[unit].push_back(hit);
154}
155
157{
158 // Check if CbmEvent
159 if (fCbmEvtArray != nullptr) {
160 uint32_t nb_events = fCbmEvtArray->GetEntriesFast();
161 LOG(info) << Form("Running event-like Entry: %d\t%d CbmEvents", entry_, nb_events);
162 for (uint32_t evt_idx = 0; evt_idx < nb_events; evt_idx++) {
163 CbmEvent* event = (CbmEvent*) fCbmEvtArray->UncheckedAt(evt_idx);
164 ProcessEvent(event);
166 }
167 }
168 else {
169
170 LOG(debug) << "Running time-like ...";
171 uint32_t n_of_hits = fStsHitArray->GetEntriesFast();
172 for (uint32_t hit_idx = 0; hit_idx < n_of_hits; hit_idx++) {
173 CbmStsHit* sts_hit = (CbmStsHit*) fStsHitArray->UncheckedAt(hit_idx);
174 ProcessHit(sts_hit);
175 }
177 }
178 entry_++;
179}
180
182{
183 LOG(debug) << "Init CbmStsCorrelation ...";
184
185 FairRootManager* ioman = FairRootManager::Instance();
186 if (ioman != nullptr) {
187 fCbmEvtArray = (TClonesArray*) ioman->GetObject("CbmEvent");
188 fStsHitArray = (TClonesArray*) ioman->GetObject("StsHit");
189 fStsCluArray = (TClonesArray*) ioman->GetObject("StsCluster");
190 }
191
192 LoadSetup();
193
195
196 return kSUCCESS;
197}
198
199
201{
202 SaveToFile();
203 fH1D.clear();
204 fH2D.clear();
205}
@ kStsUnit
static constexpr size_t size()
Definition KfSimdPseudo.h:2
Class characterising one event by a collection of links (indices) to data objects,...
Definition CbmEvent.h:34
size_t GetNofData() const
Definition CbmEvent.cxx:58
uint32_t GetIndex(ECbmDataType type, uint32_t iData) const
Definition CbmEvent.cxx:42
int32_t GetAddress() const
Definition CbmHit.h:77
double GetY() const
Definition CbmPixelHit.h:74
double GetX() const
Definition CbmPixelHit.h:73
CbmCutMap * fAnalysisCuts
std::map< std::string, std::unique_ptr< TH2D > > fH2D
void SaveToFile()
It write all mapped objects to the FairRunAna sink file.
void LoadSetup()
Load the STS setup and fill the map with XYZ boundaries for each STS setup element....
std::unordered_map< int32_t, std::vector< double > > fStsGeoInfo
std::map< std::string, std::unique_ptr< TH1D > > fH1D
std::map< int32_t, std::vector< CbmStsHit * > > fStsHits
void Exec(Option_t *)
void ProcessHit(CbmStsHit *)
Process an STS hit It filters hits based on the provided CbmCutMap.
TClonesArray * fStsHitArray
void ProcessEvent(CbmEvent *)
Process an Cbm events It filters event based on the provided CbmCutMap.
TClonesArray * fCbmEvtArray
TClonesArray * fStsCluArray
void BuildCorrelation()
Build the correlation Using filtered hit build the combinatorial among different station sensors.
data class for a reconstructed 3-d hit in the STS
Definition CbmStsHit.h:35
uint32_t GetElementId(int32_t address, int32_t level)
Get the index of an element.
static const double kStsDy
Definition CbmStsUtils.h:22
static const double kStsDx
Definition CbmStsUtils.h:21