- Float_t tquality;
- Double_t kroady = fReconstructor->GetRecoParam() ->GetRoad1y();
- Double_t kroadz = fPadLength * .5 + 1.;
-
- // initialize configuration parameters
- Float_t zcorr = kZcorr ? fTilt * (fZProb - fZref[0]) : 0.;
- Int_t niter = kZcorr ? 1 : 2;
-
- Double_t yexp, zexp;
- Int_t ncl = 0;
- // start seed update
- for (Int_t iter = 0; iter < niter; iter++) {
- ncl = 0;
- for (Int_t iTime = 0; iTime < AliTRDtrackerV1::GetNTimeBins(); iTime++) {
- if(!(layer = chamber->GetTB(iTime))) continue;
- if(!Int_t(*layer)) continue;
-
- // define searching configuration
- Double_t dxlayer = layer->GetX() - fX0;
- if(c){
- zexp = c->GetZ();
- //Try 2 pad-rows in second iteration
- if (iter > 0) {
- zexp = fZref[0] + fZref[1] * dxlayer - zcorr;
- if (zexp > c->GetZ()) zexp = c->GetZ() + fPadLength*0.5;
- if (zexp < c->GetZ()) zexp = c->GetZ() - fPadLength*0.5;
- }
- } else zexp = fZref[0] + (kZcorr ? fZref[1] * dxlayer : 0.);
- yexp = fYref[0] + fYref[1] * dxlayer - zcorr;
-
- // Get and register cluster
- Int_t index = layer->SearchNearestCluster(yexp, zexp, kroady, kroadz);
- if (index < 0) continue;
- AliTRDcluster *cl = (*layer)[index];
-
- fIndexes[iTime] = layer->GetGlobalIndex(index);
- fClusters[iTime] = cl;
- fY[iTime] = cl->GetY();
- fZ[iTime] = cl->GetZ();
- ncl++;
+ // working variables
+ const Int_t kNrows = 16;
+ const Int_t kNcls = 3*kNclusters; // buffer size
+ TObjArray clst[kNrows];
+ Bool_t blst[kNrows][kNcls];
+ Double_t cond[4],
+ dx, dy, dz,
+ yt, zt,
+ zc[kNrows],
+ xres[kNrows][kNcls], yres[kNrows][kNcls], zres[kNrows][kNcls], s2y[kNrows][kNcls];
+ Int_t idxs[kNrows][kNcls], ncl[kNrows], ncls = 0;
+ memset(ncl, 0, kNrows*sizeof(Int_t));
+ memset(zc, 0, kNrows*sizeof(Double_t));
+ memset(idxs, 0, kNrows*kNcls*sizeof(Int_t));
+ memset(xres, 0, kNrows*kNcls*sizeof(Double_t));
+ memset(yres, 0, kNrows*kNcls*sizeof(Double_t));
+ memset(zres, 0, kNrows*kNcls*sizeof(Double_t));
+ memset(s2y, 0, kNrows*kNcls*sizeof(Double_t));
+ memset(blst, 0, kNrows*kNcls*sizeof(Bool_t)); //this is 8 times faster to memset than "memset(clst, 0, kNrows*kNcls*sizeof(AliTRDcluster*))"
+
+ Double_t roady(0.), s2Mean(0.), sMean(0.); Int_t ns2Mean(0);
+
+ // Do cluster projection and pick up cluster candidates
+ AliTRDcluster *c(NULL);
+ AliTRDchamberTimeBin *layer(NULL);
+ Bool_t kBUFFER = kFALSE;
+ for (Int_t it = 0; it < kNtb; it++) {
+ if(!(layer = chamber->GetTB(it))) continue;
+ if(!Int_t(*layer)) continue;
+ // get track projection at layers position
+ dx = fX0 - layer->GetX();
+ yt = fYref[0] - fYref[1] * dx;
+ zt = fZref[0] - fZref[1] * dx;
+ // get standard cluster error corrected for tilt if selected
+ cp.SetLocalTimeBin(it);
+ cp.SetSigmaY2(0.02, fDiffT, fExB, dx, -1./*zt*/, fYref[1]);
+ s2yCl = cp.GetSigmaY2() + sysCov[0]; if(!tilt) s2yCl = (s2yCl + t2*s2zCl)/(1.+t2);
+ if(TMath::Abs(it-12)<7){ s2Mean += cp.GetSigmaY2(); ns2Mean++;}
+ // get estimated road in r-phi direction
+ roady = TMath::Min(3.*TMath::Sqrt(12.*(s2yTrk + s2yCl)), kroady);
+
+ AliDebug(5, Form("\n"
+ " %2d xd[cm]=%6.3f yt[cm]=%7.2f zt[cm]=%8.2f\n"
+ " syTrk[um]=%6.2f syCl[um]=%6.2f syClTlt[um]=%6.2f\n"
+ " Ry[mm]=%f"
+ , it, dx, yt, zt
+ , 1.e4*TMath::Sqrt(s2yTrk), 1.e4*TMath::Sqrt(cp.GetSigmaY2()+sysCov[0]), 1.e4*TMath::Sqrt(s2yCl)
+ , 1.e1*roady));
+
+ // get clusters from layer
+ cond[0] = yt/*+0.5*kroadyShift*kroady*/; cond[2] = roady;
+ cond[1] = zt; cond[3] = kroadz;
+ Int_t n=0, idx[6]; layer->GetClusters(cond, idx, n, 6);
+ for(Int_t ic = n; ic--;){
+ c = (*layer)[idx[ic]];
+ dx = fX0 - c->GetX();
+ yt = fYref[0] - fYref[1] * dx;
+ zt = fZref[0] - fZref[1] * dx;
+ dz = zt - c->GetZ();
+ dy = yt - (c->GetY() + (tilt ? (GetTilt() * dz) : 0.));
+ Int_t r = c->GetPadRow();
+ clst[r].AddAtAndExpand(c, ncl[r]);
+ blst[r][ncl[r]] = kTRUE;
+ idxs[r][ncl[r]] = idx[ic];
+ zres[r][ncl[r]] = dz/GetPadLength();
+ yres[r][ncl[r]] = dy;
+ xres[r][ncl[r]] = dx;
+ zc[r] = c->GetZ();
+ // TODO temporary solution to avoid divercences in error parametrization
+ s2y[r][ncl[r]] = TMath::Min(c->GetSigmaY2()+sysCov[0], 0.025);
+ AliDebug(5, Form(" -> dy[cm]=%+7.4f yc[cm]=%7.2f row[%d] idx[%2d]", dy, c->GetY(), r, ncl[r]));
+ ncl[r]++; ncls++;
+
+ if(ncl[r] >= kNcls) {
+ AliWarning(Form("Cluster candidates row[%d] reached buffer limit[%d]. Some may be lost.", r, kNcls));
+ kBUFFER = kTRUE;
+ break;
+ }