ROOT logo
#include "hlinearcategory.h"
#include "hlinearcatiter.h"
#include "hades.h"
#include "heventheader.h"
#include "htree.h"
#include "hfilter.h"
#include "hdebug.h"
#include "TClass.h"
#include "TObject.h"
#include "TTree.h"

//*-- Author : Manuel Sanchez
//*-- Modified : 16/12/99 by R. Holzmann
//*-- Modified : 24/8/99 by Manuel Sanchez
//*-- Modified : 26/02/99 by Ilse Koenig
//*-- Modified : 29/02/00 by Denis Bertini
//*-- Modified : 20/07/01 by Dan Magestro (HDataObject --> TObject)
//*-- Modified : 16/01/02 by Manuel Sanchez (Root 3 support)
//*-- Modified : 11/10/04 by Tassilo Christ (support of objects that allocate memory)

//_HADES_CLASS_DESCRIPTION 
/////////////////////////////
//HLinearCategory. See HCategory
//
//  The HLinearCategory is a kind of HCategory. This category is in fact a
// wrapper to a TClonesArray. Therefore it only supports locations with just
// one index. In order to use random access with getSlot(aLoc&), a Compress()
// of the category is needed before calling fillTree()  (otherwise crash!)
//
//  As for the output, one single branch is created for all the data. As usual
// this branch will have one subbranch for each data members in the class of
// the data objects contained in the category.
/////////////////////////////////

HLinearCategory::HLinearCategory(void) {
  fData=NULL;
  fNDataObjs=0;
  hasDynamicObjects=kFALSE;
}

HLinearCategory::HLinearCategory(const Text_t *className,Int_t size) {
  fData=new TClonesArray(className,size);
  fNDataObjs=0;
  hasDynamicObjects=kFALSE;
}

HLinearCategory::~HLinearCategory(void) {
  if (fData) delete fData;
}

void HLinearCategory::setDynamicObjects(Bool_t isDyn)
{
  hasDynamicObjects=kTRUE;
}

const Text_t *HLinearCategory::getClassName(void) {
  return fData->GetClass()->GetName();
}

void HLinearCategory::makeBranch(TBranch *parent) {
}

void HLinearCategory::activateBranch(TTree *tree,Int_t splitLevel) {
  TBranch *brHead=0;
  Char_t name[256];
  
  if (splitLevel)
    if (fHeader && tree) {
      sprintf(name,"%s.Header",getClassName());
      brHead=tree->GetBranch(name);
      if (brHead) { //Pre ROOT3 splitting
	tree->SetBranchAddress(name,&fHeader);
	tree->SetBranchStatus(name,1);
      }
    }
}

TObject *&HLinearCategory::getNewSlot(HLocation&,Int_t* pIndex) {
  if(pIndex) *pIndex = fNDataObjs;
  return fData->operator[](fNDataObjs++);  // return next sequential slot
}

TObject *&HLinearCategory::getSlot(HLocation &aLoc,Int_t* pIndex) {  
                                              // needs Compress()
  TObject *&r=fData->operator[](aLoc[0]);
  if (!r) fNDataObjs++;
  if(pIndex) *pIndex = aLoc[0];
  return r;
}

TObject *&HLinearCategory::getSlot(Int_t index) {  // needs Compress()
  TObject *&r= (*fData)[index];       // bound check + expand if necessary
  if (!r) fNDataObjs++;
  return r;
}

TObject *HLinearCategory::getObject(HLocation &aLoc) {
  return (TObject *)fData->At(aLoc[0]);
}

TObject *HLinearCategory::getObject(Int_t index) {
  return (TObject *)fData->At(index);     // no bound check
}


Bool_t HLinearCategory::filter(HFilter &aFilter) {
  Int_t i;
  Bool_t r=kTRUE;
  for (i=0;i<=fData->GetLast();i++) {
    if (!aFilter.check((TObject *)fData->UncheckedAt(i))) {
	(*fData)[i] = 0;
        fNDataObjs--;
    }
  }
  fData->Compress();
  return r;
}

Bool_t HLinearCategory::filter(HLocation &aLoc,HFilter &aFilter) {
  Int_t i;
  Bool_t r=kTRUE;
  if (aLoc.getNIndex()==0) {
    for (i=0;i<=fData->GetLast();i++) {
      if (!aFilter.check((TObject *)fData->UncheckedAt(i))) {
	(*fData)[i] = 0;
        fNDataObjs--;
      }
    }
    fData->Compress();
  } else r=kFALSE;    
  return r;
}

