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.                  *
 **************************************************************************/

///////////////////////////////////////////////////////////////////////////////
///
/// This is a class for reading the AD DDL raw data
/// The format of the raw data corresponds to the one
/// implemented in AliADBuffer class. 
///
///////////////////////////////////////////////////////////////////////////////

#include "AliADRawStream.h"
#include "AliRawReader.h"
#include "AliLog.h"
#include "AliDAQ.h"
#include "AliADCalibData.h"
ClassImp(AliADRawStream)

//_____________________________________________________________________________
AliADRawStream::AliADRawStream(AliRawReader* rawReader) :
  fTrigger(0),
  fTriggerMask(0),
  fPosition(-1),
  fRawReader(rawReader),
  fData(NULL)
{
  // create an object to read AD raw data
  //
  // select the raw data corresponding to
  // the AD detector id
  fRawReader->Reset();
  AliDebug(1,Form("Selecting raw data for detector %d",AliDAQ::DetectorID("AD")));
  fRawReader->Select("AD");

  // Initalize the containers
  for(Int_t i = 0; i < kNChannels; i++) {
    fTime[i] = fWidth[i] = 0;
    for(Int_t j = 0; j < kNEvOfInt; j++) {
      fADC[i][j] = 0;
      fIsInt[i][j] = fIsBB[i][j] = fIsBG[i][j] = kFALSE;
    }
    fBBScalers[i] = fBGScalers[i] = 0;
    for(Int_t j = 0; j < kNBunches; j++) {
      fChargeMB[i][j] = 0;
      fIsIntMB[i][j] = fIsBBMB[i][j] = fIsBGMB[i][j] = kFALSE;
    }
  }
  for(Int_t i = 0; i < kNScalers; i++) fScalers[i] = 0;
  for(Int_t i = 0; i < kNBunches; i++) fBunchNumbers[i] = 0;
}

//_____________________________________________________________________________
AliADRawStream::~AliADRawStream()
{
  // destructor
}

//_____________________________________________________________________________
void AliADRawStream::Reset()
{
  // reset raw stream params

  // Reinitalize the containers
  for(Int_t i = 0; i < kNChannels; i++) {
    fTime[i] = fWidth[i] = 0;
    for(Int_t j = 0; j < kNEvOfInt; j++) {
      fADC[i][j] = 0;
      fIsInt[i][j] = fIsBB[i][j] = fIsBG[i][j] = kFALSE;
    }
    fBBScalers[i] = fBGScalers[i] = 0;
    for(Int_t j = 0; j < kNBunches; j++) {
      fChargeMB[i][j] = 0;
      fIsIntMB[i][j] = fIsBBMB[i][j] = fIsBGMB[i][j] = kFALSE;
    }
  }
  for(Int_t i = 0; i < kNScalers; i++) fScalers[i] = 0;
  for(Int_t i = 0; i < kNBunches; i++) fBunchNumbers[i] = 0;

  fTrigger = fTriggerMask = 0;
  fPosition = -1;
  fData = NULL;

  if (fRawReader) fRawReader->Reset();
}

