+
+ return seed;
+}
+
+
+
+void AliTPCtrackerMI::FindMultiMC(const TObjArray * array, AliESDEvent */*esd*/, Int_t iter)
+{
+ //
+ // find multi tracks - THIS FUNCTION IS ONLY FOR DEBUG PURPOSES
+ // USES MC LABELS
+ // Use AliTPCReconstructor::StreamLevel()>2 if you want to tune parameters - cuts
+ //
+ // Two reasons to have multiple find tracks
+ // 1. Curling tracks can be find more than once
+ // 2. Splitted tracks
+ // a.) Multiple seeding to increase tracking efficiency - (~ 100% reached)
+ // b.) Edge effect on the sector boundaries
+ //
+ //
+ // Algorithm done in 2 phases - because of CPU consumption
+ // it is n^2 algorithm - for lead-lead 20000x20000 combination are investigated
+ //
+ // Algorihm for curling tracks sign:
+ // 1 phase -makes a very rough fast cuts to minimize combinatorics
+ // a.) opposite sign
+ // b.) one of the tracks - not pointing to the primary vertex -
+ // c.) delta tan(theta)
+ // d.) delta phi
+ // 2 phase - calculates DCA between tracks - time consument
+
+ //
+ // fast cuts
+ //
+ // General cuts - for splitted tracks and for curling tracks
+ //
+ const Float_t kMaxdPhi = 0.2; // maximal distance in phi
+ //
+ // Curling tracks cuts
+ //
+ //
+ //
+ //
+ Int_t nentries = array->GetEntriesFast();
+ AliHelix *helixes = new AliHelix[nentries];
+ Float_t *xm = new Float_t[nentries];
+ Float_t *dz0 = new Float_t[nentries];
+ Float_t *dz1 = new Float_t[nentries];
+ //
+ //
+ TStopwatch timer;
+ timer.Start();
+ //
+ // Find track COG in x direction - point with best defined parameters
+ //
+ for (Int_t i=0;i<nentries;i++){
+ AliTPCseed* track = (AliTPCseed*)array->At(i);
+ if (!track) continue;
+ track->SetCircular(0);
+ new (&helixes[i]) AliHelix(*track);
+ Int_t ncl=0;
+ xm[i]=0;
+ Float_t dz[2];
+ track->GetDZ(GetX(),GetY(),GetZ(),GetBz(),dz);
+ dz0[i]=dz[0];
+ dz1[i]=dz[1];
+ for (Int_t icl=0; icl<160; icl++){
+ AliTPCclusterMI * cl = track->GetClusterPointer(icl);
+ if (cl) {
+ xm[i]+=cl->GetX();
+ ncl++;
+ }
+ }
+ if (ncl>0) xm[i]/=Float_t(ncl);
+ }
+ //
+ for (Int_t i0=0;i0<nentries;i0++){
+ AliTPCseed * track0 = (AliTPCseed*)array->At(i0);
+ if (!track0) continue;
+ Float_t xc0 = helixes[i0].GetHelix(6);
+ Float_t yc0 = helixes[i0].GetHelix(7);
+ Float_t r0 = helixes[i0].GetHelix(8);
+ Float_t rc0 = TMath::Sqrt(xc0*xc0+yc0*yc0);
+ Float_t fi0 = TMath::ATan2(yc0,xc0);
+
+ for (Int_t i1=i0+1;i1<nentries;i1++){
+ AliTPCseed * track1 = (AliTPCseed*)array->At(i1);
+ if (!track1) continue;
+ Int_t lab0=track0->GetLabel();
+ Int_t lab1=track1->GetLabel();
+ if (TMath::Abs(lab0)!=TMath::Abs(lab1)) continue;
+ //
+ Float_t xc1 = helixes[i1].GetHelix(6);
+ Float_t yc1 = helixes[i1].GetHelix(7);
+ Float_t r1 = helixes[i1].GetHelix(8);
+ Float_t rc1 = TMath::Sqrt(xc1*xc1+yc1*yc1);
+ Float_t fi1 = TMath::ATan2(yc1,xc1);
+ //
+ Float_t dfi = fi0-fi1;
+ //
+ //
+ if (dfi>1.5*TMath::Pi()) dfi-=TMath::Pi(); // take care about edge effect
+ if (dfi<-1.5*TMath::Pi()) dfi+=TMath::Pi(); //
+ if (TMath::Abs(dfi)>kMaxdPhi&&helixes[i0].GetHelix(4)*helixes[i1].GetHelix(4)<0){
+ //
+ // if short tracks with undefined sign
+ fi1 = -TMath::ATan2(yc1,-xc1);
+ dfi = fi0-fi1;
+ }
+ Float_t dtheta = TMath::Abs(track0->GetTgl()-track1->GetTgl())<TMath::Abs(track0->GetTgl()+track1->GetTgl())? track0->GetTgl()-track1->GetTgl():track0->GetTgl()+track1->GetTgl();
+
+ //
+ // debug stream to tune "fast cuts"
+ //
+ Double_t dist[3]; // distance at X
+ Double_t mdist[3]={0,0,0}; // mean distance X+-40cm
+ track0->GetDistance(track1,0.5*(xm[i0]+xm[i1])-40.,dist,AliTracker::GetBz());
+ for (Int_t i=0;i<3;i++) mdist[i]+=TMath::Abs(dist[i]);
+ track0->GetDistance(track1,0.5*(xm[i0]+xm[i1])+40.,dist,AliTracker::GetBz());
+ for (Int_t i=0;i<3;i++) mdist[i]+=TMath::Abs(dist[i]);
+ track0->GetDistance(track1,0.5*(xm[i0]+xm[i1]),dist,AliTracker::GetBz());
+ for (Int_t i=0;i<3;i++) mdist[i]+=TMath::Abs(dist[i]);
+ for (Int_t i=0;i<3;i++) mdist[i]*=0.33333;
+
+ Float_t sum =0;
+ Float_t sums=0;
+ for (Int_t icl=0; icl<160; icl++){
+ AliTPCclusterMI * cl0 = track0->GetClusterPointer(icl);
+ AliTPCclusterMI * cl1 = track1->GetClusterPointer(icl);
+ if (cl0&&cl1) {
+ sum++;
+ if (cl0==cl1) sums++;
+ }
+ }
+ //
+ if (AliTPCReconstructor::StreamLevel()>5) {
+ TTreeSRedirector &cstream = *fDebugStreamer;
+ cstream<<"Multi"<<
+ "iter="<<iter<<
+ "lab0="<<lab0<<
+ "lab1="<<lab1<<
+ "Tr0.="<<track0<< // seed0
+ "Tr1.="<<track1<< // seed1
+ "h0.="<<&helixes[i0]<<
+ "h1.="<<&helixes[i1]<<
+ //
+ "sum="<<sum<< //the sum of rows with cl in both
+ "sums="<<sums<< //the sum of shared clusters
+ "xm0="<<xm[i0]<< // the center of track
+ "xm1="<<xm[i1]<< // the x center of track
+ // General cut variables
+ "dfi="<<dfi<< // distance in fi angle
+ "dtheta="<<dtheta<< // distance int theta angle
+ //
+ "dz00="<<dz0[i0]<<
+ "dz01="<<dz0[i1]<<
+ "dz10="<<dz1[i1]<<
+ "dz11="<<dz1[i1]<<
+ "dist0="<<dist[0]<< //distance x
+ "dist1="<<dist[1]<< //distance y
+ "dist2="<<dist[2]<< //distance z
+ "mdist0="<<mdist[0]<< //distance x
+ "mdist1="<<mdist[1]<< //distance y
+ "mdist2="<<mdist[2]<< //distance z
+ //
+ "r0="<<r0<<
+ "rc0="<<rc0<<
+ "fi0="<<fi0<<
+ "fi1="<<fi1<<
+ "r1="<<r1<<
+ "rc1="<<rc1<<
+ "\n";
+ }
+ }
+ }
+ delete [] helixes;
+ delete [] xm;
+ delete [] dz0;
+ delete [] dz1;
+ if (AliTPCReconstructor::StreamLevel()>1) {
+ AliInfo("Time for curling tracks removal DEBUGGING MC");
+ timer.Print();
+ }
+}
+
+
+
+void AliTPCtrackerMI::FindSplitted(TObjArray * array, AliESDEvent */*esd*/, Int_t /*iter*/){
+ //
+ // Find Splitted tracks and remove the one with worst quality
+ // Corresponding debug streamer to tune selections - "Splitted2"
+ // Algorithm:
+ // 0. Sort tracks according quility
+ // 1. Propagate the tracks to the reference radius
+ // 2. Double_t loop to select close tracks (only to speed up process)
+ // 3. Calculate cluster overlap ratio - and remove the track if bigger than a threshold
+ // 4. Delete temporary parameters
+ //
+ const Double_t xref=GetXrow(63); // reference radius -IROC/OROC boundary
+ // rough cuts
+ const Double_t kCutP1=10; // delta Z cut 10 cm
+ const Double_t kCutP2=0.15; // delta snp(fi) cut 0.15
+ const Double_t kCutP3=0.15; // delta tgl(theta) cut 0.15
+ const Double_t kCutAlpha=0.15; // delta alpha cut
+ Int_t firstpoint = 0;
+ Int_t lastpoint = 160;
+ //
+ Int_t nentries = array->GetEntriesFast();
+ AliExternalTrackParam *params = new AliExternalTrackParam[nentries];
+ //
+ //
+ TStopwatch timer;
+ timer.Start();
+ //
+ //0. Sort tracks according quality
+ //1. Propagate the ext. param to reference radius
+ Int_t nseed = array->GetEntriesFast();
+ if (nseed<=0) return;
+ Float_t * quality = new Float_t[nseed];
+ Int_t * indexes = new Int_t[nseed];
+ for (Int_t i=0; i<nseed; i++) {
+ AliTPCseed *pt=(AliTPCseed*)array->UncheckedAt(i);
+ if (!pt){
+ quality[i]=-1;
+ continue;
+ }
+ pt->UpdatePoints(); //select first last max dens points
+ Float_t * points = pt->GetPoints();
+ if (points[3]<0.8) quality[i] =-1;
+ quality[i] = (points[2]-points[0])+pt->GetNumberOfClusters();
+ //prefer high momenta tracks if overlaps
+ quality[i] *= TMath::Sqrt(TMath::Abs(pt->Pt())+0.5);
+ params[i]=(*pt);
+ AliTracker::PropagateTrackToBxByBz(&(params[i]),xref,pt->GetMass(),5.,kTRUE);
+ AliTracker::PropagateTrackToBxByBz(&(params[i]),xref,pt->GetMass(),1.,kTRUE);
+ }
+ TMath::Sort(nseed,quality,indexes);
+ //
+ // 3. Loop over pair of tracks
+ //
+ for (Int_t i0=0; i0<nseed; i0++) {
+ Int_t index0=indexes[i0];
+ if (!(array->UncheckedAt(index0))) continue;
+ AliTPCseed *s1 = (AliTPCseed*)array->UncheckedAt(index0);
+ if (!s1->IsActive()) continue;
+ AliExternalTrackParam &par0=params[index0];
+ for (Int_t i1=i0+1; i1<nseed; i1++) {
+ Int_t index1=indexes[i1];
+ if (!(array->UncheckedAt(index1))) continue;
+ AliTPCseed *s2 = (AliTPCseed*)array->UncheckedAt(index1);
+ if (!s2->IsActive()) continue;
+ if (s2->GetKinkIndexes()[0]!=0)
+ if (s2->GetKinkIndexes()[0] == -s1->GetKinkIndexes()[0]) continue;
+ AliExternalTrackParam &par1=params[index1];
+ if (TMath::Abs(par0.GetParameter()[3]-par1.GetParameter()[3])>kCutP3) continue;
+ if (TMath::Abs(par0.GetParameter()[1]-par1.GetParameter()[1])>kCutP1) continue;
+ if (TMath::Abs(par0.GetParameter()[2]-par1.GetParameter()[2])>kCutP2) continue;
+ Double_t dAlpha= TMath::Abs(par0.GetAlpha()-par1.GetAlpha());
+ if (dAlpha>TMath::Pi()) dAlpha-=TMath::Pi();
+ if (TMath::Abs(dAlpha)>kCutAlpha) continue;
+ //
+ Int_t sumShared=0;
+ Int_t nall0=0;
+ Int_t nall1=0;
+ Int_t firstShared=lastpoint, lastShared=firstpoint;
+ Int_t firstRow=lastpoint, lastRow=firstpoint;
+ //
+ for (Int_t i=firstpoint;i<lastpoint;i++){
+ if (s1->GetClusterIndex2(i)>0) nall0++;
+ if (s2->GetClusterIndex2(i)>0) nall1++;
+ if (s1->GetClusterIndex2(i)>0 && s2->GetClusterIndex2(i)>0) {
+ if (i<firstRow) firstRow=i;
+ if (i>lastRow) lastRow=i;
+ }
+ if ( (s1->GetClusterIndex2(i))==(s2->GetClusterIndex2(i)) && s1->GetClusterIndex2(i)>0) {
+ if (i<firstShared) firstShared=i;
+ if (i>lastShared) lastShared=i;
+ sumShared++;
+ }
+ }
+ Double_t ratio0 = Float_t(sumShared)/Float_t(TMath::Min(nall0+1,nall1+1));
+ Double_t ratio1 = Float_t(sumShared)/Float_t(TMath::Max(nall0+1,nall1+1));
+
+ if( AliTPCReconstructor::StreamLevel()>1){
+ TTreeSRedirector &cstream = *fDebugStreamer;
+ Int_t n0=s1->GetNumberOfClusters();
+ Int_t n1=s2->GetNumberOfClusters();
+ Int_t n0F=s1->GetNFoundable();
+ Int_t n1F=s2->GetNFoundable();
+ Int_t lab0=s1->GetLabel();
+ Int_t lab1=s2->GetLabel();
+
+ cstream<<"Splitted2"<<
+ "iter="<<fIteration<<
+ "lab0="<<lab0<< // MC label if exist
+ "lab1="<<lab1<< // MC label if exist
+ "index0="<<index0<<
+ "index1="<<index1<<
+ "ratio0="<<ratio0<< // shared ratio
+ "ratio1="<<ratio1<< // shared ratio
+ "p0.="<<&par0<< // track parameters
+ "p1.="<<&par1<<
+ "s0.="<<s1<< // full seed
+ "s1.="<<s2<<
+ "n0="<<n0<< // number of clusters track 0
+ "n1="<<n1<< // number of clusters track 1
+ "nall0="<<nall0<< // number of clusters track 0
+ "nall1="<<nall1<< // number of clusters track 1
+ "n0F="<<n0F<< // number of findable
+ "n1F="<<n1F<< // number of findable
+ "shared="<<sumShared<< // number of shared clusters
+ "firstS="<<firstShared<< // first and the last shared row
+ "lastS="<<lastShared<<
+ "firstRow="<<firstRow<< // first and the last row with cluster
+ "lastRow="<<lastRow<< //
+ "\n";
+ }
+ //
+ // remove track with lower quality
+ //
+ if (ratio0>AliTPCReconstructor::GetRecoParam()->GetCutSharedClusters(0) ||
+ ratio1>AliTPCReconstructor::GetRecoParam()->GetCutSharedClusters(1)){
+ //
+ //
+ //
+ delete array->RemoveAt(index1);
+ }
+ }
+ }
+ //
+ // 4. Delete temporary array
+ //
+ delete [] params;
+ delete [] quality;
+ delete [] indexes;
+
+}
+
+
+
+void AliTPCtrackerMI::FindCurling(const TObjArray * array, AliESDEvent */*esd*/, Int_t iter)
+{
+ //
+ // find Curling tracks
+ // Use AliTPCReconstructor::StreamLevel()>1 if you want to tune parameters - cuts
+ //
+ //
+ // Algorithm done in 2 phases - because of CPU consumption
+ // it is n^2 algorithm - for lead-lead 20000x20000 combination are investigated
+ // see detal in MC part what can be used to cut
+ //
+ //
+ //
+ const Float_t kMaxC = 400; // maximal curvature to of the track
+ const Float_t kMaxdTheta = 0.15; // maximal distance in theta
+ const Float_t kMaxdPhi = 0.15; // maximal distance in phi
+ const Float_t kPtRatio = 0.3; // ratio between pt
+ const Float_t kMinDCAR = 2.; // distance to the primary vertex in r - see cpipe cut
+
+ //
+ // Curling tracks cuts
+ //
+ //
+ const Float_t kMaxDeltaRMax = 40; // distance in outer radius
+ const Float_t kMaxDeltaRMin = 5.; // distance in lower radius - see cpipe cut
+ const Float_t kMinAngle = 2.9; // angle between tracks
+ const Float_t kMaxDist = 5; // biggest distance
+ //
+ // The cuts can be tuned using the "MC information stored in Multi tree ==> see FindMultiMC
+ /*
+ Fast cuts:
+ TCut csign("csign","Tr0.fP[4]*Tr1.fP[4]<0"); //opposite sign
+ TCut cmax("cmax","abs(Tr0.GetC())>1/400");
+ TCut cda("cda","sqrt(dtheta^2+dfi^2)<0.15");
+ TCut ccratio("ccratio","abs((Tr0.fP[4]+Tr1.fP[4])/(abs(Tr0.fP[4])+abs(Tr1.fP[4])))<0.3");
+ TCut cpipe("cpipe", "min(abs(r0-rc0),abs(r1-rc1))>5");
+ //
+ TCut cdrmax("cdrmax","abs(abs(rc0+r0)-abs(rc1+r1))<40")
+ TCut cdrmin("cdrmin","abs(abs(rc0+r0)-abs(rc1+r1))<10")
+ //
+ Multi->Draw("dfi","iter==0"+csign+cmax+cda+ccratio); ~94% of curling tracks fulfill
+ Multi->Draw("min(abs(r0-rc0),abs(r1-rc1))","iter==0&&abs(lab1)==abs(lab0)"+csign+cmax+cda+ccratio+cpipe+cdrmin+cdrmax); //80%
+ //
+ Curling2->Draw("dfi","iter==0&&abs(lab0)==abs(lab1)"+csign+cmax+cdtheta+cdfi+ccratio)
+
+ */
+ //
+ //
+ //
+ Int_t nentries = array->GetEntriesFast();
+ AliHelix *helixes = new AliHelix[nentries];
+ for (Int_t i=0;i<nentries;i++){
+ AliTPCseed* track = (AliTPCseed*)array->At(i);
+ if (!track) continue;
+ track->SetCircular(0);
+ new (&helixes[i]) AliHelix(*track);
+ }
+ //
+ //
+ TStopwatch timer;
+ timer.Start();
+ Double_t phase[2][2]={{0,0},{0,0}},radius[2]={0,0};
+
+ //
+ // Find tracks
+ //
+ //
+ for (Int_t i0=0;i0<nentries;i0++){
+ AliTPCseed * track0 = (AliTPCseed*)array->At(i0);
+ if (!track0) continue;
+ if (TMath::Abs(track0->GetC())<1/kMaxC) continue;
+ Float_t xc0 = helixes[i0].GetHelix(6);
+ Float_t yc0 = helixes[i0].GetHelix(7);
+ Float_t r0 = helixes[i0].GetHelix(8);
+ Float_t rc0 = TMath::Sqrt(xc0*xc0+yc0*yc0);
+ Float_t fi0 = TMath::ATan2(yc0,xc0);
+
+ for (Int_t i1=i0+1;i1<nentries;i1++){
+ AliTPCseed * track1 = (AliTPCseed*)array->At(i1);
+ if (!track1) continue;
+ if (TMath::Abs(track1->GetC())<1/kMaxC) continue;
+ Float_t xc1 = helixes[i1].GetHelix(6);
+ Float_t yc1 = helixes[i1].GetHelix(7);
+ Float_t r1 = helixes[i1].GetHelix(8);
+ Float_t rc1 = TMath::Sqrt(xc1*xc1+yc1*yc1);
+ Float_t fi1 = TMath::ATan2(yc1,xc1);
+ //
+ Float_t dfi = fi0-fi1;
+ //
+ //
+ if (dfi>1.5*TMath::Pi()) dfi-=TMath::Pi(); // take care about edge effect
+ if (dfi<-1.5*TMath::Pi()) dfi+=TMath::Pi(); //
+ Float_t dtheta = TMath::Abs(track0->GetTgl()-track1->GetTgl())<TMath::Abs(track0->GetTgl()+track1->GetTgl())? track0->GetTgl()-track1->GetTgl():track0->GetTgl()+track1->GetTgl();
+ //
+ //
+ // FIRST fast cuts
+ if (track0->GetBConstrain()&&track1->GetBConstrain()) continue; // not constrained
+ if (track1->GetSigned1Pt()*track0->GetSigned1Pt()>0) continue; // not the same sign
+ if ( TMath::Abs(track1->GetTgl()+track0->GetTgl())>kMaxdTheta) continue; //distance in the Theta
+ if ( TMath::Abs(dfi)>kMaxdPhi) continue; //distance in phi
+ if ( TMath::Sqrt(dfi*dfi+dtheta*dtheta)>kMaxdPhi) continue; //common angular offset
+ //
+ Float_t pt0 = track0->GetSignedPt();
+ Float_t pt1 = track1->GetSignedPt();
+ if ((TMath::Abs(pt0+pt1)/(TMath::Abs(pt0)+TMath::Abs(pt1)))>kPtRatio) continue;
+ if ((iter==1) && TMath::Abs(TMath::Abs(rc0+r0)-TMath::Abs(rc1+r1))>kMaxDeltaRMax) continue;
+ if ((iter!=1) &&TMath::Abs(TMath::Abs(rc0-r0)-TMath::Abs(rc1-r1))>kMaxDeltaRMin) continue;
+ if (TMath::Min(TMath::Abs(rc0-r0),TMath::Abs(rc1-r1))<kMinDCAR) continue;
+ //
+ //
+ // Now find closest approach
+ //
+ //
+ //
+ Int_t npoints = helixes[i0].GetRPHIintersections(helixes[i1], phase, radius,10);
+ if (npoints==0) continue;
+ helixes[i0].GetClosestPhases(helixes[i1], phase);
+ //
+ Double_t xyz0[3];
+ Double_t xyz1[3];
+ Double_t hangles[3];
+ helixes[i0].Evaluate(phase[0][0],xyz0);
+ helixes[i1].Evaluate(phase[0][1],xyz1);
+
+ helixes[i0].GetAngle(phase[0][0],helixes[i1],phase[0][1],hangles);
+ Double_t deltah[2],deltabest;
+ if (TMath::Abs(hangles[2])<kMinAngle) continue;
+
+ if (npoints>0){
+ Int_t ibest=0;
+ helixes[i0].ParabolicDCA(helixes[i1],phase[0][0],phase[0][1],radius[0],deltah[0],2);
+ if (npoints==2){
+ helixes[i0].ParabolicDCA(helixes[i1],phase[1][0],phase[1][1],radius[1],deltah[1],2);
+ if (deltah[1]<deltah[0]) ibest=1;
+ }
+ deltabest = TMath::Sqrt(deltah[ibest]);
+ helixes[i0].Evaluate(phase[ibest][0],xyz0);
+ helixes[i1].Evaluate(phase[ibest][1],xyz1);
+ helixes[i0].GetAngle(phase[ibest][0],helixes[i1],phase[ibest][1],hangles);
+ Double_t radiusbest = TMath::Sqrt(radius[ibest]);
+ //
+ if (deltabest>kMaxDist) continue;
+ // if (mindcar+mindcaz<40 && (TMath::Abs(hangles[2])<kMinAngle ||deltabest>3)) continue;
+ Bool_t sign =kFALSE;
+ if (hangles[2]>kMinAngle) sign =kTRUE;
+ //
+ if (sign){
+ // circular[i0] = kTRUE;
+ // circular[i1] = kTRUE;
+ if (track0->OneOverPt()<track1->OneOverPt()){
+ track0->SetCircular(track0->GetCircular()+1);
+ track1->SetCircular(track1->GetCircular()+2);
+ }
+ else{
+ track1->SetCircular(track1->GetCircular()+1);
+ track0->SetCircular(track0->GetCircular()+2);
+ }
+ }
+ if (AliTPCReconstructor::StreamLevel()>2){
+ //
+ //debug stream to tune "fine" cuts
+ Int_t lab0=track0->GetLabel();
+ Int_t lab1=track1->GetLabel();
+ TTreeSRedirector &cstream = *fDebugStreamer;
+ cstream<<"Curling2"<<
+ "iter="<<iter<<
+ "lab0="<<lab0<<
+ "lab1="<<lab1<<
+ "Tr0.="<<track0<<
+ "Tr1.="<<track1<<
+ //
+ "r0="<<r0<<
+ "rc0="<<rc0<<
+ "fi0="<<fi0<<
+ "r1="<<r1<<
+ "rc1="<<rc1<<
+ "fi1="<<fi1<<
+ "dfi="<<dfi<<
+ "dtheta="<<dtheta<<
+ //
+ "npoints="<<npoints<<
+ "hangles0="<<hangles[0]<<
+ "hangles1="<<hangles[1]<<
+ "hangles2="<<hangles[2]<<
+ "xyz0="<<xyz0[2]<<
+ "xyzz1="<<xyz1[2]<<
+ "radius="<<radiusbest<<
+ "deltabest="<<deltabest<<
+ "phase0="<<phase[ibest][0]<<
+ "phase1="<<phase[ibest][1]<<
+ "\n";
+
+ }
+ }
+ }
+ }
+ delete [] helixes;
+ if (AliTPCReconstructor::StreamLevel()>1) {
+ AliInfo("Time for curling tracks removal");
+ timer.Print();
+ }