void HLinearCategory::freeDynamicMemory()
{
  Int_t n = fData->GetEntries();
  for(Int_t i=0;i<n;i++){
    TObject* obj = fData->At(i);
    if (obj) {
      obj->Clear();
    }
  }
}

void HLinearCategory::Clear(const Option_t *opt) {
  if(hasDynamicObjects)
    {
//    freeDynamicMemory();  // make sure that allocated memory is deleted
      fData->Clear("C");    // better let TClonesArray do that for us
    }
  else fData->Clear(opt);
  fNDataObjs=0;
}

TIterator *HLinearCategory::MakeIterator(const Option_t *opt,Bool_t dir) {
  TString option = opt;
  option.ToLower(); 
  if (option.Contains("native")) return fData->MakeIterator(dir);

  HLinearCatIter *iterator=NULL;
  iterator=new HLinearCatIter(this,dir);
  return iterator;
}

void HLinearCategory::Streamer(TBuffer &R__b)
{
   // Stream an object of class HLinearCategory.
  Char_t clase[200];
   if (R__b.IsReading()) {
      Version_t R__v = R__b.ReadVersion();
      HCategory::Streamer(R__b);
      R__b.ReadString(clase,200);
      if ( fData && strcmp(clase,fData->GetClass()->GetName())==0)
        fData->Clear();
      else {
        delete fData;
        fData=new TClonesArray(clase);
      }
      fData->Streamer(R__b);
      if (R__v==1) {
        hasDynamicObjects=kFALSE;
      }
   } else {
      R__b.WriteVersion(HLinearCategory::IsA());
      HCategory::Streamer(R__b);
      strcpy(clase,fData->GetClass()->GetName());
      R__b.WriteString(clase);
      fData->Streamer(R__b);
   }
}

