ROOT logo
// $Id$

/**************************************************************************
 * This file is property of and copyright by the ALICE HLT Project        * 
 * ALICE Experiment at CERN, All rights reserved.                         *
 *                                                                        *
 * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
 *                  for The ALICE HLT Project.                            *
 *                                                                        *
 * 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.                  *
 **************************************************************************/

/** @file   testAliHLTAltroEncoder.C
    @author Matthias Richter
    @date   
    @brief  Test macro/program for the AliHLTAltroEncoder
 */

#ifndef __CINT__
#include "TFile.h"
#include "TDatime.h"
#include "TRandom.h"
#include "TArrayI.h"
#include "TArrayC.h"
#include "TSystem.h"
#include "AliRawDataHeader.h"
#include "AliAltroDecoder.h"
#include "AliAltroData.h"
#include "AliAltroBunch.h"
#include "AliHLTAltroEncoder.h"
#include "AliHLTSystem.h"
#include <ostream>
#endif //__CINT__

#ifndef __CINT__
const int sizeofAliRawDataHeader=sizeof(AliRawDataHeader);
#else
// cint does not handle sizeof correctly
const int sizeofAliRawDataHeader=32;
#endif

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//
// configuration of the test program
//

// printouts or not
const bool bVerbose=false;

// the encoder can be used in two different modes: using
// AddSignal and terminating each channel by explicitely calling
// SetChannel, or the combined version AddChannelSignal
const bool bUseAddChannelSignal=true;

// some defaults
const int maxChannels=100;
const int maxBunches=50;
const int maxTimebin=1024;
const int maxSignal=1024;
const int maxEncodedDataSize=4000000+sizeofAliRawDataHeader;

// file dumps
const char* encDataDumpFile=NULL;//"/tmp/altro-enc.dat";
const char* encodedDataFile="/tmp/altro-encoded.dat";
const char* simulatedDataFile="/tmp/altro-simulated.dat";

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////

Bool_t seedSet=kFALSE;

/**
 * Get a random number in the given range.
 */
int GetRandom(int min, int max)
{
  if (max-min<2) return min;
  static TRandom rand;
  if (!seedSet) {
    TDatime dt;
    rand.SetSeed(dt.Get());
    seedSet=kTRUE;
  }
  return rand.Integer(max-min);
}

/**
 * Print the bunch information of a channel.
 * The function goes recursively to the first bunch of the
 * channel and prints this one first.
 * @return number of 10bit words
 */
int DumpBunchRecursive(int nofBunches, int* pData, int size)
{
  if (!pData || size<2) return -1;
  int pos=size;
  int bunchLength=pData[--pos];
  int bunchEndTime=pData[--pos];
  int read=0;
  if (bunchLength<pos && nofBunches>1) {
    read=DumpBunchRecursive(nofBunches-1, pData, pos-bunchLength);
  }
  cout << "       bunch length " << bunchLength << ", end time " << bunchEndTime << ":";

  for (int time=bunchEndTime; time>bunchEndTime-bunchLength; time--) {	
    if (pos<1) {
      pos=0;
      cerr << "no data for bunch " << endl;
      return -1;
    }
    //cout << " " << pData[--pos];
  }
  cout << endl;
  if (read<0) return read;
  return read+2+bunchLength;
}

/**
 * Write the encoded data to a file.
 */
template<typename T> 
void DumpDataArray(T *array, const char* filename, int memberSize)
{
  if (array->GetSize()==0) return;

  ios::openmode filemode=(ios::openmode)0;
  ofstream rawfile(filename, filemode);
  if (rawfile.good()) {
    rawfile.write(reinterpret_cast<const char*>(array->GetArray()), array->GetSize()*memberSize);
  }
  rawfile.close();
}

/**
 * Print the simulated data.
 */
void PrintSimulatedData(TArrayI& data)
{
  cout << endl << "******  readback *******" << endl << endl;
  int dataPos=data.GetSize();
  while (dataPos>0) {
    int channelAddress=data[--dataPos];
    int nofBunches=data[--dataPos];
    cout << " ------------------ new channel -------------------------" << endl;
    if (nofBunches>0) {
      int read=DumpBunchRecursive(nofBunches, data.GetArray(), dataPos);
      if (read<0) return;
      dataPos-=read;
    }
    cout << " channel " << channelAddress << ":  number of bunches " << nofBunches << endl;
  }
}

