+ }
+
+//=======================================================================================
+ // Analyse cluster topology
+ Double_t f[kNcls], // likelihood factors for segments
+ r[2][kNcls], // d(dydx) of tracklet candidate with respect to track
+ xm[2][kNcls], // mean <x>
+ ym[2][kNcls], // mean <y>
+ sm[2][kNcls], // mean <s_y>
+ s[2][kNcls], // sigma_y
+ p[2][kNcls], // prob of Gauss
+ q[2][kNcls]; // charge/segment
+ memset(f, 0, kNcls*sizeof(Double_t));
+ Int_t index[2][kNcls], n[2][kNcls];
+ memset(n, 0, 2*kNcls*sizeof(Int_t));
+ Int_t mts(0), nts[2] = {0, 0}; // no of tracklet segments in row
+ AliTRDpadPlane *pp(AliTRDtransform::Geometry().GetPadPlane(fDet));
+ AliTRDtrackletOflHelper helper;
+ Int_t lyDet(AliTRDgeometry::GetLayer(fDet));
+ for(Int_t jr(0), n0(0); jr<nrc; jr++){
+ Int_t ir(idxRow[jr]);
+ // cluster segmentation
+ Bool_t kInit(kFALSE);
+ if(jr==0){
+ n0 = helper.Init(pp, &clst[ir]); kInit = kTRUE;
+ if(!n0 || (helper.ClassifyTopology() == AliTRDtrackletOflHelper::kNormal)){
+ nts[jr] = 1; memset(index[jr], 0, ncl[ir]*sizeof(Int_t));
+ n[jr][0] = ncl[ir];
+ }
+ }
+ if(!n[jr][0]){
+ nts[jr] = AliTRDtrackletOflHelper::Segmentation(ncl[ir], xres[ir], yres[ir], index[jr]);
+ for(Int_t ic(ncl[ir]);ic--;) n[jr][index[jr][ic]]++;
+ }
+ mts += nts[jr];
+
+ // tracklet segment processing
+ for(Int_t its(0); its<nts[jr]; its++){
+ if(n[jr][its]<=2) { // don't touch small segments
+ xm[jr][its] = 0.;ym[jr][its] = 0.;sm[jr][its] = 0.;
+ for(Int_t ic(ncl[ir]); ic--;){
+ if(its != index[jr][ic]) continue;
+ ym[jr][its] += yres[ir][ic];
+ xm[jr][its] += xres[ir][ic];
+ sm[jr][its] += TMath::Sqrt(s2y[ir][ic]);
+ }
+ if(n[jr][its]==2){ xm[jr][its] *= 0.5; ym[jr][its] *= 0.5; sm[jr][its] *= 0.5;}
+ xm[jr][its]= fX0 - xm[jr][its];
+ r[jr][its] = 0.;
+ s[jr][its] = 1.e-5;
+ p[jr][its] = 1.;
+ q[jr][its] = -1.;
+ continue;
+ }
+
+ // for longer tracklet segments
+ if(!kInit) n0 = helper.Init(pp, &clst[ir], index[jr], its);
+ Int_t n1 = helper.GetRMS(r[jr][its], ym[jr][its], s[jr][its], fX0/*xm[jr][its]*/);
+ p[jr][its] = Double_t(n1)/n0;
+ sm[jr][its] = helper.GetSyMean();
+ q[jr][its] = helper.GetQ()/TMath::Sqrt(1. + fYref[1]*fYref[1] + fZref[1]*fZref[1]);
+ xm[jr][its] = fX0;
+ Double_t dxm= fX0 - xm[jr][its];
+ yt = fYref[0] - fYref[1]*dxm;
+ zt = fZref[0] - fZref[1]*dxm;
+ // correct tracklet fit for tilt
+ ym[jr][its]+= GetTilt()*(zt - zc[ir]);
+ r[jr][its] += GetTilt() * fZref[1];
+ // correct tracklet fit for track position/inclination
+ ym[jr][its] = yt - ym[jr][its];
+ r[jr][its] = (r[jr][its] - fYref[1])/(1+r[jr][its]*fYref[1]);
+ // report inclination in radians
+ r[jr][its] = TMath::ATan(r[jr][its]);
+ if(jr) continue; // calculate only for first row likelihoods
+
+ f[its] = attach->CookLikelihood(chgPos, lyDet, fPt, phiTrk, n[jr][its], ym[jr][its]/*sRef*/, r[jr][its]*TMath::RadToDeg(), s[jr][its]/sm[jr][its]);
+ }
+ }
+ AliDebug(4, Form(" Tracklet candidates: row[%2d] = %2d row[%2d] = %2d:", idxRow[0], nts[0], idxRow[1], nts[1]));
+ if(AliLog::GetDebugLevel("TRD", "AliTRDseedV1")>3){
+ for(Int_t jr(0); jr<nrc; jr++){
+ Int_t ir(idxRow[jr]);
+ for(Int_t its(0); its<nts[jr]; its++){
+ printf(" segId[%2d] row[%2d] Ncl[%2d] x[cm]=%7.2f dz[pu]=%4.2f dy[mm]=%+7.3f r[deg]=%+6.2f p[%%]=%6.2f s[um]=%7.2f\n",
+ its, ir, n[jr][its], xm[jr][its], zresRow[jr], 1.e1*ym[jr][its], r[jr][its]*TMath::RadToDeg(), 100.*p[jr][its], 1.e4*s[jr][its]);
+ }
+ }
+ }
+ if(!pstreamer && recoParam->GetStreamLevel(AliTRDrecoParam::kTracker) > 2 && fkReconstructor->IsDebugStreaming()) pstreamer = fkReconstructor->GetDebugStream(AliTRDrecoParam::kTracker);
+ if(pstreamer){
+ // save config. for calibration
+ TVectorD vidx, vn, vx, vy, vr, vs, vsm, vp, vf;
+ vidx.ResizeTo(ncl[idxRow[0]]+(idxRow[1]<0?0:ncl[idxRow[1]]));
+ vn.ResizeTo(mts);
+ vx.ResizeTo(mts);
+ vy.ResizeTo(mts);
+ vr.ResizeTo(mts);
+ vs.ResizeTo(mts);
+ vsm.ResizeTo(mts);
+ vp.ResizeTo(mts);
+ vf.ResizeTo(mts);
+ for(Int_t jr(0), jts(0), jc(0); jr<nrc; jr++){
+ Int_t ir(idxRow[jr]);
+ for(Int_t its(0); its<nts[jr]; its++, jts++){
+ vn[jts] = n[jr][its];
+ vx[jts] = xm[jr][its];
+ vy[jts] = ym[jr][its];
+ vr[jts] = r[jr][its];
+ vs[jts] = s[jr][its];
+ vsm[jts]= sm[jr][its];
+ vp[jts] = p[jr][its];
+ vf[jts] = jr?-1.:f[its];
+ }
+ for(Int_t ic(0); ic<ncl[ir]; ic++, jc++) vidx[jc] = index[jr][ic];
+ }
+ (*pstreamer) << "AttachClusters3"
+ << "idx=" << &vidx
+ << "n=" << &vn
+ << "x=" << &vx
+ << "y=" << &vy
+ << "r=" << &vr
+ << "s=" << &vs
+ << "sm=" << &vsm
+ << "p=" << &vp
+ << "f=" << &vf
+ << "\n";
+ }
+
+//=========================================================
+ // Get seed tracklet segment
+ Int_t idx2[kNcls]; memset(idx2, 0, kNcls*sizeof(Int_t)); // seeding indexing
+ if(nts[0]>1) TMath::Sort(nts[0], f, idx2);
+ Int_t is(idx2[0]); // seed index
+ Int_t idxTrklt[kNcls],
+ kts(0),
+ nTrklt(n[0][is]);
+ Double_t fTrklt(f[is]),
+ rTrklt(r[0][is]),
+ yTrklt(ym[0][is]),
+ sTrklt(s[0][is]),
+ smTrklt(sm[0][is]),
+ xTrklt(xm[0][is]),
+ pTrklt(p[0][is]),
+ qTrklt(q[0][is]);
+ memset(idxTrklt, 0, kNcls*sizeof(Int_t));
+ // check seed idx2[0] exit if not found
+ if(f[is]<1.e-2){
+ AliDebug(1, Form("Seed seg[%d] row[%2d] n[%2d] f[%f]<0.01.", is, idxRow[0], n[0][is], f[is]));
+ SetErrorMsg(kAttachClAttach);
+ if(!pstreamer && recoParam->GetStreamLevel(AliTRDrecoParam::kTracker) > 1 && fkReconstructor->IsDebugStreaming()) pstreamer = fkReconstructor->GetDebugStream(AliTRDrecoParam::kTracker);
+ if(pstreamer){
+ UChar_t stat(0);
+ if(IsKink()) SETBIT(stat, 1);
+ if(IsStandAlone()) SETBIT(stat, 2);
+ if(IsRowCross()) SETBIT(stat, 3);
+ SETBIT(stat, 4); // set error bit
+ TVectorD vidx; vidx.ResizeTo(1); vidx[0] = is;
+ (*pstreamer) << "AttachClusters2"
+ << "stat=" << stat
+ << "ev=" << ev
+ << "chg=" << chgPos
+ << "det=" << fDet
+ << "x0=" << fX0
+ << "y0=" << fYref[0]
+ << "z0=" << fZref[0]
+ << "phi=" << phiTrk
+ << "tht=" << thtTrk
+ << "pt=" << fPt
+ << "s2Trk=" << s2yTrk
+ << "s2Cl=" << s2Mean
+ << "idx=" << &vidx
+ << "n=" << nTrklt
+ << "f=" << fTrklt
+ << "x=" << xTrklt
+ << "y=" << yTrklt
+ << "r=" << rTrklt
+ << "s=" << sTrklt
+ << "sm=" << smTrklt
+ << "p=" << pTrklt
+ << "q=" << qTrklt
+ << "\n";
+ }
+ return kFALSE;
+ }
+ AliDebug(2, Form("Seed seg[%d] row[%2d] n[%2d] dy[%f] r[%+5.2f] s[%+5.2f] f[%5.3f] q[%6.2f]", is, idxRow[0], n[0][is], ym[0][is], r[0][is]*TMath::RadToDeg(), s[0][is]/sm[0][is], f[is], q[0][is]));
+
+ // save seeding segment in the helper
+ idxTrklt[kts++] = is;
+ helper.Init(pp, &clst[idxRow[0]], index[0], is);
+ AliTRDtrackletOflHelper test; // helper to test segment expantion
+ Float_t rcLikelihood(0.); SetBit(kRowCross, kFALSE);
+ Double_t dyRez[kNcls]; Int_t idx3[kNcls];