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   testAliHLTCTPData.C
    @author Matthias Richter
    @date   
    @brief  Test program for the AliHLTCTPData class
 */

#ifndef __CINT__
#include "TDatime.h"
#include "TRandom.h"
#include "AliHLTDataTypes.h"
#include "algorithm"
#include "TObjArray.h"
#include "TObjString.h"
#include "TString.h"
#include "AliHLTDAQ.h"
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cerrno>
#include "AliHLTCTPData.h"
#include "AliHLTReadoutList.h"
#endif

using namespace std;

class AliHLTCTPDataTest {
public:
  AliHLTCTPDataTest() {}
  ~AliHLTCTPDataTest() {}

  class AliHLTCTPTriggerClass {
  public:
    AliHLTCTPTriggerClass() : fBit(~(unsigned)0), fClassName(""), fTrigger(false), fDetectorParam(), fDetectors() {}
    ~AliHLTCTPTriggerClass() {}

    bool        Valid() {return fBit!=~(unsigned)0;}
    unsigned    Bit() {return fBit;}
    void        Bit(unsigned bit) {fBit=bit;}
    bool        Trigger() {return fTrigger;}
    void        Trigger(bool trigger) {fTrigger=trigger;}
    const char* ClassName() {return fClassName.c_str();}
    void        ClassName(const char* classname) {fClassName=classname;}
    const char* DetectorParam() {
      if (fDetectorParam.IsNull() && fDetectors.size()>0) {
	for (unsigned  i=0; i<fDetectors.size(); i++) {
	  if (!fDetectorParam.IsNull()) fDetectorParam+="-";
	  if (fDetectors[i]<10) fDetectorParam+="0";
	  fDetectorParam+=fDetectors[i];
	}
      }
      return fDetectorParam.Data();
    }
    void        DetectorParam(const char* detectorparam) {fDetectorParam=detectorparam;}
    int         AddDetector(unsigned short detector) {
      fDetectorParam.Clear();
      for (vector<unsigned short>::iterator element=fDetectors.begin();
	   element!=fDetectors.end(); element++) {
	if (detector<*element) {
	  fDetectors.insert(element, detector);
	  return 0;
	}
      }
      fDetectors.push_back(detector);
      return 0;
    }
    bool        HasDetector(int detector) const {
      for (unsigned i=0; i<fDetectors.size(); i++) {
	if (fDetectors[i]==detector) {
	  return true;
	}
      }
      return false;
    }
    bool        HasDetector(const char* id) const {
      TString detectorid=id;
      for (unsigned i=0; i<fDetectors.size(); i++) {
	if (detectorid.CompareTo(AliHLTDAQ::OnlineName(fDetectors[i]))==0) {
	  return true;
	}
      }
      return false;
    }

  private:
    unsigned fBit;
    string   fClassName;
    bool     fTrigger;
    TString  fDetectorParam;
    vector<unsigned short> fDetectors;
  };

protected:
private:
};

class AliHLTTriggerDataAccess
{
public:
  AliHLTTriggerDataAccess()
    : fData(NULL)
    , fEventData(NULL)
    , fCDH(NULL)
    , fMine(NULL)
  {
    unsigned size=sizeof(AliHLTComponentTriggerData) + sizeof(AliHLTEventTriggerData);
    fMine=new Byte_t[size];
    memset(fMine, 0, size);
    AliHLTComponentTriggerData* data=reinterpret_cast<AliHLTComponentTriggerData*>(fMine);
    data->fStructSize=sizeof(AliHLTComponentTriggerData);
    data->fData=fMine+sizeof(AliHLTComponentTriggerData);
    Set(data);
  }

  AliHLTTriggerDataAccess(AliHLTComponentTriggerData* pData)
    : fData(NULL)
    , fEventData(NULL)
    , fCDH(NULL)
    , fMine(NULL)
  {
    if (fMine) delete [] fMine;
    fMine=NULL;
    Set(pData);
  }

  ~AliHLTTriggerDataAccess(){
    if (fMine) delete [] fMine;
    fMine=NULL;
    fData=NULL;
    fEventData=NULL;
    fCDH=NULL;
  }

  AliHLTComponentTriggerData* Data() {return fData;}

  Long64_t              TriggerMask() {
    Long64_t mask=0;
    if (fCDH) {
      mask=fCDH[6];
      mask<<=32;
      mask|=fCDH[5];
    }
    return mask;
  }

