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

///////////////////////////////////////////////////////////////////////////////
///
/// This is the base class for reading raw data.
///
/// The derived classes, which operate on concrete raw data formats,
/// should implement
/// - ReadHeader to read the next (data/equipment) header
/// - ReadNextData to read the next raw data block (=1 DDL)
/// - ReadNext to read a given number of bytes
/// - several getters like GetType
///
/// Sequential access to the raw data is provided by the methods
/// ReadHeader, ReadNextData, ReadNextInt, ReadNextShort, ReadNextChar
///
/// If only data from a specific detector (and a given range of DDL numbers)
/// should be read, this can be achieved by the Select method.
/// Several getters provide information about the current event and the
/// current type of raw data.
///
///////////////////////////////////////////////////////////////////////////////

#include <TClass.h>
#include <TPluginManager.h>
#include <TROOT.h>
#include <TInterpreter.h>
#include <TSystem.h>
#include <TPRegexp.h>
#include <THashList.h>

#include <Riostream.h>
#include "AliRawReader.h"
#include "AliRawReaderFile.h"
#include "AliRawReaderDate.h"
#include "AliRawReaderRoot.h"
#include "AliRawReaderChain.h"
#include "AliDAQ.h"
#include "AliLog.h"

using std::ifstream;
ClassImp(AliRawReader)


AliRawReader::AliRawReader() :
  fEquipmentIdsIn(NULL),
  fEquipmentIdsOut(NULL),
  fRequireHeader(kTRUE),
  fHeader(NULL),
  fHeaderV3(NULL),
  fCount(0),
  fSelectEquipmentType(-1),
  fSelectMinEquipmentId(-1),
  fSelectMaxEquipmentId(-1),
  fSkipInvalid(kFALSE),
  fSelectEventType(-1),
  fSelectTriggerMask(0),
  fSelectTriggerExpr(),
  fErrorCode(0),
  fEventNumber(-1),
  fErrorLogs("AliRawDataErrorLog",100),
  fHeaderSwapped(NULL),
  fHeaderSwappedV3(NULL),
  fIsValid(kTRUE),
  fIsTriggerClassLoaded(kFALSE)
{
// default constructor: initialize data members
// Allocate the swapped header in case of Mac
#ifndef R__BYTESWAP
  fHeaderSwapped=new AliRawDataHeader();
  fHeaderSwappedV3=new AliRawDataHeaderV3();
#endif
}

Bool_t AliRawReader::LoadEquipmentIdsMap(const char *fileName)
{
  // Open the mapping file
  // and load the mapping data
  ifstream input(fileName);
  if (input.is_open()) {
    Warning("AliRawReader","Equipment ID mapping file is found !");
    const Int_t kMaxDDL = 256;
    fEquipmentIdsIn = new TArrayI(kMaxDDL);
    fEquipmentIdsOut = new TArrayI(kMaxDDL);
    Int_t equipIn, equipOut;
    Int_t nIds = 0;
    while (input >> equipIn >> equipOut) {
      if (nIds >= kMaxDDL) {
	Error("AliRawReader","Too many equipment Id mappings found ! Truncating the list !");
	break;
      }
      fEquipmentIdsIn->AddAt(equipIn,nIds); 
      fEquipmentIdsOut->AddAt(equipOut,nIds);
      nIds++;
    }
    fEquipmentIdsIn->Set(nIds);
    fEquipmentIdsOut->Set(nIds);
    input.close();
    return kTRUE;
  }
  else {
    Error("AliRawReader","equipment id map file is not found ! Skipping the mapping !");
    return kFALSE;
  }
}

AliRawReader::AliRawReader(const AliRawReader& rawReader) :
  TObject(rawReader),
  fEquipmentIdsIn(rawReader.fEquipmentIdsIn),
  fEquipmentIdsOut(rawReader.fEquipmentIdsOut),
  fRequireHeader(rawReader.fRequireHeader),
  fHeader(rawReader.fHeader),
  fHeaderV3(rawReader.fHeaderV3),
  fCount(rawReader.fCount),
  fSelectEquipmentType(rawReader.fSelectEquipmentType),
  fSelectMinEquipmentId(rawReader.fSelectMinEquipmentId),
  fSelectMaxEquipmentId(rawReader.fSelectMaxEquipmentId),
  fSkipInvalid(rawReader.fSkipInvalid),
  fSelectEventType(rawReader.fSelectEventType),
  fSelectTriggerMask(rawReader.fSelectTriggerMask),
  fSelectTriggerExpr(rawReader.fSelectTriggerExpr),
  fErrorCode(0),
  fEventNumber(-1),
  fErrorLogs("AliRawDataErrorLog",100),
  fHeaderSwapped(NULL),
  fHeaderSwappedV3(NULL),
  fIsValid(rawReader.fIsValid),
  fIsTriggerClassLoaded(rawReader.fIsTriggerClassLoaded)
{
// copy constructor
// Allocate the swapped header in case of Mac
#ifndef R__BYTESWAP
  fHeaderSwapped=new AliRawDataHeader(*rawReader.fHeaderSwapped);
  fHeaderSwappedV3=new AliRawDataHeader(*rawReader.fHeaderSwappedV3);
#endif
}

AliRawReader& AliRawReader::operator = (const AliRawReader& rawReader)
{
// assignment operator
  if(&rawReader == this) return *this;
  fEquipmentIdsIn = rawReader.fEquipmentIdsIn;
  fEquipmentIdsOut = rawReader.fEquipmentIdsOut;

  fHeader = rawReader.fHeader;
  fHeaderV3 = rawReader.fHeaderV3;
  fCount = rawReader.fCount;

  fSelectEquipmentType = rawReader.fSelectEquipmentType;
  fSelectMinEquipmentId = rawReader.fSelectMinEquipmentId;
  fSelectMaxEquipmentId = rawReader.fSelectMaxEquipmentId;
  fSkipInvalid = rawReader.fSkipInvalid;
  fSelectEventType = rawReader.fSelectEventType;
  fSelectTriggerMask = rawReader.fSelectTriggerMask;
  fSelectTriggerExpr = rawReader.fSelectTriggerExpr;

  fErrorCode = rawReader.fErrorCode;

  fEventNumber = rawReader.fEventNumber;
  fErrorLogs = *((TClonesArray*)rawReader.fErrorLogs.Clone());

  fIsValid = rawReader.fIsValid;
  fIsTriggerClassLoaded = rawReader.fIsTriggerClassLoaded;

  return *this;
}

AliRawReader::~AliRawReader()
{
  // destructor
  // delete the mapping arrays if
  // initialized
  if (fEquipmentIdsIn) delete fEquipmentIdsIn;
  if (fEquipmentIdsOut) delete fEquipmentIdsOut;
  fErrorLogs.Delete();
  if (fHeaderSwapped) delete fHeaderSwapped;
  if (fHeaderSwappedV3) delete fHeaderSwappedV3;
}

