1 /**************************************************************************
2 * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ////////////////////////////////////////////////////
19 // Stand alone tracker class //
20 // Origin: Elisabetta Crescio //
21 // e-mail: crescio@to.infn.it //
22 // tracks are saved as AliITStrackV2 objects //
23 ////////////////////////////////////////////////////
29 #include <TObjArray.h>
33 #include "AliESDVertex.h"
34 #include "AliESDtrack.h"
35 #include "AliITSVertexer.h"
36 #include "AliITSclusterTable.h"
37 #include "AliITSRecPoint.h"
38 #include "AliITSgeomTGeo.h"
39 #include "AliITStrackSA.h"
40 #include "AliITStrackerSA.h"
43 ClassImp(AliITStrackerSA)
45 //____________________________________________________________________________
46 AliITStrackerSA::AliITStrackerSA():AliITStrackerMI(),
63 // Default constructor
67 //____________________________________________________________________________
68 AliITStrackerSA::AliITStrackerSA(const Char_t *geom):AliITStrackerMI(0),
86 // Standard constructor (Vertex is known and passed to this obj.)
88 AliWarning("\"geom\" is actually a dummy argument !");
96 //____________________________________________________________________________
97 AliITStrackerSA::AliITStrackerSA(const Char_t *geom, AliESDVertex *vert):AliITStrackerMI(0),
115 // Standard constructor (Vertex is known and passed to this obj.)
117 AliWarning("\"geom\" is actually a dummy argument !");
123 //____________________________________________________________________________
124 AliITStrackerSA::AliITStrackerSA(const Char_t *geom, AliITSVertexer *vertexer):AliITStrackerMI(0),
142 // Standard constructor (Vertex is unknown - vertexer is passed to this obj)
144 AliWarning("\"geom\" is actually a dummy argument !");
147 fVertexer = vertexer;
151 //____________________________________________________________________________
152 AliITStrackerSA::AliITStrackerSA(const AliITStrackerSA& tracker):AliITStrackerMI(),
153 fPhiEstimate(tracker.fPhiEstimate),
154 fLambdac(tracker.fLambdac),
155 fPhic(tracker.fPhic),
156 fCoef1(tracker.fCoef1),
157 fCoef2(tracker.fCoef2),
158 fCoef3(tracker.fCoef3),
159 fNloop(tracker.fNloop),
160 fPhiWin(tracker.fPhiWin),
161 fLambdaWin(tracker.fLambdaWin),
162 fVert(tracker.fVert),
163 fVertexer(tracker.fVertexer),
164 fListOfTracks(tracker.fListOfTracks),
165 fITSclusters(tracker.fITSclusters),
166 fSixPoints(tracker.fSixPoints),
167 fCluLayer(tracker.fCluLayer),
168 fCluCoord(tracker.fCluCoord) {
170 for(Int_t i=0;i<2;i++){
171 fPoint1[i]=tracker.fPoint1[i];
172 fPoint2[i]=tracker.fPoint2[i];
173 fPoint3[i]=tracker.fPoint3[i];
174 fPointc[i]=tracker.fPointc[i];
176 if(tracker.fVertexer && tracker.fVert){
177 fVert = new AliESDVertex(*tracker.fVert);
180 fVert = tracker.fVert;
182 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
183 fCluLayer[i] = tracker.fCluLayer[i];
184 fCluCoord[i] = tracker.fCluCoord[i];
187 //______________________________________________________________________
188 AliITStrackerSA& AliITStrackerSA::operator=(const AliITStrackerSA& source){
189 // Assignment operator.
190 this->~AliITStrackerSA();
191 new(this) AliITStrackerSA(source);
196 //____________________________________________________________________________
197 AliITStrackerSA::~AliITStrackerSA(){
199 // if fVertexer is not null, the AliESDVertex obj. is owned by this class
200 // and is deleted here
202 if(fVert)delete fVert;
207 if(fPhiWin)delete []fPhiWin;
208 if(fLambdaWin)delete []fLambdaWin;
209 fListOfTracks->Delete();
211 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
213 fCluLayer[i]->Delete();
220 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
222 fCluCoord[i]->Delete();
231 //____________________________________________________________________________
232 void AliITStrackerSA::Init(){
233 // Reset all data members
235 for(Int_t i=0;i<3;i++){fPoint1[i]=0;fPoint2[i]=0;fPoint3[i]=0;}
248 fListOfTracks=new TObjArray(0,0);
252 //_______________________________________________________________________
253 void AliITStrackerSA::ResetForFinding(){
254 // Reset data members used in all loops during track finding
256 for(Int_t i=0;i<3;i++){fPoint1[i]=0;fPoint2[i]=0;fPoint3[i]=0;}
264 fListOfTracks->Delete();
269 //______________________________________________________________________
270 Int_t AliITStrackerSA::FindTracks(AliESD* event){
272 // Track finder using the ESD object
275 //controllare numero cluster sui layer1 e 2 (morti?)
276 //non trova tracce...controllare..
279 Fatal("FindTracks","ITS cluster tree is not accessed - Abort!!!\n Please use method SetClusterTree to pass the pointer to the tree\n");
284 //Reads event and mark clusters of traks already found, with flag kITSin
285 Int_t nentr=event->GetNumberOfTracks();
287 AliESDtrack *track=event->GetTrack(nentr);
288 if (track->GetStatus()&AliESDtrack::kITSin==AliESDtrack::kITSin){
290 Int_t ncl = track->GetITSclusters(idx);
291 for(Int_t k=0;k<ncl;k++){
292 AliITSRecPoint* cll = (AliITSRecPoint*)GetCluster(idx[k]);
293 cll->SetBit(kSAflag);
298 Double_t primaryVertex[3];
299 event->GetVertex()->GetXYZ(primaryVertex);
300 //Creates TClonesArray with clusters for each layer. The clusters already used
301 //by AliITStrackerMI are not considered
303 Int_t nclusters[6]={0,0,0,0,0,0};
304 Int_t dmar[6]={0,0,0,0,0,0};
305 fCluLayer = new TClonesArray*[AliITSgeomTGeo::GetNLayers()];
306 fCluCoord = new TClonesArray*[AliITSgeomTGeo::GetNLayers()];
308 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
309 AliITSlayer &layer=fgLayers[i];
310 for(Int_t cli=0;cli<layer.GetNumberOfClusters();cli++){
311 AliITSRecPoint* cls = (AliITSRecPoint*)layer.GetCluster(cli);
312 if(cls->TestBit(kSAflag)==kTRUE) continue; //clusters used by TPC prol.
313 if(cls->GetQ()==0) continue; //fake clusters dead zones
317 fCluLayer[i] = new TClonesArray("AliITSRecPoint",nclusters[i]);
318 fCluCoord[i] = new TClonesArray("AliITSclusterTable",nclusters[i]);
322 Int_t * firstmod = new Int_t[AliITSgeomTGeo::GetNLayers()];
323 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
324 firstmod[i]=AliITSgeomTGeo::GetModuleIndex(i+1,1,1);
327 for(Int_t ilay=0;ilay<AliITSgeomTGeo::GetNLayers();ilay++){
328 TClonesArray &clulay = *fCluLayer[ilay];
329 TClonesArray &clucoo = *fCluCoord[ilay];
330 AliITSlayer &layer=fgLayers[ilay];
331 for(Int_t cli=0;cli<layer.GetNumberOfClusters();cli++){
332 AliITSRecPoint* cls = (AliITSRecPoint*)layer.GetCluster(cli);
333 if(cls->TestBit(kSAflag)==kTRUE) continue;
334 if(cls->GetQ()==0) continue;
335 Double_t phi=0;Double_t lambda=0;
336 Float_t x=0;Float_t y=0;Float_t z=0;
337 Float_t sx=0;Float_t sy=0;Float_t sz=0;
338 GetCoorAngles(cls,phi,lambda,x,y,z,primaryVertex);
339 GetCoorErrors(cls,sx,sy,sz);
340 new (clulay[dmar[ilay]]) AliITSRecPoint(*cls);
341 new (clucoo[dmar[ilay]]) AliITSclusterTable(x,y,z,sx,sy,sz,phi,lambda,cli);
350 //loop on the different windows
351 for(Int_t nloop=0;nloop<fNloop;nloop++){
352 for(Int_t ncl=0;ncl<fCluLayer[0]->GetEntries();ncl++){ //loop starting from layer 0
357 AliITSRecPoint* cl = (AliITSRecPoint*)fCluLayer[0]->At(ncl);
362 if (cl->GetQ()<=0) continue;
364 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(0,ncl);
365 fPhic = arr->GetPhi();
366 fLambdac = arr->GetLambda();
367 if (TMath::Abs(fLambdac)>0.26*TMath::Pi()) continue;
368 fPhiEstimate = fPhic;
369 AliITStrackSA* trs = new AliITStrackSA();
370 fPoint1[0]=primaryVertex[0];
371 fPoint1[1]=primaryVertex[1];
374 fPoint2[0]=arr->GetX();
375 fPoint2[1]=arr->GetY();
376 Int_t * nn = new Int_t[AliITSgeomTGeo::GetNLayers()];//counter for clusters on each layer
377 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){ nn[i]=0;}
378 nn[0] = SearchClusters(0,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
380 nn[1] = SearchClusters(1,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
383 fPoint3[0] = fPointc[0];
384 fPoint3[1] = fPointc[1];
386 nn[2] = SearchClusters(2,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
387 if(nn[1]==0 && nn[2]==0) pflag=0;
388 if(nn[2]!=0 && nn[1]!=0){ pflag=1; UpdatePoints();}
389 if(nn[2]!=0 && nn[1]==0){
391 fPoint3[0]=fPointc[0];
392 fPoint3[1]=fPointc[1];
395 nn[3] = SearchClusters(3,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
397 if(nn[3]!=0) UpdatePoints();
398 nn[4] = SearchClusters(4,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
400 if(nn[4]!=0) UpdatePoints();
401 nn[5] = SearchClusters(5,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
405 Int_t numberofpoints;
406 if(fSixPoints) numberofpoints=6; //check of the candidate track
407 else numberofpoints=5; //if track is good (with the required number
408 for(Int_t nnp=0;nnp<AliITSgeomTGeo::GetNLayers();nnp++){ //of points) it is written on file
409 if(nn[nnp]!=0) layOK+=1;
411 if(layOK>=numberofpoints){
413 AliITStrackV2* tr2 = FitTrack(trs,primaryVertex);
417 AliESDtrack outtrack;
418 outtrack.UpdateTrackParams(tr2,AliESDtrack::kITSin);
419 event->AddTrack(&outtrack);
428 }//end loop on clusters of layer1
433 //if 5/6 points are required, second loop starting
434 //from second layer, to find tracks with point of
438 // counter for clusters on each layer
439 Int_t * nn = new Int_t[AliITSgeomTGeo::GetNLayers()-1];
440 for(Int_t nloop=0;nloop<fNloop;nloop++){
441 Int_t ncl2=fCluLayer[1]->GetEntries();
442 while(ncl2--){ //loop starting from layer 2
445 AliITSRecPoint* cl = (AliITSRecPoint*)fCluLayer[1]->At(ncl2);
448 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(1,ncl2);
449 fPhic = arr->GetPhi();
450 fLambdac = arr->GetLambda();
451 fPhiEstimate = fPhic;
453 AliITStrackSA* trs = new AliITStrackSA();
454 fPoint1[0]=primaryVertex[0];
455 fPoint1[1]=primaryVertex[1];
457 fPoint2[0]=arr->GetX();
458 fPoint2[1]=arr->GetY();
459 for(Int_t kk=0;kk<AliITSgeomTGeo::GetNLayers()-1;kk++)nn[kk] = 0;
460 nn[0] = SearchClusters(1,fPhiWin[nloop],fLambdaWin[nloop],
461 trs,primaryVertex[2],pflag);
462 nn[1] = SearchClusters(2,fPhiWin[nloop],fLambdaWin[nloop],
463 trs,primaryVertex[2],pflag);
466 fPoint3[0]=fPointc[0];
467 fPoint3[1]=fPointc[1];
469 nn[2]= SearchClusters(3,fPhiWin[nloop],fLambdaWin[nloop],
470 trs,primaryVertex[2],pflag);
475 nn[3]= SearchClusters(4,fPhiWin[nloop],fLambdaWin[nloop],
476 trs,primaryVertex[2],pflag);
481 nn[4]=SearchClusters(5,fPhiWin[nloop],fLambdaWin[nloop],
482 trs,primaryVertex[2],pflag);
485 for(Int_t nnp=0;nnp<AliITSgeomTGeo::GetNLayers()-1;nnp++){
486 if(nn[nnp]!=0) fl+=1;
489 AliITStrackV2* tr2 = FitTrack(trs,primaryVertex);
494 AliESDtrack outtrack;
495 outtrack.UpdateTrackParams(tr2,AliESDtrack::kITSin);
496 event->AddTrack(&outtrack);
503 }//end loop on clusters of layer2
510 Info("FindTracks","Number of found tracks: %d",event->GetNumberOfTracks());
519 //________________________________________________________________________
521 AliITStrackV2* AliITStrackerSA::FitTrack(AliITStrackSA* tr,Double_t *primaryVertex){
522 //fit of the found track
525 Int_t * firstmod = new Int_t[AliITSgeomTGeo::GetNLayers()];
526 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
527 firstmod[i]=AliITSgeomTGeo::GetModuleIndex(i+1,1,1);
530 Int_t nclusters = tr->GetNumberOfClustersSA();
531 TObjArray** listlayer = new TObjArray*[AliITSgeomTGeo::GetNLayers()];
532 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
533 listlayer[i] = new TObjArray(0,0);
551 Int_t * nnn = new Int_t[AliITSgeomTGeo::GetNLayers()];
552 Int_t * kkk = new Int_t[AliITSgeomTGeo::GetNLayers()];
553 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) {nnn[i]=0;kkk[i]=0;}
555 for(Int_t ncl=0;ncl<nclusters;ncl++){
556 Int_t index = tr->GetClusterIndexSA(ncl);
557 AliITSRecPoint* cl = (AliITSRecPoint*)GetCluster(index);
558 if(cl->TestBit(kSAflag)==kTRUE) cl->ResetBit(kSAflag);
559 Int_t lay = (index & 0xf0000000) >> 28;
560 if(lay==0) { listlayer[0]->AddLast(cl); clind0[nnn[0]]=index;nnn[0]++;}
561 if(lay==1) { listlayer[1]->AddLast(cl); clind1[nnn[1]]=index;nnn[1]++;}
562 if(lay==2) { listlayer[2]->AddLast(cl); clind2[nnn[2]]=index;nnn[2]++;}
563 if(lay==3) { listlayer[3]->AddLast(cl); clind3[nnn[3]]=index;nnn[3]++;}
564 if(lay==4) { listlayer[4]->AddLast(cl); clind4[nnn[4]]=index;nnn[4]++;}
565 if(lay==5) { listlayer[5]->AddLast(cl); clind5[nnn[5]]=index;nnn[5]++;}
569 for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
570 for(Int_t ncl=0;ncl<tr->GetNumberOfMarked(nlay);ncl++){
571 Int_t mark = tr->GetClusterMark(nlay,ncl);
572 if(nlay==0) { mark0[kkk[0]]=mark;kkk[0]++;}
573 if(nlay==1) { mark1[kkk[1]]=mark;kkk[1]++;}
574 if(nlay==2) { mark2[kkk[2]]=mark;kkk[2]++;}
575 if(nlay==3) { mark3[kkk[3]]=mark;kkk[3]++;}
576 if(nlay==4) { mark4[kkk[4]]=mark;kkk[4]++;}
577 if(nlay==5) { mark5[kkk[5]]=mark;kkk[5]++;}
585 Int_t * end = new Int_t[AliITSgeomTGeo::GetNLayers()];
586 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
587 if(listlayer[i]->GetEntries()==0) end[i]=1;
588 else end[i]=listlayer[i]->GetEntries();
591 TClonesArray* listSA = new TClonesArray("AliITStrackSA");
592 TClonesArray &tri = *listSA;
595 if(end[0]==0) end[0]=1; //for tracks with cluster on layer 0 missing
596 for(Int_t l1=0;l1<end[0];l1++){//loop on layer 1
597 AliITSRecPoint* cl0 = (AliITSRecPoint*)listlayer[0]->At(l1);
598 Double_t x1,y1,z1,sx1,sy1,sz1;
599 Double_t x2,y2,z2,sx2,sy2,sz2;
600 AliITSRecPoint* p1=0;
601 AliITSRecPoint* p2=0;
602 Int_t index1=clind0[l1];
604 Int_t mrk1 = mark0[l1];
609 for(Int_t l2=0;l2<end[1];l2++){//loop on layer 2
610 AliITSRecPoint* cl1 = (AliITSRecPoint*)listlayer[1]->At(l2);
613 for(Int_t l3=0;l3<end[2];l3++){ //loop on layer 3
614 AliITSRecPoint* cl2 = (AliITSRecPoint*)listlayer[2]->At(l3);
616 if(cl0==0 && cl1!=0) {
617 p2 = cl2;index1=clind2[l3];mrk1=mark2[l3];lay1=2;
619 module1 = p1->GetDetectorIndex()+firstmod[1];
621 if(cl0!=0 && cl1==0){
623 p2=cl2;index2=clind2[l3];mrk2=mark2[l3];lay2=2;
624 module1 = p1->GetDetectorIndex()+firstmod[0];
626 if(cl0!=0 && cl1!=0){
629 module1 = p1->GetDetectorIndex()+firstmod[0];
634 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(lay1,cln1);
635 AliITSclusterTable* arr1= (AliITSclusterTable*)GetClusterCoord(lay2,cln2);
649 Int_t layer,ladder,detector;
650 AliITSgeomTGeo::GetModuleId(module1,layer,ladder,detector);
651 Float_t yclu1 = p1->GetY();
652 Float_t zclu1 = p1->GetZ();
653 Double_t cv=Curvature(primaryVertex[0],primaryVertex[1],x1,y1,x2,y2);
655 Double_t tgl2 = (z2-z1)/TMath::Sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
656 Double_t phi2 = TMath::ATan2((y2-y1),(x2-x1));
658 for(Int_t l4=0;l4<end[3];l4++){ //loop on layer 4
659 AliITSRecPoint* cl3 = (AliITSRecPoint*)listlayer[3]->At(l4);
660 for(Int_t l5=0;l5<end[4];l5++){ //loop on layer 5
661 AliITSRecPoint* cl4 = (AliITSRecPoint*)listlayer[4]->At(l5);
662 for(Int_t l6=0;l6<end[5];l6++){ //loop on layer 6
663 AliITSRecPoint* cl5 = (AliITSRecPoint*)listlayer[5]->At(l6);
664 AliITStrackSA* trac = new AliITStrackSA(layer,ladder,detector,yclu1,zclu1,phi2,tgl2,cv,1);
667 trac->AddClusterV2(5,(clind5[l6] & 0x0fffffff)>>0);
668 trac->AddClusterMark(5,mark5[l6]);
671 trac->AddClusterV2(4,(clind4[l5] & 0x0fffffff)>>0);
672 trac->AddClusterMark(4,mark4[l5]);
675 trac->AddClusterV2(3,(clind3[l4] & 0x0fffffff)>>0);
676 trac->AddClusterMark(3,mark3[l4]);
679 trac->AddClusterV2(2,(clind2[l3] & 0x0fffffff)>>0);
680 trac->AddClusterMark(2,mark2[l3]);
683 trac->AddClusterV2(1,(clind1[l2] & 0x0fffffff)>>0);
684 trac->AddClusterMark(1,mark1[l2]);
687 trac->AddClusterV2(0,(clind0[l1] & 0x0fffffff)>>0);
688 trac->AddClusterMark(0,mark0[l1]);
690 //fit with Kalman filter using AliITStrackerMI::RefitAt()
693 AliITStrackMI* ot = new AliITStrackSA(*trac);
695 ot->ResetCovariance(10.);
698 if(RefitAt(49.,ot,trac)){ //fit from layer 1 to layer 6
699 AliITStrackMI *otrack2 = new AliITStrackMI(*ot);
700 otrack2->ResetCovariance(10.);
701 otrack2->ResetClusters();
702 //fit from layer 6 to layer 1
703 if(RefitAt(3.7,otrack2,ot)) {
704 fListOfTracks->AddLast(otrack2);
705 new (tri[nlist]) AliITStrackSA(*trac);
727 Int_t dim=fListOfTracks->GetEntries();
729 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
739 Int_t lowchi2 = FindTrackLowChiSquare(fListOfTracks,dim);
740 AliITStrackV2* otrack =(AliITStrackV2*)fListOfTracks->At(lowchi2);
741 AliITStrackSA* trsa = (AliITStrackSA*)listSA->At(lowchi2);
744 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
753 Int_t * indexc = new Int_t[AliITSgeomTGeo::GetNLayers()];
754 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) indexc[i]=0;
755 for(Int_t nind=0;nind<otrack->GetNumberOfClusters();nind++){
756 indexc[nind] = otrack->GetClusterIndex(nind);
758 AliITSRecPoint* cl0 = (AliITSRecPoint*)GetCluster(indexc[0]);
759 AliITSRecPoint* cl1 = (AliITSRecPoint*)GetCluster(indexc[1]);
760 AliITSRecPoint* cl2 = (AliITSRecPoint*)GetCluster(indexc[2]);
761 AliITSRecPoint* cl3 = (AliITSRecPoint*)GetCluster(indexc[3]);
762 AliITSRecPoint* cl4 = (AliITSRecPoint*)GetCluster(indexc[4]);
763 Int_t labl[3]={-1,-1,-1};
764 if(otrack->GetNumberOfClusters()==AliITSgeomTGeo::GetNLayers()){
765 AliITSRecPoint* cl5 = (AliITSRecPoint*)GetCluster(indexc[5]);
766 labl[0]=cl5->GetLabel(0);
767 labl[1]=cl5->GetLabel(1);
768 labl[2]=cl5->GetLabel(2);
771 if(otrack->GetNumberOfClusters()==(AliITSgeomTGeo::GetNLayers()-1)){
776 Int_t numberofpoints;
777 if(fSixPoints) numberofpoints=6;
778 else numberofpoints=5;
779 CookLabel(otrack,0.); //MI change - to see fake ratio
780 Int_t label = Label(cl0->GetLabel(0),cl1->GetLabel(0),
781 cl2->GetLabel(0),cl3->GetLabel(0),
782 cl4->GetLabel(0),labl[0],
783 cl0->GetLabel(1),cl1->GetLabel(1),
784 cl2->GetLabel(1),cl3->GetLabel(1),
785 cl4->GetLabel(1),labl[1],
786 cl0->GetLabel(2),cl1->GetLabel(2),
787 cl2->GetLabel(2),cl3->GetLabel(2),
788 cl4->GetLabel(2),labl[2],numberofpoints);
790 otrack->SetLabel(label);
791 //remove clusters of found track
793 for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
794 for(Int_t cln=0;cln<trsa->GetNumberOfMarked(nlay);cln++){
795 Int_t index = trsa->GetClusterMark(nlay,cln);
796 fCluLayer[nlay]->RemoveAt(index);
797 RemoveClusterCoord(nlay,index);
798 fCluLayer[nlay]->Compress();
804 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
815 //_______________________________________________________
816 Int_t AliITStrackerSA::SearchClusters(Int_t layer,Double_t phiwindow,Double_t lambdawindow, AliITStrackSA* trs,Double_t /*zvertex*/,Int_t pflag){
817 //function used to to find the clusters associated to the track
819 AliITSlayer &lay = fgLayers[layer];
820 Double_t r=lay.GetR();
822 Float_t cx1,cx2,cy1,cy2;
823 FindEquation(fPoint1[0],fPoint1[1],fPoint2[0],fPoint2[1],fPoint3[0],fPoint3[1],fCoef1,fCoef2,fCoef3);
824 if (FindIntersection(fCoef1,fCoef2,fCoef3,-r*r,cx1,cy1,cx2,cy2)==0)
826 Double_t fi1=TMath::ATan2(cy1,cx1);
827 Double_t fi2=TMath::ATan2(cy2,cx2);
828 fPhiEstimate=ChoosePoint(fi1,fi2,fPhic);
832 Int_t ncl = fCluLayer[layer]->GetEntries();
833 for (Int_t index=0; index<ncl; index++) {
834 AliITSRecPoint *c = (AliITSRecPoint*)fCluLayer[layer]->At(index);
836 if (c->GetQ()<=0) continue;
838 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(layer,index);
839 Double_t phi = arr->GetPhi();
840 if (TMath::Abs(phi-fPhiEstimate)>phiwindow) continue;
842 Double_t lambda = arr->GetLambda();
843 if (TMath::Abs(lambda-fLambdac)>lambdawindow) continue;
845 if(trs->GetNumberOfClustersSA()==trs->GetMaxNumberOfClusters()) return 0;
846 if(trs->GetNumberOfMarked(layer)==trs->GetMaxNMarkedPerLayer()) return 0;
847 Int_t orind = arr->GetOrInd();
848 trs->AddClusterSA(layer,orind);
849 trs->AddClusterMark(layer,index);
855 fPointc[0]=arr->GetX();
856 fPointc[1]=arr->GetY();
862 //________________________________________________________________
863 void AliITStrackerSA::UpdatePoints(){
864 //update of points for the estimation of the curvature
866 fPoint2[0]=fPoint3[0];
867 fPoint2[1]=fPoint3[1];
868 fPoint3[0]=fPointc[0];
869 fPoint3[1]=fPointc[1];
874 //___________________________________________________________________
875 Int_t AliITStrackerSA::FindEquation(Float_t x1, Float_t y1, Float_t x2, Float_t y2, Float_t x3, Float_t y3,Float_t& a, Float_t& b, Float_t& c){
877 //given (x,y) of three recpoints (in global coordinates)
878 //returns the parameters a,b,c of circonference x*x + y*y +a*x + b*y +c
880 Float_t den = (x3-x1)*(y2-y1)-(x2-x1)*(y3-y1);
882 a = ((y3-y1)*(x2*x2+y2*y2-x1*x1-y1*y1)-(y2-y1)*(x3*x3+y3*y3-x1*x1-y1*y1))/den;
883 b = -(x2*x2-x1*x1+y2*y2-y1*y1+a*(x2-x1))/(y2-y1);
884 c = -x1*x1-y1*y1-a*x1-b*y1;
887 //__________________________________________________________________________
888 Int_t AliITStrackerSA::FindIntersection(Float_t a1, Float_t b1, Float_t c1, Float_t c2,Float_t& x1,Float_t& y1, Float_t& x2, Float_t& y2){
890 //Finds the intersection between the circonference of the track and the circonference centered in (0,0) represented by one layer
891 //c2 is -rlayer*rlayer
895 Double_t aA = (b1*b1)/(a1*a1)+1;
896 Double_t bB = (-2*m*b1/(a1*a1));
897 Double_t cC = c2+(m*m)/(a1*a1);
898 Double_t dD = bB*bB-4*aA*cC;
901 y1 = (-bB+TMath::Sqrt(dD))/(2*aA);
902 y2 = (-bB-TMath::Sqrt(dD))/(2*aA);
903 x1 = (c2-c1-b1*y1)/a1;
904 x2 = (c2-c1-b1*y2)/a1;
908 //____________________________________________________________________
909 Double_t AliITStrackerSA::Curvature(Double_t x1,Double_t y1,Double_t
910 x2,Double_t y2,Double_t x3,Double_t y3){
912 //calculates the curvature of track
913 Double_t den = (x3-x1)*(y2-y1)-(x2-x1)*(y3-y1);
915 Double_t a = ((y3-y1)*(x2*x2+y2*y2-x1*x1-y1*y1)-(y2-y1)*(x3*x3+y3*y3-x1*x1-y1*y1))/den;
916 Double_t b = -(x2*x2-x1*x1+y2*y2-y1*y1+a*(x2-x1))/(y2-y1);
917 Double_t c = -x1*x1-y1*y1-a*x1-b*y1;
920 if((a*a+b*b-4*c)<0) return 0;
921 Double_t rad = TMath::Sqrt(a*a+b*b-4*c)/2.;
924 if((x1>0 && y1>0 && x1<xc)) rad*=-1;
925 if((x1<0 && y1>0 && x1<xc)) rad*=-1;
926 // if((x1<0 && y1<0 && x1<xc)) rad*=-1;
927 // if((x1>0 && y1<0 && x1<xc)) rad*=-1;
934 //____________________________________________________________________
935 Double_t AliITStrackerSA::ChoosePoint(Double_t p1, Double_t p2, Double_t pp){
937 //Returns the point closest to pp
939 Double_t diff1 = p1-pp;
940 Double_t diff2 = p2-pp;
942 if(TMath::Abs(diff1)<TMath::Abs(diff2)) fPhiEstimate=p1;
943 else fPhiEstimate=p2;
949 //_________________________________________________________________
950 Int_t AliITStrackerSA::FindTrackLowChiSquare(TObjArray* tracklist, Int_t dim) const {
951 // returns track with lowes chi square
953 //AliITStrackV2* trk = (AliITStrackV2*)tracklist->At(0);
957 //if(dim==0) return 0;
958 Double_t * chi2 = new Double_t[dim];
959 Int_t * index = new Int_t[dim];
960 for(Int_t i=0;i<dim;i++){
961 AliITStrackV2* trk = (AliITStrackV2*)tracklist->At(i);
962 chi2[i]=trk->GetChi2();
966 Int_t w=0;Double_t value;
969 for(Int_t j=w+1;j<dim;j++){
987 //__________________________________________________________
988 Int_t AliITStrackerSA::FindLabel(Int_t l1, Int_t l2, Int_t l3, Int_t l4, Int_t l5, Int_t l6){
990 //function used to determine the track label
992 Int_t lb[6] = {l1,l2,l3,l4,l5,l6};
993 Int_t aa[6]={1,1,1,1,1,1};
996 Int_t k=0;Int_t w=0;Int_t num=6;
1001 for(Int_t i=k+1;i<num;i++){
1003 if(lb[k]==lb[i] && aa[k]!=0){
1014 for(Int_t j=0;j<6;j++){
1026 if(num==6) return lb[5];
1030 //_____________________________________________________________________________
1031 Int_t AliITStrackerSA::Label(Int_t gl1, Int_t gl2, Int_t gl3, Int_t gl4, Int_t gl5, Int_t gl6,Int_t gl7, Int_t gl8, Int_t gl9, Int_t gl10,Int_t gl11,
1032 Int_t gl12, Int_t gl13, Int_t gl14,Int_t gl15, Int_t gl16, Int_t gl17, Int_t gl18, Int_t numberofpoints){
1035 //function used to assign label to the found track. If track is fake, the label is negative
1037 Int_t lb0[6] = {gl1,gl2,gl3,gl4,gl5,gl6};
1038 Int_t lb1[6] = {gl7,gl8,gl9,gl10,gl11,gl12};
1039 Int_t lb2[6] = {gl13,gl14,gl15,gl16,gl17,gl18};
1040 Int_t ll=FindLabel(lb0[0],lb0[1],lb0[2],lb0[3],lb0[4],lb0[5]);
1041 Int_t lflag=0;Int_t num=6;
1042 if(lb0[5]==-1 && lb1[5]==-1 && lb2[5]==-1) num=5;
1044 for(Int_t i=0;i<num;i++){
1045 if(lb0[i]==ll || lb1[i]==ll || lb2[i]==ll) lflag+=1;
1048 if(lflag>=numberofpoints) return ll;
1054 //_____________________________________________________________________________
1055 void AliITStrackerSA::SetWindowSizes(Int_t n, Double_t *phi, Double_t *lam){
1056 // Set sizes of the phi and lambda windows used for track finding
1058 if(phi){ // user defined values
1059 fPhiWin = new Double_t[fNloop];
1060 fLambdaWin = new Double_t[fNloop];
1061 for(Int_t k=0;k<fNloop;k++){
1063 fLambdaWin[k]=lam[k];
1066 else { // default values
1068 Double_t phid[33] = {0.002,0.003,0.004,0.0045,0.0047,
1069 0.005,0.0053,0.0055,
1070 0.006,0.0063,0.0065,0.007,0.0073,0.0075,0.0077,
1071 0.008,0.0083,0.0085,0.0087,0.009,0.0095,0.0097,
1072 0.01,0.0105,0.011,0.0115,0.012,0.0125,0.013,0.0135,0.0140,0.0145};
1073 Double_t lambdad[33] = {0.003,0.004,0.005,0.005,0.005,
1075 0.006,0.006,0.006,0.007,0.007,0.007,0.007,
1076 0.007,0.007,0.007,0.007,0.007,0.007,0.007,
1077 0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008};
1084 fPhiWin = new Double_t[fNloop];
1085 fLambdaWin = new Double_t[fNloop];
1087 for(Int_t k=0;k<fNloop;k++){
1089 fLambdaWin[k]=lambdad[k];
1095 //_______________________________________________________________________
1096 void AliITStrackerSA::GetCoorAngles(AliITSRecPoint* cl,Double_t &phi,Double_t &lambda, Float_t &x, Float_t &y,Float_t &z,Double_t* vertex){
1097 //Returns values of phi (azimuthal) and lambda angles for a given cluster
1099 Double_t rot[9]; fGeom->GetRotMatrix(module,rot);
1100 Int_t lay,lad,det; fGeom->GetModuleId(module,lay,lad,det);
1101 Float_t tx,ty,tz; fGeom->GetTrans(lay,lad,det,tx,ty,tz);
1103 Double_t alpha=TMath::ATan2(rot[1],rot[0])+TMath::Pi();
1104 Double_t phi1=TMath::Pi()/2+alpha;
1105 if (lay==1) phi1+=TMath::Pi();
1107 Float_t cp=TMath::Cos(phi1), sp=TMath::Sin(phi1);
1108 Float_t r=tx*cp+ty*sp;
1110 xyz= r*cp - cl->GetY()*sp;
1111 y= r*sp + cl->GetY()*cp;
1115 cl->GetGlobalXYZ(xyz);
1120 phi=TMath::ATan2(y,x);
1121 lambda=TMath::ATan2(z-vertex[2],TMath::Sqrt((x-vertex[0])*(x-vertex[0])+(y-vertex[1])*(y-vertex[1])));
1124 //________________________________________________________________________
1125 void AliITStrackerSA::GetCoorErrors(AliITSRecPoint* cl,Float_t &sx,Float_t &sy, Float_t &sz){
1127 //returns sigmax, y, z of cluster in global coordinates
1129 Double_t rot[9]; fGeom->GetRotMatrix(module,rot);
1131 AliITSgeomTGeo::GetModuleId(module,lay,lad,det);
1133 Double_t alpha=TMath::ATan2(rot[1],rot[0])+TMath::Pi();
1134 Double_t phi=TMath::Pi()/2+alpha;
1135 if (lay==1) phi+=TMath::Pi();
1137 Float_t cp=TMath::Cos(phi), sp=TMath::Sin(phi);
1140 cl->GetGlobalCov(covm);
1141 sx=TMath::Sqrt(covm[0]);
1142 sy=TMath::Sqrt(covm[3]);
1143 sz=TMath::Sqrt(covm[5]);
1145 sx = TMath::Sqrt(sp*sp*cl->GetSigmaY2());
1146 sy = TMath::Sqrt(cp*cp*cl->GetSigmaY2());
1147 sz = TMath::Sqrt(cl->GetSigmaZ2());