#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.