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   testAliHLTComponent.C
// @author Matthias Richter
// @date   
// @brief  Test program for the AliHLTComponent base class
// 

#ifndef __CINT__
#include "TDatime.h"
#include "TRandom.h"
#include "AliHLTDataTypes.h"
#include "AliHLTProcessor.h"
#include "AliHLTPluginBase.h"
#include "AliHLTSystem.h"
#include "AliHLTMisc.h"
#include "AliHLTComponentHandler.h"
#include "AliHLTConfiguration.h"
#include "algorithm"
#include "TObjArray.h"
#include "TObjString.h"
#include "TString.h"
#endif

using namespace std;

class AliHLTTestComponent : public AliHLTProcessor
{
public:
  AliHLTTestComponent() :
    fArguments(),
    fCurrentArgument(fArguments.begin())
  {}

  ~AliHLTTestComponent() {}

  const char* GetComponentID() {return "TestComponent";};
  void GetInputDataTypes(AliHLTComponentDataTypeList& list) {list.clear();}
  AliHLTComponentDataType GetOutputDataType() {return kAliHLTAnyDataType;}
  void GetOutputDataSize(unsigned long& constBase, double& inputMultiplier) {constBase=0; inputMultiplier=0;}
  AliHLTComponent* Spawn() {return new AliHLTTestComponent;}

  class AliHLTConfigurationArgument {
  public:
    AliHLTConfigurationArgument(const char* argument) :
      fElements(NULL)
    {
      TString work=argument;
      fElements=work.Tokenize(" ");
    }

    AliHLTConfigurationArgument(const AliHLTConfigurationArgument& src) :
      fElements(NULL)
    {
      if (src.fElements) {
	fElements=dynamic_cast<TObjArray*>(src.fElements->Clone());
      }
    }

    ~AliHLTConfigurationArgument() {
      if (fElements) delete fElements;
    }

    AliHLTConfigurationArgument& operator=(const AliHLTConfigurationArgument& src) {
      delete fElements;
      if (src.fElements) {
	fElements=dynamic_cast<TObjArray*>(src.fElements->Clone());
      }
      return *this;
    }

    const char* Argument() {
      if (!fElements) return NULL;
      return ((TObjString*)fElements->At(0))->GetString().Data();
    }

    int NofParameters() {
      if (!fElements) return 0;
      return fElements->GetEntriesFast()-1;
    }

    const char* Parameter(int i) {
      if (!fElements ||
	  fElements->GetEntriesFast()<=i+1) return NULL;
      return ((TObjString*)fElements->At(i+1))->GetString().Data();      
    }

    bool operator==(const char* string) {
      if (!fElements) return 0;
      return (((TObjString*)fElements->At(0))->GetString().CompareTo(string))==0;
    }

    bool operator!=(const char* string) {
      return !operator==(string);
    }

    void Print() {
      if (!fElements) {
	cout << "#############  empty ############" << endl;
	return;
      }
      cout << "   Print: " << Argument() << " with " << NofParameters() << " parameter(s)";
      for (int n=0; n<NofParameters(); n++) cout << " " << Parameter(n);
      cout << endl;
    }

  private:
    TObjArray* fElements;
  };

  int ScanConfigurationArgument(int argc, const char** argv) {
    if (fCurrentArgument==fArguments.end()) return 0;
    int count=0;

    // check whether it is an argument at all
    if (*(argv[count])!='-') {
      cerr << "not a recognized argument: " << argv[count] << endl;
      return -EINVAL;
    }

    // check whether the argument matches
    //fCurrentArgument->Print();
    if (*fCurrentArgument!=argv[count]) {
      cerr << "argument sequence does not match: got " << argv[count] << "  expected " << fCurrentArgument->Argument() << endl;
      return -EINVAL;
    }

    count++;
    // read parameters
    if (fCurrentArgument->NofParameters()>0) {
      if (argc<=count) {
	cerr << "missing parameter" << endl;
	return -EPROTO;
      }

      // implement more checks here
      count+=fCurrentArgument->NofParameters();
    }
    fCurrentArgument++;
    return count;
  }

  int FillArgumentVector(const char** arguments, vector<AliHLTConfigurationArgument>& list) {
    list.clear();
    for (const char** iter=arguments; *iter!=NULL; iter++) {
      list.push_back(AliHLTConfigurationArgument(*iter));
    }
    return list.size();
  }

