]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDgtuTMU.cxx
Coverity fixes (Jitendra).
[u/mrichter/AliRoot.git] / TRD / AliTRDgtuTMU.cxx
CommitLineData
52c19022 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/* $Id: AliTRDgtuTMU.cxx 28397 2008-09-02 09:33:00Z cblume $ */
17
18////////////////////////////////////////////////////////////////////////////
19// //
20// Track Matching Unit (TMU) simulation //
21// //
22// Author: J. Klein (Jochen.Klein@cern.ch) //
23// //
24////////////////////////////////////////////////////////////////////////////
25
26#include "TTree.h"
27#include "TList.h"
28#include "TVectorD.h"
29#include "TMath.h"
30
31#include "AliESDEvent.h"
32#include "AliESDTrdTrack.h"
33
34#include "AliLog.h"
35#include "AliTRDgeometry.h"
36#include "AliTRDpadPlane.h"
37
38#include "AliTRDgtuParam.h"
39#include "AliTRDgtuTMU.h"
40#include "AliTRDtrackGTU.h"
41
42ClassImp(AliTRDgtuTMU)
43
44AliTRDgtuTMU::AliTRDgtuTMU(Int_t stack, Int_t sector) :
45 TObject(),
46 fTracklets(0x0),
44eafcf2 47 fTrackletsPostInput(0x0),
52c19022 48 fZChannelTracklets(0x0),
49 fTracks(0x0),
50 fGtuParam(0x0),
51 fStack(-1),
52 fSector(-1)
53{
36dc3337 54 // constructor which initializes the position information of the TMU
55
52c19022 56 fGtuParam = AliTRDgtuParam::Instance();
44eafcf2 57
58 // store tracklets per link
59 fTracklets = new TObjArray*[fGtuParam->GetNLinks()];
60 for (Int_t iLink = 0; iLink < fGtuParam->GetNLinks(); iLink++) {
61 fTracklets[iLink] = new TObjArray();
62 }
63
64 // tracklets after input units per layer
65 fTrackletsPostInput = new TObjArray*[fGtuParam->GetNLayers()];
52c19022 66 fZChannelTracklets = new TList*[fGtuParam->GetNLayers()];
67 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
52c19022 68 fZChannelTracklets[layer] = new TList[fGtuParam->GetNZChannels()];
44eafcf2 69 fTrackletsPostInput[layer] = new TObjArray();
52c19022 70 }
44eafcf2 71
52c19022 72 fTracks = new TList*[fGtuParam->GetNZChannels()];
73 for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) {
74 fTracks[zch] = new TList[fGtuParam->GetNRefLayers()];
75 }
44eafcf2 76
5f006bd7 77 if (stack > -1)
52c19022 78 SetStack(stack);
79 if (sector > -1)
80 SetSector(sector);
81}
82
5f006bd7 83AliTRDgtuTMU::~AliTRDgtuTMU()
52c19022 84{
36dc3337 85 // destructor
86
52c19022 87 for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) {
88 delete [] fTracks[zch];
89 }
90 delete [] fTracks;
91 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
52c19022 92 delete [] fZChannelTracklets[layer];
a3461d38 93 delete fTrackletsPostInput[layer];
52c19022 94 }
95 delete [] fZChannelTracklets;
a3461d38 96 delete [] fTrackletsPostInput;
44eafcf2 97
98 for (Int_t iLink = 0; iLink < fGtuParam->GetNLinks(); iLink++) {
99 delete fTracklets[iLink];
100 }
52c19022 101 delete [] fTracklets;
102}
103
104Bool_t AliTRDgtuTMU::SetSector(Int_t sector)
105{
106 // set the sector
107
108 if (sector > -1 && sector < fGtuParam->GetGeo()->Nsector() ) {
5f006bd7 109 fSector = sector;
52c19022 110 return kTRUE;
111 }
112
113 AliError(Form("Invalid sector given: %i", sector));
114 return kFALSE;
115}
116
5f006bd7 117Bool_t AliTRDgtuTMU::SetStack(Int_t stack)
52c19022 118{
119 // Set the stack (necessary for tracking)
120
121 if (stack > -1 && stack < fGtuParam->GetGeo()->Nstack() ) {
122 fStack = stack;
123 return kTRUE;
124 }
125
126 AliError(Form("Invalid stack given: %i", stack));
127 return kFALSE;
128}
129
5f006bd7 130Bool_t AliTRDgtuTMU::Reset()
52c19022 131{
132 // delete all tracks
133
134 for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) {
135 for (Int_t reflayeridx = 0; reflayeridx < fGtuParam->GetNRefLayers(); reflayeridx++) {
136 fTracks[zch][reflayeridx].Clear();
137 }
138 }
139
140 // delete all added tracklets
44eafcf2 141 for (Int_t iLink = 0; iLink < fGtuParam->GetNLinks(); iLink++) {
142 fTracklets[iLink]->Clear();
143 }
52c19022 144 for (Int_t layer = 0; layer < fGtuParam->GetNLinks()/2; layer++) {
44eafcf2 145 fTrackletsPostInput[layer]->Clear();
52c19022 146 for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++)
147 fZChannelTracklets[layer][zch].Clear();
52c19022 148 }
149
150 fSector = -1;
151 fStack = -1;
152
153 return kTRUE;
154}
155
44eafcf2 156Bool_t AliTRDgtuTMU::AddTracklet(AliTRDtrackletGTU *tracklet, Int_t link)
52c19022 157{
158 // add a tracklet on the given link
159
44eafcf2 160 fTracklets[link]->Add(tracklet);
52c19022 161 return kTRUE;
162}
163
164
5f006bd7 165Bool_t AliTRDgtuTMU::RunTMU(TList *ListOfTracks, AliESDEvent *esd)
52c19022 166{
167 // performs the analysis as in a TMU module of the GTU, i. e.
168 // track matching
169 // calculation of track parameteres (pt, deflection, ???)
170
171 if (fStack < 0 || fSector < 0) {
36dc3337 172 AliError("No valid stack/sector set for this TMU! No tracking!");
52c19022 173 return kFALSE;
174 }
175
176 // ----- Input units -----
c8b1590d 177 AliDebug(1,"--------- Running Input units ----------");
52c19022 178 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
179 if (!RunInputUnit(layer)) {
180 AliError(Form("Input unit in layer %i failed", layer));
181 return kFALSE;
182 }
183 }
184
185 // ----- Z-channel units -----
c8b1590d 186 AliDebug(1,"--------- Running Z-channel units ----------");
52c19022 187 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
52c19022 188 if (!RunZChannelUnit(layer)) {
189 AliError(Form("Z-Channel unit in layer %i failed", layer));
190 return kFALSE;
191 }
192 }
193
194 // ----- track finding -----
c8b1590d 195 AliDebug(1,"--------- Running tracking units ----------");
52c19022 196 for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) {
52c19022 197 if (!RunTrackFinder(zch, ListOfTracks)) {
198 AliError(Form("Track Finder in z-channel %i failed", zch));
199 return kFALSE;
200 }
5f006bd7 201 }
52c19022 202
203 // ----- Track Merging -----
204 if (!RunTrackMerging(ListOfTracks)) {
205 AliError("Track merging failed");
206 return kFALSE;
207 }
208
209 // ----- track reconstruction -----
210 if (!RunTrackReconstruction(ListOfTracks)) {
211 AliError("Track reconstruction failed");
212 return kFALSE;
213 }
214
2f1bde31 215 // ----- label calculation and ESD storage -----
216 TIter next(ListOfTracks);
217 while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) next()) {
218 trk->CookLabel();
219 if (esd) {
220 AliESDTrdTrack *trdtrack = trk->CreateTrdTrack();
221 esd->AddTrdTrack(trdtrack);
222 delete trdtrack;
223 }
52c19022 224 }
225
226 return kTRUE;
227}
228
5f006bd7 229Bool_t AliTRDgtuTMU::RunInputUnit(Int_t layer)
52c19022 230{
231 // precalculations for the tracking and reconstruction
232
44eafcf2 233 Int_t iTrkl0 = 0; // A-side tracklet
234 Int_t iTrkl1 = 0; // B-side tracklet
235
a3461d38 236 Int_t nTracklets = 0;
237 while ((!fGtuParam->GetLimitNoTracklets() ||
238 (nTracklets < fGtuParam->GetMaxNoTracklets())) &&
239 ((iTrkl0 < fTracklets[2*layer + 0]->GetEntriesFast()) ||
240 (iTrkl1 < fTracklets[2*layer + 1]->GetEntriesFast()))) {
44eafcf2 241 if (iTrkl1 >= fTracklets[2*layer + 1]->GetEntriesFast()) {
242 fTrackletsPostInput[layer]->AddLast(fTracklets[2*layer + 0]->At(iTrkl0));
243 iTrkl0++;
244 }
245 else {
246 if (iTrkl0 >= fTracklets[2*layer + 0]->GetEntriesFast()) {
247 fTrackletsPostInput[layer]->AddLast(fTracklets[2*layer + 1]->At(iTrkl1));
248 iTrkl1++;
249 }
250 else {
251 if (((AliTRDtrackletGTU*) fTracklets[2*layer + 1]->At(iTrkl1))->GetZbin() <
252 ((AliTRDtrackletGTU*) fTracklets[2*layer + 0]->At(iTrkl0))->GetZbin()) {
253 fTrackletsPostInput[layer]->AddLast(fTracklets[2*layer + 1]->At(iTrkl1));
254 iTrkl1++;
255
256 }
257 else {
258 fTrackletsPostInput[layer]->AddLast(fTracklets[2*layer + 0]->At(iTrkl0));
259 iTrkl0++;
260 }
261 }
262 }
a3461d38 263 ++nTracklets;
44eafcf2 264 }
265
266 TIter next(fTrackletsPostInput[layer]);
52c19022 267
268 while ( AliTRDtrackletGTU *trk = (AliTRDtrackletGTU*) next() ) {
44eafcf2 269 trk->SetIndex(fTrackletsPostInput[layer]->IndexOf(trk));
52c19022 270
5f006bd7 271 Int_t alpha = (trk->GetYbin() >> fGtuParam->GetBitExcessY()) * fGtuParam->GetCiAlpha(layer);
52c19022 272 alpha = ( 2 * trk->GetdY() - (alpha >> fGtuParam->GetBitExcessAlpha()) + 1 ) >> 1;
a10c6981 273 // wrapping projected alpha as in hardware
274 if ((alpha < -64) || (alpha > 63))
bec8ed9c 275 AliDebug(1, Form("alpha out of range: %i", alpha));
a10c6981 276 alpha = alpha & 0x7f;
277 if (alpha & 0x40)
278 trk->SetAlpha(0xffffffc0 | alpha);
279 else
280 trk->SetAlpha(alpha);
52c19022 281
ec5db61b 282 Int_t yproj = trk->GetdY() * (fGtuParam->GetCiYProj(layer));
52c19022 283 yproj = ( ( ( (yproj >> fGtuParam->GetBitExcessYProj()) + trk->GetYbin() ) >> 2) + 1) >> 1;
284 trk->SetYProj(yproj);
285
286 trk->SetYPrime(trk->GetYbin() + fGtuParam->GetYt(fStack, layer, trk->GetZbin()));
287
ec5db61b 288 AliDebug(10, Form("0x%08x: idx: %3i, z: %2i, y: %5i, dy: %3i, y': %5i, y_proj: %5i, alpha: %3i, pid: %3i, c: %5i, yt: %5i",
44eafcf2 289 trk->GetTrackletWord(), trk->GetIndex(), trk->GetZbin(), trk->GetYbin(), trk->GetdY(), trk->GetYPrime(),
ec5db61b 290 trk->GetYProj(), trk->GetAlpha(), trk->GetPID(),
291 fGtuParam->GetCiYProj(layer), fGtuParam->GetYt(fStack, layer, trk->GetZbin()) ));
52c19022 292 }
293 return kTRUE;
294}
295
5f006bd7 296Bool_t AliTRDgtuTMU::RunZChannelUnit(Int_t layer)
52c19022 297{
298 // run the z-channel unit
299
44eafcf2 300 TIter next(fTrackletsPostInput[layer]);
52c19022 301
302 while (AliTRDtrackletGTU *trk = (AliTRDtrackletGTU*) next()) {
52c19022 303 for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) {
304 if (fGtuParam->IsInZChannel(fStack, layer, zch, trk->GetZbin()) ) {
305 trk->SetSubChannel(zch, fGtuParam->GetZSubchannel(fStack, layer, zch, trk->GetZbin()) );
52c19022 306
307 TIter nexttrkl(&fZChannelTracklets[layer][zch], kIterBackward);
308 AliTRDtrackletGTU *t = 0x0;
4cc89512 309 while ((t = (AliTRDtrackletGTU*) nexttrkl.Next())) {
5f006bd7 310 if (t->GetSubChannel(zch) < trk->GetSubChannel(zch) ||
44eafcf2 311 ((t->GetSubChannel(zch) == trk->GetSubChannel(zch)) && (t->GetYProj() < trk->GetYProj())) ) {
52c19022 312 break;
44eafcf2 313 }
52c19022 314 }
44eafcf2 315 if (t)
316 fZChannelTracklets[layer][zch].AddAfter(t, trk);
317 else
318 fZChannelTracklets[layer][zch].AddFirst(trk);
52c19022 319 }
52c19022 320 }
44eafcf2 321 AliDebug(10, Form("stack %d, layer %2d: 0x%08x Z(2..0)=%i/%i/%i",
322 fStack, layer, trk->GetTrackletWord(),
323 fGtuParam->IsInZChannel(fStack, layer, 2, trk->GetZbin()) ? trk->GetSubChannel(2) : -1,
324 fGtuParam->IsInZChannel(fStack, layer, 1, trk->GetZbin()) ? trk->GetSubChannel(1) : -1,
325 fGtuParam->IsInZChannel(fStack, layer, 0, trk->GetZbin()) ? trk->GetSubChannel(0) : -1
326 ));
52c19022 327 }
328 return kTRUE;
329}
330
5f006bd7 331Bool_t AliTRDgtuTMU::RunTrackFinder(Int_t zch, TList* /* ListOfTracks */)
52c19022 332{
333 // run the track finding
334
335 Int_t *notr = new Int_t[fGtuParam->GetNLayers()];
336 Int_t *ptrA = new Int_t[fGtuParam->GetNLayers()];
337 Int_t *ptrB = new Int_t[fGtuParam->GetNLayers()];
338
5f006bd7 339 Bool_t *bHitA = new Bool_t[fGtuParam->GetNLayers()];
52c19022 340 Bool_t *bHitB = new Bool_t[fGtuParam->GetNLayers()];
341 Bool_t *bAligned = new Bool_t[fGtuParam->GetNLayers()];
342 Bool_t *bAlignedA = new Bool_t[fGtuParam->GetNLayers()];
343 Bool_t *bAlignedB = new Bool_t[fGtuParam->GetNLayers()];
344 Bool_t *bDone = new Bool_t[fGtuParam->GetNLayers()];
345 Bool_t ready;
346
347 Int_t *inc = new Int_t[fGtuParam->GetNLayers()];
348 Int_t *incprime = new Int_t[fGtuParam->GetNLayers()];
349
350// ----- signals within current layer -----
36dc3337 351 Int_t yPlus;
5f006bd7 352 Int_t yMinus;
353 Int_t ybPlus;
36dc3337 354 Int_t ybMinus;
355 Int_t alphaPlus;
5f006bd7 356 Int_t alphaMinus;
36dc3337 357 Int_t nHits;
5f006bd7 358 Int_t nUnc;
36dc3337 359 Int_t nWayBeyond;
52c19022 360
361 AliTRDtrackletGTU *trkRA = 0x0; // reference tracklet A
362 AliTRDtrackletGTU *trkRB = 0x0; // reference tracklet B
363 AliTRDtrackletGTU *trkA = 0x0; // tracklet A in current layer
364 AliTRDtrackletGTU *trkB = 0x0; // tracklet B in current layer
365/*
366 AliTRDtrackletGTU *trkEnd = new AliTRDtrackletGTU();
5f006bd7 367 for (Int_t i = 0; i < fGtuParam->GetNZChannels(); i++)
52c19022 368 trkEnd->SetSubChannel(i, 7);
369 trkEnd->SetYProj(0);
370 trkEnd->SetAlpha(0);
371*/
372
373 for (Int_t refLayerIdx = 0; refLayerIdx < fGtuParam->GetNRefLayers(); refLayerIdx++) {
374 Int_t reflayer = fGtuParam->GetRefLayer(refLayerIdx);
d2c8b010 375 AliDebug(5,Form("Tracking for z-channel: %i, reflayer: %i", zch, reflayer));
52c19022 376
377 ready = kFALSE; // ready if all channels done
378
44eafcf2 379// for (Int_t iLayer = 0; iLayer < fGtuParam->GetNLayers(); iLayer++) {
380// for (Int_t iTrkl = 0; iTrkl < fZChannelTracklets[iLayer][zch].GetEntries(); iTrkl++) {
381// printf("%4i/%4i(%i,%i) ",
382// ((AliTRDtrackletGTU*) fZChannelTracklets[iLayer][zch].At(iTrkl))->GetYProj(),
383// ((AliTRDtrackletGTU*) fZChannelTracklets[iLayer][zch].At(iTrkl))->GetAlpha(),
384// ((AliTRDtrackletGTU*) fZChannelTracklets[iLayer][zch].At(iTrkl))->GetIndex(),
385// ((AliTRDtrackletGTU*) fZChannelTracklets[iLayer][zch].At(iTrkl))->GetSubChannel(zch)
386// );
387// }
388// printf("\n");
389// }
390
52c19022 391 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
392 notr[layer] = fZChannelTracklets[layer][zch].GetEntries();
393 ptrA[layer] = 0; // notr[layer] > 0 ? 0 : -1;
394 ptrB[layer] = 1; // notr[layer] > 1 ? 1 : -1;
395
396// not necessary here
397// bDone[layer] = (ptrB[layer] >= notr[layer] - 1); // trkB is last one
398// bDone[layer] = (notr[layer] <= 0);
399// ready = ready && bDone[layer];
400
401 if (reflayer == 1)
c8b1590d 402 AliDebug(5,Form("in layer: %i (zchannel = %i) there are: %i tracklets", layer, zch, notr[layer]));
52c19022 403 }
5f006bd7 404
405 if (ptrA[reflayer] < 0 && ptrB[reflayer] < 0)
52c19022 406 continue;
407
408 while (!ready) {
409 // ----- reference tracklets -----
410 trkRA = 0x0;
411 trkRB = 0x0;
412 if (0 <= ptrA[reflayer] && ptrA[reflayer] < notr[reflayer])
413 trkRA = (AliTRDtrackletGTU*) fZChannelTracklets[reflayer][zch].At(ptrA[reflayer]);
414 else {
a8518fd2 415 AliDebug(10,Form("No valid tracklet in the reference at ptr: %i! Nothing done!", ptrA[reflayer]));
5f006bd7 416 break;
52c19022 417 }
418
419 if (0 <= ptrB[reflayer] && ptrB[reflayer] < notr[reflayer])
420 trkRB = (AliTRDtrackletGTU*) fZChannelTracklets[reflayer][zch].At(ptrB[reflayer]);
421
36dc3337 422 yPlus = trkRA->GetYProj() + fGtuParam->GetDeltaY();
423 yMinus = trkRA->GetYProj() - fGtuParam->GetDeltaY();
424 alphaPlus = trkRA->GetAlpha() + fGtuParam->GetDeltaAlpha();
425 alphaMinus = trkRA->GetAlpha() - fGtuParam->GetDeltaAlpha();
52c19022 426 if (trkRB) {
36dc3337 427 ybPlus = trkRB->GetYProj() + fGtuParam->GetDeltaY();
428 ybMinus = trkRB->GetYProj() - fGtuParam->GetDeltaY();
52c19022 429 }
430 else { // irrelevant (should be, is it?)
36dc3337 431 ybPlus = trkRA->GetYProj() + fGtuParam->GetDeltaY();
432 ybMinus = trkRA->GetYProj() - fGtuParam->GetDeltaY();
52c19022 433 }
434
36dc3337 435 nHits = 0;
436 nUnc = 0;
437 nWayBeyond = 0;
5f006bd7 438
52c19022 439 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
440 bHitA[layer] = bHitB[layer] = bAligned[layer] = kFALSE;
441 inc[layer] = incprime[layer] = 0;
442
443 if (layer == reflayer) {
444 bHitA[layer] = kTRUE;
445 bAligned[layer] = kTRUE;
36dc3337 446 nHits++;
5f006bd7 447 continue;
52c19022 448 }
449
450 trkA = 0x0;
451 trkB = 0x0;
452 if (0 <= ptrA[layer] && ptrA[layer] < notr[layer])
453 trkA = (AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrA[layer]);
454 if (0 <= ptrB[layer] && ptrB[layer] < notr[layer])
455 trkB = (AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrB[layer]);
456
457 bAlignedA[layer] = kFALSE;
458 bAlignedB[layer] = kFALSE;
459
5f006bd7 460 if (trkA) {
36dc3337 461 bHitA[layer] = ( !(trkA->GetSubChannel(zch) < trkRA->GetSubChannel(zch) || (trkA->GetSubChannel(zch) == trkRA->GetSubChannel(zch) && trkA->GetYProj() < yMinus) ) &&
462 !(trkA->GetSubChannel(zch) > trkRA->GetSubChannel(zch) || (trkA->GetSubChannel(zch) == trkRA->GetSubChannel(zch) && trkA->GetYProj() > yPlus) ) &&
463 !(trkA->GetAlpha() < alphaMinus) &&
464 !(trkA->GetAlpha() > alphaPlus) );
5f006bd7 465 bAlignedA[layer] = !(trkA->GetSubChannel(zch) < trkRA->GetSubChannel(zch) || (trkA->GetSubChannel(zch) == trkRA->GetSubChannel(zch) && trkA->GetYProj() < yMinus) );
52c19022 466 }
467 else {
468 bHitA[layer] = 0;
469 bAlignedA[layer] = kTRUE;
470 }
471
472 if (trkB) {
36dc3337 473 bHitB[layer] = ( !(trkB->GetSubChannel(zch) < trkRA->GetSubChannel(zch) || (trkB->GetSubChannel(zch) == trkRA->GetSubChannel(zch) && trkB->GetYProj() < yMinus) ) &&
474 !(trkB->GetSubChannel(zch) > trkRA->GetSubChannel(zch) || (trkB->GetSubChannel(zch) == trkRA->GetSubChannel(zch) && trkB->GetYProj() > yPlus) ) &&
44eafcf2 475 !(trkB->GetAlpha() < alphaMinus) &&
476 !(trkB->GetAlpha() > alphaPlus) );
36dc3337 477 bAlignedB[layer] = (trkB->GetSubChannel(zch) > trkRA->GetSubChannel(zch) || (trkB->GetSubChannel(zch) == trkRA->GetSubChannel(zch) && trkB->GetYProj() > yPlus) );
5f006bd7 478 }
52c19022 479 else {
480 bHitB[layer] = 0;
481 bAlignedB[layer] = kTRUE;
482 }
5f006bd7 483
52c19022 484 bAligned[layer] = bAlignedA[layer] || bAlignedB[layer]; //???
485// bAligned[layer] = bAlignedA[layer]; //???
5f006bd7 486
52c19022 487 if (bAligned[layer] && (bHitA[layer] || bHitB[layer]) )
36dc3337 488 nHits++;
52c19022 489 else if (!bAligned[layer] )
36dc3337 490 nUnc++;
52c19022 491 if (trkRB) {
492 if (trkA) {
36dc3337 493 if ((trkA->GetSubChannel(zch) > trkRB->GetSubChannel(zch)) || (trkA->GetSubChannel(zch) == trkRB->GetSubChannel(zch) && trkA->GetYProj() > ybPlus) )
494 nWayBeyond++;
52c19022 495 }
5f006bd7 496 else
36dc3337 497 nWayBeyond++;
52c19022 498 }
499
500 // pre-calculation for the layer shifting (alignment w. r. t. trkRB)
501 if (trkA) {
502 if(trkRB) {
36dc3337 503 if ((trkA->GetSubChannel(zch) < trkRB->GetSubChannel(zch)) || (trkA->GetSubChannel(zch) == trkRB->GetSubChannel(zch) && trkA->GetYProj() < ybMinus )) // could trkA be aligned for trkRB
52c19022 504 incprime[layer] = 1;
5f006bd7 505 else
52c19022 506 incprime[layer] = 0;
507 }
5f006bd7 508 else
52c19022 509 incprime[layer] = 1;
510
5f006bd7 511 if (trkB) {
52c19022 512 if (trkRB) {
36dc3337 513 if ((trkB->GetSubChannel(zch) < trkRB->GetSubChannel(zch)) || (trkB->GetSubChannel(zch) == trkRB->GetSubChannel(zch) && trkB->GetYProj() < ybMinus )) // could trkB be aligned for trkRB
52c19022 514 incprime[layer] = 2;
515 }
5f006bd7 516 else
52c19022 517 incprime[layer] = 2;
518 }
519 }
520 } // end of loop over layers
521
d2c8b010 522 AliDebug(5,Form("logic calculation finished, Nhits: %i %s",
523 nHits, (nHits >= 4) ? "-> track found" : ""));
52c19022 524
36dc3337 525 if (nHits >= 4) {
52c19022 526 // ----- track registration -----
52c19022 527 AliTRDtrackGTU *track = new AliTRDtrackGTU();
528 track->SetSector(fSector);
529 track->SetStack(fStack);
530 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++ ) {
5f006bd7 531 if (bHitA[layer] || layer == reflayer)
52c19022 532 track->AddTracklet((AliTRDtrackletGTU* ) fZChannelTracklets[layer][zch].At(ptrA[layer]), layer );
5f006bd7 533 else if (bHitB[layer])
52c19022 534 track->AddTracklet((AliTRDtrackletGTU* ) fZChannelTracklets[layer][zch].At(ptrB[layer]), layer );
535 }
536
537 Bool_t registerTrack = kTRUE;
44eafcf2 538 for (Int_t layerIdx = refLayerIdx-1; layerIdx >= 0; layerIdx--) {
80f93426 539 if (track->IsTrackletInLayer(fGtuParam->GetRefLayer(layerIdx))) {
540 if ((track->GetTracklet(fGtuParam->GetRefLayer(layerIdx)))->GetSubChannel(zch) > 0) {
c8b1590d 541 AliDebug(1,"Not registered");
52c19022 542 registerTrack = kFALSE;
80f93426 543 }
544 }
52c19022 545 }
546 if (registerTrack) {
547 track->SetZChannel(zch);
548 track->SetRefLayerIdx(refLayerIdx);
549 fTracks[zch][refLayerIdx].Add(track);
550 }
a3461d38 551 else
552 delete track;
52c19022 553 }
5f006bd7 554
36dc3337 555 if ( (nUnc != 0) && (nUnc + nHits >= 4) ) // could this position of the reference layer give some track //??? special check in case of hit?
52c19022 556 inc[reflayer] = 0;
36dc3337 557 else if (nWayBeyond > 2) // no track possible for both reference tracklets
52c19022 558 inc[reflayer] = 2;
5f006bd7 559 else
52c19022 560 inc[reflayer] = 1;
5f006bd7 561
52c19022 562 if (inc[reflayer] != 0) // reflayer is shifted
563 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
564 if (layer == reflayer)
565 continue;
5f006bd7 566 inc[layer] = incprime[layer];
52c19022 567 }
568 else { // reflayer is not shifted
569 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
570 if (layer == reflayer || notr[layer] == 0)
571 continue;
572 inc[layer] = 0;
573 trkA = 0x0;
574 trkB = 0x0;
575 if (0 <= ptrA[layer] && ptrA[layer] < notr[layer])
576 trkA = (AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrA[layer]);
577
578 if (0 <= ptrB[layer] && ptrB[layer] < notr[layer])
579 trkB = (AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrB[layer]);
580
581 if (trkA) {
44eafcf2 582 if ( !(trkA->GetSubChannel(zch) < trkRA->GetSubChannel(zch) || (trkA->GetSubChannel(zch) == trkRA->GetSubChannel(zch) && trkA->GetYProj() < yMinus) ) &&
583 !(trkA->GetSubChannel(zch) > trkRA->GetSubChannel(zch) || (trkA->GetSubChannel(zch) == trkRA->GetSubChannel(zch) && trkA->GetYProj() > yPlus ) ) ) // trkA could hit trkRA
584 // if ( !(trkA->GetSubChannel(zch) < trkRA->GetSubChannel(zch) || (trkA->GetSubChannel(zch) == trkRA->GetSubChannel(zch) && trkA->GetYProj() < yMinus) ) )
52c19022 585 inc[layer] = 0;
586 else if (trkB) {
36dc3337 587 if ( trkB->GetSubChannel(zch) < trkRA->GetSubChannel(zch) || (trkB->GetSubChannel(zch) == trkRA->GetSubChannel(zch) && trkB->GetYProj() < yMinus) )
52c19022 588 inc[layer] = 2;
36dc3337 589 else if ( !(trkB->GetSubChannel(zch) > trkRA->GetSubChannel(zch) || (trkB->GetSubChannel(zch) == trkRA->GetSubChannel(zch) && trkB->GetYProj() > yPlus) ) )
52c19022 590 inc[layer] = 1;
5f006bd7 591 else
52c19022 592 inc[layer] = incprime[layer];
593 }
5f006bd7 594 else
52c19022 595 inc[layer] = incprime[layer];
596 }
597 }
598 }
5f006bd7 599
52c19022 600 ready = kTRUE;
d2c8b010 601 for (Int_t layer = fGtuParam->GetNLayers()-1; layer >= 0; layer--) {
52c19022 602
603 bDone[layer] = ptrB[layer] < 0 || ptrB[layer] >= notr[layer];
604 ready = ready && bDone[layer];
605
606 if (inc[layer] != 0 && ptrA[layer] >= notr[layer])
607 AliError(Form("Invalid increment: %i at ptrA: %i, notr: %i", inc[layer], ptrA[layer], notr[layer]));
608
609// AliInfo(Form("Shifting layer: %i, notr: %i, ptrA: %i, ptrB: %i, inc: %i", layer, notr[layer], ptrA[layer], ptrB[layer], inc[layer]));
d2c8b010 610 AliDebug(10,Form(" Layer: %i %2i(%2i, %2i, %4i, %3i)%s%s %2i(%2i, %2i, %4i, %3i)%s%s +%i %s (no: %i)",
44eafcf2 611 layer,
612 ptrA[layer],
613 (0 <= ptrA[layer] && ptrA[layer] < notr[layer]) ? ((AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrA[layer]))->GetIndex() : -1,
d2c8b010 614 (0 <= ptrA[layer] && ptrA[layer] < notr[layer]) ? ((AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrA[layer]))->GetSubChannel(zch) : -1,
615 (0 <= ptrA[layer] && ptrA[layer] < notr[layer]) ? ((AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrA[layer]))->GetYProj() : -1,
616 (0 <= ptrA[layer] && ptrA[layer] < notr[layer]) ? ((AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrA[layer]))->GetAlpha() : -1,
44eafcf2 617 bHitA[layer] ? "*" : " ", bAlignedA[layer] ? "+" : " ",
618 ptrB[layer],
619 (0 <= ptrB[layer] && ptrB[layer] < notr[layer]) ? ((AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrB[layer]))->GetIndex() : -1,
d2c8b010 620 (0 <= ptrB[layer] && ptrB[layer] < notr[layer]) ? ((AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrB[layer]))->GetSubChannel(zch) : -1,
621 (0 <= ptrB[layer] && ptrB[layer] < notr[layer]) ? ((AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrB[layer]))->GetYProj() : -1,
622 (0 <= ptrB[layer] && ptrB[layer] < notr[layer]) ? ((AliTRDtrackletGTU*) fZChannelTracklets[layer][zch].At(ptrB[layer]))->GetAlpha() : -1,
44eafcf2 623 bHitB[layer] ? "*" : " ", bAlignedB[layer] ? "+" : " ",
624 inc[layer], bDone[layer] ? "done" : " ", notr[layer]));
52c19022 625 ptrA[layer] += inc[layer];
626 ptrB[layer] += inc[layer];
627 }
628
629 } // end of while
630 } // end of loop over reflayer
631
632 delete [] bHitA;
633 delete [] bHitB;
634 delete [] bAligned;
635 delete [] bDone;
636 delete [] inc;
637 delete [] incprime;
638 delete [] bAlignedA;
639 delete [] bAlignedB;
640 delete [] notr;
641 delete [] ptrA;
642 delete [] ptrB;
643
644 return kTRUE;
645}
646
5f006bd7 647Bool_t AliTRDgtuTMU::RunTrackMerging(TList* ListOfTracks)
52c19022 648{
649 TList **tracksRefMerged = new TList*[fGtuParam->GetNZChannels()];
650 TList **tracksRefUnique = new TList*[fGtuParam->GetNZChannels()];
651
652 for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) {
653 tracksRefMerged[zch] = new TList;
654 tracksRefUnique[zch] = new TList;
655 }
656
657 TList *tracksZMergedStage0 = new TList;
658 TList *tracksZUniqueStage0 = new TList;
659
660 TList **tracksZSplitted = new TList*[2];
661 for (Int_t i = 0; i < 2; i++)
662 tracksZSplitted[i] = new TList;
663
664 TList *tracksZMergedStage1 = new TList;
665
4cc89512 666 AliTRDtrackGTU **trkInRefLayer = new AliTRDtrackGTU*[fGtuParam->GetNRefLayers()];
52c19022 667
c2aad3ae 668 // Bool_t done = kFALSE;
52c19022 669 Int_t minIdx = 0;
670 AliTRDtrackGTU *trkStage0 = 0x0;
671
672 for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) {
44eafcf2 673 // ----- Merging and Unification in Reflayers (seed_merger) -----
52c19022 674 do {
c2aad3ae 675 // done = kTRUE;
52c19022 676 trkStage0 = 0x0;
677 for (Int_t refLayerIdx = 0; refLayerIdx < fGtuParam->GetNRefLayers(); refLayerIdx++) {
4cc89512 678 trkInRefLayer[refLayerIdx] = (AliTRDtrackGTU*) fTracks[zch][refLayerIdx].First();
679 if (trkInRefLayer[refLayerIdx] == 0) {
52c19022 680 continue;
681 }
682 else if (trkStage0 == 0x0 ) {
4cc89512 683 trkStage0 = trkInRefLayer[refLayerIdx];
52c19022 684 minIdx = refLayerIdx;
c2aad3ae 685 // done = kFALSE;
52c19022 686 }
ec5db61b 687 else if ( (trkInRefLayer[refLayerIdx]->GetZSubChannel() < trkStage0->GetZSubChannel()) ||
688 ((trkInRefLayer[refLayerIdx]->GetZSubChannel() == trkStage0->GetZSubChannel()) &&
689 ((trkInRefLayer[refLayerIdx]->GetYapprox() >> 3) < (trkStage0->GetYapprox() >> 3)) ) ) {
52c19022 690 minIdx = refLayerIdx;
4cc89512 691 trkStage0 = trkInRefLayer[refLayerIdx];
c2aad3ae 692 // done = kFALSE;
52c19022 693 }
694 }
c8b1590d 695 if (!trkStage0)
696 break;
52c19022 697 tracksRefMerged[zch]->Add(trkStage0);
698 fTracks[zch][minIdx].RemoveFirst();
699 } while (trkStage0 != 0);
700
701 Uniquifier(tracksRefMerged[zch], tracksRefUnique[zch]);
44eafcf2 702
703 AliDebug(2, Form("zchannel %i", zch));
704 TIter trackRefMerged(tracksRefMerged[zch]);
705 while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) trackRefMerged())
706 AliDebug(2, Form("track ref layer %i : %i %i %i %i %i %i, y=%i, z_idx=%i",
d2c8b010 707 AliTRDgtuParam::GetRefLayer(trk->GetRefLayerIdx()),
44eafcf2 708 trk->GetTrackletIndex(5),
709 trk->GetTrackletIndex(4),
710 trk->GetTrackletIndex(3),
711 trk->GetTrackletIndex(2),
712 trk->GetTrackletIndex(1),
713 trk->GetTrackletIndex(0),
714 trk->GetYapprox() >> 3,
715 trk->GetZSubChannel()));
716 AliDebug(2, "uniquified:");
717 TIter trackRefUnique(tracksRefUnique[zch]);
718 while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) trackRefUnique())
719 AliDebug(2, Form("track ref layer %i : %i %i %i %i %i %i, y=%i, z_idx=%i",
d2c8b010 720 AliTRDgtuParam::GetRefLayer(trk->GetRefLayerIdx()),
44eafcf2 721 trk->GetTrackletIndex(5),
722 trk->GetTrackletIndex(4),
723 trk->GetTrackletIndex(3),
724 trk->GetTrackletIndex(2),
725 trk->GetTrackletIndex(1),
726 trk->GetTrackletIndex(0),
727 trk->GetYapprox() >> 3,
728 trk->GetZSubChannel()));
52c19022 729 }
730
731// ----- Merging in zchannels - 1st stage -----
5f006bd7 732
ec5db61b 733 if (AliTRDgtuParam::GetUseGTUmerge()) {
734 Int_t notEmpty;
735 do {
736 Bool_t lowerThan[3] = { kFALSE, kFALSE, kFALSE };
737 AliTRDtrackGTU *trk[3] = { 0x0, 0x0, 0x0 };
738 for (Int_t iChannel = 0; iChannel < fGtuParam->GetNZChannels(); ++iChannel)
739 trk[iChannel] = (AliTRDtrackGTU*) tracksRefUnique[iChannel]->First();
740
741 for (Int_t iChannel = 0; iChannel < fGtuParam->GetNZChannels(); ++iChannel) {
742 AliTRDtrackGTU *trk1 = trk[iChannel];
743 AliTRDtrackGTU *trk2 = trk[(iChannel + 1) % 3];
744 if (trk1 && trk2) {
745 Int_t sortnum1 = (trk1->GetZChannel() + 3 * trk1->GetZSubChannel()) / 2 - 1;
746 Int_t sortnum2 = (trk2->GetZChannel() + 3 * trk2->GetZSubChannel()) / 2 - 1;
747 AliDebug(5, Form("comparing tracks %i - %i: %i - %i",
748 trk1->GetZChannel(), trk2->GetZChannel(),
749 sortnum1, sortnum2));
750 if ( (sortnum1 < sortnum2) ||
751 ((sortnum1 == sortnum2) &&
752 ((trk1->GetYapprox() >> 3) < (trk2->GetYapprox() >> 3)) ) ) {
753 lowerThan[iChannel] = kTRUE;
52c19022 754 }
ec5db61b 755 }
756 }
757
758 notEmpty = (trk[2] ? (1 << 2) : 0) |
759 (trk[1] ? (1 << 1) : 0) |
760 (trk[0] ? (1 << 0) : 0);
761 Int_t pop = -1;
762
763 switch (notEmpty) {
764 // one track only
765 case 0x1:
766 pop = 0;
767 break;
768 case 0x2:
769 pop = 1;
770 break;
771 case 0x4:
772 pop = 2;
773 break;
774
775 // two tracks
776 case 0x3:
777 if (lowerThan[0])
778 pop = 0;
779 else
780 pop = 1;
781 break;
782 case 0x5:
783 if (lowerThan[2])
784 pop = 2;
785 else
786 pop = 0;
787 break;
788 case 0x6:
789 if (lowerThan[1])
790 pop = 1;
791 else
792 pop = 2;
793 break;
794
795 // three tracks
796 case 0x7:
797 if (lowerThan[0]) {
798 if (lowerThan[2])
799 pop = 2;
800 else
801 pop = 0;
802 } else {
803 if (lowerThan[1])
804 pop = 1;
805 else
806 pop = 2;
807 }
808 break;
809
810 // no tracks
811 default:
812 // nop
813 ;
814 }
815
816 if (pop > -1) {
817 tracksZMergedStage0->Add(trk[pop]);
818 tracksRefUnique[pop]->RemoveFirst();
819 }
820 } while (notEmpty);
821 }
822 else {
823 // there is still a difference between this implementation and
824 // the hardware algorithm, only for expert use
825
826 do {
827 // done = kTRUE;
828 trkStage0 = 0x0;
829 // compare tracks from all adjacent zchannels
830 // (including comparison of channels 2 and 0)
831 for (Int_t i = fGtuParam->GetNZChannels() - 1; i > -1; i--) {
832 Int_t zch = i % 3;
833 AliTRDtrackGTU *trk = (AliTRDtrackGTU*) tracksRefUnique[zch]->First();
834 if (trk == 0) {
835 continue;
836 }
837 else if (trkStage0 == 0x0 ) {
838 trkStage0 = trk;
839 minIdx = zch;
840 // done = kFALSE;
841 }
842 else {
843 Int_t sortnum1 = (trk->GetZChannel() + 3 * trk->GetZSubChannel()) / 2 - 1;
844 Int_t sortnum2 = (trkStage0->GetZChannel() + 3 * trkStage0->GetZSubChannel()) / 2 - 1;
845 AliDebug(5, Form("comparing tracks %i - %i: %i - %i",
846 trk->GetZChannel(), trkStage0->GetZChannel(),
847 sortnum1, sortnum2));
848 if ( (sortnum1 < sortnum2) ||
849 ((sortnum1 == sortnum2) &&
850 ((trk->GetYapprox() >> 3) < (trkStage0->GetYapprox() >> 3)) ) ) {
851 minIdx = zch;
852 trkStage0 = trk;
853 // done = kFALSE;
52c19022 854 }
ec5db61b 855 }
52c19022 856 }
5f006bd7 857
c8b1590d 858 if (!trkStage0)
859 break;
52c19022 860 tracksZMergedStage0->Add(trkStage0);
861 tracksRefUnique[minIdx]->RemoveFirst();
ec5db61b 862 } while (trkStage0 != 0);
863 }
5f006bd7 864
52c19022 865 Uniquifier(tracksZMergedStage0, tracksZUniqueStage0);
5f006bd7 866
d2c8b010 867 AliDebug(2, "stage 0:");
868 TIter trackZMergedStage0(tracksZMergedStage0);
869 while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) trackZMergedStage0())
870 AliDebug(2, Form("track ref layer %i : %i %i %i %i %i %i, y=%i, zch=%i idx=%i",
871 AliTRDgtuParam::GetRefLayer(trk->GetRefLayerIdx()),
872 trk->GetTrackletIndex(5),
873 trk->GetTrackletIndex(4),
874 trk->GetTrackletIndex(3),
875 trk->GetTrackletIndex(2),
876 trk->GetTrackletIndex(1),
877 trk->GetTrackletIndex(0),
878 trk->GetYapprox() >> 3,
879 trk->GetZChannel(),
880 trk->GetZSubChannel()));
881
882 AliDebug(2, "uniquified:");
883 TIter trackZUniqueStage0(tracksZUniqueStage0);
884 while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) trackZUniqueStage0())
885 AliDebug(2, Form("track ref layer %i : %i %i %i %i %i %i, y=%i, zch=%i idx=%i",
886 AliTRDgtuParam::GetRefLayer(trk->GetRefLayerIdx()),
887 trk->GetTrackletIndex(5),
888 trk->GetTrackletIndex(4),
889 trk->GetTrackletIndex(3),
890 trk->GetTrackletIndex(2),
891 trk->GetTrackletIndex(1),
892 trk->GetTrackletIndex(0),
893 trk->GetYapprox() >> 3,
894 trk->GetZChannel(),
895 trk->GetZSubChannel()));
896
52c19022 897// ----- Splitting in z -----
5f006bd7 898
52c19022 899 TIter next(tracksZUniqueStage0);
900 while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) next()) {
901 tracksZSplitted[(trk->GetZChannel() + 3 * (trk->GetZSubChannel() - 1)) % 2]->Add(trk);
902 }
5f006bd7 903
d2c8b010 904 for (Int_t i = 0; i < 2; i++) {
905 AliDebug(2, Form("split %i:", i));
906 TIter trackZSplit(tracksZSplitted[i]);
907 while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) trackZSplit())
908 AliDebug(2, Form("track ref layer %i : %i %i %i %i %i %i, y=%i, zch=%i idx=%i",
909 AliTRDgtuParam::GetRefLayer(trk->GetRefLayerIdx()),
910 trk->GetTrackletIndex(5),
911 trk->GetTrackletIndex(4),
912 trk->GetTrackletIndex(3),
913 trk->GetTrackletIndex(2),
914 trk->GetTrackletIndex(1),
915 trk->GetTrackletIndex(0),
916 trk->GetYapprox() >> 3,
917 trk->GetZChannel(),
918 trk->GetZSubChannel()));
919 }
920
52c19022 921// ----- Merging in zchanels - 2nd stage -----
5f006bd7 922
52c19022 923 do {
c2aad3ae 924 // done = kTRUE;
52c19022 925 trkStage0 = 0x0;
44eafcf2 926 for (Int_t i = 1; i >= 0; i--) {
52c19022 927 AliTRDtrackGTU *trk = (AliTRDtrackGTU*) tracksZSplitted[i]->First();
928 if (trk == 0) {
929 continue;
930 }
931 else if (trkStage0 == 0x0 ) {
932 trkStage0 = trk;
933 minIdx = i;
c2aad3ae 934 // done = kFALSE;
52c19022 935 }
ec5db61b 936 else if ( (((trk->GetZChannel() + 3 * (trk->GetZSubChannel() - 1)) / 2) < ((trkStage0->GetZChannel() + 3 * (trkStage0->GetZSubChannel() - 1)) / 2)) ||
937 ((((trk->GetZChannel() + 3 * (trk->GetZSubChannel() - 1)) / 2) == ((trkStage0->GetZChannel() + 3 * (trkStage0->GetZSubChannel() - 1)) / 2)) &&
938 ((trk->GetYapprox() >> 3) < (trkStage0->GetYapprox() >> 3)) ) ) {
52c19022 939 minIdx = i;
940 trkStage0 = trk;
c2aad3ae 941 // done = kFALSE;
52c19022 942 }
943 }
5f006bd7 944
c8b1590d 945 if (!trkStage0)
946 break;
52c19022 947 tracksZMergedStage1->Add(trkStage0);
948 tracksZSplitted[minIdx]->RemoveFirst();
949 } while (trkStage0 != 0);
5f006bd7 950
52c19022 951 Uniquifier(tracksZMergedStage1, ListOfTracks);
5f006bd7 952
d2c8b010 953 AliDebug(2, "merged:");
954 TIter trackZMergedStage1(tracksZMergedStage1);
955 while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) trackZMergedStage1())
956 AliDebug(2, Form("track ref layer %i : %i %i %i %i %i %i, y=%i, zch=%i idx=%i",
957 AliTRDgtuParam::GetRefLayer(trk->GetRefLayerIdx()),
958 trk->GetTrackletIndex(5),
959 trk->GetTrackletIndex(4),
960 trk->GetTrackletIndex(3),
961 trk->GetTrackletIndex(2),
962 trk->GetTrackletIndex(1),
963 trk->GetTrackletIndex(0),
964 trk->GetYapprox() >> 3,
965 trk->GetZChannel(),
966 trk->GetZSubChannel()));
967
968 AliDebug(2, "uniquified:");
969 TIter track(ListOfTracks);
970 while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) track())
971 AliDebug(2, Form("track ref layer %i : %i %i %i %i %i %i, y=%i, zch=%i idx=%i",
972 AliTRDgtuParam::GetRefLayer(trk->GetRefLayerIdx()),
973 trk->GetTrackletIndex(5),
974 trk->GetTrackletIndex(4),
975 trk->GetTrackletIndex(3),
976 trk->GetTrackletIndex(2),
977 trk->GetTrackletIndex(1),
978 trk->GetTrackletIndex(0),
979 trk->GetYapprox() >> 3,
980 trk->GetZChannel(),
981 trk->GetZSubChannel()));
982
5f006bd7 983 // cleaning up
637666cd 984 for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) {
985 delete tracksRefMerged[zch];
986 delete tracksRefUnique[zch];
987 }
988 delete [] tracksRefMerged;
989 delete [] tracksRefUnique;
990
991
992 delete tracksZMergedStage0;
993 delete tracksZUniqueStage0;
994
995 for (Int_t i = 0; i < 2; i++)
996 delete tracksZSplitted[i];
54d34aac 997 delete [] tracksZSplitted;
637666cd 998
999 delete tracksZMergedStage1;
1000
1001 delete [] trkInRefLayer;
1002
52c19022 1003 return kTRUE;
1004}
1005
5f006bd7 1006Bool_t AliTRDgtuTMU::RunTrackReconstruction(TList* ListOfTracks)
52c19022 1007{
36dc3337 1008 // run the track reconstruction for all tracks in the list
1009
52c19022 1010 TIter next(ListOfTracks);
1011 while (AliTRDtrackGTU *track = (AliTRDtrackGTU*) next()) {
1012 CalculateTrackParams(track);
4ff7ed2b 1013 CalculatePID(track);
44eafcf2 1014 AliDebug(1, Form("track with pid = %i", track->GetPID()));
52c19022 1015 }
1016 return kTRUE;
1017}
1018
4ff7ed2b 1019Bool_t AliTRDgtuTMU::CalculatePID(AliTRDtrackGTU *track)
1020{
36dc3337 1021 // calculate PID for the given track
4ff7ed2b 1022 if (!track) {
1023 AliError("No track to calculate!");
1024 return kFALSE;
1025 }
1026
4b43eeaf 1027 if (AliTRDgtuParam::GetUseGTUconst()) {
44eafcf2 1028 // averaging as in GTU
ec5db61b 1029 AliDebug(1, "using GTU constants for PID calculation");
44eafcf2 1030 ULong64_t coeff;
1031
1032 // selection of coefficient for averaging
1033 switch(track->GetTrackletMask()){
1034 case 0x3f:
1035 // 6 tracklets
1036 coeff=0x5558; // approx. 1/6
1037 break;
1038
1039 case 0x3e:
1040 case 0x3d:
1041 case 0x3b:
1042 case 0x37:
1043 case 0x2f:
1044 case 0x1f:
1045 // 5 tracklets
1046 coeff=0x6666; // approx. 1/5
1047 break;
1048
1049 default:
1050 // 4 tracklets
1051 coeff=0x8000; // = 0.25
4ff7ed2b 1052 }
44eafcf2 1053 coeff &= 0x1ffff; // 17-bit constant
1054
1055 ULong64_t sum = 0;
ec5db61b 1056 Int_t i = 0;
44eafcf2 1057 for (Int_t iLayer = 0; iLayer < fGtuParam->GetNLayers(); iLayer++) {
1058 if ((track->GetTrackletMask() >> iLayer) & 1) {
1059 sum += track->GetTracklet(iLayer)->GetPID();
ec5db61b 1060 ++i;
44eafcf2 1061 }
1062 }
1063
ec5db61b 1064 Float_t av = 1./i * sum;
a10c6981 1065 sum = sum & 0x7ff;
1066 ULong64_t prod = (sum * coeff) & 0xfffffffffull;
1067 ULong64_t prodFinal = ((prod >> 17) + ((prod >> 16) & 1)) & 0xff;
44eafcf2 1068
ec5db61b 1069 if (TMath::Abs((prodFinal & 0xff) - av) > 0.5)
1070 AliError(Form("problem with PID averaging (hw <-> ar): %3lli <-> %4.1f", prodFinal & 0xff, av));
44eafcf2 1071 track->SetPID(prodFinal & 0xff);
1072
1073 return kTRUE;
1074 }
1075 else {
1076
1077 // simple averaging
1078 Int_t nTracklets = 0;
1079 Int_t pidSum = 0;
1080 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
1081 if (!track->IsTrackletInLayer(layer)) {
1082 continue;
1083 }
1084 AliTRDtrackletGTU *trk = track->GetTracklet(layer);
1085 pidSum += trk->GetPID();
1086 nTracklets++;
1087 }
ee373611 1088
eaf6dbb0 1089 if (nTracklets>0)
1090 track->SetPID(pidSum/nTracklets);
ee373611 1091 else
1092 AliError("Track without contributing tracklets, no PID assigned");
44eafcf2 1093
1094 return kTRUE;
4ff7ed2b 1095 }
4ff7ed2b 1096}
1097
5f006bd7 1098Bool_t AliTRDgtuTMU::CalculateTrackParams(AliTRDtrackGTU *track)
52c19022 1099{
1100 // calculate the track parameters
1101
1102 if (!track) {
1103 AliError("No track to calculate!");
1104 return kFALSE;
1105 }
1106
1107 Int_t a = 0;
1108 Float_t b = 0;
1109 Float_t c = 0;
1110 Float_t x1;
1111 Float_t x2;
1112
c8b1590d 1113 AliDebug(5,Form("There are %i tracklets in this track.", track->GetNTracklets()));
52c19022 1114
1115 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
1116 if (!track->IsTrackletInLayer(layer)) {
1117 continue;
1118 }
1119 AliTRDtrackletGTU *trk = track->GetTracklet(layer);
1120 if (!trk) {
1121 AliError(Form("Could not get tracklet in layer %i\n", layer));
1122 continue;
1123 }
ec5db61b 1124 AliDebug(10,Form(" layer %i trk yprime: %6i, aki: %6i", layer, trk->GetYPrime(),
1125 fGtuParam->GetAki(track->GetTrackletMask(), layer)));
1126 a += (((fGtuParam->GetAki(track->GetTrackletMask(), layer) * trk->GetYPrime()) >> 7) + 1) >> 1;
52c19022 1127 b += fGtuParam->GetBki(track->GetTrackletMask(), layer) * trk->GetYPrime() * fGtuParam->GetBinWidthY();
1128 c += fGtuParam->GetCki(track->GetTrackletMask(), layer) * trk->GetYPrime() * fGtuParam->GetBinWidthY();
1129 }
1130 if (a < 0)
1131 a += 3;
1132 a = a >> 2;
1133
ec5db61b 1134 track->SetFitParams(a << 2, b, c);
52c19022 1135
d2c8b010 1136 fGtuParam->GetIntersectionPoints(track->GetTrackletMask(), x1, x2);
1137
ec5db61b 1138 AliDebug(5,Form(" Track parameters: a16 = %i, a18 = %i, b = %f, c = %f, x1 = %f, x2 = %f, pt = %f (trkl mask: %i)",
1139 a, a << 2, b, c, x1, x2, track->GetPt(), track->GetTrackletMask()));
d2c8b010 1140
52c19022 1141 return kTRUE;
1142}
1143
52c19022 1144
6419bebb 1145Bool_t AliTRDgtuTMU::Uniquifier(const TList *inlist, TList *outlist)
52c19022 1146{
36dc3337 1147 // remove multiple occurences of the same track
1148
52c19022 1149 TIter next(inlist);
1150 AliTRDtrackGTU *trkStage0 = 0x0;
1151 AliTRDtrackGTU *trkStage1 = 0x0;
1152
1153 do {
a3461d38 1154 if (trkStage0 != trkStage1)
1155 delete trkStage0;
1156
52c19022 1157 trkStage0 = (AliTRDtrackGTU*) next();
1158
36dc3337 1159 Bool_t tracksEqual = kFALSE;
52c19022 1160 if (trkStage0 != 0 && trkStage1 != 0) {
1161 for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
1162 if (trkStage0->GetTrackletIndex(layer) != -1 && trkStage0->GetTrackletIndex(layer) == trkStage1->GetTrackletIndex(layer)) {
36dc3337 1163 tracksEqual = kTRUE;
52c19022 1164 break;
1165 }
1166 }
1167 }
1168
36dc3337 1169 if (tracksEqual) {
a3461d38 1170 if (trkStage0->GetNTracklets() >= trkStage1->GetNTracklets()) {
1171 delete trkStage1;
1172 trkStage1 = trkStage0;
1173 }
5f006bd7 1174 }
52c19022 1175 else {
5f006bd7 1176 if (trkStage1 != 0x0)
52c19022 1177 outlist->Add(trkStage1);
1178 trkStage1 = trkStage0;
5f006bd7 1179 }
1180
52c19022 1181 } while (trkStage1 != 0x0);
1182 return kTRUE;
1183}