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   testAliRawReader.C
    @author Matthias Richter
    @date   
    @brief  Test macro/program for the AliRawReaderMemory
 */

#ifndef __CINT__
#include "TFile.h"
#include "TDatime.h"
#include "TRandom.h"
#include "TArrayI.h"
#include "TArrayC.h"
#include "TSystem.h"
#include "AliRawDataHeader.h"
#include "AliRawReaderFile.h"
#include "AliRawReaderMemory.h"
#include "AliRawHLTManager.h"
#include "AliDAQ.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
//
const char* tmpdir="/tmp/testAliRawReaderMemory";
bool gbVerbose=false;

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
int GetRandom(int min, int max);
int FillRandomDDL(TArrayC& target);
int WriteDDL(TArrayC& ddl, int ddlid);
int CheckRawReader(AliRawReader* pRawReader, TArrayC* ddls, int* ddlids, int nofDDLs);
int CheckRawReaderMemory(TArrayC* ddlArray, int* ddlidArray, int nofDDLs);
int CheckRawReaderHLT(AliRawReader* pParent, TArrayC* ddls, int* ddlids, int nofDDLs);
int CheckDDL_ReadNext(AliRawReader* pRawReader, TArrayC& ddl, int ddlid);
int CheckDDL_ReadNextData(AliRawReader* pRawReader, TArrayC& ddl, int ddlid);
int CheckDDL_ReadNextChar(AliRawReader* pRawReader, TArrayC& ddl, int ddlid);
int CheckDDL_ReadMixed(AliRawReader* pRawReader, TArrayC& ddl, int ddlid);

int testAliRawReaderFile()
{
  int iResult=0;

  // cleanup old raw folders
  TString command;
  command.Form("rm -r %s 2> /dev/null", tmpdir);
  gSystem->Exec(command);
  gSystem->mkdir(tmpdir);

  // variable number of DDLs
  int nofDDLs=0;
  do {
    nofDDLs=GetRandom(2,10);
  } while (nofDDLs<2);

  // allocate buffers
  TArrayC* ddlArray=new TArrayC[nofDDLs];
  int* ddlidArray=new int[nofDDLs];

  // create DDL ids and content
  int i=0;
  do {
    int detectorId=GetRandom(0,5);
    ddlidArray[i]=GetRandom(0,AliDAQ::NumberOfDdls(detectorId)-1)+AliDAQ::DdlIDOffset(detectorId);
    
    // check for duplicate id
    int j=0;
    for (; j<i; j++)
      if (ddlidArray[i]==ddlidArray[j]) break;
    
    if (j!=i) continue; // try once again

    FillRandomDDL(ddlArray[i]);
    if (gbVerbose) cout << "simulating data for ddl " << ddlidArray[i] << " size " << ddlArray[i].GetSize() << endl;
    WriteDDL(ddlArray[i], ddlidArray[i]);
  } while (++i<nofDDLs);

  if (gbVerbose) cout << "checking AliRawReaderFile ..." << endl;
  TString rawdir=tmpdir;
  if (!rawdir.EndsWith("/")) rawdir+="/";
  AliRawReader* pRawReader=AliRawReader::Create(rawdir);
  if (!pRawReader) {
    cerr << "can not create RawReaderFile" << endl;
    return -1;
  }

  if (!pRawReader->NextEvent()) {
    cerr << "error: getting event from RawReaderFile failed" << endl;
    return -1;
  }

  if ((iResult=CheckRawReader(pRawReader, ddlArray, ddlidArray, nofDDLs))<0) {
    return iResult;
  }

  /////////////////////////////////////////////////////////////////////////////////////////
  // check AliRawReaderMemory
  if ((iResult=CheckRawReaderMemory(ddlArray, ddlidArray, nofDDLs))<0) {
    return iResult;
  }

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

  // Matthias 2009-01-24
  // disable check of RawReaderHLT for the moment due to problems with loeding libHLTrec
  // from AliRAWHLTManager
//   if ((iResult=CheckRawReaderHLT(pRawReader, ddlArray, ddlidArray, nofDDLs))<0) {
//     return iResult;
//   }

  delete pRawReader;

  gSystem->Exec(command);
  return 0;
}

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);
}

/**
 * Fill the array with random DDL data.
 * The function leaves space for the CDH, sets the size member of the
 * CDH either to the buffer size or 0xffffffff by a random decision.
 */
int FillRandomDDL(TArrayC& target)
{
  int size=0;
  do size=GetRandom(100, 10000);
  while (size<100);

  target.Set(size);

  // decide randomly whether to set size of 0xffffffff
  if (GetRandom(0,40)%4) {
    *((Int_t*)target.GetArray())=size;
  } else {
    *((UInt_t*)target.GetArray())=0xffffffff;    
  }
  for (int i=sizeofAliRawDataHeader; i<size; i++) {
    Int_t data=GetRandom(0,255);
    target.AddAt((UChar_t)data, i);
  }
  return size;
}

/**
 * Write the simulated DDL data to file
 * Creates the filename from the DDL naming convention using the
 * AliDAQ conventions. The file is written to folder tmpdir/raw0
 * whereas tmpdir can be adjusted above. 
 */
int WriteDDL(TArrayC& ddl, int ddlid)
{
  Int_t dummy=0;
  TString filename;
  filename.Form("%s/raw0", tmpdir);
  gSystem->mkdir(filename);
  filename.Form("%s/%s_%d.ddl", filename.Data(), AliDAQ::DetectorNameFromDdlID(ddlid, dummy), ddlid);
  FILE* fp=fopen(filename.Data(), "w");
  if (!fp) return -1;

  fwrite(ddl.GetArray(), 1, ddl.GetSize(), fp);
  fclose(fp);

  return 0;
}