ClassImp(HLinearCategory)
 hlinearcategory.cc:1
 hlinearcategory.cc:2
 hlinearcategory.cc:3
 hlinearcategory.cc:4
 hlinearcategory.cc:5
 hlinearcategory.cc:6
 hlinearcategory.cc:7
 hlinearcategory.cc:8
 hlinearcategory.cc:9
 hlinearcategory.cc:10
 hlinearcategory.cc:11
 hlinearcategory.cc:12
 hlinearcategory.cc:13
 hlinearcategory.cc:14
 hlinearcategory.cc:15
 hlinearcategory.cc:16
 hlinearcategory.cc:17
 hlinearcategory.cc:18
 hlinearcategory.cc:19
 hlinearcategory.cc:20
 hlinearcategory.cc:21
 hlinearcategory.cc:22
 hlinearcategory.cc:23
 hlinearcategory.cc:24
 hlinearcategory.cc:25
 hlinearcategory.cc:26
 hlinearcategory.cc:27
 hlinearcategory.cc:28
 hlinearcategory.cc:29
 hlinearcategory.cc:30
 hlinearcategory.cc:31
 hlinearcategory.cc:32
 hlinearcategory.cc:33
 hlinearcategory.cc:34
 hlinearcategory.cc:35
 hlinearcategory.cc:36
 hlinearcategory.cc:37
 hlinearcategory.cc:38
 hlinearcategory.cc:39
 hlinearcategory.cc:40
 hlinearcategory.cc:41
 hlinearcategory.cc:42
 hlinearcategory.cc:43
 hlinearcategory.cc:44
 hlinearcategory.cc:45
 hlinearcategory.cc:46
 hlinearcategory.cc:47
 hlinearcategory.cc:48
 hlinearcategory.cc:49
 hlinearcategory.cc:50
 hlinearcategory.cc:51
 hlinearcategory.cc:52
 hlinearcategory.cc:53
 hlinearcategory.cc:54
 hlinearcategory.cc:55
 hlinearcategory.cc:56
 hlinearcategory.cc:57
 hlinearcategory.cc:58
 hlinearcategory.cc:59
 hlinearcategory.cc:60
 hlinearcategory.cc:61
 hlinearcategory.cc:62
 hlinearcategory.cc:63
 hlinearcategory.cc:64
 hlinearcategory.cc:65
 hlinearcategory.cc:66
 hlinearcategory.cc:67
 hlinearcategory.cc:68
 hlinearcategory.cc:69
 hlinearcategory.cc:70
 hlinearcategory.cc:71
 hlinearcategory.cc:72
 hlinearcategory.cc:73
 hlinearcategory.cc:74
 hlinearcategory.cc:75
 hlinearcategory.cc:76
 hlinearcategory.cc:77
 hlinearcategory.cc:78
 hlinearcategory.cc:79
 hlinearcategory.cc:80
 hlinearcategory.cc:81
 hlinearcategory.cc:82
 hlinearcategory.cc:83
 hlinearcategory.cc:84
 hlinearcategory.cc:85
 hlinearcategory.cc:86
 hlinearcategory.cc:87
 hlinearcategory.cc:88
 hlinearcategory.cc:89
 hlinearcategory.cc:90
 hlinearcategory.cc:91
 hlinearcategory.cc:92
 hlinearcategory.cc:93
 hlinearcategory.cc:94
 hlinearcategory.cc:95
 hlinearcategory.cc:96
 hlinearcategory.cc:97
 hlinearcategory.cc:98
 hlinearcategory.cc:99
 hlinearcategory.cc:100
 hlinearcategory.cc:101
 hlinearcategory.cc:102
 hlinearcategory.cc:103
 hlinearcategory.cc:104
 hlinearcategory.cc:105
 hlinearcategory.cc:106
 hlinearcategory.cc:107
 hlinearcategory.cc:108
 hlinearcategory.cc:109
 hlinearcategory.cc:110
 hlinearcategory.cc:111
 hlinearcategory.cc:112
 hlinearcategory.cc:113
 hlinearcategory.cc:114
 hlinearcategory.cc:115
 hlinearcategory.cc:116
 hlinearcategory.cc:117
 hlinearcategory.cc:118
 hlinearcategory.cc:119
 hlinearcategory.cc:120
 hlinearcategory.cc:121
 hlinearcategory.cc:122
 hlinearcategory.cc:123
 hlinearcategory.cc:124
 hlinearcategory.cc:125
 hlinearcategory.cc:126
 hlinearcategory.cc:127
 hlinearcategory.cc:128
 hlinearcategory.cc:129
 hlinearcategory.cc:130
 hlinearcategory.cc:131
 hlinearcategory.cc:132
 hlinearcategory.cc:133
 hlinearcategory.cc:134
 hlinearcategory.cc:135
 hlinearcategory.cc:136
 hlinearcategory.cc:137
 hlinearcategory.cc:138
 hlinearcategory.cc:139
 hlinearcategory.cc:140
 hlinearcategory.cc:141
 hlinearcategory.cc:142
 hlinearcategory.cc:143
 hlinearcategory.cc:144
 hlinearcategory.cc:145
 hlinearcategory.cc:146
 hlinearcategory.cc:147
 hlinearcategory.cc:148
 hlinearcategory.cc:149
 hlinearcategory.cc:150
 hlinearcategory.cc:151
 hlinearcategory.cc:152
 hlinearcategory.cc:153
 hlinearcategory.cc:154
 hlinearcategory.cc:155
 hlinearcategory.cc:156
 hlinearcategory.cc:157
 hlinearcategory.cc:158
 hlinearcategory.cc:159
 hlinearcategory.cc:160
 hlinearcategory.cc:161
 hlinearcategory.cc:162
 hlinearcategory.cc:163
 hlinearcategory.cc:164
 hlinearcategory.cc:165
 hlinearcategory.cc:166
 hlinearcategory.cc:167
 hlinearcategory.cc:168
 hlinearcategory.cc:169
 hlinearcategory.cc:170
 hlinearcategory.cc:171
 hlinearcategory.cc:172
 hlinearcategory.cc:173
 hlinearcategory.cc:174
 hlinearcategory.cc:175
 hlinearcategory.cc:176
 hlinearcategory.cc:177
 hlinearcategory.cc:178
 hlinearcategory.cc:179
 hlinearcategory.cc:180
 hlinearcategory.cc:181
 hlinearcategory.cc:182
 hlinearcategory.cc:183
 hlinearcategory.cc:184
 hlinearcategory.cc:185
 hlinearcategory.cc:186
 hlinearcategory.cc:187
 hlinearcategory.cc:188
 hlinearcategory.cc:189
 hlinearcategory.cc:190
 hlinearcategory.cc:191
 hlinearcategory.cc:192