BmnRoot
Loading...
Searching...
No Matches
BmnMatchRecoToMC.cxx
Go to the documentation of this file.
1#include "BmnMatchRecoToMC.h"
2
3#include "BmnGlobalTrack.h"
4#include "FairRootManager.h"
5
6#include <TStopwatch.h>
7
8static Double_t workTime = 0.0;
9
11 : FairTask()
12 , fStsHits(nullptr)
13 , fStsTracks(nullptr)
14 , fGemPoints(nullptr)
15 , fGemTracks(nullptr)
16 , fSilPoints(nullptr)
17 , fSilTracks(nullptr)
18 , fGlobalTracks(nullptr)
19 , fGlobalTrackMatches(nullptr)
20 , fInnerTrackBranchName("StsTrack")
21{}
22
24{
25 if (fGlobalTrackMatches) {
26 fGlobalTrackMatches->Delete();
27 delete fGlobalTrackMatches;
28 }
29}
30
32{
33 ReadAndCreateDataBranches();
34 return kSUCCESS;
35}
36
37void BmnMatchRecoToMC::Exec(Option_t* opt)
38{
39 TStopwatch sw;
40 sw.Start();
41
42 if (fGlobalTrackMatches)
43 fGlobalTrackMatches->Delete();
44 MatchGlobalTracks();
45
46 sw.Stop();
47 workTime += sw.RealTime();
48}
49
51{
52 printf("Work time of BmnMatchRecoToMC: %4.2f sec.\n", workTime);
53}
54
55void BmnMatchRecoToMC::ReadAndCreateDataBranches()
56{
57 FairRootManager* ioman = FairRootManager::Instance();
58 if (!ioman)
59 LOG(fatal) << "BmnMatchRecoToMC::ReadAndCreateDataBranches() nullptr FairRootManager.";
60
61 fGlobalTracks = (TClonesArray*)ioman->GetObject("BmnGlobalTrack");
62
63 // GEM
64 fGemPoints = (TClonesArray*)ioman->GetObject("StsPoint");
65 fGemTracks = (TClonesArray*)ioman->GetObject("BmnGemTrack");
66
67 // Sil
68 fSilPoints = (TClonesArray*)ioman->GetObject("SiliconPoint");
69 fSilTracks = (TClonesArray*)ioman->GetObject("BmnSiliconTrack");
70
71 // STS
72 fStsHits = (TClonesArray*)ioman->GetObject("StsHit");
73 fStsTracks = (TClonesArray*)ioman->GetObject(fInnerTrackBranchName);
74
75 fGlobalTrackMatches = new TClonesArray("BmnTrackMatch", 100);
76 ioman->Register("BmnGlobalTrackMatch", "GLOBAL", fGlobalTrackMatches, kTRUE);
77}
78
79void BmnMatchRecoToMC::MatchGlobalTracks(const TClonesArray* gemHitMatches,
80 const TClonesArray* silHitMatches,
81 const TClonesArray* ssdHitMatches,
82 const TClonesArray* gemPoints,
83 const TClonesArray* silPoints,
84 const TClonesArray* ssdPoints,
85 const TClonesArray* gemTracks,
86 const TClonesArray* silTracks,
87 const TClonesArray* ssdTracks,
88 const TClonesArray* globTracks,
89 TClonesArray* trackMatches)
90{
91
92 for (Int_t iTrack = 0; iTrack < globTracks->GetEntriesFast(); ++iTrack) {
93 BmnGlobalTrack* glTrack = (BmnGlobalTrack*)(globTracks->At(iTrack));
94 BmnTrackMatch* trackMatch = new ((*trackMatches)[iTrack]) BmnTrackMatch();
95 Int_t trueCounter = 0;
96 Int_t wrongCounter = 0;
97 // GEM
98 if (glTrack->GetGemTrackIndex() != -1) {
99 BmnGemTrack* gemTr = (BmnGemTrack*)gemTracks->At(glTrack->GetGemTrackIndex());
100 for (Int_t iHit = 0; iHit < gemTr->GetNHits(); ++iHit)
101 LinkToMC(gemHitMatches, gemPoints, gemTr->GetHitIndex(iHit), trackMatch);
102 if (!trackMatch->GetNofLinks())
103 continue;
104 CalculateTrackQuality(gemTr, trackMatch, gemHitMatches, gemPoints, trueCounter, wrongCounter);
105 }
106 // SILICON
107 if (glTrack->GetSilTrackIndex() != -1) {
108 BmnGemTrack* silTr = (BmnGemTrack*)silTracks->At(glTrack->GetSilTrackIndex());
109 for (Int_t iHit = 0; iHit < silTr->GetNHits(); ++iHit)
110 LinkToMC(silHitMatches, silPoints, silTr->GetHitIndex(iHit), trackMatch);
111 if (!trackMatch->GetNofLinks())
112 continue;
113 CalculateTrackQuality(silTr, trackMatch, silHitMatches, silPoints, trueCounter, wrongCounter);
114 }
115 // SSD
116 if (glTrack->GetSsdTrackIndex() != -1) {
117 BmnGemTrack* ssdTr = (BmnGemTrack*)ssdTracks->At(glTrack->GetSsdTrackIndex());
118 for (Int_t iHit = 0; iHit < ssdTr->GetNHits(); ++iHit)
119 LinkToMC(ssdHitMatches, ssdPoints, ssdTr->GetHitIndex(iHit), trackMatch);
120 if (!trackMatch->GetNofLinks())
121 continue;
122 CalculateTrackQuality(ssdTr, trackMatch, ssdHitMatches, ssdPoints, trueCounter, wrongCounter);
123 }
124
125 trackMatch->SetNofTrueHits(trueCounter);
126 trackMatch->SetNofWrongHits(wrongCounter);
127 }
128}
129
130void BmnMatchRecoToMC::CalculateTrackQuality(BmnGemTrack* locTr,
131 BmnTrackMatch* trMatch,
132 const TClonesArray* hitMatches,
133 const TClonesArray* points,
134 Int_t& trueCntr,
135 Int_t& falseCntr)
136{
137 // Calculate number of true and wrong hits
138 for (Int_t iHit = 0; iHit < locTr->GetNHits(); iHit++) {
139 const BmnMatch* hitMatch = (BmnMatch*)(hitMatches->At(locTr->GetHitIndex(iHit)));
140 Int_t nofLinks = hitMatch->GetNofLinks();
141 Bool_t hasTrue = kFALSE;
142 for (Int_t iLink = 0; iLink < nofLinks; iLink++) {
143 const FairMCPoint* point = (const FairMCPoint*)(points->At(hitMatch->GetLink(iLink).GetIndex()));
144 if (!point)
145 continue;
146 if (point->GetTrackID() == trMatch->GetMatchedLink().GetIndex()) {
147 hasTrue = true;
148 break;
149 }
150 }
151 if (hasTrue)
152 trueCntr++;
153 else
154 falseCntr++;
155 }
156}
157
158BmnStatus BmnMatchRecoToMC::LinkToMC(const TClonesArray* hitMatchArr,
159 const TClonesArray* points,
160 Int_t id,
161 BmnTrackMatch* trackMatch)
162{
163
164 if (id == -1)
165 return kBMNERROR;
166 const BmnMatch* hitMatch = (BmnMatch*)(hitMatchArr->At(id));
167 if (hitMatch == nullptr)
168 return kBMNERROR;
169 for (Int_t iLink = 0; iLink < hitMatch->GetNofLinks(); ++iLink) {
170 const FairMCPoint* point = (const FairMCPoint*)(points->At(hitMatch->GetLink(iLink).GetIndex()));
171 if (nullptr == point)
172 return kBMNERROR;
173 trackMatch->AddLink(BmnLink(1, point->GetTrackID()));
174 }
175 return kBMNSUCCESS;
176}
177
178BmnStatus BmnMatchRecoToMC::LinkToMC(Int_t id, BmnTrackMatch* trackMatch)
179{
180
181 if (id == -1)
182 return kBMNERROR;
183 const CbmStsHit* hit = (CbmStsHit*)(fStsHits->At(id));
184 if (!hit)
185 return kBMNERROR;
186
187 FairMCPoint* point = nullptr;
188 for (Int_t iLink = 0; iLink < hit->GetNLinks(); ++iLink) {
189 if (hit->GetSystemId() == kGEM) {
190 point = (FairMCPoint*)(fGemPoints->At(hit->GetLink(iLink).GetIndex()));
191 } else if (hit->GetSystemId() == kSILICON) {
192 point = (FairMCPoint*)(fSilPoints->At(hit->GetLink(iLink).GetIndex()));
193 }
194 if (!point)
195 return kBMNERROR;
196 trackMatch->AddLink(BmnLink(1, point->GetTrackID()));
197 }
198 return kBMNSUCCESS;
199}
200
201// L1 STS case
202void BmnMatchRecoToMC::MatchGlobalTracks()
203{
204 if (!fGlobalTracks)
205 return;
206 for (Int_t iTrack = 0; iTrack < fGlobalTracks->GetEntriesFast(); ++iTrack) {
207 BmnGlobalTrack* glTrack = (BmnGlobalTrack*)(fGlobalTracks->At(iTrack));
208 if (!glTrack)
209 continue;
210 BmnTrackMatch* trackMatch = new ((*fGlobalTrackMatches)[iTrack]) BmnTrackMatch();
211
212 if (glTrack->GetGemTrackIndex() == -1)
213 continue; // actually GemTrackIndex is StsTrackIndex
214 CbmStsTrack* stsTr = (CbmStsTrack*)fStsTracks->At(glTrack->GetGemTrackIndex());
215 if (!stsTr)
216 continue;
217 for (Int_t iHit = 0; iHit < stsTr->GetNStsHits(); ++iHit)
218 LinkToMC(stsTr->GetStsHitIndex(iHit), trackMatch);
219 if (trackMatch->GetNofLinks() == 0)
220 continue;
221 CalculateTrackQuality(stsTr, trackMatch);
222
223 Int_t refId = (trackMatch->GetTrueOverAllHitsRatio() >= 0.6) ? trackMatch->GetMatchedLink().GetIndex() : -1;
224 stsTr->SetTrkID(refId);
225 glTrack->SetRefIndex(refId);
226 }
227}
228
229void BmnMatchRecoToMC::CalculateTrackQuality(CbmStsTrack* locTr, BmnTrackMatch* trMatch)
230{
231 // Calculate number of true and wrong hits
232 Int_t trueCounter = 0;
233 Int_t wrongCounter = 0;
234 for (Int_t iHit = 0; iHit < locTr->GetNStsHits(); iHit++) {
235 CbmStsHit* hit = (CbmStsHit*)(fStsHits->At(locTr->GetStsHitIndex(iHit)));
236 Bool_t hasTrue = kFALSE;
237 for (Int_t iLink = 0; iLink < hit->GetNLinks(); iLink++) {
238 FairMCPoint* point = nullptr;
239 if (hit->GetSystemId() == kGEM) {
240 point = (FairMCPoint*)(fGemPoints->At(hit->GetLink(iLink).GetIndex()));
241 } else if (hit->GetSystemId() == kSILICON) {
242 point = (FairMCPoint*)(fSilPoints->At(hit->GetLink(iLink).GetIndex()));
243 }
244 if (!point)
245 continue;
246 if (point->GetTrackID() == trMatch->GetMatchedLink().GetIndex()) {
247 hasTrue = true;
248 break;
249 }
250 }
251 if (hasTrue)
252 trueCounter++;
253 else
254 wrongCounter++;
255 }
256
257 trMatch->SetNofTrueHits(trueCounter);
258 trMatch->SetNofWrongHits(wrongCounter);
259}
@ kSILICON
@ kGEM
BmnStatus
Definition BmnEnums.h:24
@ kBMNERROR
Definition BmnEnums.h:26
@ kBMNSUCCESS
Definition BmnEnums.h:25
Int_t GetSsdTrackIndex() const
Int_t GetGemTrackIndex() const
Int_t GetSilTrackIndex() const
void SetRefIndex(Int_t idx)
virtual void Finish()
virtual void Exec(Option_t *opt)
virtual InitStatus Init()
const BmnLink & GetLink(Int_t i) const
Definition BmnMatch.h:37
void AddLink(const BmnMatch &match)
Definition BmnMatch.cxx:43
const BmnLink & GetMatchedLink() const
Definition BmnMatch.h:39
Int_t GetNofLinks() const
Definition BmnMatch.h:40
void SetNofTrueHits(Int_t nofTrueHits)
void SetNofWrongHits(Int_t nofWrongHits)
Double_t GetTrueOverAllHitsRatio() const
Int_t GetNHits() const
Definition BmnTrack.h:44
Int_t GetHitIndex(Int_t iHit) const
Definition BmnTrack.h:48
Int_t GetSystemId() const
Definition CbmStsHit.h:64
Int_t GetNStsHits() const
Definition CbmStsTrack.h:60
void SetTrkID(int id)
Definition CbmStsTrack.h:78
Int_t GetStsHitIndex(Int_t iHit) const
Definition CbmStsTrack.h:62