  int FillArgv(vector<AliHLTConfigurationArgument>& list, vector<const char*>& argv) {
    argv.clear();
    for (vector<AliHLTConfigurationArgument>::iterator argument=list.begin();
	 argument!=list.end(); argument++) {
      argv.push_back(argument->Argument());
      for (int n=0; n<argument->NofParameters(); n++) {
	argv.push_back(argument->Parameter(n));
      }
    }
    return argv.size();
  }

  void PrintArgv(int argc, const char** argv) {
    for (int n=0; n<argc; n++) {
      cout << "   " << n << " : " << argv[n] << endl;
    }
  }

  int CheckSequence(const char* sequence[], int mode=0) {
    int iResult=0;
    if ((iResult=FillArgumentVector(sequence, fArguments))<0) {
      cerr << "failed to fill argument vector" << endl;
      return iResult;
    }
    vector<const char*> argv;
    if (mode==0) {
      if ((iResult=FillArgv(fArguments, argv))<0) {
	cerr << "failed to fill argument array" << endl;
	return iResult;
      }
    } else {
      for (const char** element=sequence; *element!=NULL; element++)
	argv.push_back(*element);
    }
    fCurrentArgument=fArguments.begin();
    //PrintArgv(argv.size(), &argv[0]);
    if ((iResult=ConfigureFromArgumentString(argv.size(), &argv[0]))<0) {
      cerr << "ConfigureFromArgumentString failed " << endl;
      return iResult;
    }

    return iResult;
  }

  int CheckConfigure() {
    int iResult=0;
    const char* sequence1[]={"-sequence1","-argument2 5", NULL};
    if ((iResult=CheckSequence(sequence1))<0) {
      cerr << "failed checking sequence " << sequence1[0] << endl;
      return iResult;
    }

    const char* sequence2[]={"-sequence2","-argument2 5 8", "-argument3 test", NULL};
    if ((iResult=CheckSequence(sequence2))<0) {
      cerr << "failed checking sequence in mode 0: " << sequence2[0] << endl;
      return iResult;
    }

    if ((iResult=CheckSequence(sequence2, 1))<0) {
      cerr << "failed checking sequence in mode 1: " << sequence2[0] << endl;
      return iResult;
    }

    const char* sequence3[]={"-solenoidBz 5", NULL};
    if ((iResult=CheckSequence(sequence3))<0) {
      cerr << "failed checking sequence " << sequence3[0] << endl;
      return iResult;
    }
    return iResult;
  }

  int InitCTPTest(const char* param) {
    // this quick test needs to be the functions of the base class to be
    // defined 'protected'
    SetupCTPData();
    //return ScanECSParam(param);
    //return InitCTPTriggerClasses(param);
    return -ENOSYS;
  }

  bool CheckCTP(const char* expression, AliHLTComponentTriggerData* data) {
    return EvaluateCTPTriggerClass(expression, *data);
  }

  class AliHLTCTPTriggerClass {
  public:
    AliHLTCTPTriggerClass() : fBit(~(unsigned)0), fClassName(""), fTrigger(false) {}
    ~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;}    
  private:
    unsigned fBit;
    string   fClassName;
    bool     fTrigger;
  };
protected:
  int DoInit(int /*argc*/, const char** /*argv*/) {
    SetupCTPData();
    return 0;
  }

  int DoDeinit() {
    return 0;
  }

  int DoEvent( const AliHLTComponentEventData& /*evtData*/,
	       AliHLTComponentTriggerData& /*trigData*/) {
    if (!IsDataEvent()) return 0;

    cout << "DoEvent: run no " << GetRunNo() << endl;
    if ((int)GetRunNo()!=AliHLTMisc::Instance().GetCDBRunNo()) {
      return -1;
    }
    return 0;
  }