  int Set(AliHLTComponentTriggerData* data) {
    fData=data;
    fData->fDataSize=sizeof(AliHLTEventTriggerData);
    fEventData=reinterpret_cast<AliHLTEventTriggerData*>(fData->fData);
    fEventData->fCommonHeaderWordCnt=gkAliHLTCommonHeaderCount;
    fCDH=fEventData->fCommonHeader;
    return 0;
  }

  int ResetCDH() {
    if (fCDH) {
      memset(fCDH, 0, 32);
    }
    return 0;
  }

  int TriggerBit(unsigned bit, bool set) {
    if ((int)bit>=gkNCTPTriggerClasses) return -EINVAL;
    if (!fCDH) return -ENODATA;

    int word=5;
    if (bit>=32) {
      word++;
      bit-=32;
    }
    if (set)
      fCDH[word]|=(UInt_t)0x1<<bit;
    else
      fCDH[word]&=~((UInt_t)0x1<<bit);
      
    return bit;
  }

private:
  AliHLTTriggerDataAccess(const AliHLTTriggerDataAccess&);
  AliHLTTriggerDataAccess& operator=(const AliHLTTriggerDataAccess&);

  AliHLTComponentTriggerData* fData;
  AliHLTEventTriggerData*     fEventData;
  AliHLTUInt32_t*             fCDH;
  Byte_t*                     fMine;
};

/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//
// setup of the CTP test

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

/**
 * Generate a random name of given length
 */
string GenerateTriggerClassName(int length)
{
  string tcn;
  bool toggle=false;
  for (int i=0; i<length; i++) {
    // add random number of '-' characters, but not at beginning or end
    if (i>0 && i<length-1 && GetRandom(5,10)==7 && (toggle=(!toggle))) {
      tcn+='-';
      continue;
    }
    unsigned char c=GetRandom(48, 83);
    if (c>57) c+=7;
    tcn+=c;
  }
  return tcn;
}

/**
 * Generate an array of trigger classes.
 * The array has the specified size but the number antries which are actually
 * filled is randomized.
 */
int GenerateTriggerClasses(int size, vector<AliHLTCTPDataTest::AliHLTCTPTriggerClass>& classes)
{
  classes.clear();
  classes.resize(size);
  unsigned count=GetRandom(4, size>16?size/2:size);
  int last=-1;
  for (unsigned i=0; i<count; i++) {
    int bit=0;
    do {
      bit=GetRandom(0, size);
    } while (classes[bit].Valid());
    classes[bit].Bit(bit);
    if (last>=0 && GetRandom(5,10)==7) {
      // generate similar class names by just adding or truncating characters
      string name=classes[last].ClassName();
      if (GetRandom(0,100)%2) {
	name+=GenerateTriggerClassName(GetRandom(3,7)).c_str();
	cout << "using appended name " << name << " (" << classes[last].ClassName() << ")" << endl;
      } else {
	int num=GetRandom(1,name.length()/2);
	name.erase(name.length()-num, num);
	cout << "using truncated name " << name << " (" << classes[last].ClassName() << ")" << endl;
      }
      classes[bit].ClassName(name.c_str());
    } else {
    classes[bit].ClassName((GenerateTriggerClassName(GetRandom(5,15))).c_str());
    }
    last=bit;
    unsigned nofdetectors=GetRandom(1, 10);
    unsigned short detector=17;
    for (unsigned k=0; k<nofdetectors; k++) {
      detector=GetRandom(nofdetectors-k-1, detector-1);
      classes[bit].AddDetector(detector);
    }
  }
  return classes.size();
}

/**
 * Test the CTP trigger tools
 * The base class is initialized with an ECS string of randomly defined trigger
 * classes consisting of random bits and names. Than a couple of expressions is
 * test for various random bit patterns.
 */
