ROOT logo
// $Id$

//**************************************************************************
//* This file is property of and copyright by the                          * 
//* 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   AliHLTOUTHandlerEsdBranch.cxx
/// @author Matthias Richter
/// @date   01.07.2010
/// @brief  HLTOUT handler of type kEsd to merge objects into the hltEsd.

#include "AliHLTOUTHandlerEsdBranch.h"
#include "AliHLTOUT.h"
#include "AliHLTMessage.h"
#include "AliHLTErrorGuard.h"
#include "AliHLTEsdManager.h"
#include "AliHLTComponent.h" // DataType2Text
#include "AliHLTMisc.h"
#include "TString.h"
#include "TObjString.h"
#include "TObjArray.h"
#include "TArrayC.h"
#include <cassert>

/** ROOT macro for the implementation of ROOT specific class methods */
ClassImp(AliHLTOUTHandlerEsdBranch)

AliHLTOUTHandlerEsdBranch::AliHLTOUTHandlerEsdBranch(const char* branchname)
  : AliHLTOUTHandler() 
  , fBranch(branchname)
  , fESD(NULL)
  , fpData(NULL)
  , fSize(0)
  , fManager(NULL)
{ 
  // The handler extracts objects from HLTOUT data blocks or converts
  // data to objects to be added to hltEsd branches. The default implementation
  // covers the first case right away, the class can be used directly for single
  // objects streamed to the HLTOUT.
  //
  // The handler produces a partial ESD containing the data objects. The framework
  // merges all the different partial ESDs in the AliHLTEsdManager, respectively the
  // specific implementation AliHLTEsdManagerImplementation.
}

AliHLTOUTHandlerEsdBranch::~AliHLTOUTHandlerEsdBranch()
{
  // destructor
  if (fESD) fManager->DestroyEsdEvent(fESD);
  fESD=NULL;
  if (fpData) delete fpData;
  fpData=NULL;
  if (fManager) AliHLTEsdManager::Delete(fManager);
  fManager=NULL;
}

int AliHLTOUTHandlerEsdBranch::ProcessData(AliHLTOUT* pData)
{
  // data processing function
  if (!pData) return -EINVAL;
  int iResult=0;

  if (CheckStatus(kHandlerError)) {
    HLTWarning("kEsd handler for ESD branch '%s' in error state, skipping processing of associated HLTOUT blocks", fBranch.Data());
    return -EPERM;
  }

  if (!fManager) {
    fManager=AliHLTMisc::LoadInstance((AliHLTEsdManager*)NULL, "AliHLTEsdManagerImplementation", "libHLTrec.so");
  }

  if (!fManager) {
    AliHLTComponentDataType dt=kAliHLTVoidDataType;
    AliHLTUInt32_t spec=kAliHLTVoidDataSpec;
    if (pData->SelectFirstDataBlock()>=0) {
      pData->GetDataBlockDescription(dt, spec);
      ALIHLTERRORGUARD(1, "failed to create AliHLTEsdManagerImplementation object, skipping handling of HLTOUT data %s 0x%80x", AliHLTComponent::DataType2Text(dt).c_str(), spec);
    }  
    return -ENOSYS;
  }

  if (!fESD) {
    // create the ESD container, but without std content
    fESD = fManager->CreateEsdEvent();
  }
  if (!fpData) fpData=new TArrayC;
  if (fESD && fpData) {
    fManager->ResetEsdEvent(fESD);
    iResult=ExtractAndAddObjects(pData);
  }

  AliHLTMessage* pMsg=AliHLTMessage::Stream(fESD);
  if (pMsg) {
    if (!pMsg->CompBuffer()) {
      fSize=pMsg->Length();
      fpData->Set(fSize, pMsg->Buffer());
    } else {
      fSize=pMsg->CompLength();
      fpData->Set(fSize, pMsg->CompBuffer());
    }
    delete pMsg;
    pMsg=NULL;
  } else {
    HLTError("streaming of object failed");
  }

  return iResult;
}

