CbmRoot
Loading...
Searching...
No Matches
CbmRichRingTrackAssignClosestD.cxx
Go to the documentation of this file.
1/* Copyright (C) 2006-2024 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Claudia Hoehne [committer], Semen Lebedev, Martin Beyer */
4
11
13
14#include "CbmEvent.h"
15#include "CbmGlobalTrack.h"
16#include "CbmMCTrack.h"
17#include "CbmRichRing.h"
18#include "CbmTrdTrack.h"
19#include "FairRootManager.h"
20#include "FairTrackParam.h"
21#include "TClonesArray.h"
22
23#include <Logger.h>
24
25#include <algorithm>
26#include <iostream>
27#include <vector>
28
29using std::cout;
30using std::endl;
31using std::vector;
32
34
36
38{
39 FairRootManager* manager = FairRootManager::Instance();
40 if (nullptr == manager) LOG(fatal) << "CbmRichRingTrackAssignClosestD::Init(): FairRootManager is nullptr.";
41
42 fGlobalTracks = (TClonesArray*) manager->GetObject("GlobalTrack");
43 if (fGlobalTracks == nullptr) LOG(fatal) << "CbmRichRingTrackAssignClosestD::Init(): No GlobalTrack.";
44
45 fTrdTracks = (TClonesArray*) manager->GetObject("TrdTrack");
46 //if (NULL == fTrdTracks) { LOG(fatal) << GetName() << "::Init: No TrdTrack array"; }
47}
48
49void CbmRichRingTrackAssignClosestD::DoAssign(CbmEvent* event, TClonesArray* rings, TClonesArray* richProj)
50{
51 fEventNum++;
54 } // RingTrack algorithm
55
56 else if (fAlgorithmType == TrackRing) {
58 } // TrackRing
59
60 else if (fAlgorithmType == Combined) {
63 } // Combined
64
65 Int_t nofTracks = event ? event->GetNofData(ECbmDataType::kRichTrackProjection) : richProj->GetEntriesFast();
66 Int_t nofRings = event ? event->GetNofData(ECbmDataType::kRichRing) : rings->GetEntriesFast();
67 LOG(debug) << "CbmRichRingTrackAssignClosestD::DoAssign(): Event:" << fEventNum << " rings:" << nofRings
68 << " ringsInTS:" << rings->GetEntriesFast() << " tracks:" << nofTracks
69 << " tracksInTS:" << richProj->GetEntriesFast();
70}
71
73{
74
75 const Int_t nofTracks = event ? event->GetNofData(ECbmDataType::kRichTrackProjection) : richProj->GetEntriesFast();
76 const Int_t nofRings = event ? event->GetNofData(ECbmDataType::kRichRing) : rings->GetEntriesFast();
77 if (nofTracks <= 0 || nofRings <= 0) return;
78
79 vector<Int_t> trackIndex;
80 vector<Double_t> trackDist;
81 trackIndex.resize(nofRings);
82 trackDist.resize(nofRings);
83 for (UInt_t i = 0; i < trackIndex.size(); i++) {
84 trackIndex[i] = -1;
85 trackDist[i] = 999.;
86 }
87
88 for (Int_t iIter = 0; iIter < 4; iIter++) {
89 for (Int_t iRing = 0; iRing < nofRings; iRing++) {
90 Int_t iRingIndex = event ? event->GetIndex(ECbmDataType::kRichRing, iRing) : iRing;
91
92 if (trackIndex[iRing] != -1) continue;
93 CbmRichRing* ring = static_cast<CbmRichRing*>(rings->At(iRingIndex));
94 if (ring == nullptr) continue;
95 if (ring->GetNofHits() < fMinNofHitsInRing) continue;
96
97 Double_t xRing = ring->GetCenterX();
98 Double_t yRing = ring->GetCenterY();
99 Double_t rMin = 999.;
100 Int_t iTrackMin = -1;
101
102 for (Int_t iTrack = 0; iTrack < nofTracks; iTrack++) {
103 Int_t iTrackIndex = event ? event->GetIndex(ECbmDataType::kRichTrackProjection, iTrack) : iTrack;
104
105 if (std::find(trackIndex.begin(), trackIndex.end(), iTrackIndex) != trackIndex.end()) continue;
106
107 FairTrackParam* track = static_cast<FairTrackParam*>(richProj->At(iTrackIndex));
108 Double_t xTrack = track->GetX();
109 Double_t yTrack = track->GetY();
110 // no projection onto the photodetector plane
111 if (xTrack == 0 && yTrack == 0) continue;
112
113 if (fUseTrd && fTrdTracks != nullptr && !IsTrdElectron(iTrackIndex)) continue;
114
115 Double_t dist = TMath::Sqrt((xRing - xTrack) * (xRing - xTrack) + (yRing - yTrack) * (yRing - yTrack));
116
117 if (dist < rMin) {
118 rMin = dist;
119 iTrackMin = iTrackIndex;
120 }
121 } // loop tracks
122 trackIndex[iRing] = iTrackMin;
123 trackDist[iRing] = rMin;
124 } //loop rings
125
126 for (UInt_t i1 = 0; i1 < trackIndex.size(); i1++) {
127 for (UInt_t i2 = 0; i2 < trackIndex.size(); i2++) {
128 if (i1 == i2) continue;
129 if (trackIndex[i1] == trackIndex[i2] && trackIndex[i1] != -1) {
130 if (trackDist[i1] >= trackDist[i2]) {
131 trackDist[i1] = 999.;
132 trackIndex[i1] = -1;
133 }
134 else {
135 trackDist[i2] = 999.;
136 trackIndex[i2] = -1;
137 }
138 }
139 }
140 }
141 } //iIter
142
143 // fill global tracks
144 for (UInt_t i = 0; i < trackIndex.size(); i++) {
145 // CbmRichRing* pRing = (CbmRichRing*)rings->At(i);
146 // cout << "trackIndex[i]:" << trackIndex[i] << " trackDist[i]:" << trackDist[i] << " r:" << pRing->GetRadius() << " x:" << pRing->GetCenterX() << " y:" << pRing->GetCenterY()<< endl;
147 if (trackIndex[i] == -1) continue;
148 CbmGlobalTrack* gTrack = (CbmGlobalTrack*) fGlobalTracks->At(trackIndex[i]);
149 Int_t iRingIndex = event ? event->GetIndex(ECbmDataType::kRichRing, i) : i;
150 gTrack->SetRichRingIndex(iRingIndex);
151 }
152}
153
155{
156 const Int_t nofTracks = event ? event->GetNofData(ECbmDataType::kRichTrackProjection) : richProj->GetEntriesFast();
157 const Int_t nofRings = event ? event->GetNofData(ECbmDataType::kRichRing) : rings->GetEntriesFast();
158 if (nofTracks <= 0 || nofRings <= 0) return;
159 for (Int_t iTrack = 0; iTrack < nofTracks; iTrack++) {
160 Int_t iTrackIndex = event ? event->GetIndex(ECbmDataType::kRichTrackProjection, iTrack) : iTrack;
161 CbmGlobalTrack* gTrack = static_cast<CbmGlobalTrack*>(fGlobalTracks->At(iTrackIndex));
162 // track already has rich segment
163 if (gTrack == nullptr || gTrack->GetRichRingIndex() >= 0) continue;
164
165 FairTrackParam* track = static_cast<FairTrackParam*>(richProj->At(iTrackIndex));
166 Double_t xTrack = track->GetX();
167 Double_t yTrack = track->GetY();
168 if (xTrack == 0 && yTrack == 0) continue;
169 if (fUseTrd && fTrdTracks != nullptr && !IsTrdElectron(iTrackIndex)) continue;
170 Double_t rMin = 999.;
171 Int_t iRingMin = -1;
172 for (Int_t iRing = 0; iRing < nofRings; iRing++) {
173 Int_t iRingIndex = event ? event->GetIndex(ECbmDataType::kRichRing, iRing) : iRing;
174 CbmRichRing* ring = static_cast<CbmRichRing*>(rings->At(iRingIndex));
175 if (ring == nullptr) continue;
176 if (ring->GetNofHits() < fMinNofHitsInRing) continue;
177
178 Double_t xRing = ring->GetCenterX();
179 Double_t yRing = ring->GetCenterY();
180 Double_t dist = TMath::Sqrt((xRing - xTrack) * (xRing - xTrack) + (yRing - yTrack) * (yRing - yTrack));
181 if (dist < rMin) {
182 rMin = dist;
183 iRingMin = iRingIndex;
184 }
185 } // loop rings
186 if (iRingMin < 0) continue;
187 // CbmRichRing* pRing = (CbmRichRing*)rings->At(iRingMin);
188 gTrack->SetRichRingIndex(iRingMin);
189 } //loop tracks
190}
191
193{
194 CbmGlobalTrack* gTrack = static_cast<CbmGlobalTrack*>(fGlobalTracks->At(iTrack));
195 Int_t trdIndex = gTrack->GetTrdTrackIndex();
196 if (trdIndex == -1) return false;
197 CbmTrdTrack* trdTrack = static_cast<CbmTrdTrack*>(fTrdTracks->At(trdIndex));
198 if (NULL == trdTrack) return false;
199
200 if (trdTrack->GetPidANN() > fTrdAnnCut) {
201 return true;
202 }
203
204 return false;
205}
TClonesArray * rings
@ kRichTrackProjection
Definition CbmDefs.h:139
Ring-Track Assignment according to the closest distance criterion.
TClonesArray * richProj
int Int_t
bool Bool_t
Class characterising one event by a collection of links (indices) to data objects,...
Definition CbmEvent.h:34
int32_t GetRichRingIndex() const
void SetRichRingIndex(int32_t iRing)
int32_t GetTrdTrackIndex() const
bool IsTrdElectron(int iTrack)
Check if global track was identified as electron in the TRD detector.
void DoAssign(CbmEvent *event, TClonesArray *rings, TClonesArray *richProj)
Inherited from CbmRichRingTrackAssignBase.
void DoAssignRingTrack(CbmEvent *event, TClonesArray *rings, TClonesArray *richProj)
Implementation of the ring-track version of the algorithm.
CbmRichRingTrackAssignClosestDAlgorithmEnum fAlgorithmType
void DoAssignTrackRing(CbmEvent *event, TClonesArray *rings, TClonesArray *richProj)
Implementation of the track-ring version of the algorithm.
void Init()
Inherited from CbmRichRingTrackAssignBase.
int32_t GetNofHits() const
Definition CbmRichRing.h:37
float GetCenterX() const
Definition CbmRichRing.h:77
float GetCenterY() const
Definition CbmRichRing.h:78
double GetPidANN() const
Definition CbmTrdTrack.h:41