CbmRoot
Loading...
Searching...
No Matches
CbmStsResolution.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 "CbmStsResolution.h"
6
7#include "CbmPixelHit.h"
8#include "CbmStsAddress.h"
9#include "CbmStsTrack.h"
10#include "TPaveStats.h"
11#include "TStyle.h"
12
14{
15 LOG(debug) << "Creating an instance of CbmStsResolution ...";
16}
17
19{
20 for (auto& [element, geo] : fStsGeoInfo) {
21 std::string h_name_base = element < 8 ? Form("Sts%d", element) : Form("Sts0x%x", element);
22
23 LOG(debug) << Form("Booking for %s", h_name_base.c_str());
24
25 double x_min = geo[0];
26 double x_max = geo[1];
27 double y_min = geo[2];
28 double y_max = geo[3];
29
30 unsigned int nb_bins_x = (x_max - x_min) / cbm_sts_utils::kStsDx;
31 unsigned int nb_bins_y = (y_max - y_min) / cbm_sts_utils::kStsDy;
32
33
34 double dr = 5e-4;
35 double r_min = -2.7 - 0.5 * dr;
36 double r_max = +2.7 + 0.5 * dr;
37 unsigned int nb_bins_r = (r_max - r_min) / dr;
38
39 for (auto mod : {":all", ":trk"}) {
40 std::string h_name;
41 h_name = Form("%s_dx_vs_x%s", h_name_base.c_str(), mod);
42 fH2D[h_name] = std::make_unique<TH2D>(h_name.c_str(), "", nb_bins_r, r_min, r_max, nb_bins_x, x_min, x_max);
43 fH2D[h_name]->GetXaxis()->SetTitle(Form("X_{trk} - X_{hit} [cm]"));
44 fH2D[h_name]->GetYaxis()->SetTitle("X_{hit} [cm]");
45 fH2D[h_name]->GetXaxis()->CenterTitle(true);
46 fH2D[h_name]->GetYaxis()->CenterTitle(true);
47
48 h_name = Form("%s_dx_vs_y%s", h_name_base.c_str(), mod);
49 fH2D[h_name] = std::make_unique<TH2D>(h_name.c_str(), "", nb_bins_r, r_min, r_max, nb_bins_y, y_min, y_max);
50 fH2D[h_name]->GetXaxis()->SetTitle(Form("X_{trk} - X_{hit} [cm]"));
51 fH2D[h_name]->GetYaxis()->SetTitle("Y_{hit} [cm]");
52 fH2D[h_name]->GetXaxis()->CenterTitle(true);
53 fH2D[h_name]->GetYaxis()->CenterTitle(true);
54
55 h_name = Form("%s_dy_vs_x%s", h_name_base.c_str(), mod);
56 fH2D[h_name] = std::make_unique<TH2D>(h_name.c_str(), "", nb_bins_r, r_min, r_max, nb_bins_x, x_min, x_max);
57 fH2D[h_name]->GetXaxis()->SetTitle(Form("Y_{trk} - Y_{hit} [cm]"));
58 fH2D[h_name]->GetYaxis()->SetTitle("X_{hit} [cm]");
59 fH2D[h_name]->GetXaxis()->CenterTitle(true);
60 fH2D[h_name]->GetYaxis()->CenterTitle(true);
61
62 h_name = Form("%s_dy_vs_y%s", h_name_base.c_str(), mod);
63 fH2D[h_name] = std::make_unique<TH2D>(h_name.c_str(), "", nb_bins_r, r_min, r_max, nb_bins_y, y_min, y_max);
64 fH2D[h_name]->GetXaxis()->SetTitle(Form("Y_{trk} - Y_{hit} [cm]"));
65 fH2D[h_name]->GetYaxis()->SetTitle("Y_{hit} [cm]");
66 fH2D[h_name]->GetXaxis()->CenterTitle(true);
67 fH2D[h_name]->GetYaxis()->CenterTitle(true);
68 }
69 if (element < 8) {
70 std::string h_name = Form("Sts%d_ref_hits", element);
71 fH2D[h_name] = std::make_unique<TH2D>(h_name.c_str(), "", nb_bins_x, x_min, x_max, nb_bins_y, y_min, y_max);
72 fH2D[h_name]->GetXaxis()->SetTitle(Form("X_{TrkHit} [cm]"));
73 fH2D[h_name]->GetYaxis()->SetTitle("Y_{TrkHit} [cm]");
74 fH2D[h_name]->GetXaxis()->CenterTitle(true);
75 fH2D[h_name]->GetYaxis()->CenterTitle(true);
76 }
77 }
78}
79
81{
82 if (fAnalysisCuts != nullptr && !fAnalysisCuts->CheckEvent(evt)) return;
83
84 int nb_sts_hits = evt->GetNofData(ECbmDataType::kStsHit);
85 LOG(debug) << Form("Processing event with %d StsHit", nb_sts_hits);
86 for (int hit_evt_idx = 0; hit_evt_idx < nb_sts_hits; hit_evt_idx++) {
87 int sts_hit_idx = evt->GetIndex(ECbmDataType::kStsHit, hit_evt_idx);
88 CbmStsHit* hit = (CbmStsHit*) fStsHitArray->UncheckedAt(sts_hit_idx);
89 ProcessHit(hit);
90 }
91 int nb_of_glob_trk = evt->GetNofData(ECbmDataType::kGlobalTrack);
92 for (int evt_glob_trk_idx = 0; evt_glob_trk_idx < nb_of_glob_trk; evt_glob_trk_idx++) {
93 int glob_trk_idx = evt->GetIndex(ECbmDataType::kGlobalTrack, evt_glob_trk_idx);
94 CbmGlobalTrack* glob_trk = (CbmGlobalTrack*) fGlbTrkArray->UncheckedAt(glob_trk_idx);
95 ProcessGlobalTrack(glob_trk);
96 }
98}
99
101{
102 int n_of_units = fStsHits.size();
103
104 for (auto trk : fGlbTrks) {
105 auto sts_trk_idx = trk->GetStsTrackIndex();
106 if (sts_trk_idx == -1) continue;
107
108 CbmStsTrack* sts_track = (CbmStsTrack*) fStsTrkArray->UncheckedAt(sts_trk_idx);
109 if (((CbmStsTrack*) fStsTrkArray->UncheckedAt(sts_trk_idx))->GetNofStsHits() != 2) continue;
110
111 CbmStsHit* hit_i = (CbmStsHit*) fStsHitArray->UncheckedAt(sts_track->GetStsHitIndex(0));
112 CbmStsHit* hit_j = (CbmStsHit*) fStsHitArray->UncheckedAt(sts_track->GetStsHitIndex(1));
113
114 // Charge cut to Sts track hits
115 if (fTrkHitQmin > 0
118 continue;
119
120 int unit_i = CbmStsAddress::GetElementId(hit_i->GetAddress(), kStsUnit);
121 int unit_j = CbmStsAddress::GetElementId(hit_j->GetAddress(), kStsUnit);
122
123 // Checkk track crossed eneabled sensors
124 if (fActiveRefSensors.size()) {
125 if (std::find(fActiveRefSensors.begin(), fActiveRefSensors.end(), hit_i->GetAddress()) == fActiveRefSensors.end())
126 continue;
127 if (std::find(fActiveRefSensors.begin(), fActiveRefSensors.end(), hit_j->GetAddress()) == fActiveRefSensors.end())
128 continue;
129 }
130
131 double x_i = hit_i->GetX();
132 double y_i = hit_i->GetY();
133 double z_i = hit_i->GetZ();
134
135 double x_j = hit_j->GetX();
136 double y_j = hit_j->GetY();
137 double z_j = hit_j->GetZ();
138
139 fH2D[Form("Sts%d_ref_hits", unit_i)]->Fill(x_i, y_i);
140 fH2D[Form("Sts%d_ref_hits", unit_j)]->Fill(x_j, y_j);
141
142 double x_0, y_0, t_x, t_y;
144 t_x = (x_i - x_j) / (z_i - z_j);
145 t_y = (y_i - y_j) / (z_i - z_j);
146 x_0 = x_i - t_x * z_i;
147 y_0 = y_i - t_y * z_i;
148 }
149 else {
150 t_x = trk->GetParamFirst()->GetTx();
151 t_y = trk->GetParamFirst()->GetTy();
152 x_0 = x_i - t_x * z_i;
153 y_0 = y_i - t_y * z_i;
154 }
155
156 double d_trk_trg = TMath::Sqrt(x_0 * x_0 + y_0 * y_0);
157
158 if (fImpactParMax > 0 && fImpactParMax < d_trk_trg) continue;
159
160 for (int uut = 0; uut < n_of_units; uut++) {
161 if (uut == unit_i || uut == unit_j) continue;
162
163 CbmStsHit* closest_hit = nullptr;
164 double min_dist = 1e+6;
165 for (auto hit_dut : fStsHits[uut]) {
166 double x_dut = hit_dut->GetX();
167 double y_dut = hit_dut->GetY();
168 double z_dut = hit_dut->GetZ();
169
170 double x_trk = x_i + t_x * (z_dut - z_i);
171 double y_trk = y_i + t_y * (z_dut - z_i);
172
173 double dx = x_trk - x_dut;
174 double dy = y_trk - y_dut;
175
176 fH2D[Form("Sts0x%x_dx_vs_x:all", hit_dut->GetAddress())]->Fill(dx, x_dut);
177 fH2D[Form("Sts0x%x_dx_vs_y:all", hit_dut->GetAddress())]->Fill(dx, y_dut);
178 fH2D[Form("Sts0x%x_dy_vs_x:all", hit_dut->GetAddress())]->Fill(dy, x_dut);
179 fH2D[Form("Sts0x%x_dy_vs_y:all", hit_dut->GetAddress())]->Fill(dy, y_dut);
180
181 fH2D[Form("Sts%d_dx_vs_x:all", uut)]->Fill(dx, x_dut);
182 fH2D[Form("Sts%d_dx_vs_y:all", uut)]->Fill(dx, y_dut);
183 fH2D[Form("Sts%d_dy_vs_x:all", uut)]->Fill(dy, x_dut);
184 fH2D[Form("Sts%d_dy_vs_y:all", uut)]->Fill(dy, y_dut);
185
186 if (min_dist > dx * dx + dy * dy) {
187 min_dist = dx * dx + dy * dy;
188 closest_hit = hit_dut;
189 }
190 } // hit_dut loop
191
192 if (closest_hit) {
193 double x_dut = closest_hit->GetX();
194 double y_dut = closest_hit->GetY();
195 double z_dut = closest_hit->GetZ();
196
197 double x_trk = x_i + t_x * (z_dut - z_i);
198 double y_trk = y_i + t_y * (z_dut - z_i);
199
200 double dx = x_trk - x_dut;
201 double dy = y_trk - y_dut;
202
203 fH2D[Form("Sts0x%x_dx_vs_x:trk", closest_hit->GetAddress())]->Fill(dx, x_dut);
204 fH2D[Form("Sts0x%x_dx_vs_y:trk", closest_hit->GetAddress())]->Fill(dx, y_dut);
205 fH2D[Form("Sts0x%x_dy_vs_x:trk", closest_hit->GetAddress())]->Fill(dy, x_dut);
206 fH2D[Form("Sts0x%x_dy_vs_y:trk", closest_hit->GetAddress())]->Fill(dy, y_dut);
207
208 fH2D[Form("Sts%d_dx_vs_x:trk", uut)]->Fill(dx, x_dut);
209 fH2D[Form("Sts%d_dx_vs_y:trk", uut)]->Fill(dx, y_dut);
210 fH2D[Form("Sts%d_dy_vs_x:trk", uut)]->Fill(dy, x_dut);
211 fH2D[Form("Sts%d_dy_vs_y:trk", uut)]->Fill(dy, y_dut);
212 }
213 } // uut loop
214 } // track loop
215
216 fStsHits.clear();
217 fGlbTrks.clear();
218}
219
221{
222 if (hit == nullptr) return;
223
224 if (fAnalysisCuts != nullptr && !fAnalysisCuts->CheckStsHit(hit, fStsCluArray)) return;
225
226 int32_t address = hit->GetAddress();
227 int32_t unit = CbmStsAddress::GetElementId(address, kStsUnit);
228
229 fStsHits[unit].push_back(hit);
230}
231
232void CbmStsResolution::EnableRefSensor(int32_t address) { fActiveRefSensors.push_back(address); }
233
235{
236 if (trk == nullptr) return;
237
238 auto sts_trk_idx = trk->GetStsTrackIndex();
239 auto rich_trk_idx = trk->GetRichRingIndex();
240 auto much_trk_idx = trk->GetMuchTrackIndex();
241 auto trd_trk_idx = trk->GetTrdTrackIndex();
242 auto tof_trk_idx = trk->GetTofTrackIndex();
243 float trk_p_val = TMath::Prob(trk->GetChi2(), trk->GetNDF());
244
245 // Apply GlobalTracks cuts
246 int32_t mvd_trk_size = sts_trk_idx != -1 && fStsTrkArray != nullptr
247 ? ((CbmStsTrack*) fStsTrkArray->UncheckedAt(sts_trk_idx))->GetNofMvdHits()
248 : 0;
249
250 int32_t sts_trk_size = sts_trk_idx != -1 && fStsTrkArray != nullptr
251 ? ((CbmStsTrack*) fStsTrkArray->UncheckedAt(sts_trk_idx))->GetNofStsHits()
252 : 0;
253
254 int32_t rich_trk_size = rich_trk_idx != -1 && fRchTrkArray != nullptr
255 ? ((CbmTrack*) fRchTrkArray->UncheckedAt(rich_trk_idx))->GetNofHits()
256 : 0;
257
258 int32_t much_trk_size = much_trk_idx != -1 && fMchTrkArray != nullptr
259 ? ((CbmTrack*) fMchTrkArray->UncheckedAt(much_trk_idx))->GetNofHits()
260 : 0;
261
262 int32_t trd_trk_size = trd_trk_idx != -1 && fTrdTrkArray != nullptr
263 ? ((CbmTrack*) fTrdTrkArray->UncheckedAt(trd_trk_idx))->GetNofHits()
264 : 0;
265
266 int32_t tof_trk_size = tof_trk_idx != -1 && fTofTrkArray != nullptr
267 ? ((CbmTrack*) fTofTrkArray->UncheckedAt(tof_trk_idx))->GetNofHits()
268 : 0;
269
270 if (fAnalysisCuts != nullptr
271 && (!fAnalysisCuts->Check(CbmCutId::kGlobalTrackMvdSize, mvd_trk_size)
272 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackStsSize, sts_trk_size)
273 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackRichSize, rich_trk_size)
274 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackMuchSize, much_trk_size)
275 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackTrdSize, trd_trk_size)
276 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackTofSize, tof_trk_size)
278 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackPval, trk_p_val))) {
279 return;
280 }
281
282 fGlbTrks.push_back(trk);
283}
284
286{
287 switch (fInputType) {
288 case kEventMode: {
289 if (fCbmEvtArray == nullptr) {
290 LOG(error) << "Invalid branch for event-mode: Branch CbmEvent -> nullptr";
291 break;
292 }
293
294 uint32_t nb_events = fCbmEvtArray->GetEntriesFast();
295 LOG(info) << "Processing entry " << entry_ << "\tCbmEvent: " << nb_events;
296
297 for (uint32_t evt_idx = 0; evt_idx < nb_events; evt_idx++) {
298 CbmEvent* event = (CbmEvent*) fCbmEvtArray->UncheckedAt(evt_idx);
299 ProcessEvent(event);
300 }
301 break;
302 }
303 case kMCTimeMode: {
304 break;
305 }
306 case kMCEventMode:
307 case kTimeMode:
308 default: {
309 uint32_t n_of_hits = fStsHitArray->GetEntriesFast();
310 uint32_t n_of_glb_trk = fGlbTrkArray->GetEntriesFast();
311 LOG(info) << "Processing entry " << entry_ << "\tStsHit: " << n_of_hits << "\tGlobalTrack: " << n_of_glb_trk;
312
313 for (uint32_t hit_idx = 0; hit_idx < n_of_hits; hit_idx++) {
314 ProcessHit((CbmStsHit*) fStsHitArray->UncheckedAt(hit_idx));
315 }
316
317 for (uint32_t glb_trk_idx = 0; glb_trk_idx < n_of_glb_trk; glb_trk_idx++) {
318 ProcessGlobalTrack((CbmGlobalTrack*) fGlbTrkArray->UncheckedAt(glb_trk_idx));
319 }
320
322 break;
323 }
324 }
325 entry_++;
326}
327
329{
330 LOG(debug) << "Init CbmStsResolution ...";
331
332 FairRootManager* ioman = FairRootManager::Instance();
333 if (ioman != nullptr) {
334
335 fCbmEvtArray = (TClonesArray*) ioman->GetObject("CbmEvent");
336
337 fGlbTrkArray = (TClonesArray*) ioman->GetObject("GlobalTrack");
338 fStsTrkArray = (TClonesArray*) ioman->GetObject("StsTrack");
339 fRchTrkArray = (TClonesArray*) ioman->GetObject("RichTrack");
340 fMchTrkArray = (TClonesArray*) ioman->GetObject("MuchTrack");
341 fTrdTrkArray = (TClonesArray*) ioman->GetObject("TrdTrack");
342 fTofTrkArray = (TClonesArray*) ioman->GetObject("TofTrack");
343
344 fStsHitArray = (TClonesArray*) ioman->GetObject("StsHit");
345 fStsCluArray = (TClonesArray*) ioman->GetObject("StsCluster");
346 }
347
348 LoadSetup();
349
351
352 return kSUCCESS;
353}
354
@ kGlobalTrackMvdSize
Definition CbmCutId.h:132
@ kGlobalTrackChi2
Definition CbmCutId.h:126
@ kGlobalTrackMuchSize
Definition CbmCutId.h:141
@ kGlobalTrackTrdSize
Definition CbmCutId.h:144
@ kGlobalTrackStsSize
Definition CbmCutId.h:135
@ kGlobalTrackPval
Definition CbmCutId.h:127
@ kGlobalTrackTofSize
Definition CbmCutId.h:147
@ kGlobalTrackRichSize
Definition CbmCutId.h:138
@ kStsUnit
@ kEventMode
@ kMCTimeMode
@ kTimeMode
@ kMCEventMode
Data class for STS tracks.
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 GetStsTrackIndex() const
double GetChi2() const
int32_t GetRichRingIndex() const
int32_t GetTofTrackIndex() const
int32_t GetMuchTrackIndex() const
int32_t GetNDF() const
int32_t GetTrdTrackIndex() const
int32_t GetAddress() const
Definition CbmHit.h:77
double GetZ() const
Definition CbmHit.h:74
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
data class for a reconstructed 3-d hit in the STS
Definition CbmStsHit.h:35
void ProcessHit(CbmStsHit *)
Process an STS hit It filters hits based on the provided CbmCutMap.
TClonesArray * fTofTrkArray
TClonesArray * fStsTrkArray
void ProcessGlobalTrack(CbmGlobalTrack *trk)
TClonesArray * fStsHitArray
TClonesArray * fCbmEvtArray
TClonesArray * fRchTrkArray
void Exec(Option_t *)
TClonesArray * fTrdTrkArray
std::vector< CbmGlobalTrack * > fGlbTrks
TClonesArray * fMchTrkArray
CbmStsResolution()=default
std::map< int32_t, std::vector< CbmStsHit * > > fStsHits
TClonesArray * fGlbTrkArray
void EnableRefSensor(int32_t)
void ProcessEvent(CbmEvent *)
Process an Cbm events It filters event based on the provided CbmCutMap.
std::vector< int32_t > fActiveRefSensors
TClonesArray * fStsCluArray
int32_t GetStsHitIndex(int32_t iHit) const
uint32_t GetElementId(int32_t address, int32_t level)
Get the index of an element.
static const double kStsDy
Definition CbmStsUtils.h:22
double GetHitCharge(CbmStsHit *hit=nullptr, TClonesArray *clusters=nullptr)
Get the charge of a hit as the average of front and back cluster charges.
static const double kStsDx
Definition CbmStsUtils.h:21