-//____________________________________________________________________________
-void AliITStrackerSA::FindTracks(TTree *out,Int_t evnumber){
-
- /**************************************************************************
- * This function finds primary tracks.
- * *
- * *
- * Example: to execute function with only the ITS (no combined tracking *
- * with TPC+ITS) and requiring 5/6 points to define a good track *
- * call SetSixPoinbts(kFALSE) in advance and then *
- * use: FindTracks(treein,treeout,evnumber) *
- * to execute combined tracking, before using FindTracks, use *
- * UseFoundTracksV2 *
- *************************************************************************/
-
- if(!fITSclusters){
- Fatal("FindTracks","ITS cluster tree is not accessed - Abort!!!\n Please use method SetClusterTree to pass the pointer to the tree\n");
- exit(1);
- }
- //Get primary vertex
- if(fVertexer){
- if(fVert)delete fVert;
- fVert = fVertexer->FindVertexForCurrentEvent(evnumber);
- }
- else {
- gAlice->GetEvent(evnumber);
- if(!fVert){
- Fatal("FindTracks","Vertex is missing\n");
- return;
- }
- }
- Double_t primaryVertex[3];
- Double_t errorsprimvert[3];
- fVert->GetXYZ(primaryVertex);
- fVert->GetSigmaXYZ(errorsprimvert);
- if(errorsprimvert[0]==0 || errorsprimvert[1]==0){
- Warning("FindTracks","Set errors on vertex positions x and y at 0.0001");
- errorsprimvert[0]=0.0001;
- errorsprimvert[1]=0.0001;
- }
- fVert->PrintStatus();
-
-
- //Fill array with cluster indices for each module
- if(!fTable){
- fTable = new AliITSclusterTable(fGeom,this,primaryVertex);
- fTable->FillArray(fITSclusters);
- fTable->FillArrayCoorAngles();
- }
-
-
-//Fill tree for found tracks
- AliITStrackV2* outrack=0;
- TBranch* branch=out->Branch("tracks","AliITStrackV2",&outrack,32000,0);
- if (!branch) out->Branch("tracks","AliITStrackV2",&outrack,32000,3);
- else branch->SetAddress(&outrack);
-
-
- Int_t * firstmod = new Int_t[fGeom->GetNlayers()];
- for(Int_t i=0;i<fGeom->GetNlayers();i++){
- firstmod[i]=fGeom->GetModuleIndex(i+1,1,1);
- }
- // firstmod [i] number of the first module in the ITS layer i.
-
- AliITSlayer &layer=fgLayers[0]; // first layer
- Int_t ntrack=0;
- Int_t dim=layer.GetNumberOfClusters();
- //loop on the different windows
- for(Int_t nloop=0;nloop<fNloop;nloop++){
- for(Int_t ncl=0;ncl<dim;ncl++){
- //loop starting from layer 0
- ResetForFinding();
- Int_t pflag=0;
- AliITSclusterV2* cl = layer.GetCluster(ncl);
- if(cl->IsUsed()==1) continue;
- if(cl->TestBit(kSAflag)==kTRUE) continue;
-
- fPhic = fTable->GetPhiCluster(0,ncl);
- fLambdac = fTable->GetLambdaCluster(0,ncl);
- fPhiEstimate = fPhic;
- AliITStrackSA* trs = new AliITStrackSA();
- fPoint1[0]=primaryVertex[0];
- fPoint1[1]=primaryVertex[1];
- fPoint2[0]=fTable->GetXCluster(0,ncl);
- fPoint2[1]=fTable->GetYCluster(0,ncl);
-
- Int_t * nn = new Int_t[fGeom->GetNlayers()];//counter for clusters on each layer
- for(Int_t i=0;i<fGeom->GetNlayers();i++){ nn[i]=0;}
- nn[0] = SearchClusters(0,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
- nn[1] = SearchClusters(1,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
-
- if(nn[1]>0){
- pflag=1;
- fPoint3[0] = fPointc[0];
- fPoint3[1] = fPointc[1];
- }
- nn[2] = SearchClusters(2,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
- if(nn[1]==0 && nn[2]==0) pflag=0;
- if(nn[2]!=0 && nn[1]!=0){ pflag=1; UpdatePoints();}
- if(nn[2]!=0 && nn[1]==0){
- pflag=1;
- fPoint3[0]=fPointc[0];
- fPoint3[1]=fPointc[1];
- }
-
- nn[3] = SearchClusters(3,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
- pflag=1;
- if(nn[3]!=0) UpdatePoints();
- nn[4] = SearchClusters(4,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
- pflag=1;
- if(nn[4]!=0) UpdatePoints();
- nn[5] = SearchClusters(5,fPhiWin[nloop],fLambdaWin[nloop],trs,primaryVertex[2],pflag);
-
-
- Int_t layOK=0;
- Int_t numberofpoints;
- if(fSixPoints) numberofpoints=6; //check of the candidate track
- else numberofpoints=5; //if track is good (with the required number
- for(Int_t nnp=0;nnp<fGeom->GetNlayers();nnp++){ //of points) it is written on file
- if(nn[nnp]!=0) layOK+=1;
- }
- if(layOK>=numberofpoints){
- AliITStrackV2* tr2 = FitTrack(trs,primaryVertex,errorsprimvert);
- if(tr2==0){
- Int_t nct = trs->GetNumberOfClustersSA();
- while(nct--){
- Int_t index = trs->GetClusterIndexSA(nct);
- AliITSclusterV2* kl = (AliITSclusterV2*)GetCluster(index);
- if(kl->TestBit(kSAflag)==kTRUE) kl->ResetBit(kSAflag);
- }
- delete [] nn;
- delete trs;
- continue;
- }
- outrack=tr2;
- out->Fill();
- ntrack++;
- Int_t nct = tr2->GetNumberOfClusters();
-
- while(nct--){
- Int_t index = tr2->GetClusterIndex(nct);
- AliITSclusterV2* kl = (AliITSclusterV2*)GetCluster(index);
- kl->SetBit(kSAflag);
-
- }
- }
- else{
- Int_t nct = trs->GetNumberOfClustersSA();
- while(nct--){
- Int_t index = trs->GetClusterIndexSA(nct);
- AliITSclusterV2* kl = (AliITSclusterV2*)GetCluster(index);
- if(kl->TestBit(kSAflag)==kTRUE) kl->ResetBit(kSAflag);
- }
- }
- delete [] nn;
- delete trs;
-
- }//end loop on clusters of layer1
-
- }//end loop2
-
- //if 5/6 points are required, second loop starting
- //from second layer, to find tracks with point of
- //layer 1 missing
-
- if(!fSixPoints){
- // counter for clusters on each layer
- Int_t * nn = new Int_t[fGeom->GetNlayers()-1];
- for(Int_t nloop=0;nloop<fNloop;nloop++){
- AliITSlayer &layer2=fgLayers[1]; //loop on layer 2
- Int_t ncl2=layer2.GetNumberOfClusters();
- while(ncl2--){ //loop starting from layer 2
- ResetForFinding();
- Int_t pflag=0;
- AliITSclusterV2* cl = layer2.GetCluster(ncl2);
- if(cl->IsUsed()==1) continue;
- if(cl->TestBit(kSAflag)==kTRUE) continue;
- fPhic = fTable->GetPhiCluster(1,ncl2);
- fLambdac = fTable->GetLambdaCluster(1,ncl2);
- fPhiEstimate = fPhic;
- AliITStrackSA* trs = new AliITStrackSA();
-
- fPoint1[0]=primaryVertex[0];
- fPoint1[1]=primaryVertex[1];
- fPoint2[0]=fTable->GetXCluster(1,ncl2);;
- fPoint2[1]=fTable->GetYCluster(1,ncl2);;
-
- for(Int_t kk=0;kk<fGeom->GetNlayers()-1;kk++)nn[kk] = 0;
- for(Int_t kk=0;kk<fGeom->GetNlayers()-1;kk++){
- nn[kk] = SearchClusters(kk+1,fPhiWin[nloop],fLambdaWin[nloop],
- trs,primaryVertex[2],pflag);
- if(nn[kk]==0)break;
- if(kk>0){
- UpdatePoints();
- pflag = 1;
- }
- }
- Int_t fl=0;
- for(Int_t nnp=0;nnp<fGeom->GetNlayers()-1;nnp++){
- if(nn[nnp]!=0) fl+=1;
- }
- if(fl>=5){ // 5/6
- AliITStrackV2* tr2 = FitTrack(trs,primaryVertex,errorsprimvert);
- if(tr2==0){
- Int_t nct = trs->GetNumberOfClustersSA();
- while(nct--){
- Int_t index = trs->GetClusterIndexSA(nct);
- AliITSclusterV2* kl = (AliITSclusterV2*)GetCluster(index);
- if(kl->TestBit(kSAflag)==kTRUE) kl->ResetBit(kSAflag);
- }
- delete trs;
- continue;
- }
- outrack=tr2;
- out->Fill();
- Int_t nct = tr2->GetNumberOfClusters();
- while(nct--){
- Int_t index = tr2->GetClusterIndex(nct);
- AliITSclusterV2* kl = (AliITSclusterV2*)GetCluster(index);
- if(kl==0) continue;
- kl->SetBit(kSAflag);
- }
- }
- else{
- Int_t nct = trs->GetNumberOfClustersSA();
- while(nct--){
- Int_t index = trs->GetClusterIndexSA(nct);
- AliITSclusterV2* kl = (AliITSclusterV2*)GetCluster(index);
- if(kl==0) continue;
- if(kl->TestBit(kSAflag)==kTRUE) kl->ResetBit(kSAflag);
- }
- }
- delete trs;
- }//end loop on clusters of layer2
- }
- delete [] nn;
- } // if(!fSixPoints....
-
- delete [] firstmod;
- delete fTable; fTable=0;
-}