ROOT logo
//////////////////////////////////////////////////////////////////////////////
//
// @(#)hydraTrans/richNew:$Id: $
//
//*-- Author  : RICH team member
//*-- Revised : Martin Jurkovic <martin.jurkovic@ph.tum.de> 2010
//
//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
//  HRichMappingPar
//
// This class provides mapping between the HW addresses (ADC module,
// APV board, CHANNEL number in the electronics) to the SW address
// (COLUMN and ROW number on the padplane).
//
// HW_ADDRESS (calculated the same way as in the electronics):
//     (ADC << 11) + (APV << 7) + CHANNEL
//
// SW_ADDRESS:
//     (COL * 100) + ROW
//
//////////////////////////////////////////////////////////////////////////////


#include "hdetpario.h"
#include "hpario.h"
#include "hrichmappingpar.h"

#include <fstream>

using namespace std;

ClassImp(HRichMappingPar)

HRichMappingPar::HRichMappingPar(const Char_t* name,
                                 const Char_t* title,
                                 const Char_t* context)
   : HParSet(name, title, context)
{
   clear();
}

void HRichMappingPar::clear()
{
// Claar the address arrays

   for (Int_t i = 0; i < RICH_SIZE_HW; ++i) {
      fAddrArrHW[i] = -1;
   }
   for (Int_t i = 0; i < RICH_SIZE_SW; ++i) {
      fAddrArrSW[i] = -1;
   }

   status = kFALSE;
   resetInputVersions();
}

Bool_t HRichMappingPar::init(HParIo* inp, Int_t* set)
{
// Initializes the container from an input

   HDetParIo* input = inp->getDetParIo("HRichParIo");
   if (NULL != input) {
      Bool_t returnValue = input->init(this, set);
#if DEBUG_LEVEL > 3
      printParams();
#endif
      return returnValue;
   }
   return kFALSE;
}

Int_t HRichMappingPar::write(HParIo* output)
{
// Writes the container to an output

   HDetParIo* out = output->getDetParIo("HRichParIo");
   if (NULL != out) {
      return out->write(this);
   }
   return -1;
}

Bool_t HRichMappingPar::readline(const Char_t* buf)
{
// Decodes one line read from ASCII file I/O and fills the channel

   UInt_t col = 0;
   UInt_t row = 0;
   UInt_t adc = 0;
   UInt_t apv = 0;
   UInt_t ch  = 0;

   sscanf(buf, "%u %u %u %u %u", &col, &row, &adc, &apv, &ch);
   return setAddress(row, col, adc, apv, ch);
}

void HRichMappingPar::write(fstream& fout)
{
// Writes the Rich Mapping Parameters to an ASCII file.

   Int_t addrHW = -1;

   for (Int_t i = 0; i < RICH_SIZE_SW; ++i) {
      if (-1 != (addrHW = fAddrArrSW[i])) {
         fout.width(4); // col
         fout << left << (i / 100);
         fout.width(4); // row
         fout << left << (i % 100);
         fout.width(4); // ADC
         fout << left << ((addrHW >> 11) & RICH_ADC_MASK);
         fout.width(4); // APV
         fout << left << ((addrHW >> 7)  & RICH_APV_MASK);
         fout.width(4); // CHANNEL
         fout << left << ((addrHW >> 0)  & RICH_CHANNEL_MASK);
         fout << endl;
      }
   }
}

Bool_t HRichMappingPar::setAddress(UInt_t row, UInt_t col, UInt_t adc, UInt_t apv, UInt_t ch)
{
// Checks the adresses and fills the array

   if (row >= RICH700_MAX_ROWS || col >= RICH700_MAX_COLS) {
      Error("setAddress", "Wrong SW pad coordinates: row %u out of (0, %i) \n\t\t\t col %u out of (0,%i)",
            row, RICH700_MAX_ROWS, col, RICH700_MAX_COLS);
      return kFALSE;
   }
   if (adc >= RICH_MAX_ADCS || apv >= RICH_MAX_APVS ||
       ch >= RICH_MAX_CHANNELS || 1 == (ch % 2)) {
      Error("setAddress",
            "Wrong HW pad coordinates: adc %u out of (0,%i) \n\t\t\t apv %u out of (0,%i) \n\t\t\t channel %u out of (0,%i)",
            adc, RICH_MAX_ADCS, apv, RICH_MAX_APVS, ch, RICH_MAX_CHANNELS);
      return kFALSE;
   }

   Int_t addrHW = static_cast<Int_t>((adc << 11) + (apv << 7) + ch);
   Int_t addrSW = static_cast<Int_t>(col * 100 + row);

   if (0 <= addrHW && addrHW < RICH_SIZE_HW) {
      fAddrArrHW[addrHW] = addrSW;
   } else {
      Error("setAdress", "Wrong HW address %i (max %i)", addrHW, RICH_SIZE_HW);
      Error("setAdress", "adc: %i, apv %i, ch: %i", adc, apv, ch);
      return kFALSE;
   }

   if (0 <= addrSW && addrSW < RICH_SIZE_SW) {
      fAddrArrSW[addrSW] = addrHW;
   } else {
      Error("setAdress", "Wrong SW address %i (max %i)", addrSW, RICH_SIZE_SW);
      return kFALSE;
   }

   return kTRUE;
}

