ROOT logo
#ifndef ALITRDSIGNALINDEX_H
#define ALITRDSIGNALINDEX_H

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */
 
#include "TObject.h"

////////////////////////////////////////////////////////////////////////////
//                                                                        //
//  General container for data from TRD detector segments                 //
//  Adapted from AliDigits, origin M.Ivanov                               //
//                                                                        //
//  Author:                                                               //
//    Mateusz Ploskon (ploskon@ikf.uni-frankfurt.de)                      //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class AliTRDSignalIndex : public TObject
{
protected:

  union RowCol{
    Short_t rc;
    struct{
      UChar_t col;
      Char_t row;
    }s;
  };

public:

  AliTRDSignalIndex(); 
  AliTRDSignalIndex(Int_t nrow, Int_t ncol,Int_t ntime);
  AliTRDSignalIndex(const AliTRDSignalIndex &d);
  virtual ~AliTRDSignalIndex();
  AliTRDSignalIndex &operator=(const AliTRDSignalIndex &d); 

  void     Copy(TObject &d) const;
  void     Allocate(const Int_t nrow, const Int_t ncol, const Int_t ntime);

  void     Reset();
  void     ResetContentConditional(const Int_t nrow, const Int_t ncol, const Int_t ntime);
  void     ResetContent();
  void     ResetCounters();
  void     ResetTbinCounter() const { };

  void     ResetArrays();

  // Store the index row-column as an interesting one
  inline void AddIndexRC(const Int_t row, const Int_t col);
  // Get the next pad (row and column) and return kTRUE on success
  inline Bool_t NextRCIndex(Int_t &row, Int_t &col); 
  // Get the next timebin of a pad (row and column) and return kTRUE on success
  Bool_t   NextRCTbinIndex(Int_t &row, Int_t &col, Int_t &tbin); 
  // Get the next active timebin and return kTRUE on success
  Bool_t   NextTbinIndex(Int_t &tbin); 

  Bool_t CheckSorting(Int_t &row, Int_t &col);

  Int_t    GetCurrentRow() const  { return fCurrRow; }
  Int_t    GetCurrentCol() const  { return fCurrCol; }
  Int_t    GetCurrentTbin() const { return fCurrTbin; }

  Bool_t   IsBoolIndex(Int_t row, Int_t col) const {return fBoolIndex[row*fNcols+col];};
  void     InitSortedIndex();

  // Clear the array, actually destroy and recreate w/o allocating
  void     ClearAll(); 
  // Return kTRUE if array allocated and there is no need to call allocate
  Bool_t   IsAllocated() const    { if (!fBoolIndex)    return kFALSE; 
                                    if (fMaxLimit <= 0) return kFALSE; 
                                    else                return kTRUE;}

  void     SetSM(const Int_t ix)        { fSM      =    ix; }
  void     SetStack(const Int_t ix)     { fStack   =    ix; }
  void     SetLayer(const Int_t ix)     { fLayer   =    ix; }
  void     SetDetNumber(const Int_t ix) { fDet     =    ix; }
  
  Int_t    GetDetNumber() const   { return fDet;      } // Get Det number
  Int_t    GetLayer() const       { return fLayer;    } // Layer position of the chamber in TRD
  Int_t    GetStack() const       { return fStack;    } // Stack position of the chamber in TRD
  Int_t    GetSM() const          { return fSM;       } // Super module of the TRD
  Short_t *GetArray() const       { return (Short_t*)fSortedIndex; } // Get the array pointer for god knows what reason
  Int_t    GetNoOfIndexes() const { return fCountRC-1;  }

  Bool_t   HasEntry() const       { return fCountRC > 1 ? kTRUE : kFALSE; } // Return status if has an entry

  Int_t    GetNrow() const        { return fNrows;    } // Get Nrows
  Int_t    GetNcol() const        { return fNcols;    } // Get Ncols
  Int_t    GetNtime() const       { return fNtbins;   } // Get Ntbins

 private:

  Int_t     fDet;                //  Detector number
  Int_t     fLayer;              //  Layer position in the full TRD
  Int_t     fStack;              //  Stack position in the full TRD
  Int_t     fSM;                 //  Super module - position in the full TRD

  Bool_t   *fBoolIndex;          //  Indices
  RowCol   *fSortedIndex;        //  Sorted indices
  Int_t     fMaxLimit;           //  Max number of things in the array
  Int_t     fPositionRC;         //  Position in the SortedIndex
  Int_t     fCountRC;            //  the number of added rc combinations
  Bool_t    fSortedWasInit;      //  Was SortedIndex initialized?

  Int_t     fCurrRow;            //  Last Row read out of SortedIndex
  Int_t     fCurrCol;            //  Last Col read out of SortedIndex
  Int_t     fCurrTbin;           //  Last outgiven Tbin
  
  Int_t     fNrows;              //  Number of rows in the chamber
  Int_t     fNcols;              //  Number of cols in the chamber
  Int_t     fNtbins;             //  Number of tbins in the chamber 

  ClassDef(AliTRDSignalIndex,2)  //  Data container for one TRD detector segment

};

