FEDRA emulsion software from the OPERA Collaboration
TIndexCellIterV Class Reference

#include <TIndexCell.h>

Inheritance diagram for TIndexCellIterV:
Collaboration diagram for TIndexCellIterV:

Public Member Functions

const TIndexCellGetCell () const
 
int LevelDown ()
 
TIndexCell const * Next ()
 
TIndexCell const * NextAll ()
 
void Reset ()
 
void Test ()
 
 TIndexCellIterV (const TIndexCell *cell, int level, long vcent[], long vdiff[], Bool_t dir=kIterForward)
 
 ~TIndexCellIterV ()
 

Private Member Functions

 TIndexCellIterV ()
 

Private Attributes

const TIndexCellfCell
 
Bool_t fDirection
 
Int_t fLevel
 
Int_t fLevel0
 
Int_t fPass
 
Long_t * fVcent
 
Long_t * fVdiff
 
Int_t * fVind
 
Long_t * fVval
 

Constructor & Destructor Documentation

◆ TIndexCellIterV() [1/2]

TIndexCellIterV::TIndexCellIterV ( )
inlineprivate
157 : fCell(0) { }
const TIndexCell * fCell
Definition: TIndexCell.h:146

◆ TIndexCellIterV() [2/2]

TIndexCellIterV::TIndexCellIterV ( const TIndexCell cell,
int  level,
long  vcent[],
long  vdiff[],
Bool_t  dir = kIterForward 
)
734 {
735  // Create cell iterator. By default the iteration direction
736  // is kIterForward. To go backward use kIterBackward.
737 
738  fPass = 0;
739  fCell = cell;
740  fDirection = dir;
741  if( level > fCell->Nlevels() ) level=0;
742  if( level < 1 ) level=0;
743  fLevel = fLevel0 = level;
744 
745  if(fLevel0 >= 0) {
746  fVind = new Int_t[ fLevel0 ];
747  fVval = new Long_t[ fLevel0 ];
748  Reset();
749  }
750 
751  fVcent = new Long_t[level];
752  fVdiff = new Long_t[level];
753 
754  for(int i=0; i<level; i++) {
755  fVcent[i] = vcent[i];
756  fVdiff[i] = vdiff[i];
757  }
758 }
void Reset()
Definition: TIndexCell.cpp:761
Long_t * fVval
Definition: TIndexCell.h:152
Int_t fLevel0
Definition: TIndexCell.h:147
Int_t fLevel
Definition: TIndexCell.h:153
Int_t * fVind
Definition: TIndexCell.h:151
Int_t fPass
Definition: TIndexCell.h:154
Long_t * fVdiff
Definition: TIndexCell.h:149
Long_t * fVcent
Definition: TIndexCell.h:148
Bool_t fDirection
Definition: TIndexCell.h:155
Int_t Nlevels() const
Definition: TIndexCell.cpp:328

◆ ~TIndexCellIterV()

TIndexCellIterV::~TIndexCellIterV ( )
inline
167 { }

Member Function Documentation

◆ GetCell()

const TIndexCell* TIndexCellIterV::GetCell ( ) const
inline
169 { return fCell; }

◆ LevelDown()

int TIndexCellIterV::LevelDown ( )
819 {
820  if(fLevel<2) return 0;
821  fLevel--;
822  fVind[fLevel] = 0;
823  int nent = fCell->At(fLevel-1,fVind)->GetEntriesFast();
824  //printf("LevelDown: level = %d, nent= %d fVind= %d\n",fLevel, nent,fVind[fLevel-1]);
825  if( fVind[fLevel-1] < nent-1 ) {
826  fVind[fLevel-1]++;
827  fLevel=fLevel0;
828  fVind[fLevel0-1]=-1;
829  return 1;
830  } else return LevelDown();
831  return 0;
832 }
int LevelDown()
Definition: TIndexCell.cpp:818
Int_t GetEntriesFast() const
Definition: TIndexCell.h:82
TIndexCell const * At(Int_t narg, Int_t vind[]) const
Definition: TIndexCell.cpp:519

◆ Next()

TIndexCell const * TIndexCellIterV::Next ( )
774 {
775  // Return next object in the defined volume.
776  // Returns 0 when no more objects in the cell.
777 
778  // TODO: inefficient cycle ! put here find...
779 
780  TIndexCell const *b=0;
781 
782  while( (b=NextAll()) ) {
784  //printf("flevel0: %d fVind[0]: %d, fVval[1]: %ld \n",fLevel0, fVind[0], fVval[1]);
785  for(int lev=0; lev<fLevel0; lev++) {
786  if( TMath::Abs( fVval[lev]-fVcent[lev] ) > fVdiff[lev] ) break;
787  if( lev == fLevel0-1 ) return b;
788  }
789  }
790  return 0;
791 }
TIndexCell const * NextAll()
Definition: TIndexCell.cpp:794
Definition: TIndexCell.h:19
Int_t GetValues(Int_t level, Int_t vind[], Long_t val[]) const
Definition: TIndexCell.cpp:505

◆ NextAll()

TIndexCell const * TIndexCellIterV::NextAll ( )
795 {
796  // Return next object in cell. Returns 0 when no more objects in cell.
797 
798  if( fLevel0 <0 ) return 0;
799 
800  START:
801 
802  if( fLevel != fLevel0 ) return 0;
803 
804  int nent = fCell->At(fLevel-1,fVind)->GetEntriesFast();
805  //printf("Next: nent= %d fPass= %d\n",nent,fPass);
806 
807  if( fVind[fLevel-1] < nent-1 ) {
808  fVind[fLevel-1]++;
809  fPass++;
810  return fCell->At(fLevel,fVind);
811  } else {
812  if( LevelDown() ) goto START;
813  }
814  return 0;
815 }

◆ Reset()

void TIndexCellIterV::Reset ( )
762 {
763  // Reset array iterator.
764  if (fDirection == kIterForward) {
765  fLevel = fLevel0;
766  for(int i=0; i<fLevel0; i++ ) fVind[i]=0;
767  fVind[fLevel0-1]=-1;
768  }
769  else {}
770 }

◆ Test()

void TIndexCellIterV::Test ( )
836 {
837  int count=0;
838  while( NextAll() ) count++;
839  printf("count = %d\n",count);
840 }

Member Data Documentation

◆ fCell

const TIndexCell* TIndexCellIterV::fCell
private

◆ fDirection

Bool_t TIndexCellIterV::fDirection
private

◆ fLevel

Int_t TIndexCellIterV::fLevel
private

◆ fLevel0

Int_t TIndexCellIterV::fLevel0
private

◆ fPass

Int_t TIndexCellIterV::fPass
private

◆ fVcent

Long_t* TIndexCellIterV::fVcent
private

◆ fVdiff

Long_t* TIndexCellIterV::fVdiff
private

◆ fVind

Int_t* TIndexCellIterV::fVind
private

◆ fVval

Long_t* TIndexCellIterV::fVval
private

The documentation for this class was generated from the following files: