ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

/*
 * Class for reading TRU data from a bunch from a raw datastream.
 * Author: Henrik Qvigstad <henrik.qvigstad@cern.ch>
 * Author: Jussi Viinikainen <jussi.viinikainen@cern.ch> (adaptation to Run2 format)
 */

#include "AliPHOSTRURawReader.h"

#include "AliCaloRawStreamV3.h"

ClassImp(AliPHOSTRURawReader)


//________________________________________________________________
AliPHOSTRURawReader::AliPHOSTRURawReader()
: TObject(),
fSignals(),
fFlags(),
fFlags2x2(),
fActive(false),
fHasSignal(false),
fActiveTime(),
fHasSignalTime(),
fUse4x4Flags(false)
{
  // default constructor
  
  // fSignals Initialization:
  for(Int_t row = 0; row < fgkN2x2XPrTRURow; ++row) {
    for(Int_t branch = 0; branch < fgkN2x2ZPrBranch; ++branch) {
      for(Int_t timeBin = 0; timeBin < fgkNTimeBins; ++timeBin) {
        fSignals[row][branch][timeBin] = fgkDefaultSignalValue;
        fFlags2x2[row][branch][timeBin] = kFALSE;
      }
    }
  }
  
  // fFlags Initialization
  for(Int_t row = 0; row < fgkN4x4XPrTRURow; ++row){
    for(Int_t branch = 0; branch < fgkN4x4ZPrBranch; ++branch){
      for(Int_t timeBin = 0; timeBin < fgkNTimeBins; ++timeBin){
        fFlags[row][branch][timeBin] = kFALSE;
      }
    }
  }
  
  // fActiveTime Initialization
  for(Int_t timeBin = 0; timeBin < fgkNTimeBins; ++timeBin){
    fActiveTime[timeBin] = kFALSE;
    fHasSignalTime[timeBin] = kFALSE;
  }
}


//________________________________________________________________
AliPHOSTRURawReader::~AliPHOSTRURawReader()
{
  // destructor
}

