CbmRoot
Loading...
Searching...
No Matches
CbmL1PFFitter.cxx
Go to the documentation of this file.
1/* Copyright (C) 2011-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Maksym Zyzak [committer] */
4
5/*
6 *=====================================================
7 *
8 * CBM Level 1 Reconstruction
9 *
10 * Authors: M.Zyzak
11 *
12 * e-mail :
13 *
14 *=====================================================
15 *
16 * SIMD Fitter
17 *
18 */
19
20#include "CbmL1PFFitter.h"
21
22#include "CbmL1.h"
23#include "CbmStsAddress.h"
24#include "CbmStsHit.h"
25#include "CbmStsSetup.h"
26#include "CbmStsTrack.h"
27#include "TClonesArray.h"
28
29//ca::Framework tools
30#include "CaFramework.h"
31#include "CaSimd.h"
32#include "CbmKFVertex.h"
33#include "FairRootManager.h"
34#include "KFParticleDatabase.h"
35#include "KfFieldRegion.h"
36#include "KfToolsField.h"
37#include "KfTrackKalmanFilter.h"
38#include "KfTrackParam.h"
39#include "TDatabasePDG.h"
40
41// FIXME: inline does not work in the context
42
43using namespace cbm::algo::ca;
45
46using std::vector;
47using namespace std;
48
50{
51 const fvec c_light(0.000299792458), c_light_i = fvec(1.) / c_light;
52 const fvec ZERO = fvec(0.);
53 const fvec ONE = fvec(1.);
54 const fvec vINF = fvec(0.1);
55} // namespace NS_L1TrackFitter
56using namespace NS_L1TrackFitter;
57
58
60{
61 const auto* pInterpolatedField = fld.GetConcrete<kf::EFieldMode::Interpolated>();
62 if (!pInterpolatedField) {
63 throw std::logic_error("CbmL1PFFitter::PFFieldRegion: wrong field mode");
64 }
65
66 const auto& coeff = pInterpolatedField->GetCoefficients();
67
68 int i = 0;
69 for (int j = 0; j < 3; j++) {
70 for (int k = 0; k < 3; k++) {
71 fP[i] = coeff[j][k][ind];
72 i++;
73 }
74 }
75 fP[9] = pInterpolatedField->GetZfirst()[ind];
76}
77
79{
80 auto* pInterpolatedField = fld.GetConcrete<kf::EFieldMode::Interpolated>();
81 if (!pInterpolatedField) {
82 throw std::logic_error("CbmL1PFFitter::PFFieldRegion: wrong field mode, the field must be interpolated");
83 }
84
85 auto coeff = pInterpolatedField->GetCoefficients();
86 auto z = pInterpolatedField->GetZfirst();
87
88 int i = 0;
89 for (int j = 0; j < 3; j++) {
90 for (int k = 0; k < 3; k++) {
91 coeff[j][k][ind] = fP[i];
92 i++;
93 }
94 }
95 z[ind] = fP[9]; // FIXME: no effect?
96
97 pInterpolatedField->Set(coeff, fP[9]); // FIXME: Set(coeff, z)?
98}
99
104
105
107{
108 if (fIsInitialised) {
109 return;
110 }
111
114 fMvdHitArray = nullptr;
115 fStsHitArray = nullptr;
116
117 FairRootManager* manager = FairRootManager::Instance();
118
119 if (!manager) {
120 LOG(fatal) << "CbmL1PFFitter: no FairRootManager";
121 }
122
123 if (!CbmL1::Instance() || !CbmL1::Instance()->fpAlgo) {
124 LOG(fatal) << "CbmL1PFFitter: no CbmL1 task initialised ";
125 }
126
128 // TODO: Remove CbmL1::Instance with itterations:
129 // 1) replace material with active setup
130 // 2) replace field with active setup
131 // 3) provide proper initialization of the setup
134
135 if (fNmvdStationsActive > 0) {
136 fMvdHitArray = static_cast<TClonesArray*>(manager->GetObject("MvdHit"));
137 }
138 if (fNstsStationsActive > 0) {
139 fStsHitArray = static_cast<TClonesArray*>(manager->GetObject("StsHit"));
140 }
141
143
144 fIsInitialised = true;
145}
146
148{
150 return CbmL1::Instance()->fpAlgo->GetParameters().GetStationIndexActive(hit->GetStationNr(), EDetectorID::kMvd);
151}
152
154{
156 return CbmL1::Instance()->fpAlgo->GetParameters().GetStationIndexActive(
157 CbmStsSetup::Instance()->GetStationNumber(hit->GetAddress()), EDetectorID::kSts);
158}
159
160
162{
163 TrackParamV& tr = fit.Tr();
164 tr.ResetErrors(mxy.Dx2(), mxy.Dy2(), 1., 1., 1., dt2, 1.e2);
165 tr.C10() = mxy.Dxy();
166 tr.X() = mxy.X();
167 tr.Y() = mxy.Y();
168 tr.Time() = t;
169 tr.Vi() = 0.;
170 tr.Ndf() = mxy.NdfX() + mxy.NdfY() - fvec(5.);
171 tr.NdfTime() = -2.;
172}
173
174void CbmL1PFFitter::Fit(std::vector<CbmStsTrack>& Tracks, const std::vector<CbmMvdHit>& vMvdHits,
175 const std::vector<CbmStsHit>& vStsHits, const std::vector<int>& pidHypo)
176{
177 // TODO: (!) replace CbmL1::Instance()->fpAlgo->GetParameters() with the cbm::ca::ParametersHandler::Instance()->Get()
178 // everywhere outside cbm::algo
179 const auto& rActSetup = CbmL1::Instance()->fpAlgo->GetParameters().GetActiveSetup();
180 Initialize();
181
182
185 // fld.SetUseOriginalField();
186
187 static int nHits = CbmL1::Instance()->fpAlgo->GetParameters().GetNstationsActive();
188 int nTracks_SIMD = fvec::size();
189
191 fit.SetParticleMass(CbmL1::Instance()->fpAlgo->GetDefaultParticleMass());
192
193 TrackParamV& T = fit.Tr(); // fitting parametr coresponding to current track
194
195 CbmStsTrack* tr[fvec::size()]{nullptr};
196
197 int ista;
198 const auto& sta = rActSetup.GetActiveLayers();
199
200 fvec x[nHits];
201 fvec y[nHits];
202 fvec z[nHits];
203 fvec t[nHits];
204 kf::MeasurementXy<fvec> mxy[nHits];
205 fvec dt2[nHits];
206 fmask w[nHits];
207
208 // fvec y_temp;
209 fvec x_first, y_first, t_first, x_last, y_last, t_last;
210 kf::MeasurementXy<fvec> mxy_first, mxy_last;
211 fvec dt2_first, dt2_last;
212
213 fvec z0, z1, z2, dz, z_start, z_end;
214 kf::FieldValue<fvec> fB[nHits];
216
217 unsigned short N_vTracks = Tracks.size();
218
219
220 for (unsigned short itrack = 0; itrack < N_vTracks; itrack++) {
221 Tracks[itrack].SetPidHypo(pidHypo[itrack]);
222 }
223
224 fvec mass = 0.000511f;
225
226 for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvec::size()) {
227
228 T.Time() = 0.;
229 T.Vi() = 0.;
230 T.ResetErrors(1.e2, 1.e2, 1., 1., 1., 1.e6, 1.e2);
231
232 if (N_vTracks - itrack < static_cast<unsigned short>(fvec::size())) {
233 nTracks_SIMD = N_vTracks - itrack;
234 }
235 for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
236 tr[iVec] = &Tracks[itrack + iVec]; // current track
237 T.X()[iVec] = tr[iVec]->GetParamFirst()->GetX();
238 T.Y()[iVec] = tr[iVec]->GetParamFirst()->GetY();
239 T.Tx()[iVec] = tr[iVec]->GetParamFirst()->GetTx();
240 T.Ty()[iVec] = tr[iVec]->GetParamFirst()->GetTy();
241 T.Qp()[iVec] = tr[iVec]->GetParamFirst()->GetQp();
242 T.Time()[iVec] = 0.;
243 T.Vi()[iVec] = 0.;
244 T.Z()[iVec] = tr[iVec]->GetParamFirst()->GetZ();
245
246 for (int i = 0; i < 5; i++) {
247 for (int j = 0; j <= i; j++) {
248 T.C(i, j)[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(i, j);
249 }
250 }
251
252 int pid = pidHypo[itrack + iVec];
253 if (pid == -1) {
254 pid = 211;
255 }
256 // mass[i] = TDatabasePDG::Instance()->GetParticle(pid)->Mass();
257 mass[iVec] = KFParticleDatabase::Instance()->GetMass(pid);
258 }
259
260 fit.SetParticleMass(mass);
261
262 // get hits of current track
263 for (int i = 0; i < nHits; i++) {
264 w[i] = fmask::Zero();
265 z[i] = sta[i].GetZref();
266 x[i] = 0.;
267 y[i] = 0.;
268 t[i] = 0.;
269 mxy[i].SetX(0.);
270 mxy[i].SetY(0.);
271 mxy[i].SetDx2(1.);
272 mxy[i].SetDy2(1.);
273 mxy[i].SetDxy(0.);
274 mxy[i].SetNdfX(1.);
275 mxy[i].SetNdfY(1.);
276 dt2[i] = 1.;
277 fvec zeroB = 0.;
278 fB[i].Set(zeroB, zeroB, zeroB, z[i]);
279 }
280
281 for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
282 int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
283 int nHitsTrackSts = tr[iVec]->GetNofStsHits();
284 int nHitsTrack = nHitsTrackMvd + nHitsTrackSts;
285 for (int i = 0; i < nHitsTrack; i++) {
286
287 const CbmPixelHit* hit;
288 if (i < nHitsTrackMvd) {
289 int hitIndex = tr[iVec]->GetMvdHitIndex(i);
290 const CbmMvdHit* mvdHit = &(vMvdHits[hitIndex]);
291 ista = GetMvdStationIndex(mvdHit);
292 if (ista < 0) {
293 continue;
294 }
295 hit = mvdHit;
296 }
297 else {
298 int hitIndex = tr[iVec]->GetStsHitIndex(i - nHitsTrackMvd);
299 const CbmStsHit* stsHit = &(vStsHits[hitIndex]);
300 ista = GetStsStationIndex(stsHit);
301 if (ista < 0) {
302 continue;
303 }
304 hit = stsHit;
305 }
306
307 x[ista][iVec] = hit->GetX();
308 y[ista][iVec] = hit->GetY();
309 z[ista][iVec] = hit->GetZ();
310 t[ista][iVec] = hit->GetTime();
311
312 mxy[ista].X()[iVec] = hit->GetX();
313 mxy[ista].Y()[iVec] = hit->GetY();
314 mxy[ista].Dx2()[iVec] = hit->GetDx() * hit->GetDx();
315 mxy[ista].Dy2()[iVec] = hit->GetDy() * hit->GetDy();
316 mxy[ista].Dxy()[iVec] = hit->GetDxy();
317 mxy[ista].NdfX()[iVec] = 1.;
318 mxy[ista].NdfY()[iVec] = 1.;
319 dt2[ista][iVec] = hit->GetTimeError() * hit->GetTimeError();
320
321 w[ista][iVec] = true;
322
323
324 fB_temp = rActSetup.GetField().GetFieldValue(ista, x[ista], y[ista]);
325 fB[ista].SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec], fB_temp.GetZ()[iVec],
326 iVec);
327 if (i == 0) {
328 z_start[iVec] = z[ista][iVec];
329 x_first[iVec] = x[ista][iVec];
330 y_first[iVec] = y[ista][iVec];
331 t_first[iVec] = t[ista][iVec];
332 mxy_first.X()[iVec] = mxy[ista].X()[iVec];
333 mxy_first.Y()[iVec] = mxy[ista].Y()[iVec];
334 mxy_first.Dx2()[iVec] = mxy[ista].Dx2()[iVec];
335 mxy_first.Dy2()[iVec] = mxy[ista].Dy2()[iVec];
336 mxy_first.Dxy()[iVec] = mxy[ista].Dxy()[iVec];
337 mxy_first.NdfX()[iVec] = mxy[ista].NdfX()[iVec];
338 mxy_first.NdfY()[iVec] = mxy[ista].NdfY()[iVec];
339 dt2_first[iVec] = dt2[ista][iVec];
340 }
341 if (i == nHitsTrack - 1) {
342 z_end[iVec] = z[ista][iVec];
343 x_last[iVec] = x[ista][iVec];
344 y_last[iVec] = y[ista][iVec];
345 t_last[iVec] = t[ista][iVec];
346 mxy_last.X()[iVec] = mxy[ista].X()[iVec];
347 mxy_last.Y()[iVec] = mxy[ista].Y()[iVec];
348 mxy_last.Dx2()[iVec] = mxy[ista].Dx2()[iVec];
349 mxy_last.Dy2()[iVec] = mxy[ista].Dy2()[iVec];
350 mxy_last.Dxy()[iVec] = mxy[ista].Dxy()[iVec];
351 mxy_last.NdfX()[iVec] = mxy[ista].NdfX()[iVec];
352 mxy_last.NdfY()[iVec] = mxy[ista].NdfY()[iVec];
353 dt2_last[iVec] = dt2[ista][iVec];
354 }
355 }
356 }
357
358 // fit forward
359
360 int i = 0;
361
362 FilterFirst(fit, mxy_first, t_first, dt2_first);
363 fit.Linearization().qp = fit.Tr().Qp();
364
365 z1 = z[i];
366 b1 = rActSetup.GetField().GetFieldValue(i, T.X(), T.Y());
367 b1.SetSimdEntries(fB[i], w[i]);
368 z2 = z[i + 2];
369 dz = z2 - z1;
370 b2 = rActSetup.GetField().GetFieldValue(i + 2, T.X() + T.Tx() * dz, T.Y() + T.Ty() * dz);
371 b2.SetSimdEntries(fB[i + 2], w[i + 2]);
372 fld.Set(b2, b1, b0);
373 for (++i; i < nHits; i++) {
374 z0 = z[i];
375 dz = (z1 - z0);
376 b0 = rActSetup.GetField().GetFieldValue(i, T.X() - T.Tx() * dz, T.Y() - T.Ty() * dz);
377 b0.SetSimdEntries(fB[i], w[i]);
378 fld.Set(b0, b1, b2);
379
380 fmask initialised = (z[i] <= z_end) & (z_start < z[i]);
381
382 fit.SetMask(initialised);
383 fit.Extrapolate(z[i], fld);
384 auto radThick = rActSetup.GetMaterial(i).GetThicknessX0(fit.Tr().X(), fit.Tr().Y());
385 fit.MultipleScattering(radThick);
387
388 fit.SetMask(initialised && w[i]);
389 fit.FilterXY(mxy[i]);
390 fit.FilterTime(t[i], dt2[i], fmask(sta[i].IsTimeMeasured()));
391
392 b2 = b1;
393 z2 = z1;
394 b1 = b0;
395 z1 = z0;
396 }
397
398 TrackParamV Tout = T;
399 for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
400 FairTrackParam par;
401 par.SetX(T.X()[iVec]);
402 par.SetY(T.Y()[iVec]);
403 par.SetTx(T.Tx()[iVec]);
404 par.SetTy(T.Ty()[iVec]);
405 par.SetQp(T.Qp()[iVec]);
406 par.SetZ(T.Z()[iVec]);
407
408 for (int k = 0; k < 5; k++) {
409 for (int j = 0; j <= k; j++) {
410 par.SetCovariance(k, j, Tout.C(k, j)[iVec]);
411 }
412 }
413
414 tr[iVec]->SetParamLast(&par);
415 }
416
417 // fit backward
418
419 fit.Linearization().qp = fit.Tr().Qp();
420
421 i = nHits - 1;
422
423 FilterFirst(fit, mxy_last, t_last, dt2_last);
424
425 z1 = z[i];
426 b1 = rActSetup.GetField().GetFieldValue(i, T.X(), T.Y());
427 b1.SetSimdEntries(fB[i], w[i]);
428
429 z2 = z[i - 2];
430 dz = z2 - z1;
431 b2 = rActSetup.GetField().GetFieldValue(i - 2, T.X() + T.Tx() * dz, T.Y() + T.Ty() * dz);
432 b2.SetSimdEntries(fB[i - 2], w[i - 2]);
433 fld.Set(b2, b1, b0);
434 for (--i; i >= 0; i--) {
435 z0 = z[i];
436 dz = (z1 - z0);
437 b0 = rActSetup.GetField().GetFieldValue(i, T.X() - T.Tx() * dz, T.Y() - T.Ty() * dz);
438 b0.SetSimdEntries(fB[i], w[i]);
439 fld.Set(b0, b1, b2);
440
441 fmask initialised = (z[i] < z_end) & (z_start <= z[i]);
442
443 fit.SetMask(initialised);
444 fit.Extrapolate(z[i], fld);
445 auto radThick = rActSetup.GetMaterial(i).GetThicknessX0(fit.Tr().X(), fit.Tr().Y());
446 fit.MultipleScattering(radThick);
448
449 fit.SetMask(initialised && w[i]);
450 fit.FilterXY(mxy[i]);
451 fit.FilterTime(t[i], dt2[i], fmask(sta[i].IsTimeMeasured()));
452
453 b2 = b1;
454 z2 = z1;
455 b1 = b0;
456 z1 = z0;
457 }
458
459 for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
460 FairTrackParam par;
461 par.SetX(T.X()[iVec]);
462 par.SetY(T.Y()[iVec]);
463 par.SetTx(T.Tx()[iVec]);
464 par.SetTy(T.Ty()[iVec]);
465 par.SetQp(T.Qp()[iVec]);
466 par.SetZ(T.Z()[iVec]);
467
468 for (int k = 0; k < 5; k++) {
469 for (int j = 0; j <= k; j++) {
470 par.SetCovariance(k, j, T.C(k, j)[iVec]);
471 }
472 }
473
474 tr[iVec]->SetParamFirst(&par);
475
476 tr[iVec]->SetChiSq(T.ChiSq()[iVec]);
477 tr[iVec]->SetNDF(static_cast<int>(T.Ndf()[iVec]));
478 }
479 }
480}
481
482void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, const vector<int>& pidHypo)
483{
484
485 Initialize();
486
487 std::vector<CbmMvdHit> vMvdHits;
488 std::vector<CbmStsHit> vStsHits;
489
490 if (fMvdHitArray) {
491 for (int ih = 0; ih < fMvdHitArray->GetEntriesFast(); ih++) {
492 vMvdHits.push_back(*dynamic_cast<const CbmMvdHit*>(fMvdHitArray->At(ih)));
493 }
494 }
495
496 if (fStsHitArray) {
497 for (int ih = 0; ih < fStsHitArray->GetEntriesFast(); ih++) {
498 vStsHits.push_back(*dynamic_cast<const CbmStsHit*>(fStsHitArray->At(ih)));
499 }
500 }
501
502 Fit(Tracks, vMvdHits, vStsHits, pidHypo);
503}
504
505
506void CbmL1PFFitter::GetChiToVertex(vector<CbmStsTrack>& Tracks, vector<PFFieldRegion>& field, vector<float>& chiToVtx,
507 CbmKFVertex& primVtx, float chiPrim)
508{
509 // TODO: (!) replace CbmL1::Instance()->fpAlgo->GetParameters() with the cbm::ca::ParametersHandler::Instance()->Get()
510 // everywhere outside cbm::algo
511 const auto& rActSetup = CbmL1::Instance()->fpAlgo->GetParameters().GetActiveSetup();
512 Initialize();
513
514 chiToVtx.reserve(Tracks.size());
515
516 int nTracks_SIMD = fvec::size();
517
519 TrackParamV& T = fit.Tr(); // fitting parametr coresponding to current track
520
521 CbmStsTrack* tr[fvec::size()]{nullptr};
522
524
525 const auto& sta = rActSetup.GetActiveLayers();
526 fvec* zSta = new fvec[nStations];
527 for (int iSta = 0; iSta < nStations; iSta++) {
528 zSta[iSta] = sta[iSta].GetZref();
529 }
530
531 field.reserve(Tracks.size());
532
535
536 unsigned short N_vTracks = Tracks.size();
537 int ista;
538 for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvec::size()) {
539 if (N_vTracks - itrack < static_cast<unsigned short>(fvec::size())) {
540 nTracks_SIMD = N_vTracks - itrack;
541 }
542
543 fvec mass2;
544 for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
545 tr[iVec] = &Tracks[itrack + iVec]; // current track
546 T.X()[iVec] = tr[iVec]->GetParamFirst()->GetX();
547 T.Y()[iVec] = tr[iVec]->GetParamFirst()->GetY();
548 T.Tx()[iVec] = tr[iVec]->GetParamFirst()->GetTx();
549 T.Ty()[iVec] = tr[iVec]->GetParamFirst()->GetTy();
550 T.Qp()[iVec] = tr[iVec]->GetParamFirst()->GetQp();
551 T.Z()[iVec] = tr[iVec]->GetParamFirst()->GetZ();
552
553 for (int i = 0; i < 5; i++) {
554 for (int j = 0; j <= i; j++) {
555 T.C(i, j)[iVec] = tr[iVec]->GetParamFirst()->GetCovariance(i, j);
556 }
557 }
558
559 // float mass = TDatabasePDG::Instance()->GetParticle(tr[iVec]->GetPidHypo())->Mass();
560 const float mass = KFParticleDatabase::Instance()->GetMass(tr[iVec]->GetPidHypo());
561 mass2[iVec] = mass * mass;
562
563 int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
564 for (int iH = 0; iH < 2; iH++) {
565 float posx = 0.f, posy = 0.f;
566
567 if (iH < nHitsTrackMvd) {
568 if (!fMvdHitArray) {
569 continue;
570 }
571 int hitIndex = tr[iVec]->GetMvdHitIndex(iH);
572 const CbmMvdHit* hit = dynamic_cast<const CbmMvdHit*>(fMvdHitArray->At(hitIndex));
573
574 posx = hit->GetX();
575 posy = hit->GetY();
576 ista = GetMvdStationIndex(hit);
577 if (ista < 0) {
578 continue;
579 }
580 }
581 else {
582 if (!fStsHitArray) {
583 continue;
584 }
585 int hitIndex = tr[iVec]->GetStsHitIndex(iH - nHitsTrackMvd);
586 const CbmStsHit* hit = dynamic_cast<const CbmStsHit*>(fStsHitArray->At(hitIndex));
587
588 posx = hit->GetX();
589 posy = hit->GetY();
590 ista = GetStsStationIndex(hit);
591 if (ista < 0) {
592 continue;
593 }
594 }
595
596 fB_temp = rActSetup.GetField().GetFieldValue(ista, posx, posy);
597 fB[iH + 1].SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec],
598 fB_temp.GetZ()[iVec], iVec);
599 }
600 }
601
602 const auto& trg = rActSetup.GetTarget();
603 fB[0] = rActSetup.GetField().GetPrimVertexField().Get(trg.GetX(), trg.GetY(), trg.GetZ());
604 fld.Set(fB[2], fB[1], fB[0]);
605 for (int i = 0; i < nTracks_SIMD; i++) {
606 field.emplace_back(fld, i);
607 }
608
609 fit.Linearization().qp = fit.Tr().Qp();
610
611 for (int iSt = nStations - 4; iSt >= 0; iSt--) {
612 fit.SetMask(T.Z() > zSta[iSt] + fvec(2.5));
613 fit.Extrapolate(zSta[iSt], fld);
614 auto radThick = rActSetup.GetMaterial(iSt).GetThicknessX0(fit.Tr().X(), fit.Tr().Y());
615 fit.MultipleScattering(radThick);
617 }
618 fit.SetMask(fmask::One());
619 fit.Extrapolate(primVtx.GetRefZ(), fld);
620
621 // TODO: get it from parameters
622 constexpr float targetRadThick = 3.73e-2f * 2; // 250 mum Gold
623
624 fit.MultipleScattering(targetRadThick);
626
627 Double_t Cv[3] = {primVtx.GetCovMatrix()[0], primVtx.GetCovMatrix()[1], primVtx.GetCovMatrix()[2]};
628
629 fvec dx = T.X() - fvec(primVtx.GetRefX());
630 fvec dy = T.Y() - fvec(primVtx.GetRefY());
631 fvec c[3] = {T.C00(), T.C10(), T.C11()};
632 c[0] += fvec(Cv[0]);
633 c[1] += fvec(Cv[1]);
634 c[2] += fvec(Cv[2]);
635 fvec d = c[0] * c[2] - c[1] * c[1];
636 fvec chi = sqrt(kf::utils::fabs(fvec(0.5) * (dx * dx * c[0] - fvec(2.) * dx * dy * c[1] + dy * dy * c[2]) / d));
637 chi.setZero(kf::utils::fabs(d) < fvec(1.e-20));
638
639 for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
640 chiToVtx.push_back(chi[iVec]);
641 }
642
643 if (chiPrim > 0) {
644 for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
645 if (chi[iVec] < chiPrim) {
646 FairTrackParam par;
647 par.SetX(T.X()[iVec]);
648 par.SetY(T.Y()[iVec]);
649 par.SetTx(T.Tx()[iVec]);
650 par.SetTy(T.Ty()[iVec]);
651 par.SetQp(T.Qp()[iVec]);
652 par.SetZ(T.Z()[iVec]);
653
654 for (int i = 0; i < 5; i++) {
655 for (int j = 0; j <= i; j++) {
656 par.SetCovariance(i, j, T.C(i, j)[iVec]);
657 }
658 }
659
660 tr[iVec]->SetParamFirst(&par);
661 }
662 }
663 }
664 }
665 delete[] zSta;
666}
667
668void CbmL1PFFitter::CalculateFieldRegion(vector<CbmStsTrack>& Tracks, vector<PFFieldRegion>& field)
669{
670 Initialize();
671
672 field.reserve(Tracks.size());
673
675
676 int nTracks_SIMD = fvec::size();
677 TrackParamV T; // fitting parametr coresponding to current track
678
679 CbmStsTrack* tr[fvec::size()];
680
681 int ista = 0;
682 const auto& rActSetup = CbmL1::Instance()->fpAlgo->GetParameters().GetActiveSetup();
684
685 unsigned short N_vTracks = Tracks.size();
686
687 for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvec::size()) {
688 if (N_vTracks - itrack < static_cast<unsigned short>(fvec::size())) {
689 nTracks_SIMD = N_vTracks - itrack;
690 }
691
692 for (int i = 0; i < nTracks_SIMD; i++) {
693 tr[i] = &Tracks[itrack + i]; // current track
694 }
695
696 for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
697 int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
698 for (int iH = 0; iH < 2; iH++) {
699 float posx = 0.f, posy = 0.f;
700
701 if (iH < nHitsTrackMvd) {
702 if (!fMvdHitArray) {
703 continue;
704 }
705 int hitIndex = tr[iVec]->GetMvdHitIndex(iH);
706 const CbmMvdHit* hit = dynamic_cast<const CbmMvdHit*>(fMvdHitArray->At(hitIndex));
707
708 posx = hit->GetX();
709 posy = hit->GetY();
710 ista = GetMvdStationIndex(hit);
711 if (ista < 0) {
712 continue;
713 }
714 }
715 else {
716 if (!fStsHitArray) {
717 continue;
718 }
719 int hitIndex = tr[iVec]->GetStsHitIndex(iH - nHitsTrackMvd);
720 const CbmStsHit* hit = dynamic_cast<const CbmStsHit*>(fStsHitArray->At(hitIndex));
721
722 posx = hit->GetX();
723 posy = hit->GetY();
724 ista = GetStsStationIndex(hit);
725 if (ista < 0) {
726 continue;
727 }
728 }
729
730 fB_temp = rActSetup.GetField().GetFieldValue(ista, posx, posy);
731 fB[iH + 1].SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec],
732 fB_temp.GetZ()[iVec], iVec);
733 }
734 }
735
736 const auto& trg = rActSetup.GetTarget();
737 fB[0] = rActSetup.GetField().GetPrimVertexField().Get(trg.GetX(), trg.GetY(), trg.GetZ());
738 fld.Set(fB[2], fB[1], fB[0]);
739 for (int i = 0; i < nTracks_SIMD; i++) {
740 field.emplace_back(fld, i);
741 }
742 }
743}
744
745void CbmL1PFFitter::CalculateFieldRegionAtLastPoint(vector<CbmStsTrack>& Tracks, vector<PFFieldRegion>& field)
746{
747 Initialize();
748
749 field.reserve(Tracks.size());
750
752
753 int nTracks_SIMD = fvec::size();
754 TrackParamV T; // fitting parametr coresponding to current track
755
756 CbmStsTrack* tr[fvec::size()];
757
758 int ista = 0;
759 const auto& rActSetup = CbmL1::Instance()->fpAlgo->GetParameters().GetActiveSetup();
761 fvec zField[3];
762
763 unsigned short N_vTracks = Tracks.size();
764
765 for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvec::size()) {
766 if (N_vTracks - itrack < static_cast<unsigned short>(fvec::size())) {
767 nTracks_SIMD = N_vTracks - itrack;
768 }
769
770 for (int i = 0; i < nTracks_SIMD; i++) {
771 tr[i] = &Tracks[itrack + i]; // current track
772 }
773
774 for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
775 int nHitsTrackMvd = tr[iVec]->GetNofMvdHits();
776 int nHits = tr[iVec]->GetTotalNofHits();
777 for (int iH = 0; iH < 3; iH++) {
778 float posx = 0.f, posy = 0.f, posz = 0.f;
779
780 int hitNumber = nHits - iH - 1;
781 if (hitNumber < nHitsTrackMvd) {
782 if (!fMvdHitArray) {
783 continue;
784 }
785 int hitIndex = tr[iVec]->GetMvdHitIndex(hitNumber);
786 const CbmMvdHit* hit = dynamic_cast<const CbmMvdHit*>(fMvdHitArray->At(hitIndex));
787
788 posx = hit->GetX();
789 posy = hit->GetY();
790 posz = hit->GetZ();
791 ista = GetMvdStationIndex(hit);
792 if (ista < 0) {
793 continue;
794 }
795 }
796 else {
797 if (!fStsHitArray) {
798 continue;
799 }
800 int hitIndex = tr[iVec]->GetStsHitIndex(hitNumber - nHitsTrackMvd);
801 const CbmStsHit* hit = dynamic_cast<const CbmStsHit*>(fStsHitArray->At(hitIndex));
802
803 posx = hit->GetX();
804 posy = hit->GetY();
805 posz = hit->GetZ();
806 ista = GetStsStationIndex(hit);
807 if (ista < 0) {
808 continue;
809 }
810 }
811
812 fB_temp = rActSetup.GetField().GetFieldValue(ista, posx, posy);
813
814 fB[iH].SetSimdEntry(fB_temp.GetBx()[iVec], fB_temp.GetBy()[iVec], fB_temp.GetBz()[iVec], fB_temp.GetZ()[iVec],
815 iVec);
816 zField[iH][iVec] = posz;
817 }
818 }
819
820 fld.Set(fB[0], fB[1], fB[2]);
821 for (int i = 0; i < nTracks_SIMD; i++) {
822 field.emplace_back(fld, i);
823 }
824 }
825}
void FilterFirst(kf::TrackKalmanFilter< fvec > &fit, kf::MeasurementXy< fvec > &mxy, fvec &t, fvec &dt2)
Data class for a reconstructed hit in the STS.
Data class for STS tracks.
Magnetic flux density interpolation along the track vs. z-coordinate (header)
#define _fvecalignment
friend fvec sqrt(const fvec &a)
Tracking Field class (header)
Track fit utilities for the CA tracking based on the Kalman filter.
double GetTimeError() const
Definition CbmHit.h:80
double GetTime() const
Definition CbmHit.h:79
int32_t GetAddress() const
Definition CbmHit.h:77
double GetZ() const
Definition CbmHit.h:74
Double_t & GetRefZ()
Definition CbmKFVertex.h:27
Double_t & GetRefX()
Definition CbmKFVertex.h:25
Double_t * GetCovMatrix()
Definition CbmKFVertex.h:28
Double_t & GetRefY()
Definition CbmKFVertex.h:26
int GetMvdStationIndex(const CbmMvdHit *h)
TClonesArray * fStsHitArray
TClonesArray * fMvdHitArray
void GetChiToVertex(std::vector< CbmStsTrack > &Tracks, std::vector< PFFieldRegion > &field, std::vector< float > &chiToVtx, CbmKFVertex &primVtx, float chiPrim=-1)
void Fit(std::vector< CbmStsTrack > &Tracks, const std::vector< CbmMvdHit > &vMvdHits, const std::vector< CbmStsHit > &vStsHits, const std::vector< int > &pidHypo)
int GetStsStationIndex(const CbmStsHit *h)
void CalculateFieldRegion(std::vector< CbmStsTrack > &Tracks, std::vector< PFFieldRegion > &Field)
void CalculateFieldRegionAtLastPoint(std::vector< CbmStsTrack > &Tracks, std::vector< PFFieldRegion > &field)
static CbmL1 * Instance()
Pointer to CbmL1 instance.
Definition CbmL1.h:166
ca::Framework * fpAlgo
Pointer to the L1 track finder algorithm.
Definition CbmL1.h:418
virtual int32_t GetStationNr() const
Definition CbmMvdHit.h:64
double GetDy() const
Definition CbmPixelHit.h:76
double GetDx() const
Definition CbmPixelHit.h:75
double GetY() const
Definition CbmPixelHit.h:74
double GetX() const
Definition CbmPixelHit.h:73
double GetDxy() const
Definition CbmPixelHit.h:77
data class for a reconstructed 3-d hit in the STS
Definition CbmStsHit.h:35
static CbmStsSetup * Instance()
int32_t GetNofMvdHits() const
Definition CbmStsTrack.h:87
int32_t GetMvdHitIndex(int32_t iHit) const
Definition CbmStsTrack.h:75
int32_t GetStsHitIndex(int32_t iHit) const
virtual int32_t GetTotalNofHits() const
Definition CbmStsTrack.h:81
const Parameters< fvec > & GetParameters() const
Gets a pointer to the Framework parameters object.
Definition CaFramework.h:87
Magnetic field region, corresponding to a hit triplet.
void Set(const FieldValue< T > &b0, const FieldValue< T > &b1, const FieldValue< T > &b2)
Interpolates the field by three nodal points with the second order polynomial.
ConcreteFieldRegion_t< FieldMode > * GetConcrete()
Gets a pointer to the concrete field instance (mutable access)
Magnetic flux density vector.
void Set(const I &bx, const I &by, const I &bz, const I &z)
Constructor from components.
void SetSimdEntries(const FieldValue &other, const kf::utils::masktype< T > &mask)
Combines the current magnetic field value with another one using a mask.
std::tuple< T, T, T > Get() const
Gets magnetic flux density x, y, z-components [kG].
void SetSimdEntry(double bx, double by, double bz, double z, size_t i)
Sets magnetic flux density components to the field function.
The class describes a 2D - measurement (x, y) in XY coordinate system.
void FilterTime(DataT t, DataT dt2, const DataTmask &m)
filter the track with the time measurement
void EnergyLossCorrection(DataT radThick, FitDirection direction)
void Extrapolate(DataT z, const kf::FieldRegion< DataT > &F)
void MultipleScattering(DataT radThick, DataT tx0, DataT ty0, DataT qp0)
apply multiple scattering correction to the track with the given Qp0
void SetParticleMass(DataT mass)
set particle mass for the fit
kf::TrackParam< DataT > & Tr()
void FilterXY(const kf::MeasurementXy< DataT > &m, bool skipUnmeasuredCoordinates=false)
filter the track with the XY measurement
T X() const
Gets x position [cm].
T Y() const
Gets y position [cm].
T Qp() const
Gets charge over momentum [ec/GeV].
static fmask Zero()
static fmask One()
static constexpr size_t size()
void setZero(fmask m)
const fvec c_light(0.000299792458)
TODO: SZh 8.11.2022: add selection of parameterisation.
Definition CaBranch.h:14
kf::fmask fmask
Definition CaSimd.h:15
EDetectorID
Enumeration for the tracking detector subsystems in CBM-CA.
Definition CbmDefs.h:216
kf::fvec fvec
Definition CaSimd.h:13
fvec fabs(const fvec &v)
Definition KfUtils.h:30
@ Interpolated
Interpolated magnetic field.
Definition KfDefs.h:109
TrackParam< double > TrackParamD
TrackParam< fvec > TrackParamV
void SetOriginalCbmField()
pass the original magnetic field to L1Algo
Hash for CbmL1LinkKey.
void getL1FieldRegion(cbm::algo::kf::FieldRegion< cbm::algo::kf::fvec > &, int i)
void setFromL1FieldRegion(const cbm::algo::kf::FieldRegion< cbm::algo::kf::fvec > &, int i)