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.                  *
 **************************************************************************/
/* $Id$ */

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

/// Exported from PHOS to be used also by EMCAL
/// November 2006 Gustavo Conesa Balbastre

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


ClassImp(AliCaloAltroMapping)

//_____________________________________________________________________________
AliCaloAltroMapping::AliCaloAltroMapping():
  AliAltroMapping(),
  fMinRow(0),
  fMaxRow(0),
  fMinCol(0),
  fMaxCol(0),
  fInvMappingLow(NULL),
  fInvMappingHigh(NULL)
{
  // Default constructor
}

//_____________________________________________________________________________
AliCaloAltroMapping::AliCaloAltroMapping(const char *mappingFile):
  AliAltroMapping(mappingFile),
  fMinRow(0),
  fMaxRow(0),
  fMinCol(0),
  fMaxCol(0),
  fInvMappingLow(NULL),
  fInvMappingHigh(NULL)
{
  // Constructor
  ReadMapping();
  CloseMappingFile();
}

//_____________________________________________________________________________
AliCaloAltroMapping::~AliCaloAltroMapping()
{
  // destructor
  // Deletes the arrays which have been
  // allocated during the reading of the
  // mapping file
  if (fInvMappingLow) delete [] fInvMappingLow;

  if (fInvMappingHigh) delete [] fInvMappingHigh;
}

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

  fMinRow = 0x7fffffff;
  fMaxRow = 0;
  fMinCol = 0x7fffffff;
  fMaxCol = 0;
  fMappingSize = 3*(fMaxHWAddress+1);
  fMapping = new Short_t[fMappingSize];
  for (Int_t i = 0; i <= fMaxHWAddress; i++) {
    fMapping[3*i] = fMapping[3*i+1] = fMapping[3*i+2] = -1;
  }
 
  for(Int_t i = 0; i < fNumberOfChannels ; i++) { // 1792 = 2*896 channels connected to each RCU
    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 row,col,caloFlag;
    if (!(*fIn >> row >> col >> caloFlag)) {
      AliFatal("Syntax of the mapping file is wrong !");
      return kFALSE;
    }

    if (caloFlag < 0 || caloFlag > 3) {
      AliFatal(Form("Wrong CaloFlag value found (%d)! Should be 0 ,1, 2 or 3 !",caloFlag));
      return kFALSE;
    }
 
    fMapping[3*hwAddress] = row;
    fMapping[3*hwAddress+1] = col;
    fMapping[3*hwAddress+2] = caloFlag;

    if (row > fMaxRow) fMaxRow = row;
    if (row < fMinRow) fMinRow = row;
    if (col > fMaxCol) fMaxCol = col;
    if (col < fMinCol) fMinCol = col;

  }

  return kTRUE;
}

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

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

  Int_t nRows = fMaxRow - fMinRow + 1;
  Int_t nCols = fMaxCol - fMinCol + 1;
  Int_t invMappingSize = nRows*nCols;

  fInvMappingLow  = new Short_t[invMappingSize];
  fInvMappingHigh = new Short_t[invMappingSize];
  for (Int_t i = 0; i < nRows; i++) {
    for (Int_t j = 0; j < nCols; j++) {
      fInvMappingLow[nCols*i+j]  = -1;
      fInvMappingHigh[nCols*i+j] = -1;
    }
  }
  for(Int_t i = 0; i <= fMaxHWAddress; i++) {
    Int_t row = fMapping[3*i];
    Int_t col = fMapping[3*i+1];
    Int_t caloFlag = fMapping[3*i+2];
    if(row != -1 && col != -1) {
      if (caloFlag == 0)
	fInvMappingLow[nCols*(row-fMinRow)+(col-fMinCol)] = i;
      if (caloFlag == 1)
	fInvMappingHigh[nCols*(row-fMinRow)+(col-fMinCol)] = i;
    }
  }

  return kTRUE;
}

//_____________________________________________________________________________
Int_t AliCaloAltroMapping::GetHWAddress(Int_t row, Int_t col, Int_t caloFlag)
{
  // Get the content of the mapping array
  // return -1 in case there is no hardware
  // adress defined for these row-column-caloFlag
  if (!fInvMappingLow || !fInvMappingHigh) {
    if (!CreateInvMapping()) return -1;
  }
  if (row < fMinRow || row > fMaxRow) {
    AliWarning(Form("Index of row (%d) outside the range (%d -> %d) !",row,fMinRow,fMaxRow));
    return -1;
  }
  if (col < fMinCol || col > fMaxCol) {
    AliWarning(Form("Index of column (%d) outside the range (%d -> %d) !",col,fMinCol,fMaxCol));
    return -1;
  }
  if (caloFlag < 0 || caloFlag > 3) {
    AliWarning(Form("Invalid caloFlag (%d)! Should be 0, 1, 2 or 3 !",caloFlag));
    return -1;
  }
  Int_t hwAddress = -1;
  if (caloFlag == 0)
    hwAddress = fInvMappingLow[(fMaxCol - fMinCol + 1)*(row-fMinRow)+(col-fMinCol)];
  if (caloFlag == 1)
    hwAddress = fInvMappingHigh[(fMaxCol - fMinCol + 1)*(row-fMinRow)+(col-fMinCol)];

  if (hwAddress == -1)
    AliWarning(Form("Hardware (ALTRO) adress is not defined for these row (%d), column (%d) and caloFlag (%d) !",row,col,caloFlag));

  return hwAddress;
}

//_____________________________________________________________________________
Int_t AliCaloAltroMapping::GetPadRow(Int_t hwAddress) const
{
  // Return the row index
  // Note the difference w.r.t to the base class notation
  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 row = fMapping[3*hwAddress];
  if (row == -1)
    AliWarning(Form("Hardware (ALTRO) adress (%d) is not defined !",hwAddress));

  return row;
}

//_____________________________________________________________________________
Int_t AliCaloAltroMapping::GetPad(Int_t hwAddress) const
{
  // Return the column index
  // Note the difference w.r.t to the base class notation
  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 col = fMapping[3*hwAddress+1];
  if (col == -1)
    AliWarning(Form("Hardware (ALTRO) adress (%d) is not defined !",hwAddress));

  return col;
}

//_____________________________________________________________________________
Int_t AliCaloAltroMapping::GetSector(Int_t hwAddress) const
{
  // Return the caloFlag factor (0/1)
  // Note the difference w.r.t to the base class notation
  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 caloFlag = fMapping[3*hwAddress+2];
  if (caloFlag == -1)
    AliWarning(Form("Hardware (ALTRO) adress (%d) is not defined !",hwAddress));

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