CbmRoot
Loading...
Searching...
No Matches
LitTrackSelection.h
Go to the documentation of this file.
1/* Copyright (C) 2010-2016 GSI/JINR-LIT, Darmstadt/Dubna
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Andrey Lebedev [committer] */
4
14#ifndef LITTRACKSELECTION_H_
15#define LITTRACKSELECTION_H_
16
17#include "LitScalTrack.h"
18
19#include <algorithm>
20#include <functional>
21#include <set>
22#include <utility>
23#include <vector>
24
25using std::equal_range;
26using std::pair;
27using std::set;
28using std::sort;
29
30namespace lit
31{
32 namespace parallel
33 {
34
35
36 void DoSortNofHits(vector<LitScalTrack*>& tracks)
37 {
38 sort(tracks.begin(), tracks.end(), [](const LitScalTrack* track1, const LitScalTrack* track2) {
39 return track1->GetNofHits() > track2->GetNofHits();
40 });
41
42 unsigned int maxNofHits = tracks.front()->GetNofHits();
43 unsigned int minNofHits = tracks.back()->GetNofHits();
44
45 for (unsigned int iNofHits = minNofHits; iNofHits <= maxNofHits; iNofHits++) {
46 LitScalTrack value;
47 value.SetNofHits(iNofHits);
48
49 pair<vector<LitScalTrack*>::iterator, vector<LitScalTrack*>::iterator> bounds;
50 bounds =
51 equal_range(tracks.begin(), tracks.end(), &value, [](const LitScalTrack* track1, const LitScalTrack* track2) {
52 return track1->GetNofHits() > track2->GetNofHits();
53 });
54
55 if (bounds.first == bounds.second) {
56 continue;
57 }
58
59 sort(bounds.first, bounds.second, [](const LitScalTrack* track1, const LitScalTrack* track2) {
60 return ((track1->GetChiSq() / track1->GetNDF()) < (track2->GetChiSq() / track2->GetNDF()));
61 });
62 }
63 }
64
65 void DoSortLastStation(vector<LitScalTrack*>& tracks)
66 {
67 sort(tracks.begin(), tracks.end(), [](const LitScalTrack* track1, const LitScalTrack* track2) {
68 return track1->GetLastStationId() > track2->GetLastStationId();
69 });
70
71 unsigned int maxPlaneId = tracks.front()->GetLastStationId();
72 unsigned int minPlaneId = tracks.back()->GetLastStationId();
73
74 for (unsigned int iPlaneId = minPlaneId; iPlaneId <= maxPlaneId; iPlaneId++) {
75 LitScalTrack value;
76 value.SetLastStationId(iPlaneId);
77
78 pair<vector<LitScalTrack*>::iterator, vector<LitScalTrack*>::iterator> bounds;
79 bounds =
80 equal_range(tracks.begin(), tracks.end(), &value, [](const LitScalTrack* track1, const LitScalTrack* track2) {
81 return track1->GetLastStationId() > track2->GetLastStationId();
82 });
83
84 if (bounds.first == bounds.second) {
85 continue;
86 }
87
88 sort(bounds.first, bounds.second, [](const LitScalTrack* track1, const LitScalTrack* track2) {
89 return ((track1->GetChiSq() / track1->GetNDF()) < (track2->GetChiSq() / track2->GetNDF()));
90 });
91 }
92 }
93
94 void DoSortChiSqOverNDF(vector<LitScalTrack*>& tracks)
95 {
96 sort(tracks.begin(), tracks.end(), [](const LitScalTrack* track1, const LitScalTrack* track2) {
97 return ((track1->GetChiSq() / track1->GetNDF()) < (track2->GetChiSq() / track2->GetNDF()));
98 });
99 }
100
101
102 void DoSelectSharedHits(vector<LitScalTrack*>& tracks)
103 {
104 static const int NOF_SHARED_HITS = 3;
105 if (tracks.empty()) return;
106
108
109 set<int> hitsId;
110 // const int STRIPSTART = 100000;
111 // const int TRDSTART = 1000000;
112
113 unsigned int nofTracks = tracks.size();
114 for (unsigned int iTrack = 0; iTrack < nofTracks; iTrack++) {
115 LitScalTrack* track = tracks[iTrack];
116
117 if (!track->IsGood()) {
118 continue;
119 }
120
121 int nofSharedHits = 0;
122 int nofHits = track->GetNofHits();
123 for (int iHit = 0; iHit < nofHits; iHit++) {
124 int hitId = track->GetHit(iHit)->refId;
125 // LitHitType type = track->GetHit(iHit)->GetType();
126 // LitSystemId sysId = track->GetHit(iHit)->GetSystem();
127 // if (type == kLITSTRIPHIT) { hitId += STRIPSTART; }
128 // if (sysId == kLITTRD) { hitId += TRDSTART; }
129 if (hitsId.find(hitId) != hitsId.end()) {
130 nofSharedHits++;
131 if (nofSharedHits > NOF_SHARED_HITS) {
132 track->IsGood(false);
133 break;
134 }
135 }
136 }
137
138 if (!track->IsGood()) {
139 continue;
140 }
141
142 for (int iHit = 0; iHit < nofHits; iHit++) {
143 int hitId = track->GetHit(iHit)->refId;
144 //LitHitType type = track->GetHit(iHit)->GetType();
145 //LitSystemId detId = track->GetHit(iHit)->GetSystem();
146 // if (type == kLITSTRIPHIT) { hitId += STRIPSTART; }
147 // if (detId == kLITTRD) { hitId += TRDSTART; }
148 hitsId.insert(hitId);
149 }
150 }
151 hitsId.clear();
152 }
153
154 } // namespace parallel
155} // namespace lit
156#endif /* LITTRACKSELECTION_H_ */
TClonesArray * tracks
Scalar track data class.
Scalar track data class.
void SetNofHits(unsigned short nofHits)
Depricated.
unsigned short GetNofHits() const
Returns number of hits in track.
bool IsGood() const
Returns true if track is good.
const LitScalPixelHit * GetHit(unsigned short index) const
Returns pointer to the hit.
void SetLastStationId(unsigned short lastStationId)
Set last station ID.
void DoSortChiSqOverNDF(vector< LitScalTrack * > &tracks)
void DoSelectSharedHits(vector< LitScalTrack * > &tracks)
void DoSortNofHits(vector< LitScalTrack * > &tracks)
void DoSortLastStation(vector< LitScalTrack * > &tracks)