ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// This class handles the mapping of the Altro channels in the TPC
// The mapping is read from an external mapping files
// Author: C.Cheshkov

#include "AliTPCAltroMapping.h"
#include "AliLog.h"
#include <Riostream.h>
//#include <stdlib.h>


ClassImp(AliTPCAltroMapping)

//_____________________________________________________________________________
AliTPCAltroMapping::AliTPCAltroMapping():
  AliAltroMapping(),
  fMinPadRow(0),
  fMaxPadRow(0),
  fMaxPad(0),
  fInvMapping(NULL)
{
  // Default constructor
}

//_____________________________________________________________________________
AliTPCAltroMapping::AliTPCAltroMapping(const char *mappingFile):
  AliAltroMapping(mappingFile),
  fMinPadRow(0),
  fMaxPadRow(0),
  fMaxPad(0),
  fInvMapping(NULL)
{
  // Constructor
  ReadMapping();
  CloseMappingFile();
}

//_____________________________________________________________________________
AliTPCAltroMapping::~AliTPCAltroMapping()
{
  // destructor
  if (fInvMapping) delete [] fInvMapping;
}

//_____________________________________________________________________________
Bool_t AliTPCAltroMapping::ReadMapping()
{
  // Initalizes the ALTRO mapping from a file
  // Look at the TPC module for the format of
  // the mapping file
  if (!fIn) {
    AliFatal("Mapping file has not been opened !");
    return kFALSE;
  }

  fMinPadRow = 0x7fffffff;
  fMaxPadRow = 0;
  fMaxPad = 0;
  fMappingSize = 2*(fMaxHWAddress+1);
  fMapping = new Short_t[fMappingSize];
  for (Int_t i = 0; i <= fMaxHWAddress; i++) {
    fMapping[2*i] = fMapping[2*i+1] = -1;
  }
 
  for(Int_t i = 0; i < fNumberOfChannels ; i++) { //5504 is size of irorc mapping at ther moment only for irorc
    Int_t hwAddress;
    if (!(*fIn >> hwAddress)) {
      AliFatal("Syntax of the mapping file is wrong !");
      return kFALSE;
    }
    if (hwAddress > fMaxHWAddress) {
      AliFatal(Form("Hardware (ALTRO) adress (%d) outside the range (0 -> %d) !",hwAddress,fMaxHWAddress));
      return kFALSE;
    }
    Int_t padrow,pad;
    if (!(*fIn >> padrow >> pad)) {
      AliFatal("Syntax of the mapping file is wrong !");
      return kFALSE;
    }
 
    fMapping[2*hwAddress] = padrow;
    fMapping[2*hwAddress+1] = pad;

    if (padrow > fMaxPadRow) fMaxPadRow = padrow;
    if (padrow < fMinPadRow) fMinPadRow = padrow;
    if (pad > fMaxPad) fMaxPad = pad;
  }

  return kTRUE;
}

//_____________________________________________________________________________
Bool_t AliTPCAltroMapping::CreateInvMapping()
{
  // Create the inverse mapping
  // needed for the simulation of
  // raw data
  if (fInvMapping) return kTRUE;

  if (!fMapping) {
    AliWarning("Mapping array was not initalized correctly ! Impossible to create the inverse mapping !");
    return kFALSE;
  }

  Int_t nRows = fMaxPadRow - fMinPadRow + 1;
  Int_t nPads = fMaxPad + 1;
  Int_t invMappingSize = nRows*nPads;

  fInvMapping = new Short_t[invMappingSize];
  for (Int_t i = 0; i <= (fMaxPadRow - fMinPadRow); i++) {
    for (Int_t j = 0; j <= fMaxPad; j++) fInvMapping[nPads*i+j] = -1;
  }

  for(Int_t i = 0; i <= fMaxHWAddress; i++) {
    Int_t padrow = fMapping[2*i];
    Int_t pad = fMapping[2*i+1];
    if(padrow != -1 && pad != -1)
      fInvMapping[nPads*(padrow-fMinPadRow)+pad] = i;
  }

  return kTRUE;
}

