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>        *
// *                  Timm Steinbeck <timm@kip.uni-heidelberg.de>           *
// *                  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   AliHLTProcessor.cxx
/// @author Matthias Richter, Timm Steinbeck
/// @date   
/// @brief  Base class implementation for HLT analysis components.
///

#include "AliHLTProcessor.h"
#include <string.h>
#include "TDatime.h"
#include "TString.h"

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

AliHLTProcessor::AliHLTProcessor()
  : AliHLTComponent()
  , fpDebugCounters(NULL)
{ 
}

AliHLTProcessor::~AliHLTProcessor()
{ 
  // destructor
  if (fpDebugCounters) delete fpDebugCounters;
  fpDebugCounters=NULL;
}

int AliHLTProcessor::DoProcessing( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks, 
			    AliHLTComponentTriggerData& trigData, AliHLTUInt8_t* outputPtr, 
			    AliHLTUInt32_t& size,
			    AliHLTComponentBlockDataList& outputBlocks,
			    AliHLTComponentEventDoneData*& edd )
{
  // Processing method, calls child's DoEvent
  int iResult=0;
  ReleaseEventDoneData();

  iResult=DoEvent(evtData, blocks, trigData, outputPtr, size, outputBlocks);

  edd = NULL;
  AliHLTComponentEventDoneData* eddTmp = GetCurrentEventDoneData();
  if (eddTmp) {
    int ret = GetEventDoneData(eddTmp->fDataSize, &edd);
    if (ret) {
      HLTError( "Cannot get event done data of %u bytes for event %lu: error (%d)", 
		eddTmp->fDataSize, evtData.fEventID, ret );
      return -ENOMEM;
    }
    edd->fStructSize = sizeof(AliHLTComponentEventDoneData);
    edd->fDataSize = eddTmp->fDataSize;
    edd->fData = reinterpret_cast<AliHLTUInt8_t*>(edd)+edd->fStructSize;
    memcpy( edd->fData, eddTmp->fData, eddTmp->fDataSize );

    // 2009-12-07 want to make this switchable, but this first needs some
    // extension in the online framework to change the log level settings
    // in the component while running
    if (false/*CheckFilter(kHLTLogDebug)*/) {
      if (!fpDebugCounters) {
	fpDebugCounters=new AliHLTProcessorCounters;
      }
      if (fpDebugCounters) {
	int wordCnt=edd->fDataSize/4;
	AliHLTUInt32_t* buffer=reinterpret_cast<AliHLTUInt32_t*>(edd->fData);
	int word=0;
	while (word<wordCnt) {
	  switch (buffer[word]) {
	  case 3: 
	    fpDebugCounters->fReadoutFilter++; 
	    word+=1+buffer[word+1]*4;
	    break;
	  case 4:
	    fpDebugCounters->fMonitoringFilter++; 
	    word+=1+buffer[word+1]*4;
	    break;
	  case 5:
	    fpDebugCounters->fMonitoringEvent++; 
	    break;
	  default:
	    fpDebugCounters->fMismatch++;
	    break;
	  }
	  word++;
	}

	static UInt_t lastTime=0;
	TDatime time;
	if (time.Get()-lastTime>1) {
	  lastTime=time.Get();
	  HLTImportant("EventDoneData size %d: readout %d, monitoring filter %d, monitoring event %d, format error %d", 
		       edd->fDataSize, fpDebugCounters->fReadoutFilter, fpDebugCounters->fMonitoringFilter, fpDebugCounters->fMonitoringEvent, fpDebugCounters->fMismatch);
	  for (int i=0; i< wordCnt; ) {
	    TString message;
	    for (int j=0; j<4 && i<wordCnt; j++) {
	      TString number; number.Form("0x%08x ", buffer[i++]);
	      message+=number;
	    }
	    HLTImportant("   %s", message.Data());
	  }
	}
      }
    }
  }
  return iResult;
}

int AliHLTProcessor::DoEvent( const AliHLTComponentEventData& evtData,
			      const AliHLTComponentBlockData* /*blocks*/, 
			      AliHLTComponentTriggerData& trigData,
			      AliHLTUInt8_t* /*outputPtr*/, 
			      AliHLTUInt32_t& size,
			      AliHLTComponentBlockDataList& /*outputBlocks*/ )
{
  // we just forward to the high level method, all other parameters already
  // have been stored internally
  size=0;
  return DoEvent(evtData, trigData);
}

