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

#ifndef __CINT__
#include "TFile.h"
#include "TDatime.h"
#include "TRandom.h"
#include "TArrayI.h"
#include "TSystem.h"
#include "TTree.h"
#include "TFile.h"
#include "AliESDEvent.h"
#include "AliHLTDataTypes.h"
#include "AliHLTComponent.h"
#include "AliHLTEsdManager.h"
#include "AliHLTMessage.h"
#include "AliHLTSystem.h"
#include <ostream>
#endif //__CINT__

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

// printouts or not
const bool bVerbose=false;


/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//
// forward declarations
//
class AliHLTEsdManager;
int GetRandom(int min, int max);
int CreateAndWriteESD(AliHLTEsdManager* manager, int eventno, AliHLTComponentDataType dt, AliESDEvent* pTgt);
int CheckFields(const char* file, TArrayI* fields);
int CheckFields(TTree* pTree, TArrayI* fields, const char* file);

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//
// compiled version and root macro are not equivalent for this unit test
// The macro just tests with one data type
// This is mainly due to some restrictions in CINT which can not handle
// the array of data types correctly
int testAliHLTEsdManager()
{
  cout << "macro still not working with CINT, sorry!" << endl;
  return 0;

  int iResult=0;
#ifdef __CINT__
  if (gSystem->Load("libHLTrec.so")<0) {
    cerr << "error: error loading libHLTrec.so library" << endl;
    return -1;
  }
#endif

  AliHLTEsdManager*  pManager=AliHLTEsdManager::New();
  if (!pManager) {
    cerr << "error: can not create manager instance" << endl;
    return -1;
  }
  pManager->SetDirectory(gSystem->TempDirectory());

  int nofEvents=10;
  AliHLTComponentDataType tpcesd;
  AliHLTComponent::SetDataType(tpcesd, "ESD_TREE", "TPC ");
  cout << AliHLTComponent::DataType2Text(tpcesd).c_str() << endl;
  for (int event=0; event<nofEvents && iResult>=0; event++) {
    cout << AliHLTComponent::DataType2Text(tpcesd).c_str() << endl;
    CreateAndWriteESD(pManager, event, tpcesd, NULL);
  }

  AliHLTEsdManager::Delete(pManager);
  return iResult;
}

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//
int main(int /*argc*/, const char** /*argv*/)
{
  int iResult=0;
  int nofEvents=10;
  AliHLTSystem gHLT;
  gHLT.SetGlobalLoggingLevel(kHLTLogDefault);

  AliHLTEsdManager*  pManager=AliHLTEsdManager::New();
  if (!pManager) {
    cerr << "error: can not create manager instance" << endl;
    return -1;
  }
  pManager->SetDirectory(gSystem->TempDirectory());

  AliHLTComponentDataType types[] = {
    // first entry is special, ESD is written to the global target ESD
    //kAliHLTDataTypeESDTree|kAliHLTDataOriginTPC,
    kAliHLTDataTypeESDTree|kAliHLTDataOriginTPC,
    kAliHLTDataTypeESDTree|kAliHLTDataOriginPHOS,
    kAliHLTDataTypeESDTree|kAliHLTDataOriginTRD,
    kAliHLTDataTypeDDLRaw|kAliHLTDataOriginTRD,
    kAliHLTVoidDataType
  };

  TTree* pMasterTree=new TTree("esdTree", "Tree with HLT ESD objects");
  pMasterTree->SetDirectory(0);
  AliESDEvent* pMasterESD=new AliESDEvent;
  pMasterESD->CreateStdContent();
  pMasterESD->WriteToTree(pMasterTree);

  vector<TArrayI*> randomFields;
  for (int event=0; event<nofEvents && iResult>=0; event++) {
    pMasterESD->ResetStdContent();
    for (unsigned int type=0; types[type]!=kAliHLTVoidDataType && iResult>=0; type++) {
      if (randomFields.size()<=type) {
	randomFields.push_back(new TArrayI(nofEvents));
      }
      AliESDEvent* pTgt=NULL;
      //if (type==0) pTgt=pMasterESD;
      int field=CreateAndWriteESD(pManager, event, types[type], pTgt);
      if (field>=0) {
	(*randomFields[type])[event]=field;
      } else {
	iResult=-1;
	break;
      }
    }
    pMasterTree->Fill();
  }

  if (iResult>=0) {
    pManager->PadESDs(nofEvents);
  }

  vector<TString> filenames;
  for (int type=0; types[type]!=kAliHLTVoidDataType; type++) {
    TString filename=pManager->GetFileNames(types[type]);
    filenames.push_back(filename);
  }
  // delete the manager instance to make sure the files are closed
  AliHLTEsdManager::Delete(pManager);
  pManager=NULL;
  for (int type=0; types[type]!=kAliHLTVoidDataType; type++) {
    if (iResult>=0) {
      iResult=CheckFields(filenames[type], dynamic_cast<TArrayI*>(randomFields[type]));
    }
    TString shellcmd="rm -f ";
    shellcmd+=filenames[type];
    gSystem->Exec(shellcmd);    
  }

  vector<TArrayI*>::iterator element;
  while ((element=randomFields.end())!=randomFields.begin()) {
    element--;
    if (*element) delete *element;
    randomFields.pop_back();
  }

  delete pMasterESD;

  return iResult;
}