//_____________________________________________________________________________
Bool_t AliADRawStream::Next()
{
  // read next digit from the AD raw data stream
  // return kFALSE in case of error or no digits left

  if (fPosition >= 0) return kFALSE;

  if (!fRawReader->ReadNextData(fData)) return kFALSE;
  if (fRawReader->GetDataSize() == 0) return kFALSE;
     
  if (fRawReader->GetDataSize() != 5936) {
     fRawReader->AddFatalErrorLog(kRawDataSizeErr,Form("size %d != 5936",fRawReader->GetDataSize()));
     AliWarning(Form("Wrong AD raw data size: %d, expected 5936 bytes!",fRawReader->GetDataSize()));
     return kFALSE;
  }

  fPosition = 0;

  fTrigger = GetNextWord() & 0xffff;
  fTriggerMask = GetNextWord() & 0xffff;

  for(Int_t iScaler = 0; iScaler < kNScalers; iScaler++)
     fScalers[iScaler] = GetNextWord();

  for(Int_t iBunch = 0; iBunch < kNBunches; iBunch++)
     fBunchNumbers[iBunch] = GetNextWord();
  
  Int_t iCIU=0;
  for (Int_t  iV0CIU = 0; iV0CIU < 8; iV0CIU++) {
    
    if(iV0CIU != 2 || iV0CIU != 5) {
      for(Int_t iWord = 0; iWord<182; iWord++) GetNextWord();
      continue;
      	}
 
  // decoding of one Channel Interface Unit numbered iCIU - there are 8 channels per CIU (and 2 CIUs) :
  
    for (Int_t iChannel_Offset = iCIU*8; iChannel_Offset < (iCIU*8)+8; iChannel_Offset=iChannel_Offset+4) { 
      for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
        for(Int_t iEvOfInt = 0; iEvOfInt < kNEvOfInt; iEvOfInt++) {
          UShort_t data = GetNextShort();
          fADC[iChannel][iEvOfInt] = data & 0x3ff;
          fIsInt[iChannel][iEvOfInt] = (data >> 10) & 0x1;
        }
      }
      for(Int_t iEvOfInt = 0; iEvOfInt < kNEvOfInt; iEvOfInt=iEvOfInt+2) {
        UShort_t data = GetNextShort();
        for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {          
          fIsBB[iChannel][iEvOfInt] = (data >>  2*(iChannel-iChannel_Offset)) & 0x1;
          fIsBG[iChannel][iEvOfInt] = (data >> (2*(iChannel-iChannel_Offset)+1)) & 0x1; 
	  if(iEvOfInt < (kNEvOfInt - 1)) {      
             fIsBB[iChannel][iEvOfInt+1] = (data >> (8+ 2*(iChannel-iChannel_Offset))) & 0x1;
             fIsBG[iChannel][iEvOfInt+1] = (data >> (8+ 2*(iChannel-iChannel_Offset)+1)) & 0x1;
	  }
        }
      }

      GetNextShort();

      for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
        for(Int_t iBunch = 0; iBunch < kNBunches; iBunch++) {
          UShort_t data = GetNextShort();
          fChargeMB[iChannel][iBunch] = data & 0x3ff;
          fIsIntMB[iChannel][iBunch] = (data >> 10) & 0x1;
        } 
      }
   
      for(Int_t iBunch = 0; iBunch < kNBunches; iBunch=iBunch+2) {
        UShort_t data = GetNextShort();
        for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {  
          fIsBBMB[iChannel][iBunch] = (data >>  2*iBunch) & 0x1;
          fIsBGMB[iChannel][iBunch] = (data >> (2*iBunch+1)) & 0x1;
	  if(iBunch < (kNBunches - 1)) {
             fIsBBMB[iChannel][iBunch+1] = (data >> (8+2*iBunch)) & 0x1;
             fIsBGMB[iChannel][iBunch+1] = (data >> (8+2*iBunch+1)) & 0x1;
	  }	  
        }
      }
  
      GetNextShort();
   
      for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
        fBBScalers[iChannel] = ((ULong64_t)GetNextWord()) << 32;
        fBBScalers[iChannel] |= GetNextWord();
        fBGScalers[iChannel] = ((ULong64_t)GetNextWord()) << 32;
        fBGScalers[iChannel] |= GetNextWord();
      }

    } 

    for(Int_t iChannel = (iCIU*8) + 7; iChannel >= iCIU*8; iChannel--) { 
      UInt_t time = GetNextWord();
      fTime[iChannel]  = time & 0xfff;
      fWidth[iChannel] = ((time >> 12) & 0x7f); // HPTDC used in pairing mode
    }
    iCIU++;
    // End of decoding of one CIU card
    AliWarning(Form("Number of bytes used at end of reading CIU card number %d %d", iCIU+1, fPosition)); 
    
  } // end of decoding the eight CIUs
    
  return kTRUE;
}

//_____________________________________________________________________________
UInt_t AliADRawStream::GetNextWord()
{
  // This method returns the next 32 bit word
  // inside the raw data payload.
  // The method is supposed to be endian (platform)
  // independent.
  if (!fData || fPosition < 0) AliFatal("Raw data payload buffer is not yet initialized !");

  UInt_t word = 0;
  word |= fData[fPosition++];
  word |= fData[fPosition++] << 8;
  word |= fData[fPosition++] << 16;
  word |= fData[fPosition++] << 24;

  return word;
}

//_____________________________________________________________________________
UShort_t AliADRawStream::GetNextShort()
{
  // This method returns the next 16 bit word
  // inside the raw data payload.
  // The method is supposed to be endian (platform)
  // independent.
  if (!fData || fPosition < 0) AliFatal("Raw data payload buffer is not yet initialized !");

  UShort_t word = 0;
  word |= fData[fPosition++];
  word |= fData[fPosition++] << 8;

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