AliRawReader* AliRawReader::Create(const char *uri)
{
  // RawReader's factory
  // It instantiate corresponding raw-reader implementation class object
  // depending on the URI provided
  // Normal URIs point to files, while the URI starting with
  // 'mem://:' or 'mem://<filename>' will create
  // AliRawReaderDateOnline object which is supposed to be used
  // in the online reconstruction

  TString strURI = uri;

  if (strURI.IsNull()) {
    AliWarningClass("No raw-reader created");
    return NULL;
  }

  TObjArray *fields = strURI.Tokenize("?");
  TString &fileURI = ((TObjString*)fields->At(0))->String();

  AliRawReader *rawReader = NULL;
  if (fileURI.BeginsWith("mem://") || fileURI.BeginsWith("^")) {
    if (fileURI.BeginsWith("mem://")) fileURI.ReplaceAll("mem://","");
    AliInfoClass(Form("Creating raw-reader in order to read events in shared memory (option=%s)",fileURI.Data()));

    TPluginManager* pluginManager = gROOT->GetPluginManager();
    TString rawReaderName = "AliRawReaderDateOnline";
    TPluginHandler* pluginHandler = pluginManager->FindHandler("AliRawReader", "online");
    // if not, add a plugin for it
    if (!pluginHandler) {
      pluginManager->AddHandler("AliRawReader", "online", 
				"AliRawReaderDateOnline", "RAWDatarecOnline", "AliRawReaderDateOnline(const char*)");
      pluginHandler = pluginManager->FindHandler("AliRawReader", "online");
    }
    if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
      rawReader = (AliRawReader*)pluginHandler->ExecPlugin(1,fileURI.Data());
    }
    else {
      delete fields;
      return NULL;
    }
  }
  else if (fileURI.BeginsWith("amore://")) {
    // A special raw-data URL used in case
    // the raw-data reading is steered from
    // ouside, i.e. from AMORE
    fileURI.ReplaceAll("amore://","");
    AliInfoClass("Creating raw-reader in order to read events sent by AMORE");
    rawReader = new AliRawReaderDate((void *)NULL);
  }
  else if (fileURI.BeginsWith("collection://")) {
    fileURI.ReplaceAll("collection://","");
    AliInfoClass(Form("Creating raw-reader in order to read raw-data files collection defined in %s",fileURI.Data()));
    rawReader = new AliRawReaderChain(fileURI);
  }
  else if (fileURI.BeginsWith("raw://run")) {
    fileURI.ReplaceAll("raw://run","");
    if (fileURI.IsDigit()) {
      rawReader = new AliRawReaderChain(fileURI.Atoi());
    }
    else {
      AliErrorClass(Form("Invalid syntax: %s",fileURI.Data()));
      delete fields;
      return NULL;
    }
  }
  else {
    AliInfoClass(Form("Creating raw-reader in order to read raw-data file: %s",fileURI.Data()));
    TString filename(gSystem->ExpandPathName(fileURI.Data()));
    if (filename.EndsWith("/")) {
      rawReader = new AliRawReaderFile(filename);
    } else if (filename.EndsWith(".root")) {
      rawReader = new AliRawReaderRoot(filename);
    } else {
      rawReader = new AliRawReaderDate(filename);
    }
  }

  if (!rawReader->IsRawReaderValid()) {
    AliErrorClass(Form("Raw-reader is invalid - check the input URI (%s)",fileURI.Data()));
    delete rawReader;
    delete fields;
    return NULL;
  }

  // Now apply event selection criteria (if specified)
  if (fields->GetEntries() > 1) {
    Int_t eventType = -1;
    ULong64_t triggerMask = 0;
    TString triggerExpr;
    for(Int_t i = 1; i < fields->GetEntries(); i++) {
      if (!fields->At(i)) continue;
      TString &option = ((TObjString*)fields->At(i))->String();
      if (option.BeginsWith("EventType=",TString::kIgnoreCase)) {
	option.ReplaceAll("EventType=","");
	eventType = option.Atoi();
	continue;
      }
      if (option.BeginsWith("Trigger=",TString::kIgnoreCase)) {
	option.ReplaceAll("Trigger=","");
	if (option.IsDigit()) {
	  triggerMask = option.Atoll();
	}
	else {
	  triggerExpr = option.Data();
	}
	continue;
      }
      AliWarningClass(Form("Ignoring invalid event selection option: %s",option.Data()));
    }
    AliInfoClass(Form("Event selection criteria specified:   eventype=%d   trigger mask=%llx   trigger expression=%s",
		 eventType,triggerMask,triggerExpr.Data()));
    rawReader->SelectEvents(eventType,triggerMask,triggerExpr.Data());
  }

  delete fields;

  return rawReader;
}

Int_t AliRawReader::GetMappedEquipmentId() const
{
  if (!fEquipmentIdsIn || !fEquipmentIdsOut) {
    Error("AliRawReader","equipment Ids mapping is not initialized !");
    return GetEquipmentId();
  }
  Int_t equipmentId = GetEquipmentId();
  for(Int_t iId = 0; iId < fEquipmentIdsIn->GetSize(); iId++) {
    if (equipmentId == fEquipmentIdsIn->At(iId)) {
      equipmentId = fEquipmentIdsOut->At(iId);
      break;
    }
  }
  return equipmentId;
}

Int_t AliRawReader::GetDetectorID() const
{
  // Get the detector ID
  // The list of detector IDs
  // can be found in AliDAQ.h
  Int_t equipmentId;
  if (fEquipmentIdsIn && fEquipmentIdsIn)
    equipmentId = GetMappedEquipmentId();
  else
    equipmentId = GetEquipmentId();

  if (equipmentId >= 0) {
    Int_t ddlIndex;
    return AliDAQ::DetectorIDFromDdlID(equipmentId,ddlIndex);
  }
  else
    return -1;
}

Int_t AliRawReader::GetDDLID() const
{
  // Get the DDL ID (within one sub-detector)
  // The list of detector IDs
  // can be found in AliDAQ.h
  Int_t equipmentId;
  if (fEquipmentIdsIn && fEquipmentIdsIn)
    equipmentId = GetMappedEquipmentId();
  else
    equipmentId = GetEquipmentId();

  if (equipmentId >= 0) {
    Int_t ddlIndex;
    AliDAQ::DetectorIDFromDdlID(equipmentId,ddlIndex);
    return ddlIndex;
  }
  else
    return -1;
}

void AliRawReader::Select(const char *detectorName, Int_t minDDLID, Int_t maxDDLID)
{
// read only data of the detector with the given name and in the given
// range of DDLs (minDDLID <= DDLID <= maxDDLID).
// no selection is applied if a value < 0 is used.
  Int_t detectorID = AliDAQ::DetectorID(detectorName);
  if(detectorID >= 0)
    Select(detectorID,minDDLID,maxDDLID);
}

void AliRawReader::Select(Int_t detectorID, Int_t minDDLID, Int_t maxDDLID)
{
// read only data of the detector with the given ID and in the given
// range of DDLs (minDDLID <= DDLID <= maxDDLID).
// no selection is applied if a value < 0 is used.

  fSelectEquipmentType = -1;

  if (minDDLID < 0)
    fSelectMinEquipmentId = AliDAQ::DdlIDOffset(detectorID);
  else
    fSelectMinEquipmentId = AliDAQ::DdlID(detectorID,minDDLID);

  if (maxDDLID < 0)
    fSelectMaxEquipmentId = AliDAQ::DdlID(detectorID,AliDAQ::NumberOfDdls(detectorID)-1);
  else
    fSelectMaxEquipmentId = AliDAQ::DdlID(detectorID,maxDDLID);
}

