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>
32 #include "AliESDEvent.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(),
65 // Default constructor
69 //____________________________________________________________________________
70 AliITStrackerSA::AliITStrackerSA(const Char_t *geom):AliITStrackerMI(0),
90 // Standard constructor (Vertex is known and passed to this obj.)
92 AliWarning("\"geom\" is actually a dummy argument !");
100 //____________________________________________________________________________
101 AliITStrackerSA::AliITStrackerSA(const Char_t *geom, AliESDVertex *vert):AliITStrackerMI(0),
121 // Standard constructor (Vertex is known and passed to this obj.)
123 AliWarning("\"geom\" is actually a dummy argument !");
129 //____________________________________________________________________________
130 AliITStrackerSA::AliITStrackerSA(const Char_t *geom, AliITSVertexer *vertexer):AliITStrackerMI(0),
150 // Standard constructor (Vertex is unknown - vertexer is passed to this obj)
152 AliWarning("\"geom\" is actually a dummy argument !");
155 fVertexer = vertexer;
159 //____________________________________________________________________________
160 AliITStrackerSA::AliITStrackerSA(const AliITStrackerSA& tracker):AliITStrackerMI(),
161 fPhiEstimate(tracker.fPhiEstimate),
162 fITSStandAlone(tracker.fITSStandAlone),
163 fLambdac(tracker.fLambdac),
164 fPhic(tracker.fPhic),
165 fCoef1(tracker.fCoef1),
166 fCoef2(tracker.fCoef2),
167 fCoef3(tracker.fCoef3),
168 fNloop(tracker.fNloop),
169 fPhiWin(tracker.fPhiWin),
170 fLambdaWin(tracker.fLambdaWin),
171 fVert(tracker.fVert),
172 fVertexer(tracker.fVertexer),
173 fListOfTracks(tracker.fListOfTracks),
174 fITSclusters(tracker.fITSclusters),
175 fSixPoints(tracker.fSixPoints),
176 fOuterStartLayer(tracker.fOuterStartLayer),
177 fCluLayer(tracker.fCluLayer),
178 fCluCoord(tracker.fCluCoord) {
180 for(Int_t i=0;i<2;i++){
181 fPoint1[i]=tracker.fPoint1[i];
182 fPoint2[i]=tracker.fPoint2[i];
183 fPoint3[i]=tracker.fPoint3[i];
184 fPointc[i]=tracker.fPointc[i];
186 if(tracker.fVertexer && tracker.fVert){
187 fVert = new AliESDVertex(*tracker.fVert);
190 fVert = tracker.fVert;
192 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
193 fCluLayer[i] = tracker.fCluLayer[i];
194 fCluCoord[i] = tracker.fCluCoord[i];
197 //______________________________________________________________________
198 AliITStrackerSA& AliITStrackerSA::operator=(const AliITStrackerSA& source){
199 // Assignment operator.
200 this->~AliITStrackerSA();
201 new(this) AliITStrackerSA(source);
206 //____________________________________________________________________________
207 AliITStrackerSA::~AliITStrackerSA(){
209 // if fVertexer is not null, the AliESDVertex obj. is owned by this class
210 // and is deleted here
212 if(fVert)delete fVert;
217 if(fPhiWin)delete []fPhiWin;
218 if(fLambdaWin)delete []fLambdaWin;
219 fListOfTracks->Delete();
221 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
223 fCluLayer[i]->Delete();
230 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
232 fCluCoord[i]->Delete();
241 //____________________________________________________________________________
242 Int_t AliITStrackerSA::Clusters2Tracks(AliESDEvent *event){
243 // This method is used to find and fit the tracks. By default the corresponding
244 // method in the parent class is invoked. In this way a combined tracking
245 // TPC+ITS is performed. If the flag fITSStandAlone is true, the tracking
246 // is done in the ITS only. In the standard reconstruction chain this option
247 // can be set via AliReconstruction::SetOption("ITS","onlyITS")
250 rc=AliITStrackerMI::Clusters2Tracks(event);
253 AliDebug(1,"Stand Alone flag set: doing tracking in ITS alone\n");
255 if(!rc) rc=FindTracks(event);
259 //____________________________________________________________________________
260 void AliITStrackerSA::Init(){
261 // Reset all data members
263 for(Int_t i=0;i<3;i++){fPoint1[i]=0;fPoint2[i]=0;fPoint3[i]=0;}
276 SetOuterStartLayer(0);
278 fListOfTracks=new TObjArray(0,0);
282 //_______________________________________________________________________
283 void AliITStrackerSA::ResetForFinding(){
284 // Reset data members used in all loops during track finding
286 for(Int_t i=0;i<3;i++){fPoint1[i]=0;fPoint2[i]=0;fPoint3[i]=0;}
294 fListOfTracks->Delete();
299 //______________________________________________________________________
300 Int_t AliITStrackerSA::FindTracks(AliESDEvent* event){
302 // Track finder using the ESD object
305 //controllare numero cluster sui layer1 e 2 (morti?)
306 //non trova tracce...controllare..
309 Fatal("FindTracks","ITS cluster tree is not accessed - Abort!!!\n Please use method SetClusterTree to pass the pointer to the tree\n");
314 //Reads event and mark clusters of traks already found, with flag kITSin
315 Int_t nentr=event->GetNumberOfTracks();
317 AliESDtrack *track=event->GetTrack(nentr);
318 if (track->GetStatus()&AliESDtrack::kITSin==AliESDtrack::kITSin){
320 Int_t ncl = track->GetITSclusters(idx);
321 for(Int_t k=0;k<ncl;k++){
322 AliITSRecPoint* cll = (AliITSRecPoint*)GetCluster(idx[k]);
323 cll->SetBit(kSAflag);
329 Double_t primaryVertex[3];
330 event->GetVertex()->GetXYZ(primaryVertex);
331 //Creates TClonesArray with clusters for each layer. The clusters already used
332 //by AliITStrackerMI are not considered
334 Int_t nclusters[6]={0,0,0,0,0,0};
335 Int_t dmar[6]={0,0,0,0,0,0};
336 fCluLayer = new TClonesArray*[AliITSgeomTGeo::GetNLayers()];
337 fCluCoord = new TClonesArray*[AliITSgeomTGeo::GetNLayers()];
339 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
340 AliITSlayer &layer=fgLayers[i];
341 for(Int_t cli=0;cli<layer.GetNumberOfClusters();cli++){
342 AliITSRecPoint* cls = (AliITSRecPoint*)layer.GetCluster(cli);
343 if(cls->TestBit(kSAflag)==kTRUE) continue; //clusters used by TPC prol.
344 if(cls->GetQ()==0) continue; //fake clusters dead zones
348 fCluLayer[i] = new TClonesArray("AliITSRecPoint",nclusters[i]);
349 fCluCoord[i] = new TClonesArray("AliITSclusterTable",nclusters[i]);
353 Int_t * firstmod = new Int_t[AliITSgeomTGeo::GetNLayers()];
354 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
355 firstmod[i]=AliITSgeomTGeo::GetModuleIndex(i+1,1,1);
358 for(Int_t ilay=0;ilay<AliITSgeomTGeo::GetNLayers();ilay++){
359 TClonesArray &clulay = *fCluLayer[ilay];
360 TClonesArray &clucoo = *fCluCoord[ilay];
361 AliITSlayer &layer=fgLayers[ilay];
362 for(Int_t cli=0;cli<layer.GetNumberOfClusters();cli++){
363 AliITSRecPoint* cls = (AliITSRecPoint*)layer.GetCluster(cli);
364 if(cls->TestBit(kSAflag)==kTRUE) continue;
365 if(cls->GetQ()==0) continue;
366 Double_t phi=0;Double_t lambda=0;
367 Float_t x=0;Float_t y=0;Float_t z=0;
368 Float_t sx=0;Float_t sy=0;Float_t sz=0;
369 GetCoorAngles(cls,phi,lambda,x,y,z,primaryVertex);
370 GetCoorErrors(cls,sx,sy,sz);
371 new (clulay[dmar[ilay]]) AliITSRecPoint(*cls);
372 new (clucoo[dmar[ilay]]) AliITSclusterTable(x,y,z,sx,sy,sz,phi,lambda,cli);
380 //loop on the different windows
381 for(Int_t nloop=0;nloop<fNloop;nloop++){
382 for(Int_t ncl=0;ncl<fCluLayer[0]->GetEntries();ncl++){ //loop starting from layer 0
387 AliITSRecPoint* cl = (AliITSRecPoint*)fCluLayer[0]->At(ncl);
392 if (cl->GetQ()<=0) continue;
394 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(0,ncl);
395 fPhic = arr->GetPhi();
396 fLambdac = arr->GetLambda();
397 if (TMath::Abs(fLambdac)>0.26*TMath::Pi()) continue;
398 fPhiEstimate = fPhic;
399 AliITStrackSA* trs = new AliITStrackSA();
400 fPoint1[0]=primaryVertex[0];
401 fPoint1[1]=primaryVertex[1];
404 fPoint2[0]=arr->GetX();
405 fPoint2[1]=arr->GetY();
406 Int_t * nn = new Int_t[AliITSgeomTGeo::GetNLayers()];//counter for clusters on each layer
407 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){ nn[i]=0;}
408 nn[0] = SearchClusters(0,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
410 nn[1] = SearchClusters(1,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
413 fPoint3[0] = fPointc[0];
414 fPoint3[1] = fPointc[1];
416 nn[2] = SearchClusters(2,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
417 if(nn[1]==0 && nn[2]==0) pflag=0;
418 if(nn[2]!=0 && nn[1]!=0){ pflag=1; UpdatePoints();}
419 if(nn[2]!=0 && nn[1]==0){
421 fPoint3[0]=fPointc[0];
422 fPoint3[1]=fPointc[1];
425 nn[3] = SearchClusters(3,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
427 if(nn[3]!=0) UpdatePoints();
428 nn[4] = SearchClusters(4,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
430 if(nn[4]!=0) UpdatePoints();
431 nn[5] = SearchClusters(5,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
435 Int_t numberofpoints;
436 if(fSixPoints) numberofpoints=6; //check of the candidate track
437 else numberofpoints=5; //if track is good (with the required number
438 for(Int_t nnp=0;nnp<AliITSgeomTGeo::GetNLayers();nnp++){ //of points) it is written on file
439 if(nn[nnp]!=0) layOK+=1;
441 if(layOK>=numberofpoints){
443 AliITStrackV2* tr2 = FitTrack(trs,primaryVertex);
447 AliESDtrack outtrack;
448 outtrack.UpdateTrackParams(tr2,AliESDtrack::kITSin);
449 event->AddTrack(&outtrack);
457 }//end loop on clusters of layer1
462 //if 5/6 points are required, second loop starting
463 //from second layer (SPD2), to find tracks with point of
466 //printf("looking from SPD2\n");
467 // counter for clusters on each layer
468 Int_t * nn = new Int_t[AliITSgeomTGeo::GetNLayers()-1];
469 for(Int_t nloop=0;nloop<fNloop;nloop++){
470 Int_t ncl2=fCluLayer[1]->GetEntries();
471 while(ncl2--){ //loop starting from layer 2
474 AliITSRecPoint* cl = (AliITSRecPoint*)fCluLayer[1]->At(ncl2);
477 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(1,ncl2);
478 fPhic = arr->GetPhi();
479 fLambdac = arr->GetLambda();
480 fPhiEstimate = fPhic;
482 AliITStrackSA* trs = new AliITStrackSA();
483 fPoint1[0]=primaryVertex[0];
484 fPoint1[1]=primaryVertex[1];
486 fPoint2[0]=arr->GetX();
487 fPoint2[1]=arr->GetY();
488 for(Int_t kk=0;kk<AliITSgeomTGeo::GetNLayers()-1;kk++)nn[kk] = 0;
489 nn[0] = SearchClusters(1,fPhiWin[nloop],fLambdaWin[nloop],
490 trs,primaryVertex[2],pflag);
491 nn[1] = SearchClusters(2,fPhiWin[nloop],fLambdaWin[nloop],
492 trs,primaryVertex[2],pflag);
495 fPoint3[0]=fPointc[0];
496 fPoint3[1]=fPointc[1];
498 nn[2]= SearchClusters(3,fPhiWin[nloop],fLambdaWin[nloop],
499 trs,primaryVertex[2],pflag);
504 nn[3]= SearchClusters(4,fPhiWin[nloop],fLambdaWin[nloop],
505 trs,primaryVertex[2],pflag);
510 nn[4]=SearchClusters(5,fPhiWin[nloop],fLambdaWin[nloop],
511 trs,primaryVertex[2],pflag);
514 for(Int_t nnp=0;nnp<AliITSgeomTGeo::GetNLayers()-1;nnp++){
515 if(nn[nnp]!=0) fl+=1;
518 AliITStrackV2* tr2 = FitTrack(trs,primaryVertex);
523 AliESDtrack outtrack;
524 outtrack.UpdateTrackParams(tr2,AliESDtrack::kITSin);
525 event->AddTrack(&outtrack);
531 }//end loop on clusters of layer2
539 // search for tracks starting from SPD2, SDD1, SDD2, SSD2
540 // for cosmics (A. Dainese 31.07.07)
541 if(fOuterStartLayer>0) {
542 for(Int_t innLay=1; innLay<=fOuterStartLayer; innLay++) {
543 printf("Searching from layer %d outward\n",innLay);
544 // counter for clusters on each layer
545 Int_t * nn = new Int_t[AliITSgeomTGeo::GetNLayers()-innLay];
546 for(Int_t nloop=0;nloop<fNloop;nloop++){
547 Int_t nclInnLay=fCluLayer[innLay]->GetEntries();
548 while(nclInnLay--){ //loop starting from layer innLay
551 AliITSRecPoint* cl = (AliITSRecPoint*)fCluLayer[innLay]->At(nclInnLay);
554 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(innLay,nclInnLay);
555 fPhic = arr->GetPhi();
556 fLambdac = arr->GetLambda();
557 fPhiEstimate = fPhic;
559 AliITStrackSA* trs = new AliITStrackSA();
560 fPoint1[0]=primaryVertex[0];
561 fPoint1[1]=primaryVertex[1];
562 fPoint2[0]=arr->GetX();
563 fPoint2[1]=arr->GetY();
566 for(kk=0;kk<AliITSgeomTGeo::GetNLayers()-innLay;kk++) nn[kk] = 0;
569 nn[kk] = SearchClusters(innLay,fPhiWin[nloop],fLambdaWin[nloop],
570 trs,primaryVertex[2],pflag);
571 for(Int_t nextLay=innLay+1; nextLay<AliITSgeomTGeo::GetNLayers(); nextLay++) {
573 nn[kk] = SearchClusters(nextLay,fPhiWin[nloop],fLambdaWin[nloop],
574 trs,primaryVertex[2],pflag);
578 fPoint3[0]=fPointc[0];
579 fPoint3[1]=fPointc[1];
587 for(Int_t nnp=0;nnp<AliITSgeomTGeo::GetNLayers()-innLay;nnp++){
588 if(nn[nnp]!=0) fl+=1;
590 if(fl>=AliITSgeomTGeo::GetNLayers()-innLay){
591 AliITStrackV2* tr2 = FitShortTrack(trs,primaryVertex,innLay);
596 AliESDtrack outtrack;
597 outtrack.UpdateTrackParams(tr2,AliESDtrack::kITSin);
598 event->AddTrack(&outtrack);
604 }//end loop on clusters of innLay
605 } //end loop on window sizes
608 } //end loop on innLay
609 } //end if(fOuterStartLayer>0)
613 Info("FindTracks","Number of found tracks: %d",event->GetNumberOfTracks());
622 //________________________________________________________________________
624 AliITStrackV2* AliITStrackerSA::FitTrack(AliITStrackSA* tr,Double_t *primaryVertex){
625 //fit of the found track
628 Int_t * firstmod = new Int_t[AliITSgeomTGeo::GetNLayers()];
629 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
630 firstmod[i]=AliITSgeomTGeo::GetModuleIndex(i+1,1,1);
633 Int_t nclusters = tr->GetNumberOfClustersSA();
634 TObjArray** listlayer = new TObjArray*[AliITSgeomTGeo::GetNLayers()];
635 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
636 listlayer[i] = new TObjArray(0,0);
654 Int_t * nnn = new Int_t[AliITSgeomTGeo::GetNLayers()];
655 Int_t * kkk = new Int_t[AliITSgeomTGeo::GetNLayers()];
656 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) {nnn[i]=0;kkk[i]=0;}
658 for(Int_t ncl=0;ncl<nclusters;ncl++){
659 Int_t index = tr->GetClusterIndexSA(ncl);
660 AliITSRecPoint* cl = (AliITSRecPoint*)GetCluster(index);
661 if(cl->TestBit(kSAflag)==kTRUE) cl->ResetBit(kSAflag);
662 Int_t lay = (index & 0xf0000000) >> 28;
663 if(lay==0) { listlayer[0]->AddLast(cl); clind0[nnn[0]]=index;nnn[0]++;}
664 if(lay==1) { listlayer[1]->AddLast(cl); clind1[nnn[1]]=index;nnn[1]++;}
665 if(lay==2) { listlayer[2]->AddLast(cl); clind2[nnn[2]]=index;nnn[2]++;}
666 if(lay==3) { listlayer[3]->AddLast(cl); clind3[nnn[3]]=index;nnn[3]++;}
667 if(lay==4) { listlayer[4]->AddLast(cl); clind4[nnn[4]]=index;nnn[4]++;}
668 if(lay==5) { listlayer[5]->AddLast(cl); clind5[nnn[5]]=index;nnn[5]++;}
672 for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
673 for(Int_t ncl=0;ncl<tr->GetNumberOfMarked(nlay);ncl++){
674 Int_t mark = tr->GetClusterMark(nlay,ncl);
675 if(nlay==0) { mark0[kkk[0]]=mark;kkk[0]++;}
676 if(nlay==1) { mark1[kkk[1]]=mark;kkk[1]++;}
677 if(nlay==2) { mark2[kkk[2]]=mark;kkk[2]++;}
678 if(nlay==3) { mark3[kkk[3]]=mark;kkk[3]++;}
679 if(nlay==4) { mark4[kkk[4]]=mark;kkk[4]++;}
680 if(nlay==5) { mark5[kkk[5]]=mark;kkk[5]++;}
688 Int_t * end = new Int_t[AliITSgeomTGeo::GetNLayers()];
689 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
690 if(listlayer[i]->GetEntries()==0) end[i]=1;
691 else end[i]=listlayer[i]->GetEntries();
694 TClonesArray* listSA = new TClonesArray("AliITStrackSA");
695 TClonesArray &tri = *listSA;
698 if(end[0]==0) end[0]=1; //for tracks with cluster on layer 0 missing
699 for(Int_t l1=0;l1<end[0];l1++){ //loop on layer 1
700 AliITSRecPoint* cl0 = (AliITSRecPoint*)listlayer[0]->At(l1);
701 Double_t x1,y1,z1,sx1,sy1,sz1;
702 Double_t x2,y2,z2,sx2,sy2,sz2;
703 AliITSRecPoint* p1=0;
704 AliITSRecPoint* p2=0;
705 Int_t index1=clind0[l1];
707 Int_t mrk1 = mark0[l1];
712 for(Int_t l2=0;l2<end[1];l2++){ //loop on layer 2
713 AliITSRecPoint* cl1 = (AliITSRecPoint*)listlayer[1]->At(l2);
716 for(Int_t l3=0;l3<end[2];l3++){ //loop on layer 3
717 AliITSRecPoint* cl2 = (AliITSRecPoint*)listlayer[2]->At(l3);
719 if(cl0==0 && cl1!=0) {
722 index1=clind1[l2];mrk1=mark1[l2];
723 index2=clind2[l3];mrk2=mark2[l3];
726 module1 = p1->GetDetectorIndex()+firstmod[1];
728 if(cl0!=0 && cl1==0){
730 p2=cl2;index2=clind2[l3];mrk2=mark2[l3];
733 module1 = p1->GetDetectorIndex()+firstmod[0];
735 if(cl0!=0 && cl1!=0){
740 module1 = p1->GetDetectorIndex()+firstmod[0];
745 AliITSclusterTable* arr1 = (AliITSclusterTable*)GetClusterCoord(lay1,cln1);
746 AliITSclusterTable* arr2 = (AliITSclusterTable*)GetClusterCoord(lay2,cln2);
760 Int_t layer,ladder,detector;
761 AliITSgeomTGeo::GetModuleId(module1,layer,ladder,detector);
762 Float_t yclu1 = p1->GetY();
763 Float_t zclu1 = p1->GetZ();
764 Double_t cv=Curvature(primaryVertex[0],primaryVertex[1],x1,y1,x2,y2);
765 Double_t tgl2 = (z2-z1)/TMath::Sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
766 Double_t phi2 = TMath::ATan2((y2-y1),(x2-x1));
768 for(Int_t l4=0;l4<end[3];l4++){ //loop on layer 4
769 AliITSRecPoint* cl3 = (AliITSRecPoint*)listlayer[3]->At(l4);
770 for(Int_t l5=0;l5<end[4];l5++){ //loop on layer 5
771 AliITSRecPoint* cl4 = (AliITSRecPoint*)listlayer[4]->At(l5);
772 for(Int_t l6=0;l6<end[5];l6++){ //loop on layer 6
773 AliITSRecPoint* cl5 = (AliITSRecPoint*)listlayer[5]->At(l6);
774 AliITStrackSA* trac = new AliITStrackSA(layer,ladder,detector,yclu1,zclu1,phi2,tgl2,cv,1);
777 trac->AddClusterV2(5,(clind5[l6] & 0x0fffffff)>>0);
778 trac->AddClusterMark(5,mark5[l6]);
781 trac->AddClusterV2(4,(clind4[l5] & 0x0fffffff)>>0);
782 trac->AddClusterMark(4,mark4[l5]);
785 trac->AddClusterV2(3,(clind3[l4] & 0x0fffffff)>>0);
786 trac->AddClusterMark(3,mark3[l4]);
789 trac->AddClusterV2(2,(clind2[l3] & 0x0fffffff)>>0);
790 trac->AddClusterMark(2,mark2[l3]);
793 trac->AddClusterV2(1,(clind1[l2] & 0x0fffffff)>>0);
794 trac->AddClusterMark(1,mark1[l2]);
797 trac->AddClusterV2(0,(clind0[l1] & 0x0fffffff)>>0);
798 trac->AddClusterMark(0,mark0[l1]);
800 //fit with Kalman filter using AliITStrackerMI::RefitAt()
803 AliITStrackMI* ot = new AliITStrackSA(*trac);
805 ot->ResetCovariance(10.);
808 if(RefitAt(krInsideITSscreen,ot,trac)){ //fit from layer 1 to layer 6
809 AliITStrackMI *otrack2 = new AliITStrackMI(*ot);
810 otrack2->ResetCovariance(10.);
811 otrack2->ResetClusters();
812 //fit from layer 6 to layer 1
813 if(RefitAt(krInsideSPD1,otrack2,ot)) {
814 fListOfTracks->AddLast(otrack2);
815 new (tri[nlist]) AliITStrackSA(*trac);
836 Int_t dim=fListOfTracks->GetEntries();
838 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
848 Int_t lowchi2 = FindTrackLowChiSquare(fListOfTracks,dim);
849 AliITStrackV2* otrack =(AliITStrackV2*)fListOfTracks->At(lowchi2);
850 AliITStrackSA* trsa = (AliITStrackSA*)listSA->At(lowchi2);
853 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
862 Int_t * indexc = new Int_t[AliITSgeomTGeo::GetNLayers()];
863 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) indexc[i]=0;
864 for(Int_t nind=0;nind<otrack->GetNumberOfClusters();nind++){
865 indexc[nind] = otrack->GetClusterIndex(nind);
867 AliITSRecPoint* cl0 = (AliITSRecPoint*)GetCluster(indexc[0]);
868 AliITSRecPoint* cl1 = (AliITSRecPoint*)GetCluster(indexc[1]);
869 AliITSRecPoint* cl2 = (AliITSRecPoint*)GetCluster(indexc[2]);
870 AliITSRecPoint* cl3 = (AliITSRecPoint*)GetCluster(indexc[3]);
871 AliITSRecPoint* cl4 = (AliITSRecPoint*)GetCluster(indexc[4]);
872 Int_t labl[3]={-1,-1,-1};
873 if(otrack->GetNumberOfClusters()==AliITSgeomTGeo::GetNLayers()){
874 AliITSRecPoint* cl5 = (AliITSRecPoint*)GetCluster(indexc[5]);
875 labl[0]=cl5->GetLabel(0);
876 labl[1]=cl5->GetLabel(1);
877 labl[2]=cl5->GetLabel(2);
880 if(otrack->GetNumberOfClusters()==(AliITSgeomTGeo::GetNLayers()-1)){
885 Int_t numberofpoints;
886 if(fSixPoints) numberofpoints=6;
887 else numberofpoints=5;
888 CookLabel(otrack,0.); //MI change - to see fake ratio
889 Int_t label = Label(cl0->GetLabel(0),cl1->GetLabel(0),
890 cl2->GetLabel(0),cl3->GetLabel(0),
891 cl4->GetLabel(0),labl[0],
892 cl0->GetLabel(1),cl1->GetLabel(1),
893 cl2->GetLabel(1),cl3->GetLabel(1),
894 cl4->GetLabel(1),labl[1],
895 cl0->GetLabel(2),cl1->GetLabel(2),
896 cl2->GetLabel(2),cl3->GetLabel(2),
897 cl4->GetLabel(2),labl[2],numberofpoints);
899 otrack->SetLabel(label);
900 //remove clusters of found track
902 for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
903 for(Int_t cln=0;cln<trsa->GetNumberOfMarked(nlay);cln++){
904 Int_t index = trsa->GetClusterMark(nlay,cln);
905 fCluLayer[nlay]->RemoveAt(index);
906 RemoveClusterCoord(nlay,index);
907 fCluLayer[nlay]->Compress();
913 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
922 //________________________________________________________________________
924 AliITStrackV2* AliITStrackerSA::FitShortTrack(AliITStrackSA* tr,Double_t *primaryVertex,Int_t innLay){
925 //fit of the found track (short tracks, <6 points, for cosmics). A.Dainese 31.07.07
928 Int_t * firstmod = new Int_t[AliITSgeomTGeo::GetNLayers()];
929 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
930 firstmod[i]=AliITSgeomTGeo::GetModuleIndex(i+1,1,1);
933 Int_t nclusters = tr->GetNumberOfClustersSA();
934 TObjArray** listlayer = new TObjArray*[AliITSgeomTGeo::GetNLayers()];
935 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
936 listlayer[i] = new TObjArray(0,0);
954 Int_t * nnn = new Int_t[AliITSgeomTGeo::GetNLayers()];
955 Int_t * kkk = new Int_t[AliITSgeomTGeo::GetNLayers()];
956 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) {nnn[i]=0;kkk[i]=0;}
958 for(Int_t ncl=0;ncl<nclusters;ncl++){
959 Int_t index = tr->GetClusterIndexSA(ncl);
960 AliITSRecPoint* cl = (AliITSRecPoint*)GetCluster(index);
961 if(cl->TestBit(kSAflag)==kTRUE) cl->ResetBit(kSAflag);
962 Int_t lay = (index & 0xf0000000) >> 28;
963 if(lay==0) { listlayer[0]->AddLast(cl); clind0[nnn[0]]=index;nnn[0]++;}
964 if(lay==1) { listlayer[1]->AddLast(cl); clind1[nnn[1]]=index;nnn[1]++;}
965 if(lay==2) { listlayer[2]->AddLast(cl); clind2[nnn[2]]=index;nnn[2]++;}
966 if(lay==3) { listlayer[3]->AddLast(cl); clind3[nnn[3]]=index;nnn[3]++;}
967 if(lay==4) { listlayer[4]->AddLast(cl); clind4[nnn[4]]=index;nnn[4]++;}
968 if(lay==5) { listlayer[5]->AddLast(cl); clind5[nnn[5]]=index;nnn[5]++;}
972 for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
973 for(Int_t ncl=0;ncl<tr->GetNumberOfMarked(nlay);ncl++){
974 Int_t mark = tr->GetClusterMark(nlay,ncl);
975 if(nlay==0) { mark0[kkk[0]]=mark;kkk[0]++;}
976 if(nlay==1) { mark1[kkk[1]]=mark;kkk[1]++;}
977 if(nlay==2) { mark2[kkk[2]]=mark;kkk[2]++;}
978 if(nlay==3) { mark3[kkk[3]]=mark;kkk[3]++;}
979 if(nlay==4) { mark4[kkk[4]]=mark;kkk[4]++;}
980 if(nlay==5) { mark5[kkk[5]]=mark;kkk[5]++;}
988 Int_t * end = new Int_t[AliITSgeomTGeo::GetNLayers()];
989 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
990 if(listlayer[i]->GetEntries()==0) end[i]=1;
991 else end[i]=listlayer[i]->GetEntries();
994 TClonesArray* listSA = new TClonesArray("AliITStrackSA");
995 TClonesArray &tri = *listSA;
998 // if(end[0]==0) end[0]=1; //for tracks with cluster on layer 0 missing
999 for(Int_t l1=0;l1<end[0];l1++){ //loop on layer 1
1000 AliITSRecPoint* cl0 = (AliITSRecPoint*)listlayer[0]->At(l1);
1001 for(Int_t l2=0;l2<end[1];l2++){ //loop on layer 2
1002 AliITSRecPoint* cl1 = (AliITSRecPoint*)listlayer[1]->At(l2);
1003 for(Int_t l3=0;l3<end[2];l3++){ //loop on layer 3
1004 AliITSRecPoint* cl2 = (AliITSRecPoint*)listlayer[2]->At(l3);
1005 for(Int_t l4=0;l4<end[3];l4++){ //loop on layer 4
1006 AliITSRecPoint* cl3 = (AliITSRecPoint*)listlayer[3]->At(l4);
1007 for(Int_t l5=0;l5<end[4];l5++){ //loop on layer 5
1008 AliITSRecPoint* cl4 = (AliITSRecPoint*)listlayer[4]->At(l5);
1009 for(Int_t l6=0;l6<end[5];l6++){ //loop on layer 6
1010 AliITSRecPoint* cl5 = (AliITSRecPoint*)listlayer[5]->At(l6);
1013 Double_t x1,y1,z1,sx1,sy1,sz1;
1014 Double_t x2,y2,z2,sx2,sy2,sz2;
1015 AliITSRecPoint* p1=0;
1016 AliITSRecPoint* p2=0;
1017 Int_t index1=0,index2=0;
1018 Int_t mrk1=0,mrk2=0;
1022 index1=clind1[l2];mrk1=mark1[l2];
1023 index2=clind2[l3];mrk2=mark2[l3];
1024 } else if(innLay==2) {
1027 index1=clind2[l3];mrk1=mark2[l3];
1028 index2=clind3[l4];mrk2=mark3[l4];
1029 } else if(innLay==3) {
1032 index1=clind3[l4];mrk1=mark3[l4];
1033 index2=clind4[l5];mrk2=mark4[l5];
1034 } else if(innLay==4) {
1037 index1=clind4[l5];mrk1=mark4[l5];
1038 index2=clind5[l6];mrk2=mark5[l6];
1041 Int_t lay2=innLay+1;
1042 Int_t module1 = p1->GetDetectorIndex()+firstmod[innLay];
1046 AliITSclusterTable* arr1 = (AliITSclusterTable*)GetClusterCoord(lay1,cln1);
1047 AliITSclusterTable* arr2 = (AliITSclusterTable*)GetClusterCoord(lay2,cln2);
1054 sx1 = arr1->GetSx();
1055 sx2 = arr2->GetSx();
1056 sy1 = arr1->GetSy();
1057 sy2 = arr2->GetSy();
1058 sz1 = arr1->GetSz();
1059 sz2 = arr2->GetSz();
1061 Int_t layer,ladder,detector;
1062 AliITSgeomTGeo::GetModuleId(module1,layer,ladder,detector);
1063 Float_t yclu1 = p1->GetY();
1064 Float_t zclu1 = p1->GetZ();
1065 Double_t cv=Curvature(primaryVertex[0],primaryVertex[1],x1,y1,x2,y2);
1066 Double_t tgl2 = (z2-z1)/TMath::Sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
1067 Double_t phi2 = TMath::ATan2((y2-y1),(x2-x1));
1068 //printf("phi2: %f tgl2: %f\n",phi2,tgl2);
1069 AliITStrackSA* trac = new AliITStrackSA(layer,ladder,detector,yclu1,zclu1,phi2,tgl2,cv,1);
1073 trac->AddClusterV2(5,(clind5[l6] & 0x0fffffff)>>0);
1074 trac->AddClusterMark(5,mark5[l6]);
1075 //cl5->GetGlobalXYZ(clxyz);printf("gcl %f %f %f\n",clxyz[0],clxyz[1],clxyz[2]);
1078 trac->AddClusterV2(4,(clind4[l5] & 0x0fffffff)>>0);
1079 trac->AddClusterMark(4,mark4[l5]);
1080 //cl4->GetGlobalXYZ(clxyz);printf("gcl %f %f %f\n",clxyz[0],clxyz[1],clxyz[2]);
1083 trac->AddClusterV2(3,(clind3[l4] & 0x0fffffff)>>0);
1084 trac->AddClusterMark(3,mark3[l4]);
1085 //cl3->GetGlobalXYZ(clxyz);printf("gcl %f %f %f\n",clxyz[0],clxyz[1],clxyz[2]);
1088 trac->AddClusterV2(2,(clind2[l3] & 0x0fffffff)>>0);
1089 trac->AddClusterMark(2,mark2[l3]);
1090 //cl2->GetGlobalXYZ(clxyz);printf("gcl %f %f %f\n",clxyz[0],clxyz[1],clxyz[2]);
1093 trac->AddClusterV2(1,(clind1[l2] & 0x0fffffff)>>0);
1094 trac->AddClusterMark(1,mark1[l2]);
1095 //cl1->GetGlobalXYZ(clxyz);printf("gcl %f %f %f\n",clxyz[0],clxyz[1],clxyz[2]);
1098 trac->AddClusterV2(0,(clind0[l1] & 0x0fffffff)>>0);
1099 trac->AddClusterMark(0,mark0[l1]);
1100 //cl0->GetGlobalXYZ(clxyz);printf("gcl %f %f %f\n",clxyz[0],clxyz[1],clxyz[2]);
1104 //fit with Kalman filter using AliITStrackerMI::RefitAt()
1105 AliITStrackMI* ot = new AliITStrackSA(*trac);
1107 ot->ResetCovariance(10.);
1108 ot->ResetClusters();
1110 //printf("%d \n",trac->GetNumberOfClusters());for(Int_t ijk=0;ijk<trac->GetNumberOfClusters();ijk++) printf(" %d",trac->GetClusterIndex(ijk)); printf("\n");
1111 if(RefitAt(krInsideITSscreen,ot,trac)){ //fit from layer 1 to layer 6
1112 AliITStrackMI *otrack2 = new AliITStrackMI(*ot);
1113 otrack2->ResetCovariance(10.);
1114 otrack2->ResetClusters();
1115 //fit from layer 6 to layer 1
1116 if(RefitAt(krInsideSPD1,otrack2,ot)) {
1117 fListOfTracks->AddLast(otrack2);
1118 new (tri[nlist]) AliITStrackSA(*trac);
1139 Int_t dim=fListOfTracks->GetEntries();
1141 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
1142 delete listlayer[i];
1144 delete [] listlayer;
1151 Int_t lowchi2 = FindTrackLowChiSquare(fListOfTracks,dim);
1152 AliITStrackV2* otrack =(AliITStrackV2*)fListOfTracks->At(lowchi2);
1153 AliITStrackSA* trsa = (AliITStrackSA*)listSA->At(lowchi2);
1156 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
1157 delete listlayer[i];
1159 delete [] listlayer;
1165 Int_t * indexc = new Int_t[AliITSgeomTGeo::GetNLayers()];
1166 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) indexc[i]=0;
1167 for(Int_t nind=0;nind<otrack->GetNumberOfClusters();nind++){
1168 indexc[nind] = otrack->GetClusterIndex(nind);
1171 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) {
1172 if(i<otrack->GetNumberOfClusters()) {
1173 AliITSRecPoint* cl = (AliITSRecPoint*)GetCluster(indexc[i]);
1174 labl[i][0]=cl->GetLabel(0);
1175 labl[i][1]=cl->GetLabel(1);
1176 labl[i][2]=cl->GetLabel(2);
1184 Int_t numberofpoints=AliITSgeomTGeo::GetNLayers()-innLay;
1185 CookLabel(otrack,0.); //MI change - to see fake ratio
1187 Int_t label=FindLabel(labl[0][0],labl[1][0],labl[2][0],labl[3][0],labl[4][0],labl[5][0]);
1189 for(Int_t i=0;i<numberofpoints;i++)
1190 if(labl[i][0]==label || labl[i][1]==label || labl[i][2]==label) lflag++;
1192 if(lflag<numberofpoints) label = -label;
1193 otrack->SetLabel(label);
1195 //remove clusters of found track
1196 for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
1197 for(Int_t cln=0;cln<trsa->GetNumberOfMarked(nlay);cln++){
1198 Int_t index = trsa->GetClusterMark(nlay,cln);
1199 fCluLayer[nlay]->RemoveAt(index);
1200 RemoveClusterCoord(nlay,index);
1201 fCluLayer[nlay]->Compress();
1207 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
1208 delete listlayer[i];
1210 delete [] listlayer;
1218 //_______________________________________________________
1219 Int_t AliITStrackerSA::SearchClusters(Int_t layer,Double_t phiwindow,Double_t lambdawindow, AliITStrackSA* trs,Double_t /*zvertex*/,Int_t pflag){
1220 //function used to to find the clusters associated to the track
1222 AliITSlayer &lay = fgLayers[layer];
1223 Double_t r=lay.GetR();
1225 Float_t cx1,cx2,cy1,cy2;
1226 FindEquation(fPoint1[0],fPoint1[1],fPoint2[0],fPoint2[1],fPoint3[0],fPoint3[1],fCoef1,fCoef2,fCoef3);
1227 if (FindIntersection(fCoef1,fCoef2,fCoef3,-r*r,cx1,cy1,cx2,cy2)==0)
1229 Double_t fi1=TMath::ATan2(cy1-fPoint1[1],cx1-fPoint1[0]);
1230 Double_t fi2=TMath::ATan2(cy2-fPoint1[1],cx2-fPoint1[0]);
1231 fPhiEstimate=ChoosePoint(fi1,fi2,fPhic);
1235 Int_t ncl = fCluLayer[layer]->GetEntries();
1236 for (Int_t index=0; index<ncl; index++) {
1237 AliITSRecPoint *c = (AliITSRecPoint*)fCluLayer[layer]->At(index);
1239 if (c->GetQ()<=0) continue;
1241 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(layer,index);
1242 Double_t phi = arr->GetPhi();
1243 if (TMath::Abs(phi-fPhiEstimate)>phiwindow) continue;
1245 Double_t lambda = arr->GetLambda();
1246 if (TMath::Abs(lambda-fLambdac)>lambdawindow) continue;
1248 if(trs->GetNumberOfClustersSA()==trs->GetMaxNumberOfClusters()) return 0;
1249 if(trs->GetNumberOfMarked(layer)==trs->GetMaxNMarkedPerLayer()) return 0;
1250 Int_t orind = arr->GetOrInd();
1251 trs->AddClusterSA(layer,orind);
1252 trs->AddClusterMark(layer,index);
1258 fPointc[0]=arr->GetX();
1259 fPointc[1]=arr->GetY();
1265 //________________________________________________________________
1266 void AliITStrackerSA::UpdatePoints(){
1267 //update of points for the estimation of the curvature
1269 fPoint2[0]=fPoint3[0];
1270 fPoint2[1]=fPoint3[1];
1271 fPoint3[0]=fPointc[0];
1272 fPoint3[1]=fPointc[1];
1277 //___________________________________________________________________
1278 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){
1280 //given (x,y) of three recpoints (in global coordinates)
1281 //returns the parameters a,b,c of circonference x*x + y*y +a*x + b*y +c
1283 Float_t den = (x3-x1)*(y2-y1)-(x2-x1)*(y3-y1);
1284 if(den==0) return 0;
1285 a = ((y3-y1)*(x2*x2+y2*y2-x1*x1-y1*y1)-(y2-y1)*(x3*x3+y3*y3-x1*x1-y1*y1))/den;
1286 b = -(x2*x2-x1*x1+y2*y2-y1*y1+a*(x2-x1))/(y2-y1);
1287 c = -x1*x1-y1*y1-a*x1-b*y1;
1290 //__________________________________________________________________________
1291 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){
1293 //Finds the intersection between the circonference of the track and the circonference centered in (0,0) represented by one layer
1294 //c2 is -rlayer*rlayer
1298 Double_t aA = (b1*b1)/(a1*a1)+1;
1299 Double_t bB = (-2*m*b1/(a1*a1));
1300 Double_t cC = c2+(m*m)/(a1*a1);
1301 Double_t dD = bB*bB-4*aA*cC;
1304 y1 = (-bB+TMath::Sqrt(dD))/(2*aA);
1305 y2 = (-bB-TMath::Sqrt(dD))/(2*aA);
1306 x1 = (c2-c1-b1*y1)/a1;
1307 x2 = (c2-c1-b1*y2)/a1;
1311 //____________________________________________________________________
1312 Double_t AliITStrackerSA::Curvature(Double_t x1,Double_t y1,Double_t
1313 x2,Double_t y2,Double_t x3,Double_t y3){
1315 //calculates the curvature of track
1316 Double_t den = (x3-x1)*(y2-y1)-(x2-x1)*(y3-y1);
1317 if(den==0) return 0;
1318 Double_t a = ((y3-y1)*(x2*x2+y2*y2-x1*x1-y1*y1)-(y2-y1)*(x3*x3+y3*y3-x1*x1-y1*y1))/den;
1319 Double_t b = -(x2*x2-x1*x1+y2*y2-y1*y1+a*(x2-x1))/(y2-y1);
1320 Double_t c = -x1*x1-y1*y1-a*x1-b*y1;
1323 if((a*a+b*b-4*c)<0) return 0;
1324 Double_t rad = TMath::Sqrt(a*a+b*b-4*c)/2.;
1325 if(rad==0) return 0;
1327 if((x1>0 && y1>0 && x1<xc)) rad*=-1;
1328 if((x1<0 && y1>0 && x1<xc)) rad*=-1;
1329 // if((x1<0 && y1<0 && x1<xc)) rad*=-1;
1330 // if((x1>0 && y1<0 && x1<xc)) rad*=-1;
1337 //____________________________________________________________________
1338 Double_t AliITStrackerSA::ChoosePoint(Double_t p1, Double_t p2, Double_t pp){
1340 //Returns the point closest to pp
1342 Double_t diff1 = p1-pp;
1343 Double_t diff2 = p2-pp;
1345 if(TMath::Abs(diff1)<TMath::Abs(diff2)) fPhiEstimate=p1;
1346 else fPhiEstimate=p2;
1347 return fPhiEstimate;
1352 //_________________________________________________________________
1353 Int_t AliITStrackerSA::FindTrackLowChiSquare(TObjArray* tracklist, Int_t dim) const {
1354 // returns track with lowes chi square
1356 //AliITStrackV2* trk = (AliITStrackV2*)tracklist->At(0);
1360 //if(dim==0) return 0;
1361 Double_t * chi2 = new Double_t[dim];
1362 Int_t * index = new Int_t[dim];
1363 for(Int_t i=0;i<dim;i++){
1364 AliITStrackV2* trk = (AliITStrackV2*)tracklist->At(i);
1365 chi2[i]=trk->GetChi2();
1369 Int_t w=0;Double_t value;
1372 for(Int_t j=w+1;j<dim;j++){
1373 if(chi2[w]<chi2[j]){
1387 return index[dim-1];
1390 //__________________________________________________________
1391 Int_t AliITStrackerSA::FindLabel(Int_t l1, Int_t l2, Int_t l3, Int_t l4, Int_t l5, Int_t l6){
1393 //function used to determine the track label
1395 Int_t lb[6] = {l1,l2,l3,l4,l5,l6};
1396 Int_t aa[6]={1,1,1,1,1,1};
1399 Int_t k=0;Int_t w=0;Int_t num=6;
1400 if(lb[5]==-1) num=5;
1404 for(Int_t i=k+1;i<num;i++){
1406 if(lb[k]==lb[i] && aa[k]!=0){
1417 for(Int_t j=0;j<6;j++){
1429 if(num==6) return lb[5];
1433 //_____________________________________________________________________________
1434 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,
1435 Int_t gl12, Int_t gl13, Int_t gl14,Int_t gl15, Int_t gl16, Int_t gl17, Int_t gl18, Int_t numberofpoints){
1438 //function used to assign label to the found track. If track is fake, the label is negative
1440 Int_t lb0[6] = {gl1,gl2,gl3,gl4,gl5,gl6};
1441 Int_t lb1[6] = {gl7,gl8,gl9,gl10,gl11,gl12};
1442 Int_t lb2[6] = {gl13,gl14,gl15,gl16,gl17,gl18};
1443 Int_t ll=FindLabel(lb0[0],lb0[1],lb0[2],lb0[3],lb0[4],lb0[5]);
1444 Int_t lflag=0;Int_t num=6;
1445 if(lb0[5]==-1 && lb1[5]==-1 && lb2[5]==-1) num=5;
1447 for(Int_t i=0;i<num;i++){
1448 if(lb0[i]==ll || lb1[i]==ll || lb2[i]==ll) lflag+=1;
1451 if(lflag>=numberofpoints) return ll;
1457 //_____________________________________________________________________________
1458 void AliITStrackerSA::SetWindowSizes(Int_t n, Double_t *phi, Double_t *lam){
1459 // Set sizes of the phi and lambda windows used for track finding
1461 if(phi){ // user defined values
1462 fPhiWin = new Double_t[fNloop];
1463 fLambdaWin = new Double_t[fNloop];
1464 for(Int_t k=0;k<fNloop;k++){
1466 fLambdaWin[k]=lam[k];
1469 else { // default values
1471 Double_t phid[33] = {0.002,0.003,0.004,0.0045,0.0047,
1472 0.005,0.0053,0.0055,
1473 0.006,0.0063,0.0065,0.007,0.0073,0.0075,0.0077,
1474 0.008,0.0083,0.0085,0.0087,0.009,0.0095,0.0097,
1475 0.01,0.0105,0.011,0.0115,0.012,0.0125,0.013,0.0135,0.0140,0.0145};
1476 Double_t lambdad[33] = {0.003,0.004,0.005,0.005,0.005,
1478 0.006,0.006,0.006,0.007,0.007,0.007,0.007,
1479 0.007,0.007,0.007,0.007,0.007,0.007,0.007,
1480 0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008};
1487 fPhiWin = new Double_t[fNloop];
1488 fLambdaWin = new Double_t[fNloop];
1490 for(Int_t k=0;k<fNloop;k++){
1492 fLambdaWin[k]=lambdad[k];
1498 //_______________________________________________________________________
1499 void AliITStrackerSA::GetCoorAngles(AliITSRecPoint* cl,Double_t &phi,Double_t &lambda, Float_t &x, Float_t &y,Float_t &z,Double_t* vertex){
1500 //Returns values of phi (azimuthal) and lambda angles for a given cluster
1502 Double_t rot[9]; fGeom->GetRotMatrix(module,rot);
1503 Int_t lay,lad,det; fGeom->GetModuleId(module,lay,lad,det);
1504 Float_t tx,ty,tz; fGeom->GetTrans(lay,lad,det,tx,ty,tz);
1506 Double_t alpha=TMath::ATan2(rot[1],rot[0])+TMath::Pi();
1507 Double_t phi1=TMath::Pi()/2+alpha;
1508 if (lay==1) phi1+=TMath::Pi();
1510 Float_t cp=TMath::Cos(phi1), sp=TMath::Sin(phi1);
1511 Float_t r=tx*cp+ty*sp;
1513 xyz= r*cp - cl->GetY()*sp;
1514 y= r*sp + cl->GetY()*cp;
1518 cl->GetGlobalXYZ(xyz);
1523 phi=TMath::ATan2(y-vertex[1],x-vertex[0]);
1524 lambda=TMath::ATan2(z-vertex[2],TMath::Sqrt((x-vertex[0])*(x-vertex[0])+(y-vertex[1])*(y-vertex[1])));
1527 //________________________________________________________________________
1528 void AliITStrackerSA::GetCoorErrors(AliITSRecPoint* cl,Float_t &sx,Float_t &sy, Float_t &sz){
1530 //returns sigmax, y, z of cluster in global coordinates
1532 Double_t rot[9]; fGeom->GetRotMatrix(module,rot);
1534 AliITSgeomTGeo::GetModuleId(module,lay,lad,det);
1536 Double_t alpha=TMath::ATan2(rot[1],rot[0])+TMath::Pi();
1537 Double_t phi=TMath::Pi()/2+alpha;
1538 if (lay==1) phi+=TMath::Pi();
1540 Float_t cp=TMath::Cos(phi), sp=TMath::Sin(phi);
1543 cl->GetGlobalCov(covm);
1544 sx=TMath::Sqrt(covm[0]);
1545 sy=TMath::Sqrt(covm[3]);
1546 sz=TMath::Sqrt(covm[5]);
1548 sx = TMath::Sqrt(sp*sp*cl->GetSigmaY2());
1549 sy = TMath::Sqrt(cp*cp*cl->GetSigmaY2());
1550 sz = TMath::Sqrt(cl->GetSigmaZ2());