int testAliHLTCTPData()
{
  cout << "checking AliHLTCTPData class" << endl;
  int iResult=0;
  vector<AliHLTCTPDataTest::AliHLTCTPTriggerClass> triggerClasses;
  if (GenerateTriggerClasses(GetRandom(5,gkNCTPTriggerClasses), triggerClasses)<=0) {
    return -1;
  }

  TString ecs_parameter="CONFIGURE";
  TString ctp_parameter="CTP_TRIGGER_CLASS=";
  vector<AliHLTCTPDataTest::AliHLTCTPTriggerClass>::iterator element=triggerClasses.begin();
  while (element!=triggerClasses.end()) {
    if (!element->Valid()) {
      element=triggerClasses.erase(element);
      continue;
    }
    if (!ctp_parameter.EndsWith("=")) ctp_parameter+=",";
    if (element->Bit()<10) ctp_parameter+="0";
    ctp_parameter+=element->Bit(); 
    ctp_parameter+=":";
    ctp_parameter+=element->ClassName(); ctp_parameter+=":";
    ctp_parameter+=element->DetectorParam();
    element++;
  }

  vector<const char*> parameters;
  parameters.push_back("HLT_MODE=B");
  parameters.push_back("RUN_NO=0");
  parameters.push_back(ctp_parameter.Data());
  random_shuffle(parameters.begin(), parameters.end());
  for (vector<const char*>::iterator par=parameters.begin();
       par!=parameters.end(); par++) {
    ecs_parameter+=";";
    ecs_parameter+=*par;
  }

  AliHLTCTPData ctpdata;
  ctpdata.SetGlobalLoggingLevel(kHLTLogDefault);
  if ((iResult=ctpdata.InitCTPTriggerClasses(ctp_parameter.Data()))<0) {
    cerr << "InitCTPTriggerClasses failed :" << iResult << endl;
    return iResult;
  }

  for (element=triggerClasses.begin();
       element!=triggerClasses.end();
       element++) {
    int index=ctpdata.Index(element->ClassName());
    if (index<0) {
      cerr << "error: can not find CTP trigger class name " << element->ClassName() << endl;
      return -1;
    }
    if (element->Bit()!=(unsigned)index) {
      cerr << "error: wrong index for CTP trigger class " << element->ClassName() << ": expected " << element->Bit() << " - got " << index << endl;
      return -1;      
    }
  }

  AliHLTTriggerDataAccess trigData;

  // check the readout lists for the different trigger classes
  for (element=triggerClasses.begin();
       element!=triggerClasses.end(); element++) {
    trigData.ResetCDH();
    trigData.TriggerBit(element->Bit(), 1);
    AliHLTReadoutList detectorReadout(ctpdata.ReadoutList(*trigData.Data()));
    for (int detectorid=0; detectorid<17; detectorid++) {
	if ((detectorReadout.DetectorEnabled(0x1<<detectorid) && !element->HasDetector(detectorid)) ||
	    (!detectorReadout.DetectorEnabled(0x1<<detectorid) && element->HasDetector(detectorid))) {
	  cerr << "readout list does not match trigger class " << element->Bit() << ":" << element->ClassName() << ":" << element->DetectorParam() << endl;
	  detectorReadout.Print();
	  return -1;
	}
     }
  }

  const int nofCycles=500;
  for (int cycle=0; cycle<nofCycles && iResult>=0; cycle++) {
    bool bHaveTrigger=false;
    for (element=triggerClasses.begin();
	 element!=triggerClasses.end(); element++) {
      element->Trigger(GetRandom(0,100)>50);
      bHaveTrigger|=element->Trigger();
    }
    if (!bHaveTrigger) {
      // trigger at least one class
      (triggerClasses.begin())->Trigger(1);
    }

    vector<AliHLTCTPDataTest::AliHLTCTPTriggerClass> shuffle;
    shuffle.assign(triggerClasses.begin(), triggerClasses.end());
    for (unsigned int trial=0; trial<2*triggerClasses.size() && iResult>=0; trial++) {
      random_shuffle(shuffle.begin(), shuffle.end());

      bool result=0;
      bool trigger=0;
      TString expression;
      trigData.ResetCDH();
      for (element=shuffle.begin();
	   element!=shuffle.end(); element++) {
	trigData.TriggerBit(element->Bit(), element->Trigger());
	//cout << " " << element->Bit() << ":" << element->Trigger();
      }
      //cout << endl;
      ctpdata.SetTriggers(*(trigData.Data()));

      // single class
      for (element=shuffle.begin();
	   element!=shuffle.end() && iResult>=0 && trial<3;
	   element++) {
	int check=ctpdata.CheckTrigger(element->ClassName());
	if (check<0) {
	  cerr << "error avaluating CheckTrigger: class name " << element->ClassName() << " not found" << endl;
	  iResult=-1;
	  break;	  
	}
	if (check!=element->Trigger()) {
	  cerr << "error avaluating CheckTrigger, class name " << element->ClassName() << ": expecting " << element->Trigger() << " - got " << check << endl;
	  ctpdata.Print();
	  iResult=-1;
	  break;	  
	}

	// is
	result=element->Trigger();
	expression=element->ClassName();
	trigger=ctpdata.EvaluateCTPTriggerClass(expression.Data(), *trigData.Data());
	if (trigger!=result) {
	  cout << expression << ": " << element->Trigger()
	       << "->" << trigger 
	       << std::hex << "   (" << trigData.TriggerMask() << ")"
	       << endl;
	  cerr << "trigger does not match, expected " << result << endl;
	  iResult=-1;
	  break;
	}

	// is not
	expression="!";
	expression+=element->ClassName();
	result=!result;
	trigger=ctpdata.EvaluateCTPTriggerClass(expression.Data(), *trigData.Data());
	if (trigger!=result) {
	  cout << expression << ": " << element->Trigger()
	       << "->" << trigger 
	       << std::hex << "   (" << trigData.TriggerMask() << ")"
	       << endl;
	  cerr << "trigger does not match, expected " << result << endl;
	  iResult=-1;
	  break;
	}
      }

      // OR
      result=shuffle[0].Trigger() || shuffle[1].Trigger() || shuffle[2].Trigger();
      expression.Form("%s || %s || %s",
		      shuffle[0].ClassName(), shuffle[1].ClassName(), shuffle[2].ClassName());
      trigger=ctpdata.EvaluateCTPTriggerClass(expression.Data(), *trigData.Data());
      if (trigger!=result) {
	cout << expression << ": " << shuffle[0].Trigger() << shuffle[1].Trigger() << shuffle[2].Trigger() 
	     << "->" << trigger 
	     << std::hex << "   (" << trigData.TriggerMask() << ")"
	     << endl;
	cerr << "trigger does not match, expected " << result << endl;
	iResult=-1;
	break;
      }

      // AND
      result=shuffle[0].Trigger() && shuffle[1].Trigger() && shuffle[2].Trigger();
      expression.Form("%s && %s && %s",
		      shuffle[0].ClassName(), shuffle[1].ClassName(), shuffle[2].ClassName());

      trigger=ctpdata.EvaluateCTPTriggerClass(expression.Data(), *trigData.Data());
      if (trigger!=result) {
	cout << expression << ": " << shuffle[0].Trigger() << shuffle[1].Trigger() << shuffle[2].Trigger() 
	     << "->" << trigger 
	     << std::hex << "   (" << trigData.TriggerMask() << ")"
	     << endl;
	cerr << "trigger does not match, expected " << result << endl;
	iResult=-1;
	break;
      }

      // mixed OR/AND
      result=shuffle[0].Trigger() && (shuffle[1].Trigger() || shuffle[2].Trigger());
      expression.Form("%s && (%s || %s)",
		      shuffle[0].ClassName(), shuffle[1].ClassName(), shuffle[2].ClassName());

      trigger=ctpdata.EvaluateCTPTriggerClass(expression.Data(), *trigData.Data());
      if (trigger!=result) {
	cout << expression << ": " << shuffle[0].Trigger() << shuffle[1].Trigger() << shuffle[2].Trigger() 
	     << "->" << trigger 
	     << std::hex << "   (" << trigData.TriggerMask() << ")"
	     << endl;
	cerr << "trigger does not match, expected " << result << endl;
	iResult=-1;
	break;
      }
    }
    // readout list
    AliHLTReadoutList detectorReadout(ctpdata.ReadoutList(*trigData.Data()));
    for (int detectorid=0; detectorid<17 && iResult>=0; detectorid++) {
	if (detectorReadout.DetectorEnabled(0x1<<detectorid)) {
	// detector is included in the readout, find at least one active trigger
	// class with this detector
	for (element=triggerClasses.begin();
	     element!=triggerClasses.end(); element++) {
	  if (element->Trigger() && element->HasDetector(detectorid)) break;
	}
	if (element==triggerClasses.end()) {
	  cerr << "can not find any active trigger class for detector " << detectorid << " enabled in the readout" << endl;
	  iResult=-1;
	}
      } else {
	// check that this detector is not part of any of the active trigger classes
	for (element=triggerClasses.begin();
	     element!=triggerClasses.end(); element++) {
	  if (element->Trigger() && element->HasDetector(detectorid)) {
	    cerr << "detector " << detectorid << " not enabled in the readout but enabled in active trigger class " << element->ClassName() << endl;
	    iResult=-1;
	  }
	}
      }
      if (iResult<0) {
	detectorReadout.Print();
      }
    }
    if ((cycle+1)%(nofCycles/5)==0) cout << " " << (100*(cycle+1))/nofCycles << " % done" << endl;
  }

  if (iResult<0) {
    cerr << "check failed, dumping info" << endl;
    cerr << "CTP param: " << ctp_parameter << endl;
    for (element=triggerClasses.begin();
	 element!=triggerClasses.end(); element++) {
      cerr << element->Trigger() << " " << element->Bit() << ": " << element->ClassName() << endl;
    }
  }
  return iResult;
}

/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//
// main functions

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