Bool_t seedSet=kFALSE;

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

/**
 * Creates a dummy ESD object and sets the magnetic field to a random number.
 * The ESD is streamed via AliHLTMessage and processed by the AliHLTEsdmanager.
 * @return 0 no ESD created, >0 random number of the magnetic field, 
 *         neg error if failed
 */
int CreateAndWriteESD(AliHLTEsdManager* pManager, int eventno, AliHLTComponentDataType dt, AliESDEvent* pTgt)
{
  int iResult=0;
  int magField=0;
  if (!pManager) {
    cerr << "error: missing manager instance" << endl;
    return -1;
  }
  const char* message="";
  if ((GetRandom(0,10)%3)==0) {
    message=": adding ESD for block ";
    TTree* pTree=new TTree;
    AliESDEvent* pESD=new AliESDEvent;
    pESD->CreateStdContent();
    magField=GetRandom(1, 1000);
    pESD->SetMagneticField(magField);
    pESD->WriteToTree(pTree);
    pTree->Fill();
    pTree->GetUserInfo()->Add(pESD);
    AliHLTMessage msg(kMESS_OBJECT);
    msg.WriteObject(pTree);
    Int_t iMsgLength=msg.Length();
    if (iMsgLength>0) {
      msg.SetLength(); // sets the length to the first (reserved) word
      iResult=pManager->WriteESD((AliHLTUInt8_t*)msg.Buffer(), iMsgLength, dt, pTgt, eventno);
    }
    pTree->GetUserInfo()->Clear();
    delete pTree;
    delete pESD;
  } else {
    message=": omitting block       ";
  }
  if (iResult>=0) iResult=magField;
  if (bVerbose) cout << "event " << eventno << message << AliHLTComponent::DataType2Text(dt).c_str() << ": " << iResult << endl;
  return iResult;
}

/**
 * Read the ESD from the file and compare with the
 * random field values previously set to the ESDs
 */
int CheckFields(const char* file, TArrayI* fields)
{
  if (!file || !fields) {
    cerr << "error: invalid parameters" << endl;
    return 0;
  }
  TFile esdfile(file);
  if (!esdfile.IsZombie()) {
    TTree* pTree=NULL;
    esdfile.GetObject("esdTree", pTree);
    if (pTree) {
      int res=CheckFields(pTree, fields, file);
      if (res<0) return res;
    } else {
      cerr << "error: can not find esdTree in file " << file << endl;
    }
  } else {
    cerr << "error: can not open file " << file << endl;
    return -1;
  }
  cout << "checking: " << file << " ok" << endl;
  return 0;
}

/**
 * Compare ESD from tree with the
 * random field values previously set to the ESDs
 */
