ROOT logo
//____________________________________________________________________
//
// $id$
//
// Check integrety of Hardware2Detector and Detector2Hardware
//
/** @defgroup HW_Test Hardware map test
    @ingroup FMD_script 
*/
//____________________________________________________________________
/** 
 * Convert hardware address to board,altro,channel
 * 
 * @param w Hardware address
 * @param b out, Board
 * @param a out, Altro 
 * @param c out, Channel
 */
void
HwAddr2Channel(UShort_t w, UShort_t& b, UShort_t& a, UShort_t& c)
{
  b = (w >> 7) & 0x1F;
  a = (w >> 4) & 0x7;
  c = w & 0xF;
}

//____________________________________________________________________
/** 
 * Convert board,altro,channel to hardware address
 * 
 * @param b Board
 * @param a Altro
 * @param c Channel
 * 
 * @return Hardware address
 */
UShort_t
Channel2HwAddr(UShort_t b, UShort_t a, UShort_t c)
{
  return (((b & 0x1F) << 7) | ((a & 0x7) << 4) | (c & 0xF));
}
//____________________________________________________________________
/** 
 * Format a hardware addresss
 * 
 * @ingroup HW_test
 * 
 * @param l  DDL ID
 * @param b  Board
 * @param a  Altro
 * @param c  Channel
 * @param tb Timebin
 * 
 * @return Formatted hardware address
 */
Char_t* 
Addr2Str(UInt_t l, UShort_t b, UShort_t a, UShort_t c, UShort_t tb)
{
  static TString s;
  s = Form("(0x%01X,0x%02X,0x%1X,0x%1X)-%4d", l, b, a, c, tb);
  return s.Data();
}

//____________________________________________________________________
/** 
 * Format a hardware addresss
 * 
 * @ingroup HW_test
 * 
 * @param l  DDL ID
 * @param w  Hardware address
 * @param tb Timebin
 * 
 * @return Formatted hardware address
 */
Char_t* 
Addr2Str(UShort_t l, UShort_t w, UShort_t tb)
{
  UShort_t b, a, c;
  HwAddr2Channel(w, b, a, c);
  return Addr2Str(l, b, a, c, tb);
}

//____________________________________________________________________
/** 
 * Format a detector address 
 * 
 * @ingroup HW_test
 * 
 * @param d Detector
 * @param r Ring 
 * @param s Sector  
 * @param t Strip
 * @param n Sample
 * 
 * @return 
 */
Char_t* 
Det2Str(UShort_t d, Char_t r, UShort_t s, UShort_t t, UShort_t n)
{
  static TString str;
  str = Form("FMD%d%c[%2d,%3d]-%d", d, r, s, t, n);
  return str.Data();
}

//____________________________________________________________________
/** 
 * Print full transformation
 * 
 * @ingroup HW_test
 *
 * @param d    Detector
 * @param r    Ring
 * @param s    Sector 
 * @param t    Strip
 * @param n    Sample
 * @param l    DDL ID
 * @param w    Hardware address
 * @param tb   Timebin
 * @param od   Detector output
 * @param oR   Ring output    
 * @param os   Sector output  
 * @param ot   Strip output   
 * @param on   Sample output  
 */
void 
PrintTrans(UShort_t d,   Char_t r,   UShort_t s,  UShort_t t,  UShort_t n, 
	   UShort_t l,   UShort_t w, UShort_t tb,
	   UShort_t od,  Char_t oR,  UShort_t os, Short_t  ot, UShort_t on)
{
  static TString s1, s2, s3;
  s1 = Det2Str(d, r, s, t, n);
  s2 = Addr2Str(l,w,tb);
  s3 = Det2Str(od, oR, os, ot, on);
  Info("TestHWMap","%s -> %s -> %s", s1.Data(), s2.Data(), s3.Data());
}
//____________________________________________________________________
/** 
 * Print full transformation
 * 
 * @ingroup HW_test
 *
 * @param d    Detector
 * @param r    Ring
 * @param s    Sector 
 * @param t    Strip
 * @param n    Sample
 * @param l    DDL ID
 * @param b    Board
 * @param a    ALTRO
 * @param c    Channel
 * @param tb   Timebin
 * @param od   Detector output
 * @param oR   Ring output    
 * @param os   Sector output  
 * @param ot   Strip output   
 * @param on   Sample output  
 */
void 
PrintTrans(UShort_t d,   Char_t   r,  UShort_t s,  UShort_t t,  UShort_t n, 
	   UShort_t l,   UShort_t b,  UShort_t a,  UShort_t c,  UShort_t tb,
	   UShort_t od,  Char_t   oR, UShort_t os, Short_t  ot, UShort_t on)
{
  static TString s1, s2, s3;
  s1 = Det2Str(d, r, s, t, n);
  s2 = Addr2Str(l,b,a,c,tb);
  s3 = Det2Str(od, oR, os, ot, on);
  Info("TestHWMap","%s -> %s -> %s", s1.Data(), s2.Data(), s3.Data());
}

