ROOT logo
#include <STEER/AliFMDFloatMap.h>
#include <cstdio>
#include <STEER/AliLog.h>

//____________________________________________________________________
struct Printer : public AliFMDMap::ForOne
{
  Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Float_t v)
  {
    printf("FMD%d%c[%2d,%3d] = %8.3f\n", d, r, s, t, v);
    return kTRUE;
  }
  Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Int_t v)
  {
    printf("FMD%d%c[%2d,%3d] = %d\n", d, r, s, t, v);
    return kTRUE;
  }
};
//____________________________________________________________________
struct Tester : public AliFMDMap::ForOne
{
  Tester(AliFMDFloatMap& m) : fMap(&m) { }
  Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Float_t)
  {
    Int_t    idx = fMap->CalcIndex(d, r, s, t);
    UShort_t rd, rs, rt;
    Char_t   rr;
    fMap->CalcCoords(idx, rd, rr, rs, rt);
	  
    if (d != rd || r != rr || s != rs || t != rt) 
      printf("Mismatch FMD%d%c[%2d,%3d] -> %5d -> FMD%d%c[%2d,%3d]\n",
	     d, r, s, t, idx, rd, rr, rs, rt);
    return kTRUE;
  }
  Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Int_t){return kTRUE;}
  AliFMDFloatMap* fMap;
};
//____________________________________________________________________
struct Filler : public AliFMDMap::ForOne
{
  Filler(AliFMDFloatMap& map) : fMap(&map) {}
  Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Float_t)
  {
    fMap->operator()(d, r, s, t) = MakeVal(d, r, s, t);
    return kTRUE;
  }
  Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Int_t)
  {
    return kTRUE;
  }
  static Float_t MakeVal(UShort_t d, Char_t r, UShort_t s, UShort_t t)
  {
    UShort_t ir  = r == 'I' ? 0 : 1;
    Float_t  val = d * 1000 + ir * 100 + s + 0.001 * t;
    return val;
  }
  AliFMDFloatMap* fMap;
};

//____________________________________________________________________
struct Unity : public AliFMDMap::ForOne
{
  Unity(AliFMDFloatMap& map) : fMap(&map) {}
  Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, Float_t)
  {
    fMap->operator()(d, r, s, t) = 1;
    return kTRUE;
  }
  Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Int_t) {return kTRUE;}
  AliFMDFloatMap* fMap;
};
  
//____________________________________________________________________
void
FillMap(AliFMDFloatMap& m, Bool_t useFiller=kTRUE)
{
  if (useFiller) {
    Filler f(m);
    m.ForEach(f);
    return;
  }
  for (UShort_t d = 1; d <= 3; d++) { 
    UShort_t nRng = (d == 1 ? 1 : 2);
    for (UShort_t q = 0; q < nRng; q++) { 
      Char_t   r    = (q == 0 ? 'I' : 'O');
      UShort_t nSec = 1; // (q == 0 ?  20 :  40);
      UShort_t nStr = (q == 0 ? 512 : 256);
      for (UShort_t s = 0; s < nSec; s++) { 
	for (UShort_t t = 0; t < nStr; t++) {
	  m(d, r, s, t) = Filler::MakeVal(d, r, s, t);
	}
      }
    }
  }
}
//____________________________________________________________________
void
PrintMap(AliFMDFloatMap& map)
{
  Printer p;
  map.ForEach(p);
}
//____________________________________________________________________
void
FillOne(AliFMDFloatMap& map)
{
  Unity u(map);
  map.ForEach(u);
}
  
//____________________________________________________________________
void
TestIndex(AliFMDFloatMap& map, Bool_t useTester=kTRUE)
{
  if (useTester) { 
    Tester t(map);
    map.ForEach(t);
    return;
  }
  for (UShort_t d = 1; d <= 3; d++) { 
    UShort_t nRng = (d == 1 ? 1 : 2);
    for (UShort_t q = 0; q < nRng; q++) { 
      Char_t   r    = (q == 0 ? 'I' : 'O');
      UShort_t nSec = 1; // (q == 0 ?  20 :  40);
      UShort_t nStr = (q == 0 ? 512 : 256);
      for (UShort_t s = 0; s < nSec; s++) { 
	for (UShort_t t = 0; t < nStr; t++) {
	  Int_t idx = map.CalcIndex(d, r, s, t);
	  
	  UShort_t rd, rs, rt;
	  Char_t   rr;
	  map.CalcCoords(idx, rd, rr, rs, rt);
	  
	  if (d != rd || r != rr || s != rs || t != rt) 
	    printf("Mismatch FMD%d%c[%2d,%3d] -> %5d -> FMD%d%c[%2d,%3d]\n",
		   d, r, s, t, idx, rd, rr, rs, rt);
	}
      }
    }
  }
}