void AliRawReader::SelectEquipment(Int_t equipmentType, 
				   Int_t minEquipmentId, Int_t maxEquipmentId)
{
// read only data of the equipment with the given type and in the given
// range of IDs (minEquipmentId <= EquipmentId <= maxEquipmentId).
// no selection is applied if a value < 0 is used.

  fSelectEquipmentType = equipmentType;
  fSelectMinEquipmentId = minEquipmentId;
  fSelectMaxEquipmentId = maxEquipmentId;
}

void AliRawReader::SelectEvents(Int_t type, ULong64_t triggerMask,
				const char *triggerExpr)
{
// read only events with the given type and optionally
// trigger mask.
// no selection is applied if value = 0 is used.
// Trigger selection can be done via string (triggerExpr)
// which defines the trigger logic to be used. It works only
// after LoadTriggerClass() method is called for all involved
// trigger classes.

  fSelectEventType = type;
  fSelectTriggerMask = triggerMask;
  if (triggerExpr) fSelectTriggerExpr = triggerExpr;
}

void AliRawReader::LoadTriggerClass(const char* name, Int_t index)
{
  // Loads the list of trigger classes defined.
  // Used in conjunction with IsEventSelected in the
  // case when the trigger selection is given by
  // fSelectedTriggerExpr

  if (fSelectTriggerExpr.IsNull()) return;

  fIsTriggerClassLoaded = kTRUE;

  if (index >= 0)
    fSelectTriggerExpr.ReplaceAll(name,Form("[%d]",index));
  else
    fSelectTriggerExpr.ReplaceAll(name,"0");
}

void AliRawReader::LoadTriggerAlias(const THashList *lst)
{
  // Loads the list of trigger aliases defined.
  // Replaces the alias by the OR of the triggers included in it.
  // The subsiquent call to LoadTriggerClass is needed
  // to obtain the final expression in
  // fSelectedTriggerExpr

  if (fSelectTriggerExpr.IsNull()) return;

  // Make a THashList alias -> trigger classes

  THashList alias2trig;
  TIter iter(lst);
  TNamed *nmd = 0;

  // Loop on triggers

  while((nmd = dynamic_cast<TNamed*>(iter.Next()))){

    TString aliasList(nmd->GetTitle());
    TObjArray* arrAliases = aliasList.Tokenize(',');
    Int_t nAliases = arrAliases->GetEntries();

    // Loop on aliases for the current trigger
    for(Int_t i=0; i<nAliases; i++){

      TObjString *alias = (TObjString*) arrAliases->At(i);

      // Find the current alias in the hash list. If it is not there, add TNamed entry
      TNamed * inlist = (TNamed*)alias2trig.FindObject((alias->GetString()).Data());
      if (!inlist) {
	inlist = new TNamed((alias->GetString()).Data(),nmd->GetName());
	alias2trig.Add(inlist);
      }
      else {
	TString tt(inlist->GetTitle());
	tt += " || ";
	tt += nmd->GetName();
	inlist->SetTitle(tt.Data());
      }
    }
    
    delete arrAliases;
  }
  alias2trig.Sort(kSortDescending);

  // Replace all the aliases by the OR of triggers
  TIter iter1(&alias2trig);
  while((nmd = dynamic_cast<TNamed*>(iter1.Next()))){
    fSelectTriggerExpr.ReplaceAll(nmd->GetName(),nmd->GetTitle());
  }
}

Bool_t AliRawReader::IsSelected() const
{
// apply the selection (if any)

  if (fSkipInvalid && !IsValid()) return kFALSE;

  if (fSelectEquipmentType >= 0)
    if (GetEquipmentType() != fSelectEquipmentType) return kFALSE;

  Int_t equipmentId;
  if (fEquipmentIdsIn && fEquipmentIdsIn)
    equipmentId = GetMappedEquipmentId();
  else
    equipmentId = GetEquipmentId();

  if ((fSelectMinEquipmentId >= 0) && 
      (equipmentId < fSelectMinEquipmentId))
    return kFALSE;
  if ((fSelectMaxEquipmentId >= 0) && 
      (equipmentId > fSelectMaxEquipmentId))
    return kFALSE;

  return kTRUE;
}

Bool_t AliRawReader::IsEventSelected() const
{
  // apply the event selection (if any)

  // First check the event type
  if (fSelectEventType >= 0) {
    if (GetType() != (UInt_t) fSelectEventType) return kFALSE;
  }

  // Then check the trigger pattern and compared it
  // to the required trigger mask
  if (fSelectTriggerMask != 0) {
    if ((GetClassMask() & fSelectTriggerMask) != fSelectTriggerMask) return kFALSE;
  }

  if (  fIsTriggerClassLoaded && !fSelectTriggerExpr.IsNull()) {
    TString expr(fSelectTriggerExpr);
    ULong64_t mask = GetClassMask();
    for(Int_t itrigger = 0; itrigger < 50; itrigger++) {
      if (mask & ((ULong64_t)1 << itrigger)) {
	expr.ReplaceAll(Form("[%d]",itrigger),"1");
      }
      else {
	expr.ReplaceAll(Form("[%d]",itrigger),"0");
      }
    }
    // Possibility to introduce downscaling
    TPRegexp("(%\\s*\\d+)").Substitute(expr,Form("&& !(%d$1)",GetEventIndex()),"g");
    Int_t error;
    Bool_t result = gROOT->ProcessLineFast(expr.Data(),&error);
    if ( error == TInterpreter::kNoError)
      return result;
    else
      return kFALSE;
  }

  return kTRUE;
}

UInt_t AliRawReader::SwapWord(UInt_t x) const
{
   // Swap the endianess of the integer value 'x'

   return (((x & 0x000000ffU) << 24) | ((x & 0x0000ff00U) <<  8) |
           ((x & 0x00ff0000U) >>  8) | ((x & 0xff000000U) >> 24));
}

UShort_t AliRawReader::SwapShort(UShort_t x) const
{
   // Swap the endianess of the short value 'x'

   return (((x & 0x00ffU) <<  8) | ((x & 0xff00U) >>  8)) ;
}

Bool_t AliRawReader::ReadNextInt(UInt_t& data)
{
// reads the next 4 bytes at the current position
// returns kFALSE if the data could not be read

  while (fCount == 0) {
    if (!ReadHeader()) return kFALSE;
  }
  if (fCount < (Int_t) sizeof(data)) {
    Error("ReadNextInt", 
	  "too few data left (%d bytes) to read an UInt_t!", fCount);
    return kFALSE;
  }
  if (!ReadNext((UChar_t*) &data, sizeof(data))) {
    Error("ReadNextInt", "could not read data!");
    return kFALSE;
  }
#ifndef R__BYTESWAP
  data=SwapWord(data);
#endif
  return kTRUE;
}