/**
 * Check the AliRawReaderMemory
 *
 * Check consists of 3 steps:
 * - check with one ddl per cycle: SetMemory/SetEquipmentID method
 * - check with multiple buffers: AddBuffer method
 * - check with one ddl as constructor parameter and AddBuffer for the
 *   subsequent ddls
 *
 * @return -1 if check failed
 */
int CheckRawReaderMemory(TArrayC* ddlArray, int* ddlidArray, int nofDDLs)
{
  int iResult=0;
  int i=0;
  /////////////////////////////////////////////////////////////////////////////////////////
  if (gbVerbose) cout << "checking AliRawReaderMemory ..." << endl;
  AliRawReaderMemory* pRawReaderMemory=new AliRawReaderMemory;
  for (i=0; i<nofDDLs; i++) {
    if (!pRawReaderMemory->SetMemory((UChar_t*)ddlArray[i].GetArray(), ddlArray[i].GetSize())) {
      cerr << "AliRawReaderMemory::SetMemory failed for block " << i << endl;
      return -1;
    }
    pRawReaderMemory->SetEquipmentID(ddlidArray[i]);
    if (i==0 && !pRawReaderMemory->NextEvent()) {
      cerr << "error: getting event from RawReaderMemory failed" << endl;
      return -1;
    }

    if ((iResult=CheckRawReader(pRawReaderMemory, ddlArray+i, ddlidArray+i, 1))<0) {
      return iResult;
    }
  }
  if (pRawReaderMemory->NextEvent()) {
    cerr << "error: RawReaderMemory::NextEvent returns true, while no more events should be there" << endl;
    return -1;
  }

  /////////////////////////////////////////////////////////////////////////////////////////
  if (gbVerbose) cout << "checking AliRawReaderMemory with multiple buffers ..." << endl;
  pRawReaderMemory->RewindEvents();
  pRawReaderMemory->ClearBuffers();
  for (i=0; i<nofDDLs; i++) {
    if (!pRawReaderMemory->AddBuffer((UChar_t*)ddlArray[i].GetArray(), ddlArray[i].GetSize(), ddlidArray[i])) {
      cerr << "AliRawReaderMemory::AddBuffer failed for block " << i << endl;
      return -1;
    }
  }
  if (!pRawReaderMemory->NextEvent()) {
    cerr << "error: getting event from RawReaderMemory failed" << endl;
    return -1;
  }

  if ((iResult=CheckRawReader(pRawReaderMemory, ddlArray, ddlidArray, nofDDLs))<0) {
    return iResult;
  }
  
  if (pRawReaderMemory->NextEvent()) {
    cerr << "error: RawReaderMemory::NextEvent returns true, while no more events should be there" << endl;
    return -1;
  }
  delete pRawReaderMemory;
  pRawReaderMemory=NULL;

  /////////////////////////////////////////////////////////////////////////////////////////
  if (gbVerbose) cout << "checking AliRawReaderMemory constructor ..." << endl;
  for (i=0; i<nofDDLs; i++) {
    if (!pRawReaderMemory) {
      pRawReaderMemory=new AliRawReaderMemory((UChar_t*)ddlArray[i].GetArray(), ddlArray[i].GetSize());
      if (pRawReaderMemory) {
	pRawReaderMemory->SetEquipmentID(ddlidArray[i]);
      } else {
	cerr << "can not create AliRawReaderMemory with parameters" << endl;
	return -1;
      }
    }else if (!pRawReaderMemory->AddBuffer((UChar_t*)ddlArray[i].GetArray(), ddlArray[i].GetSize(), ddlidArray[i])) {
      cerr << "AliRawReaderMemory::AddBuffer failed for block " << i << endl;
      return -1;
    }
  }
  if (!pRawReaderMemory->NextEvent()) {
    cerr << "error: getting event from RawReaderMemory failed" << endl;
    return -1;
  }

  if ((iResult=CheckRawReader(pRawReaderMemory, ddlArray, ddlidArray, nofDDLs))<0) {
    return iResult;
  }
  
  if (pRawReaderMemory->NextEvent()) {
    cerr << "error: RawReaderMemory::NextEvent returns true, while no more events should be there" << endl;
    return -1;
  }

  delete pRawReaderMemory;
  pRawReaderMemory=NULL;

  return iResult;
}

/**
 * Check the AliRawReaderHLT
 *
 * Open the AliRawReaderHLT from the parent reader without any HLTOUT
 * options, i.e. all requests are just forwarded.
 *
 * @return -1 if check failed
 */
int CheckRawReaderHLT(AliRawReader* pParent, TArrayC* ddls, int* ddlids, int nofDDLs)
{
  if (gbVerbose) cout << "checking AliRawReaderHLT ..." << endl;

  int iResult=0;
  pParent->RewindEvents();
  pParent->Reset();
  TString arg;
//   Int_t dummy=0;
//   for (i=0; i<nofDDLs; i++) {
//     if (!arg.Contains(AliDAQ::DetectorNameFromDdlID(ddlidArray[i], dummy))) {
//       arg+=" "; arg+=AliDAQ::DetectorNameFromDdlID(ddlidArray[i], dummy);
//     }
//   }

  AliRawReader* pRawReaderHLT=AliRawHLTManager::CreateRawReaderHLT(pParent, arg.Data());
  if (!pRawReaderHLT) {
    cerr << "can not create HLT RawReader" << endl;
    return -1;
  }

  if (!pRawReaderHLT->NextEvent()) {
    cerr << "error: getting event from HLT RawReader failed" << endl;
    return -1;
  }

  if ((iResult=CheckRawReader(pRawReaderHLT, ddls, ddlids, nofDDLs))<0) {
    return iResult;
  }

  delete pRawReaderHLT;
  return iResult;
}