//____________________________________________________________________
/** 
 * Check transformation
 * 
 * @ingroup HW_test
 *
 * @param d    Detector
 * @param r    Ring
 * @param s    Sector 
 * @param t    Strip
 * @param n    Sample
 * @param od   Detector output
 * @param oR   Ring output    
 * @param os   Sector output  
 * @param ot   Strip output   
 * @param on   Sample output  
 * 
 * @return true on success 
 */
Bool_t
CheckTrans(UShort_t d,  Char_t r,  UShort_t s,  UShort_t t,  UShort_t n, 
	   UShort_t od, Char_t oR, UShort_t os, Short_t  ot, UShort_t on)
{
  bool ok = true;
  TString what;
  if (d != od) {
    what.Append(Form("\n\tDetector # differ %d != %d", d, od));
    ok = false;
  }
  if (r != oR) {
    what.Append(Form("\n\tRing Id differ %c != %c", r, oR));  
    ok = false; 
  }
  if (s != os) {
    what.Append(Form("\n\tSector # differ %d != %d", s, os));
    ok = false;
  }
  if (t != ot) {
    what.Append(Form("\n\tStrip # differ %d != %d", (t / 128) * 128, ot));
    ok = false;
  }
  if (!ok) {
    static TString s1, s3;
    s1 = Det2Str(d, r, s, t);
    s3 = Det2Str(od, oR, os, ot);
    Warning("TestHWMap", "%s -> %s %s", s1.Data(), s3.Data(), what.Data());
  }
  return ok;
}

//____________________________________________________________________
/** 
 * Test hardware address map by converting from detector coordinates
 * to hardware address and then back again.
 * 
 * @ingroup HW_test
 *
 * @param useHwAddr Whether to use 12 bit hardware address, or
 *                  board,altro,channel 
 * @param few       Only do a few - 1 detector, one sector 
 */
