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.                  *
 **************************************************************************/
#include "TArrayI.h"
#include "AliITSCalibrationSPD.h"

///////////////////////////////////////////////////////////////////////////
//  Calibration class for set:ITS                   
//  Specific subdetector implementation for         
//  Silicon pixels                                  
//
//  Modified by D. Elia, G.E. Bruno, H. Tydesjo
///////////////////////////////////////////////////////////////////////////

ClassImp(AliITSCalibrationSPD)

//______________________________________________________________________
AliITSCalibrationSPD::AliITSCalibrationSPD():
AliITSCalibration(),
fNrBad(0),
fBadChannels(0){
  // constructor

   SetDataType("simulated");
   ClearBad();
}
//____________________________________________________________________________
void AliITSCalibrationSPD::ClearBad() {
  // clear all bad pixels (single+chips)
  fBadChannels.Reset();
  fNrBad=0;
  for (UInt_t chip=0; chip<5; chip++) {
    fBadChip[chip]=kFALSE;
  }
}
//____________________________________________________________________________
void AliITSCalibrationSPD::AddBad(UInt_t col, UInt_t row) {
  // add single bad pixel 
  fBadChannels.Set(fNrBad*2+2);
  fBadChannels.AddAt(col,fNrBad*2);
  fBadChannels.AddAt(row,fNrBad*2+1);
  fNrBad++;
}
//____________________________________________________________________________
void AliITSCalibrationSPD::SetChipBad(UInt_t chip) {
  // set full chip bad
  if (chip>=5) {AliError("Wrong chip number");
  }
  else {
    fBadChip[chip]=kTRUE;
  }
}
//____________________________________________________________________________
void AliITSCalibrationSPD::UnSetChipBad(UInt_t chip) {
  // unset full chip bad
  if (chip>=5 ) {AliError("Wrong chip number");
  }
  else {
    fBadChip[chip]=kFALSE;
  }
}
//____________________________________________________________________________
Int_t AliITSCalibrationSPD::GetBadColAt(UInt_t index) const {
  // Get column of index-th bad pixel
  if ((Int_t)index<GetNrBadSingle()) {
    return fBadChannels.At(index*2);
  }
  else {
    Int_t badChipIndex=(index-GetNrBadSingle())/(32*256);
    Int_t badChipsFound =0;
    for (UInt_t chip=0; chip<5; chip++) {
      if (fBadChip[chip]) badChipsFound++;
      if (badChipIndex==badChipsFound-1) {
	Int_t badPixelIndex=(index-GetNrBadSingle())%(32*256);
	return chip*32 + badPixelIndex/256;
      }
    }
  }
  AliError(Form("Index %d is out of bounds - returning -1",index));
  return -1;
}
//____________________________________________________________________________
Int_t AliITSCalibrationSPD::GetBadRowAt(UInt_t index) const {
  // Get row of index-th bad pixel
  if ((Int_t)index<GetNrBadSingle()) {
    return fBadChannels.At(index*2+1);
  }
  else {
    Int_t badChipIndex=(index-GetNrBadSingle())/(32*256);
    Int_t badChipsFound =0;
    for (UInt_t chip=0; chip<5; chip++) {
      if (fBadChip[chip]) badChipsFound++;
      if (badChipIndex==badChipsFound-1) {
	Int_t badPixelIndex=(index-GetNrBadSingle())%(32*256);
	return badPixelIndex%256;
      }
    }
  }
  AliError(Form("Index %d is out of bounds - returning -1",index));
  return -1;
}
//____________________________________________________________________________
void AliITSCalibrationSPD::GetBadPixel(Int_t index, Int_t &row, Int_t &col) const {
  // i: is the i-th bad pixel in single bad pixel list
  // row: is the corresponding row (-1 if i is out of range)
  // col: is the corresponding column (-1 if i is out of range)
  row = -1;
  col = -1;
  if(index>=0 && index<GetNrBadSingle()){
    col = GetBadColAt(index);
    row = GetBadRowAt(index);
    return;
  }
  else {
    if (index>=0) {
      Int_t badChipIndex=(index-GetNrBadSingle())/(32*256);
      Int_t badChipsFound =0;
      for (UInt_t chip=0; chip<5; chip++) {
	if (fBadChip[chip]) badChipsFound++;
	if (badChipIndex==badChipsFound-1) {
	  Int_t badPixelIndex=(index-GetNrBadSingle())%(32*256);
	  col = chip*32 + badPixelIndex/256;
	  row = badPixelIndex%256;
	  return;
	}
      }
    }
  }
  AliError(Form("Index %d is out of bounds - nothing done",index));
}
//___________________________________________________________________________
Int_t  AliITSCalibrationSPD::GetNrBad() const {
  // Total number of bad pixels (including bad chips) in a given module
  Int_t bad=0;
  // single pixels:
  bad+=fNrBad;
  // whole chips:
  for (UInt_t chip=0; chip<5; chip++) {
    bad+=fBadChip[chip]*32*256;
  }
  return bad;
}
//___________________________________________________________________________
Int_t  AliITSCalibrationSPD::GetNrBadInChip(Int_t chip) const {
  // Total number of bad pixels (including bad chips) in a given chip: chip range [0,4]
  if(chip<0 || chip>4) {AliError("Wrong chip number"); return -1;}
  if (fBadChip[chip]) return 32*256;
  else {
    Int_t bad=0;
    for (UInt_t i=0; i<fNrBad; i++) {
      Int_t col = GetBadColAt(i);
      if (col!=-1) {
	if (GetChipIndexFromCol(col)==chip) bad++;
      }
    }
    return bad;
  }
}
//___________________________________________________________________________
Int_t  AliITSCalibrationSPD::GetNrBadInColumn(Int_t col) const {
  // Total number of bad pixels (including bad chips) in a given column: col. range [0,159]
  if(col<0 || col>159) {AliError("Wrong column number"); return -1;}
  if (fBadChip[GetChipIndexFromCol(col)]) return 256;
  else {
    Int_t bad=0;
    for (UInt_t i=0; i<fNrBad; i++) {
      if (GetBadColAt(i)==col) bad++;
    }
    return bad;
  }
}
//______________________________________________________________________
Bool_t AliITSCalibrationSPD::IsBad() const {
  // Are all chips of this module bad?
  for (UInt_t chip=0; chip<5; chip++) {
    if (!fBadChip[chip]) return kFALSE;
  }
  return kTRUE;
}
//______________________________________________________________________
Bool_t AliITSCalibrationSPD::IsChipBad(Int_t chip) const {
  // Is the full chip bad?
  return (GetNrBadInChip(chip)==32*256);
}
//______________________________________________________________________
Bool_t AliITSCalibrationSPD::IsColumnBad(Int_t col) const {
  // Is the full column bad?
  return (GetNrBadInColumn(col)==256);
}
//____________________________________________________________________________
Bool_t AliITSCalibrationSPD::IsPixelBad(Int_t col, Int_t row) const {
  // Is this pixel bad?
  if(col<0 || col>159) {AliError("Wrong column number"); return kFALSE;}
  Int_t chip = GetChipIndexFromCol(col);
  if (fBadChip[chip]) return kTRUE;
  for (UInt_t i=0; i<fNrBad; i++) { 
    if (GetBadColAt(i)==col && GetBadRowAt(i)==row) {
      return kTRUE;
    }
  }
  return kFALSE;
}
//______________________________________________________________________
Int_t AliITSCalibrationSPD::GetChipIndexFromCol(UInt_t col) const {
  // returns chip index for specific column
  if(col>=160) {AliWarning("Wrong column number"); return -1;}
  return col/32;
}
//______________________________________________________________________
void AliITSCalibrationSPD::SetNrBad(UInt_t /*nr*/) {
  // should not be used anymore !!!
  AliError("This method should not be used anymore. Use SetNrBadSingle instead!!!");
}
//______________________________________________________________________
void AliITSCalibrationSPD::Streamer(TBuffer &ruub) {
  // Stream an object of class AliITSCalibrationSPD.
  UInt_t ruus, ruuc;
  if (ruub.IsReading()) {
    Version_t ruuv = ruub.ReadVersion(&ruus, &ruuc); if (ruuv) { }
    AliITSCalibration::Streamer(ruub);
    if (ruuv >= 8) {
      ruub >> fNrBad;
      fBadChannels.Streamer(ruub);
      ruub.ReadStaticArray((bool*)fBadChip);
    }
    else {
      Double_t dummy;
      ruub >> dummy;
      ruub >> dummy;
      ruub >> dummy;
      ruub >> dummy;
      ruub >> dummy;
      ruub >> dummy;
      ruub >> dummy;
      ruub >> fNrBad;
      if (ruuv == 7) {
	fBadChannels.Streamer(ruub);
	ruub.ReadStaticArray((bool*)fBadChip);
      }
      else {
	if (ruuv == 6) {
	  fBadChannels.Streamer(ruub);
	}
	else {
	  TArrayI fBadChannelsV1;
	  fBadChannelsV1.Streamer(ruub);
	  fBadChannels.Set(fNrBad*2);
	  for (UInt_t i=0; i<fNrBad*2; i++) {
	    fBadChannels[i] = fBadChannelsV1[i];
	  }
	}
	for (UInt_t i=0; i<5; i++) {
	  fBadChip[i]=kFALSE;
	}
      }
    }
    ruub.CheckByteCount(ruus, ruuc, AliITSCalibrationSPD::IsA());
  }
  else {
    ruuc = ruub.WriteVersion(AliITSCalibrationSPD::IsA(), kTRUE);
    AliITSCalibration::Streamer(ruub);
    ruub << fNrBad;
    fBadChannels.Streamer(ruub);
    ruub.WriteArray(fBadChip, 5);
    ruub.SetByteCount(ruuc, kTRUE);
  }
}
 AliITSCalibrationSPD.cxx:1
 AliITSCalibrationSPD.cxx:2
 AliITSCalibrationSPD.cxx:3
 AliITSCalibrationSPD.cxx:4
 AliITSCalibrationSPD.cxx:5
 AliITSCalibrationSPD.cxx:6
 AliITSCalibrationSPD.cxx:7
 AliITSCalibrationSPD.cxx:8
 AliITSCalibrationSPD.cxx:9
 AliITSCalibrationSPD.cxx:10
 AliITSCalibrationSPD.cxx:11
 AliITSCalibrationSPD.cxx:12
 AliITSCalibrationSPD.cxx:13
 AliITSCalibrationSPD.cxx:14
 AliITSCalibrationSPD.cxx:15
 AliITSCalibrationSPD.cxx:16
 AliITSCalibrationSPD.cxx:17
 AliITSCalibrationSPD.cxx:18
 AliITSCalibrationSPD.cxx:19
 AliITSCalibrationSPD.cxx:20
 AliITSCalibrationSPD.cxx:21
 AliITSCalibrationSPD.cxx:22
 AliITSCalibrationSPD.cxx:23
 AliITSCalibrationSPD.cxx:24
 AliITSCalibrationSPD.cxx:25
 AliITSCalibrationSPD.cxx:26
 AliITSCalibrationSPD.cxx:27
 AliITSCalibrationSPD.cxx:28
 AliITSCalibrationSPD.cxx:29
 AliITSCalibrationSPD.cxx:30
 AliITSCalibrationSPD.cxx:31
 AliITSCalibrationSPD.cxx:32
 AliITSCalibrationSPD.cxx:33
 AliITSCalibrationSPD.cxx:34
 AliITSCalibrationSPD.cxx:35
 AliITSCalibrationSPD.cxx:36
 AliITSCalibrationSPD.cxx:37
 AliITSCalibrationSPD.cxx:38
 AliITSCalibrationSPD.cxx:39
 AliITSCalibrationSPD.cxx:40
 AliITSCalibrationSPD.cxx:41
 AliITSCalibrationSPD.cxx:42
 AliITSCalibrationSPD.cxx:43
 AliITSCalibrationSPD.cxx:44
 AliITSCalibrationSPD.cxx:45
 AliITSCalibrationSPD.cxx:46
 AliITSCalibrationSPD.cxx:47
 AliITSCalibrationSPD.cxx:48
 AliITSCalibrationSPD.cxx:49
 AliITSCalibrationSPD.cxx:50
 AliITSCalibrationSPD.cxx:51
 AliITSCalibrationSPD.cxx:52
 AliITSCalibrationSPD.cxx:53
 AliITSCalibrationSPD.cxx:54
 AliITSCalibrationSPD.cxx:55
 AliITSCalibrationSPD.cxx:56
 AliITSCalibrationSPD.cxx:57
 AliITSCalibrationSPD.cxx:58
 AliITSCalibrationSPD.cxx:59
 AliITSCalibrationSPD.cxx:60
 AliITSCalibrationSPD.cxx:61
 AliITSCalibrationSPD.cxx:62
 AliITSCalibrationSPD.cxx:63
 AliITSCalibrationSPD.cxx:64
 AliITSCalibrationSPD.cxx:65
 AliITSCalibrationSPD.cxx:66
 AliITSCalibrationSPD.cxx:67
 AliITSCalibrationSPD.cxx:68
 AliITSCalibrationSPD.cxx:69
 AliITSCalibrationSPD.cxx:70
 AliITSCalibrationSPD.cxx:71
 AliITSCalibrationSPD.cxx:72
 AliITSCalibrationSPD.cxx:73
 AliITSCalibrationSPD.cxx:74
 AliITSCalibrationSPD.cxx:75
 AliITSCalibrationSPD.cxx:76
 AliITSCalibrationSPD.cxx:77
 AliITSCalibrationSPD.cxx:78
 AliITSCalibrationSPD.cxx:79
 AliITSCalibrationSPD.cxx:80
 AliITSCalibrationSPD.cxx:81
 AliITSCalibrationSPD.cxx:82
 AliITSCalibrationSPD.cxx:83
 AliITSCalibrationSPD.cxx:84
 AliITSCalibrationSPD.cxx:85
 AliITSCalibrationSPD.cxx:86
 AliITSCalibrationSPD.cxx:87
 AliITSCalibrationSPD.cxx:88
 AliITSCalibrationSPD.cxx:89
 AliITSCalibrationSPD.cxx:90
 AliITSCalibrationSPD.cxx:91
 AliITSCalibrationSPD.cxx:92
 AliITSCalibrationSPD.cxx:93
 AliITSCalibrationSPD.cxx:94
 AliITSCalibrationSPD.cxx:95
 AliITSCalibrationSPD.cxx:96
 AliITSCalibrationSPD.cxx:97
 AliITSCalibrationSPD.cxx:98
 AliITSCalibrationSPD.cxx:99
 AliITSCalibrationSPD.cxx:100
 AliITSCalibrationSPD.cxx:101
 AliITSCalibrationSPD.cxx:102
 AliITSCalibrationSPD.cxx:103
 AliITSCalibrationSPD.cxx:104
 AliITSCalibrationSPD.cxx:105
 AliITSCalibrationSPD.cxx:106
 AliITSCalibrationSPD.cxx:107
 AliITSCalibrationSPD.cxx:108
 AliITSCalibrationSPD.cxx:109
 AliITSCalibrationSPD.cxx:110
 AliITSCalibrationSPD.cxx:111
 AliITSCalibrationSPD.cxx:112
 AliITSCalibrationSPD.cxx:113
 AliITSCalibrationSPD.cxx:114
 AliITSCalibrationSPD.cxx:115
 AliITSCalibrationSPD.cxx:116
 AliITSCalibrationSPD.cxx:117
 AliITSCalibrationSPD.cxx:118
 AliITSCalibrationSPD.cxx:119
 AliITSCalibrationSPD.cxx:120
 AliITSCalibrationSPD.cxx:121
 AliITSCalibrationSPD.cxx:122
 AliITSCalibrationSPD.cxx:123
 AliITSCalibrationSPD.cxx:124
 AliITSCalibrationSPD.cxx:125
 AliITSCalibrationSPD.cxx:126
 AliITSCalibrationSPD.cxx:127
 AliITSCalibrationSPD.cxx:128
 AliITSCalibrationSPD.cxx:129
 AliITSCalibrationSPD.cxx:130
 AliITSCalibrationSPD.cxx:131
 AliITSCalibrationSPD.cxx:132
 AliITSCalibrationSPD.cxx:133
 AliITSCalibrationSPD.cxx:134
 AliITSCalibrationSPD.cxx:135
 AliITSCalibrationSPD.cxx:136
 AliITSCalibrationSPD.cxx:137
 AliITSCalibrationSPD.cxx:138
 AliITSCalibrationSPD.cxx:139
 AliITSCalibrationSPD.cxx:140
 AliITSCalibrationSPD.cxx:141
 AliITSCalibrationSPD.cxx:142
 AliITSCalibrationSPD.cxx:143
 AliITSCalibrationSPD.cxx:144
 AliITSCalibrationSPD.cxx:145
 AliITSCalibrationSPD.cxx:146
 AliITSCalibrationSPD.cxx:147
 AliITSCalibrationSPD.cxx:148
 AliITSCalibrationSPD.cxx:149
 AliITSCalibrationSPD.cxx:150
 AliITSCalibrationSPD.cxx:151
 AliITSCalibrationSPD.cxx:152
 AliITSCalibrationSPD.cxx:153
 AliITSCalibrationSPD.cxx:154
 AliITSCalibrationSPD.cxx:155
 AliITSCalibrationSPD.cxx:156
 AliITSCalibrationSPD.cxx:157
 AliITSCalibrationSPD.cxx:158
 AliITSCalibrationSPD.cxx:159
 AliITSCalibrationSPD.cxx:160
 AliITSCalibrationSPD.cxx:161
 AliITSCalibrationSPD.cxx:162
 AliITSCalibrationSPD.cxx:163
 AliITSCalibrationSPD.cxx:164
 AliITSCalibrationSPD.cxx:165
 AliITSCalibrationSPD.cxx:166
 AliITSCalibrationSPD.cxx:167
 AliITSCalibrationSPD.cxx:168
 AliITSCalibrationSPD.cxx:169
 AliITSCalibrationSPD.cxx:170
 AliITSCalibrationSPD.cxx:171
 AliITSCalibrationSPD.cxx:172
 AliITSCalibrationSPD.cxx:173
 AliITSCalibrationSPD.cxx:174
 AliITSCalibrationSPD.cxx:175
 AliITSCalibrationSPD.cxx:176
 AliITSCalibrationSPD.cxx:177
 AliITSCalibrationSPD.cxx:178
 AliITSCalibrationSPD.cxx:179
 AliITSCalibrationSPD.cxx:180
 AliITSCalibrationSPD.cxx:181
 AliITSCalibrationSPD.cxx:182
 AliITSCalibrationSPD.cxx:183
 AliITSCalibrationSPD.cxx:184
 AliITSCalibrationSPD.cxx:185
 AliITSCalibrationSPD.cxx:186
 AliITSCalibrationSPD.cxx:187
 AliITSCalibrationSPD.cxx:188
 AliITSCalibrationSPD.cxx:189
 AliITSCalibrationSPD.cxx:190
 AliITSCalibrationSPD.cxx:191
 AliITSCalibrationSPD.cxx:192
 AliITSCalibrationSPD.cxx:193
 AliITSCalibrationSPD.cxx:194
 AliITSCalibrationSPD.cxx:195
 AliITSCalibrationSPD.cxx:196
 AliITSCalibrationSPD.cxx:197
 AliITSCalibrationSPD.cxx:198
 AliITSCalibrationSPD.cxx:199
 AliITSCalibrationSPD.cxx:200
 AliITSCalibrationSPD.cxx:201
 AliITSCalibrationSPD.cxx:202
 AliITSCalibrationSPD.cxx:203
 AliITSCalibrationSPD.cxx:204
 AliITSCalibrationSPD.cxx:205
 AliITSCalibrationSPD.cxx:206
 AliITSCalibrationSPD.cxx:207
 AliITSCalibrationSPD.cxx:208
 AliITSCalibrationSPD.cxx:209
 AliITSCalibrationSPD.cxx:210
 AliITSCalibrationSPD.cxx:211
 AliITSCalibrationSPD.cxx:212
 AliITSCalibrationSPD.cxx:213
 AliITSCalibrationSPD.cxx:214
 AliITSCalibrationSPD.cxx:215
 AliITSCalibrationSPD.cxx:216
 AliITSCalibrationSPD.cxx:217
 AliITSCalibrationSPD.cxx:218
 AliITSCalibrationSPD.cxx:219
 AliITSCalibrationSPD.cxx:220
 AliITSCalibrationSPD.cxx:221
 AliITSCalibrationSPD.cxx:222
 AliITSCalibrationSPD.cxx:223
 AliITSCalibrationSPD.cxx:224
 AliITSCalibrationSPD.cxx:225
 AliITSCalibrationSPD.cxx:226
 AliITSCalibrationSPD.cxx:227
 AliITSCalibrationSPD.cxx:228
 AliITSCalibrationSPD.cxx:229
 AliITSCalibrationSPD.cxx:230
 AliITSCalibrationSPD.cxx:231
 AliITSCalibrationSPD.cxx:232
 AliITSCalibrationSPD.cxx:233
 AliITSCalibrationSPD.cxx:234
 AliITSCalibrationSPD.cxx:235
 AliITSCalibrationSPD.cxx:236
 AliITSCalibrationSPD.cxx:237
 AliITSCalibrationSPD.cxx:238
 AliITSCalibrationSPD.cxx:239
 AliITSCalibrationSPD.cxx:240
 AliITSCalibrationSPD.cxx:241
 AliITSCalibrationSPD.cxx:242
 AliITSCalibrationSPD.cxx:243
 AliITSCalibrationSPD.cxx:244
 AliITSCalibrationSPD.cxx:245
 AliITSCalibrationSPD.cxx:246
 AliITSCalibrationSPD.cxx:247
 AliITSCalibrationSPD.cxx:248
 AliITSCalibrationSPD.cxx:249
 AliITSCalibrationSPD.cxx:250
 AliITSCalibrationSPD.cxx:251
 AliITSCalibrationSPD.cxx:252
 AliITSCalibrationSPD.cxx:253
 AliITSCalibrationSPD.cxx:254
 AliITSCalibrationSPD.cxx:255
 AliITSCalibrationSPD.cxx:256
 AliITSCalibrationSPD.cxx:257
 AliITSCalibrationSPD.cxx:258
 AliITSCalibrationSPD.cxx:259
 AliITSCalibrationSPD.cxx:260
 AliITSCalibrationSPD.cxx:261
 AliITSCalibrationSPD.cxx:262
 AliITSCalibrationSPD.cxx:263
 AliITSCalibrationSPD.cxx:264
 AliITSCalibrationSPD.cxx:265
 AliITSCalibrationSPD.cxx:266
 AliITSCalibrationSPD.cxx:267
 AliITSCalibrationSPD.cxx:268
 AliITSCalibrationSPD.cxx:269
 AliITSCalibrationSPD.cxx:270
 AliITSCalibrationSPD.cxx:271
 AliITSCalibrationSPD.cxx:272
 AliITSCalibrationSPD.cxx:273
 AliITSCalibrationSPD.cxx:274
 AliITSCalibrationSPD.cxx:275
 AliITSCalibrationSPD.cxx:276
 AliITSCalibrationSPD.cxx:277
 AliITSCalibrationSPD.cxx:278