/**
 * Check a RawReader, compare with the corresponding simulated data.
 * The corresponding simulated data is searched from the array via the current
 * equipment id. The check consists of 4 steps:
 * - data comparison by ReadNext
 * - data comparison by ReadNextData
 * - data comparison by ReadNextChar
 * - data comparison by mixed reading: ReadNextInt/Short/Char/Data
 * 
 * @return -1 if failed
 */
int CheckRawReader(AliRawReader* pRawReader, TArrayC* ddls, int* ddlids, int nofDDLs)
{
  int iResult=0;
  int count=0;
  // 1st pass: check AliRawReader::ReadNext()
  while (pRawReader->ReadHeader()) {
    int id=pRawReader->GetEquipmentId();
    int i=0;
    for (i=0; i<nofDDLs; i++) {
      if (ddlids[i]==id) break;
    }
    if (i==nofDDLs) {
      cerr << "error: can not find ddl id " << id << endl;
      return -1;
    }

    if ((iResult=CheckDDL_ReadNext(pRawReader, ddls[i], ddlids[i]))<0) return iResult;
    count++;
  }
  if (count<nofDDLs) {
    cerr << "less than the available blocks found from RawReader" << endl;
    return -1;
  }
  
  // 2nd pass: check AliRawReader::ReadNextData()
  count=0;
  pRawReader->Reset();
  while (pRawReader->ReadHeader()) {
    int id=pRawReader->GetEquipmentId();
    int i=0;
    for (i=0; i<nofDDLs; i++) {
      if (ddlids[i]==id) break;
    }
    if (i==nofDDLs) {
      cerr << "error: can not find ddl id " << id << endl;
      return -1;
    }

    if ((iResult=CheckDDL_ReadNextData(pRawReader, ddls[i], ddlids[i]))<0) return iResult;
    count++;
  }
  if (count<nofDDLs) {
    cerr << "less than the available blocks found from RawReader" << endl;
    return -1;
  }

  // 3rd pass: check AliRawReader::ReadNextData()
  count=0;
  pRawReader->Reset();
  while (pRawReader->ReadHeader()) {
    int i=0;
    do {
      int id=pRawReader->GetEquipmentId();
      for (i=0; i<nofDDLs; i++) {
	if (ddlids[i]==id) break;
      }
      if (i==nofDDLs) {
	cerr << "error: can not find ddl id " << id << endl;
	return -1;
      }
      count++;

      if ((iResult=CheckDDL_ReadNextChar(pRawReader, ddls[i], ddlids[i]))<0) return iResult;
    }
    // note: the ReadHeader is hidden in the ReadNextChar
    while (iResult!=ddlids[i]);
  }
  if (count<nofDDLs) {
    cerr << "less than the available blocks found from RawReader" << endl;
    return -1;
  }

  // 4th pass: check mixed AliRawReader::ReadNext*()
  count=0;
  pRawReader->Reset();
  while (pRawReader->ReadHeader()) {
    int id=pRawReader->GetEquipmentId();
    int i=0;
    for (i=0; i<nofDDLs; i++) {
      if (ddlids[i]==id) break;
    }
    if (i==nofDDLs) {
      cerr << "error: can not find ddl id " << id << endl;
      return -1;
    }

    if ((iResult=CheckDDL_ReadMixed(pRawReader, ddls[i], ddlids[i]))<0) return iResult;
    count++;
  }
  if (count<nofDDLs) {
    cerr << "less than the available blocks found from RawReader" << endl;
    return -1;
  }

  return iResult;
}

/**
 * Check RawReaders ReadNext function and compare data with simulated data
 * of the provided buffer.
 */
int CheckDDL_ReadNext(AliRawReader* pRawReader, TArrayC& ddl, int ddlid)
{
  int dataSize=pRawReader->GetDataSize();
  if (ddl.GetSize()!=dataSize+sizeofAliRawDataHeader) {
    cerr << "error: size mismatch in ddl " << ddlid << ": " << dataSize+sizeofAliRawDataHeader << " required " << ddl.GetSize() << endl;
    return -1;
  }
  TArrayC buffer(dataSize);
  UChar_t* pTgt=(UChar_t*)buffer.GetArray();
  
  if (!pRawReader->ReadNext(pTgt, buffer.GetSize())) {
    cerr << "error: reading " << buffer.GetSize() << " byte(s) from ReadNext (ddl " << ddlid << ")" << endl;
    return -1;
  }

  if (ddlid!=pRawReader->GetEquipmentId()) {
    cerr << "error: ReadMixed ddl id missmatch after ReadNext: reqired id " << ddlid << " got " << pRawReader->GetEquipmentId() << endl;
    return -1;
  }

  TString sizeStr;
  if (*((UInt_t*)ddl.GetArray())==0xffffffff) {
    sizeStr=" (0xffffffff)";
  } else {
    sizeStr.Form(" (%d)", ddl.GetSize());
  }
  if (gbVerbose) cout << "verify ReadNext: ddl " << ddlid << sizeStr << endl;
  if (memcmp(ddl.GetArray()+sizeofAliRawDataHeader, buffer.GetArray(), buffer.GetSize())!=0) {
    cerr << "error: verification of ddl " << ddlid << ")" << endl;
    return -1;
  }
  return 0;
}

/**
 * Check RawReaders ReadNextData function and compare data with simulated data
 * of the provided buffer.
 */