private:
  vector<AliHLTConfigurationArgument> fArguments;
  vector<AliHLTConfigurationArgument>::iterator fCurrentArgument;
};

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->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);
    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;
  for (int i=0; i<length; i++) {
    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<AliHLTTestComponent::AliHLTCTPTriggerClass>& classes)
{
  classes.clear();
  classes.resize(size);
  unsigned count=GetRandom(4, size>16?size/2:size);
  for (unsigned i=0; i<count; i++) {
    int bit=0;
    do {
      bit=GetRandom(0, size);
    } while (classes[bit].Valid());
    classes[bit].Bit(bit);
    classes[bit].ClassName((GenerateTriggerClassName(GetRandom(5,15))).c_str());
  }
  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 testCTPTrigger()
{
  cout << "checking CTP functionality of the base class" << endl;
  int iResult=0;
  vector<AliHLTTestComponent::AliHLTCTPTriggerClass> triggerClasses;
  if (GenerateTriggerClasses(GetRandom(5,gkNCTPTriggerClasses), triggerClasses)<=0) {
    return -1;
  }

  TString parameter="CONFIGURE;CTP_TRIGGER_CLASS=";
  vector<AliHLTTestComponent::AliHLTCTPTriggerClass>::iterator element=triggerClasses.begin();
  while (element!=triggerClasses.end()) {
    if (!element->Valid()) {
      element=triggerClasses.erase(element);
      continue;
    }
    if (!parameter.EndsWith("=")) parameter+=",";
    if (element->Bit()<10) parameter+="0";
    parameter+=element->Bit(); 
    parameter+=":";
    parameter+=element->ClassName(); parameter+=":";
    parameter+="05-01-06"; // just a test pattern for the detector ids, ignored for the moment
    element++;
  }
  parameter+=";HLT_MODE=A;RUN_NO=0";

  AliHLTTestComponent component;
  component.SetGlobalLoggingLevel(kHLTLogDefault);
  if ((iResult=component.InitCTPTest(parameter.Data()))<0) {
    cerr << "InitCTPTest failed :" << iResult << endl;
    return iResult;
  }
  cout << "init ECS parameter: " << parameter << endl;

  AliHLTTriggerDataAccess trigData;
  for (int cycle=0; cycle<500 && iResult>=0; cycle++) {
    for (element=triggerClasses.begin();
	 element!=triggerClasses.end(); element++) {
      element->Trigger(GetRandom(0,100)>50);
    }

    vector<AliHLTTestComponent::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());
      }

      // single class
      for (element=shuffle.begin();
	   element!=shuffle.end() && iResult>=0 && trial<3;
	   element++) {
	// is
	result=element->Trigger();
	expression=element->ClassName();
	trigger=component.CheckCTP(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=component.CheckCTP(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=component.CheckCTP(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=component.CheckCTP(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=component.CheckCTP(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;
      }
    }
  }
  if (iResult<0) {
    cerr << "check failed, dumping info" << endl;
    cerr << "ECS param: " << parameter << endl;
    for (element=triggerClasses.begin();
	 element!=triggerClasses.end(); element++) {
      cerr << element->Trigger() << " " << element->Bit() << ": " << element->ClassName() << endl;
    }
  }
  return iResult;
}

/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//
// setup of the Configure test
int testConfigure() 
{
  cout << "checking common configuration tools of the base class" << endl;
  AliHLTTestComponent component;
  return component.CheckConfigure();
}

/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//
// test event precessing sequence
int testEventProcessing()
{
  int iResult=0;
  cout << "checking AliHLTComponent processing sequence" << endl;
  AliHLTSystem* pHLT=AliHLTPluginBase::GetInstance();
  if (!pHLT) {
    cerr << "error: failed to create HLTSystem" << endl;
    return -1;
  }

  // add the test component to the handler
  pHLT->GetComponentHandler()->AddComponent(new AliHLTTestComponent);

  // configurattion with just the TestComponent
  AliHLTConfiguration testcomponent("testcomponent", "TestComponent", "", "");
  pHLT->BuildTaskList("testcomponent");

  // setup the OCDB and init a random runno
  AliHLTMisc::Instance().InitCDB("local:///tmp");
  int runNo=GetRandom(0,1000);
  AliHLTMisc::Instance().SetCDBRunNo(runNo);

  // run one event
  if ((iResult=pHLT->Run(1))<0) {
    cerr << "error: event processing failed" << endl;
    return iResult;
  }

  return 0;
}

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

int testAliHLTComponent()
{
  int iResult=0;
  //if ((iResult=testCTPTrigger())<0) return iResult;
  if ((iResult=testConfigure())<0) return iResult;
  if ((iResult=testEventProcessing())<0) return iResult;
  return iResult;
}

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