+ } // InnLay - second cluster
+ } // InnLay - first cluster
+
+ if(i1InnLayBest>-1 && i2InnLayBest>-1) {
+ xvtx = 0.5*(xclInnLay[i1InnLayBest]+xclInnLay[i2InnLayBest]);
+ yvtx = 0.5*(yclInnLay[i1InnLayBest]+yclInnLay[i2InnLayBest]);
+ zvtx = 0.5*(zclInnLay[i1InnLayBest]+zclInnLay[i2InnLayBest]);
+ rvtx = TMath::Sqrt(xvtx*xvtx+yvtx*yvtx);
+ if(rvtx<fMaxVtxRadius[ilayer]) {
+ ncontributors = ilayer;
+ pos[0] = xvtx;
+ pos[1] = yvtx;
+ pos[2] = zvtx;
+ err[0]=TMath::Sqrt(0.25*(e2xclInnLay[i1InnLayBest]+e2xclInnLay[i2InnLayBest]));
+ err[1]=TMath::Sqrt(0.25*(e2yclInnLay[i1InnLayBest]+e2yclInnLay[i2InnLayBest]));
+ err[2]=TMath::Sqrt(0.25*(e2zclInnLay[i1InnLayBest]+e2zclInnLay[i2InnLayBest]));
+ }
+
+ } else { // give it a try exchanging InnLay and OutLay
+
+ // OutLay - first cluster
+ for(i1InnLay=0; i1InnLay<nclOutLayStored; i1InnLay++) {
+ p1[0]=xclOutLay[i1InnLay];
+ p1[1]=yclOutLay[i1InnLay];
+ p1[2]=zclOutLay[i1InnLay];
+ // OutLay - second cluster
+ for(i2InnLay=i1InnLay+1; i2InnLay<nclOutLayStored; i2InnLay++) {
+ if(modclOutLay[i1InnLay]==modclOutLay[i2InnLay]) continue;
+ p2[0]=xclOutLay[i2InnLay];
+ p2[1]=yclOutLay[i2InnLay];
+ p2[2]=zclOutLay[i2InnLay];
+ // look for point on InnLay
+ AliStrLine outLayline(p1,p2,kTRUE);
+ for(iOutLay=0; iOutLay<nclInnLayStored; iOutLay++) {
+ p3[0]=xclInnLay[iOutLay];
+ p3[1]=yclInnLay[iOutLay];
+ p3[2]=zclInnLay[iOutLay];
+ //printf(" %f\n",InnLayline.GetDistFromPoint(p3));
+ matchOutLayValue=outLayline.GetDistFromPoint(p3);
+ distxyInnLay = (p1[0]-p2[0])*(p1[0]-p2[0])+(p1[1]-p2[1])*(p1[1]-p2[1]);
+ if(matchOutLayValue<fMaxDistOnOuterLayer &&
+ distxyInnLay>distxyInnLayBest) {
+ distxyInnLayBest=distxyInnLay;
+ i1InnLayBest=i1InnLay;
+ i2InnLayBest=i2InnLay;
+ }
+ }
+ } // OutLay - second cluster
+ } // OutLay - first cluster
+
+ if(i1InnLayBest>-1 && i2InnLayBest>-1) {
+ xvtx = 0.5*(xclOutLay[i1InnLayBest]+xclOutLay[i2InnLayBest]);
+ yvtx = 0.5*(yclOutLay[i1InnLayBest]+yclOutLay[i2InnLayBest]);
+ zvtx = 0.5*(zclOutLay[i1InnLayBest]+zclOutLay[i2InnLayBest]);