BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
CbmL1SttTrackFinder.cxx
Go to the documentation of this file.
1// -------------------------------------------------------------------------
2// ----- CbmL1SttTrackFinder source file -----
3// ----- Created 8/03/08 by A. Zinchenko -----
4// -------------------------------------------------------------------------
5
7
8#include "CbmKF.h"
9#include "CbmKFHit.h"
10#include "CbmKFMaterial.h"
11#include "CbmKFMath.h"
12#include "CbmKFPixelMeasurement.h"
13#include "CbmKFTrackInterface.h"
14#include "CbmL1SttHit.h"
15#include "CbmL1SttTrack.h"
16#include "CbmMCTrack.h"
17#include "CbmMuchHit.h"
18#include "CbmMuchPoint.h"
19#include "CbmMuchTrack.h"
20#include "CbmStsKFTrackFitter.h"
21#include "CbmStsTrack.h"
22#include "CbmStsTrackMatch.h"
23#include "CbmSttHit.h"
24#include "CbmSttPoint.h"
25#include "CbmSttTrack.h"
26#include "CbmVertex.h"
27#include "FairRootManager.h"
28#include "TClonesArray.h"
29#include "TFile.h"
30#include "TLorentzVector.h"
31#include "TVector3.h"
32
33#include <cmath>
34#include <iostream>
35#include <vector>
36
37using std::cout;
38using std::endl;
39using std::fabs;
40using std::vector;
41
43 : FairTask(name, iVerbose)
44{
45 fTrackCollection = new TClonesArray("CbmSttTrack", 100);
46 histodir = 0;
47}
48
50
52{
53 return ReInit();
54}
55
57{
58 fSttPoints = (TClonesArray*)FairRootManager::Instance()->GetObject("SttPoint");
59 fSttHits = (TClonesArray*)FairRootManager::Instance()->GetObject("SttHit");
60 fMuchTracks = (TClonesArray*)FairRootManager::Instance()->GetObject("MuchTrack");
61 fStsTracks = (TClonesArray*)FairRootManager::Instance()->GetObject("StsTrack");
62 fMCTracks = (TClonesArray*)FairRootManager::Instance()->GetObject("MCTrack");
63 fSTSTrackMatch = (TClonesArray*)FairRootManager::Instance()->GetObject("StsTrackMatch");
64 fPrimVtx = (CbmVertex*)FairRootManager::Instance()->GetObject("PrimaryVertex");
65 fStsFitter.Init();
66
67 FairRootManager::Instance()->Register("SttTrack", "Stt", fTrackCollection, kTRUE);
68
69 cout << " **************************************************" << endl;
70 if (fMuchTracks)
71 cout << " *** Using Much tracks for Stt tracking *** " << endl;
72 else
73 cout << " *** Using Sts tracks for Stt tracking *** " << endl;
74 cout << " **************************************************" << endl;
75
76 return kSUCCESS;
77}
78
80
85
87{
88 const int MaxBranches = 50;
89
90 static bool first = 1;
91 fTrackCollection->Clear();
92 static int EventCounter = 0;
93 EventCounter++;
94 cout << " SttRec event " << EventCounter << endl;
95
96 // int MuNStations = CbmKF::Instance()->MuchStation2MCIDMap.size();
97 static const Int_t nStations = CbmKF::Instance()->SttStationIDMap.size();
98 // const int nStations = 18; // to be taken elsewhere !!!
99
100 if (first) {
101 first = 0;
102 TDirectory* curdir = gDirectory;
103 histodir = gDirectory->mkdir("SttRec");
104 histodir->cd();
105 fhNBranches = new TH1F("NBranches", "N Branches", MaxBranches, 0, MaxBranches);
106 curdir->cd();
107 }
108
109 int NHits = fSttHits->GetEntriesFast();
110 vector<CbmL1SttHit> vSttHits;
111
112 for (int ih = 0; ih < NHits; ++ih) {
113 CbmSttHit* h = (CbmSttHit*)fSttHits->UncheckedAt(ih);
114 CbmL1SttHit m(h, ih);
115 vSttHits.push_back(m);
116 }
117
118 vector<CbmL1SttTrack> vTracks;
119
120 Int_t nStsTracks;
121 TClonesArray* seedTracks;
122 if (fMuchTracks)
123 seedTracks = fMuchTracks;
124 else
125 seedTracks = fStsTracks;
126 nStsTracks = seedTracks->GetEntriesFast();
127 cout << " Seed tracks: " << nStsTracks << endl;
128
129 CbmL1SttTrack Branches[MaxBranches];
130 Double_t scatAng[MaxBranches] = {0.};
131
132 for (int itr = 0; itr < nStsTracks; ++itr) {
133
134 Int_t nOK = 0;
135 TObject* sts = seedTracks->UncheckedAt(itr);
136 if (!fMuchTracks) {
137 if (((CbmStsTrack*)sts)->GetNStsHits() + ((CbmStsTrack*)sts)->GetNMvdHits() < 4)
138 continue;
139 }
140
141 // MC
142 /*
143 if( 0&&fSTSTrackMatch && fMCTracks ){
144 CbmStsTrackMatch *m = (CbmStsTrackMatch*) fSTSTrackMatch->At(itr);
145 if( !m ) continue;
146 Int_t mcTrackID = m->GetMCTrackId();
147 if (mcTrackID<0) continue;
148 CbmMCTrack* mcTrack= (CbmMCTrack*) fMCTracks->At(mcTrackID);
149 if( !mcTrack ) continue;
150 if( abs(mcTrack->GetPdgCode())!=13 ) continue;
151 }
152 */
153 // Check if track passes all the planes
154 if (1 && fSTSTrackMatch && fMCTracks) {
155 Int_t itr1 = itr;
156 if (fMuchTracks)
157 itr1 = ((CbmMuchTrack*)sts)->GetStsTrackID();
158 CbmStsTrackMatch* m = (CbmStsTrackMatch*)fSTSTrackMatch->At(itr1);
159 if (!m)
160 continue;
161 Int_t mcTrackID = m->GetMCTrackId();
162 // if (mcTrackID<0) continue;
163 // CbmMCTrack* mcTrack= (CbmMCTrack*) fMCTracks->At(mcTrackID);
164 // if( !mcTrack ) continue;
165 // if( abs(mcTrack->GetPdgCode())!=13 ) continue;
166 Int_t hitPlanes[20];
167 TVector3 mom0(-1e+7), mom1;
168 for (Int_t i = 0; i < nStations; ++i)
169 hitPlanes[i] = -1;
170 for (int ih = 0; ih < NHits; ++ih) {
171 CbmL1SttHit& h = vSttHits[ih];
172 CbmSttHit* hit = (CbmSttHit*)fSttHits->UncheckedAt(h.index);
173 CbmSttPoint* p = (CbmSttPoint*)fSttPoints->UncheckedAt(hit->GetRefIndex());
174 if (p->GetTrackID() != mcTrackID)
175 continue;
176 if (p->GetStationNo() == 1 && TMath::Sqrt(p->GetX() * p->GetX() + p->GetY() * p->GetY()) > 220)
177 continue;
178 if (hitPlanes[h.iStation] < 0) {
179 hitPlanes[h.iStation] = 1;
180 ++nOK;
181 }
182 if (mom0[0] < -1e+5)
183 p->Momentum(mom0);
184 else
185 p->Momentum(mom1);
186 if (itr < MaxBranches)
187 scatAng[itr] = TMath::Max(scatAng[itr], mom1.Angle(mom0) * TMath::RadToDeg());
188 }
189 if (nOK < nStations) {
190 // cout << " Track " << mcTrackID << " has " << nOK << " points " << endl;
191 // continue;
192 }
193 }
194
195 if (!fMuchTracks)
196 fStsFitter.DoFit((CbmStsTrack*)sts, 13); // refit with muon mass
197
198 int NBranches = 1;
199
200 fMuchTracks == 0x0 ? Branches[0].SetStsTrack((CbmStsTrack*)sts) : Branches[0].SetMuchTrack((CbmMuchTrack*)sts);
201 Branches[0].StsID = itr;
202 Branches[0].NHits = 0;
203 Branches[0].NMissed = 0;
204 Branches[0].NMissedStations = 0;
205 Branches[0].ok = 1;
206 Branches[0].stopped = 0;
207 Branches[0].vHits.clear();
208 // cout<<"Sts track N "<<itr<<" with initial mom="<<1./Branches[0].T[4]<<endl;
209 for (Int_t ist = 0; ist < nStations; ++ist) {
210
211 int NBranchesOld = NBranches;
212
213 for (Int_t ibr = 0; ibr < NBranchesOld; ++ibr) {
214 CbmL1SttTrack& tr = Branches[ibr];
215 if (tr.stopped)
216 continue;
217 // if( ist%3 ==0 ) cout<<" | ";
218 // double Zdet = CbmKF::Instance()->vMuchDetectors[ist].ZReference;
219 double Zdet = CbmKF::Instance()->vSttMaterial[ist].ZReference;
220 // cout << Zdet << endl;
221 // double Zdet = zPlanes[ist];
222 tr.Extrapolate(Zdet);
223 if (fabs(tr.T[4]) > 100.)
224 tr.stopped = 1;
225 if (1. < 0.5 * fabs(tr.T[4]))
226 tr.stopped = 1; // 0.5 GeV, stop transport
227 // if( tr.stopped ) cout<<"Sts track N "<<itr<<" stopped at Mu station "<<ist
228 //<<" with mom="<<1./tr.T[4]<<endl;
229 if (tr.stopped)
230 continue;
231 /*
232 if( CbmKF::Instance()->vMuchDetectors[ist].IsOutside( tr.T[0], tr.T[1] ) ){
233 //cout<<" out ";
234 tr.NMissedStations++;
235 continue;
236 }
237 */
238
239 vector<int> NewHits;
240 Int_t firstHit = -1;
241 Double_t uTr = 0.;
242 for (int ih = 0; ih < NHits; ++ih) {
243 CbmL1SttHit& h = vSttHits[ih];
244 if (h.iStation != ist)
245 continue;
246
247 if (firstHit < 0) {
248 // Track coordinate transformation
249 uTr = tr.T[0] * h.FitPoint.phi_c + tr.T[1] * h.FitPoint.phi_s;
250 // uTr = tr.T[0] * h.FitPoint.phi_c - tr.T[1] * h.FitPoint.phi_s;
251 firstHit = 1;
252 }
253 CbmSttHit* hit = (CbmSttHit*)fSttHits->UncheckedAt(h.index);
254 // cout << tr.T[0] << " " << tr.T[1] << " " << hit->GetX() << " " << hit->GetY() << " " << uTr << "
255 // " << h.FitPoint.u << " " << h.FitPoint.phi_c << " " << h.FitPoint.phi_s << endl;
256
257 /*
258 if(0){ // !!! Cut for the time of flight (ns)
259 double hl = sqrt(h.FitPoint.x*h.FitPoint.x+h.FitPoint.y*h.FitPoint.y+h.FitPoint.z*h.FitPoint.z);
260 double hp = 1./fabs(tr.T[4]);
261 double texp = hl*sqrt(1. - 0.1057*0.1057/(hp*hp))/29.9792458; //ns
262 if( h.time - texp > 1.0 ) continue;
263 }
264 */
265 /*
266 double dx = tr.T[0] - h.FitPoint.x;
267 double dy = tr.T[1] - h.FitPoint.y;
268 double c0 = tr.C[0] + h.FitPoint.V[0];
269 double c1 = tr.C[1] + h.FitPoint.V[1];
270 double c2 = tr.C[2] + h.FitPoint.V[2];
271 double chi2 = 0.5*(dx*dx*c0-2*dx*dy*c1+dy*dy*c2)/(c0*c2-c1*c1);
272 */
273 Double_t du = uTr - h.FitPoint.u;
274 // Double_t c0 = tr.C[0] + h.FitPoint.sigma2;
275 // Double_t chi2 = du * du / c0; // w/out correlations at the moment !!!
276 Double_t w = h.FitPoint.sigma2 + h.FitPoint.phi_cc * tr.C[0] + h.FitPoint.phi_2sc * tr.C[1]
277 + h.FitPoint.phi_ss * tr.C[2];
278 Double_t chi21 = du * du / w;
279 // cout << " chi2 " << ist << " " << du << " " << chi21 << " " << chi21 << endl;
280 if (chi21 <= 20.)
281 NewHits.push_back(ih);
282 // if ( chi21 <= 100. ) NewHits.push_back( ih );
283 }
284 int nnew = NewHits.size();
285 for (int ih = 1; ih < nnew; ++ih) {
286 if (NBranches >= MaxBranches)
287 break;
288 CbmL1SttTrack& t = Branches[NBranches++];
289 t = tr;
290 CbmL1SttHit& h = vSttHits[NewHits[ih]];
291 t.vHits.push_back(&h);
292 t.NHits++;
293 double qp0 = t.T[4];
294 h.Filter(t, 1, qp0);
295 }
296 if (nnew > 0) {
297 CbmL1SttHit& h = vSttHits[NewHits[0]];
298 tr.vHits.push_back(&h);
299 tr.NHits++;
300 double qp0 = tr.T[4];
301 h.Filter(tr, 1, qp0);
302 } else
303 tr.NMissed++;
304 } // for( int ibr=0; ibr<NBranchesOld;
305 } // for( int ist=0; ist<nStations;
306 int bestbr = 0;
307 for (int ibr = 1; ibr < NBranches; ++ibr) {
308 if ((Branches[ibr].NHits > Branches[bestbr].NHits)
309 || (Branches[ibr].NHits == Branches[bestbr].NHits) && (Branches[ibr].chi2 < Branches[bestbr].chi2))
310 bestbr = ibr;
311 }
312 vTracks.push_back(Branches[bestbr]);
313 // MC
314 /*
315 if( fSTSTrackMatch && fMCTracks ){
316 CbmStsTrackMatch *m = (CbmStsTrackMatch*) fSTSTrackMatch->At(itr);
317 if( !m ) continue;
318 Int_t mcTrackID = m->GetMCTrackId();
319 if (mcTrackID<0) continue;
320 CbmMCTrack* mcTrack= (CbmMCTrack*) fMCTracks->At(mcTrackID);
321 if( !mcTrack ) continue;
322 if( abs(mcTrack->GetPdgCode())==13 ) fhNBranches->Fill(NBranches);
323 }
324 */
325 if (nOK == nStations)
326 fhNBranches->Fill(NBranches);
327 else
328 (vTracks.back()).ok = kFALSE;
329 // cout << itr << " " << nOK << " " << (vTracks.back()).ok << endl;
330 } // for( int itr=0; itr<nStsTracks;
331
332 int NTracks = vTracks.size();
333 cout << "NTracks=" << NTracks << endl;
334 // sort tracks and check for common muon hits
335
336 vector<CbmL1SttTrack*> vpTracks;
337 for (int i = 0; i < NTracks; ++i)
338 vpTracks.push_back(&(vTracks[i]));
339 sort(vpTracks.begin(), vpTracks.end(), CbmL1SttTrack::Compare);
340
341 int NOutTracks = fTrackCollection->GetEntries();
342
343 for (int it = 0; it < NTracks; ++it) {
344 CbmL1SttTrack& tr = *vpTracks[it];
345 if (tr.NDF <= 0 || tr.chi2 > 10. * tr.NDF) {
346 // tr.ok = 0;
347 // continue;
348 }
349 int nbusy = 0;
350 for (int ih = 0; ih < tr.NHits; ++ih)
351 if (tr.vHits[ih]->busy)
352 nbusy++;
353 if (0 && nbusy > 2) {
354 tr.ok = 0;
355 continue;
356 }
357 // Check if track contains hit from all doublets in all stations
358 Int_t nDoubl[20] = {0};
359 for (Int_t ih = 0; ih < tr.NHits; ++ih) {
360 Int_t i2 = tr.vHits[ih]->iStation / 2;
361 if (nDoubl[i2] == 0)
362 nDoubl[i2]++;
363 }
364 Int_t nHit = 0;
365 for (Int_t i = 0; i < nStations / 2; ++i)
366 nHit += nDoubl[i];
367 if (nHit < nStations / 2)
368 continue;
369 if (!(tr.ok))
370 continue;
371
372 {
373 new ((*fTrackCollection)[NOutTracks]) CbmSttTrack();
374 CbmSttTrack* track = (CbmSttTrack*)fTrackCollection->At(NOutTracks++);
375 track->SetChi2(tr.GetRefChi2());
376 track->SetNDF(tr.GetRefNDF());
377 FairTrackParam tp;
378 CbmKFMath::CopyTC2TrackParam(&tp, tr.T, tr.C);
379 track->SetSttTrack(&tp);
380 track->SetStsTrackID(tr.StsID);
381 int nh = 0;
382 for (vector<CbmL1SttHit*>::iterator i = tr.vHits.begin(); i != tr.vHits.end(); i++) {
383 if (++nh > 30)
384 break;
385 track->AddHitIndex((*i)->index);
386 }
387 track->SetNMissedHits(tr.NMissed);
388 track->SetNMissedStations(tr.NMissedStations);
389 if (tr.StsID < MaxBranches)
390 track->SetScatAng(scatAng[tr.StsID]);
391 }
392 for (int ih = 0; ih < tr.NHits; ++ih)
393 tr.vHits[ih]->busy = 1;
394 }
395
396 if (EventCounter < 100 && EventCounter % 10 == 0 || EventCounter >= 100 && EventCounter % 100 == 0)
397 Write();
398 cout << "end of SttRec " << fTrackCollection->GetEntriesFast() << endl;
399}
400
402{
403 TFile HistoFile("SttRec.root", "RECREATE");
405 HistoFile.Close();
406}
407
409{
410 if (!obj->IsFolder())
411 obj->Write();
412 else {
413 TDirectory* cur = gDirectory;
414 TDirectory* sub = cur->mkdir(obj->GetName());
415 sub->cd();
416 TList* listSub = ((TDirectory*)obj)->GetList();
417 TIter it(listSub);
418 while (TObject* obj1 = it())
419 writedir2current(obj1);
420 cur->cd();
421 }
422}
friend F32vec4 fabs(const F32vec4 &a)
Definition P4_F32vec4.h:52
int i
Definition P4_F32vec4.h:22
__m128 m
Definition P4_F32vec4.h:27
int Int_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
const char Option_t
#define gDirectory
static void CopyTC2TrackParam(FairTrackParam *par, Double_t T[], Double_t C[])
Int_t Extrapolate(Double_t z, Double_t *QP0=0, Bool_t line=false)
Access to i-th hit.
static CbmKF * Instance()
Definition CbmKF.h:34
std::vector< CbmKFWall > vSttMaterial
Definition CbmKF.h:61
std::map< Int_t, Int_t > SttStationIDMap
Definition CbmKF.h:76
CbmKFUMeasurement FitPoint
Definition CbmL1SttHit.h:26
Int_t Filter(CbmKFTrackInterface &track, Bool_t downstream, Double_t &QP0)
TClonesArray * fTrackCollection
CbmL1SttTrackFinder(const char *name="CbmL1SttTrackFinder", Int_t iVerbose=1)
Constructor.
InitStatus ReInit()
Reinitialisation.
void SetParContainers()
Intialise parameter containers.
InitStatus Init()
Intialisation at begin of run.
TClonesArray * fSTSTrackMatch
void writedir2current(TObject *obj)
TClonesArray * fSttHits
STT MC points.
CbmStsKFTrackFitter fStsFitter
CbmVertex * fPrimVtx
STT tracks.
TClonesArray * fMuchTracks
STT Hits.
void Finish()
Action after each event.
void Exec(Option_t *option)
void SetStsTrack(CbmStsTrack *track)
double & GetRefChi2()
array[15] of covariance matrix
double C[15]
static bool Compare(const CbmL1SttTrack *p1, const CbmL1SttTrack *p2)
int & GetRefNDF()
Chi^2 after fit.
std::vector< CbmL1SttHit * > vHits
void SetMuchTrack(CbmMuchTrack *track)
CbmVertex.h.
Definition CbmVertex.h:21
virtual Bool_t cd()
virtual TDirectory * mkdir(const char *name, const char *title="", Bool_t returnExistingDirectory=kFALSE)
void Close(Option_t *option="") override
Int_t GetEntriesFast() const
TObject * UncheckedAt(Int_t i) const
virtual Bool_t IsFolder() const
virtual const char * GetName() const
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
Double_t Angle(const TVector3 &) const
Double_t Sqrt(Double_t x)
Double_t Max(Double_t a, Double_t b)
constexpr Double_t RadToDeg()