int Compare(TArrayI& simData, TArrayC& encData)
{
  if (bVerbose) cout << endl << "******  compare *******" << endl << endl;

  // can not have a static AltroDecoder, crash when function
  // is called. I had a similar problem in the AliHLTAltroChannelSelectorComponent

  int iResult=0;
  AliAltroDecoder* decoder=new AliAltroDecoder;
  if (iResult>=0 && decoder->SetMemory((UChar_t*)encData.GetArray(), (UInt_t)encData.GetSize())<0) {
    cout << "error setting up decoder " << endl;
    iResult=-1;
  }

  if (iResult>=0 && !decoder->Decode()) {
    cout << "error decoding data" << endl;
    iResult=-1;    
  }

  AliAltroData altrochannel;
  int dataPos=simData.GetSize();
  while (iResult>=0 && decoder->NextChannel(&altrochannel)) {
    int hwadd=altrochannel.GetHadd();
    if (dataPos<2) {
      cout << "missmatch in simulated data" << endl;
      iResult=-1;
      break;
    }
    int channelAddress=simData[--dataPos];
    int nofBunches=simData[--dataPos];
    int nofBunchesBackup=nofBunches;
    if (channelAddress!=hwadd) {
      cout << "channel address missmatch: simulated " << channelAddress << " encoded " << hwadd << endl;
      iResult=-1;
      break;
    }

    if (bVerbose) cout << "comparing channel " << channelAddress << ", " << nofBunches << " bunche(s)" << endl;

    AliAltroBunch altrobunch;
    while (iResult>=0 && altrochannel.NextBunch(&altrobunch) && nofBunches-->0) {
      if (dataPos<2) {
	cout << "error reading bunch size and time bin from simulated data" << endl;
	iResult=-1;
	break;
      }
      int bunchLength=simData[--dataPos];
      int bunchEndTime=simData[--dataPos];
      if (bunchLength!=(int)altrobunch.GetBunchSize()) {
	cout << "bunch length missmatch: simulated " << bunchLength << " encoded " << altrobunch.GetBunchSize() << hex << " (" << altrobunch.GetBunchSize() << ")" << dec << endl;
	iResult=-1;
	break;
      }
      if (bunchEndTime!=(int)altrobunch.GetEndTimeBin()) {
	cout << "bunch end time missmatch: simulated " << bunchEndTime << " encoded " << altrobunch.GetEndTimeBin() << endl;
	iResult=-1;
	break;
      }
      if (bVerbose) cout << " bunch length " << bunchLength << ", end time " << bunchEndTime << endl;
      const  UInt_t* bunchData=altrobunch.GetData();
      if (bunchLength>dataPos) {
	cout << "error reading simulated bunch data, required "<< bunchLength << "  available " << dataPos << endl;
	iResult=-1;
	break;
      }
      Int_t* pSim=simData.GetArray();
      for (int bin=0; bin<bunchLength; bin++) {
	if ((int)bunchData[bin]!=pSim[dataPos-bunchLength+bin]) {
	  cout << "data missmatch at bunch position " << bin << " : simulated " << simData[dataPos] << " encoded " << bunchData[bin] << endl;
	  iResult=-1;
	  break;
	}
      }
      dataPos-=bunchLength;
    }
    if (nofBunches>0 && iResult==0) {
      cout << "error getting " << nofBunches << " of " << nofBunchesBackup << " bunches from channel " << channelAddress << endl;
      iResult=-1;
    }

  }

  delete decoder;
  return iResult;
}

void CompareDumpFiles()
{
  TString param=encodedDataFile;
  param+="?filetype=raw";
  TFile encFile(param);
  if (encFile.IsZombie()) {
    cout << "can not open file " << encodedDataFile << endl;
    return;
  }

  TArrayC encData(encFile.GetSize());
  if (encFile.ReadBuffer(encData.GetArray(), encData.GetSize())) {
    cout << "error reading file " << encodedDataFile << endl;
    return;
  }  

  param=simulatedDataFile;
  param+="?filetype=raw";
  TFile simFile(param);
  if (simFile.IsZombie()) {
    cout << "can not open file " << simulatedDataFile << endl;
    return;
  }

  TArrayI simData(simFile.GetSize()/4);
  if (simFile.ReadBuffer((char*)simData.GetArray(), simData.GetSize()*4)) {
    cout << "error reading file " << simulatedDataFile << endl;
    return;
  }

  Compare(simData, encData);
}

