+
+void AliTRDrawStream::SortTracklets(TClonesArray *trklArray, TList &sortedTracklets, Int_t *indices)
+{
+ // sort tracklets for referencing from GTU tracks
+
+ Int_t nTracklets = trklArray->GetEntriesFast();
+
+ Int_t lastHC = -1;
+ for (Int_t iTracklet = 0; iTracklet < nTracklets; iTracklet++) {
+ AliTRDtrackletBase *trkl = (AliTRDtrackletBase*) ((*trklArray)[iTracklet]);
+ Int_t hc = trkl->GetHCId();
+ if ((hc < 0) || (hc >= 1080)) {
+ AliErrorClass(Form("HC for tracklet: 0x%08x out of range: %i", trkl->GetTrackletWord(), trkl->GetHCId()));
+ continue;
+ }
+ AliDebugClass(5, Form("hc: %4i : 0x%08x z: %2i", hc, trkl->GetTrackletWord(), trkl->GetZbin()));
+ if (hc != lastHC) {
+ AliDebugClass(2, Form("set tracklet index for HC %i to %i", hc, iTracklet));
+ indices[hc] = iTracklet + 1;
+ lastHC = hc;
+ }
+ }
+
+ for (Int_t iDet = 0; iDet < 540; iDet++) {
+ Int_t trklIndexA = indices[2*iDet + 0] - 1;
+ Int_t trklIndexB = indices[2*iDet + 1] - 1;
+ Int_t trklIndex = sortedTracklets.GetEntries();
+ AliTRDtrackletBase *trklA = trklIndexA > -1 ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexA]) : 0x0;
+ AliTRDtrackletBase *trklB = trklIndexB > -1 ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexB]) : 0x0;
+ AliTRDtrackletBase *trklNext = 0x0;
+ while (trklA != 0x0 || trklB != 0x0) {
+ AliDebugClass(5, Form("det %i - A: %i/%i -> %p, B: %i/%i -> %p",
+ iDet, trklIndexA, nTracklets, trklA, trklIndexB, nTracklets, trklB));
+ if (trklA == 0x0) {
+ trklNext = trklB;
+ trklIndexB++;
+ trklB = trklIndexB < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexB]) : 0x0;
+ if (trklB && trklB->GetHCId() != 2*iDet + 1)
+ trklB = 0x0;
+ }
+ else if (trklB == 0x0) {
+ trklNext = trklA;
+ trklIndexA++;
+ trklA = trklIndexA < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexA]) : 0x0;
+ if (trklA && trklA->GetHCId() != 2*iDet)
+ trklA = 0x0;
+ }
+ else {
+ if ((trklA->GetZbin() < trklB->GetZbin()) ||
+ ((trklA->GetZbin() == trklB->GetZbin()) && (trklA->GetYbin() < trklB->GetYbin()))) {
+ trklNext = trklA;
+ trklIndexA++;
+ trklA = trklIndexA < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexA]) : 0x0;
+ if (trklA && trklA->GetHCId() != 2*iDet)
+ trklA = 0x0;
+ }
+ else {
+ trklNext = trklB;
+ trklIndexB++;
+ trklB = trklIndexB < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexB]) : 0x0;
+ if (trklB && trklB->GetHCId() != 2*iDet + 1)
+ trklB = 0x0;
+ }
+ }
+ if (trklNext) {
+ Int_t label = -2; // mark raw tracklets with label -2
+ if (AliTRDtrackletMCM *trklMCM = dynamic_cast<AliTRDtrackletMCM*> (trklNext))
+ label = trklMCM->GetLabel();
+ AliESDTrdTracklet *esdTracklet = new AliESDTrdTracklet(trklNext->GetTrackletWord(), trklNext->GetHCId(), label);
+ sortedTracklets.Add(esdTracklet);
+ }
+
+ // updating tracklet indices as in output
+ if (sortedTracklets.GetEntries() != trklIndex) {
+ indices[2*iDet + 0] = indices[2*iDet + 1] = trklIndex;
+ }
+ else
+ indices[2*iDet + 0] = indices[2*iDet + 1] = -1;
+ }
+ }
+}