34 mTrackFitter = std::make_unique<o2::mft::TrackFitter<T>>();
43 mTrackFitter->setBz(bz);
51 bool firstTracker = trackerID == 0;
52 mTrackerID = trackerID;
56 mTrackFitter->setVerbosity(trkParam.
verbose);
61 mTrackFitter->setTrackModel(trkParam.
trackmodel);
65 LOG(info) <<
"Configurable tracker parameters:";
66 switch (mTrackFitter->getTrackModel()) {
68 LOG(info) <<
"Fwd track model = Helix";
71 LOG(info) <<
"Fwd track model = Quadratic";
74 LOG(info) <<
"Fwd track model = Linear";
77 LOG(info) <<
"Fwd track model = Optimized";
81 LOG(info) <<
"MinTrackPointsLTF = " << mMinTrackPointsLTF;
82 LOG(info) <<
"MinTrackPointsCA = " << mMinTrackPointsCA;
83 LOG(info) <<
"MinTrackStationsLTF = " << mMinTrackStationsLTF;
84 LOG(info) <<
"MinTrackStationsCA = " << mMinTrackStationsCA;
85 LOG(info) <<
"LTFConeRadius = " << (trkParam.
LTFConeRadius ?
"true" :
"false");
86 LOG(info) <<
"CAConeRadius = " << (trkParam.
CAConeRadius ?
"true" :
"false");
87 LOG(info) <<
"LTFclsRCut = " << mLTFclsRCut;
88 LOG(info) <<
"ROADclsRCut = " << mROADclsRCut;
89 LOG(info) <<
"RBins = " << mRBins;
90 LOG(info) <<
"PhiBins = " << mPhiBins;
91 LOG(info) <<
"ZVtxMin = " << mZVtxMin;
92 LOG(info) <<
"ZVtxMax = " << mZVtxMax;
93 LOG(info) <<
"RCutAtZmin = " << mRCutAtZmin;
95 LOG(info) <<
"TrueTrackMCThreshold = " << mTrueTrackMCThreshold;
100 LOG(info) <<
"irFramesOnly = " << (trkParam.
irFramesOnly ?
"true" :
"false");
115 static bool staticInitDone =
false;
120 if (staticInitDone) {
123 staticInitDone =
true;
132 mInversePhiBinSize = 1.0 / mPhiBinSize;
134 mInverseRBinSize[
layer] = 1.0 / mRBinSize[
layer];
138 Float_t NconicalBins = 2.0 * deltaZ * mRCutAtZmin / (abs(ZL0) + mZVtxMin) / binArcLenght;
139 mPhiBinWin[
layer] = std::max(3,
int(ceil(NconicalBins)));
143 if (mFullClusterScan) {
149 Float_t dz,
x,
y,
r, phi, x_proj, y_proj, r_proj, phi_proj, zLayer1, zLayer2;
150 Int_t binIndex1, binIndex2, binIndex2S, binR_proj, binPhi_proj;
155 for (Int_t iRBin = 0; iRBin < mRBins; ++iRBin) {
156 bool isFirstPhiBin =
true;
160 for (Int_t iPhiBin = 0; iPhiBin < mPhiBins; ++iPhiBin) {
161 isFirstPhiBin = !iPhiBin;
165 binIndex1 = getBinIndex(iRBin, iPhiBin);
167 x =
r * TMath::Cos(phi);
168 y =
r * TMath::Sin(phi);
173 dz = zLayer2 - zLayer1;
177 r_proj = clsPoint2D.R();
178 phi_proj = clsPoint2D.Phi();
181 binR_proj = getRBinIndex(r_proj, layer2);
182 binPhi_proj = getPhiBinIndex(phi_proj);
184 int binwPhiS = mPhiBinWin[layer2];
185 int binhwPhiS = binwPhiS / 2;
187 float rMin =
r * (mZVtxMax + abs(zLayer2)) / (mZVtxMax + abs(zLayer1));
188 float rMax =
r * (abs(zLayer2) + mZVtxMin) / (abs(zLayer1) + mZVtxMin);
190 int rBinMin = getRBinIndex(rMin, layer2);
191 int rBinMax = getRBinIndex(rMax, layer2);
192 if (rBinMin == binR_proj) {
195 if (rBinMax == binR_proj) {
198 rBinMin = TMath::Range(0, mRBins - 1, rBinMin);
199 rBinMax = TMath::Range(0, mRBins - 1, rBinMax);
201 LOG(
debug) <<
"Layer1 = " << layer1 <<
" Layer2 = " << layer2 <<
" iRBin = " << iRBin <<
" r = " <<
r <<
" r_proj = " << r_proj <<
" rBinMin = " << rBinMin <<
" rBinMax = " << rBinMax;
203 for (Int_t binR = rBinMin; binR <= rBinMax; ++binR) {
205 for (Int_t iPhi = 0; iPhi < binwPhiS; ++iPhi) {
206 int binPhiS = binPhi_proj + (iPhi - binhwPhiS);
211 binIndex2S = getBinIndex(binR, binPhiS);
212 (*mBinsS.get())[layer1][layer2 - 1][binIndex1].emplace_back(binIndex2S);
216 int binwPhi = mPhiBinWin[layer2];
217 int binhwPhi = binwPhi / 2;
219 for (Int_t binR = rBinMin; binR <= rBinMax; ++binR) {
221 for (Int_t iPhi = 0; iPhi < binwPhi; ++iPhi) {
222 int binPhi = binPhi_proj + (iPhi - binhwPhi);
227 binIndex2 = getBinIndex(binR, binPhi);
228 (*mBins.get())[layer1][layer2 - 1][binIndex1].emplace_back(binIndex2);
242 if (!mFullClusterScan) {
243 findTracksLTF(
event);
245 findTracksLTFfcs(
event);
253 if (!mFullClusterScan) {
256 findTracksCAfcs(
event);
267 Int_t layer1, layer2, nPointDisks;
268 Int_t binR_proj, binPhi_proj, bin;
269 Int_t binIndex, clsMinIndex, clsMaxIndex, clsMinIndexS, clsMaxIndexS;
273 Float_t dR2, dR2min, dR2cut = mLTFclsR2Cut;
276 Int_t clsInLayer1, clsInLayer2, clsInLayer;
289 if (layer2 < layer1 + (mMinTrackPointsLTF - 1)) {
298 for (std::vector<Cluster>::iterator it1 =
event.getClustersInLayer(layer1).begin(); it1 !=
event.getClustersInLayer(layer1).end(); ++it1) {
300 if (cluster1.getUsed()) {
303 clsInLayer1 = it1 -
event.getClustersInLayer(layer1).begin();
306 for (
const auto& binS : (*mBinsS.
get())[layer1][layer2 - 1][cluster1.indexTableBin]) {
308 getBinClusterRange(
event, layer2, binS, clsMinIndexS, clsMaxIndexS);
310 for (std::vector<Cluster>::iterator it2 = (
event.getClustersInLayer(layer2).begin() + clsMinIndexS); it2 != (
event.getClustersInLayer(layer2).begin() + clsMaxIndexS + 1); ++it2) {
312 if (cluster2.getUsed()) {
315 clsInLayer2 = it2 -
event.getClustersInLayer(layer2).begin();
321 trackPoints[nPoints].layer = layer1;
322 trackPoints[nPoints].idInLayer = clsInLayer1;
335 dR2min = mLTFConeRadius ? dR2cut * dRCone * dRCone : dR2cut;
336 for (
const auto& bin : (*mBins.
get())[layer1][
layer - 1][cluster1.indexTableBin]) {
338 getBinClusterRange(
event,
layer, bin, clsMinIndex, clsMaxIndex);
340 for (std::vector<Cluster>::iterator it = (
event.getClustersInLayer(
layer).begin() + clsMinIndex); it != (
event.getClustersInLayer(
layer).begin() + clsMaxIndex + 1); ++it) {
342 if (cluster.getUsed()) {
345 clsInLayer = it -
event.getClustersInLayer(
layer).begin();
347 dR2 = getDistanceToSeed(cluster1, cluster2, cluster);
355 trackPoints[nPoints].layer =
layer;
356 trackPoints[nPoints].idInLayer = clsInLayer;
366 trackPoints[nPoints].layer = layer2;
367 trackPoints[nPoints].idInLayer = clsInLayer2;
371 if (nPoints < mMinTrackPointsLTF) {
377 for (Int_t point = 0; point < nPoints; ++point) {
378 auto layer = trackPoints[point].layer;
379 hasDisk[
layer / 2] = kTRUE;
387 if (nPointDisks < mMinTrackStationsLTF) {
393 for (Int_t point = 0; point < nPoints; ++point) {
394 auto layer = trackPoints[point].layer;
395 auto clsInLayer = trackPoints[point].idInLayer;
396 Cluster& cluster =
event.getClustersInLayer(
layer)[clsInLayer];
397 mcCompLabel = mUseMC ?
event.getClusterLabels(
layer, cluster.clusterId) : MCCompLabel();
398 extClsIndex =
event.getClusterExternalIndex(
layer, cluster.clusterId);
399 clsSize =
event.getClusterSize(
layer, cluster.clusterId);
400 event.getCurrentTrack().setPoint(cluster,
layer, clsInLayer, mcCompLabel, extClsIndex, clsSize);
402 cluster.setUsed(
true);
413void Tracker<T>::findTracksLTFfcs(ROframe<T>&
event)
418 MCCompLabel mcCompLabel;
419 Int_t layer1, layer2, nPointDisks;
420 Int_t binR_proj, binPhi_proj, bin;
421 Int_t binIndex, clsMinIndex, clsMaxIndex, clsMinIndexS, clsMaxIndexS;
424 Float_t dR2, dR2min, dR2cut = mLTFclsR2Cut;
427 Int_t clsInLayer1, clsInLayer2, clsInLayer;
440 if (layer2 < layer1 + (mMinTrackPointsLTF - 1)) {
449 for (std::vector<Cluster>::iterator it1 =
event.getClustersInLayer(layer1).begin(); it1 !=
event.getClustersInLayer(layer1).end(); ++it1) {
451 if (cluster1.getUsed()) {
454 clsInLayer1 = it1 -
event.getClustersInLayer(layer1).begin();
456 for (std::vector<Cluster>::iterator it2 =
event.getClustersInLayer(layer2).begin(); it2 !=
event.getClustersInLayer(layer2).end(); ++it2) {
458 if (cluster2.getUsed()) {
461 clsInLayer2 = it2 -
event.getClustersInLayer(layer2).begin();
467 trackPoints[nPoints].layer = layer1;
468 trackPoints[nPoints].idInLayer = clsInLayer1;
478 for (std::vector<Cluster>::iterator it =
event.getClustersInLayer(
layer).begin(); it !=
event.getClustersInLayer(
layer).end(); ++it) {
480 if (cluster.getUsed()) {
483 clsInLayer = it -
event.getClustersInLayer(
layer).begin();
485 dR2 = getDistanceToSeed(cluster1, cluster2, cluster);
493 trackPoints[nPoints].layer =
layer;
494 trackPoints[nPoints].idInLayer = clsInLayer;
503 trackPoints[nPoints].layer = layer2;
504 trackPoints[nPoints].idInLayer = clsInLayer2;
508 if (nPoints < mMinTrackPointsLTF) {
514 for (Int_t point = 0; point < nPoints; ++point) {
515 auto layer = trackPoints[point].layer;
516 hasDisk[
layer / 2] = kTRUE;
524 if (nPointDisks < mMinTrackStationsLTF) {
530 for (Int_t point = 0; point < nPoints; ++point) {
531 auto layer = trackPoints[point].layer;
532 auto clsInLayer = trackPoints[point].idInLayer;
533 Cluster& cluster =
event.getClustersInLayer(
layer)[clsInLayer];
534 mcCompLabel = mUseMC ?
event.getClusterLabels(
layer, cluster.clusterId) : MCCompLabel();
535 extClsIndex =
event.getClusterExternalIndex(
layer, cluster.clusterId);
536 clsSize =
event.getClusterSize(
layer, cluster.clusterId);
537 event.getCurrentTrack().setPoint(cluster,
layer, clsInLayer, mcCompLabel, extClsIndex, clsSize);
539 cluster.setUsed(
true);
549void Tracker<T>::findTracksCA(ROframe<T>&
event)
557 Int_t layer1Min = 0, layer1Max = 3;
558 Int_t layer2Min[4] = {6, 6, 8, 8};
561 MCCompLabel mcCompLabel;
562 Int_t roadId, nPointDisks;
563 Int_t binR_proj, binPhi_proj, bin;
564 Int_t binIndex, clsMinIndex, clsMaxIndex, clsMinIndexS, clsMaxIndexS;
566 Float_t dR2, dR2min, dR2cut = mROADclsR2Cut;
569 Int_t clsInLayer1, clsInLayer2, clsInLayer;
572 std::vector<TrackElement> roadPoints;
576 for (Int_t layer1 = layer1Min; layer1 <= layer1Max; ++layer1) {
578 for (Int_t layer2 = layer2Max; layer2 >= layer2Min[layer1]; --layer2) {
580 for (std::vector<Cluster>::iterator it1 =
event.getClustersInLayer(layer1).begin(); it1 !=
event.getClustersInLayer(layer1).end(); ++it1) {
582 if (cluster1.getUsed()) {
585 clsInLayer1 = it1 -
event.getClustersInLayer(layer1).begin();
588 for (
const auto& binS : (*mBinsS.
get())[layer1][layer2 - 1][cluster1.indexTableBin]) {
590 getBinClusterRange(
event, layer2, binS, clsMinIndexS, clsMaxIndexS);
592 for (std::vector<Cluster>::iterator it2 = (
event.getClustersInLayer(layer2).begin() + clsMinIndexS); it2 != (
event.getClustersInLayer(layer2).begin() + clsMaxIndexS + 1); ++it2) {
594 if (cluster2.getUsed()) {
597 clsInLayer2 = it2 -
event.getClustersInLayer(layer2).begin();
603 roadPoints.emplace_back(layer1, clsInLayer1);
611 dR2min = mLTFConeRadius ? dR2cut * dRCone * dRCone : dR2cut;
614 for (
const auto& bin : (*mBins.
get())[layer1][
layer - 1][cluster1.indexTableBin]) {
616 getBinClusterRange(
event,
layer, bin, clsMinIndex, clsMaxIndex);
618 for (std::vector<Cluster>::iterator it = (
event.getClustersInLayer(
layer).begin() + clsMinIndex); it != (
event.getClustersInLayer(
layer).begin() + clsMaxIndex + 1); ++it) {
620 if (cluster.getUsed()) {
623 clsInLayer = it -
event.getClustersInLayer(
layer).begin();
625 dR2 = getDistanceToSeed(cluster1, cluster2, cluster);
631 roadPoints.emplace_back(
layer, clsInLayer);
638 roadPoints.emplace_back(layer2, clsInLayer2);
639 nPoints = roadPoints.size();
642 if (nPoints < mMinTrackPointsCA) {
648 for (Int_t point = 0; point < nPoints; ++point) {
649 auto layer = roadPoints[point].layer;
650 hasDisk[
layer / 2] = kTRUE;
658 if (nPointDisks < mMinTrackStationsCA) {
663 for (Int_t point = 0; point < nPoints; ++point) {
664 auto layer = roadPoints[point].layer;
665 auto clsInLayer = roadPoints[point].idInLayer;
666 mRoad.setPoint(
layer, clsInLayer);
668 mRoad.setRoadId(roadId);
671 computeCellsInRoad(
event);
673 runBackwardInRoad(
event);
684void Tracker<T>::findTracksCAfcs(ROframe<T>&
event)
692 Int_t layer1Min = 0, layer1Max = 3;
693 Int_t layer2Min[4] = {6, 6, 8, 8};
696 MCCompLabel mcCompLabel;
697 Int_t roadId, nPointDisks;
698 Int_t binR_proj, binPhi_proj, bin;
699 Int_t binIndex, clsMinIndex, clsMaxIndex, clsMinIndexS, clsMaxIndexS;
700 Float_t dR2, dR2cut = mROADclsR2Cut;
703 Int_t clsInLayer1, clsInLayer2, clsInLayer;
706 std::vector<TrackElement> roadPoints;
710 for (Int_t layer1 = layer1Min; layer1 <= layer1Max; ++layer1) {
712 for (Int_t layer2 = layer2Max; layer2 >= layer2Min[layer1]; --layer2) {
714 for (std::vector<Cluster>::iterator it1 =
event.getClustersInLayer(layer1).begin(); it1 !=
event.getClustersInLayer(layer1).end(); ++it1) {
716 if (cluster1.getUsed()) {
719 clsInLayer1 = it1 -
event.getClustersInLayer(layer1).begin();
721 for (std::vector<Cluster>::iterator it2 =
event.getClustersInLayer(layer2).begin(); it2 !=
event.getClustersInLayer(layer2).end(); ++it2) {
723 if (cluster2.getUsed()) {
726 clsInLayer2 = it2 -
event.getClustersInLayer(layer2).begin();
732 roadPoints.emplace_back(layer1, clsInLayer1);
736 for (std::vector<Cluster>::iterator it =
event.getClustersInLayer(
layer).begin(); it !=
event.getClustersInLayer(
layer).end(); ++it) {
738 if (cluster.getUsed()) {
741 clsInLayer = it -
event.getClustersInLayer(
layer).begin();
743 dR2 = getDistanceToSeed(cluster1, cluster2, cluster);
749 roadPoints.emplace_back(
layer, clsInLayer);
755 roadPoints.emplace_back(layer2, clsInLayer2);
756 nPoints = roadPoints.size();
759 if (nPoints < mMinTrackPointsCA) {
765 for (Int_t point = 0; point < nPoints; ++point) {
766 auto layer = roadPoints[point].layer;
767 hasDisk[
layer / 2] = kTRUE;
775 if (nPointDisks < mMinTrackStationsCA) {
780 for (Int_t point = 0; point < nPoints; ++point) {
781 auto layer = roadPoints[point].layer;
782 auto clsInLayer = roadPoints[point].idInLayer;
783 mRoad.setPoint(
layer, clsInLayer);
785 mRoad.setRoadId(roadId);
788 computeCellsInRoad(
event);
790 runBackwardInRoad(
event);
800void Tracker<T>::computeCellsInRoad(ROframe<T>&
event)
802 Int_t layer1, layer1min, layer1max, layer2, layer2min, layer2max;
803 Int_t nPtsInLayer1, nPtsInLayer2;
804 Int_t clsInLayer1, clsInLayer2;
808 mRoad.getLength(layer1min, layer1max);
811 for (layer1 = layer1min; layer1 <= layer1max; ++layer1) {
815 layer2min = layer1 + 1;
818 nPtsInLayer1 = mRoad.getNPointsInLayer(layer1);
820 for (Int_t point1 = 0; point1 < nPtsInLayer1; ++point1) {
822 clsInLayer1 = mRoad.getClustersIdInLayer(layer1)[point1];
827 while (noCell && (layer2 <= layer2max)) {
829 nPtsInLayer2 = mRoad.getNPointsInLayer(layer2);
835 for (Int_t point2 = 0; point2 < nPtsInLayer2; ++point2) {
837 clsInLayer2 = mRoad.getClustersIdInLayer(layer2)[point2];
841 addCellToCurrentRoad(
event, layer1, layer2, clsInLayer1, clsInLayer2, cellId);
852void Tracker<T>::runForwardInRoad()
854 Int_t layerR, layerL, icellR, icellL;
856 Bool_t levelChange = kTRUE;
858 while (levelChange) {
860 levelChange = kFALSE;
866 for (icellL = 0; icellL < mRoad.getCellsInLayer(layerL).size(); ++icellL) {
868 Cell& cellL = mRoad.getCellsInLayer(layerL)[icellL];
870 layerR = cellL.getSecondLayerId();
876 for (icellR = 0; icellR < mRoad.getCellsInLayer(layerR).size(); ++icellR) {
878 Cell& cellR = mRoad.getCellsInLayer(layerR)[icellR];
880 if ((cellL.getLevel() == cellR.getLevel()) && getCellsConnect(cellL, cellR)) {
882 mRoad.addRightNeighbourToCell(layerL, icellL, layerR, icellR);
883 mRoad.addLeftNeighbourToCell(layerR, icellR, layerL, icellL);
885 mRoad.incrementCellLevel(layerR, icellR);
893 updateCellStatusInRoad();
900void Tracker<T>::runBackwardInRoad(ROframe<T>&
event)
902 if (mMaxCellLevel == 1) {
908 Int_t lastCellLayer, lastCellId, icell;
909 Int_t cellId, layerC, cellIdC, layerRC, cellIdRC, layerL, cellIdL;
911 Float_t deviationPrev, deviation;
921 for (cellId = 0; cellId < mRoad.getCellsInLayer(
layer).
size(); ++cellId) {
923 if (mRoad.isCellUsed(
layer, cellId) || (mRoad.getCellLevel(
layer, cellId) < (mMinTrackPointsCA - 1))) {
930 trackCells[nCells].layer =
layer;
931 trackCells[nCells].idInLayer = cellId;
935 addCellToNewTrack = kTRUE;
936 while (addCellToNewTrack) {
938 layerRC = trackCells[nCells - 1].layer;
939 cellIdRC = trackCells[nCells - 1].idInLayer;
941 const Cell& cellRC = mRoad.getCellsInLayer(layerRC)[cellIdRC];
943 addCellToNewTrack = kFALSE;
948 for (Int_t iLN = 0; iLN < cellRC.getNLeftNeighbours(); ++iLN) {
950 const auto& leftNeighbour = cellRC.getLeftNeighbours()[iLN];
951 layerL = leftNeighbour.first;
952 cellIdL = leftNeighbour.second;
954 const Cell& cellL = mRoad.getCellsInLayer(layerL)[cellIdL];
956 if (mRoad.isCellUsed(layerL, cellIdL) || (mRoad.getCellLevel(layerL, cellIdL) != (mRoad.getCellLevel(layerRC, cellIdRC) - 1))) {
960 deviation = getCellDeviation(cellL, cellRC);
962 if (deviation < deviationPrev) {
964 deviationPrev = deviation;
971 trackCells[nCells].layer = layerL;
972 trackCells[nCells].idInLayer = cellIdL;
975 addCellToNewTrack = kTRUE;
986 layerC = trackCells[0].layer;
987 cellIdC = trackCells[0].idInLayer;
988 const Cell& cellC = mRoad.getCellsInLayer(layerC)[cellIdC];
989 hasDisk[cellC.getSecondLayerId() / 2] = kTRUE;
990 for (icell = 0; icell < nCells; ++icell) {
991 layerC = trackCells[icell].layer;
992 cellIdC = trackCells[icell].idInLayer;
993 hasDisk[layerC / 2] = kTRUE;
1003 if (nPointDisks < mMinTrackStationsCA) {
1008 event.addTrack(
true);
1009 for (icell = 0; icell < nCells; ++icell) {
1010 layerC = trackCells[icell].layer;
1011 cellIdC = trackCells[icell].idInLayer;
1012 addCellToCurrentTrackCA(layerC, cellIdC,
event);
1013 mRoad.setCellUsed(layerC, cellIdC, kTRUE);
1015 const Cell& cellC = mRoad.getCellsInLayer(layerC)[cellIdC];
1016 event.getClustersInLayer(cellC.getFirstLayerId())[cellC.getFirstClusterIndex()].setUsed(
true);
1017 event.getClustersInLayer(cellC.getSecondLayerId())[cellC.getSecondClusterIndex()].setUsed(
true);
1019 event.getCurrentTrack().sort();
1025template <
typename T>
1026void Tracker<T>::updateCellStatusInRoad()
1028 Int_t layerMin, layerMax;
1029 mRoad.getLength(layerMin, layerMax);
1031 for (Int_t icell = 0; icell < mRoad.getCellsInLayer(
layer).
size(); ++icell) {
1032 mRoad.updateCellLevel(
layer, icell);
1033 mMaxCellLevel = std::max(mMaxCellLevel, mRoad.getCellLevel(
layer, icell));
1039template <
typename T>
1040void Tracker<T>::addCellToCurrentRoad(ROframe<T>&
event,
const Int_t layer1,
const Int_t layer2,
const Int_t clsInLayer1,
const Int_t clsInLayer2, Int_t& cellId)
1042 Cell& cell = mRoad.addCellInLayer(layer1, layer2, clsInLayer1, clsInLayer2, cellId);
1044 Cluster& cluster1 =
event.getClustersInLayer(layer1)[clsInLayer1];
1045 Cluster& cluster2 =
event.getClustersInLayer(layer2)[clsInLayer2];
1048 coord[0] = cluster1.getX();
1049 coord[1] = cluster1.getY();
1050 coord[2] = cluster1.getZ();
1051 coord[3] = cluster2.getX();
1052 coord[4] = cluster2.getY();
1053 coord[5] = cluster2.getZ();
1055 cell.setCoordinates(
coord);
1060template <
typename T>
1061void Tracker<T>::addCellToCurrentTrackCA(
const Int_t layer1,
const Int_t cellId, ROframe<T>&
event)
1063 auto& trackCA =
event.getCurrentTrack();
1064 const Cell& cell = mRoad.getCellsInLayer(layer1)[cellId];
1065 const Int_t layer2 = cell.getSecondLayerId();
1066 const Int_t clsInLayer1 = cell.getFirstClusterIndex();
1067 const Int_t clsInLayer2 = cell.getSecondClusterIndex();
1069 Cluster& cluster1 =
event.getClustersInLayer(layer1)[clsInLayer1];
1070 Cluster& cluster2 =
event.getClustersInLayer(layer2)[clsInLayer2];
1072 MCCompLabel mcCompLabel1 = mUseMC ?
event.getClusterLabels(layer1, cluster1.clusterId) : MCCompLabel();
1073 MCCompLabel mcCompLabel2 = mUseMC ?
event.getClusterLabels(layer2, cluster2.clusterId) : MCCompLabel();
1078 if (trackCA.getNumberOfPoints() == 0) {
1079 extClsIndex =
event.getClusterExternalIndex(layer2, cluster2.clusterId);
1080 clsSize =
event.getClusterSize(layer2, cluster2.clusterId);
1081 trackCA.setPoint(cluster2, layer2, clsInLayer2, mcCompLabel2, extClsIndex, clsSize);
1084 extClsIndex =
event.getClusterExternalIndex(layer1, cluster1.clusterId);
1085 clsSize =
event.getClusterSize(layer2, cluster2.clusterId);
1086 trackCA.setPoint(cluster1, layer1, clsInLayer1, mcCompLabel1, extClsIndex, clsSize);
1090template <
typename T>
1093 for (
auto& track :
event.getTracks()) {
1095 mTrackFitter->initTrack(track);
1096 mTrackFitter->fit(track);
1097 mTrackFitter->initTrack(outParam,
true);
1098 mTrackFitter->fit(outParam,
true);
1099 track.setOutParam(outParam);
1105template <
typename T>
A segment connecting two clusters from two planes.
A simple structure for the MFT cluster, used by the standalone track finder.
Class for the standalone track finding.
Standalone classes for the track found by the Linear-Track-Finder (LTF) and by the Cellular-Automaton...
HMPID cluster implementation.
static std::unique_ptr< BinContainer > mBins
static std::unique_ptr< BinContainer > mBinsS
static void initBinContainers()
static std::mutex sTCMutex
void findLTFTracks(ROframe< T > &)
void findCATracks(ROframe< T > &)
void configure(const MFTTrackingParam &trkParam, int trackerID)
bool fitTracks(ROframe< T > &)
GLenum GLuint GLint GLint layer
void bringTo02PiGen(float &phi)
constexpr std::array< Float_t, o2::mft::constants::mft::LayersNumber > RMin
constexpr std::array< Float_t, o2::mft::constants::mft::LayersNumber > RMax
constexpr std::array< Float_t, LayersNumber > InverseLayerZCoordinate()
constexpr Int_t LayersNumber
constexpr std::array< Float_t, LayersNumber > LayerZCoordinate()
constexpr Int_t DisksNumber
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
bool isMultCutRequested() const
bool FullClusterScan
Special version for TED shots and cosmics, with full scan of the clusters.
float cutMultClusHigh
reject ROF with estimated cluster mult. below this value (no cut if <0)
Bool_t CAConeRadius
road for CA algo : cylinder or cone (default)
Bool_t LTFConeRadius
road for LTF algo : cylinder or cone (default)
bool irFramesOnly
reject ROF with estimated cluster mult. above this value (no cut if <0)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"