int testAliHLTAltroEncoder()
{
#ifdef __CINT__
  string ld_library_path="../.libs:";
  ld_library_path+=gSystem->GetDynamicPath();
  gSystem->SetDynamicPath(ld_library_path.c_str());
  gSystem->Load("libAliHLTRCU.so");
#endif
  AliHLTSystem gHLT;

  int nofChannels=GetRandom(1, maxChannels);
  if (nofChannels==0) nofChannels=1;
  TArrayI simData;
  TArrayC encData(maxEncodedDataSize);
  const int maxAltroDataSize=encData.GetSize()-sizeofAliRawDataHeader;
  int dataPos=0;

  AliHLTAltroEncoder encoder;
  encoder.SetBuffer((AliHLTUInt8_t*)encData.GetArray(), encData.GetSize());

  // set the common data header
  TArrayC dummyCdh(sizeofAliRawDataHeader);
  encoder.SetCDH((AliHLTUInt8_t*)dummyCdh.GetArray(), dummyCdh.GetSize());

  // set a trailer like in the real data format of the v1 RCU format (1 trailer word)
  Int_t trailer=0;
  encoder.SetRCUTrailer((AliHLTUInt8_t*)&trailer, 4);

  if (bVerbose) cout << "number of channels: " << nofChannels << endl;
  int channelAddress=-1;
  int lastChannel=-1;
  int nof10BitWords=0;
  // The nof10BitWords value is aligned to 4. In addition, one
  // 40bit word is needed for the channel trailer
  for (int channel=0; channel<nofChannels && (((nof10BitWords/4)+2)*5)<maxAltroDataSize; channel++) {
    channelAddress=GetRandom(0, 0xfff);
    if (channelAddress==lastChannel) continue;
    int nofBunches=GetRandom(1, maxBunches);
    if (nofBunches==0) continue;
    int totalBunches=0;
    int bunchEndTime=0;
    int lastBunchEndTime=0;
    
    if (bVerbose) cout << " ------------------ new channel -------------------------" << endl;
    int bunch=0;

    // Matthias Oct 2008:
    // Data was simulated in the wrong order: bunches for the higher timebins
    // first. But real data is the other way round: bunches are written in the order
    // of ascending timebins. A new consistency check was added to AliAltroDecoder
    // (AliAltroBunch) in revision 29090. Now the channels are checked for overlapping
    // bunches, the time of a bunch must be smaller than time of the previous one
    // minus its length.
    // Data is now simulated in the right order in order to fullfil this check.
    for (bunch=0; bunch<nofBunches && bunchEndTime<maxTimebin-3; bunch++) {
      while ((bunchEndTime+=GetRandom(0, maxTimebin-bunchEndTime))-lastBunchEndTime<3);
      int bunchLength=GetRandom(0, bunchEndTime-lastBunchEndTime);
      if (bunchLength==0) continue;
      // check if there is enough space for all the signals, end time
      // and bunch length. The value is aligned to 4. In addition, one
      // 40bit word is needed for the channel trailer
      if (((((nof10BitWords+bunchLength+2)/4)+2)*5)>=maxAltroDataSize) break;
      totalBunches++;

      if (bVerbose) cout << "       bunch " << bunch << ", length " << bunchLength << ", end time " << bunchEndTime << ":";

      if (simData.GetSize()<dataPos+bunchLength+2) simData.Set(dataPos+bunchLength+2);
      for (int time=bunchEndTime-bunchLength+1; time<=bunchEndTime; time++) {	
	int signal=GetRandom(0, maxSignal);
	simData[dataPos++]=signal;
	if (bVerbose) cout << " " << signal;
	int added=1;
	if (bUseAddChannelSignal) {
	  added=encoder.AddChannelSignal(signal, time, channelAddress);
	} else {
	  if (encoder.AddSignal(signal, time)<0) {
	    cout << "AddSignal failed" << endl;
	  }
	}
	lastChannel=channelAddress;
	if (added>0) nof10BitWords+=added;
      }
      if (bVerbose) cout << endl;
      simData[dataPos++]=bunchEndTime;
      simData[dataPos++]=bunchLength;
      lastBunchEndTime=bunchEndTime;
      bunchEndTime+=bunchLength;
    }
    if (simData.GetSize()<dataPos+2) simData.Set(dataPos+2);
    if (totalBunches>0) {
      simData[dataPos++]=totalBunches;
      simData[dataPos++]=channelAddress;
    }

    if (!bUseAddChannelSignal && lastChannel>=0) {
      encoder.SetChannel(lastChannel);
    }

    if (bVerbose) cout << " channel " << channelAddress << ":  number of bunches " << totalBunches << endl;

  }

  int dataSize=encoder.SetLength();
  if (dataSize<0) {
    cerr << "error finalizing encoded buffer" << endl;
    return -1;
  }
  int nof40bitWords=encoder.GetTotal40bitWords();
  encData.Set(dataSize);

  if (bVerbose) cout << "simulated data array:" << simData.GetSize() << " , ALTRO block length: " << nof40bitWords << " ALTRO words -> encoded data: " << encData.GetSize() << endl;

  /////////////////////////////////////////////////////////
  // some debugging options

  if (encDataDumpFile) DumpDataArray(&encData, encDataDumpFile, 1);

  simData.Set(dataPos);
  if (bVerbose) PrintSimulatedData(simData);

  /////////////////////////////////////////////////////////
  // read back end compare the encoded data

  if (simData.GetSize()>0 && Compare(simData, encData)<0) {
    // dump files for further debugging
    DumpDataArray(&encData, encodedDataFile, 1);
    DumpDataArray(&simData, simulatedDataFile, 4);
    return -1;
  } else {
    if (bVerbose) cout << "check successfully completed: " << nof40bitWords << " ALTRO words" << endl;
  }

  return 0;
}