int AliHLTProcessor::DoEvent( const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& /*trigData*/)
{
  // default method: one of DoEvent methods must be implemented
  HLTFatal("no processing method implemented");
  return -ENOSYS;
}
 AliHLTProcessor.cxx:1
 AliHLTProcessor.cxx:2
 AliHLTProcessor.cxx:3
 AliHLTProcessor.cxx:4
 AliHLTProcessor.cxx:5
 AliHLTProcessor.cxx:6
 AliHLTProcessor.cxx:7
 AliHLTProcessor.cxx:8
 AliHLTProcessor.cxx:9
 AliHLTProcessor.cxx:10
 AliHLTProcessor.cxx:11
 AliHLTProcessor.cxx:12
 AliHLTProcessor.cxx:13
 AliHLTProcessor.cxx:14
 AliHLTProcessor.cxx:15
 AliHLTProcessor.cxx:16
 AliHLTProcessor.cxx:17
 AliHLTProcessor.cxx:18
 AliHLTProcessor.cxx:19
 AliHLTProcessor.cxx:20
 AliHLTProcessor.cxx:21
 AliHLTProcessor.cxx:22
 AliHLTProcessor.cxx:23
 AliHLTProcessor.cxx:24
 AliHLTProcessor.cxx:25
 AliHLTProcessor.cxx:26
 AliHLTProcessor.cxx:27
 AliHLTProcessor.cxx:28
 AliHLTProcessor.cxx:29
 AliHLTProcessor.cxx:30
 AliHLTProcessor.cxx:31
 AliHLTProcessor.cxx:32
 AliHLTProcessor.cxx:33
 AliHLTProcessor.cxx:34
 AliHLTProcessor.cxx:35
 AliHLTProcessor.cxx:36
 AliHLTProcessor.cxx:37
 AliHLTProcessor.cxx:38
 AliHLTProcessor.cxx:39
 AliHLTProcessor.cxx:40
 AliHLTProcessor.cxx:41
 AliHLTProcessor.cxx:42
 AliHLTProcessor.cxx:43
 AliHLTProcessor.cxx:44
 AliHLTProcessor.cxx:45
 AliHLTProcessor.cxx:46
 AliHLTProcessor.cxx:47
 AliHLTProcessor.cxx:48
 AliHLTProcessor.cxx:49
 AliHLTProcessor.cxx:50
 AliHLTProcessor.cxx:51
 AliHLTProcessor.cxx:52
 AliHLTProcessor.cxx:53
 AliHLTProcessor.cxx:54
 AliHLTProcessor.cxx:55
 AliHLTProcessor.cxx:56
 AliHLTProcessor.cxx:57
 AliHLTProcessor.cxx:58
 AliHLTProcessor.cxx:59
 AliHLTProcessor.cxx:60
 AliHLTProcessor.cxx:61
 AliHLTProcessor.cxx:62
 AliHLTProcessor.cxx:63
 AliHLTProcessor.cxx:64
 AliHLTProcessor.cxx:65
 AliHLTProcessor.cxx:66
 AliHLTProcessor.cxx:67
 AliHLTProcessor.cxx:68
 AliHLTProcessor.cxx:69
 AliHLTProcessor.cxx:70
 AliHLTProcessor.cxx:71
 AliHLTProcessor.cxx:72
 AliHLTProcessor.cxx:73
 AliHLTProcessor.cxx:74
 AliHLTProcessor.cxx:75
 AliHLTProcessor.cxx:76
 AliHLTProcessor.cxx:77
 AliHLTProcessor.cxx:78
 AliHLTProcessor.cxx:79
 AliHLTProcessor.cxx:80
 AliHLTProcessor.cxx:81
 AliHLTProcessor.cxx:82
 AliHLTProcessor.cxx:83
 AliHLTProcessor.cxx:84
 AliHLTProcessor.cxx:85
 AliHLTProcessor.cxx:86
 AliHLTProcessor.cxx:87
 AliHLTProcessor.cxx:88
 AliHLTProcessor.cxx:89
 AliHLTProcessor.cxx:90
 AliHLTProcessor.cxx:91
 AliHLTProcessor.cxx:92
 AliHLTProcessor.cxx:93
 AliHLTProcessor.cxx:94
 AliHLTProcessor.cxx:95
 AliHLTProcessor.cxx:96
 AliHLTProcessor.cxx:97
 AliHLTProcessor.cxx:98
 AliHLTProcessor.cxx:99
 AliHLTProcessor.cxx:100
 AliHLTProcessor.cxx:101
 AliHLTProcessor.cxx:102
 AliHLTProcessor.cxx:103
 AliHLTProcessor.cxx:104
 AliHLTProcessor.cxx:105
 AliHLTProcessor.cxx:106
 AliHLTProcessor.cxx:107
 AliHLTProcessor.cxx:108
 AliHLTProcessor.cxx:109
 AliHLTProcessor.cxx:110
 AliHLTProcessor.cxx:111
 AliHLTProcessor.cxx:112
 AliHLTProcessor.cxx:113
 AliHLTProcessor.cxx:114
 AliHLTProcessor.cxx:115
 AliHLTProcessor.cxx:116
 AliHLTProcessor.cxx:117
 AliHLTProcessor.cxx:118
 AliHLTProcessor.cxx:119
 AliHLTProcessor.cxx:120
 AliHLTProcessor.cxx:121
 AliHLTProcessor.cxx:122
 AliHLTProcessor.cxx:123
 AliHLTProcessor.cxx:124
 AliHLTProcessor.cxx:125
 AliHLTProcessor.cxx:126
 AliHLTProcessor.cxx:127
 AliHLTProcessor.cxx:128
 AliHLTProcessor.cxx:129
 AliHLTProcessor.cxx:130
 AliHLTProcessor.cxx:131
 AliHLTProcessor.cxx:132
 AliHLTProcessor.cxx:133
 AliHLTProcessor.cxx:134
 AliHLTProcessor.cxx:135
 AliHLTProcessor.cxx:136
 AliHLTProcessor.cxx:137
 AliHLTProcessor.cxx:138
 AliHLTProcessor.cxx:139
 AliHLTProcessor.cxx:140
 AliHLTProcessor.cxx:141
 AliHLTProcessor.cxx:142
 AliHLTProcessor.cxx:143