Bool_t AliRawReader::ReadNextShort(UShort_t& data)
{
// reads the next 2 bytes at the current position
// returns kFALSE if the data could not be read

  while (fCount == 0) {
    if (!ReadHeader()) return kFALSE;
  }
  if (fCount < (Int_t) sizeof(data)) {
    Error("ReadNextShort", 
	  "too few data left (%d bytes) to read an UShort_t!", fCount);
    return kFALSE;
  }
  if (!ReadNext((UChar_t*) &data, sizeof(data))) {
    Error("ReadNextShort", "could not read data!");
    return kFALSE;
  }
#ifndef R__BYTESWAP
  data=SwapShort(data);
#endif
  return kTRUE;
}

Bool_t AliRawReader::ReadNextChar(UChar_t& data)
{
// reads the next 1 byte at the current stream position
// returns kFALSE if the data could not be read

  while (fCount == 0) {
    if (!ReadHeader()) return kFALSE;
  }
  if (!ReadNext((UChar_t*) &data, sizeof(data))) {
    Error("ReadNextChar", "could not read data!");
    return kFALSE;
  }
  return kTRUE;
}

Bool_t  AliRawReader::GotoEvent(Int_t event)
{
  // Random access to certain
  // event index. Could be very slow
  // for some non-root raw-readers.
  // So it should be reimplemented there.
  if (event < fEventNumber) RewindEvents();

  while (fEventNumber < event) {
    if (!NextEvent()) return kFALSE;
  }

  return kTRUE;
}

Int_t AliRawReader::CheckData() const
{
// check the consistency of the data
// derived classes should overwrite the default method which returns 0 (no err)

  return 0;
}


void AliRawReader::DumpData(Int_t limit)
{
// print the raw data
// if limit is not negative, only the first and last "limit" lines of raw data
// are printed

  Reset();
  if (!ReadHeader()) {
    Error("DumpData", "no header");
    return;
  }
  printf("header:\n"
	 " type = %d  run = %d  ", GetType(), GetRunNumber());
  if (GetEventId()) {
    printf("event = %8.8x %8.8x\n", GetEventId()[1], GetEventId()[0]);
  } else {
    printf("event = -------- --------\n");
  }
  if (GetTriggerPattern()) {
    printf(" trigger = %8.8x %8.8x  ",
	   GetTriggerPattern()[1], GetTriggerPattern()[0]);
  } else {
    printf(" trigger = -------- --------  ");
  }
  if (GetDetectorPattern()) {
    printf("detector = %8.8x\n", GetDetectorPattern()[0]);
  } else {
    printf("detector = --------\n");
  }
  if (GetAttributes()) {
    printf(" attributes = %8.8x %8.8x %8.8x  ",
	   GetAttributes()[2], GetAttributes()[1], GetAttributes()[0]);
  } else {
    printf(" attributes = -------- -------- --------  ");
  }
  printf("GDC = %d\n", GetGDCId());
  printf("\n");

  do {
    printf("-------------------------------------------------------------------------------\n");
    printf("LDC = %d\n", GetLDCId());

    printf("equipment:\n"
	   " size = %d  type = %d  id = %d\n",
	   GetEquipmentSize(), GetEquipmentType(), GetEquipmentId());
    if (GetEquipmentAttributes()) {
      printf(" attributes = %8.8x %8.8x %8.8x  ", GetEquipmentAttributes()[2],
	     GetEquipmentAttributes()[1], GetEquipmentAttributes()[0]);
    } else {
      printf(" attributes = -------- -------- --------  ");
    }
    printf("element size = %d\n", GetEquipmentElementSize());

    printf("data header:\n"
	   " size = %d  version = %d  valid = %d  compression = %d\n",
	   GetDataSize(), GetVersion(), IsValid(), IsCompressed());

    printf("\n");
    if (limit == 0) continue;

    Int_t size = GetDataSize();
    char line[70];
    for (Int_t i = 0; i < 70; i++) line[i] = ' ';
    line[69] = '\0';
    Int_t pos = 0;
    Int_t max = 16;
    UChar_t byte;

    for (Int_t n = 0; n < size; n++) {
      if (!ReadNextChar(byte)) {
	Error("DumpData", "couldn't read byte number %d\n", n);
	break;
      }
      if (pos >= max) {
	printf("%8.8x  %s\n", n-pos, line);
	for (Int_t i = 0; i < 70; i++) line[i] = ' ';
	line[69] = '\0';
	pos = 0;
	if ((limit > 0) && (n/max == limit)) {
	  Int_t nContinue = ((size-1)/max+1-limit) * max;
	  if (nContinue > n) {
	    printf(" [skipping %d bytes]\n", nContinue-n);
	    n = nContinue-1;
	    continue;
	  }
	}
      }
      Int_t offset = pos/4;
      if ((byte > 0x20) && (byte < 0x7f)) {
	line[pos+offset] = byte;
      } else {
	line[pos+offset] = '.';
      }
      char hex[3];
      snprintf(hex, 3, "%2.2x", byte);
      line[max+max/4+3+2*pos+offset] = hex[0];
      line[max+max/4+4+2*pos+offset] = hex[1];
      pos++;
    }

    if (pos > 0) printf("%8.8x  %s\n", size-pos, line);
    printf("\n");
	   
  } while (ReadHeader());
}

void AliRawReader::AddErrorLog(AliRawDataErrorLog::ERawDataErrorLevel level,
			       Int_t code,
			       const char *message)
{
  // Add a raw data error message to the list
  // of raw-data decoding errors
  if (fEventNumber < 0) {
    return;
  }
  Int_t ddlId = GetEquipmentId();
  if (ddlId < 0) {
    AliError("No ddl raw data have been read so far! Impossible to add a raw data error log!");
    return;
  }

  Int_t prevEventNumber = -1;
  Int_t prevDdlId = -1;
  Int_t prevErrorCode = -1;
  AliRawDataErrorLog *prevLog = (AliRawDataErrorLog *)fErrorLogs.Last();
  if (prevLog) {
    prevEventNumber = prevLog->GetEventNumber();
    prevDdlId       = prevLog->GetDdlID();
    prevErrorCode   = prevLog->GetErrorCode();
  }

  if ((prevEventNumber != fEventNumber) ||
      (prevDdlId != ddlId) ||
      (prevErrorCode != code)) {
    new (fErrorLogs[fErrorLogs.GetEntriesFast()])
      AliRawDataErrorLog(fEventNumber,
			 ddlId,
			 level,
			 code,
			 message);
  }
  else
    if (prevLog) prevLog->AddCount();

}

Bool_t AliRawReader::GotoEventWithID(Int_t event, 
				     UInt_t period,
				     UInt_t orbitID,
				     UShort_t bcID)
{
  // Go to certain event number by
  // checking the event ID.
  // Useful in case event-selection
  // is applied and the 'event' is
  // relative
  if (!GotoEvent(event)) return kFALSE;

  while (GetBCID()    != period  ||
	 GetOrbitID() != orbitID ||
	 GetPeriod()  != bcID) {
    if (!NextEvent()) return kFALSE;
  }

  return kTRUE;
}

 AliRawReader.cxx:1
 AliRawReader.cxx:2
 AliRawReader.cxx:3
 AliRawReader.cxx:4
 AliRawReader.cxx:5
 AliRawReader.cxx:6
 AliRawReader.cxx:7
 AliRawReader.cxx:8
 AliRawReader.cxx:9
 AliRawReader.cxx:10
 AliRawReader.cxx:11
 AliRawReader.cxx:12
 AliRawReader.cxx:13
 AliRawReader.cxx:14
 AliRawReader.cxx:15
 AliRawReader.cxx:16
 AliRawReader.cxx:17
 AliRawReader.cxx:18
 AliRawReader.cxx:19
 AliRawReader.cxx:20
 AliRawReader.cxx:21
 AliRawReader.cxx:22
 AliRawReader.cxx:23
 AliRawReader.cxx:24
 AliRawReader.cxx:25
 AliRawReader.cxx:26
 AliRawReader.cxx:27
 AliRawReader.cxx:28
 AliRawReader.cxx:29
 AliRawReader.cxx:30
 AliRawReader.cxx:31
 AliRawReader.cxx:32
 AliRawReader.cxx:33
 AliRawReader.cxx:34
 AliRawReader.cxx:35
 AliRawReader.cxx:36
 AliRawReader.cxx:37
 AliRawReader.cxx:38
 AliRawReader.cxx:39
 AliRawReader.cxx:40
 AliRawReader.cxx:41
 AliRawReader.cxx:42
 AliRawReader.cxx:43
 AliRawReader.cxx:44
 AliRawReader.cxx:45
 AliRawReader.cxx:46
 AliRawReader.cxx:47
 AliRawReader.cxx:48
 AliRawReader.cxx:49
 AliRawReader.cxx:50
 AliRawReader.cxx:51
 AliRawReader.cxx:52
 AliRawReader.cxx:53
 AliRawReader.cxx:54
 AliRawReader.cxx:55
 AliRawReader.cxx:56
 AliRawReader.cxx:57
 AliRawReader.cxx:58
 AliRawReader.cxx:59
 AliRawReader.cxx:60
 AliRawReader.cxx:61
 AliRawReader.cxx:62
 AliRawReader.cxx:63
 AliRawReader.cxx:64
 AliRawReader.cxx:65
 AliRawReader.cxx:66
 AliRawReader.cxx:67
 AliRawReader.cxx:68
 AliRawReader.cxx:69
 AliRawReader.cxx:70
 AliRawReader.cxx:71
 AliRawReader.cxx:72
 AliRawReader.cxx:73
 AliRawReader.cxx:74
 AliRawReader.cxx:75
 AliRawReader.cxx:76
 AliRawReader.cxx:77
 AliRawReader.cxx:78
 AliRawReader.cxx:79
 AliRawReader.cxx:80
 AliRawReader.cxx:81
 AliRawReader.cxx:82
 AliRawReader.cxx:83
 AliRawReader.cxx:84
 AliRawReader.cxx:85
 AliRawReader.cxx:86
 AliRawReader.cxx:87
 AliRawReader.cxx:88
 AliRawReader.cxx:89
 AliRawReader.cxx:90
 AliRawReader.cxx:91
 AliRawReader.cxx:92
 AliRawReader.cxx:93
 AliRawReader.cxx:94
 AliRawReader.cxx:95
 AliRawReader.cxx:96
 AliRawReader.cxx:97
 AliRawReader.cxx:98
 AliRawReader.cxx:99
 AliRawReader.cxx:100
 AliRawReader.cxx:101
 AliRawReader.cxx:102
 AliRawReader.cxx:103
 AliRawReader.cxx:104
 AliRawReader.cxx:105
 AliRawReader.cxx:106
 AliRawReader.cxx:107
 AliRawReader.cxx:108
 AliRawReader.cxx:109
 AliRawReader.cxx:110
 AliRawReader.cxx:111
 AliRawReader.cxx:112
 AliRawReader.cxx:113
 AliRawReader.cxx:114
 AliRawReader.cxx:115
 AliRawReader.cxx:116
 AliRawReader.cxx:117
 AliRawReader.cxx:118
 AliRawReader.cxx:119
 AliRawReader.cxx:120
 AliRawReader.cxx:121
 AliRawReader.cxx:122
 AliRawReader.cxx:123
 AliRawReader.cxx:124
 AliRawReader.cxx:125
 AliRawReader.cxx:126
 AliRawReader.cxx:127
 AliRawReader.cxx:128
 AliRawReader.cxx:129
 AliRawReader.cxx:130
 AliRawReader.cxx:131
 AliRawReader.cxx:132
 AliRawReader.cxx:133
 AliRawReader.cxx:134
 AliRawReader.cxx:135
 AliRawReader.cxx:136
 AliRawReader.cxx:137
 AliRawReader.cxx:138
 AliRawReader.cxx:139
 AliRawReader.cxx:140
 AliRawReader.cxx:141
 AliRawReader.cxx:142
 AliRawReader.cxx:143
 AliRawReader.cxx:144
 AliRawReader.cxx:145
 AliRawReader.cxx:146
 AliRawReader.cxx:147
 AliRawReader.cxx:148
 AliRawReader.cxx:149
 AliRawReader.cxx:150
 AliRawReader.cxx:151
 AliRawReader.cxx:152
 AliRawReader.cxx:153
 AliRawReader.cxx:154
 AliRawReader.cxx:155
 AliRawReader.cxx:156
 AliRawReader.cxx:157
 AliRawReader.cxx:158
 AliRawReader.cxx:159
 AliRawReader.cxx:160
 AliRawReader.cxx:161
 AliRawReader.cxx:162
 AliRawReader.cxx:163
 AliRawReader.cxx:164
 AliRawReader.cxx:165
 AliRawReader.cxx:166
 AliRawReader.cxx:167
 AliRawReader.cxx:168
 AliRawReader.cxx:169
 AliRawReader.cxx:170
 AliRawReader.cxx:171
 AliRawReader.cxx:172
 AliRawReader.cxx:173
 AliRawReader.cxx:174
 AliRawReader.cxx:175
 AliRawReader.cxx:176
 AliRawReader.cxx:177
 AliRawReader.cxx:178
 AliRawReader.cxx:179
 AliRawReader.cxx:180
 AliRawReader.cxx:181
 AliRawReader.cxx:182
 AliRawReader.cxx:183
 AliRawReader.cxx:184
 AliRawReader.cxx:185
 AliRawReader.cxx:186
 AliRawReader.cxx:187
 AliRawReader.cxx:188
 AliRawReader.cxx:189
 AliRawReader.cxx:190
 AliRawReader.cxx:191
 AliRawReader.cxx:192
 AliRawReader.cxx:193
 AliRawReader.cxx:194
 AliRawReader.cxx:195
 AliRawReader.cxx:196
 AliRawReader.cxx:197
 AliRawReader.cxx:198
 AliRawReader.cxx:199
 AliRawReader.cxx:200
 AliRawReader.cxx:201
 AliRawReader.cxx:202
 AliRawReader.cxx:203
 AliRawReader.cxx:204
 AliRawReader.cxx:205
 AliRawReader.cxx:206
 AliRawReader.cxx:207
 AliRawReader.cxx:208
 AliRawReader.cxx:209
 AliRawReader.cxx:210
 AliRawReader.cxx:211
 AliRawReader.cxx:212
 AliRawReader.cxx:213
 AliRawReader.cxx:214
 AliRawReader.cxx:215
 AliRawReader.cxx:216
 AliRawReader.cxx:217
 AliRawReader.cxx:218
 AliRawReader.cxx:219
 AliRawReader.cxx:220
 AliRawReader.cxx:221
 AliRawReader.cxx:222
 AliRawReader.cxx:223
 AliRawReader.cxx:224
 AliRawReader.cxx:225
 AliRawReader.cxx:226
 AliRawReader.cxx:227
 AliRawReader.cxx:228
 AliRawReader.cxx:229
 AliRawReader.cxx:230
 AliRawReader.cxx:231
 AliRawReader.cxx:232
 AliRawReader.cxx:233
 AliRawReader.cxx:234
 AliRawReader.cxx:235
 AliRawReader.cxx:236
 AliRawReader.cxx:237
 AliRawReader.cxx:238
 AliRawReader.cxx:239
 AliRawReader.cxx:240
 AliRawReader.cxx:241
 AliRawReader.cxx:242
 AliRawReader.cxx:243
 AliRawReader.cxx:244
 AliRawReader.cxx:245
 AliRawReader.cxx:246
 AliRawReader.cxx:247
 AliRawReader.cxx:248
 AliRawReader.cxx:249
 AliRawReader.cxx:250
 AliRawReader.cxx:251
 AliRawReader.cxx:252
 AliRawReader.cxx:253
 AliRawReader.cxx:254
 AliRawReader.cxx:255
 AliRawReader.cxx:256
 AliRawReader.cxx:257
 AliRawReader.cxx:258
 AliRawReader.cxx:259
 AliRawReader.cxx:260
 AliRawReader.cxx:261
 AliRawReader.cxx:262
 AliRawReader.cxx:263
 AliRawReader.cxx:264
 AliRawReader.cxx:265
 AliRawReader.cxx:266
 AliRawReader.cxx:267
 AliRawReader.cxx:268
 AliRawReader.cxx:269
 AliRawReader.cxx:270
 AliRawReader.cxx:271
 AliRawReader.cxx:272
 AliRawReader.cxx:273
 AliRawReader.cxx:274
 AliRawReader.cxx:275
 AliRawReader.cxx:276
 AliRawReader.cxx:277
 AliRawReader.cxx:278
 AliRawReader.cxx:279
 AliRawReader.cxx:280
 AliRawReader.cxx:281
 AliRawReader.cxx:282
 AliRawReader.cxx:283
 AliRawReader.cxx:284
 AliRawReader.cxx:285
 AliRawReader.cxx:286
 AliRawReader.cxx:287
 AliRawReader.cxx:288
 AliRawReader.cxx:289
 AliRawReader.cxx:290
 AliRawReader.cxx:291
 AliRawReader.cxx:292
 AliRawReader.cxx:293
 AliRawReader.cxx:294
 AliRawReader.cxx:295
 AliRawReader.cxx:296
 AliRawReader.cxx:297
 AliRawReader.cxx:298
 AliRawReader.cxx:299
 AliRawReader.cxx:300
 AliRawReader.cxx:301
 AliRawReader.cxx:302
 AliRawReader.cxx:303
 AliRawReader.cxx:304
 AliRawReader.cxx:305
 AliRawReader.cxx:306
 AliRawReader.cxx:307
 AliRawReader.cxx:308
 AliRawReader.cxx:309
 AliRawReader.cxx:310
 AliRawReader.cxx:311
 AliRawReader.cxx:312
 AliRawReader.cxx:313
 AliRawReader.cxx:314
 AliRawReader.cxx:315
 AliRawReader.cxx:316
 AliRawReader.cxx:317
 AliRawReader.cxx:318
 AliRawReader.cxx:319
 AliRawReader.cxx:320
 AliRawReader.cxx:321
 AliRawReader.cxx:322
 AliRawReader.cxx:323
 AliRawReader.cxx:324
 AliRawReader.cxx:325
 AliRawReader.cxx:326
 AliRawReader.cxx:327
 AliRawReader.cxx:328
 AliRawReader.cxx:329
 AliRawReader.cxx:330
 AliRawReader.cxx:331
 AliRawReader.cxx:332
 AliRawReader.cxx:333
 AliRawReader.cxx:334
 AliRawReader.cxx:335
 AliRawReader.cxx:336
 AliRawReader.cxx:337
 AliRawReader.cxx:338
 AliRawReader.cxx:339
 AliRawReader.cxx:340
 AliRawReader.cxx:341
 AliRawReader.cxx:342
 AliRawReader.cxx:343
 AliRawReader.cxx:344
 AliRawReader.cxx:345
 AliRawReader.cxx:346
 AliRawReader.cxx:347
 AliRawReader.cxx:348
 AliRawReader.cxx:349
 AliRawReader.cxx:350
 AliRawReader.cxx:351
 AliRawReader.cxx:352
 AliRawReader.cxx:353
 AliRawReader.cxx:354
 AliRawReader.cxx:355
 AliRawReader.cxx:356
 AliRawReader.cxx:357
 AliRawReader.cxx:358
 AliRawReader.cxx:359
 AliRawReader.cxx:360
 AliRawReader.cxx:361
 AliRawReader.cxx:362
 AliRawReader.cxx:363
 AliRawReader.cxx:364
 AliRawReader.cxx:365
 AliRawReader.cxx:366
 AliRawReader.cxx:367
 AliRawReader.cxx:368
 AliRawReader.cxx:369
 AliRawReader.cxx:370
 AliRawReader.cxx:371
 AliRawReader.cxx:372
 AliRawReader.cxx:373
 AliRawReader.cxx:374
 AliRawReader.cxx:375
 AliRawReader.cxx:376
 AliRawReader.cxx:377
 AliRawReader.cxx:378
 AliRawReader.cxx:379
 AliRawReader.cxx:380
 AliRawReader.cxx:381
 AliRawReader.cxx:382
 AliRawReader.cxx:383
 AliRawReader.cxx:384
 AliRawReader.cxx:385
 AliRawReader.cxx:386
 AliRawReader.cxx:387
 AliRawReader.cxx:388
 AliRawReader.cxx:389
 AliRawReader.cxx:390
 AliRawReader.cxx:391
 AliRawReader.cxx:392
 AliRawReader.cxx:393
 AliRawReader.cxx:394
 AliRawReader.cxx:395
 AliRawReader.cxx:396
 AliRawReader.cxx:397
 AliRawReader.cxx:398
 AliRawReader.cxx:399
 AliRawReader.cxx:400
 AliRawReader.cxx:401
 AliRawReader.cxx:402
 AliRawReader.cxx:403
 AliRawReader.cxx:404
 AliRawReader.cxx:405
 AliRawReader.cxx:406
 AliRawReader.cxx:407
 AliRawReader.cxx:408
 AliRawReader.cxx:409
 AliRawReader.cxx:410
 AliRawReader.cxx:411
 AliRawReader.cxx:412
 AliRawReader.cxx:413
 AliRawReader.cxx:414
 AliRawReader.cxx:415
 AliRawReader.cxx:416
 AliRawReader.cxx:417
 AliRawReader.cxx:418
 AliRawReader.cxx:419
 AliRawReader.cxx:420
 AliRawReader.cxx:421
 AliRawReader.cxx:422
 AliRawReader.cxx:423
 AliRawReader.cxx:424
 AliRawReader.cxx:425
 AliRawReader.cxx:426
 AliRawReader.cxx:427
 AliRawReader.cxx:428
 AliRawReader.cxx:429
 AliRawReader.cxx:430
 AliRawReader.cxx:431
 AliRawReader.cxx:432
 AliRawReader.cxx:433
 AliRawReader.cxx:434
 AliRawReader.cxx:435
 AliRawReader.cxx:436
 AliRawReader.cxx:437
 AliRawReader.cxx:438
 AliRawReader.cxx:439
 AliRawReader.cxx:440
 AliRawReader.cxx:441
 AliRawReader.cxx:442
 AliRawReader.cxx:443
 AliRawReader.cxx:444
 AliRawReader.cxx:445
 AliRawReader.cxx:446
 AliRawReader.cxx:447
 AliRawReader.cxx:448
 AliRawReader.cxx:449
 AliRawReader.cxx:450
 AliRawReader.cxx:451
 AliRawReader.cxx:452
 AliRawReader.cxx:453
 AliRawReader.cxx:454
 AliRawReader.cxx:455
 AliRawReader.cxx:456
 AliRawReader.cxx:457
 AliRawReader.cxx:458
 AliRawReader.cxx:459
 AliRawReader.cxx:460
 AliRawReader.cxx:461
 AliRawReader.cxx:462
 AliRawReader.cxx:463
 AliRawReader.cxx:464
 AliRawReader.cxx:465
 AliRawReader.cxx:466
 AliRawReader.cxx:467
 AliRawReader.cxx:468
 AliRawReader.cxx:469
 AliRawReader.cxx:470
 AliRawReader.cxx:471
 AliRawReader.cxx:472
 AliRawReader.cxx:473
 AliRawReader.cxx:474
 AliRawReader.cxx:475
 AliRawReader.cxx:476
 AliRawReader.cxx:477
 AliRawReader.cxx:478
 AliRawReader.cxx:479
 AliRawReader.cxx:480
 AliRawReader.cxx:481
 AliRawReader.cxx:482
 AliRawReader.cxx:483
 AliRawReader.cxx:484
 AliRawReader.cxx:485
 AliRawReader.cxx:486
 AliRawReader.cxx:487
 AliRawReader.cxx:488
 AliRawReader.cxx:489
 AliRawReader.cxx:490
 AliRawReader.cxx:491
 AliRawReader.cxx:492
 AliRawReader.cxx:493
 AliRawReader.cxx:494
 AliRawReader.cxx:495
 AliRawReader.cxx:496
 AliRawReader.cxx:497
 AliRawReader.cxx:498
 AliRawReader.cxx:499
 AliRawReader.cxx:500
 AliRawReader.cxx:501
 AliRawReader.cxx:502
 AliRawReader.cxx:503
 AliRawReader.cxx:504
 AliRawReader.cxx:505
 AliRawReader.cxx:506
 AliRawReader.cxx:507
 AliRawReader.cxx:508
 AliRawReader.cxx:509
 AliRawReader.cxx:510
 AliRawReader.cxx:511
 AliRawReader.cxx:512
 AliRawReader.cxx:513
 AliRawReader.cxx:514
 AliRawReader.cxx:515
 AliRawReader.cxx:516
 AliRawReader.cxx:517
 AliRawReader.cxx:518
 AliRawReader.cxx:519
 AliRawReader.cxx:520
 AliRawReader.cxx:521
 AliRawReader.cxx:522
 AliRawReader.cxx:523
 AliRawReader.cxx:524
 AliRawReader.cxx:525
 AliRawReader.cxx:526
 AliRawReader.cxx:527
 AliRawReader.cxx:528
 AliRawReader.cxx:529
 AliRawReader.cxx:530
 AliRawReader.cxx:531
 AliRawReader.cxx:532
 AliRawReader.cxx:533
 AliRawReader.cxx:534
 AliRawReader.cxx:535
 AliRawReader.cxx:536
 AliRawReader.cxx:537
 AliRawReader.cxx:538
 AliRawReader.cxx:539
 AliRawReader.cxx:540
 AliRawReader.cxx:541
 AliRawReader.cxx:542
 AliRawReader.cxx:543
 AliRawReader.cxx:544
 AliRawReader.cxx:545
 AliRawReader.cxx:546
 AliRawReader.cxx:547
 AliRawReader.cxx:548
 AliRawReader.cxx:549
 AliRawReader.cxx:550
 AliRawReader.cxx:551
 AliRawReader.cxx:552
 AliRawReader.cxx:553
 AliRawReader.cxx:554
 AliRawReader.cxx:555
 AliRawReader.cxx:556
 AliRawReader.cxx:557
 AliRawReader.cxx:558
 AliRawReader.cxx:559
 AliRawReader.cxx:560
 AliRawReader.cxx:561
 AliRawReader.cxx:562
 AliRawReader.cxx:563
 AliRawReader.cxx:564
 AliRawReader.cxx:565
 AliRawReader.cxx:566
 AliRawReader.cxx:567
 AliRawReader.cxx:568
 AliRawReader.cxx:569
 AliRawReader.cxx:570
 AliRawReader.cxx:571
 AliRawReader.cxx:572
 AliRawReader.cxx:573
 AliRawReader.cxx:574
 AliRawReader.cxx:575
 AliRawReader.cxx:576
 AliRawReader.cxx:577
 AliRawReader.cxx:578
 AliRawReader.cxx:579
 AliRawReader.cxx:580
 AliRawReader.cxx:581
 AliRawReader.cxx:582
 AliRawReader.cxx:583
 AliRawReader.cxx:584
 AliRawReader.cxx:585
 AliRawReader.cxx:586
 AliRawReader.cxx:587
 AliRawReader.cxx:588
 AliRawReader.cxx:589
 AliRawReader.cxx:590
 AliRawReader.cxx:591
 AliRawReader.cxx:592
 AliRawReader.cxx:593
 AliRawReader.cxx:594
 AliRawReader.cxx:595
 AliRawReader.cxx:596
 AliRawReader.cxx:597
 AliRawReader.cxx:598
 AliRawReader.cxx:599
 AliRawReader.cxx:600
 AliRawReader.cxx:601
 AliRawReader.cxx:602
 AliRawReader.cxx:603
 AliRawReader.cxx:604
 AliRawReader.cxx:605
 AliRawReader.cxx:606
 AliRawReader.cxx:607
 AliRawReader.cxx:608
 AliRawReader.cxx:609
 AliRawReader.cxx:610
 AliRawReader.cxx:611
 AliRawReader.cxx:612
 AliRawReader.cxx:613
 AliRawReader.cxx:614
 AliRawReader.cxx:615
 AliRawReader.cxx:616
 AliRawReader.cxx:617
 AliRawReader.cxx:618
 AliRawReader.cxx:619
 AliRawReader.cxx:620
 AliRawReader.cxx:621
 AliRawReader.cxx:622
 AliRawReader.cxx:623
 AliRawReader.cxx:624
 AliRawReader.cxx:625
 AliRawReader.cxx:626
 AliRawReader.cxx:627
 AliRawReader.cxx:628
 AliRawReader.cxx:629
 AliRawReader.cxx:630
 AliRawReader.cxx:631
 AliRawReader.cxx:632
 AliRawReader.cxx:633
 AliRawReader.cxx:634
 AliRawReader.cxx:635
 AliRawReader.cxx:636
 AliRawReader.cxx:637
 AliRawReader.cxx:638
 AliRawReader.cxx:639
 AliRawReader.cxx:640
 AliRawReader.cxx:641
 AliRawReader.cxx:642
 AliRawReader.cxx:643
 AliRawReader.cxx:644
 AliRawReader.cxx:645
 AliRawReader.cxx:646
 AliRawReader.cxx:647
 AliRawReader.cxx:648
 AliRawReader.cxx:649
 AliRawReader.cxx:650
 AliRawReader.cxx:651
 AliRawReader.cxx:652
 AliRawReader.cxx:653
 AliRawReader.cxx:654
 AliRawReader.cxx:655
 AliRawReader.cxx:656
 AliRawReader.cxx:657
 AliRawReader.cxx:658
 AliRawReader.cxx:659
 AliRawReader.cxx:660
 AliRawReader.cxx:661
 AliRawReader.cxx:662
 AliRawReader.cxx:663
 AliRawReader.cxx:664
 AliRawReader.cxx:665
 AliRawReader.cxx:666
 AliRawReader.cxx:667
 AliRawReader.cxx:668
 AliRawReader.cxx:669
 AliRawReader.cxx:670
 AliRawReader.cxx:671
 AliRawReader.cxx:672
 AliRawReader.cxx:673
 AliRawReader.cxx:674
 AliRawReader.cxx:675
 AliRawReader.cxx:676
 AliRawReader.cxx:677
 AliRawReader.cxx:678
 AliRawReader.cxx:679
 AliRawReader.cxx:680
 AliRawReader.cxx:681
 AliRawReader.cxx:682
 AliRawReader.cxx:683
 AliRawReader.cxx:684
 AliRawReader.cxx:685
 AliRawReader.cxx:686
 AliRawReader.cxx:687
 AliRawReader.cxx:688
 AliRawReader.cxx:689
 AliRawReader.cxx:690
 AliRawReader.cxx:691
 AliRawReader.cxx:692
 AliRawReader.cxx:693
 AliRawReader.cxx:694
 AliRawReader.cxx:695
 AliRawReader.cxx:696
 AliRawReader.cxx:697
 AliRawReader.cxx:698
 AliRawReader.cxx:699
 AliRawReader.cxx:700
 AliRawReader.cxx:701
 AliRawReader.cxx:702
 AliRawReader.cxx:703
 AliRawReader.cxx:704
 AliRawReader.cxx:705
 AliRawReader.cxx:706
 AliRawReader.cxx:707
 AliRawReader.cxx:708
 AliRawReader.cxx:709
 AliRawReader.cxx:710
 AliRawReader.cxx:711
 AliRawReader.cxx:712
 AliRawReader.cxx:713
 AliRawReader.cxx:714
 AliRawReader.cxx:715
 AliRawReader.cxx:716
 AliRawReader.cxx:717
 AliRawReader.cxx:718
 AliRawReader.cxx:719
 AliRawReader.cxx:720
 AliRawReader.cxx:721
 AliRawReader.cxx:722
 AliRawReader.cxx:723
 AliRawReader.cxx:724
 AliRawReader.cxx:725
 AliRawReader.cxx:726
 AliRawReader.cxx:727
 AliRawReader.cxx:728
 AliRawReader.cxx:729
 AliRawReader.cxx:730
 AliRawReader.cxx:731
 AliRawReader.cxx:732
 AliRawReader.cxx:733
 AliRawReader.cxx:734
 AliRawReader.cxx:735
 AliRawReader.cxx:736
 AliRawReader.cxx:737
 AliRawReader.cxx:738
 AliRawReader.cxx:739
 AliRawReader.cxx:740
 AliRawReader.cxx:741
 AliRawReader.cxx:742
 AliRawReader.cxx:743
 AliRawReader.cxx:744
 AliRawReader.cxx:745
 AliRawReader.cxx:746
 AliRawReader.cxx:747
 AliRawReader.cxx:748
 AliRawReader.cxx:749
 AliRawReader.cxx:750
 AliRawReader.cxx:751
 AliRawReader.cxx:752
 AliRawReader.cxx:753
 AliRawReader.cxx:754
 AliRawReader.cxx:755
 AliRawReader.cxx:756
 AliRawReader.cxx:757
 AliRawReader.cxx:758
 AliRawReader.cxx:759
 AliRawReader.cxx:760
 AliRawReader.cxx:761
 AliRawReader.cxx:762
 AliRawReader.cxx:763
 AliRawReader.cxx:764
 AliRawReader.cxx:765
 AliRawReader.cxx:766
 AliRawReader.cxx:767
 AliRawReader.cxx:768
 AliRawReader.cxx:769
 AliRawReader.cxx:770
 AliRawReader.cxx:771
 AliRawReader.cxx:772
 AliRawReader.cxx:773
 AliRawReader.cxx:774
 AliRawReader.cxx:775
 AliRawReader.cxx:776
 AliRawReader.cxx:777
 AliRawReader.cxx:778
 AliRawReader.cxx:779
 AliRawReader.cxx:780
 AliRawReader.cxx:781
 AliRawReader.cxx:782
 AliRawReader.cxx:783
 AliRawReader.cxx:784
 AliRawReader.cxx:785
 AliRawReader.cxx:786
 AliRawReader.cxx:787
 AliRawReader.cxx:788
 AliRawReader.cxx:789
 AliRawReader.cxx:790
 AliRawReader.cxx:791
 AliRawReader.cxx:792
 AliRawReader.cxx:793
 AliRawReader.cxx:794
 AliRawReader.cxx:795
 AliRawReader.cxx:796
 AliRawReader.cxx:797
 AliRawReader.cxx:798
 AliRawReader.cxx:799
 AliRawReader.cxx:800
 AliRawReader.cxx:801
 AliRawReader.cxx:802
 AliRawReader.cxx:803
 AliRawReader.cxx:804
 AliRawReader.cxx:805
 AliRawReader.cxx:806
 AliRawReader.cxx:807
 AliRawReader.cxx:808
 AliRawReader.cxx:809
 AliRawReader.cxx:810
 AliRawReader.cxx:811
 AliRawReader.cxx:812
 AliRawReader.cxx:813
 AliRawReader.cxx:814
 AliRawReader.cxx:815
 AliRawReader.cxx:816
 AliRawReader.cxx:817
 AliRawReader.cxx:818
 AliRawReader.cxx:819
 AliRawReader.cxx:820
 AliRawReader.cxx:821
 AliRawReader.cxx:822
 AliRawReader.cxx:823
 AliRawReader.cxx:824
 AliRawReader.cxx:825
 AliRawReader.cxx:826
 AliRawReader.cxx:827
 AliRawReader.cxx:828