//_____________________________________________________________________________
Int_t AliTPCAltroMapping::GetHWAddress(Int_t padrow, Int_t pad, Int_t /* sector */)
{
  // Get the content of the mapping array
  // return -1 in case there is no hardware
  // adress defined for these pad-row and pad
  if (!fInvMapping) {
    if (!CreateInvMapping()) return -1;
  }
  if (padrow < fMinPadRow || padrow > fMaxPadRow) {
    AliWarning(Form("Index of pad-row (%d) outside the range (%d -> %d) !",padrow,fMinPadRow,fMaxPadRow));
    return -1;
  }
  if (pad > fMaxPad) {
    AliWarning(Form("Index of pad (%d) outside the range (0 -> %d) !",pad,fMaxPad));
    return -1;
  }
  Int_t hwAddress = fInvMapping[(fMaxPad+1)*(padrow-fMinPadRow)+pad];
  if (hwAddress == -1)
    AliWarning(Form("Hardware (ALTRO) adress is not defined for these pad-row (%d) and pad (%d) !",padrow,pad));

  return hwAddress;
}

//_____________________________________________________________________________
Int_t AliTPCAltroMapping::GetPadRow(Int_t hwAddress) const
{
  if (!fMapping) {
    AliWarning("Mapping array was not initalized correctly !");
    return -1;
  }
  if (hwAddress > fMaxHWAddress) {
    AliWarning(Form("Hardware (ALTRO) adress (%d) outside the range (0 -> %d) !",hwAddress,fMaxHWAddress));
    return -1;
  }
  Int_t padrow = fMapping[2*hwAddress];
  if (padrow == -1)
    AliWarning(Form("Hardware (ALTRO) adress (%d) is not defined !",hwAddress));

  return padrow;
}

//_____________________________________________________________________________
Int_t AliTPCAltroMapping::GetPad(Int_t hwAddress) const
{
  if (!fMapping) {
    AliWarning("Mapping array was not initalized correctly !");
    return -1;
  }
  if (hwAddress > fMaxHWAddress) {
    AliWarning(Form("Hardware (ALTRO) adress (%d) outside the range (0 -> %d) !",hwAddress,fMaxHWAddress));
    return -1;
  }
  Int_t pad = fMapping[2*hwAddress+1];
  if (pad == -1)
    AliWarning(Form("Hardware (ALTRO) adress (%d) is not defined !",hwAddress));

  return pad;
}

