ROOT logo
// $Id$
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Authors: Jochen Thaeder <thaeder@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   AliHLTHOMERBlockDesc.cxx
    @author Jochen Thaeder
    @date   
    @brief  Container for HOMER Blocks
*/

// see header file for class documentation
// or
// refer to README to build package
// or
// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt

#include "AliHLTHOMERBlockDesc.h"

#include "AliHLTMessage.h"

#include "TMath.h"
#include "TClass.h"

ClassImp(AliHLTHOMERBlockDesc)

/*
 * ---------------------------------------------------------------------------------
 *                            Constructor / Destructor 
 * --------------------------------------------------------------------------------- 
 */

//##################################################################################
AliHLTHOMERBlockDesc::AliHLTHOMERBlockDesc() :
  fData(NULL),
  fSize(0),
  fBlockName(),
  fIsTObject(kFALSE),
  fIsRawData(kFALSE),
  fMessage(NULL),
  fTObject(NULL),
  fClassName(),
  fDataType(),
  fDetector(),
  fSpecification(0),
  fSubDetector(0),
  fSubSubDetector(0),
  fHasSubDetectorRange(kFALSE),
  fHasSubSubDetectorRange(kFALSE) {
  // see header file for class documentation
  // or
  // refer to README to build package
  // or
  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
}

//##################################################################################
AliHLTHOMERBlockDesc::~AliHLTHOMERBlockDesc() {
  // see header file for class documentation

  if ( fMessage != NULL )
    delete fMessage;
  fMessage = NULL;

  if ( fData )
    delete [] fData;
  fData = NULL;

  if ( fTObject ) 
    delete fTObject;
  fTObject = NULL;
}

/*
 * ---------------------------------------------------------------------------------
 *                            Data Handling - Setter - public
 * --------------------------------------------------------------------------------- 
 */

//##################################################################################
void AliHLTHOMERBlockDesc::SetBlock( void * data, ULong_t size, TString origin, 
				     TString dataType, ULong_t specification ) {
  // see header file for class documentation

  fData = new Char_t[size];
  memcpy( fData, data, size);
  
  fSize = size;
  fDetector = origin; 
  fDataType = dataType;
  fSpecification = specification; 

  fBlockName.Form("%s_%s_0x%08lX", fDetector.Data(), fDataType.Data(), fSpecification ); 

  // -- Set block parameters
  SetBlockParameters();

  return;
}

/*
 * ---------------------------------------------------------------------------------
 *                            Data Handling - private
 * --------------------------------------------------------------------------------- 
 */

//##################################################################################
void AliHLTHOMERBlockDesc::SetBlockParameters() {
  // see header file for class documentation

  //Int_t iResult = 0;

  // ---- SET SPECIFICATIONS ----
  // ----------------------------

  // **** TPC **** ( has special treatment )
  if ( ! fDetector.CompareTo("TPC") ) {
    
    Int_t minPatch  = (fSpecification & 0x000000FF);
    Int_t maxPatch  = (fSpecification & 0x0000FF00) >> 8;
    Int_t minSector = (fSpecification & 0x00FF0000) >> 16 ;
    Int_t maxSector = (fSpecification & 0xFF000000) >> 24;
    
    fSubDetector = minSector;
    fSubSubDetector = minPatch;
    
    // -- check for ranges
    if ( minSector != maxSector )
      fHasSubDetectorRange = kTRUE;

    if ( minPatch != maxPatch )
      fHasSubSubDetectorRange = kTRUE;
    
  }
  // **** OTHER DETECTORS ****
  else {
      
    if ( fSpecification ) {
	// find the max bin which is set to 1
      fSubDetector = TMath::FloorNint( TMath::Log2(fSpecification) );
      
      // -- check for ranges
      if ( TMath::Log2(fSpecification) != 
	   static_cast<Double_t>(TMath::FloorNint(TMath::Log2(fSpecification))) )
	fHasSubDetectorRange = kTRUE;
    }
  }

  // ---- SET CLASS NAME, DATA CONTENTS ----
  // ---------------------------------------

  // -- Check if block contains raw data
  if ( CheckIfRawData() )
    return;

  // -- Check if block contains TObject  
  if ( CheckIfTObject() )
    return;

  // -- Contains arbitrary data type
      
  // **** TPC ****
  if ( ! fDetector.CompareTo("TPC") ) {
    
    if ( ! fDataType.CompareTo("CLUSTERS") )
      fClassName = "AliHLTTPCSpacePoints";
    //else 
    //  iResult = -1;
  }
  /*
  // **** TRD ****
  else if ( ! fDetector.CompareTo("TRD") ) {
    iResult = -1;
  }
  
  // **** PHOS ****
  else if ( ! fDetector.CompareTo("PHOS") ) {
    iResult = -1;
  }
  
  // **** MUON ****
  else if ( ! fDetector.CompareTo("MUON") ) {
    iResult = -1;
  }
  
  // **** OTHER ****
  else {
    iResult = -1;
  }
  */
  
  // -- Check if classname has been defined
  //  if ( iResult < 0 ) {
    //   AliWarning( Form("The classname for data type %s for the detector %s has not been defined yet.", 
    //	     fDataType.Data(), fDetector.Data()) );
  // }
  return;
}
  
//##################################################################################
Bool_t AliHLTHOMERBlockDesc::CheckIfTObject() {
  // see header file for class documentation

  // -- Check Length - First 32 bit word of payload contains the length
  UInt_t len = *( (UInt_t*) fData  );
  
  if ( len != ( fSize - sizeof(UInt_t) ) ) 
    return fIsTObject;
    
  // -- set AliHLTMessage
  if ( fMessage ) 
    delete fMessage;
  fMessage = NULL;    

  fMessage = new AliHLTMessage( fData, fSize );
  
  // -- Check if TMessage payload is TObject
  if ( fMessage->What() == kMESS_OBJECT and fMessage->GetClass() != NULL and fMessage->GetClass() != (TClass*)-1)
  {
    fClassName = fMessage->GetClass()->GetName();
    fIsTObject = kTRUE;
    
    fTObject = fMessage->ReadObject( fMessage->GetClass() );
  }
  
  fMessage->Reset();

  return fIsTObject;
}

//##################################################################################
Bool_t AliHLTHOMERBlockDesc::CheckIfRawData() {
  // see header file for class documentation

  if ( ! fDataType.CompareTo("DDL_RAW") )
    fIsRawData = kTRUE;

  return fIsRawData;
}

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