int main(int /*argc*/, const char** /*argv*/)
{
//   CompareDumpFiles();
//   return 0;

  int iResult=0;
  int iCount=1000;
  for (int i=0; i<iCount; i++) {
    if ((iResult=testAliHLTAltroEncoder())<0) {
      cout << "missmatch in block no " << i << endl;
      return iResult;
    }
  }
  cout << "checking: " << iCount << " encoding cycle(s) successfully tested" << endl;
  return 0;
}
 testAliHLTAltroEncoder.C:1
 testAliHLTAltroEncoder.C:2
 testAliHLTAltroEncoder.C:3
 testAliHLTAltroEncoder.C:4
 testAliHLTAltroEncoder.C:5
 testAliHLTAltroEncoder.C:6
 testAliHLTAltroEncoder.C:7
 testAliHLTAltroEncoder.C:8
 testAliHLTAltroEncoder.C:9
 testAliHLTAltroEncoder.C:10
 testAliHLTAltroEncoder.C:11
 testAliHLTAltroEncoder.C:12
 testAliHLTAltroEncoder.C:13
 testAliHLTAltroEncoder.C:14
 testAliHLTAltroEncoder.C:15
 testAliHLTAltroEncoder.C:16
 testAliHLTAltroEncoder.C:17
 testAliHLTAltroEncoder.C:18
 testAliHLTAltroEncoder.C:19
 testAliHLTAltroEncoder.C:20
 testAliHLTAltroEncoder.C:21
 testAliHLTAltroEncoder.C:22
 testAliHLTAltroEncoder.C:23
 testAliHLTAltroEncoder.C:24
 testAliHLTAltroEncoder.C:25
 testAliHLTAltroEncoder.C:26
 testAliHLTAltroEncoder.C:27
 testAliHLTAltroEncoder.C:28
 testAliHLTAltroEncoder.C:29
 testAliHLTAltroEncoder.C:30
 testAliHLTAltroEncoder.C:31
 testAliHLTAltroEncoder.C:32
 testAliHLTAltroEncoder.C:33
 testAliHLTAltroEncoder.C:34
 testAliHLTAltroEncoder.C:35
 testAliHLTAltroEncoder.C:36
 testAliHLTAltroEncoder.C:37
 testAliHLTAltroEncoder.C:38
 testAliHLTAltroEncoder.C:39
 testAliHLTAltroEncoder.C:40
 testAliHLTAltroEncoder.C:41
 testAliHLTAltroEncoder.C:42
 testAliHLTAltroEncoder.C:43
 testAliHLTAltroEncoder.C:44
 testAliHLTAltroEncoder.C:45
 testAliHLTAltroEncoder.C:46
 testAliHLTAltroEncoder.C:47
 testAliHLTAltroEncoder.C:48
 testAliHLTAltroEncoder.C:49
 testAliHLTAltroEncoder.C:50
 testAliHLTAltroEncoder.C:51
 testAliHLTAltroEncoder.C:52
 testAliHLTAltroEncoder.C:53
 testAliHLTAltroEncoder.C:54
 testAliHLTAltroEncoder.C:55
 testAliHLTAltroEncoder.C:56
 testAliHLTAltroEncoder.C:57
 testAliHLTAltroEncoder.C:58
 testAliHLTAltroEncoder.C:59
 testAliHLTAltroEncoder.C:60
 testAliHLTAltroEncoder.C:61
 testAliHLTAltroEncoder.C:62
 testAliHLTAltroEncoder.C:63
 testAliHLTAltroEncoder.C:64
 testAliHLTAltroEncoder.C:65
 testAliHLTAltroEncoder.C:66
 testAliHLTAltroEncoder.C:67
 testAliHLTAltroEncoder.C:68
 testAliHLTAltroEncoder.C:69
 testAliHLTAltroEncoder.C:70
 testAliHLTAltroEncoder.C:71
 testAliHLTAltroEncoder.C:72
 testAliHLTAltroEncoder.C:73
 testAliHLTAltroEncoder.C:74
 testAliHLTAltroEncoder.C:75
 testAliHLTAltroEncoder.C:76
 testAliHLTAltroEncoder.C:77
 testAliHLTAltroEncoder.C:78
 testAliHLTAltroEncoder.C:79
 testAliHLTAltroEncoder.C:80
 testAliHLTAltroEncoder.C:81
 testAliHLTAltroEncoder.C:82
 testAliHLTAltroEncoder.C:83
 testAliHLTAltroEncoder.C:84
 testAliHLTAltroEncoder.C:85
 testAliHLTAltroEncoder.C:86
 testAliHLTAltroEncoder.C:87
 testAliHLTAltroEncoder.C:88
 testAliHLTAltroEncoder.C:89
 testAliHLTAltroEncoder.C:90
 testAliHLTAltroEncoder.C:91
 testAliHLTAltroEncoder.C:92
 testAliHLTAltroEncoder.C:93
 testAliHLTAltroEncoder.C:94
 testAliHLTAltroEncoder.C:95
 testAliHLTAltroEncoder.C:96
 testAliHLTAltroEncoder.C:97
 testAliHLTAltroEncoder.C:98
 testAliHLTAltroEncoder.C:99
 testAliHLTAltroEncoder.C:100
 testAliHLTAltroEncoder.C:101
 testAliHLTAltroEncoder.C:102
 testAliHLTAltroEncoder.C:103
 testAliHLTAltroEncoder.C:104
 testAliHLTAltroEncoder.C:105
 testAliHLTAltroEncoder.C:106
 testAliHLTAltroEncoder.C:107
 testAliHLTAltroEncoder.C:108
 testAliHLTAltroEncoder.C:109
 testAliHLTAltroEncoder.C:110
 testAliHLTAltroEncoder.C:111
 testAliHLTAltroEncoder.C:112
 testAliHLTAltroEncoder.C:113
 testAliHLTAltroEncoder.C:114
 testAliHLTAltroEncoder.C:115
 testAliHLTAltroEncoder.C:116
 testAliHLTAltroEncoder.C:117
 testAliHLTAltroEncoder.C:118
 testAliHLTAltroEncoder.C:119
 testAliHLTAltroEncoder.C:120
 testAliHLTAltroEncoder.C:121
 testAliHLTAltroEncoder.C:122
 testAliHLTAltroEncoder.C:123
 testAliHLTAltroEncoder.C:124
 testAliHLTAltroEncoder.C:125
 testAliHLTAltroEncoder.C:126
 testAliHLTAltroEncoder.C:127
 testAliHLTAltroEncoder.C:128
 testAliHLTAltroEncoder.C:129
 testAliHLTAltroEncoder.C:130
 testAliHLTAltroEncoder.C:131
 testAliHLTAltroEncoder.C:132
 testAliHLTAltroEncoder.C:133
 testAliHLTAltroEncoder.C:134
 testAliHLTAltroEncoder.C:135
 testAliHLTAltroEncoder.C:136
 testAliHLTAltroEncoder.C:137
 testAliHLTAltroEncoder.C:138
 testAliHLTAltroEncoder.C:139
 testAliHLTAltroEncoder.C:140
 testAliHLTAltroEncoder.C:141
 testAliHLTAltroEncoder.C:142
 testAliHLTAltroEncoder.C:143
 testAliHLTAltroEncoder.C:144
 testAliHLTAltroEncoder.C:145
 testAliHLTAltroEncoder.C:146
 testAliHLTAltroEncoder.C:147
 testAliHLTAltroEncoder.C:148
 testAliHLTAltroEncoder.C:149
 testAliHLTAltroEncoder.C:150
 testAliHLTAltroEncoder.C:151
 testAliHLTAltroEncoder.C:152
 testAliHLTAltroEncoder.C:153
 testAliHLTAltroEncoder.C:154
 testAliHLTAltroEncoder.C:155
 testAliHLTAltroEncoder.C:156
 testAliHLTAltroEncoder.C:157
 testAliHLTAltroEncoder.C:158
 testAliHLTAltroEncoder.C:159
 testAliHLTAltroEncoder.C:160
 testAliHLTAltroEncoder.C:161
 testAliHLTAltroEncoder.C:162
 testAliHLTAltroEncoder.C:163
 testAliHLTAltroEncoder.C:164
 testAliHLTAltroEncoder.C:165
 testAliHLTAltroEncoder.C:166
 testAliHLTAltroEncoder.C:167
 testAliHLTAltroEncoder.C:168
 testAliHLTAltroEncoder.C:169
 testAliHLTAltroEncoder.C:170
 testAliHLTAltroEncoder.C:171
 testAliHLTAltroEncoder.C:172
 testAliHLTAltroEncoder.C:173
 testAliHLTAltroEncoder.C:174
 testAliHLTAltroEncoder.C:175
 testAliHLTAltroEncoder.C:176
 testAliHLTAltroEncoder.C:177
 testAliHLTAltroEncoder.C:178
 testAliHLTAltroEncoder.C:179
 testAliHLTAltroEncoder.C:180
 testAliHLTAltroEncoder.C:181
 testAliHLTAltroEncoder.C:182
 testAliHLTAltroEncoder.C:183
 testAliHLTAltroEncoder.C:184
 testAliHLTAltroEncoder.C:185
 testAliHLTAltroEncoder.C:186
 testAliHLTAltroEncoder.C:187
 testAliHLTAltroEncoder.C:188
 testAliHLTAltroEncoder.C:189
 testAliHLTAltroEncoder.C:190
 testAliHLTAltroEncoder.C:191
 testAliHLTAltroEncoder.C:192
 testAliHLTAltroEncoder.C:193
 testAliHLTAltroEncoder.C:194
 testAliHLTAltroEncoder.C:195
 testAliHLTAltroEncoder.C:196
 testAliHLTAltroEncoder.C:197
 testAliHLTAltroEncoder.C:198
 testAliHLTAltroEncoder.C:199
 testAliHLTAltroEncoder.C:200
 testAliHLTAltroEncoder.C:201
 testAliHLTAltroEncoder.C:202
 testAliHLTAltroEncoder.C:203
 testAliHLTAltroEncoder.C:204
 testAliHLTAltroEncoder.C:205
 testAliHLTAltroEncoder.C:206
 testAliHLTAltroEncoder.C:207
 testAliHLTAltroEncoder.C:208
 testAliHLTAltroEncoder.C:209
 testAliHLTAltroEncoder.C:210
 testAliHLTAltroEncoder.C:211
 testAliHLTAltroEncoder.C:212
 testAliHLTAltroEncoder.C:213
 testAliHLTAltroEncoder.C:214
 testAliHLTAltroEncoder.C:215
 testAliHLTAltroEncoder.C:216
 testAliHLTAltroEncoder.C:217
 testAliHLTAltroEncoder.C:218
 testAliHLTAltroEncoder.C:219
 testAliHLTAltroEncoder.C:220
 testAliHLTAltroEncoder.C:221
 testAliHLTAltroEncoder.C:222
 testAliHLTAltroEncoder.C:223
 testAliHLTAltroEncoder.C:224
 testAliHLTAltroEncoder.C:225
 testAliHLTAltroEncoder.C:226
 testAliHLTAltroEncoder.C:227
 testAliHLTAltroEncoder.C:228
 testAliHLTAltroEncoder.C:229
 testAliHLTAltroEncoder.C:230
 testAliHLTAltroEncoder.C:231
 testAliHLTAltroEncoder.C:232
 testAliHLTAltroEncoder.C:233
 testAliHLTAltroEncoder.C:234
 testAliHLTAltroEncoder.C:235
 testAliHLTAltroEncoder.C:236
 testAliHLTAltroEncoder.C:237
 testAliHLTAltroEncoder.C:238
 testAliHLTAltroEncoder.C:239
 testAliHLTAltroEncoder.C:240
 testAliHLTAltroEncoder.C:241
 testAliHLTAltroEncoder.C:242
 testAliHLTAltroEncoder.C:243
 testAliHLTAltroEncoder.C:244
 testAliHLTAltroEncoder.C:245
 testAliHLTAltroEncoder.C:246
 testAliHLTAltroEncoder.C:247
 testAliHLTAltroEncoder.C:248
 testAliHLTAltroEncoder.C:249
 testAliHLTAltroEncoder.C:250
 testAliHLTAltroEncoder.C:251
 testAliHLTAltroEncoder.C:252
 testAliHLTAltroEncoder.C:253
 testAliHLTAltroEncoder.C:254
 testAliHLTAltroEncoder.C:255
 testAliHLTAltroEncoder.C:256
 testAliHLTAltroEncoder.C:257
 testAliHLTAltroEncoder.C:258
 testAliHLTAltroEncoder.C:259
 testAliHLTAltroEncoder.C:260
 testAliHLTAltroEncoder.C:261
 testAliHLTAltroEncoder.C:262
 testAliHLTAltroEncoder.C:263
 testAliHLTAltroEncoder.C:264
 testAliHLTAltroEncoder.C:265
 testAliHLTAltroEncoder.C:266
 testAliHLTAltroEncoder.C:267
 testAliHLTAltroEncoder.C:268
 testAliHLTAltroEncoder.C:269
 testAliHLTAltroEncoder.C:270
 testAliHLTAltroEncoder.C:271
 testAliHLTAltroEncoder.C:272
 testAliHLTAltroEncoder.C:273
 testAliHLTAltroEncoder.C:274
 testAliHLTAltroEncoder.C:275
 testAliHLTAltroEncoder.C:276
 testAliHLTAltroEncoder.C:277
 testAliHLTAltroEncoder.C:278
 testAliHLTAltroEncoder.C:279
 testAliHLTAltroEncoder.C:280
 testAliHLTAltroEncoder.C:281
 testAliHLTAltroEncoder.C:282
 testAliHLTAltroEncoder.C:283
 testAliHLTAltroEncoder.C:284
 testAliHLTAltroEncoder.C:285
 testAliHLTAltroEncoder.C:286
 testAliHLTAltroEncoder.C:287
 testAliHLTAltroEncoder.C:288
 testAliHLTAltroEncoder.C:289
 testAliHLTAltroEncoder.C:290
 testAliHLTAltroEncoder.C:291
 testAliHLTAltroEncoder.C:292
 testAliHLTAltroEncoder.C:293
 testAliHLTAltroEncoder.C:294
 testAliHLTAltroEncoder.C:295
 testAliHLTAltroEncoder.C:296
 testAliHLTAltroEncoder.C:297
 testAliHLTAltroEncoder.C:298
 testAliHLTAltroEncoder.C:299
 testAliHLTAltroEncoder.C:300
 testAliHLTAltroEncoder.C:301
 testAliHLTAltroEncoder.C:302
 testAliHLTAltroEncoder.C:303
 testAliHLTAltroEncoder.C:304
 testAliHLTAltroEncoder.C:305
 testAliHLTAltroEncoder.C:306
 testAliHLTAltroEncoder.C:307
 testAliHLTAltroEncoder.C:308
 testAliHLTAltroEncoder.C:309
 testAliHLTAltroEncoder.C:310
 testAliHLTAltroEncoder.C:311
 testAliHLTAltroEncoder.C:312
 testAliHLTAltroEncoder.C:313
 testAliHLTAltroEncoder.C:314
 testAliHLTAltroEncoder.C:315
 testAliHLTAltroEncoder.C:316
 testAliHLTAltroEncoder.C:317
 testAliHLTAltroEncoder.C:318
 testAliHLTAltroEncoder.C:319
 testAliHLTAltroEncoder.C:320
 testAliHLTAltroEncoder.C:321
 testAliHLTAltroEncoder.C:322
 testAliHLTAltroEncoder.C:323
 testAliHLTAltroEncoder.C:324
 testAliHLTAltroEncoder.C:325
 testAliHLTAltroEncoder.C:326
 testAliHLTAltroEncoder.C:327
 testAliHLTAltroEncoder.C:328
 testAliHLTAltroEncoder.C:329
 testAliHLTAltroEncoder.C:330
 testAliHLTAltroEncoder.C:331
 testAliHLTAltroEncoder.C:332
 testAliHLTAltroEncoder.C:333
 testAliHLTAltroEncoder.C:334
 testAliHLTAltroEncoder.C:335
 testAliHLTAltroEncoder.C:336
 testAliHLTAltroEncoder.C:337
 testAliHLTAltroEncoder.C:338
 testAliHLTAltroEncoder.C:339
 testAliHLTAltroEncoder.C:340
 testAliHLTAltroEncoder.C:341
 testAliHLTAltroEncoder.C:342
 testAliHLTAltroEncoder.C:343
 testAliHLTAltroEncoder.C:344
 testAliHLTAltroEncoder.C:345
 testAliHLTAltroEncoder.C:346
 testAliHLTAltroEncoder.C:347
 testAliHLTAltroEncoder.C:348
 testAliHLTAltroEncoder.C:349
 testAliHLTAltroEncoder.C:350
 testAliHLTAltroEncoder.C:351
 testAliHLTAltroEncoder.C:352
 testAliHLTAltroEncoder.C:353
 testAliHLTAltroEncoder.C:354
 testAliHLTAltroEncoder.C:355
 testAliHLTAltroEncoder.C:356
 testAliHLTAltroEncoder.C:357
 testAliHLTAltroEncoder.C:358
 testAliHLTAltroEncoder.C:359
 testAliHLTAltroEncoder.C:360
 testAliHLTAltroEncoder.C:361
 testAliHLTAltroEncoder.C:362
 testAliHLTAltroEncoder.C:363
 testAliHLTAltroEncoder.C:364
 testAliHLTAltroEncoder.C:365
 testAliHLTAltroEncoder.C:366
 testAliHLTAltroEncoder.C:367
 testAliHLTAltroEncoder.C:368
 testAliHLTAltroEncoder.C:369
 testAliHLTAltroEncoder.C:370
 testAliHLTAltroEncoder.C:371
 testAliHLTAltroEncoder.C:372
 testAliHLTAltroEncoder.C:373
 testAliHLTAltroEncoder.C:374
 testAliHLTAltroEncoder.C:375
 testAliHLTAltroEncoder.C:376
 testAliHLTAltroEncoder.C:377
 testAliHLTAltroEncoder.C:378
 testAliHLTAltroEncoder.C:379
 testAliHLTAltroEncoder.C:380
 testAliHLTAltroEncoder.C:381
 testAliHLTAltroEncoder.C:382
 testAliHLTAltroEncoder.C:383
 testAliHLTAltroEncoder.C:384
 testAliHLTAltroEncoder.C:385
 testAliHLTAltroEncoder.C:386
 testAliHLTAltroEncoder.C:387
 testAliHLTAltroEncoder.C:388
 testAliHLTAltroEncoder.C:389
 testAliHLTAltroEncoder.C:390
 testAliHLTAltroEncoder.C:391
 testAliHLTAltroEncoder.C:392
 testAliHLTAltroEncoder.C:393
 testAliHLTAltroEncoder.C:394
 testAliHLTAltroEncoder.C:395
 testAliHLTAltroEncoder.C:396
 testAliHLTAltroEncoder.C:397
 testAliHLTAltroEncoder.C:398
 testAliHLTAltroEncoder.C:399
 testAliHLTAltroEncoder.C:400
 testAliHLTAltroEncoder.C:401
 testAliHLTAltroEncoder.C:402
 testAliHLTAltroEncoder.C:403
 testAliHLTAltroEncoder.C:404
 testAliHLTAltroEncoder.C:405
 testAliHLTAltroEncoder.C:406
 testAliHLTAltroEncoder.C:407
 testAliHLTAltroEncoder.C:408
 testAliHLTAltroEncoder.C:409
 testAliHLTAltroEncoder.C:410
 testAliHLTAltroEncoder.C:411
 testAliHLTAltroEncoder.C:412
 testAliHLTAltroEncoder.C:413
 testAliHLTAltroEncoder.C:414
 testAliHLTAltroEncoder.C:415
 testAliHLTAltroEncoder.C:416
 testAliHLTAltroEncoder.C:417
 testAliHLTAltroEncoder.C:418
 testAliHLTAltroEncoder.C:419
 testAliHLTAltroEncoder.C:420
 testAliHLTAltroEncoder.C:421
 testAliHLTAltroEncoder.C:422
 testAliHLTAltroEncoder.C:423
 testAliHLTAltroEncoder.C:424
 testAliHLTAltroEncoder.C:425
 testAliHLTAltroEncoder.C:426
 testAliHLTAltroEncoder.C:427
 testAliHLTAltroEncoder.C:428
 testAliHLTAltroEncoder.C:429
 testAliHLTAltroEncoder.C:430
 testAliHLTAltroEncoder.C:431
 testAliHLTAltroEncoder.C:432
 testAliHLTAltroEncoder.C:433