//_____________________________________________________________________________
Int_t AliTPCAltroMapping::GetSector(Int_t /* hwAddress */) const
{
  AliWarning("Sector index is not contained in the TPC altro mapping !");
  return -1;
}
 AliTPCAltroMapping.cxx:1
 AliTPCAltroMapping.cxx:2
 AliTPCAltroMapping.cxx:3
 AliTPCAltroMapping.cxx:4
 AliTPCAltroMapping.cxx:5
 AliTPCAltroMapping.cxx:6
 AliTPCAltroMapping.cxx:7
 AliTPCAltroMapping.cxx:8
 AliTPCAltroMapping.cxx:9
 AliTPCAltroMapping.cxx:10
 AliTPCAltroMapping.cxx:11
 AliTPCAltroMapping.cxx:12
 AliTPCAltroMapping.cxx:13
 AliTPCAltroMapping.cxx:14
 AliTPCAltroMapping.cxx:15
 AliTPCAltroMapping.cxx:16
 AliTPCAltroMapping.cxx:17
 AliTPCAltroMapping.cxx:18
 AliTPCAltroMapping.cxx:19
 AliTPCAltroMapping.cxx:20
 AliTPCAltroMapping.cxx:21
 AliTPCAltroMapping.cxx:22
 AliTPCAltroMapping.cxx:23
 AliTPCAltroMapping.cxx:24
 AliTPCAltroMapping.cxx:25
 AliTPCAltroMapping.cxx:26
 AliTPCAltroMapping.cxx:27
 AliTPCAltroMapping.cxx:28
 AliTPCAltroMapping.cxx:29
 AliTPCAltroMapping.cxx:30
 AliTPCAltroMapping.cxx:31
 AliTPCAltroMapping.cxx:32
 AliTPCAltroMapping.cxx:33
 AliTPCAltroMapping.cxx:34
 AliTPCAltroMapping.cxx:35
 AliTPCAltroMapping.cxx:36
 AliTPCAltroMapping.cxx:37
 AliTPCAltroMapping.cxx:38
 AliTPCAltroMapping.cxx:39
 AliTPCAltroMapping.cxx:40
 AliTPCAltroMapping.cxx:41
 AliTPCAltroMapping.cxx:42
 AliTPCAltroMapping.cxx:43
 AliTPCAltroMapping.cxx:44
 AliTPCAltroMapping.cxx:45
 AliTPCAltroMapping.cxx:46
 AliTPCAltroMapping.cxx:47
 AliTPCAltroMapping.cxx:48
 AliTPCAltroMapping.cxx:49
 AliTPCAltroMapping.cxx:50
 AliTPCAltroMapping.cxx:51
 AliTPCAltroMapping.cxx:52
 AliTPCAltroMapping.cxx:53
 AliTPCAltroMapping.cxx:54
 AliTPCAltroMapping.cxx:55
 AliTPCAltroMapping.cxx:56
 AliTPCAltroMapping.cxx:57
 AliTPCAltroMapping.cxx:58
 AliTPCAltroMapping.cxx:59
 AliTPCAltroMapping.cxx:60
 AliTPCAltroMapping.cxx:61
 AliTPCAltroMapping.cxx:62
 AliTPCAltroMapping.cxx:63
 AliTPCAltroMapping.cxx:64
 AliTPCAltroMapping.cxx:65
 AliTPCAltroMapping.cxx:66
 AliTPCAltroMapping.cxx:67
 AliTPCAltroMapping.cxx:68
 AliTPCAltroMapping.cxx:69
 AliTPCAltroMapping.cxx:70
 AliTPCAltroMapping.cxx:71
 AliTPCAltroMapping.cxx:72
 AliTPCAltroMapping.cxx:73
 AliTPCAltroMapping.cxx:74
 AliTPCAltroMapping.cxx:75
 AliTPCAltroMapping.cxx:76
 AliTPCAltroMapping.cxx:77
 AliTPCAltroMapping.cxx:78
 AliTPCAltroMapping.cxx:79
 AliTPCAltroMapping.cxx:80
 AliTPCAltroMapping.cxx:81
 AliTPCAltroMapping.cxx:82
 AliTPCAltroMapping.cxx:83
 AliTPCAltroMapping.cxx:84
 AliTPCAltroMapping.cxx:85
 AliTPCAltroMapping.cxx:86
 AliTPCAltroMapping.cxx:87
 AliTPCAltroMapping.cxx:88
 AliTPCAltroMapping.cxx:89
 AliTPCAltroMapping.cxx:90
 AliTPCAltroMapping.cxx:91
 AliTPCAltroMapping.cxx:92
 AliTPCAltroMapping.cxx:93
 AliTPCAltroMapping.cxx:94
 AliTPCAltroMapping.cxx:95
 AliTPCAltroMapping.cxx:96
 AliTPCAltroMapping.cxx:97
 AliTPCAltroMapping.cxx:98
 AliTPCAltroMapping.cxx:99
 AliTPCAltroMapping.cxx:100
 AliTPCAltroMapping.cxx:101
 AliTPCAltroMapping.cxx:102
 AliTPCAltroMapping.cxx:103
 AliTPCAltroMapping.cxx:104
 AliTPCAltroMapping.cxx:105
 AliTPCAltroMapping.cxx:106
 AliTPCAltroMapping.cxx:107
 AliTPCAltroMapping.cxx:108
 AliTPCAltroMapping.cxx:109
 AliTPCAltroMapping.cxx:110
 AliTPCAltroMapping.cxx:111
 AliTPCAltroMapping.cxx:112
 AliTPCAltroMapping.cxx:113
 AliTPCAltroMapping.cxx:114
 AliTPCAltroMapping.cxx:115
 AliTPCAltroMapping.cxx:116
 AliTPCAltroMapping.cxx:117
 AliTPCAltroMapping.cxx:118
 AliTPCAltroMapping.cxx:119
 AliTPCAltroMapping.cxx:120
 AliTPCAltroMapping.cxx:121
 AliTPCAltroMapping.cxx:122
 AliTPCAltroMapping.cxx:123
 AliTPCAltroMapping.cxx:124
 AliTPCAltroMapping.cxx:125
 AliTPCAltroMapping.cxx:126
 AliTPCAltroMapping.cxx:127
 AliTPCAltroMapping.cxx:128
 AliTPCAltroMapping.cxx:129
 AliTPCAltroMapping.cxx:130
 AliTPCAltroMapping.cxx:131
 AliTPCAltroMapping.cxx:132
 AliTPCAltroMapping.cxx:133
 AliTPCAltroMapping.cxx:134
 AliTPCAltroMapping.cxx:135
 AliTPCAltroMapping.cxx:136
 AliTPCAltroMapping.cxx:137
 AliTPCAltroMapping.cxx:138
 AliTPCAltroMapping.cxx:139
 AliTPCAltroMapping.cxx:140
 AliTPCAltroMapping.cxx:141
 AliTPCAltroMapping.cxx:142
 AliTPCAltroMapping.cxx:143
 AliTPCAltroMapping.cxx:144
 AliTPCAltroMapping.cxx:145
 AliTPCAltroMapping.cxx:146
 AliTPCAltroMapping.cxx:147
 AliTPCAltroMapping.cxx:148
 AliTPCAltroMapping.cxx:149
 AliTPCAltroMapping.cxx:150
 AliTPCAltroMapping.cxx:151
 AliTPCAltroMapping.cxx:152
 AliTPCAltroMapping.cxx:153
 AliTPCAltroMapping.cxx:154
 AliTPCAltroMapping.cxx:155
 AliTPCAltroMapping.cxx:156
 AliTPCAltroMapping.cxx:157
 AliTPCAltroMapping.cxx:158
 AliTPCAltroMapping.cxx:159
 AliTPCAltroMapping.cxx:160
 AliTPCAltroMapping.cxx:161
 AliTPCAltroMapping.cxx:162
 AliTPCAltroMapping.cxx:163
 AliTPCAltroMapping.cxx:164
 AliTPCAltroMapping.cxx:165
 AliTPCAltroMapping.cxx:166
 AliTPCAltroMapping.cxx:167
 AliTPCAltroMapping.cxx:168
 AliTPCAltroMapping.cxx:169
 AliTPCAltroMapping.cxx:170
 AliTPCAltroMapping.cxx:171
 AliTPCAltroMapping.cxx:172
 AliTPCAltroMapping.cxx:173
 AliTPCAltroMapping.cxx:174
 AliTPCAltroMapping.cxx:175
 AliTPCAltroMapping.cxx:176
 AliTPCAltroMapping.cxx:177
 AliTPCAltroMapping.cxx:178
 AliTPCAltroMapping.cxx:179
 AliTPCAltroMapping.cxx:180
 AliTPCAltroMapping.cxx:181
 AliTPCAltroMapping.cxx:182
 AliTPCAltroMapping.cxx:183
 AliTPCAltroMapping.cxx:184
 AliTPCAltroMapping.cxx:185
 AliTPCAltroMapping.cxx:186
 AliTPCAltroMapping.cxx:187
 AliTPCAltroMapping.cxx:188
 AliTPCAltroMapping.cxx:189
 AliTPCAltroMapping.cxx:190
 AliTPCAltroMapping.cxx:191
 AliTPCAltroMapping.cxx:192
 AliTPCAltroMapping.cxx:193
 AliTPCAltroMapping.cxx:194
 AliTPCAltroMapping.cxx:195
 AliTPCAltroMapping.cxx:196
 AliTPCAltroMapping.cxx:197
 AliTPCAltroMapping.cxx:198
 AliTPCAltroMapping.cxx:199
 AliTPCAltroMapping.cxx:200
 AliTPCAltroMapping.cxx:201
 AliTPCAltroMapping.cxx:202
 AliTPCAltroMapping.cxx:203