#include "hordcategory.h"
#include "hlocateddataobject.h"
#include "heventheader.h"
#include "hordcatiter.h"
#include "hades.h"
#include "htree.h"
#include "hfilter.h"
#include "hdebug.h"
#include "TClass.h"
#include "TTree.h"
Int_t  HOrdCategory::init_count=0;
HOrdCategory::HOrdCategory(void) {
  ++init_count;   
  currentOffset=-1;
  currentLenght=-1; 
  currentlinearAddr=-1;
  setup = NULL;
  maxSize=0; 
  fData=NULL;
  isNotset=kTRUE; 
 }
HOrdCategory::HOrdCategory(Text_t *className,Int_t nentries,
				 Int_t nDim,
				 Int_t *sizes) {
  ++init_count; 
  fData=NULL;
  fNDataObjs=-1;
  currentOffset=-1;
  currentLenght=-1; 
  currentlinearAddr=-1;
  isNotset=kTRUE; 
  setCapacity(className,nentries,nDim,sizes,1); 
}
void HOrdCategory::setCapacity(Text_t *className, 
                          Int_t size,
			  Int_t nDim,
			  Int_t *sizes,Int_t flag){
 if(!setup) setup = new PatternSetup();
 setup->nLevels = nDim;
 (setup->maxSizes).Set(setup->nLevels); 
 for(Int_t i=0;i<setup->nLevels;i++) 
    {
     (setup->maxSizes).fArray[i] = sizes[i];
 }
 fData=new HOrdClonesArray(setup->nLevels,sizes,className,size,0,flag);
 maxSize=fData->getMaxSize();  
 (setup->offsets).Set(maxSize);
 (setup->lenghts).Set(maxSize);
 fData->setCategory(this);
}
HOrdCategory::~HOrdCategory(void) {
 --init_count;
  if (init_count < 0 ) {
  if(setup)  delete setup;  
  if (fData) fData->Delete(); delete fData; fData=0;
  }
}
const Text_t *HOrdCategory::getClassName(void) {
  return fData->GetClass()->GetName();
}
void HOrdCategory::makeBranch(TBranch *parent) {
}
void HOrdCategory::activateBranch(TTree *tree,Int_t splitLevel) {
}
TObject *&HOrdCategory::getNewSlot(HLocation& aLoc,Int_t* pIndex) {
  setCurrLinearAddr(aLoc.getLinearIndex(&(setup->maxSizes)));
  fData->setLevel(currentlinearAddr); 
  TObject *&r=fData->operator[](fNDataObjs++);
  return r;
}
TObject *&HOrdCategory::getSlot(HLocation &aLoc,Int_t* pIndex) {
  setCurrLinearAddr(aLoc.getLinearIndex(&(setup->maxSizes)));
  fData->setLevel(currentlinearAddr); 
  TObject *&r=fData->operator[](fNDataObjs++);
  return r;
}
TObject *&HOrdCategory::getSlot(Int_t index) {  
 fData->setLevel(index);
 TObject *&r= fData->operator[](index);       
 return r;
}
TObject *HOrdCategory::getObject(HLocation &aLoc) {
return (TObject *)fData->UncheckedAt(aLoc[0]);
}
TObject *HOrdCategory::getObject(Int_t index) {
return (TObject *)fData->UncheckedAt(index);
} 
TObject *HOrdCategory::getObject(HLocation &aLoc, Int_t index) {
if(setup){
 setCurrLinearAddr(aLoc.getLinearIndex(&(setup->maxSizes)));
 TObjArray* obj = fData->getSubArray(currentlinearAddr); 
   if(obj){
       return (TObject *) obj->UncheckedAt(index);
   }
  if ( index >  getCurrentLinearLenght() ) return NULL; 
return (TObject *)fData->UncheckedAt(getCurrentLinearOffset()+index);
}
return NULL; 
}
Int_t HOrdCategory::getNDataObjects(HLocation &aLoc){
if(setup){
 setCurrLinearAddr(aLoc.getLinearIndex(&(setup->maxSizes)));
 TObjArray* obj = fData->getSubArray(currentlinearAddr); 
   if(obj){
       return (Int_t) obj->GetEntriesFast();
   }
 
return  getCurrentLinearLenght(); 
}
return -1;
}  
Bool_t HOrdCategory::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->RemoveAt(i);
  }
  fData->Compress();
  return r;
}
Bool_t HOrdCategory::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->RemoveAt(i);
    }
    fData->Compress();
  } else r=kFALSE;    
  return r;
}
void HOrdCategory::Clear(void) {
   currentOffset=currentLenght=currentlinearAddr=-1; 
   setup->reset();  
   fNDataObjs=-1;
   fData->Clear();
}
TIterator *HOrdCategory::MakeIterator(Option_t *opt,Bool_t dir) {
  TString option = opt;
  option.ToLower(); 
  if (option.Contains("native")) return fData->MakeIterator(dir);
 return  fData->MakeIterator(dir);
}
TIterator *HOrdCategory::MakeIterator(HLocation *loc,
                                      Option_t *opt,Bool_t dir) {
  
 if(!loc) return MakeIterator(opt,dir);
  
 if(setup){
 TObjArray* obj = fData->getSubArray(loc->getLinearIndex(&(setup->maxSizes))); 
   if(obj){
     #if DEBUG_LEVEL>2
      Warning(" i create a TObjArray iter:  %i  \n",
                obj->GetEntries());
     #endif
 
     return   obj->MakeIterator(dir);
   }
 }
   HOrdCatIter *iterator=NULL;
    #if DEBUG_LEVEL>2
     Warning("MakeIterator",
             "linear address :%i \n", currentlinearAddr );
    #endif
   iterator=new HOrdCatIter(loc,this,dir);
   return iterator;
}
void HOrdCategory::Streamer(TBuffer &R__b)
{
  
  
   Char_t clase[200];
    if (R__b.IsReading()) {
      Version_t R__v = R__b.ReadVersion(); if (R__v) { }
      HCategory::Streamer(R__b);
      if(setup) setup->reset();
      R__b >> setup;
      R__b >> fNDataObjs;
      R__b.ReadString(clase,200);
          
      if ( fData && strcmp(clase,fData->GetClass()->GetName())==0)
         fData->Clear();
      else {
         setCapacity(clase,fNDataObjs,setup->nLevels,
                      (setup->maxSizes).fArray,0); 
      }
     
      fData->Streamer(R__b);
   } else {
      R__b.WriteVersion(HOrdCategory::IsA());
      HCategory::Streamer(R__b);
      fData->createPattern(); 
      R__b << setup;   
      R__b << fNDataObjs;
      strcpy(clase,fData->GetClass()->GetName());
      R__b.WriteString(clase);
      fData->Streamer(R__b);
   }
}
ClassImp(PatternSetup)
ClassImp(HOrdCategory)
Last change: Sat May 22 13:18:04 2010
Last generated: 2010-05-22 13:18
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.