//________________________________________________________________
void AliPHOSTRURawReader::ReadFromStream(AliCaloRawStreamV3* rawStream)
{
  // reads the trigger signal amplitudes and trigger flags from the rawStream
  
  const UShort_t * const signal = rawStream->GetSignals(); // stream of 10-bit words, buffered as 16-bit words
  const Int_t signalLength = rawStream->GetBunchLength();  // The length of the signal in time steps
  const Int_t channelIndex = rawStream->GetColumn();  // For some reason the index of the readout channel is given by GetColumn function
  
  fActive = kTRUE; // Set the TRU active
  
  /* Channels in TRU:
   *
   * There are 112 readout channels and 12 channels reserved for production flags
   * The channels are indexed as follows:
   *
   *  Channels 0-111: channel data readout
   *  Channels 112-123: production flags
   */
  
  Int_t timeBin = rawStream->GetStartTimeBin(); // Find the time bin of the first time step
  
  if(channelIndex < fgkNReadoutChannels){  // Channel data
    
    /* Channel data:
     *
     * The channel data is read one channel at a time
     * The x and z indices corresponding to the channel are calculated from the channel index
     */
    
    fHasSignal = kTRUE;
    const Int_t xBin = 7 - channelIndex % 8;  // x index in TRU internal 2x2 coordinate system
    const Int_t zBin = 13 - channelIndex / 8; // z index in TRU internal 2x2 coordinate system
    
    // Loop over all the time steps in the signal
    for(Int_t i = 0; i < signalLength; i++){
      fSignals[xBin][zBin][timeBin] = signal[i];
      fActiveTime[timeBin] = kTRUE;
      fHasSignalTime[timeBin] = kTRUE;
      timeBin--; // The time bins come in reverse order from raw data
    }
  } else { // Production flags

    /* Production flags:
     *
     * Production flags are supplied in channels 112 - 123
     * Each of the channels is 10 bit wide
     * The bits inside the channel (indexing starting from the first bit of channel 112) is as follows:
     *
     *  Bits 0-111: Trigger flags for corresponding channel index
     *              If using 4x4 algorithm, only 91 first bits are used of these
     *  Bit 112: Marker for 4x4 algorithm (1 active, 0 not active)
     *  Bit 113: Marker for 2x2 algorithm (1 active, 0 not active)
     *  Bit 114: Global L0 OR of all patches in the TRU
     */
    
    Int_t channel, xBin, zBin;
    for(Int_t i = 0; i < signalLength; i++){
      fActiveTime[timeBin] = kTRUE;
      
      // If bit 112 is 1, we are considering 4x4 algorithm
      if(channelIndex == fgkFinalProductionChannel){
        if( (signal[i] & ( 1 << 2 )) > 0 ){ // Check the bit number 112
          fUse4x4Flags = kTRUE;
        }
      }
      
      // Assign the bits in the words to corresponding channels
      for(Int_t bitIndex = 0; bitIndex < fgkWordLength; bitIndex++){
        
        /* Find the correct channel number assuming that
         * channelIndex 112 = bits 0-9 corresponding trigger flags in channels 0-9
         * channelIndex 113 = bits 10-19 corresponding trigger flags in channels 10-19
         * and so on
         */
        channel = (channelIndex - fgkNReadoutChannels) * fgkWordLength + bitIndex;
        
        /*
         * Note: flags corresponding to 2x2 sums and 4x4 sums need to be filled
         *       in different loops since the internal xz coordinates are different
         *       for 2x2 case and 4x4 case. We do not know which data we are filling
         *       at the time we do the filling. This information comes only in the 
          *      channel 123 in bit 112.
         */
        
        if(channel < fgkNReadoutChannels){ // Fill histogram for 2x2 trigger flags
          xBin = 7 - channel % 8;  // x index in TRU internal 2x2 coordinate system
          zBin = 13 - channel / 8; // z index in TRU internal 2x2 coordinate system
          
          // check if the bit bitIndex is 1
          if( (signal[i] & ( 1 << bitIndex )) > 0 ){
            fFlags2x2[xBin][zBin][timeBin] = kTRUE;
          }
        }
        
        if(channel < fgkN4x4TriggerFlags){ // Fill histogram for 4x4 trigger flags
          xBin = 6 - channel % 7;  // x index in TRU internal 4x4 coordinate system
          zBin = 12 - channel / 7; // z index in TRU internal 4x4 coordinate system
          
          // check if the bit bitIndex is 1
          if( (signal[i] & ( 1 << bitIndex )) > 0 ){
            fFlags[xBin][zBin][timeBin] = kTRUE;
          }
        }
      } // Bits in one word
      timeBin--; // The time bins come in reverse order from raw data
    } // Length of signal
  } // Production flags
  
}


//________________________________________________________________
void AliPHOSTRURawReader::Reset()
{
  // Reset to default values
  
  if( ! fActive )
    return;
  
  for(Int_t timeBin = 0; timeBin < fgkNTimeBins; ++timeBin) { // loop timeBins
    if( fActiveTime[timeBin] ) {
      for(Int_t xIdx = 0; xIdx < fgkN2x2XPrTRURow; ++xIdx) { // loop 2x2
        for(Int_t zIdx = 0; zIdx < fgkN2x2ZPrBranch; ++zIdx) {
          fSignals[xIdx][zIdx][timeBin] = fgkDefaultSignalValue;
          fFlags2x2[xIdx][zIdx][timeBin] = kFALSE;
        } // zIdx
      } // xIdx
      for(Int_t xIdx = 0; xIdx < fgkN4x4XPrTRURow; ++xIdx) { // loop 4x4
        for(Int_t zIdx = 0; zIdx < fgkN4x4ZPrBranch; ++zIdx) {
          fFlags[xIdx][zIdx][timeBin] = false;
        } // zIdx
      } // xIdx
    }// end if fActiveTime
    fActiveTime[timeBin] = false;
    fHasSignalTime[timeBin] = false;
  } // timeBin
  
  fActive = false;
  fHasSignal = false;
}

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