int CheckDDL_ReadNextData(AliRawReader* pRawReader, TArrayC& ddl, int ddlid)
{
  int dataSize=pRawReader->GetDataSize();
  if (ddl.GetSize()!=dataSize+sizeofAliRawDataHeader) {
    cerr << "error: size mismatch in ddl " << ddlid << ": " << dataSize+sizeofAliRawDataHeader << " required " << ddl.GetSize() << endl;
    return -1;
  }

  UChar_t* pTgt=NULL;  
  if (!pRawReader->ReadNextData(pTgt) || pTgt==NULL) {
    cerr << "error: reading " << dataSize << " byte(s) from ReadNextData (ddl " << ddlid << ")" << endl;
    return -1;
  }

  if (gbVerbose) cout << "verify ReadNextData: ddl " << ddlid << endl;
  if (memcmp(ddl.GetArray()+sizeofAliRawDataHeader, pTgt, dataSize)!=0) {
    cerr << "error: verification of ddl " << ddlid << endl;
    return -1;
  }
  return 0;
}

/**
 * Check RawReaders ReadNextChar function and compare data with simulated data
 * of the provided buffer.
 */
int CheckDDL_ReadNextChar(AliRawReader* pRawReader, TArrayC& ddl, int ddlid)
{
  int iResult=ddlid;
  int dataSize=pRawReader->GetDataSize();
  if (ddl.GetSize()!=dataSize+sizeofAliRawDataHeader) {
    cerr << "error: size mismatch in ddl " << ddlid << ": " << dataSize+sizeofAliRawDataHeader << " required " << ddl.GetSize() << endl;
    return -1;
  }

  if (gbVerbose) cout << "verify ReadNextChar: ddl " << ddlid << endl;
  static int offset=0;
  int i=sizeofAliRawDataHeader+offset;
  UChar_t data=0;
  Bool_t haveData=kFALSE;
  for (; (haveData=pRawReader->ReadNextChar(data)) && i<ddl.GetSize(); i++) {
    if (data!=(UChar_t)ddl.At(i)) {
      cerr << "error: at position " << i << " of ddl " << ddlid << ": read " << (UShort_t)data << " required " << (UShort_t)(UChar_t)ddl.At(i) << endl;
      return -1;
    }
  }

  if (i<ddl.GetSize()) {
    cerr << "error: reading data of ddl " << ddlid << ": " << i << " of " << ddl.GetSize() << endl;
    return -1;
  }
  if (pRawReader->GetEquipmentId()>=0 && ddlid!=pRawReader->GetEquipmentId()) {
    //cerr << "error: ddl id missmatch, expecting " << ddlid << " got " << pRawReader->GetEquipmentId() << endl;
    // thats not an error condition, RawReader just changes silently to the next DDL
    iResult=pRawReader->GetEquipmentId();
    offset=1;
  } else {
    offset=0;
  }
  if (haveData && iResult==ddlid) {
    cerr << "error: size missmatch in ddl " << ddlid << ": still data available after " << ddl.GetSize() << " byte(s)"<< endl;
    return -1;
  }
  return iResult;
}

/**
 * Check RawReaders ReadNextInt/Short/Char/Data functions and compare data with
 * simulated data of the provided buffer.
 */
int CheckDDL_ReadMixed(AliRawReader* pRawReader, TArrayC& ddl, int ddlid)
{
  int dataSize=pRawReader->GetDataSize();
  if (ddl.GetSize()!=dataSize+sizeofAliRawDataHeader) {
    cerr << "error: size mismatch in ddl " << ddlid << ": " << dataSize+sizeofAliRawDataHeader << " required " << ddl.GetSize() << endl;
    return -1;
  }

  TArrayC readBytes(7);

  // we do not need to test if there is only one byte
  if (dataSize<=readBytes.GetSize()) return 0;

  UInt_t i=0;
  for (; i<(readBytes.GetSize()/sizeof(UInt_t))*sizeof(UInt_t); i+=sizeof(UInt_t)) {
    UInt_t data=0;
    if (!pRawReader->ReadNextInt(data)) {
      cerr << "error: reading 1 int from ReadNextInt position " << i << " (ddl " << ddlid << ")" << endl;
      return -1;
    }
#ifndef R__BYTESWAP
   data = (((data & 0x000000ffU) << 24) | ((data & 0x0000ff00U) <<  8) |
           ((data & 0x00ff0000U) >>  8) | ((data & 0xff000000U) >> 24));
#endif
   *(reinterpret_cast<UInt_t*>(readBytes.GetArray()+i))=data;
  }
  for (; i<(readBytes.GetSize()/sizeof(UShort_t))*sizeof(UShort_t); i+=sizeof(UShort_t)) {
    UShort_t data=0;
    if (!pRawReader->ReadNextShort(data)) {
      cerr << "error: reading 1 short from ReadNextShort position " << i << " (ddl " << ddlid << ")" << endl;
      return -1;
    }
#ifndef R__BYTESWAP
    data = (((data & 0x00ffU) <<  8) | ((data & 0xff00U) >>  8)) ;
#endif
    *(reinterpret_cast<UShort_t*>(readBytes.GetArray()+i))=data;
  }
  for (; i<(UInt_t)readBytes.GetSize(); i++) {
    if (!pRawReader->ReadNextChar(*(reinterpret_cast<UChar_t*>(readBytes.GetArray()+i)))) {
      cerr << "error: reading 1 byte from ReadNextChar position " << i << " (ddl " << ddlid << ")" << endl;
      return -1;
    }
  }
  UChar_t* pTgt=NULL;
  // TODO: here we have a problem with the HLT Raw Reader, due to the
  // behavior of ReadNextData. It returns the pointer to either
  // - the remaining data within this block. Thogh, GetDataSize still
  //   returns the full lenght
  // - if no more data available switch to next equipment
  // Currently, the RawReaderHLT switches immediately to the next
  // equipment, considered the GetDataSize behavior this is correct, but
  // different from the others
  // 
  // Use ReadNext for the moment in order to get the test scheme working.
  //if (!pRawReader->ReadNextData(pTgt) || pTgt==NULL) {
  TArrayC buffer(dataSize-readBytes.GetSize());
  pTgt=(UChar_t*)buffer.GetArray();
  if (!pRawReader->ReadNext(pTgt, buffer.GetSize())) {
    cerr << "error: reading " << dataSize << " byte(s) from ReadNextData (ddl " << ddlid << ")" << endl;
    return -1;
  }
  if (ddlid!=pRawReader->GetEquipmentId()) {
    cerr << "error: ReadMixed ddl id missmatch after ReadNextData: reqired id " << ddlid << " got " << pRawReader->GetEquipmentId() << endl;
    return -1;
  }

  if (gbVerbose) cout << "verify ReadNextInt/Short/Char/Data: ddl " << ddlid << endl;
  if (memcmp((ddl.GetArray())+sizeofAliRawDataHeader, readBytes.GetArray(), readBytes.GetSize())!=0) {
    cerr << "error: verification of mixed ReadNextInt/Short/Char failed in ddl " << ddlid << endl;
    return -1;
  }
  if (memcmp((ddl.GetArray())+readBytes.GetSize()+sizeofAliRawDataHeader, pTgt, dataSize-readBytes.GetSize())!=0) {
    cerr << "error: verification of mixed ReadNext ddl " << ddlid << endl;
    return -1;
  }
  return 0;
}