void AliTRDSignalIndex::AddIndexRC(const Int_t row, const Int_t col)
{
  //
  // Adds RC combination to array
  //

  const Int_t num=row*fNcols+col;
  if(fBoolIndex[num])return;
  fBoolIndex[num]=kTRUE;
  fSortedIndex[fCountRC].s.col=col;
  fSortedIndex[fCountRC].s.row=row;
  fCountRC++;
}

Bool_t AliTRDSignalIndex::NextRCIndex(Int_t &row, Int_t &col)
{
  //
  // Returns next used RC combination
  //

  if (!IsAllocated())
    return kFALSE;

  if(fSortedIndex[fPositionRC].rc>-1){
    row = fCurrRow = fSortedIndex[fPositionRC].s.row;
    col = fCurrCol = fSortedIndex[fPositionRC].s.col;
    fPositionRC++;
    return kTRUE;
  }
  else
    return CheckSorting(row, col);
}

#endif

/*
Comment from 22 Dec 2008

The structure of the Index was changed. Now no Tbin is saved anymore,
only RC combination are saved! (reasons see below)

For the readout, all tbins for a RC combination must be read out to find 
the time bin of signal > 0.

THE WRITING PROCEDURE:
AddIndexTBin is now obsolate, use AddIndexRC instead as AddIndexTBin will
be deleted in future.

example that gives exactely the same output as before:
as it was: 
           AliTRDSignalIndexes *indexes;
           AliTRDarrayADC *Signal; //or AliTRDarraySignal *Signal;
	   if(Signal->GetDataB(row, col, time)>0)
               indexes->AddIndexTBin(row, col, time);

as it should be from no on: 
           AliTRDSignalIndexes *indexes;
           AliTRDarrayADC *Signal; //or AliTRDarraySignal *Signal;
	   if(Signal->GetDataB(row, col, time)>0)
               indexes->AddIndexRC(row, col);



THE READING PROCEDURE:
In most cases you can leave anything as it is.
See more in the example.

example:
as it was: 
           AliTRDSignalIndexes *indexes;
           AliTRDarraySignal *Signal;
           while(indexes->NextRCTbinIndex(row, col, time)) 
           {...}

as it should be from no on to get the exactely the same output as before: 
           AliTRDSignalIndexes *indexes;
           AliTRDarraySignal *Signal;
           while(indexes->NextRCTbinIndex(row, col, time)) 
              if(Signal->GetData(row, col, time)>0)
                 {...}

as it should be idealy:
           AliTRDSignalIndexes *indexes;
           AliTRDarraySignal *Signal;
           for(time = 0; time < Ntime; time++)
              while(indexes->NextRCIndex(row, col, time)) 
                 if(Signal->GetData(row, col, time)>0)
                    {...}


REASON OF THE CHANGES:

The array saved the information nicely, but it turned out that sorting 
the array by column would have many benefits.
I.e. it is crucial for fivePadClusters and it if much faster to allocate.
But the sorting is not fast if the tbin is also saved.
Moreover the tbin information was alsmost useless because, 
whenever an RC index existed, many of the possible tbins where used.

Theodor Rascanu

*/
 AliTRDSignalIndex.h:1
 AliTRDSignalIndex.h:2
 AliTRDSignalIndex.h:3
 AliTRDSignalIndex.h:4
 AliTRDSignalIndex.h:5
 AliTRDSignalIndex.h:6
 AliTRDSignalIndex.h:7
 AliTRDSignalIndex.h:8
 AliTRDSignalIndex.h:9
 AliTRDSignalIndex.h:10
 AliTRDSignalIndex.h:11
 AliTRDSignalIndex.h:12
 AliTRDSignalIndex.h:13
 AliTRDSignalIndex.h:14
 AliTRDSignalIndex.h:15
 AliTRDSignalIndex.h:16
 AliTRDSignalIndex.h:17
 AliTRDSignalIndex.h:18
 AliTRDSignalIndex.h:19
 AliTRDSignalIndex.h:20
 AliTRDSignalIndex.h:21
 AliTRDSignalIndex.h:22
 AliTRDSignalIndex.h:23
 AliTRDSignalIndex.h:24
 AliTRDSignalIndex.h:25
 AliTRDSignalIndex.h:26
 AliTRDSignalIndex.h:27
 AliTRDSignalIndex.h:28
 AliTRDSignalIndex.h:29
 AliTRDSignalIndex.h:30
 AliTRDSignalIndex.h:31
 AliTRDSignalIndex.h:32
 AliTRDSignalIndex.h:33
 AliTRDSignalIndex.h:34
 AliTRDSignalIndex.h:35
 AliTRDSignalIndex.h:36
 AliTRDSignalIndex.h:37
 AliTRDSignalIndex.h:38
 AliTRDSignalIndex.h:39
 AliTRDSignalIndex.h:40
 AliTRDSignalIndex.h:41
 AliTRDSignalIndex.h:42
 AliTRDSignalIndex.h:43
 AliTRDSignalIndex.h:44
 AliTRDSignalIndex.h:45
 AliTRDSignalIndex.h:46
 AliTRDSignalIndex.h:47
 AliTRDSignalIndex.h:48
 AliTRDSignalIndex.h:49
 AliTRDSignalIndex.h:50
 AliTRDSignalIndex.h:51
 AliTRDSignalIndex.h:52
 AliTRDSignalIndex.h:53
 AliTRDSignalIndex.h:54
 AliTRDSignalIndex.h:55
 AliTRDSignalIndex.h:56
 AliTRDSignalIndex.h:57
 AliTRDSignalIndex.h:58
 AliTRDSignalIndex.h:59
 AliTRDSignalIndex.h:60
 AliTRDSignalIndex.h:61
 AliTRDSignalIndex.h:62
 AliTRDSignalIndex.h:63
 AliTRDSignalIndex.h:64
 AliTRDSignalIndex.h:65
 AliTRDSignalIndex.h:66
 AliTRDSignalIndex.h:67
 AliTRDSignalIndex.h:68
 AliTRDSignalIndex.h:69
 AliTRDSignalIndex.h:70
 AliTRDSignalIndex.h:71
 AliTRDSignalIndex.h:72
 AliTRDSignalIndex.h:73
 AliTRDSignalIndex.h:74
 AliTRDSignalIndex.h:75
 AliTRDSignalIndex.h:76
 AliTRDSignalIndex.h:77
 AliTRDSignalIndex.h:78
 AliTRDSignalIndex.h:79
 AliTRDSignalIndex.h:80
 AliTRDSignalIndex.h:81
 AliTRDSignalIndex.h:82
 AliTRDSignalIndex.h:83
 AliTRDSignalIndex.h:84
 AliTRDSignalIndex.h:85
 AliTRDSignalIndex.h:86
 AliTRDSignalIndex.h:87
 AliTRDSignalIndex.h:88
 AliTRDSignalIndex.h:89
 AliTRDSignalIndex.h:90
 AliTRDSignalIndex.h:91
 AliTRDSignalIndex.h:92
 AliTRDSignalIndex.h:93
 AliTRDSignalIndex.h:94
 AliTRDSignalIndex.h:95
 AliTRDSignalIndex.h:96
 AliTRDSignalIndex.h:97
 AliTRDSignalIndex.h:98
 AliTRDSignalIndex.h:99
 AliTRDSignalIndex.h:100
 AliTRDSignalIndex.h:101
 AliTRDSignalIndex.h:102
 AliTRDSignalIndex.h:103
 AliTRDSignalIndex.h:104
 AliTRDSignalIndex.h:105
 AliTRDSignalIndex.h:106
 AliTRDSignalIndex.h:107
 AliTRDSignalIndex.h:108
 AliTRDSignalIndex.h:109
 AliTRDSignalIndex.h:110
 AliTRDSignalIndex.h:111
 AliTRDSignalIndex.h:112
 AliTRDSignalIndex.h:113
 AliTRDSignalIndex.h:114
 AliTRDSignalIndex.h:115
 AliTRDSignalIndex.h:116
 AliTRDSignalIndex.h:117
 AliTRDSignalIndex.h:118
 AliTRDSignalIndex.h:119
 AliTRDSignalIndex.h:120
 AliTRDSignalIndex.h:121
 AliTRDSignalIndex.h:122
 AliTRDSignalIndex.h:123
 AliTRDSignalIndex.h:124
 AliTRDSignalIndex.h:125
 AliTRDSignalIndex.h:126
 AliTRDSignalIndex.h:127
 AliTRDSignalIndex.h:128
 AliTRDSignalIndex.h:129
 AliTRDSignalIndex.h:130
 AliTRDSignalIndex.h:131
 AliTRDSignalIndex.h:132
 AliTRDSignalIndex.h:133
 AliTRDSignalIndex.h:134
 AliTRDSignalIndex.h:135
 AliTRDSignalIndex.h:136
 AliTRDSignalIndex.h:137
 AliTRDSignalIndex.h:138
 AliTRDSignalIndex.h:139
 AliTRDSignalIndex.h:140
 AliTRDSignalIndex.h:141
 AliTRDSignalIndex.h:142
 AliTRDSignalIndex.h:143
 AliTRDSignalIndex.h:144
 AliTRDSignalIndex.h:145
 AliTRDSignalIndex.h:146
 AliTRDSignalIndex.h:147
 AliTRDSignalIndex.h:148
 AliTRDSignalIndex.h:149
 AliTRDSignalIndex.h:150
 AliTRDSignalIndex.h:151
 AliTRDSignalIndex.h:152
 AliTRDSignalIndex.h:153
 AliTRDSignalIndex.h:154
 AliTRDSignalIndex.h:155
 AliTRDSignalIndex.h:156
 AliTRDSignalIndex.h:157
 AliTRDSignalIndex.h:158
 AliTRDSignalIndex.h:159
 AliTRDSignalIndex.h:160
 AliTRDSignalIndex.h:161
 AliTRDSignalIndex.h:162
 AliTRDSignalIndex.h:163
 AliTRDSignalIndex.h:164
 AliTRDSignalIndex.h:165
 AliTRDSignalIndex.h:166
 AliTRDSignalIndex.h:167
 AliTRDSignalIndex.h:168
 AliTRDSignalIndex.h:169
 AliTRDSignalIndex.h:170
 AliTRDSignalIndex.h:171
 AliTRDSignalIndex.h:172
 AliTRDSignalIndex.h:173
 AliTRDSignalIndex.h:174
 AliTRDSignalIndex.h:175
 AliTRDSignalIndex.h:176
 AliTRDSignalIndex.h:177
 AliTRDSignalIndex.h:178
 AliTRDSignalIndex.h:179
 AliTRDSignalIndex.h:180
 AliTRDSignalIndex.h:181
 AliTRDSignalIndex.h:182
 AliTRDSignalIndex.h:183
 AliTRDSignalIndex.h:184
 AliTRDSignalIndex.h:185
 AliTRDSignalIndex.h:186
 AliTRDSignalIndex.h:187
 AliTRDSignalIndex.h:188
 AliTRDSignalIndex.h:189
 AliTRDSignalIndex.h:190
 AliTRDSignalIndex.h:191
 AliTRDSignalIndex.h:192
 AliTRDSignalIndex.h:193
 AliTRDSignalIndex.h:194
 AliTRDSignalIndex.h:195
 AliTRDSignalIndex.h:196
 AliTRDSignalIndex.h:197
 AliTRDSignalIndex.h:198
 AliTRDSignalIndex.h:199
 AliTRDSignalIndex.h:200
 AliTRDSignalIndex.h:201
 AliTRDSignalIndex.h:202
 AliTRDSignalIndex.h:203
 AliTRDSignalIndex.h:204
 AliTRDSignalIndex.h:205
 AliTRDSignalIndex.h:206
 AliTRDSignalIndex.h:207
 AliTRDSignalIndex.h:208
 AliTRDSignalIndex.h:209
 AliTRDSignalIndex.h:210
 AliTRDSignalIndex.h:211
 AliTRDSignalIndex.h:212
 AliTRDSignalIndex.h:213
 AliTRDSignalIndex.h:214
 AliTRDSignalIndex.h:215
 AliTRDSignalIndex.h:216
 AliTRDSignalIndex.h:217
 AliTRDSignalIndex.h:218
 AliTRDSignalIndex.h:219
 AliTRDSignalIndex.h:220
 AliTRDSignalIndex.h:221
 AliTRDSignalIndex.h:222