ROOT logo
#include <TRandom.h>
#include <TStopwatch.h>
#include <AliFMDFloatMap.h>

Float_t 
TestValue(UShort_t d, Char_t r, UShort_t s, UShort_t t, Float_t v)
{
  return d * 1000000 + ((r=='I')+1) * 100000 + s * 1000 + t + v;
}
  
struct TestOne : public AliFMDMap::ForOne
{
  Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Float_t v)
  {
    // Caculate a simple number from d, r, s, t, v 
    Float_t x = TestValue(d, r, s, t, v);
    return x > -1000000000; // Always true
  }
  Bool_t operator()(UShort_t,Char_t,UShort_t,UShort_t,Int_t) {return true;}
  Bool_t operator()(UShort_t,Char_t,UShort_t,UShort_t,Bool_t) {return true;}
  Bool_t operator()(UShort_t,Char_t,UShort_t,UShort_t,UShort_t) {return true;}
};

void 
AccessOneByOne(AliFMDFloatMap& m)
{
  TestOne p;
  m.ForEach(p);
}

void
AccessByCoords(AliFMDFloatMap& m)
{
  for (UShort_t d = 1; d <= 3; d++) { 
    UShort_t nr = (d == 1 ? 1 : 2);
    for (UShort_t q = 0; q < nr; q++) { 
      Char_t    r = (q == 0 ? 'I' : 'O');
      UShort_t ns = (q == 0 ?  20 :  40);
      UShort_t nt = (q == 0 ? 512 : 256);
      for (UShort_t s = 0; s < ns; s++) {
	for (UShort_t t = 0; t < nt; t++) { 
	  Float_t x = TestValue(d, r, s, t, m(d,r,s,t));
	  if (x < -1000000000) break;
	}
      }
    }
  }
}
	
void
FillRandom(AliFMDFloatMap& m) 
{
  Float_t* data = m.Data();
  UInt_t   max  = 51200; // m.MaxIndex();

  for (UInt_t i = 0; i < max; i++) 
    data[i] = gRandom->Uniform(1);
}
      
void
TestMapAccess(Int_t n=1000)
{
 
  AliFMDFloatMap m(0);
  TStopwatch s;

  s.Reset();
  for (Int_t i = 0; i < n; i++) { 
    FillRandom(m);
    s.Start(kFALSE);
    AccessOneByOne(m);
    s.Stop();
  }
  s.Print();

  s.Reset();
  for (Int_t i = 0; i < n; i++) { 
    FillRandom(m);
    s.Start(kFALSE);
    AccessByCoords(m);
    s.Stop();
  }
  s.Print();
}

#ifndef __CINT__
#include <sstream>

int
main(int argc, char** argv)
{
  int n  = 1000;
  if (argc > 1) { 
    std::stringstream s(argv[1]);
    s >> n;
  }
  TestMapAccess(n);
  return 0;
}
#endif
 TestMapAccess.C:1
 TestMapAccess.C:2
 TestMapAccess.C:3
 TestMapAccess.C:4
 TestMapAccess.C:5
 TestMapAccess.C:6
 TestMapAccess.C:7
 TestMapAccess.C:8
 TestMapAccess.C:9
 TestMapAccess.C:10
 TestMapAccess.C:11
 TestMapAccess.C:12
 TestMapAccess.C:13
 TestMapAccess.C:14
 TestMapAccess.C:15
 TestMapAccess.C:16
 TestMapAccess.C:17
 TestMapAccess.C:18
 TestMapAccess.C:19
 TestMapAccess.C:20
 TestMapAccess.C:21
 TestMapAccess.C:22
 TestMapAccess.C:23
 TestMapAccess.C:24
 TestMapAccess.C:25
 TestMapAccess.C:26
 TestMapAccess.C:27
 TestMapAccess.C:28
 TestMapAccess.C:29
 TestMapAccess.C:30
 TestMapAccess.C:31
 TestMapAccess.C:32
 TestMapAccess.C:33
 TestMapAccess.C:34
 TestMapAccess.C:35
 TestMapAccess.C:36
 TestMapAccess.C:37
 TestMapAccess.C:38
 TestMapAccess.C:39
 TestMapAccess.C:40
 TestMapAccess.C:41
 TestMapAccess.C:42
 TestMapAccess.C:43
 TestMapAccess.C:44
 TestMapAccess.C:45
 TestMapAccess.C:46
 TestMapAccess.C:47
 TestMapAccess.C:48
 TestMapAccess.C:49
 TestMapAccess.C:50
 TestMapAccess.C:51
 TestMapAccess.C:52
 TestMapAccess.C:53
 TestMapAccess.C:54
 TestMapAccess.C:55
 TestMapAccess.C:56
 TestMapAccess.C:57
 TestMapAccess.C:58
 TestMapAccess.C:59
 TestMapAccess.C:60
 TestMapAccess.C:61
 TestMapAccess.C:62
 TestMapAccess.C:63
 TestMapAccess.C:64
 TestMapAccess.C:65
 TestMapAccess.C:66
 TestMapAccess.C:67
 TestMapAccess.C:68
 TestMapAccess.C:69
 TestMapAccess.C:70
 TestMapAccess.C:71
 TestMapAccess.C:72
 TestMapAccess.C:73
 TestMapAccess.C:74
 TestMapAccess.C:75
 TestMapAccess.C:76
 TestMapAccess.C:77
 TestMapAccess.C:78
 TestMapAccess.C:79
 TestMapAccess.C:80
 TestMapAccess.C:81
 TestMapAccess.C:82
 TestMapAccess.C:83
 TestMapAccess.C:84
 TestMapAccess.C:85
 TestMapAccess.C:86
 TestMapAccess.C:87
 TestMapAccess.C:88
 TestMapAccess.C:89
 TestMapAccess.C:90
 TestMapAccess.C:91
 TestMapAccess.C:92
 TestMapAccess.C:93
 TestMapAccess.C:94
 TestMapAccess.C:95
 TestMapAccess.C:96
 TestMapAccess.C:97
 TestMapAccess.C:98
 TestMapAccess.C:99
 TestMapAccess.C:100
 TestMapAccess.C:101