]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDtrigger.cxx
Modifications in the QueryTags method: AliEventTag::GetTURL() returns an empty string...
[u/mrichter/AliRoot.git] / TRD / AliTRDtrigger.cxx
CommitLineData
0ee00e25 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///////////////////////////////////////////////////////////////////////////////
17// //
18// TRD trigger class //
19// //
6d50f529 20// Author: //
21// Bogdan Vulpescu //
e3b2b5e5 22// //
0ee00e25 23///////////////////////////////////////////////////////////////////////////////
24
25#include <TTree.h>
26#include <TBranch.h>
27#include <TMatrixD.h>
6d50f529 28#include <TClonesArray.h>
29#include <TObjArray.h>
0ee00e25 30
31#include "AliLog.h"
32#include "AliRun.h"
0ee00e25 33#include "AliLoader.h"
0ee00e25 34
35#include "AliTRDdigitsManager.h"
36#include "AliTRDgeometry.h"
37#include "AliTRDdataArrayI.h"
38#include "AliTRDcalibDB.h"
39#include "AliTRDCommonParam.h"
0ee00e25 40#include "AliTRDrawData.h"
0ee00e25 41#include "AliTRDtrigger.h"
e3b2b5e5 42#include "AliTRDmodule.h"
0ee00e25 43#include "AliTRDmcmTracklet.h"
6d50f529 44#include "AliTRDgtuTrack.h"
0ee00e25 45#include "AliTRDtrigParam.h"
46#include "AliTRDmcm.h"
e3b2b5e5 47#include "AliTRDzmaps.h"
6d50f529 48#include "Cal/AliTRDCalPIDLQ.h"
0ee00e25 49
e3b2b5e5 50ClassImp(AliTRDtrigger)
0ee00e25 51
52//_____________________________________________________________________________
6d50f529 53AliTRDtrigger::AliTRDtrigger()
54 :TNamed()
55 ,fField(0)
56 ,fGeo(NULL)
57 ,fCalib(NULL)
58 ,fCParam(NULL)
59 ,fTrigParam(NULL)
60 ,fRunLoader(NULL)
61 ,fDigitsManager(NULL)
62 ,fTrackletTree(NULL)
63 ,fTracklets(NULL)
64 ,fNROB(0)
65 ,fMCM(NULL)
66 ,fTrk(NULL)
67 ,fTrkTest(NULL)
68 ,fModule(NULL)
69 ,fGTUtrk(NULL)
70 ,fNtracklets(0)
71 ,fDigits(NULL)
72 ,fTrack0(NULL)
73 ,fTrack1(NULL)
74 ,fTrack2(NULL)
75 ,fNPrimary(0)
76 ,fTracks(NULL)
0ee00e25 77{
78 //
79 // AliTRDtrigger default constructor
80 //
81
0ee00e25 82}
83
84//_____________________________________________________________________________
6d50f529 85AliTRDtrigger::AliTRDtrigger(const Text_t *name, const Text_t *title)
86 :TNamed(name,title)
87 ,fField(0)
88 ,fGeo(NULL)
89 ,fCalib(NULL)
90 ,fCParam(NULL)
91 ,fTrigParam(NULL)
92 ,fRunLoader(NULL)
93 ,fDigitsManager(new AliTRDdigitsManager())
94 ,fTrackletTree(NULL)
95 ,fTracklets(new TObjArray(400))
96 ,fNROB(0)
97 ,fMCM(NULL)
98 ,fTrk(NULL)
99 ,fTrkTest(NULL)
100 ,fModule(NULL)
101 ,fGTUtrk(NULL)
102 ,fNtracklets(0)
103 ,fDigits(NULL)
104 ,fTrack0(NULL)
105 ,fTrack1(NULL)
106 ,fTrack2(NULL)
107 ,fNPrimary(0)
108 ,fTracks(new TClonesArray("AliTRDgtuTrack",1000))
0ee00e25 109{
110 //
111 // AliTRDtrigger constructor
112 //
113
0ee00e25 114}
115
116//_____________________________________________________________________________
6d50f529 117AliTRDtrigger::AliTRDtrigger(const AliTRDtrigger &p)
118 :TNamed(p)
119 ,fField(p.fField)
120 ,fGeo(NULL)
121 ,fCalib(NULL)
122 ,fCParam(NULL)
123 ,fTrigParam(NULL)
124 ,fRunLoader(NULL)
125 ,fDigitsManager(NULL)
126 ,fTrackletTree(NULL)
127 ,fTracklets(NULL)
128 ,fNROB(p.fNROB)
129 ,fMCM(NULL)
130 ,fTrk(NULL)
131 ,fTrkTest(NULL)
132 ,fModule(NULL)
133 ,fGTUtrk(NULL)
134 ,fNtracklets(p.fNtracklets)
135 ,fDigits(NULL)
136 ,fTrack0(NULL)
137 ,fTrack1(NULL)
138 ,fTrack2(NULL)
139 ,fNPrimary(p.fNPrimary)
140 ,fTracks(NULL)
0ee00e25 141{
142 //
143 // AliTRDtrigger copy constructor
144 //
145
0ee00e25 146}
147
148///_____________________________________________________________________________
149AliTRDtrigger::~AliTRDtrigger()
150{
151 //
152 // AliTRDtrigger destructor
153 //
154
155 if (fTracklets) {
156 fTracklets->Delete();
157 delete fTracklets;
158 }
159
6d50f529 160 if (fTracks) {
161 fTracks->Delete();
162 delete fTracks;
163 }
0ee00e25 164
165}
166
167//_____________________________________________________________________________
168AliTRDtrigger &AliTRDtrigger::operator=(const AliTRDtrigger &p)
169{
170 //
171 // Assignment operator
172 //
173
174 if (this != &p) ((AliTRDtrigger &) p).Copy(*this);
175 return *this;
176
177}
178
179//_____________________________________________________________________________
180void AliTRDtrigger::Copy(TObject &) const
181{
182 //
183 // Copy function
184 //
185
186 AliFatal("Not implemented");
187
188}
189
190//_____________________________________________________________________________
191void AliTRDtrigger::Init()
192{
193
194 fModule = new AliTRDmodule(fTrigParam);
6d50f529 195 fTracks->Clear();
0ee00e25 196
6d50f529 197 fField = fTrigParam->GetField();
198 fGeo = (AliTRDgeometry*)AliTRDgeometry::GetGeometry(fRunLoader);
3fcb9908 199
6d50f529 200 fCalib = AliTRDcalibDB::Instance();
201 if (!fCalib) {
202 AliError("No instance of AliTRDcalibDB.");
3fcb9908 203 return;
204 }
205
206 fCParam = AliTRDCommonParam::Instance();
6d50f529 207 if (!fCParam) {
208 AliError("No common parameters.");
3fcb9908 209 return;
210 }
211
0ee00e25 212}
213
214//_____________________________________________________________________________
215Bool_t AliTRDtrigger::Open(const Char_t *name, Int_t nEvent)
216{
217 //
218 // Opens the AliROOT file.
219 //
220
221 TString evfoldname = AliConfig::GetDefaultEventFolderName();
6d50f529 222 fRunLoader = AliRunLoader::GetRunLoader(evfoldname);
0ee00e25 223
6d50f529 224 if (!fRunLoader) {
0ee00e25 225 fRunLoader = AliRunLoader::Open(name);
6d50f529 226 }
0ee00e25 227 if (!fRunLoader) {
6d50f529 228 AliError(Form("Can not open session for file %s.",name));
0ee00e25 229 return kFALSE;
230 }
231
232 // Open input
6d50f529 233 if (fRunLoader->GetAliRun() == 0x0) {
234 fRunLoader->LoadgAlice();
235 }
0ee00e25 236 gAlice = fRunLoader->GetAliRun();
0ee00e25 237 if (!(gAlice)) {
238 fRunLoader->LoadgAlice();
239 gAlice = fRunLoader->GetAliRun();
240 if (!(gAlice)) {
6d50f529 241 AliError("Could not find AliRun object.");
0ee00e25 242 return kFALSE;
243 }
244 }
245
246 // Import the Trees for the event nEvent in the file
247 fRunLoader->GetEvent(nEvent);
248
249 // Open output
0ee00e25 250 TObjArray *ioArray = 0;
6d50f529 251 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
0ee00e25 252 loader->MakeTree("T");
253 fTrackletTree = loader->TreeT();
254 fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
0ee00e25 255 Init();
256
257 return kTRUE;
258
259}
260
0ee00e25 261//_____________________________________________________________________________
262Bool_t AliTRDtrigger::ReadDigits()
263{
264 //
265 // Reads the digits arrays from the input aliroot file
266 //
267
268 if (!fRunLoader) {
6d50f529 269 AliError("Can not find the Run Loader");
0ee00e25 270 return kFALSE;
271 }
272
273 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
6d50f529 274 if (!loader->TreeD()) {
275 loader->LoadDigits();
276 }
277 if (!loader->TreeD()) {
278 return kFALSE;
279 }
698b2e52 280
0ee00e25 281 return (fDigitsManager->ReadDigits(loader->TreeD()));
282
283}
284
285//_____________________________________________________________________________
286Bool_t AliTRDtrigger::ReadDigits(AliRawReader* rawReader)
287{
288 //
289 // Reads the digits arrays from the ddl file
290 //
291
292 AliTRDrawData *raw = new AliTRDrawData();
6d50f529 293 fDigitsManager = raw->Raw2Digits(rawReader);
0ee00e25 294
295 return kTRUE;
296
297}
298
299//_____________________________________________________________________________
300Bool_t AliTRDtrigger::ReadTracklets(AliRunLoader *rl)
301{
302 //
303 // Reads the tracklets find the tracks
304 //
305
306 Int_t idet;
307
308 AliLoader *loader = rl->GetLoader("TRDLoader");
309 loader->LoadTracks();
6d50f529 310 fTrackletTree = loader->TreeT();
0ee00e25 311
6d50f529 312 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
0ee00e25 313 if (!branch) {
6d50f529 314 AliError("Can't get the branch !");
0ee00e25 315 return kFALSE;
316 }
317 TObjArray *tracklets = new TObjArray(400);
318 branch->SetAddress(&tracklets);
319
6d50f529 320 Int_t nEntries = (Int_t) fTrackletTree->GetEntries();
321 Int_t iEntry;
322 Int_t itrk;
323 Int_t iStack;
324 Int_t iStackPrev = -1;
0ee00e25 325
326 for (iEntry = 0; iEntry < nEntries; iEntry++) {
6d50f529 327
0ee00e25 328 fTrackletTree->GetEvent(iEntry);
329
6d50f529 330 for (itrk = 0; itrk < tracklets->GetEntriesFast(); itrk++) {
0ee00e25 331
6d50f529 332 fTrk = (AliTRDmcmTracklet*)tracklets->UncheckedAt(itrk);
333 idet = fTrk->GetDetector();
0ee00e25 334 iStack = idet / (AliTRDgeometry::Nplan());
6d50f529 335
0ee00e25 336 if (iStackPrev != iStack) {
337 if (iStackPrev == -1) {
338 iStackPrev = iStack;
6d50f529 339 }
340 else {
341 MakeTracks(idet - AliTRDgeometry::Nplan());
0ee00e25 342 ResetTracklets();
343 iStackPrev = iStack;
344 }
345 }
346
347 Tracklets()->Add(fTrk);
348
6d50f529 349 if ((iEntry == (nEntries-1)) &&
350 (itrk == (tracklets->GetEntriesFast() - 1))) {
0ee00e25 351 idet++;
352 MakeTracks(idet-AliTRDgeometry::Nplan());
353 ResetTracklets();
354 }
355
356 }
357
358 }
359
360 loader->UnloadTracks();
361
362 return kTRUE;
363
364}
365
366//_____________________________________________________________________________
e3b2b5e5 367Bool_t AliTRDtrigger::MakeTracklets(Bool_t makeTracks)
0ee00e25 368{
3fcb9908 369 //
370 // Create tracklets from digits
371 //
0ee00e25 372
6d50f529 373 Int_t chamBeg = 0;
374 Int_t chamEnd = AliTRDgeometry::Ncham();
375 Int_t planBeg = 0;
376 Int_t planEnd = AliTRDgeometry::Nplan();
377 Int_t sectBeg = 0;
378 Int_t sectEnd = AliTRDgeometry::Nsect();
0ee00e25 379
3fcb9908 380 fTrkTest = new AliTRDmcmTracklet(0,0,0);
6d50f529 381 fMCM = new AliTRDmcm(fTrigParam,0);
382
383 Int_t time;
384 Int_t col;
385 Int_t row;
386 Int_t col1;
387 Int_t col2;
388 Int_t idet = -1;
389 Int_t iStack = -1;
390 Int_t iStackPrev = -1;
0ee00e25 391 Float_t amp;
6d50f529 392
0ee00e25 393 for (Int_t isect = sectBeg; isect < sectEnd; isect++) {
394
395 for (Int_t icham = chamBeg; icham < chamEnd; icham++) {
396
6d50f529 397 // Number of ROBs in the chamber
398 if(icham == 2) {
0ee00e25 399 fNROB = 6;
6d50f529 400 }
401 else {
0ee00e25 402 fNROB = 8;
403 }
404
405 for (Int_t iplan = planBeg; iplan < planEnd; iplan++) {
406
3fcb9908 407 idet = fGeo->GetDetector(iplan,icham,isect);
0ee00e25 408 ResetTracklets();
e3b2b5e5 409
410 if (makeTracks) {
411 iStack = idet / (AliTRDgeometry::Nplan());
412 if (iStackPrev != iStack) {
413 if (iStackPrev == -1) {
414 iStackPrev = iStack;
6d50f529 415 }
416 else {
e3b2b5e5 417 MakeTracks(idet-AliTRDgeometry::Nplan());
418 ResetTracklets();
419 iStackPrev = iStack;
420 }
0ee00e25 421 }
422 }
e3b2b5e5 423
6d50f529 424 Int_t nRowMax = fCParam->GetRowMax(iplan,icham,isect);
425 Int_t nColMax = fCParam->GetColMax(iplan);
426 Int_t nTimeTotal = fCalib->GetNumberOfTimeBins();
0ee00e25 427
428 // Get the digits
429 fDigits = fDigitsManager->GetDigits(idet);
698b2e52 430 if (!fDigits) return kFALSE;
0ee00e25 431 fDigits->Expand();
432 fTrack0 = fDigitsManager->GetDictionary(idet,0);
698b2e52 433 if (!fTrack0) return kFALSE;
0ee00e25 434 fTrack0->Expand();
435 fTrack1 = fDigitsManager->GetDictionary(idet,1);
698b2e52 436 if (!fTrack1) return kFALSE;
0ee00e25 437 fTrack1->Expand();
438 fTrack2 = fDigitsManager->GetDictionary(idet,2);
698b2e52 439 if (!fTrack2) return kFALSE;
0ee00e25 440 fTrack2->Expand();
441
0ee00e25 442 for (Int_t iRob = 0; iRob < fNROB; iRob++) {
443
444 for (Int_t iMcm = 0; iMcm < kNMCM; iMcm++) {
445
446 fMCM->Reset();
0ee00e25 447 fMCM->SetRobId(iRob);
448 fMCM->SetChaId(idet);
449
450 SetMCMcoordinates(iMcm);
451
452 row = fMCM->GetRow();
453
6d50f529 454 if ((row < 0) || (row >= nRowMax)) {
455 AliError("MCM row number out of range.");
9e79a757 456 continue;
0ee00e25 457 }
458
459 fMCM->GetColRange(col1,col2);
460
461 for (time = 0; time < nTimeTotal; time++) {
462 for (col = col1; col < col2; col++) {
6d50f529 463 if ((col >= 0) && (col < nColMax)) {
0ee00e25 464 amp = TMath::Abs(fDigits->GetDataUnchecked(row,col,time));
6d50f529 465 }
466 else {
0ee00e25 467 amp = 0.0;
468 }
469 fMCM->SetADC(col-col1,time,amp);
0ee00e25 470 }
471 }
472
473 if (fTrigParam->GetTailCancelation()) {
474 fMCM->Filter(fTrigParam->GetNexponential(),fTrigParam->GetFilterType());
475 }
476
477 if (fMCM->Run()) {
478
479 for (Int_t iSeed = 0; iSeed < kMaxTrackletsPerMCM; iSeed++) {
480
6d50f529 481 if (fMCM->GetSeedCol()[iSeed] < 0) {
482 continue;
483 }
0ee00e25 484
6d50f529 485 if (fTrigParam->GetDebugLevel() > 1) {
486 AliInfo(Form("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]));
487 }
0ee00e25 488
6d50f529 489 if (fTrigParam->GetDebugLevel() == -1) {
490 AliInfo(Form("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]));
0ee00e25 491 for (time = 0; time < nTimeTotal; time++) {
492 for (col = 0; col < kMcmCol; col++) {
493 printf("%03.0f ",fMCM->GetADC(col,time));
494 }
495 printf("\n");
496 }
497 }
498
3fcb9908 499 if (TestTracklet(idet,row,iSeed,0)) {
500 AddTracklet(idet,row,iSeed,fNtracklets++);
501 }
0ee00e25 502
503 }
504
505 }
506
507 }
508
509
510 }
511
512 // Compress the arrays
513 fDigits->Compress(1,0);
514 fTrack0->Compress(1,0);
515 fTrack1->Compress(1,0);
516 fTrack2->Compress(1,0);
517
518 WriteTracklets(idet);
519
520 }
521 }
522 }
e3b2b5e5 523
524 if (makeTracks) {
525 idet++;
6d50f529 526 MakeTracks(idet - AliTRDgeometry::Nplan());
e3b2b5e5 527 ResetTracklets();
528 }
529
0ee00e25 530 return kTRUE;
531
532}
533
534//_____________________________________________________________________________
535void AliTRDtrigger::SetMCMcoordinates(Int_t imcm)
536{
3fcb9908 537 //
538 // Configure MCM position in the pad plane
539 //
0ee00e25 540
541 Int_t robid = fMCM->GetRobId();
542
543 // setting the Row and Col range
544
545 const Int_t kNcolRob = 2; // number of ROBs per chamber in column direction
546 const Int_t kNmcmRob = 4; // number of MCMs per ROB in column/row direction
547
548 Int_t mcmid = imcm%(kNmcmRob*kNmcmRob);
549
550 if (robid%kNcolRob == 0) {
551
6d50f529 552 if (mcmid%kNmcmRob == 0) {
0ee00e25 553 fMCM->SetColRange(18*0-1,18*1-1+2+1);
554 }
6d50f529 555 if (mcmid%kNmcmRob == 1) {
0ee00e25 556 fMCM->SetColRange(18*1-1,18*2-1+2+1);
557 }
6d50f529 558 if (mcmid%kNmcmRob == 2) {
0ee00e25 559 fMCM->SetColRange(18*2-1,18*3-1+2+1);
560 }
6d50f529 561 if (mcmid%kNmcmRob == 3) {
0ee00e25 562 fMCM->SetColRange(18*3-1,18*4-1+2+1);
563 }
564
6d50f529 565 }
566 else {
0ee00e25 567
6d50f529 568 if (mcmid%kNmcmRob == 0) {
0ee00e25 569 fMCM->SetColRange(18*4-1,18*5-1+2+1);
570 }
6d50f529 571 if (mcmid%kNmcmRob == 1) {
0ee00e25 572 fMCM->SetColRange(18*5-1,18*6-1+2+1);
573 }
6d50f529 574 if (mcmid%kNmcmRob == 2) {
0ee00e25 575 fMCM->SetColRange(18*6-1,18*7-1+2+1);
576 }
6d50f529 577 if (mcmid%kNmcmRob == 3) {
0ee00e25 578 fMCM->SetColRange(18*7-1,18*8-1+2+1);
579 }
580
581 }
582
583 fMCM->SetRow(kNmcmRob*(robid/kNcolRob)+mcmid/kNmcmRob);
584
585}
586
587//_____________________________________________________________________________
3fcb9908 588Bool_t AliTRDtrigger::TestTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
0ee00e25 589{
3fcb9908 590 //
591 // Check first the tracklet pt
592 //
0ee00e25 593
3fcb9908 594 Int_t nTimeTotal = fCalib->GetNumberOfTimeBins();
595
596 fTrkTest->Reset();
597
598 fTrkTest->SetDetector(det);
599 fTrkTest->SetRow(row);
600 fTrkTest->SetN(n);
601
602 Int_t iCol, iCol1, iCol2, track[3];
603 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
604 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
605
606 Float_t amp[3];
607 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
608
609 amp[0] = fMCM->GetADC(iCol-1,iTime);
610 amp[1] = fMCM->GetADC(iCol ,iTime);
611 amp[2] = fMCM->GetADC(iCol+1,iTime);
612
613 // extract track contribution only from the central pad
614 track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
615 track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
616 track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
617
6d50f529 618 if (fMCM->IsCluster(iCol,iTime)) {
3fcb9908 619
620 fTrkTest->AddCluster(iCol+iCol1,iTime,amp,track);
621
6d50f529 622 }
623 else if ((iCol+1+1) < kMcmCol) {
3fcb9908 624
625 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
626 amp[1] = fMCM->GetADC(iCol +1,iTime);
627 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
628
629 if (fMCM->IsCluster(iCol+1,iTime)) {
630
631 // extract track contribution only from the central pad
632 track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
633 track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
634 track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
635
636 fTrkTest->AddCluster(iCol+1+iCol1,iTime,amp,track);
637
638 }
639
6d50f529 640 }
0ee00e25 641
3fcb9908 642 }
643
644 fTrkTest->CookLabel(0.8);
645 /*
646 if (fTrkTest->GetLabel() >= fNPrimary) {
647 Info("AddTracklet","Only primaries are stored!");
648 return;
649 }
650 */
651 // LTU Pt cut
652
653 fTrkTest->MakeTrackletGraph(fGeo,fField);
654 fTrkTest->MakeClusAmpGraph();
655 if (TMath::Abs(fTrkTest->GetPt()) < fTrigParam->GetLtuPtCut()) {
656 return kFALSE;
0ee00e25 657 }
658
3fcb9908 659 return kTRUE;
660
661}
662
663//_____________________________________________________________________________
664void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
665{
666 //
667 // Add a found tracklet
668 //
669
670 Int_t nTimeTotal = fCalib->GetNumberOfTimeBins();
0ee00e25 671
672 fTrk = new AliTRDmcmTracklet(det,row,n);
673
674 Int_t iCol, iCol1, iCol2, track[3];
675 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
676 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
677
e3b2b5e5 678 Float_t amp[3];
0ee00e25 679 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
680
e3b2b5e5 681 amp[0] = fMCM->GetADC(iCol-1,iTime);
682 amp[1] = fMCM->GetADC(iCol ,iTime);
683 amp[2] = fMCM->GetADC(iCol+1,iTime);
0ee00e25 684
685 // extract track contribution only from the central pad
686 track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
687 track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
688 track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
689
6d50f529 690 if (fMCM->IsCluster(iCol,iTime)) {
0ee00e25 691
e3b2b5e5 692 fTrk->AddCluster(iCol+iCol1,iTime,amp,track);
0ee00e25 693
6d50f529 694 }
695 else if ((iCol+1+1) < kMcmCol) {
0ee00e25 696
e3b2b5e5 697 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
698 amp[1] = fMCM->GetADC(iCol +1,iTime);
699 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
0ee00e25 700
701 if (fMCM->IsCluster(iCol+1,iTime)) {
702
703 // extract track contribution only from the central pad
704 track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
705 track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
706 track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
707
e3b2b5e5 708 fTrk->AddCluster(iCol+1+iCol1,iTime,amp,track);
0ee00e25 709
710 }
711
0ee00e25 712 }
713
714 }
715
716 fTrk->CookLabel(0.8);
717 /*
718 if (fTrk->GetLabel() >= fNPrimary) {
719 Info("AddTracklet","Only primaries are stored!");
720 return;
721 }
722 */
723 // LTU Pt cut
3fcb9908 724 fTrk->MakeTrackletGraph(fGeo,fField);
0ee00e25 725 fTrk->MakeClusAmpGraph();
e3b2b5e5 726 if (TMath::Abs(fTrk->GetPt()) < fTrigParam->GetLtuPtCut()) {
727 return;
728 }
0ee00e25 729
730 Tracklets()->Add(fTrk);
731
732}
733
734//_____________________________________________________________________________
735Bool_t AliTRDtrigger::WriteTracklets(Int_t det)
736{
737 //
738 // Fills TRDmcmTracklet branch in the tree with the Tracklets
739 // found in detector = det. For det=-1 writes the tree.
740 //
741
742 if ((det < -1) || (det >= AliTRDgeometry::Ndet())) {
6d50f529 743 AliError(Form("Unexpected detector index %d.",det));
0ee00e25 744 return kFALSE;
745 }
746
747 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
748 if (!branch) {
749 TObjArray *ioArray = 0;
750 branch = fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
751 }
752
753 if ((det >= 0) && (det < AliTRDgeometry::Ndet())) {
754
755 Int_t nTracklets = Tracklets()->GetEntriesFast();
756 TObjArray *detTracklets = new TObjArray(400);
757
758 for (Int_t i = 0; i < nTracklets; i++) {
6d50f529 759
0ee00e25 760 AliTRDmcmTracklet *trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
761
762 if (det == trk->GetDetector()) {
763 detTracklets->AddLast(trk);
764 }
6d50f529 765
0ee00e25 766 }
767
768 branch->SetAddress(&detTracklets);
769 fTrackletTree->Fill();
770
771 delete detTracklets;
772
773 return kTRUE;
774
775 }
776
777 if (det == -1) {
778
6d50f529 779 AliInfo(Form("Writing the Tracklet tree %s for event %d."
780 ,fTrackletTree->GetName(),fRunLoader->GetEventNumber()));
0ee00e25 781
782 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
783 loader->WriteTracks("OVERWRITE");
784
785 return kTRUE;
786
787 }
788
789 return kFALSE;
790
791}
792
793//_____________________________________________________________________________
794void AliTRDtrigger::MakeTracks(Int_t det)
795{
796 //
797 // Create GTU tracks per module (stack of 6 chambers)
798 //
799
800 fModule->Reset();
801
0ee00e25 802 Int_t nRowMax, iplan, icham, isect, row;
803
0ee00e25 804 if ((det < 0) || (det >= AliTRDgeometry::Ndet())) {
6d50f529 805 AliError(Form("Unexpected detector index %d.",det));
0ee00e25 806 return;
807 }
808
809 Int_t nTracklets = Tracklets()->GetEntriesFast();
810
811 AliTRDmcmTracklet *trk;
812 for (Int_t i = 0; i < nTracklets; i++) {
813
814 trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
815
3fcb9908 816 iplan = fGeo->GetPlane(trk->GetDetector());
817 icham = fGeo->GetChamber(trk->GetDetector());
818 isect = fGeo->GetSector(trk->GetDetector());
0ee00e25 819
3fcb9908 820 nRowMax = fCParam->GetRowMax(iplan,icham,isect);
0ee00e25 821 row = trk->GetRow();
822
823 fModule->AddTracklet(trk->GetDetector(),
824 row,
825 trk->GetRowz(),
826 trk->GetSlope(),
827 trk->GetOffset(),
828 trk->GetTime0(),
829 trk->GetNclusters(),
830 trk->GetLabel(),
831 trk->GetdQdl());
832
833 }
834
835 fModule->SortTracklets();
836 fModule->RemoveMultipleTracklets();
3fcb9908 837 fModule->SortZ((Int_t)fGeo->GetChamber(det));
0ee00e25 838 fModule->FindTracks();
839 fModule->SortTracks();
840 fModule->RemoveMultipleTracks();
841
842 Int_t nModTracks = fModule->GetNtracks();
843 AliTRDgtuTrack *gtutrk;
844 for (Int_t i = 0; i < nModTracks; i++) {
845 gtutrk = (AliTRDgtuTrack*)fModule->GetTrack(i);
846 if (TMath::Abs(gtutrk->GetPt()) < fTrigParam->GetGtuPtCut()) continue;
847 gtutrk->CookLabel();
848 gtutrk->MakePID();
849 AddTrack(gtutrk,det);
850 }
851
852}
853
6d50f529 854//_____________________________________________________________________________
855void AliTRDtrigger::AddTrack(const AliTRDgtuTrack *t, Int_t det)
856{
857 //
858 // Add a track to the list
859 //
860
861 AliTRDgtuTrack *track = new(fTracks->operator[](fTracks->GetEntriesFast()))
862 AliTRDgtuTrack(*t);
863 track->SetDetector(det);
864
865}
866
867//_____________________________________________________________________________
868TObjArray* AliTRDtrigger::Tracklets()
869{
870 //
871 // Returns list of tracklets
872 //
873
874 if (!fTracklets) {
875 fTracklets = new TObjArray(400);
876 }
877 return fTracklets;
0ee00e25 878
6d50f529 879}
880
881//_____________________________________________________________________________
882void AliTRDtrigger::ResetTracklets()
883{
884 //
885 // Resets the list of tracklets
886 //
887
888 if (fTracklets) {
889 fTracklets->Delete();
890 }
891
892}
893
894//_____________________________________________________________________________
895Int_t AliTRDtrigger::GetNumberOfTracks() const
896{
897 //
898 // Returns number of tracks
899 //
900
901 return fTracks->GetEntriesFast();
902
903}
904
905//_____________________________________________________________________________
906AliTRDgtuTrack* AliTRDtrigger::GetTrack(Int_t i) const
907{
908 //
909 // Returns a given track from the list
910 //
911
912 return (AliTRDgtuTrack *) fTracks->UncheckedAt(i);
913
914}