62 fSttPoints=(TClonesArray *) FairRootManager::Instance()->GetObject(
"SttPoint");
63 fSttHits =(TClonesArray *) FairRootManager::Instance()->GetObject(
"SttHit");
64 fMuchTracks =(TClonesArray *) FairRootManager::Instance()->GetObject(
"MuchTrack");
65 fStsTracks =(TClonesArray *) FairRootManager::Instance()->GetObject(
"StsTrack");
66 fMCTracks =(TClonesArray *) FairRootManager::Instance()->GetObject(
"MCTrack");
67 fSTSTrackMatch = (TClonesArray*) FairRootManager::Instance()->GetObject(
"StsTrackMatch");
68 fPrimVtx = (
CbmVertex *) FairRootManager::Instance() ->GetObject(
"PrimaryVertex");
71 FairRootManager::Instance()->Register(
"SttTrack",
"Stt", fTrackCollection, kTRUE);
73 cout <<
" **************************************************" << endl;
74 if (fMuchTracks) cout <<
" *** Using Much tracks for Stt tracking *** " << endl;
75 else cout <<
" *** Using Sts tracks for Stt tracking *** " << endl;
76 cout <<
" **************************************************" << endl;
92 const int MaxBranches = 50;
94 static bool first = 1;
95 fTrackCollection->Clear();
96 static int EventCounter = 0;
98 cout<<
" SttRec event "<<EventCounter<<endl;
106 TDirectory *curdir = gDirectory;
107 histodir = gDirectory->mkdir(
"SttRec");
109 fhNBranches =
new TH1F(
"NBranches",
"N Branches",MaxBranches,0,MaxBranches);
113 int NHits = fSttHits->GetEntriesFast();
114 vector<CbmL1SttHit> vSttHits;
116 for(
int ih = 0; ih < NHits; ++ih ){
117 CbmSttHit *h = (CbmSttHit*) fSttHits->UncheckedAt(ih);
119 vSttHits.push_back(
m);
122 vector<CbmL1SttTrack> vTracks;
125 TClonesArray *seedTracks;
126 if (fMuchTracks) seedTracks = fMuchTracks;
127 else seedTracks = fStsTracks;
128 nStsTracks = seedTracks->GetEntriesFast();
129 cout <<
" Seed tracks: " << nStsTracks << endl;
132 Double_t scatAng[MaxBranches] = {0.};
134 for(
int itr = 0; itr < nStsTracks; ++itr ){
137 TObject *sts = seedTracks->UncheckedAt(itr);
155 if (1&&fSTSTrackMatch && fMCTracks ){
157 if (fMuchTracks) itr1 = ((CbmMuchTrack*)sts)->GetStsTrackID();
158 CbmStsTrackMatch *
m = (CbmStsTrackMatch*) fSTSTrackMatch->At(itr1);
160 Int_t mcTrackID =
m->GetMCTrackId();
166 TVector3 mom0(-1e+7), mom1;
167 for (Int_t
i = 0;
i < nStations; ++
i) hitPlanes[
i] = -1;
168 for(
int ih = 0; ih < NHits; ++ih ){
170 CbmSttHit *hit = (CbmSttHit*) fSttHits->UncheckedAt(h.
index);
171 CbmSttPoint *p = (CbmSttPoint*) fSttPoints->UncheckedAt(hit->GetRefIndex());
172 if (p->GetTrackID() != mcTrackID)
continue;
173 if (p->GetStationNo() == 1 &&
174 TMath::Sqrt(p->GetX()*p->GetX()+p->GetY()*p->GetY()) > 220)
continue;
179 if (mom0[0] < -1e+5) p->Momentum(mom0);
180 else p->Momentum(mom1);
181 if (itr < MaxBranches) scatAng[itr] = TMath::Max (scatAng[itr], mom1.Angle(mom0) * TMath::RadToDeg());
183 if (nOK < nStations) {
195 Branches[0].
StsID = itr;
196 Branches[0].
NHits = 0;
201 Branches[0].
vHits.clear();
203 for( Int_t ist=0; ist<nStations; ++ist ){
205 int NBranchesOld = NBranches;
207 for( Int_t ibr=0; ibr<NBranchesOld; ++ibr ){
232 for(
int ih=0; ih<NHits; ++ih ){
242 CbmSttHit *hit = (CbmSttHit*) fSttHits->UncheckedAt(h.
index);
266 Double_t chi21 = du * du / w;
268 if ( chi21 <= 20. ) NewHits.push_back( ih );
271 int nnew = NewHits.size();
272 for(
int ih=1; ih<nnew; ++ih){
273 if( NBranches >= MaxBranches )
break;
277 t.
vHits.push_back(&h);
284 tr.
vHits.push_back(&h);
286 double qp0 = tr.
T[4];
292 for(
int ibr=1; ibr<NBranches; ++ibr ){
293 if( (Branches[ibr].NHits > Branches[bestbr].NHits) ||
294 (Branches[ibr].
NHits == Branches[bestbr].
NHits)&&
295 (Branches[ibr].chi2<Branches[bestbr].chi2)
298 vTracks.push_back(Branches[bestbr]);
311 if (nOK == nStations) fhNBranches->Fill(NBranches);
312 else (vTracks.back()).ok = kFALSE;
316 int NTracks = vTracks.size();
317 cout<<
"NTracks="<<NTracks<<endl;
320 vector<CbmL1SttTrack*> vpTracks;
321 for(
int i=0;
i<NTracks; ++
i ) vpTracks.push_back(&(vTracks[
i]));
324 int NOutTracks = fTrackCollection->GetEntries();
326 for(
int it=0; it<NTracks; ++it ){
333 for(
int ih=0; ih<tr.
NHits; ++ih )
if( tr.
vHits[ih]->busy ) nbusy++;
339 Int_t nDoubl[20] = {0};
340 for (Int_t ih = 0; ih < tr.
NHits; ++ih) {
341 Int_t i2 = tr.
vHits[ih]->iStation / 2;
342 if (nDoubl[i2] == 0) nDoubl[i2]++;
345 for (Int_t
i = 0;
i < nStations/2; ++
i) nHit += nDoubl[
i];
346 if (nHit < nStations/2)
continue;
347 if (!(tr.
ok))
continue;
350 new((*fTrackCollection)[NOutTracks]) CbmSttTrack();
351 CbmSttTrack* track = (CbmSttTrack*) fTrackCollection->At(NOutTracks++);
356 track->SetSttTrack( &tp );
357 track->SetStsTrackID(tr.
StsID);
359 for( vector<CbmL1SttHit* >::iterator
i= tr.
vHits.begin();
i!=tr.
vHits.end();
i++){
361 track->AddHitIndex( (*i)->index );
363 track->SetNMissedHits( tr.
NMissed );
365 if (tr.
StsID < MaxBranches) track->SetScatAng(scatAng[tr.
StsID]);
367 for(
int ih=0; ih<tr.
NHits; ++ih ) tr.
vHits[ih]->busy=1;
370 if ( EventCounter < 100 && EventCounter % 10 == 0 ||
371 EventCounter >= 100 && EventCounter % 100 == 0
373 cout <<
"end of SttRec " << fTrackCollection->GetEntriesFast() << endl;