CbmRoot
Loading...
Searching...
No Matches
CbmEventVertexDca.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 "CbmEventVertexDca.h"
6
7#include "CbmStsAddress.h"
8
9
11{
12 std::string h_name;
13
14 // ---- Binning configuration ----
15 // 3D Vertex
16 double vertex_dx = 0.01;
17 double vertex_dy = 0.01;
18 double vertex_dz = 0.01;
19 double vertex_x_min = -35 + 0.5 * vertex_dx;
20 double vertex_x_max = +35 + 0.5 * vertex_dx;
21 double vertex_y_min = -35 + 0.5 * vertex_dy;
22 double vertex_y_max = +35 + 0.5 * vertex_dy;
23 double vertex_z_min = -65 + 0.5 * vertex_dz;
24 double vertex_z_max = +65 + 0.5 * vertex_dz;
25
26 auto x_vtx_binning =
27 cbm_sts_utils::HBinning{uint32_t((vertex_x_max - vertex_x_min) / vertex_dx), vertex_x_min, vertex_x_max};
28 auto y_vtx_binning =
29 cbm_sts_utils::HBinning{uint32_t((vertex_y_max - vertex_y_min) / vertex_dy), vertex_y_min, vertex_y_max};
30 auto z_vtx_binning =
31 cbm_sts_utils::HBinning{uint32_t((vertex_z_max - vertex_z_min) / vertex_dz), vertex_z_min, vertex_z_max};
32
33 // DCA
34 double dca_dx = .001; // 10 um
35 double dca_min = -2.5 - 0.5 * dca_dx;
36 double dca_max = +2.5 + 0.5 * dca_dx;
37 auto r_dca_binning = cbm_sts_utils::HBinning{uint32_t((dca_max - dca_min) / dca_dx), dca_min, dca_max};
38 // ---- --------------------- ----
39
40 // ---- 3D Vertex 2D projections ----
41 h_name = "vertex_y_vs_x";
42 fH2D[h_name] =
43 std::make_unique<TH2D>(h_name.c_str(), h_name.c_str(), x_vtx_binning.n_of_bins, x_vtx_binning.x_min,
44 x_vtx_binning.x_max, y_vtx_binning.n_of_bins, y_vtx_binning.x_min, y_vtx_binning.x_max);
45 fH2D[h_name]->GetXaxis()->SetTitle("Vertex_{X} [cm]");
46 fH2D[h_name]->GetYaxis()->SetTitle("Vertex_{Y} [cm]");
47
48 h_name = "vertex_x_vs_z";
49 fH2D[h_name] =
50 std::make_unique<TH2D>(h_name.c_str(), h_name.c_str(), z_vtx_binning.n_of_bins, z_vtx_binning.x_min,
51 z_vtx_binning.x_max, x_vtx_binning.n_of_bins, x_vtx_binning.x_min, x_vtx_binning.x_max);
52 fH2D[h_name]->GetXaxis()->SetTitle("Vertex_{Z} [cm]");
53 fH2D[h_name]->GetYaxis()->SetTitle("Vertex_{X} [cm]");
54
55 h_name = "vertex_y_vs_z";
56 fH2D[h_name] =
57 std::make_unique<TH2D>(h_name.c_str(), h_name.c_str(), z_vtx_binning.n_of_bins, z_vtx_binning.x_min,
58 z_vtx_binning.x_max, y_vtx_binning.n_of_bins, y_vtx_binning.x_min, y_vtx_binning.x_max);
59 fH2D[h_name]->GetXaxis()->SetTitle("Vertex_{Z} [cm]");
60 fH2D[h_name]->GetYaxis()->SetTitle("Vertex_{Y} [cm]");
61 // ---- ------------------------ ----
62
63 // ---- PCA 2D projections ----
64 if (fVertexFinder) {
65 h_name = "pca_y_vs_x";
66 fH2DShared[h_name] =
67 std::make_shared<TH2D>(h_name.c_str(), h_name.c_str(), x_vtx_binning.n_of_bins, x_vtx_binning.x_min,
68 x_vtx_binning.x_max, y_vtx_binning.n_of_bins, y_vtx_binning.x_min, y_vtx_binning.x_max);
69 fH2DShared[h_name]->GetXaxis()->SetTitle("Vertex_{X} [cm]");
70 fH2DShared[h_name]->GetYaxis()->SetTitle("Vertex_{Y} [cm]");
71
72 h_name = "pca_x_vs_z";
73 fH2DShared[h_name] =
74 std::make_shared<TH2D>(h_name.c_str(), h_name.c_str(), z_vtx_binning.n_of_bins, z_vtx_binning.x_min,
75 z_vtx_binning.x_max, x_vtx_binning.n_of_bins, x_vtx_binning.x_min, x_vtx_binning.x_max);
76 fH2DShared[h_name]->GetXaxis()->SetTitle("Vertex_{Z} [cm]");
77 fH2DShared[h_name]->GetYaxis()->SetTitle("Vertex_{X} [cm]");
78
79 h_name = "pca_y_vs_z";
80 fH2DShared[h_name] =
81 std::make_shared<TH2D>(h_name.c_str(), h_name.c_str(), z_vtx_binning.n_of_bins, z_vtx_binning.x_min,
82 z_vtx_binning.x_max, y_vtx_binning.n_of_bins, y_vtx_binning.x_min, y_vtx_binning.x_max);
83 fH2DShared[h_name]->GetXaxis()->SetTitle("Vertex_{Z} [cm]");
84 fH2DShared[h_name]->GetYaxis()->SetTitle("Vertex_{Y} [cm]");
85
86 std::cout << " - DcaVertexFinder - Enabling QA" << std::endl;
87 fVertexFinder->EnableQa({fH2DShared["pca_y_vs_x"], fH2DShared["pca_x_vs_z"], fH2DShared["pca_y_vs_z"]});
88 }
89 // ---- ------------------------ ----
90
91 // ---- DCA ----
92 for (const char* di : {"x", "y", "z"}) {
93 h_name = Form("dca_d%s_vs_x", di);
94 fH2D[h_name] =
95 std::make_unique<TH2D>(h_name.c_str(), h_name.c_str(), r_dca_binning.n_of_bins, r_dca_binning.x_min,
96 r_dca_binning.x_max, x_vtx_binning.n_of_bins, x_vtx_binning.x_min, x_vtx_binning.x_max);
97 fH2D[h_name]->GetYaxis()->SetTitle("X [cm]");
98 fH2D[h_name]->GetXaxis()->SetTitle(Form("DCA_{%s} [cm]", di));
99
100 h_name = Form("dca_d%s_vs_y", di);
101 fH2D[h_name] =
102 std::make_unique<TH2D>(h_name.c_str(), h_name.c_str(), r_dca_binning.n_of_bins, r_dca_binning.x_min,
103 r_dca_binning.x_max, y_vtx_binning.n_of_bins, y_vtx_binning.x_min, y_vtx_binning.x_max);
104 fH2D[h_name]->GetYaxis()->SetTitle("Y [cm]");
105 fH2D[h_name]->GetXaxis()->SetTitle(Form("DCA_{%s} [cm]", di));
106
107 h_name = Form("dca_d%s_vs_z", di);
108 fH2D[h_name] =
109 std::make_unique<TH2D>(h_name.c_str(), h_name.c_str(), r_dca_binning.n_of_bins, r_dca_binning.x_min,
110 r_dca_binning.x_max, z_vtx_binning.n_of_bins, z_vtx_binning.x_min, z_vtx_binning.x_max);
111 fH2D[h_name]->GetYaxis()->SetTitle(Form("Z [cm]"));
112 fH2D[h_name]->GetXaxis()->SetTitle(Form("DCA_{%s} [cm]", di));
113 }
114 // ---- ------------------ ----
115
116 // ---- Residual with MC ----
117 if (input_has_mc) {
118 LOG(info) << " - INFO - Enabling MC comparison";
119 for (const char* di : {"x", "y", "z"}) {
120 h_name = Form("res_%s_vs_x", di);
121 fH2D[h_name] =
122 std::make_unique<TH2D>(h_name.c_str(), h_name.c_str(), r_dca_binning.n_of_bins, r_dca_binning.x_min,
123 r_dca_binning.x_max, x_vtx_binning.n_of_bins, x_vtx_binning.x_min, x_vtx_binning.x_max);
124 fH2D[h_name]->GetYaxis()->SetTitle("X [cm]");
125 fH2D[h_name]->GetXaxis()->SetTitle(Form("%s_{rec} - %s_{MC} [cm]", di, di));
126
127 h_name = Form("res_%s_vs_y", di);
128 fH2D[h_name] =
129 std::make_unique<TH2D>(h_name.c_str(), h_name.c_str(), r_dca_binning.n_of_bins, r_dca_binning.x_min,
130 r_dca_binning.x_max, y_vtx_binning.n_of_bins, y_vtx_binning.x_min, y_vtx_binning.x_max);
131 fH2D[h_name]->GetYaxis()->SetTitle("Y [cm]");
132 fH2D[h_name]->GetXaxis()->SetTitle(Form("%s_{rec} - %s_{MC} [cm]", di, di));
133
134 h_name = Form("res_%s_vs_z", di);
135 fH2D[h_name] =
136 std::make_unique<TH2D>(h_name.c_str(), h_name.c_str(), r_dca_binning.n_of_bins, r_dca_binning.x_min,
137 r_dca_binning.x_max, z_vtx_binning.n_of_bins, z_vtx_binning.x_min, z_vtx_binning.x_max);
138 fH2D[h_name]->GetYaxis()->SetTitle(Form("Z [cm]"));
139 fH2D[h_name]->GetXaxis()->SetTitle(Form("%s_{rec} - %s_{MC} [cm]", di, di));
140 }
141 }
142 // ---- ------------------------- ----
143
144 // Track multiplicity
145 h_name = "ca_track_multiplicity_all";
146 fH1D[h_name] = std::make_unique<TH1D>(h_name.c_str(), h_name.c_str(), 50, 0, 50);
147 fH1D[h_name]->GetXaxis()->SetTitle("N_{CATrack}");
148 fH1D[h_name]->GetYaxis()->SetTitle("Entries");
149
150 h_name = "ca_track_multiplicity_sel";
151 fH1D[h_name] = std::make_unique<TH1D>(h_name.c_str(), h_name.c_str(), 50, 0, 50);
152 fH1D[h_name]->GetXaxis()->SetTitle("N_{CATrack}");
153 fH1D[h_name]->GetYaxis()->SetTitle("Entries");
154}
155
156
158
160{
161 fH1D["ca_track_multiplicity_sel"]->Fill(fGlbTrks.size());
162
163 fVertexFinder->SetTracks(fGlbTrks);
164 const std::optional<CbmVertex> vertex = fVertexFinder->FindVertex();
165
166 if (vertex.has_value()) {
167
168 TVector3 vtx(vertex->GetX(), vertex->GetY(), vertex->GetZ());
169
170 fH2D["vertex_y_vs_x"]->Fill(vtx[0], vtx[1]);
171 fH2D["vertex_x_vs_z"]->Fill(vtx[2], vtx[0]);
172 fH2D["vertex_y_vs_z"]->Fill(vtx[2], vtx[1]);
173
174 for (const CbmGlobalTrack* trk : fGlbTrks) {
175 float trk_tx = trk->GetParamFirst()->GetTx();
176 float trk_ty = trk->GetParamFirst()->GetTy();
177 float trk_x0 = trk->GetParamFirst()->GetX();
178 float trk_y0 = trk->GetParamFirst()->GetY();
179 float trk_z0 = trk->GetParamFirst()->GetZ();
180
181 TVector3 p(trk_x0, trk_y0, trk_z0);
182 TVector3 e(trk_tx, trk_ty, 1);
183 TVector3 trk_to_vtx = ((vtx - p).Cross(e)) * (1. / e.Mag());
184
185 fH2D["dca_dx_vs_x"]->Fill(trk_to_vtx.Px(), vtx.Px());
186 fH2D["dca_dx_vs_y"]->Fill(trk_to_vtx.Px(), vtx.Py());
187 fH2D["dca_dx_vs_z"]->Fill(trk_to_vtx.Px(), vtx.Pz());
188
189 fH2D["dca_dy_vs_x"]->Fill(trk_to_vtx.Py(), vtx.Px());
190 fH2D["dca_dy_vs_y"]->Fill(trk_to_vtx.Py(), vtx.Py());
191 fH2D["dca_dy_vs_z"]->Fill(trk_to_vtx.Py(), vtx.Pz());
192
193 fH2D["dca_dz_vs_x"]->Fill(trk_to_vtx.Pz(), vtx.Px());
194 fH2D["dca_dz_vs_y"]->Fill(trk_to_vtx.Pz(), vtx.Py());
195 fH2D["dca_dz_vs_z"]->Fill(trk_to_vtx.Pz(), vtx.Pz());
196 }
197
198 if (input_has_mc) {
199 TVector3 mc_vertex;
200 int n_of_mc_trks = fMCTrkArray->GetEntriesFast();
201 for (int mc_trk_idx = 0; mc_trk_idx < n_of_mc_trks; mc_trk_idx++) {
202 auto mc_trk = (CbmMCTrack*) fMCTrkArray->UncheckedAt(mc_trk_idx);
203 if (mc_trk->GetMotherId() == -1) {
204 mc_trk->GetStartVertex(mc_vertex);
205 break;
206 }
207 }
208
209 fH2D["res_x_vs_x"]->Fill(vtx[0] - mc_vertex[0], vtx[0]);
210 fH2D["res_x_vs_y"]->Fill(vtx[0] - mc_vertex[0], vtx[1]);
211 fH2D["res_x_vs_z"]->Fill(vtx[0] - mc_vertex[0], vtx[2]);
212
213 fH2D["res_y_vs_x"]->Fill(vtx[1] - mc_vertex[1], vtx[0]);
214 fH2D["res_y_vs_y"]->Fill(vtx[1] - mc_vertex[1], vtx[1]);
215 fH2D["res_y_vs_z"]->Fill(vtx[1] - mc_vertex[1], vtx[2]);
216
217 fH2D["res_z_vs_x"]->Fill(vtx[2] - mc_vertex[2], vtx[0]);
218 fH2D["res_z_vs_y"]->Fill(vtx[2] - mc_vertex[2], vtx[1]);
219 fH2D["res_z_vs_z"]->Fill(vtx[2] - mc_vertex[2], vtx[2]);
220 }
221 }
222
223 // Clear track containers
224 fGlbTrks.clear();
225}
226
228{
229 int nb_of_glob_trk = evt->GetNofData(ECbmDataType::kGlobalTrack);
230 fH1D["ca_track_multiplicity_all"]->Fill(nb_of_glob_trk);
231
232 if (fAnalysisCuts != nullptr && !fAnalysisCuts->CheckEvent(evt)) return;
233
234
235 for (int evt_glob_trk_idx = 0; evt_glob_trk_idx < nb_of_glob_trk; evt_glob_trk_idx++) {
236 int glob_trk_idx = evt->GetIndex(ECbmDataType::kGlobalTrack, evt_glob_trk_idx);
237 ProcessGlobalTrack((CbmGlobalTrack*) fGlbTrkArray->UncheckedAt(glob_trk_idx));
238 }
239
240 CheckVertex();
241}
242
244{
245 auto sts_trk_idx = trk->GetStsTrackIndex();
246 auto rich_trk_idx = trk->GetRichRingIndex();
247 auto much_trk_idx = trk->GetMuchTrackIndex();
248 auto trd_trk_idx = trk->GetTrdTrackIndex();
249 auto tof_trk_idx = trk->GetTofTrackIndex();
250 float trk_p_val = TMath::Prob(trk->GetChi2(), trk->GetNDF());
251
252 // Apply GlobalTracks cuts
253 int32_t mvd_trk_size = sts_trk_idx != -1 && fStsTrkArray != nullptr
254 ? ((CbmStsTrack*) fStsTrkArray->UncheckedAt(sts_trk_idx))->GetNofMvdHits()
255 : 0;
256
257 int32_t sts_trk_size = sts_trk_idx != -1 && fStsTrkArray != nullptr
258 ? ((CbmStsTrack*) fStsTrkArray->UncheckedAt(sts_trk_idx))->GetNofStsHits()
259 : 0;
260
261 int32_t rich_trk_size = rich_trk_idx != -1 && fRchTrkArray != nullptr
262 ? ((CbmTrack*) fRchTrkArray->UncheckedAt(rich_trk_idx))->GetNofHits()
263 : 0;
264
265 int32_t much_trk_size = much_trk_idx != -1 && fMchTrkArray != nullptr
266 ? ((CbmTrack*) fMchTrkArray->UncheckedAt(much_trk_idx))->GetNofHits()
267 : 0;
268
269 int32_t trd_trk_size = trd_trk_idx != -1 && fTrdTrkArray != nullptr
270 ? ((CbmTrack*) fTrdTrkArray->UncheckedAt(trd_trk_idx))->GetNofHits()
271 : 0;
272
273 int32_t tof_trk_size = tof_trk_idx != -1 && fTofTrkArray != nullptr
274 ? ((CbmTrack*) fTofTrkArray->UncheckedAt(tof_trk_idx))->GetNofHits()
275 : 0;
276
277 if (fAnalysisCuts != nullptr
278 && (!fAnalysisCuts->Check(CbmCutId::kGlobalTrackMvdSize, mvd_trk_size)
279 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackStsSize, sts_trk_size)
280 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackRichSize, rich_trk_size)
281 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackMuchSize, much_trk_size)
282 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackTrdSize, trd_trk_size)
283 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackTofSize, tof_trk_size)
285 || !fAnalysisCuts->Check(CbmCutId::kGlobalTrackPval, trk_p_val))) {
286 return;
287 }
288
289 fGlbTrks.push_back(trk);
290}
291
293{
294 LOG(info) << "Running CbmEventVertexDca;\t"
295 << "Entry: " << entry_;
296
297 // Check if CbmEvent
298 if (fCbmEvtArray != nullptr) {
299 uint32_t nb_events = fCbmEvtArray->GetEntriesFast();
300 LOG(info) << Form(" ... number of CbmEvent: %u\n", nb_events);
301 for (uint32_t evt_idx = 0; evt_idx < nb_events; evt_idx++) {
302 ProcessEvent((CbmEvent*) fCbmEvtArray->UncheckedAt(evt_idx));
303 }
304 }
305 else {
306
307 LOG(debug) << " ... running time-like*** Using all tracks in TS - risk of high combinatorial";
308
309 uint32_t nb_of_glob_trk = fGlbTrkArray->GetEntriesFast();
310 LOG(info) << Form("Number of GlobalTracks: %u\n", nb_of_glob_trk);
311 for (uint32_t glob_trk_idx = 0; glob_trk_idx < nb_of_glob_trk; glob_trk_idx++) {
312 CbmGlobalTrack* glob_trk = (CbmGlobalTrack*) fGlbTrkArray->UncheckedAt(glob_trk_idx);
313 ProcessGlobalTrack(glob_trk);
314 }
315
316 CheckVertex();
317 }
318 entry_++;
319}
320
322{
323 LOG(debug) << "Init CbmEventVertexDca ...";
324
325 FairRootManager* ioman = FairRootManager::Instance();
326 if (ioman != nullptr) {
327 fCbmEvtArray = (TClonesArray*) ioman->GetObject("CbmEvent");
328
329 fGlbTrkArray = (TClonesArray*) ioman->GetObject("GlobalTrack");
330
331 fStsTrkArray = (TClonesArray*) ioman->GetObject("StsTrack");
332 fRchTrkArray = (TClonesArray*) ioman->GetObject("RichTrack");
333 fMchTrkArray = (TClonesArray*) ioman->GetObject("MuchTrack");
334 fTrdTrkArray = (TClonesArray*) ioman->GetObject("TrdTrack");
335 fTofTrkArray = (TClonesArray*) ioman->GetObject("TofTrack");
336
337 fStsHitArray = (TClonesArray*) ioman->GetObject("StsHit");
338
339 fStsCluArray = (TClonesArray*) ioman->GetObject("StsCluster");
340
341 fMCTrkArray = (TClonesArray*) ioman->GetObject("MCTrack");
342 input_has_mc = fMCTrkArray != nullptr;
343 }
344
345 LoadSetup();
346
348
349 fGlbTrks.reserve(100);
350
351 return kSUCCESS;
352}
353
354void CbmEventVertexDca::SetVertexFinder(std::shared_ptr<CbmDcaVertexFinder> vtx_finder) { fVertexFinder = vtx_finder; }
@ 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
TClonesArray * fStsHitArray
TClonesArray * fMchTrkArray
TClonesArray * fStsCluArray
void ProcessEvent(CbmEvent *)
Process an Cbm events It filters event based on the provided CbmCutMap.
std::vector< CbmGlobalTrack * > fGlbTrks
TClonesArray * fCbmEvtArray
void SetVertexFinder(std::shared_ptr< CbmDcaVertexFinder >)
TClonesArray * fRchTrkArray
TClonesArray * fTrdTrkArray
std::shared_ptr< CbmDcaVertexFinder > fVertexFinder
TClonesArray * fGlbTrkArray
void ProcessGlobalTrack(CbmGlobalTrack *)
Process an Global tracks It filters the tracks based on the provided CbmCutMap.
TClonesArray * fStsTrkArray
TClonesArray * fMCTrkArray
TClonesArray * fTofTrkArray
void Exec(Option_t *)
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
CbmCutMap * fAnalysisCuts
std::map< std::string, std::unique_ptr< TH2D > > fH2D
std::map< std::string, std::shared_ptr< TH2D > > fH2DShared
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::map< std::string, std::unique_ptr< TH1D > > fH1D
Structure to hold the binning for 1D histogram.
Definition CbmStsUtils.h:92