2 // **************************************************************************
3 // This file is property of and copyright by the ALICE HLT Project *
4 // ALICE Experiment at CERN, All rights reserved. *
6 // Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
7 // Ivan Kisel <kisel@kip.uni-heidelberg.de> *
8 // for The ALICE HLT Project. *
10 // Permission to use, copy, modify and distribute this software and its *
11 // documentation strictly for non-commercial purposes is hereby granted *
12 // without fee, provided that the above copyright notice appears in all *
13 // copies and that both the copyright notice and this permission notice *
14 // appear in the supporting documentation. The authors make no claims *
15 // about the suitability of this software for any purpose. It is *
16 // provided "as is" without express or implied warranty. *
18 //***************************************************************************
20 #include "AliTPCtrackerCA.h"
23 #include "Riostream.h"
24 //#include "AliCluster.h"
25 #include "AliTPCClustersRow.h"
26 #include "AliTPCParam.h"
27 #include "AliTPCClusterParam.h"
30 #include "AliRunLoader.h"
33 #include "AliHLTTPCCAGBTracker.h"
34 #include "AliHLTTPCCAGBHit.h"
35 #include "AliHLTTPCCAGBTrack.h"
36 #include "AliHLTTPCCAPerformance.h"
37 #include "AliHLTTPCCAParam.h"
38 #include "AliHLTTPCCATrackConvertor.h"
39 #include "AliHLTTPCCATracker.h"
42 #include "AliTPCLoader.h"
44 #include "AliTPCclusterMI.h"
45 #include "AliTPCTransform.h"
46 #include "AliTPCcalibDB.h"
47 #include "AliTPCtrack.h"
48 #include "AliTPCseed.h"
49 #include "AliESDtrack.h"
50 #include "AliESDEvent.h"
51 #include "AliTrackReference.h"
52 #include "TStopwatch.h"
54 //#include <fstream.h>
56 ClassImp(AliTPCtrackerCA)
58 AliTPCtrackerCA::AliTPCtrackerCA()
59 :AliTracker(),fkParam(0), fClusters(0), fNClusters(0), fHLTTracker(0),fDoHLTPerformance(0),fDoHLTPerformanceClusters(0),fStatNEvents(0)
61 //* default constructor
64 AliTPCtrackerCA::AliTPCtrackerCA(const AliTPCtrackerCA &):
65 AliTracker(),fkParam(0), fClusters(0), fNClusters(0), fHLTTracker(0),fDoHLTPerformance(0),fDoHLTPerformanceClusters(0),fStatNEvents(0)
70 const AliTPCtrackerCA & AliTPCtrackerCA::operator=(const AliTPCtrackerCA& ) const
77 AliTPCtrackerCA::~AliTPCtrackerCA()
80 if( fClusters ) delete[] fClusters;
81 if( fHLTTracker ) delete fHLTTracker;
84 //#include "AliHLTTPCCADisplay.h"
86 AliTPCtrackerCA::AliTPCtrackerCA(const AliTPCParam *par):
87 AliTracker(),fkParam(par), fClusters(0), fNClusters(0), fHLTTracker(0),fDoHLTPerformance(0),fDoHLTPerformanceClusters(0),fStatNEvents(0)
91 fDoHLTPerformance = 0;
92 fDoHLTPerformanceClusters = 0;
94 fHLTTracker = new AliHLTTPCCAGBTracker;
95 fHLTTracker->SetNSlices( fkParam->GetNSector()/2 );
97 if( fDoHLTPerformance ){
98 AliHLTTPCCAPerformance::Instance().SetTracker( fHLTTracker );
101 for( Int_t iSlice=0; iSlice<fHLTTracker->NSlices(); iSlice++ ){
103 Float_t bz = AliTracker::GetBz();
105 Float_t inRmin = fkParam->GetInnerRadiusLow();
106 //Float_t inRmax = fkParam->GetInnerRadiusUp();
107 //Float_t outRmin = fkParam->GetOuterRadiusLow();
108 Float_t outRmax = fkParam->GetOuterRadiusUp();
109 Float_t plusZmin = 0.0529937;
110 Float_t plusZmax = 249.778;
111 Float_t minusZmin = -249.645;
112 Float_t minusZmax = -0.0799937;
113 Float_t dalpha = 0.349066;
114 Float_t alpha = 0.174533 + dalpha*iSlice;
116 Bool_t zPlus = (iSlice<18 );
117 Float_t zMin = zPlus ?plusZmin :minusZmin;
118 Float_t zMax = zPlus ?plusZmax :minusZmax;
119 //TPCZmin = -249.645, ZMax = 249.778
120 //Float_t rMin = inRmin;
121 //Float_t rMax = outRmax;
123 Float_t padPitch = 0.4;
124 Float_t sigmaZ = 0.228808;
126 Int_t nRows = fkParam->GetNRowLow()+fkParam->GetNRowUp();
128 for( Int_t irow=0; irow<fkParam->GetNRowLow(); irow++){
129 rowX[irow] = fkParam->GetPadRowRadiiLow(irow);
131 for( Int_t irow=0; irow<fkParam->GetNRowUp(); irow++){
132 rowX[fkParam->GetNRowLow()+irow] = fkParam->GetPadRowRadiiUp(irow);
134 AliHLTTPCCAParam param;
135 param.Initialize( iSlice, nRows, rowX, alpha, dalpha,
136 inRmin, outRmax, zMin, zMax, padPitch, sigmaZ, bz );
137 param.SetHitPickUpFactor( 1. );
138 param.SetMaxTrackMatchDRow( 5 );
139 param.SetTrackConnectionFactor( 3.5 );
141 AliTPCClusterParam * clparam = AliTPCcalibDB::Instance()->GetClusterParam();
142 for( Int_t iRow=0; iRow<nRows; iRow++ ){
143 Int_t type = (iRow<63) ? 0: ( (iRow>126) ? 1:2 );
144 for( int iyz=0; iyz<2; iyz++ ){
145 for( int k=0; k<7; k++ ){
146 //std::cout<<param.fParamS0Par[iyz][type][k]<<" "<<clparam->fParamS0Par[iyz][type][k] - param.fParamS0Par[iyz][type][k]<<std::endl;
147 param.SetParamS0Par(iyz,type,k,clparam->fParamS0Par[iyz][type][k]);
151 fHLTTracker->Slices()[iSlice].Initialize( param );
157 Int_t AliTPCtrackerCA::LoadClusters (TTree * fromTree)
159 // load clusters to the local arrays
161 if( fClusters ) delete[] fClusters;
163 fHLTTracker->StartEvent();
164 if( fDoHLTPerformance ) AliHLTTPCCAPerformance::Instance().StartEvent();
166 if( !fkParam ) return 1;
169 while( fDoHLTPerformance ){
171 AliRunLoader *rl = AliRunLoader::Instance();//gAlice->GetRunLoader();
173 rl->LoadKinematics();
174 AliStack *stack = rl->Stack();
177 AliHLTTPCCAPerformance::Instance().SetNMCTracks( stack->GetNtrack() );
179 for( Int_t itr=0; itr<stack->GetNtrack(); itr++ ){
180 TParticle *part = stack->Particle(itr);
181 AliHLTTPCCAPerformance::Instance().ReadMCTrack( itr, part );
184 { // check for MC tracks at the TPC entrance
187 isTPC = new Bool_t [stack->GetNtrack()];
188 for( Int_t i=0; i<stack->GetNtrack(); i++ ) isTPC[i] = 0;
190 TTree *mcTree = rl->TreeTR();
192 TBranch *branch=mcTree->GetBranch("TrackReferences");
194 TClonesArray tpcdummy("AliTrackReference",1000), *tpcRefs=&tpcdummy;
195 branch->SetAddress(&tpcRefs);
196 Int_t nr=(Int_t)mcTree->GetEntries();
197 for (Int_t r=0; r<nr; r++) {
199 Int_t nref = tpcRefs->GetEntriesFast();
201 AliTrackReference *tpcRef= 0x0;
202 for (Int_t iref=0; iref<nref; ++iref) {
203 tpcRef = (AliTrackReference*)tpcRefs->UncheckedAt(iref);
204 if (tpcRef->DetectorId() == AliTrackReference::kTPC) break;
207 if (!tpcRef) continue;
209 if( isTPC[tpcRef->Label()] ) continue;
211 AliHLTTPCCAPerformance::Instance().ReadMCTPCTrack(tpcRef->Label(),
212 tpcRef->X(),tpcRef->Y(),tpcRef->Z(),
213 tpcRef->Px(),tpcRef->Py(),tpcRef->Pz() );
214 isTPC[tpcRef->Label()] = 1;
217 if( isTPC ) delete[] isTPC;
220 while( fDoHLTPerformanceClusters ){
221 AliTPCLoader *tpcl = (AliTPCLoader*) rl->GetDetectorLoader("TPC");
223 if( tpcl->TreeH() == 0x0 ){
224 if( tpcl->LoadHits() ) break;
226 if( tpcl->TreeH() == 0x0 ) break;
228 AliTPC *tpc = (AliTPC*) gAlice->GetDetector("TPC");
229 Int_t nEnt=(Int_t)tpcl->TreeH()->GetEntries();
231 for (Int_t iEnt=0; iEnt<nEnt; iEnt++) {
233 tpcl->TreeH()->GetEvent(iEnt);
234 AliTPChit *phit = (AliTPChit*)tpc->FirstHit(-1);
235 for ( ; phit; phit=(AliTPChit*)tpc->NextHit() ) nPoints++;
237 AliHLTTPCCAPerformance::Instance().SetNMCPoints( nPoints );
239 for (Int_t iEnt=0; iEnt<nEnt; iEnt++) {
241 tpcl->TreeH()->GetEvent(iEnt);
242 AliTPChit *phit = (AliTPChit*)tpc->FirstHit(-1);
243 for ( ; phit; phit=(AliTPChit*)tpc->NextHit() ){
244 AliHLTTPCCAPerformance::Instance().ReadMCPoint( phit->GetTrack(),phit->X(), phit->Y(),phit->Z(),phit->Time(), phit->fSector%36);
252 TBranch * br = fromTree->GetBranch("Segment");
255 AliTPCClustersRow *clrow = new AliTPCClustersRow;
256 clrow->SetClass("AliTPCclusterMI");
258 clrow->GetArray()->ExpandCreateFast(10000);
260 br->SetAddress(&clrow);
263 Int_t nEnt=Int_t(fromTree->GetEntries());
266 for (Int_t i=0; i<nEnt; i++) {
269 fkParam->AdjustSectorRow(clrow->GetID(),sec,row);
270 fNClusters += clrow->GetArray()->GetEntriesFast();
273 fClusters = new AliTPCclusterMI [fNClusters];
274 fHLTTracker->SetNHits( fNClusters );
275 if( fDoHLTPerformance ) AliHLTTPCCAPerformance::Instance().SetNHits( fNClusters );
277 for (Int_t i=0; i<nEnt; i++) {
280 fkParam->AdjustSectorRow(clrow->GetID(),sec,row);
281 Int_t nClu = clrow->GetArray()->GetEntriesFast();
282 Float_t x = fkParam->GetPadRowRadii(sec,row);
283 for (Int_t icl=0; icl<nClu; icl++){
287 AliTPCclusterMI* cluster = (AliTPCclusterMI*)(clrow->GetArray()->At(icl));
288 if( !cluster ) continue;
289 lab0 = cluster->GetLabel(0);
290 lab1 = cluster->GetLabel(1);
291 lab2 = cluster->GetLabel(2);
293 AliTPCTransform *transform = AliTPCcalibDB::Instance()->GetTransform() ;
295 AliFatal("Tranformations not in calibDB");
297 Double_t xx[3]={cluster->GetRow(),cluster->GetPad(),cluster->GetTimeBin()};
298 Int_t id[1]={cluster->GetDetector()};
299 transform->Transform(xx,id,0,1);
300 //if (!AliTPCReconstructor::GetRecoParam()->GetBYMirror()){
301 //if (cluster->GetDetector()%36>17){
306 cluster->SetX(xx[0]);
307 cluster->SetY(xx[1]);
308 cluster->SetZ(xx[2]);
310 TGeoHMatrix *mat = fkParam->GetClusterMatrix(cluster->GetDetector());
311 Double_t pos[3]= {cluster->GetX(),cluster->GetY(),cluster->GetZ()};
312 Double_t posC[3]={cluster->GetX(),cluster->GetY(),cluster->GetZ()};
313 if (mat) mat->LocalToMaster(pos,posC);
315 // chack Loading of Geo matrices from GeoManager - TEMPORARY FIX
317 cluster->SetX(posC[0]);
318 cluster->SetY(posC[1]);
319 cluster->SetZ(posC[2]);
321 Float_t y = cluster->GetY();
322 Float_t z = cluster->GetZ();
326 row = row + fkParam->GetNRowLow();
330 fClusters[index] = *cluster;
331 fHLTTracker->ReadHit( x, y, z,
332 TMath::Sqrt(cluster->GetSigmaY2()), TMath::Sqrt(cluster->GetSigmaZ2()),
333 cluster->GetMax(), index, sec, row );
334 if( fDoHLTPerformance ) AliHLTTPCCAPerformance::Instance().ReadHitLabel(index, lab0, lab1, lab2 );
341 AliCluster * AliTPCtrackerCA::GetCluster(Int_t index) const
343 return &(fClusters[index]);
346 Int_t AliTPCtrackerCA::Clusters2Tracks( AliESDEvent *event )
349 //cout<<"Start of AliTPCtrackerCA"<<endl;
352 fHLTTracker->FindTracks();
353 //cout<<"Do performance.."<<endl;
354 if( fDoHLTPerformance ) AliHLTTPCCAPerformance::Instance().Performance();
356 if( 0 ) {// Write Event
357 if( fStatNEvents == 0 ){
359 geo.open("CAEvents/settings.dat", ios::out);
361 fHLTTracker->WriteSettings(geo);
368 sprintf( name,"CAEvents/%i.event.dat",fStatNEvents );
369 hits.open(name, ios::out);
370 if( hits.is_open() ){
371 fHLTTracker->WriteEvent(hits);
373 sprintf( name,"CAEvents/%i.tracks.dat",fStatNEvents );
374 tracks.open(name, ios::out);
375 fHLTTracker->WriteTracks(tracks);
378 if( fDoHLTPerformance ){
379 fstream mcevent, mcpoints;
381 sprintf( mcname,"CAEvents/%i.mcevent.dat",fStatNEvents );
382 mcevent.open(mcname, ios::out);
383 if( mcevent.is_open() ){
384 AliHLTTPCCAPerformance::Instance().WriteMCEvent(mcevent);
386 if(1 && fDoHLTPerformanceClusters ){
387 sprintf( mcname,"CAEvents/%i.mcpoints.dat",fStatNEvents );
388 mcpoints.open(mcname, ios::out);
389 if( mcpoints.is_open() ){
390 AliHLTTPCCAPerformance::Instance().WriteMCPoints(mcpoints);
401 Float_t bz = fHLTTracker->Slices()[0].Param().Bz();
403 for( Int_t itr=0; itr<fHLTTracker->NTracks(); itr++ ){
406 AliHLTTPCCAGBTrack &tCA = fHLTTracker->Tracks()[itr];
407 AliHLTTPCCATrackParam par = tCA.Param();
408 AliHLTTPCCATrackConvertor::GetExtParam( par, tTPC, tCA.Alpha(), bz );
409 tTPC.SetMass(0.13957);
410 tTPC.SetdEdx( tCA.DeDx() );
411 if( TMath::Abs(tTPC.GetSigned1Pt())>1./0.02 ) continue;
412 Int_t nhits = tCA.NHits();
415 firstHit = nhits-160;
419 tTPC.SetNumberOfClusters(nhits);
421 Float_t alpha = tCA.Alpha();
422 AliHLTTPCCATrackParam t0 = par;
423 for( Int_t ih=0; ih<nhits; ih++ ){
424 Int_t index = fHLTTracker->TrackHits()[tCA.FirstHitRef()+firstHit+ih];
425 AliHLTTPCCAGBHit &h = fHLTTracker->Hits()[index];
426 Int_t extIndex = h.ID();
427 tTPC.SetClusterIndex(ih, extIndex);
429 AliTPCclusterMI *c = &(fClusters[extIndex]);
430 tTPC.SetClusterPointer(h.IRow(), c );
431 AliTPCTrackerPoint &point = *(tTPC.GetTrackPoint(h.IRow()));
433 Int_t iSlice = h.ISlice();
434 AliHLTTPCCATracker &slice = fHLTTracker->Slices()[iSlice];
435 if( slice.Param().Alpha()!=alpha ){
436 if( ! t0.Rotate( slice.Param().Alpha() - alpha, .999 ) ) continue;
437 alpha = slice.Param().Alpha();
439 Float_t x = slice.Row(h.IRow()).X();
440 if( !t0.TransportToX( x, .999 ) ) continue;
442 slice.GetErrors2( h.IRow(), t0, sy2, sz2 );
443 point.SetSigmaY(c->GetSigmaY2()/sy2);
444 point.SetSigmaZ(c->GetSigmaZ2()/sz2);
445 point.SetAngleY(TMath::Abs(t0.GetSinPhi()/t0.GetCosPhi()));
446 point.SetAngleZ(TMath::Abs(t0.GetDzDs()));
450 tTPC.CookdEdx(0.02,0.6);
452 CookLabel(&tTPC,0.1);
455 tESD.UpdateTrackParams( &(tTPC),AliESDtrack::kTPCin);
456 //tESD.SetStatus( AliESDtrack::kTPCrefit );
457 //tESD.SetTPCPoints(tTPC.GetPoints());
458 Int_t ndedx = tTPC.GetNCDEDX(0);
459 Float_t sdedx = tTPC.GetSDEDX(0);
460 Float_t dedx = tTPC.GetdEdx();
461 tESD.SetTPCsignal(dedx, sdedx, ndedx);
464 event->AddTrack(&tESD);
468 static double time=0, time1 = 0;
469 static Int_t ncalls = 0;
470 time+=timer.CpuTime();
471 time1+=timer.RealTime();
473 //cout<<"\n\nCA tracker speed: cpu = "<<time/ncalls*1.e3<<" [ms/ev], real = "<<time1/ncalls*1.e3<<" [ms/ev], n calls = "<<ncalls<<endl<<endl;
475 //cout<<"End of AliTPCtrackerCA"<<endl;
480 Int_t AliTPCtrackerCA::RefitInward (AliESDEvent *event)
482 //* forward propagation of ESD tracks
484 Float_t bz = fHLTTracker->Slices()[0].Param().Bz();
485 Float_t xTPC = fkParam->GetInnerRadiusLow();
486 Float_t dAlpha = fkParam->GetInnerAngle()/180.*TMath::Pi();
487 Float_t yMax = xTPC*TMath::Tan(dAlpha/2.);
489 Int_t nentr=event->GetNumberOfTracks();
491 for (Int_t itr=0; itr<nentr; itr++) {
492 AliESDtrack *esd=event->GetTrack(itr);
493 ULong_t status=esd->GetStatus();
494 if (!(status&AliESDtrack::kTPCin)) continue;
495 AliHLTTPCCATrackParam t0;
496 AliHLTTPCCATrackConvertor::SetExtParam(t0,*esd, bz );
497 AliHLTTPCCATrackParam t = t0;
498 Float_t alpha = esd->GetAlpha();
501 Int_t nHits = esd->GetTPCclusters(hits);
503 // convert clluster indices to AliHLTTPCCAGBHit indices
505 for( Int_t i=0; i<nHits; i++ ) hits[i] = fHLTTracker->Ext2IntHitID(hits[i]);
507 Bool_t ok = fHLTTracker->FitTrack( t, t0, alpha, hits, nHits, dEdX, 0 );
509 if( t.TransportToXWithMaterial( xTPC, bz) ){
510 if (t.GetY() > yMax) {
511 if (t.Rotate(dAlpha)){
513 t.TransportToXWithMaterial( xTPC, bz);
515 } else if (t.GetY() <-yMax) {
516 if (t.Rotate(-dAlpha)){
518 t.TransportToXWithMaterial( xTPC, bz);
523 AliTPCtrack tt(*esd);
524 AliHLTTPCCATrackConvertor::GetExtParam(t,tt,alpha,bz);
525 esd->UpdateTrackParams( &tt,AliESDtrack::kTPCrefit);
531 Int_t AliTPCtrackerCA::PropagateBack(AliESDEvent *event)
534 //* backward propagation of ESD tracks
536 Float_t bz = fHLTTracker->Slices()[0].Param().Bz();
537 Int_t nentr=event->GetNumberOfTracks();
539 for (Int_t itr=0; itr<nentr; itr++) {
541 AliESDtrack *esd=event->GetTrack(itr);
542 ULong_t status=esd->GetStatus();
543 if (!(status&AliESDtrack::kTPCin)) continue;
545 AliHLTTPCCATrackParam t0;
546 AliHLTTPCCATrackConvertor::SetExtParam(t0,*esd, bz );
547 AliHLTTPCCATrackParam t = t0;
548 Float_t alpha = esd->GetAlpha();
551 Int_t nHits = esd->GetTPCclusters(hits);
553 // convert clluster indices to AliHLTTPCCAGBHit indices
555 for( Int_t i=0; i<nHits; i++ ) hits[i] = fHLTTracker->Ext2IntHitID(hits[i]);
557 Bool_t ok = fHLTTracker->FitTrack( t, t0, alpha, hits, nHits, dEdX, 1 );
559 AliTPCtrack tt(*esd);
560 AliHLTTPCCATrackConvertor::GetExtParam(t,tt,alpha,bz);
561 esd->UpdateTrackParams( &tt,AliESDtrack::kTPCout);