All known overlaps removed (M. Sitta)
[u/mrichter/AliRoot.git] / TRD / AliTRDdigitsManager.cxx
CommitLineData
6f1e466d 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
88cb7938 16/* $Id$ */
6f1e466d 17
18///////////////////////////////////////////////////////////////////////////////
19// //
20// Manages the digits and the track dictionary in the form of //
21// AliTRDdataArray objects. //
22// //
23///////////////////////////////////////////////////////////////////////////////
6244debe 24
a2cb5b3d 25#include <Riostream.h>
793ff80c 26
2ab0c725 27#include <TROOT.h>
793ff80c 28#include <TTree.h>
2ab0c725 29#include <TFile.h>
94de3818 30
6f1e466d 31#include "AliRun.h"
2745a409 32#include "AliLog.h"
6f1e466d 33
34#include "AliTRDdigitsManager.h"
793ff80c 35#include "AliTRDsegmentArray.h"
625f5260 36#include "AliTRDdataArray.h"
793ff80c 37#include "AliTRDdataArrayI.h"
625f5260 38#include "AliTRDdataArrayS.h"
f5375dcb 39#include "AliTRDdataArrayDigits.h"
793ff80c 40#include "AliTRDdigit.h"
41#include "AliTRDgeometry.h"
6f1e466d 42
ca21baaa 43#include "AliTRDSignalIndex.h"
44
6f1e466d 45ClassImp(AliTRDdigitsManager)
46
47//_____________________________________________________________________________
793ff80c 48
49 // Number of track dictionary arrays
50 const Int_t AliTRDdigitsManager::fgkNDict = kNDict;
51
52//_____________________________________________________________________________
2745a409 53AliTRDdigitsManager::AliTRDdigitsManager()
54 :TObject()
55 ,fEvent(0)
56 ,fTree(0)
57 ,fDigits(0)
625f5260 58 ,fHasSDigits(0)
ca21baaa 59 ,fSignalIndexes(NULL)
001be664 60 ,fUseDictionaries(kTRUE)
6f1e466d 61{
62 //
63 // Default constructor
64 //
65
6f1e466d 66 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
abaf1f1d 67 fDictionary[iDict] = NULL;
6f1e466d 68 }
ca21baaa 69
ca21baaa 70 fSignalIndexes = new TObjArray(AliTRDgeometry::Ndet());
71
6f1e466d 72}
73
74//_____________________________________________________________________________
dd9a6ee3 75AliTRDdigitsManager::AliTRDdigitsManager(const AliTRDdigitsManager &m)
2745a409 76 :TObject(m)
77 ,fEvent(m.fEvent)
78 ,fTree(0)
79 ,fDigits(0)
625f5260 80 ,fHasSDigits(m.fHasSDigits)
ca21baaa 81 ,fSignalIndexes(NULL)
001be664 82 ,fUseDictionaries(kTRUE)
8230f242 83{
84 //
85 // AliTRDdigitsManager copy constructor
86 //
87
8230f242 88}
89
90//_____________________________________________________________________________
6f1e466d 91AliTRDdigitsManager::~AliTRDdigitsManager()
92{
8230f242 93 //
94 // AliTRDdigitsManager destructor
95 //
6f1e466d 96
97 if (fDigits) {
98 fDigits->Delete();
99 delete fDigits;
625f5260 100 fDigits = NULL;
6f1e466d 101 }
102
103 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
104 fDictionary[iDict]->Delete();
105 delete fDictionary[iDict];
abaf1f1d 106 fDictionary[iDict] = NULL;
6f1e466d 107 }
108
c0ab62ff 109 if (fSignalIndexes) {
110 fSignalIndexes->Delete();
111 delete fSignalIndexes;
625f5260 112 fSignalIndexes = NULL;
c0ab62ff 113 }
ca21baaa 114
6f1e466d 115}
116
117//_____________________________________________________________________________
2745a409 118AliTRDdigitsManager &AliTRDdigitsManager::operator=(const AliTRDdigitsManager &m)
119{
120 //
121 // Assignment operator
122 //
123
625f5260 124 if (this != &m) {
125 ((AliTRDdigitsManager &) m).Copy(*this);
126 }
127
2745a409 128 return *this;
129
130}
131
132//_____________________________________________________________________________
e0d47c25 133void AliTRDdigitsManager::Copy(TObject &m) const
8230f242 134{
135 //
136 // Copy function
137 //
138
625f5260 139 ((AliTRDdigitsManager &) m).fEvent = fEvent;
140 ((AliTRDdigitsManager &) m).fHasSDigits = fHasSDigits;
ca21baaa 141
625f5260 142 ((AliTRDdigitsManager &) m).fSignalIndexes = fSignalIndexes;
001be664 143 ((AliTRDdigitsManager &) m).fUseDictionaries = fUseDictionaries;
144
8230f242 145 TObject::Copy(m);
146
147}
148
149//_____________________________________________________________________________
abaf1f1d 150void AliTRDdigitsManager::CreateArrays()
151{
152 //
153 // Create the data arrays
154 //
155
625f5260 156 if (fHasSDigits) {
157 fDigits = new AliTRDsegmentArray("AliTRDdataArrayF",AliTRDgeometry::Ndet());
158 }
159 else {
f5375dcb 160 fDigits = new AliTRDsegmentArray("AliTRDdataArrayDigits",AliTRDgeometry::Ndet());
625f5260 161 }
abaf1f1d 162
625f5260 163 if (fUseDictionaries) {
164 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
165 fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI"
166 ,AliTRDgeometry::Ndet());
001be664 167 }
625f5260 168 }
169
170 for (Int_t i = 0; i < AliTRDgeometry::Ndet(); i++) {
171 fSignalIndexes->AddLast(new AliTRDSignalIndex());
172 }
abaf1f1d 173
174}
625f5260 175
17eee78a 176//_____________________________________________________________________________
177void AliTRDdigitsManager::ResetArrays()
178{
179 //
180 // Reset the data arrays
181 //
182
183 if (fDigits) {
c0ab62ff 184 fDigits->Delete();
17eee78a 185 delete fDigits;
186 }
625f5260 187 if (fHasSDigits) {
188 fDigits = new AliTRDsegmentArray("AliTRDdataArrayF",AliTRDgeometry::Ndet());
189 }
190 else {
191 fDigits = new AliTRDsegmentArray("AliTRDdataArrayS",AliTRDgeometry::Ndet());
192 }
17eee78a 193
625f5260 194 if (fUseDictionaries) {
195 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
196 if (fDictionary[iDict]) {
197 fDictionary[iDict]->Delete();
198 delete fDictionary[iDict];
001be664 199 }
625f5260 200 fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI"
201 ,AliTRDgeometry::Ndet());
17eee78a 202 }
625f5260 203 }
17eee78a 204
625f5260 205 for (Int_t i = 0; i < AliTRDgeometry::Ndet(); i++) {
206 AliTRDSignalIndex *idx = (AliTRDSignalIndex *)fSignalIndexes->At(i);
207 if (idx) idx->Reset();
208 }
6f1e466d 209
6f1e466d 210}
211
212//_____________________________________________________________________________
16bf9884 213Short_t AliTRDdigitsManager::GetDigitAmp(Int_t row, Int_t col,Int_t time
214 , Int_t det) const
215{
216 //
217 // Returns the amplitude of a digit
218 //
219
625f5260 220 if (!GetDigits(det)) {
221 return 0;
222 }
223
f5375dcb 224 return ((Short_t) ((AliTRDdataArrayDigits *) GetDigits(det))->GetData(row,col,time));
16bf9884 225
226}
227
228//_____________________________________________________________________________
d739fd4e 229UChar_t AliTRDdigitsManager::GetPadStatus(Int_t row, Int_t col, Int_t time
230 , Int_t det) const
231{
c10bf383 232 //
233 // Returns the pad status for the requested pad
234 //
d739fd4e 235
c10bf383 236 if (!GetDigits(det)) {
237 return 0;
238 }
239
240 return ((UChar_t) ((AliTRDdataArrayDigits *) GetDigits(det))->GetPadStatus(row,col,time));
d739fd4e 241
d739fd4e 242}
243
244//_____________________________________________________________________________
88cb7938 245Bool_t AliTRDdigitsManager::MakeBranch(TTree *tree)
855bfffd 246{
247 //
248 // Creates the tree and branches for the digits and the dictionary
249 //
250
251 Int_t buffersize = 64000;
252
253 Bool_t status = kTRUE;
254
855bfffd 255 if (tree) {
256 fTree = tree;
257 }
258
abaf1f1d 259 // Make the branch for the digits
260 if (fDigits) {
261 const AliTRDdataArray *kDigits = (AliTRDdataArray *) fDigits->At(0);
262 if (kDigits) {
bdbb05bb 263 if (!fTree) return kFALSE;
264 TBranch* branch = fTree->GetBranch("TRDdigits");
625f5260 265 if (!branch) fTree->Branch("TRDdigits",kDigits->IsA()->GetName()
266 ,&kDigits,buffersize,99);
2745a409 267 AliDebug(1,"Making branch TRDdigits\n");
6f1e466d 268 }
269 else {
270 status = kFALSE;
271 }
abaf1f1d 272 }
273 else {
274 status = kFALSE;
275 }
6f1e466d 276
625f5260 277 if (fUseDictionaries) {
278 // Make the branches for the dictionaries
279 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
280 Char_t branchname[15];
281 sprintf(branchname,"TRDdictionary%d",iDict);
282 if (fDictionary[iDict]) {
283 const AliTRDdataArray *kDictionary =
284 (AliTRDdataArray *) fDictionary[iDict]->At(0);
285 if (kDictionary) {
286 if (!fTree) return kFALSE;
287 TBranch* branch = fTree->GetBranch(branchname);
288 if (!branch) fTree->Branch(branchname,kDictionary->IsA()->GetName()
289 ,&kDictionary,buffersize,99);
290 AliDebug(1,Form("Making branch %s\n",branchname));
001be664 291 }
292 else {
293 status = kFALSE;
294 }
6f1e466d 295 }
625f5260 296 else {
297 status = kFALSE;
298 }
abaf1f1d 299 }
625f5260 300 }
6f1e466d 301
302 return status;
303
304}
305
306//_____________________________________________________________________________
855bfffd 307Bool_t AliTRDdigitsManager::ReadDigits(TTree *tree)
6f1e466d 308{
8230f242 309 //
310 // Reads the digit information from the input file
311 //
6f1e466d 312
313 Bool_t status = kTRUE;
314
855bfffd 315 if (tree) {
855bfffd 316 fTree = tree;
abaf1f1d 317 }
abaf1f1d 318
319 if (!fDigits) {
2745a409 320 AliDebug(1,"Create the data arrays.\n");
abaf1f1d 321 CreateArrays();
322 }
323
324 status = fDigits->LoadArray("TRDdigits",fTree);
6f1e466d 325
625f5260 326 if (fUseDictionaries) {
327 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
328 Char_t branchname[15];
329 sprintf(branchname,"TRDdictionary%d",iDict);
330 status = fDictionary[iDict]->LoadArray(branchname,fTree);
331 if (status == kFALSE) {
332 fUseDictionaries = kFALSE;
333 AliWarning("Unable to load dict arrays. Will not use them.\n");
334 break;
335 }
336 }
6f1e466d 337 }
338
339 return kTRUE;
340
341}
342
343//_____________________________________________________________________________
344Bool_t AliTRDdigitsManager::WriteDigits()
345{
346 //
347 // Writes out the TRD-digits and the dictionaries
348 //
349
6f1e466d 350 // Store the contents of the segment array in the tree
abaf1f1d 351 if (!fDigits->StoreArray("TRDdigits",fTree)) {
2745a409 352 AliError("Error while storing digits in branch TRDdigits\n");
6f1e466d 353 return kFALSE;
354 }
001be664 355
625f5260 356 if (fUseDictionaries) {
357 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
358 Char_t branchname[15];
359 sprintf(branchname,"TRDdictionary%d",iDict);
360 if (!fDictionary[iDict]->StoreArray(branchname,fTree)) {
361 AliError(Form("Error while storing dictionary in branch %s\n",branchname));
362 return kFALSE;
001be664 363 }
6f1e466d 364 }
625f5260 365 }
6f1e466d 366
abaf1f1d 367 // Write the new tree to the output file
8e64dd77 368 fTree->AutoSave(); // Modification by Jiri
abaf1f1d 369
6f1e466d 370 return kTRUE;
371
372}
9d0b222b 373
374//_____________________________________________________________________________
375AliTRDdigit *AliTRDdigitsManager::GetDigit(Int_t row, Int_t col
793ff80c 376 , Int_t time, Int_t det) const
9d0b222b 377{
378 //
379 // Creates a single digit object
380 //
381
382 Int_t digits[4];
383 Int_t amp[1];
384
385 digits[0] = det;
386 digits[1] = row;
387 digits[2] = col;
388 digits[3] = time;
389
f5375dcb 390 amp[0] = ((AliTRDdataArrayDigits *) GetDigits(det))->GetData(row,col,time);
9d0b222b 391
625f5260 392 return (new AliTRDdigit(digits,amp));
9d0b222b 393
394}
395
396//_____________________________________________________________________________
397Int_t AliTRDdigitsManager::GetTrack(Int_t track
398 , Int_t row, Int_t col, Int_t time
793ff80c 399 , Int_t det) const
9d0b222b 400{
401 //
402 // Returns the MC-track numbers from the dictionary.
403 //
404
405 if ((track < 0) || (track >= kNDict)) {
2745a409 406 AliError(Form("track %d out of bounds (size: %d, this: 0x%08x)"
407 ,track,kNDict,this));
9d0b222b 408 return -1;
409 }
410
625f5260 411 if (fUseDictionaries == kFALSE) {
412 return -1;
413 }
414
9d0b222b 415 // Array contains index+1 to allow data compression
625f5260 416 return (((AliTRDdataArrayI *) GetDictionary(det,track))->GetData(row,col,time) - 1);
9d0b222b 417
418}
419
dd9a6ee3 420//_____________________________________________________________________________
f5375dcb 421AliTRDdataArrayDigits *AliTRDdigitsManager::GetDigits(Int_t det) const
dd9a6ee3 422{
423 //
424 // Returns the digits array for one detector
425 //
426
625f5260 427 if (!fDigits) {
428 return 0x0;
429 }
430
f5375dcb 431 return (AliTRDdataArrayDigits *) fDigits->At(det);
dd9a6ee3 432
433}
434
435//_____________________________________________________________________________
625f5260 436AliTRDdataArray *AliTRDdigitsManager::GetDictionary(Int_t det, Int_t i) const
dd9a6ee3 437{
438 //
439 // Returns the dictionary for one detector
440 //
441
625f5260 442 if (fUseDictionaries == kFALSE) {
443 return 0x0;
444 }
445
446 return (AliTRDdataArray *) fDictionary[i]->At(det);
dd9a6ee3 447
448}
449
450//_____________________________________________________________________________
793ff80c 451Int_t AliTRDdigitsManager::GetTrack(Int_t track, AliTRDdigit *Digit) const
dd9a6ee3 452{
453 //
454 // Returns the MC-track numbers from the dictionary for a given digit
455 //
456
457 Int_t row = Digit->GetRow();
458 Int_t col = Digit->GetCol();
459 Int_t time = Digit->GetTime();
460 Int_t det = Digit->GetDetector();
461
462 return GetTrack(track,row,col,time,det);
463
464}
ca21baaa 465
466//_____________________________________________________________________________
467AliTRDSignalIndex *AliTRDdigitsManager::GetIndexes(Int_t det)
468{
469 //
470 // Returns indexes of active pads
471 //
472
625f5260 473 return (AliTRDSignalIndex *) fSignalIndexes->At(det);
ca21baaa 474
475}
476
477//_____________________________________________________________________________
478void AliTRDdigitsManager::RemoveDigits(Int_t det)
479{
480 //
481 // Clear memory
482 //
483
484 fDigits->ClearSegment(det);
485
486}
487
488//_____________________________________________________________________________
489void AliTRDdigitsManager::RemoveDictionaries(Int_t det)
490{
491 //
492 // Clear memory
493 //
625f5260 494
495 if (fUseDictionaries == kFALSE) {
496 return;
497 }
ca21baaa 498
499 for (Int_t i = 0; i < kNDict; i++) {
500 fDictionary[i]->ClearSegment(det);
501 }
502
503}
504
505//_____________________________________________________________________________
506void AliTRDdigitsManager::ClearIndexes(Int_t det)
507{
508 //
509 // Clear memory
510 //
625f5260 511
c10bf383 512 ((AliTRDSignalIndex *) fSignalIndexes->At(det))->ClearAll();
ca21baaa 513
625f5260 514}
ca21baaa 515
516//_____________________________________________________________________________
517Bool_t AliTRDdigitsManager::BuildIndexes(Int_t det)
518{
519 //
520 // Build the list of indices
521 //
522
523 Int_t nRows = 0;
524 Int_t nCols = 0;
525 Int_t nTbins = 0;
526
527 AliTRDgeometry geom;
f5375dcb 528 AliTRDdataArrayDigits *digits = 0x0;
625f5260 529
530 if (fHasSDigits) {
531 return kFALSE;
532 }
533 else {
f5375dcb 534 digits = (AliTRDdataArrayDigits *) GetDigits(det);
625f5260 535 }
536
ca21baaa 537 //digits should be expanded by now!!!
625f5260 538 if (digits->GetNtime() > 0) {
539
540 digits->Expand();
541 nRows = digits->GetNrow();
542 nCols = digits->GetNcol();
543 nTbins = digits->GetNtime();
544
545 AliTRDSignalIndex *indexes = GetIndexes(det);
546 indexes->SetSM(geom.GetSector(det));
053767a4 547 indexes->SetStack(geom.GetStack(det));
548 indexes->SetLayer(geom.GetLayer(det));
625f5260 549 indexes->SetDetNumber(det);
550
551 if (indexes->IsAllocated() == kFALSE) {
552 indexes->Allocate(nRows,nCols,nTbins);
ca21baaa 553 }
625f5260 554
555 for (Int_t ir = 0; ir < nRows; ir++) {
556 for (Int_t ic = 0; ic < nCols; ic++) {
557 for (Int_t it = 0; it < nTbins; it++) {
558
559 Int_t isig = digits->GetDataUnchecked(ir,ic,it);
560 if (isig > 0) {
561 indexes->AddIndexTBin(ir,ic,it);
562 }
563 } // tbins
564 } // cols
565 } // rows
566
567 } // if GetNtime
568 else {
569 return kFALSE;
570 }
571
ca21baaa 572 return kTRUE;
573
574}