void HRichMappingPar::printParams()
{
// Prints the lookup table

   Int_t addrHW = -1;

   cout << endl;
   cout << "#########################################################################" << endl;
   cout << "[RichMappingParameters]" << endl;
   cout << "/ Format:" << endl;
   cout << "/ Col Row ADC APV Channel" << endl << endl;
   for (Int_t i = 0; i < RICH_SIZE_SW; ++i) {
      if (-1 != (addrHW = fAddrArrSW[i])) {
         cout.width(4); // col
         cout << left << (i / 100);
         cout.width(4); // row
         cout << left << (i % 100);
         cout.width(4); // ADC
         cout << left << ((addrHW >> 11) & RICH_ADC_MASK);
         cout.width(4); // APV
         cout << left << ((addrHW >> 7)  & RICH_APV_MASK);
         cout.width(4); // CHANNEL
         cout << left << ((addrHW >> 0)  & RICH_CHANNEL_MASK);
         cout << endl;
      }
   }
   cout << "#########################################################################" << endl << endl;
}

void HRichMappingPar::putAsciiHeader(TString& header)
{
   // puts the ASCII header to the string used in HDetParAsciiFileIo
   header =
      "# Rich mapping parameters for unpacker\n"
      "# Format:\n"
      "# Col Row ADC APV Channel\n";
}

Bool_t HRichMappingPar::getHWAddress(Int_t row, Int_t col,
                              UInt_t& adc, UInt_t& apv, UInt_t& ch)
{
   Int_t addrSW = col * 100 + row;
   Int_t addrHW = -1;

   if (addrSW < 0 || addrSW >= RICH_SIZE_SW) {
      Error("getHWAddress", "Address %i out of bounds (0,%i)", addrSW, RICH_SIZE_SW);
      return kFALSE;
   }
   if (-1 != (addrHW = fAddrArrSW[addrSW])) {
      adc = static_cast<UInt_t>((addrHW >> 11) & RICH_ADC_MASK);
      apv = static_cast<UInt_t>((addrHW >> 7)  & RICH_APV_MASK);
      ch  = static_cast<UInt_t>((addrHW >> 0)  & RICH_CHANNEL_MASK);
      return kTRUE;
   } else {
      return kFALSE;
   }
}

Bool_t HRichMappingPar::getSWAddress(Int_t addrHW,
                              Int_t& row, Int_t& col)
{
   Int_t addrSW = -1;

   row = -1;
   col = -1;

   if (addrHW < 0 || addrHW >= RICH_SIZE_HW) {
      Error("getSWAddress", "Address %i out of bounds (0,%i)", addrHW, RICH_SIZE_HW);
      return kFALSE;
   }
   if (-1 != (addrSW = fAddrArrHW[addrHW])) {
      col = (addrSW / 100);
      row = (addrSW % 100);
      return kTRUE;
   } else {
      return kFALSE;
   }
}

Bool_t HRichMappingPar::isValidSWAddress(Int_t row, Int_t col)
{
   if (row < 0 || col < 0 || (col * 100 + row) >= RICH_SIZE_SW) {
      Error("isValidSWAddress", "Address (row,col) = (%i,%i) out of bounds (0,%i)", row, col, RICH_SIZE_SW);
      return kFALSE;
   }
   return (-1 != fAddrArrSW[(col * 100 + row)]) ? kTRUE : kFALSE;
}

Bool_t HRichMappingPar::isValidHWAddress(Int_t addrHW)
{
   if (addrHW < 0 || addrHW >= RICH_SIZE_HW) {
      Error("isValidHWAddress", "Address %i out of bounds (0,%i)", addrHW, RICH_SIZE_HW);
      return kFALSE;
   }
   return (-1 != fAddrArrHW[addrHW]) ? kTRUE : kFALSE;
}


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