int CheckFields(TTree* pTree, TArrayI* fields, const char* file)
{
  if (fields->GetSize()!=pTree->GetEntries()) {
    cerr << "error: event number mismatch in file " << file << " : expected " << fields->GetSize() << "  found " << pTree->GetEntries() << endl;
    return -1;
  }
  AliESDEvent* pESD=new AliESDEvent;
  pESD->ReadFromTree(pTree);
  for (int event=0; event<pTree->GetEntries(); event++) {
    pTree->GetEvent(event);
    if (fields->At(event)!=pESD->GetMagneticField()) {
      cerr << "error: magnetic field mismatch in file " << file << " event " << event << ": expected " << fields->At(event) << "  found " << pESD->GetMagneticField() << endl;
      return -1;
    }
  }

  delete pESD;
  return 0;
}
 testAliHLTEsdManager.C:1
 testAliHLTEsdManager.C:2
 testAliHLTEsdManager.C:3
 testAliHLTEsdManager.C:4
 testAliHLTEsdManager.C:5
 testAliHLTEsdManager.C:6
 testAliHLTEsdManager.C:7
 testAliHLTEsdManager.C:8
 testAliHLTEsdManager.C:9
 testAliHLTEsdManager.C:10
 testAliHLTEsdManager.C:11
 testAliHLTEsdManager.C:12
 testAliHLTEsdManager.C:13
 testAliHLTEsdManager.C:14
 testAliHLTEsdManager.C:15
 testAliHLTEsdManager.C:16
 testAliHLTEsdManager.C:17
 testAliHLTEsdManager.C:18
 testAliHLTEsdManager.C:19
 testAliHLTEsdManager.C:20
 testAliHLTEsdManager.C:21
 testAliHLTEsdManager.C:22
 testAliHLTEsdManager.C:23
 testAliHLTEsdManager.C:24
 testAliHLTEsdManager.C:25
 testAliHLTEsdManager.C:26
 testAliHLTEsdManager.C:27
 testAliHLTEsdManager.C:28
 testAliHLTEsdManager.C:29
 testAliHLTEsdManager.C:30
 testAliHLTEsdManager.C:31
 testAliHLTEsdManager.C:32
 testAliHLTEsdManager.C:33
 testAliHLTEsdManager.C:34
 testAliHLTEsdManager.C:35
 testAliHLTEsdManager.C:36
 testAliHLTEsdManager.C:37
 testAliHLTEsdManager.C:38
 testAliHLTEsdManager.C:39
 testAliHLTEsdManager.C:40
 testAliHLTEsdManager.C:41
 testAliHLTEsdManager.C:42
 testAliHLTEsdManager.C:43
 testAliHLTEsdManager.C:44
 testAliHLTEsdManager.C:45
 testAliHLTEsdManager.C:46
 testAliHLTEsdManager.C:47
 testAliHLTEsdManager.C:48
 testAliHLTEsdManager.C:49
 testAliHLTEsdManager.C:50
 testAliHLTEsdManager.C:51
 testAliHLTEsdManager.C:52
 testAliHLTEsdManager.C:53
 testAliHLTEsdManager.C:54
 testAliHLTEsdManager.C:55
 testAliHLTEsdManager.C:56
 testAliHLTEsdManager.C:57
 testAliHLTEsdManager.C:58
 testAliHLTEsdManager.C:59
 testAliHLTEsdManager.C:60
 testAliHLTEsdManager.C:61
 testAliHLTEsdManager.C:62
 testAliHLTEsdManager.C:63
 testAliHLTEsdManager.C:64
 testAliHLTEsdManager.C:65
 testAliHLTEsdManager.C:66
 testAliHLTEsdManager.C:67
 testAliHLTEsdManager.C:68
 testAliHLTEsdManager.C:69
 testAliHLTEsdManager.C:70
 testAliHLTEsdManager.C:71
 testAliHLTEsdManager.C:72
 testAliHLTEsdManager.C:73
 testAliHLTEsdManager.C:74
 testAliHLTEsdManager.C:75
 testAliHLTEsdManager.C:76
 testAliHLTEsdManager.C:77
 testAliHLTEsdManager.C:78
 testAliHLTEsdManager.C:79
 testAliHLTEsdManager.C:80
 testAliHLTEsdManager.C:81
 testAliHLTEsdManager.C:82
 testAliHLTEsdManager.C:83
 testAliHLTEsdManager.C:84
 testAliHLTEsdManager.C:85
 testAliHLTEsdManager.C:86
 testAliHLTEsdManager.C:87
 testAliHLTEsdManager.C:88
 testAliHLTEsdManager.C:89
 testAliHLTEsdManager.C:90
 testAliHLTEsdManager.C:91
 testAliHLTEsdManager.C:92
 testAliHLTEsdManager.C:93
 testAliHLTEsdManager.C:94
 testAliHLTEsdManager.C:95
 testAliHLTEsdManager.C:96
 testAliHLTEsdManager.C:97
 testAliHLTEsdManager.C:98
 testAliHLTEsdManager.C:99
 testAliHLTEsdManager.C:100
 testAliHLTEsdManager.C:101
 testAliHLTEsdManager.C:102
 testAliHLTEsdManager.C:103
 testAliHLTEsdManager.C:104
 testAliHLTEsdManager.C:105
 testAliHLTEsdManager.C:106
 testAliHLTEsdManager.C:107
 testAliHLTEsdManager.C:108
 testAliHLTEsdManager.C:109
 testAliHLTEsdManager.C:110
 testAliHLTEsdManager.C:111
 testAliHLTEsdManager.C:112
 testAliHLTEsdManager.C:113
 testAliHLTEsdManager.C:114
 testAliHLTEsdManager.C:115
 testAliHLTEsdManager.C:116
 testAliHLTEsdManager.C:117
 testAliHLTEsdManager.C:118
 testAliHLTEsdManager.C:119
 testAliHLTEsdManager.C:120
 testAliHLTEsdManager.C:121
 testAliHLTEsdManager.C:122
 testAliHLTEsdManager.C:123
 testAliHLTEsdManager.C:124
 testAliHLTEsdManager.C:125
 testAliHLTEsdManager.C:126
 testAliHLTEsdManager.C:127
 testAliHLTEsdManager.C:128
 testAliHLTEsdManager.C:129
 testAliHLTEsdManager.C:130
 testAliHLTEsdManager.C:131
 testAliHLTEsdManager.C:132
 testAliHLTEsdManager.C:133
 testAliHLTEsdManager.C:134
 testAliHLTEsdManager.C:135
 testAliHLTEsdManager.C:136
 testAliHLTEsdManager.C:137
 testAliHLTEsdManager.C:138
 testAliHLTEsdManager.C:139
 testAliHLTEsdManager.C:140
 testAliHLTEsdManager.C:141
 testAliHLTEsdManager.C:142
 testAliHLTEsdManager.C:143
 testAliHLTEsdManager.C:144
 testAliHLTEsdManager.C:145
 testAliHLTEsdManager.C:146
 testAliHLTEsdManager.C:147
 testAliHLTEsdManager.C:148
 testAliHLTEsdManager.C:149
 testAliHLTEsdManager.C:150
 testAliHLTEsdManager.C:151
 testAliHLTEsdManager.C:152
 testAliHLTEsdManager.C:153
 testAliHLTEsdManager.C:154
 testAliHLTEsdManager.C:155
 testAliHLTEsdManager.C:156
 testAliHLTEsdManager.C:157
 testAliHLTEsdManager.C:158
 testAliHLTEsdManager.C:159
 testAliHLTEsdManager.C:160
 testAliHLTEsdManager.C:161
 testAliHLTEsdManager.C:162
 testAliHLTEsdManager.C:163
 testAliHLTEsdManager.C:164
 testAliHLTEsdManager.C:165
 testAliHLTEsdManager.C:166
 testAliHLTEsdManager.C:167
 testAliHLTEsdManager.C:168
 testAliHLTEsdManager.C:169
 testAliHLTEsdManager.C:170
 testAliHLTEsdManager.C:171
 testAliHLTEsdManager.C:172
 testAliHLTEsdManager.C:173
 testAliHLTEsdManager.C:174
 testAliHLTEsdManager.C:175
 testAliHLTEsdManager.C:176
 testAliHLTEsdManager.C:177
 testAliHLTEsdManager.C:178
 testAliHLTEsdManager.C:179
 testAliHLTEsdManager.C:180
 testAliHLTEsdManager.C:181
 testAliHLTEsdManager.C:182
 testAliHLTEsdManager.C:183
 testAliHLTEsdManager.C:184
 testAliHLTEsdManager.C:185
 testAliHLTEsdManager.C:186
 testAliHLTEsdManager.C:187
 testAliHLTEsdManager.C:188
 testAliHLTEsdManager.C:189
 testAliHLTEsdManager.C:190
 testAliHLTEsdManager.C:191
 testAliHLTEsdManager.C:192
 testAliHLTEsdManager.C:193
 testAliHLTEsdManager.C:194
 testAliHLTEsdManager.C:195
 testAliHLTEsdManager.C:196
 testAliHLTEsdManager.C:197
 testAliHLTEsdManager.C:198
 testAliHLTEsdManager.C:199
 testAliHLTEsdManager.C:200
 testAliHLTEsdManager.C:201
 testAliHLTEsdManager.C:202
 testAliHLTEsdManager.C:203
 testAliHLTEsdManager.C:204
 testAliHLTEsdManager.C:205
 testAliHLTEsdManager.C:206
 testAliHLTEsdManager.C:207
 testAliHLTEsdManager.C:208
 testAliHLTEsdManager.C:209
 testAliHLTEsdManager.C:210
 testAliHLTEsdManager.C:211
 testAliHLTEsdManager.C:212
 testAliHLTEsdManager.C:213
 testAliHLTEsdManager.C:214
 testAliHLTEsdManager.C:215
 testAliHLTEsdManager.C:216
 testAliHLTEsdManager.C:217
 testAliHLTEsdManager.C:218
 testAliHLTEsdManager.C:219
 testAliHLTEsdManager.C:220
 testAliHLTEsdManager.C:221
 testAliHLTEsdManager.C:222
 testAliHLTEsdManager.C:223
 testAliHLTEsdManager.C:224
 testAliHLTEsdManager.C:225
 testAliHLTEsdManager.C:226
 testAliHLTEsdManager.C:227
 testAliHLTEsdManager.C:228
 testAliHLTEsdManager.C:229
 testAliHLTEsdManager.C:230
 testAliHLTEsdManager.C:231
 testAliHLTEsdManager.C:232
 testAliHLTEsdManager.C:233
 testAliHLTEsdManager.C:234
 testAliHLTEsdManager.C:235
 testAliHLTEsdManager.C:236
 testAliHLTEsdManager.C:237
 testAliHLTEsdManager.C:238
 testAliHLTEsdManager.C:239
 testAliHLTEsdManager.C:240
 testAliHLTEsdManager.C:241
 testAliHLTEsdManager.C:242
 testAliHLTEsdManager.C:243
 testAliHLTEsdManager.C:244
 testAliHLTEsdManager.C:245
 testAliHLTEsdManager.C:246
 testAliHLTEsdManager.C:247
 testAliHLTEsdManager.C:248
 testAliHLTEsdManager.C:249
 testAliHLTEsdManager.C:250
 testAliHLTEsdManager.C:251
 testAliHLTEsdManager.C:252
 testAliHLTEsdManager.C:253
 testAliHLTEsdManager.C:254
 testAliHLTEsdManager.C:255
 testAliHLTEsdManager.C:256
 testAliHLTEsdManager.C:257
 testAliHLTEsdManager.C:258
 testAliHLTEsdManager.C:259
 testAliHLTEsdManager.C:260
 testAliHLTEsdManager.C:261
 testAliHLTEsdManager.C:262
 testAliHLTEsdManager.C:263
 testAliHLTEsdManager.C:264
 testAliHLTEsdManager.C:265
 testAliHLTEsdManager.C:266
 testAliHLTEsdManager.C:267
 testAliHLTEsdManager.C:268
 testAliHLTEsdManager.C:269
 testAliHLTEsdManager.C:270
 testAliHLTEsdManager.C:271
 testAliHLTEsdManager.C:272
 testAliHLTEsdManager.C:273
 testAliHLTEsdManager.C:274
 testAliHLTEsdManager.C:275
 testAliHLTEsdManager.C:276
 testAliHLTEsdManager.C:277
 testAliHLTEsdManager.C:278
 testAliHLTEsdManager.C:279
 testAliHLTEsdManager.C:280
 testAliHLTEsdManager.C:281
 testAliHLTEsdManager.C:282
 testAliHLTEsdManager.C:283
 testAliHLTEsdManager.C:284
 testAliHLTEsdManager.C:285
 testAliHLTEsdManager.C:286
 testAliHLTEsdManager.C:287
 testAliHLTEsdManager.C:288
 testAliHLTEsdManager.C:289
 testAliHLTEsdManager.C:290
 testAliHLTEsdManager.C:291
 testAliHLTEsdManager.C:292
 testAliHLTEsdManager.C:293
 testAliHLTEsdManager.C:294
 testAliHLTEsdManager.C:295
 testAliHLTEsdManager.C:296
 testAliHLTEsdManager.C:297
 testAliHLTEsdManager.C:298
 testAliHLTEsdManager.C:299
 testAliHLTEsdManager.C:300
 testAliHLTEsdManager.C:301
 testAliHLTEsdManager.C:302
 testAliHLTEsdManager.C:303
 testAliHLTEsdManager.C:304