int AliHLTOUTHandlerEsdBranch::ExtractAndAddObjects(AliHLTOUT* pData)
{
  // Default method
  // Extract streamed object from the HLTOUT and add to ESD
  // The default method works only for single blocks in the HLTOUT,
  // A specific child class is required if multiple blocks should be
  // treated.

  if (!fESD || !fManager) return -ENOSYS;
  int iResult=0;
  iResult=pData->SelectFirstDataBlock(); 
  if (iResult<0) return iResult;

  TObject* pObject=pData->GetDataObject();
  if (pObject) {
    TString bname=fBranch;
    if (bname.IsNull()) {
      bname=pObject->GetName();
      if (bname.CompareTo(pObject->ClassName())==0) {
	ALIHLTERRORGUARD(5, "no branch name specified for unnamed object %s, not added to ESD", bname.Data());
	bname="";
      }
    }
    if (!bname.IsNull()) {
      iResult=fManager->AddObject(fESD, pObject, bname.Data());
    } else {
      iResult=-EBADF;
    }
    pData->ReleaseDataObject(pObject);
    pObject=NULL;
  } else {
    AliHLTComponentDataType dt=kAliHLTVoidDataType;
    AliHLTUInt32_t spec=kAliHLTVoidDataSpec;
    pData->GetDataBlockDescription(dt, spec);
    HLTError("Can not get TObject from HLTOUT buffer for block %s 0x%x", AliHLTComponent::DataType2Text(dt).c_str(), spec);
    iResult=-ENODATA;
  }

  if (pData->SelectNextDataBlock()>=0) {
    ALIHLTERRORGUARD(5, "the default function can only handle one single data block/object");
  }

  return iResult;
}

int AliHLTOUTHandlerEsdBranch::GetProcessedData(const AliHLTUInt8_t* &pData)
{
  // get processed data
  if (!fpData) {
    pData=NULL;
    return 0;
  }

  pData=reinterpret_cast<AliHLTUInt8_t*>(fpData->GetArray());
  return fSize;
}