int main(int /*argc*/, const char** /*argv*/)
{
  int iResult=testAliRawReaderFile();
  if (iResult<0) {
    cerr << "check failed, repeat in verbose mode ..." << endl;
    gbVerbose=true;
    iResult=testAliRawReaderFile();
  }
  return iResult;
}
 testAliRawReader.C:1
 testAliRawReader.C:2
 testAliRawReader.C:3
 testAliRawReader.C:4
 testAliRawReader.C:5
 testAliRawReader.C:6
 testAliRawReader.C:7
 testAliRawReader.C:8
 testAliRawReader.C:9
 testAliRawReader.C:10
 testAliRawReader.C:11
 testAliRawReader.C:12
 testAliRawReader.C:13
 testAliRawReader.C:14
 testAliRawReader.C:15
 testAliRawReader.C:16
 testAliRawReader.C:17
 testAliRawReader.C:18
 testAliRawReader.C:19
 testAliRawReader.C:20
 testAliRawReader.C:21
 testAliRawReader.C:22
 testAliRawReader.C:23
 testAliRawReader.C:24
 testAliRawReader.C:25
 testAliRawReader.C:26
 testAliRawReader.C:27
 testAliRawReader.C:28
 testAliRawReader.C:29
 testAliRawReader.C:30
 testAliRawReader.C:31
 testAliRawReader.C:32
 testAliRawReader.C:33
 testAliRawReader.C:34
 testAliRawReader.C:35
 testAliRawReader.C:36
 testAliRawReader.C:37
 testAliRawReader.C:38
 testAliRawReader.C:39
 testAliRawReader.C:40
 testAliRawReader.C:41
 testAliRawReader.C:42
 testAliRawReader.C:43
 testAliRawReader.C:44
 testAliRawReader.C:45
 testAliRawReader.C:46
 testAliRawReader.C:47
 testAliRawReader.C:48
 testAliRawReader.C:49
 testAliRawReader.C:50
 testAliRawReader.C:51
 testAliRawReader.C:52
 testAliRawReader.C:53
 testAliRawReader.C:54
 testAliRawReader.C:55
 testAliRawReader.C:56
 testAliRawReader.C:57
 testAliRawReader.C:58
 testAliRawReader.C:59
 testAliRawReader.C:60
 testAliRawReader.C:61
 testAliRawReader.C:62
 testAliRawReader.C:63
 testAliRawReader.C:64
 testAliRawReader.C:65
 testAliRawReader.C:66
 testAliRawReader.C:67
 testAliRawReader.C:68
 testAliRawReader.C:69
 testAliRawReader.C:70
 testAliRawReader.C:71
 testAliRawReader.C:72
 testAliRawReader.C:73
 testAliRawReader.C:74
 testAliRawReader.C:75
 testAliRawReader.C:76
 testAliRawReader.C:77
 testAliRawReader.C:78
 testAliRawReader.C:79
 testAliRawReader.C:80
 testAliRawReader.C:81
 testAliRawReader.C:82
 testAliRawReader.C:83
 testAliRawReader.C:84
 testAliRawReader.C:85
 testAliRawReader.C:86
 testAliRawReader.C:87
 testAliRawReader.C:88
 testAliRawReader.C:89
 testAliRawReader.C:90
 testAliRawReader.C:91
 testAliRawReader.C:92
 testAliRawReader.C:93
 testAliRawReader.C:94
 testAliRawReader.C:95
 testAliRawReader.C:96
 testAliRawReader.C:97
 testAliRawReader.C:98
 testAliRawReader.C:99
 testAliRawReader.C:100
 testAliRawReader.C:101
 testAliRawReader.C:102
 testAliRawReader.C:103
 testAliRawReader.C:104
 testAliRawReader.C:105
 testAliRawReader.C:106
 testAliRawReader.C:107
 testAliRawReader.C:108
 testAliRawReader.C:109
 testAliRawReader.C:110
 testAliRawReader.C:111
 testAliRawReader.C:112
 testAliRawReader.C:113
 testAliRawReader.C:114
 testAliRawReader.C:115
 testAliRawReader.C:116
 testAliRawReader.C:117
 testAliRawReader.C:118
 testAliRawReader.C:119
 testAliRawReader.C:120
 testAliRawReader.C:121
 testAliRawReader.C:122
 testAliRawReader.C:123
 testAliRawReader.C:124
 testAliRawReader.C:125
 testAliRawReader.C:126
 testAliRawReader.C:127
 testAliRawReader.C:128
 testAliRawReader.C:129
 testAliRawReader.C:130
 testAliRawReader.C:131
 testAliRawReader.C:132
 testAliRawReader.C:133
 testAliRawReader.C:134
 testAliRawReader.C:135
 testAliRawReader.C:136
 testAliRawReader.C:137
 testAliRawReader.C:138
 testAliRawReader.C:139
 testAliRawReader.C:140
 testAliRawReader.C:141
 testAliRawReader.C:142
 testAliRawReader.C:143
 testAliRawReader.C:144
 testAliRawReader.C:145
 testAliRawReader.C:146
 testAliRawReader.C:147
 testAliRawReader.C:148
 testAliRawReader.C:149
 testAliRawReader.C:150
 testAliRawReader.C:151
 testAliRawReader.C:152
 testAliRawReader.C:153
 testAliRawReader.C:154
 testAliRawReader.C:155
 testAliRawReader.C:156
 testAliRawReader.C:157
 testAliRawReader.C:158
 testAliRawReader.C:159
 testAliRawReader.C:160
 testAliRawReader.C:161
 testAliRawReader.C:162
 testAliRawReader.C:163
 testAliRawReader.C:164
 testAliRawReader.C:165
 testAliRawReader.C:166
 testAliRawReader.C:167
 testAliRawReader.C:168
 testAliRawReader.C:169
 testAliRawReader.C:170
 testAliRawReader.C:171
 testAliRawReader.C:172
 testAliRawReader.C:173
 testAliRawReader.C:174
 testAliRawReader.C:175
 testAliRawReader.C:176
 testAliRawReader.C:177
 testAliRawReader.C:178
 testAliRawReader.C:179
 testAliRawReader.C:180
 testAliRawReader.C:181
 testAliRawReader.C:182
 testAliRawReader.C:183
 testAliRawReader.C:184
 testAliRawReader.C:185
 testAliRawReader.C:186
 testAliRawReader.C:187
 testAliRawReader.C:188
 testAliRawReader.C:189
 testAliRawReader.C:190
 testAliRawReader.C:191
 testAliRawReader.C:192
 testAliRawReader.C:193
 testAliRawReader.C:194
 testAliRawReader.C:195
 testAliRawReader.C:196
 testAliRawReader.C:197
 testAliRawReader.C:198
 testAliRawReader.C:199
 testAliRawReader.C:200
 testAliRawReader.C:201
 testAliRawReader.C:202
 testAliRawReader.C:203
 testAliRawReader.C:204
 testAliRawReader.C:205
 testAliRawReader.C:206
 testAliRawReader.C:207
 testAliRawReader.C:208
 testAliRawReader.C:209
 testAliRawReader.C:210
 testAliRawReader.C:211
 testAliRawReader.C:212
 testAliRawReader.C:213
 testAliRawReader.C:214
 testAliRawReader.C:215
 testAliRawReader.C:216
 testAliRawReader.C:217
 testAliRawReader.C:218
 testAliRawReader.C:219
 testAliRawReader.C:220
 testAliRawReader.C:221
 testAliRawReader.C:222
 testAliRawReader.C:223
 testAliRawReader.C:224
 testAliRawReader.C:225
 testAliRawReader.C:226
 testAliRawReader.C:227
 testAliRawReader.C:228
 testAliRawReader.C:229
 testAliRawReader.C:230
 testAliRawReader.C:231
 testAliRawReader.C:232
 testAliRawReader.C:233
 testAliRawReader.C:234
 testAliRawReader.C:235
 testAliRawReader.C:236
 testAliRawReader.C:237
 testAliRawReader.C:238
 testAliRawReader.C:239
 testAliRawReader.C:240
 testAliRawReader.C:241
 testAliRawReader.C:242
 testAliRawReader.C:243
 testAliRawReader.C:244
 testAliRawReader.C:245
 testAliRawReader.C:246
 testAliRawReader.C:247
 testAliRawReader.C:248
 testAliRawReader.C:249
 testAliRawReader.C:250
 testAliRawReader.C:251
 testAliRawReader.C:252
 testAliRawReader.C:253
 testAliRawReader.C:254
 testAliRawReader.C:255
 testAliRawReader.C:256
 testAliRawReader.C:257
 testAliRawReader.C:258
 testAliRawReader.C:259
 testAliRawReader.C:260
 testAliRawReader.C:261
 testAliRawReader.C:262
 testAliRawReader.C:263
 testAliRawReader.C:264
 testAliRawReader.C:265
 testAliRawReader.C:266
 testAliRawReader.C:267
 testAliRawReader.C:268
 testAliRawReader.C:269
 testAliRawReader.C:270
 testAliRawReader.C:271
 testAliRawReader.C:272
 testAliRawReader.C:273
 testAliRawReader.C:274
 testAliRawReader.C:275
 testAliRawReader.C:276
 testAliRawReader.C:277
 testAliRawReader.C:278
 testAliRawReader.C:279
 testAliRawReader.C:280
 testAliRawReader.C:281
 testAliRawReader.C:282
 testAliRawReader.C:283
 testAliRawReader.C:284
 testAliRawReader.C:285
 testAliRawReader.C:286
 testAliRawReader.C:287
 testAliRawReader.C:288
 testAliRawReader.C:289
 testAliRawReader.C:290
 testAliRawReader.C:291
 testAliRawReader.C:292
 testAliRawReader.C:293
 testAliRawReader.C:294
 testAliRawReader.C:295
 testAliRawReader.C:296
 testAliRawReader.C:297
 testAliRawReader.C:298
 testAliRawReader.C:299
 testAliRawReader.C:300
 testAliRawReader.C:301
 testAliRawReader.C:302
 testAliRawReader.C:303
 testAliRawReader.C:304
 testAliRawReader.C:305
 testAliRawReader.C:306
 testAliRawReader.C:307
 testAliRawReader.C:308
 testAliRawReader.C:309
 testAliRawReader.C:310
 testAliRawReader.C:311
 testAliRawReader.C:312
 testAliRawReader.C:313
 testAliRawReader.C:314
 testAliRawReader.C:315
 testAliRawReader.C:316
 testAliRawReader.C:317
 testAliRawReader.C:318
 testAliRawReader.C:319
 testAliRawReader.C:320
 testAliRawReader.C:321
 testAliRawReader.C:322
 testAliRawReader.C:323
 testAliRawReader.C:324
 testAliRawReader.C:325
 testAliRawReader.C:326
 testAliRawReader.C:327
 testAliRawReader.C:328
 testAliRawReader.C:329
 testAliRawReader.C:330
 testAliRawReader.C:331
 testAliRawReader.C:332
 testAliRawReader.C:333
 testAliRawReader.C:334
 testAliRawReader.C:335
 testAliRawReader.C:336
 testAliRawReader.C:337
 testAliRawReader.C:338
 testAliRawReader.C:339
 testAliRawReader.C:340
 testAliRawReader.C:341
 testAliRawReader.C:342
 testAliRawReader.C:343
 testAliRawReader.C:344
 testAliRawReader.C:345
 testAliRawReader.C:346
 testAliRawReader.C:347
 testAliRawReader.C:348
 testAliRawReader.C:349
 testAliRawReader.C:350
 testAliRawReader.C:351
 testAliRawReader.C:352
 testAliRawReader.C:353
 testAliRawReader.C:354
 testAliRawReader.C:355
 testAliRawReader.C:356
 testAliRawReader.C:357
 testAliRawReader.C:358
 testAliRawReader.C:359
 testAliRawReader.C:360
 testAliRawReader.C:361
 testAliRawReader.C:362
 testAliRawReader.C:363
 testAliRawReader.C:364
 testAliRawReader.C:365
 testAliRawReader.C:366
 testAliRawReader.C:367
 testAliRawReader.C:368
 testAliRawReader.C:369
 testAliRawReader.C:370
 testAliRawReader.C:371
 testAliRawReader.C:372
 testAliRawReader.C:373
 testAliRawReader.C:374
 testAliRawReader.C:375
 testAliRawReader.C:376
 testAliRawReader.C:377
 testAliRawReader.C:378
 testAliRawReader.C:379
 testAliRawReader.C:380
 testAliRawReader.C:381
 testAliRawReader.C:382
 testAliRawReader.C:383
 testAliRawReader.C:384
 testAliRawReader.C:385
 testAliRawReader.C:386
 testAliRawReader.C:387
 testAliRawReader.C:388
 testAliRawReader.C:389
 testAliRawReader.C:390
 testAliRawReader.C:391
 testAliRawReader.C:392
 testAliRawReader.C:393
 testAliRawReader.C:394
 testAliRawReader.C:395
 testAliRawReader.C:396
 testAliRawReader.C:397
 testAliRawReader.C:398
 testAliRawReader.C:399
 testAliRawReader.C:400
 testAliRawReader.C:401
 testAliRawReader.C:402
 testAliRawReader.C:403
 testAliRawReader.C:404
 testAliRawReader.C:405
 testAliRawReader.C:406
 testAliRawReader.C:407
 testAliRawReader.C:408
 testAliRawReader.C:409
 testAliRawReader.C:410
 testAliRawReader.C:411
 testAliRawReader.C:412
 testAliRawReader.C:413
 testAliRawReader.C:414
 testAliRawReader.C:415
 testAliRawReader.C:416
 testAliRawReader.C:417
 testAliRawReader.C:418
 testAliRawReader.C:419
 testAliRawReader.C:420
 testAliRawReader.C:421
 testAliRawReader.C:422
 testAliRawReader.C:423
 testAliRawReader.C:424
 testAliRawReader.C:425
 testAliRawReader.C:426
 testAliRawReader.C:427
 testAliRawReader.C:428
 testAliRawReader.C:429
 testAliRawReader.C:430
 testAliRawReader.C:431
 testAliRawReader.C:432
 testAliRawReader.C:433
 testAliRawReader.C:434
 testAliRawReader.C:435
 testAliRawReader.C:436
 testAliRawReader.C:437
 testAliRawReader.C:438
 testAliRawReader.C:439
 testAliRawReader.C:440
 testAliRawReader.C:441
 testAliRawReader.C:442
 testAliRawReader.C:443
 testAliRawReader.C:444
 testAliRawReader.C:445
 testAliRawReader.C:446
 testAliRawReader.C:447
 testAliRawReader.C:448
 testAliRawReader.C:449
 testAliRawReader.C:450
 testAliRawReader.C:451
 testAliRawReader.C:452
 testAliRawReader.C:453
 testAliRawReader.C:454
 testAliRawReader.C:455
 testAliRawReader.C:456
 testAliRawReader.C:457
 testAliRawReader.C:458
 testAliRawReader.C:459
 testAliRawReader.C:460
 testAliRawReader.C:461
 testAliRawReader.C:462
 testAliRawReader.C:463
 testAliRawReader.C:464
 testAliRawReader.C:465
 testAliRawReader.C:466
 testAliRawReader.C:467
 testAliRawReader.C:468
 testAliRawReader.C:469
 testAliRawReader.C:470
 testAliRawReader.C:471
 testAliRawReader.C:472
 testAliRawReader.C:473
 testAliRawReader.C:474
 testAliRawReader.C:475
 testAliRawReader.C:476
 testAliRawReader.C:477
 testAliRawReader.C:478
 testAliRawReader.C:479
 testAliRawReader.C:480
 testAliRawReader.C:481
 testAliRawReader.C:482
 testAliRawReader.C:483
 testAliRawReader.C:484
 testAliRawReader.C:485
 testAliRawReader.C:486
 testAliRawReader.C:487
 testAliRawReader.C:488
 testAliRawReader.C:489
 testAliRawReader.C:490
 testAliRawReader.C:491
 testAliRawReader.C:492
 testAliRawReader.C:493
 testAliRawReader.C:494
 testAliRawReader.C:495
 testAliRawReader.C:496
 testAliRawReader.C:497
 testAliRawReader.C:498
 testAliRawReader.C:499
 testAliRawReader.C:500
 testAliRawReader.C:501
 testAliRawReader.C:502
 testAliRawReader.C:503
 testAliRawReader.C:504
 testAliRawReader.C:505
 testAliRawReader.C:506
 testAliRawReader.C:507
 testAliRawReader.C:508
 testAliRawReader.C:509
 testAliRawReader.C:510
 testAliRawReader.C:511
 testAliRawReader.C:512
 testAliRawReader.C:513
 testAliRawReader.C:514
 testAliRawReader.C:515
 testAliRawReader.C:516
 testAliRawReader.C:517
 testAliRawReader.C:518
 testAliRawReader.C:519
 testAliRawReader.C:520
 testAliRawReader.C:521
 testAliRawReader.C:522
 testAliRawReader.C:523
 testAliRawReader.C:524
 testAliRawReader.C:525
 testAliRawReader.C:526
 testAliRawReader.C:527
 testAliRawReader.C:528
 testAliRawReader.C:529
 testAliRawReader.C:530
 testAliRawReader.C:531
 testAliRawReader.C:532
 testAliRawReader.C:533
 testAliRawReader.C:534
 testAliRawReader.C:535
 testAliRawReader.C:536
 testAliRawReader.C:537
 testAliRawReader.C:538
 testAliRawReader.C:539
 testAliRawReader.C:540
 testAliRawReader.C:541
 testAliRawReader.C:542
 testAliRawReader.C:543
 testAliRawReader.C:544
 testAliRawReader.C:545
 testAliRawReader.C:546
 testAliRawReader.C:547
 testAliRawReader.C:548
 testAliRawReader.C:549
 testAliRawReader.C:550
 testAliRawReader.C:551
 testAliRawReader.C:552
 testAliRawReader.C:553
 testAliRawReader.C:554
 testAliRawReader.C:555
 testAliRawReader.C:556
 testAliRawReader.C:557
 testAliRawReader.C:558
 testAliRawReader.C:559
 testAliRawReader.C:560
 testAliRawReader.C:561
 testAliRawReader.C:562
 testAliRawReader.C:563
 testAliRawReader.C:564
 testAliRawReader.C:565
 testAliRawReader.C:566
 testAliRawReader.C:567
 testAliRawReader.C:568
 testAliRawReader.C:569
 testAliRawReader.C:570
 testAliRawReader.C:571
 testAliRawReader.C:572
 testAliRawReader.C:573
 testAliRawReader.C:574
 testAliRawReader.C:575
 testAliRawReader.C:576
 testAliRawReader.C:577
 testAliRawReader.C:578
 testAliRawReader.C:579
 testAliRawReader.C:580
 testAliRawReader.C:581
 testAliRawReader.C:582
 testAliRawReader.C:583
 testAliRawReader.C:584
 testAliRawReader.C:585
 testAliRawReader.C:586
 testAliRawReader.C:587
 testAliRawReader.C:588
 testAliRawReader.C:589
 testAliRawReader.C:590
 testAliRawReader.C:591
 testAliRawReader.C:592
 testAliRawReader.C:593
 testAliRawReader.C:594
 testAliRawReader.C:595
 testAliRawReader.C:596
 testAliRawReader.C:597
 testAliRawReader.C:598
 testAliRawReader.C:599
 testAliRawReader.C:600
 testAliRawReader.C:601
 testAliRawReader.C:602
 testAliRawReader.C:603
 testAliRawReader.C:604
 testAliRawReader.C:605
 testAliRawReader.C:606
 testAliRawReader.C:607
 testAliRawReader.C:608
 testAliRawReader.C:609
 testAliRawReader.C:610
 testAliRawReader.C:611
 testAliRawReader.C:612
 testAliRawReader.C:613
 testAliRawReader.C:614
 testAliRawReader.C:615
 testAliRawReader.C:616
 testAliRawReader.C:617
 testAliRawReader.C:618
 testAliRawReader.C:619
 testAliRawReader.C:620
 testAliRawReader.C:621
 testAliRawReader.C:622
 testAliRawReader.C:623
 testAliRawReader.C:624
 testAliRawReader.C:625
 testAliRawReader.C:626
 testAliRawReader.C:627
 testAliRawReader.C:628
 testAliRawReader.C:629
 testAliRawReader.C:630
 testAliRawReader.C:631
 testAliRawReader.C:632
 testAliRawReader.C:633
 testAliRawReader.C:634
 testAliRawReader.C:635
 testAliRawReader.C:636
 testAliRawReader.C:637
 testAliRawReader.C:638
 testAliRawReader.C:639
 testAliRawReader.C:640
 testAliRawReader.C:641
 testAliRawReader.C:642
 testAliRawReader.C:643
 testAliRawReader.C:644
 testAliRawReader.C:645
 testAliRawReader.C:646
 testAliRawReader.C:647
 testAliRawReader.C:648
 testAliRawReader.C:649
 testAliRawReader.C:650
 testAliRawReader.C:651
 testAliRawReader.C:652
 testAliRawReader.C:653
 testAliRawReader.C:654
 testAliRawReader.C:655
 testAliRawReader.C:656
 testAliRawReader.C:657
 testAliRawReader.C:658
 testAliRawReader.C:659
 testAliRawReader.C:660
 testAliRawReader.C:661
 testAliRawReader.C:662
 testAliRawReader.C:663