void
TestHWMap(bool useHwAddr=false, bool few=false)
{
  AliCDBManager* cdb = AliCDBManager::Instance();
  cdb->SetDefaultStorage("local://${ALICE_ROOT}/OCDB");
  cdb->SetRun(0);

  AliFMDParameters* param = AliFMDParameters::Instance();
  param->Init(true, AliFMDParameters::kAltroMap);
  param->SetSampleRate(2);
  AliLog::SetModuleDebugLevel("FMD", 51);

  UInt_t ol = 0, ow = 0xFFFFFFFF;
  UShort_t nd = (few ? 1 : 3); 
  for (UShort_t d = 1; d <= nd; d++) {
    UShort_t nr = (d == 1 ? 1 : 2);
    for (UShort_t q = 0; q < nr; q++) {
      Char_t r  = (q ==   0 ? 'I' : 'O');
      Int_t  ns = (few ? 1 : (r == 'I' ?  20 :  40));
      Int_t  nt =            (r == 'I' ? 512 : 256);
      for (UShort_t s = 0; s < ns; s++) {
	for (UShort_t t = 0; t < nt; t++) {
	  Int_t nsam = param->GetSampleRate(d, r, s, t);
	  for (UShort_t n=0; n < nsam; n++) {
	    UShort_t l, b, a, c, w, tb;
	    bool ret = true;
	    if (useHwAddr) 
	      ret = param->Detector2Hardware(d, r, s, t, n, l, w, tb);
	    else {
	      ret = param->Detector2Hardware(d, r, s, t, n, l, b, a, c, tb);
	      w   = Channel2HwAddr(b, a, c);
	    }
	    if (!ret) {
	      Warning("TestHWMap", "detector to hardware failed on %s", 
		      Det2Str(d, r, s, t, n));
	      continue;
	    }
	    UShort_t od, os, on;
	    Short_t  ot;
	    Char_t   oR;
	    if (useHwAddr) 
	      ret = param->Hardware2Detector(l,w,tb,od,oR,os,ot,on);
	    else 
	      ret = param->Hardware2Detector(l,b,a,c,tb,od,oR,os,ot,on);
	    if (!ret) {
	      Warning("TestHWMap", "hardware to detector failed on %s", 
		      Addr2Str(l, w, tb));
	      continue;
	    }
	    bool print = few;
	    if (ol != l || ow != w) {
	      print = true;
	      ol    = l;
	      ow    = w;
	    }
	    if (!CheckTrans(d,r,s,t,n,od,oR,os,ot,on)) print = true;
	    if (print) {
	      if (useHwAddr)  
		PrintTrans(d,r,s,t,n,l,w,tb,od,oR,os,ot,on);
	      else
		PrintTrans(d,r,s,t,n,l,b,a,c,tb,od,oR,os,ot,on);
	    }
	  } // Loop over samples
	}// Loop over strips
      } // Loop over sectors
    } // Loop over rings
  } // Loop over detectors
}

  
//____________________________________________________________________
//
// EOF
//
    
	

	  
 TestHWMap.C:1
 TestHWMap.C:2
 TestHWMap.C:3
 TestHWMap.C:4
 TestHWMap.C:5
 TestHWMap.C:6
 TestHWMap.C:7
 TestHWMap.C:8
 TestHWMap.C:9
 TestHWMap.C:10
 TestHWMap.C:11
 TestHWMap.C:12
 TestHWMap.C:13
 TestHWMap.C:14
 TestHWMap.C:15
 TestHWMap.C:16
 TestHWMap.C:17
 TestHWMap.C:18
 TestHWMap.C:19
 TestHWMap.C:20
 TestHWMap.C:21
 TestHWMap.C:22
 TestHWMap.C:23
 TestHWMap.C:24
 TestHWMap.C:25
 TestHWMap.C:26
 TestHWMap.C:27
 TestHWMap.C:28
 TestHWMap.C:29
 TestHWMap.C:30
 TestHWMap.C:31
 TestHWMap.C:32
 TestHWMap.C:33
 TestHWMap.C:34
 TestHWMap.C:35
 TestHWMap.C:36
 TestHWMap.C:37
 TestHWMap.C:38
 TestHWMap.C:39
 TestHWMap.C:40
 TestHWMap.C:41
 TestHWMap.C:42
 TestHWMap.C:43
 TestHWMap.C:44
 TestHWMap.C:45
 TestHWMap.C:46
 TestHWMap.C:47
 TestHWMap.C:48
 TestHWMap.C:49
 TestHWMap.C:50
 TestHWMap.C:51
 TestHWMap.C:52
 TestHWMap.C:53
 TestHWMap.C:54
 TestHWMap.C:55
 TestHWMap.C:56
 TestHWMap.C:57
 TestHWMap.C:58
 TestHWMap.C:59
 TestHWMap.C:60
 TestHWMap.C:61
 TestHWMap.C:62
 TestHWMap.C:63
 TestHWMap.C:64
 TestHWMap.C:65
 TestHWMap.C:66
 TestHWMap.C:67
 TestHWMap.C:68
 TestHWMap.C:69
 TestHWMap.C:70
 TestHWMap.C:71
 TestHWMap.C:72
 TestHWMap.C:73
 TestHWMap.C:74
 TestHWMap.C:75
 TestHWMap.C:76
 TestHWMap.C:77
 TestHWMap.C:78
 TestHWMap.C:79
 TestHWMap.C:80
 TestHWMap.C:81
 TestHWMap.C:82
 TestHWMap.C:83
 TestHWMap.C:84
 TestHWMap.C:85
 TestHWMap.C:86
 TestHWMap.C:87
 TestHWMap.C:88
 TestHWMap.C:89
 TestHWMap.C:90
 TestHWMap.C:91
 TestHWMap.C:92
 TestHWMap.C:93
 TestHWMap.C:94
 TestHWMap.C:95
 TestHWMap.C:96
 TestHWMap.C:97
 TestHWMap.C:98
 TestHWMap.C:99
 TestHWMap.C:100
 TestHWMap.C:101
 TestHWMap.C:102
 TestHWMap.C:103
 TestHWMap.C:104
 TestHWMap.C:105
 TestHWMap.C:106
 TestHWMap.C:107
 TestHWMap.C:108
 TestHWMap.C:109
 TestHWMap.C:110
 TestHWMap.C:111
 TestHWMap.C:112
 TestHWMap.C:113
 TestHWMap.C:114
 TestHWMap.C:115
 TestHWMap.C:116
 TestHWMap.C:117
 TestHWMap.C:118
 TestHWMap.C:119
 TestHWMap.C:120
 TestHWMap.C:121
 TestHWMap.C:122
 TestHWMap.C:123
 TestHWMap.C:124
 TestHWMap.C:125
 TestHWMap.C:126
 TestHWMap.C:127
 TestHWMap.C:128
 TestHWMap.C:129
 TestHWMap.C:130
 TestHWMap.C:131
 TestHWMap.C:132
 TestHWMap.C:133
 TestHWMap.C:134
 TestHWMap.C:135
 TestHWMap.C:136
 TestHWMap.C:137
 TestHWMap.C:138
 TestHWMap.C:139
 TestHWMap.C:140
 TestHWMap.C:141
 TestHWMap.C:142
 TestHWMap.C:143
 TestHWMap.C:144
 TestHWMap.C:145
 TestHWMap.C:146
 TestHWMap.C:147
 TestHWMap.C:148
 TestHWMap.C:149
 TestHWMap.C:150
 TestHWMap.C:151
 TestHWMap.C:152
 TestHWMap.C:153
 TestHWMap.C:154
 TestHWMap.C:155
 TestHWMap.C:156
 TestHWMap.C:157
 TestHWMap.C:158
 TestHWMap.C:159
 TestHWMap.C:160
 TestHWMap.C:161
 TestHWMap.C:162
 TestHWMap.C:163
 TestHWMap.C:164
 TestHWMap.C:165
 TestHWMap.C:166
 TestHWMap.C:167
 TestHWMap.C:168
 TestHWMap.C:169
 TestHWMap.C:170
 TestHWMap.C:171
 TestHWMap.C:172
 TestHWMap.C:173
 TestHWMap.C:174
 TestHWMap.C:175
 TestHWMap.C:176
 TestHWMap.C:177
 TestHWMap.C:178
 TestHWMap.C:179
 TestHWMap.C:180
 TestHWMap.C:181
 TestHWMap.C:182
 TestHWMap.C:183
 TestHWMap.C:184
 TestHWMap.C:185
 TestHWMap.C:186
 TestHWMap.C:187
 TestHWMap.C:188
 TestHWMap.C:189
 TestHWMap.C:190
 TestHWMap.C:191
 TestHWMap.C:192
 TestHWMap.C:193
 TestHWMap.C:194
 TestHWMap.C:195
 TestHWMap.C:196
 TestHWMap.C:197
 TestHWMap.C:198
 TestHWMap.C:199
 TestHWMap.C:200
 TestHWMap.C:201
 TestHWMap.C:202
 TestHWMap.C:203
 TestHWMap.C:204
 TestHWMap.C:205
 TestHWMap.C:206
 TestHWMap.C:207
 TestHWMap.C:208
 TestHWMap.C:209
 TestHWMap.C:210
 TestHWMap.C:211
 TestHWMap.C:212
 TestHWMap.C:213
 TestHWMap.C:214
 TestHWMap.C:215
 TestHWMap.C:216
 TestHWMap.C:217
 TestHWMap.C:218
 TestHWMap.C:219
 TestHWMap.C:220
 TestHWMap.C:221
 TestHWMap.C:222
 TestHWMap.C:223
 TestHWMap.C:224
 TestHWMap.C:225
 TestHWMap.C:226
 TestHWMap.C:227
 TestHWMap.C:228
 TestHWMap.C:229
 TestHWMap.C:230
 TestHWMap.C:231
 TestHWMap.C:232
 TestHWMap.C:233
 TestHWMap.C:234
 TestHWMap.C:235
 TestHWMap.C:236
 TestHWMap.C:237
 TestHWMap.C:238
 TestHWMap.C:239
 TestHWMap.C:240
 TestHWMap.C:241
 TestHWMap.C:242
 TestHWMap.C:243
 TestHWMap.C:244
 TestHWMap.C:245
 TestHWMap.C:246
 TestHWMap.C:247
 TestHWMap.C:248
 TestHWMap.C:249
 TestHWMap.C:250
 TestHWMap.C:251
 TestHWMap.C:252
 TestHWMap.C:253
 TestHWMap.C:254
 TestHWMap.C:255
 TestHWMap.C:256
 TestHWMap.C:257
 TestHWMap.C:258
 TestHWMap.C:259
 TestHWMap.C:260
 TestHWMap.C:261
 TestHWMap.C:262
 TestHWMap.C:263
 TestHWMap.C:264
 TestHWMap.C:265
 TestHWMap.C:266
 TestHWMap.C:267
 TestHWMap.C:268
 TestHWMap.C:269
 TestHWMap.C:270
 TestHWMap.C:271
 TestHWMap.C:272
 TestHWMap.C:273
 TestHWMap.C:274
 TestHWMap.C:275
 TestHWMap.C:276
 TestHWMap.C:277
 TestHWMap.C:278
 TestHWMap.C:279
 TestHWMap.C:280
 TestHWMap.C:281
 TestHWMap.C:282
 TestHWMap.C:283
 TestHWMap.C:284
 TestHWMap.C:285
 TestHWMap.C:286
 TestHWMap.C:287
 TestHWMap.C:288
 TestHWMap.C:289
 TestHWMap.C:290
 TestHWMap.C:291
 TestHWMap.C:292
 TestHWMap.C:293
 TestHWMap.C:294
 TestHWMap.C:295
 TestHWMap.C:296
 TestHWMap.C:297
 TestHWMap.C:298
 TestHWMap.C:299
 TestHWMap.C:300
 TestHWMap.C:301
 TestHWMap.C:302
 TestHWMap.C:303
 TestHWMap.C:304
 TestHWMap.C:305
 TestHWMap.C:306
 TestHWMap.C:307
 TestHWMap.C:308
 TestHWMap.C:309
 TestHWMap.C:310