void 
TestFloatMap()
{
  // AliLog::SetModuleDebugLevel("FMD", 1);
  AliFMDFloatMap m1(0, 0, 0, 0);
  FillMap(m1);
  // PrintMap(m1);
  TestIndex(m1);

  AliFMDFloatMap m2;
  FillOne(m2);
  // m2 *= m1;
  // m2 /= m1;
  m2 += m2;
  // PrintMap(m2);
  
  AliFMDFloatMap m3(3, 2, 1, 512);
  TestIndex(m3, kFALSE); 
  FillMap(m3, kFALSE);
  // PrintMap(m3);
  FillOne(m2);
  m2 *= m3;
  PrintMap(m2);
}
 TestFloatMap.C:1
 TestFloatMap.C:2
 TestFloatMap.C:3
 TestFloatMap.C:4
 TestFloatMap.C:5
 TestFloatMap.C:6
 TestFloatMap.C:7
 TestFloatMap.C:8
 TestFloatMap.C:9
 TestFloatMap.C:10
 TestFloatMap.C:11
 TestFloatMap.C:12
 TestFloatMap.C:13
 TestFloatMap.C:14
 TestFloatMap.C:15
 TestFloatMap.C:16
 TestFloatMap.C:17
 TestFloatMap.C:18
 TestFloatMap.C:19
 TestFloatMap.C:20
 TestFloatMap.C:21
 TestFloatMap.C:22
 TestFloatMap.C:23
 TestFloatMap.C:24
 TestFloatMap.C:25
 TestFloatMap.C:26
 TestFloatMap.C:27
 TestFloatMap.C:28
 TestFloatMap.C:29
 TestFloatMap.C:30
 TestFloatMap.C:31
 TestFloatMap.C:32
 TestFloatMap.C:33
 TestFloatMap.C:34
 TestFloatMap.C:35
 TestFloatMap.C:36
 TestFloatMap.C:37
 TestFloatMap.C:38
 TestFloatMap.C:39
 TestFloatMap.C:40
 TestFloatMap.C:41
 TestFloatMap.C:42
 TestFloatMap.C:43
 TestFloatMap.C:44
 TestFloatMap.C:45
 TestFloatMap.C:46
 TestFloatMap.C:47
 TestFloatMap.C:48
 TestFloatMap.C:49
 TestFloatMap.C:50
 TestFloatMap.C:51
 TestFloatMap.C:52
 TestFloatMap.C:53
 TestFloatMap.C:54
 TestFloatMap.C:55
 TestFloatMap.C:56
 TestFloatMap.C:57
 TestFloatMap.C:58
 TestFloatMap.C:59
 TestFloatMap.C:60
 TestFloatMap.C:61
 TestFloatMap.C:62
 TestFloatMap.C:63
 TestFloatMap.C:64
 TestFloatMap.C:65
 TestFloatMap.C:66
 TestFloatMap.C:67
 TestFloatMap.C:68
 TestFloatMap.C:69
 TestFloatMap.C:70
 TestFloatMap.C:71
 TestFloatMap.C:72
 TestFloatMap.C:73
 TestFloatMap.C:74
 TestFloatMap.C:75
 TestFloatMap.C:76
 TestFloatMap.C:77
 TestFloatMap.C:78
 TestFloatMap.C:79
 TestFloatMap.C:80
 TestFloatMap.C:81
 TestFloatMap.C:82
 TestFloatMap.C:83
 TestFloatMap.C:84
 TestFloatMap.C:85
 TestFloatMap.C:86
 TestFloatMap.C:87
 TestFloatMap.C:88
 TestFloatMap.C:89
 TestFloatMap.C:90
 TestFloatMap.C:91
 TestFloatMap.C:92
 TestFloatMap.C:93
 TestFloatMap.C:94
 TestFloatMap.C:95
 TestFloatMap.C:96
 TestFloatMap.C:97
 TestFloatMap.C:98
 TestFloatMap.C:99
 TestFloatMap.C:100
 TestFloatMap.C:101
 TestFloatMap.C:102
 TestFloatMap.C:103
 TestFloatMap.C:104
 TestFloatMap.C:105
 TestFloatMap.C:106
 TestFloatMap.C:107
 TestFloatMap.C:108
 TestFloatMap.C:109
 TestFloatMap.C:110
 TestFloatMap.C:111
 TestFloatMap.C:112
 TestFloatMap.C:113
 TestFloatMap.C:114
 TestFloatMap.C:115
 TestFloatMap.C:116
 TestFloatMap.C:117
 TestFloatMap.C:118
 TestFloatMap.C:119
 TestFloatMap.C:120
 TestFloatMap.C:121
 TestFloatMap.C:122
 TestFloatMap.C:123
 TestFloatMap.C:124
 TestFloatMap.C:125
 TestFloatMap.C:126
 TestFloatMap.C:127
 TestFloatMap.C:128
 TestFloatMap.C:129
 TestFloatMap.C:130
 TestFloatMap.C:131
 TestFloatMap.C:132
 TestFloatMap.C:133
 TestFloatMap.C:134
 TestFloatMap.C:135
 TestFloatMap.C:136
 TestFloatMap.C:137
 TestFloatMap.C:138
 TestFloatMap.C:139
 TestFloatMap.C:140
 TestFloatMap.C:141
 TestFloatMap.C:142
 TestFloatMap.C:143
 TestFloatMap.C:144
 TestFloatMap.C:145
 TestFloatMap.C:146
 TestFloatMap.C:147
 TestFloatMap.C:148
 TestFloatMap.C:149
 TestFloatMap.C:150
 TestFloatMap.C:151
 TestFloatMap.C:152
 TestFloatMap.C:153
 TestFloatMap.C:154
 TestFloatMap.C:155
 TestFloatMap.C:156
 TestFloatMap.C:157
 TestFloatMap.C:158
 TestFloatMap.C:159
 TestFloatMap.C:160
 TestFloatMap.C:161
 TestFloatMap.C:162
 TestFloatMap.C:163
 TestFloatMap.C:164
 TestFloatMap.C:165
 TestFloatMap.C:166
 TestFloatMap.C:167