int AliHLTOUTHandlerEsdBranch::ReleaseProcessedData(const AliHLTUInt8_t* pData, int size)
{
  // release pointer instance
  int iResult=0;
  if (!fpData || size != fSize ||
      const_cast<AliHLTUInt8_t*>(pData) != reinterpret_cast<AliHLTUInt8_t*>(fpData->GetArray())) {
    HLTError("attempt to release to wrong data buffer %p size %d, expected %p size %d", pData, size, fpData?fpData->GetArray():NULL, fSize);
  }
  fSize=0;
  return iResult;
}
 AliHLTOUTHandlerEsdBranch.cxx:1
 AliHLTOUTHandlerEsdBranch.cxx:2
 AliHLTOUTHandlerEsdBranch.cxx:3
 AliHLTOUTHandlerEsdBranch.cxx:4
 AliHLTOUTHandlerEsdBranch.cxx:5
 AliHLTOUTHandlerEsdBranch.cxx:6
 AliHLTOUTHandlerEsdBranch.cxx:7
 AliHLTOUTHandlerEsdBranch.cxx:8
 AliHLTOUTHandlerEsdBranch.cxx:9
 AliHLTOUTHandlerEsdBranch.cxx:10
 AliHLTOUTHandlerEsdBranch.cxx:11
 AliHLTOUTHandlerEsdBranch.cxx:12
 AliHLTOUTHandlerEsdBranch.cxx:13
 AliHLTOUTHandlerEsdBranch.cxx:14
 AliHLTOUTHandlerEsdBranch.cxx:15
 AliHLTOUTHandlerEsdBranch.cxx:16
 AliHLTOUTHandlerEsdBranch.cxx:17
 AliHLTOUTHandlerEsdBranch.cxx:18
 AliHLTOUTHandlerEsdBranch.cxx:19
 AliHLTOUTHandlerEsdBranch.cxx:20
 AliHLTOUTHandlerEsdBranch.cxx:21
 AliHLTOUTHandlerEsdBranch.cxx:22
 AliHLTOUTHandlerEsdBranch.cxx:23
 AliHLTOUTHandlerEsdBranch.cxx:24
 AliHLTOUTHandlerEsdBranch.cxx:25
 AliHLTOUTHandlerEsdBranch.cxx:26
 AliHLTOUTHandlerEsdBranch.cxx:27
 AliHLTOUTHandlerEsdBranch.cxx:28
 AliHLTOUTHandlerEsdBranch.cxx:29
 AliHLTOUTHandlerEsdBranch.cxx:30
 AliHLTOUTHandlerEsdBranch.cxx:31
 AliHLTOUTHandlerEsdBranch.cxx:32
 AliHLTOUTHandlerEsdBranch.cxx:33
 AliHLTOUTHandlerEsdBranch.cxx:34
 AliHLTOUTHandlerEsdBranch.cxx:35
 AliHLTOUTHandlerEsdBranch.cxx:36
 AliHLTOUTHandlerEsdBranch.cxx:37
 AliHLTOUTHandlerEsdBranch.cxx:38
 AliHLTOUTHandlerEsdBranch.cxx:39
 AliHLTOUTHandlerEsdBranch.cxx:40
 AliHLTOUTHandlerEsdBranch.cxx:41
 AliHLTOUTHandlerEsdBranch.cxx:42
 AliHLTOUTHandlerEsdBranch.cxx:43
 AliHLTOUTHandlerEsdBranch.cxx:44
 AliHLTOUTHandlerEsdBranch.cxx:45
 AliHLTOUTHandlerEsdBranch.cxx:46
 AliHLTOUTHandlerEsdBranch.cxx:47
 AliHLTOUTHandlerEsdBranch.cxx:48
 AliHLTOUTHandlerEsdBranch.cxx:49
 AliHLTOUTHandlerEsdBranch.cxx:50
 AliHLTOUTHandlerEsdBranch.cxx:51
 AliHLTOUTHandlerEsdBranch.cxx:52
 AliHLTOUTHandlerEsdBranch.cxx:53
 AliHLTOUTHandlerEsdBranch.cxx:54
 AliHLTOUTHandlerEsdBranch.cxx:55
 AliHLTOUTHandlerEsdBranch.cxx:56
 AliHLTOUTHandlerEsdBranch.cxx:57
 AliHLTOUTHandlerEsdBranch.cxx:58
 AliHLTOUTHandlerEsdBranch.cxx:59
 AliHLTOUTHandlerEsdBranch.cxx:60
 AliHLTOUTHandlerEsdBranch.cxx:61
 AliHLTOUTHandlerEsdBranch.cxx:62
 AliHLTOUTHandlerEsdBranch.cxx:63
 AliHLTOUTHandlerEsdBranch.cxx:64
 AliHLTOUTHandlerEsdBranch.cxx:65
 AliHLTOUTHandlerEsdBranch.cxx:66
 AliHLTOUTHandlerEsdBranch.cxx:67
 AliHLTOUTHandlerEsdBranch.cxx:68
 AliHLTOUTHandlerEsdBranch.cxx:69
 AliHLTOUTHandlerEsdBranch.cxx:70
 AliHLTOUTHandlerEsdBranch.cxx:71
 AliHLTOUTHandlerEsdBranch.cxx:72
 AliHLTOUTHandlerEsdBranch.cxx:73
 AliHLTOUTHandlerEsdBranch.cxx:74
 AliHLTOUTHandlerEsdBranch.cxx:75
 AliHLTOUTHandlerEsdBranch.cxx:76
 AliHLTOUTHandlerEsdBranch.cxx:77
 AliHLTOUTHandlerEsdBranch.cxx:78
 AliHLTOUTHandlerEsdBranch.cxx:79
 AliHLTOUTHandlerEsdBranch.cxx:80
 AliHLTOUTHandlerEsdBranch.cxx:81
 AliHLTOUTHandlerEsdBranch.cxx:82
 AliHLTOUTHandlerEsdBranch.cxx:83
 AliHLTOUTHandlerEsdBranch.cxx:84
 AliHLTOUTHandlerEsdBranch.cxx:85
 AliHLTOUTHandlerEsdBranch.cxx:86
 AliHLTOUTHandlerEsdBranch.cxx:87
 AliHLTOUTHandlerEsdBranch.cxx:88
 AliHLTOUTHandlerEsdBranch.cxx:89
 AliHLTOUTHandlerEsdBranch.cxx:90
 AliHLTOUTHandlerEsdBranch.cxx:91
 AliHLTOUTHandlerEsdBranch.cxx:92
 AliHLTOUTHandlerEsdBranch.cxx:93
 AliHLTOUTHandlerEsdBranch.cxx:94
 AliHLTOUTHandlerEsdBranch.cxx:95
 AliHLTOUTHandlerEsdBranch.cxx:96
 AliHLTOUTHandlerEsdBranch.cxx:97
 AliHLTOUTHandlerEsdBranch.cxx:98
 AliHLTOUTHandlerEsdBranch.cxx:99
 AliHLTOUTHandlerEsdBranch.cxx:100
 AliHLTOUTHandlerEsdBranch.cxx:101
 AliHLTOUTHandlerEsdBranch.cxx:102
 AliHLTOUTHandlerEsdBranch.cxx:103
 AliHLTOUTHandlerEsdBranch.cxx:104
 AliHLTOUTHandlerEsdBranch.cxx:105
 AliHLTOUTHandlerEsdBranch.cxx:106
 AliHLTOUTHandlerEsdBranch.cxx:107
 AliHLTOUTHandlerEsdBranch.cxx:108
 AliHLTOUTHandlerEsdBranch.cxx:109
 AliHLTOUTHandlerEsdBranch.cxx:110
 AliHLTOUTHandlerEsdBranch.cxx:111
 AliHLTOUTHandlerEsdBranch.cxx:112
 AliHLTOUTHandlerEsdBranch.cxx:113
 AliHLTOUTHandlerEsdBranch.cxx:114
 AliHLTOUTHandlerEsdBranch.cxx:115
 AliHLTOUTHandlerEsdBranch.cxx:116
 AliHLTOUTHandlerEsdBranch.cxx:117
 AliHLTOUTHandlerEsdBranch.cxx:118
 AliHLTOUTHandlerEsdBranch.cxx:119
 AliHLTOUTHandlerEsdBranch.cxx:120
 AliHLTOUTHandlerEsdBranch.cxx:121
 AliHLTOUTHandlerEsdBranch.cxx:122
 AliHLTOUTHandlerEsdBranch.cxx:123
 AliHLTOUTHandlerEsdBranch.cxx:124
 AliHLTOUTHandlerEsdBranch.cxx:125
 AliHLTOUTHandlerEsdBranch.cxx:126
 AliHLTOUTHandlerEsdBranch.cxx:127
 AliHLTOUTHandlerEsdBranch.cxx:128
 AliHLTOUTHandlerEsdBranch.cxx:129
 AliHLTOUTHandlerEsdBranch.cxx:130
 AliHLTOUTHandlerEsdBranch.cxx:131
 AliHLTOUTHandlerEsdBranch.cxx:132
 AliHLTOUTHandlerEsdBranch.cxx:133
 AliHLTOUTHandlerEsdBranch.cxx:134
 AliHLTOUTHandlerEsdBranch.cxx:135
 AliHLTOUTHandlerEsdBranch.cxx:136
 AliHLTOUTHandlerEsdBranch.cxx:137
 AliHLTOUTHandlerEsdBranch.cxx:138
 AliHLTOUTHandlerEsdBranch.cxx:139
 AliHLTOUTHandlerEsdBranch.cxx:140
 AliHLTOUTHandlerEsdBranch.cxx:141
 AliHLTOUTHandlerEsdBranch.cxx:142
 AliHLTOUTHandlerEsdBranch.cxx:143
 AliHLTOUTHandlerEsdBranch.cxx:144
 AliHLTOUTHandlerEsdBranch.cxx:145
 AliHLTOUTHandlerEsdBranch.cxx:146
 AliHLTOUTHandlerEsdBranch.cxx:147
 AliHLTOUTHandlerEsdBranch.cxx:148
 AliHLTOUTHandlerEsdBranch.cxx:149
 AliHLTOUTHandlerEsdBranch.cxx:150
 AliHLTOUTHandlerEsdBranch.cxx:151
 AliHLTOUTHandlerEsdBranch.cxx:152
 AliHLTOUTHandlerEsdBranch.cxx:153
 AliHLTOUTHandlerEsdBranch.cxx:154
 AliHLTOUTHandlerEsdBranch.cxx:155
 AliHLTOUTHandlerEsdBranch.cxx:156
 AliHLTOUTHandlerEsdBranch.cxx:157
 AliHLTOUTHandlerEsdBranch.cxx:158
 AliHLTOUTHandlerEsdBranch.cxx:159
 AliHLTOUTHandlerEsdBranch.cxx:160
 AliHLTOUTHandlerEsdBranch.cxx:161
 AliHLTOUTHandlerEsdBranch.cxx:162
 AliHLTOUTHandlerEsdBranch.cxx:163
 AliHLTOUTHandlerEsdBranch.cxx:164
 AliHLTOUTHandlerEsdBranch.cxx:165
 AliHLTOUTHandlerEsdBranch.cxx:166
 AliHLTOUTHandlerEsdBranch.cxx:167
 AliHLTOUTHandlerEsdBranch.cxx:168
 AliHLTOUTHandlerEsdBranch.cxx:169
 AliHLTOUTHandlerEsdBranch.cxx:170
 AliHLTOUTHandlerEsdBranch.cxx:171
 AliHLTOUTHandlerEsdBranch.cxx:172
 AliHLTOUTHandlerEsdBranch.cxx:173
 AliHLTOUTHandlerEsdBranch.cxx:174
 AliHLTOUTHandlerEsdBranch.cxx:175
 AliHLTOUTHandlerEsdBranch.cxx:176
 AliHLTOUTHandlerEsdBranch.cxx:177
 AliHLTOUTHandlerEsdBranch.cxx:178
 AliHLTOUTHandlerEsdBranch.cxx:179
 AliHLTOUTHandlerEsdBranch.cxx:180
 AliHLTOUTHandlerEsdBranch.cxx:181
 AliHLTOUTHandlerEsdBranch.cxx:182
 AliHLTOUTHandlerEsdBranch.cxx:183
 AliHLTOUTHandlerEsdBranch.cxx:184
 AliHLTOUTHandlerEsdBranch.cxx:185
 AliHLTOUTHandlerEsdBranch.cxx:186
 AliHLTOUTHandlerEsdBranch.cxx:187
 AliHLTOUTHandlerEsdBranch.cxx:188
 AliHLTOUTHandlerEsdBranch.cxx:189