ROOT logo
#include "AliFMDESDFixer.h"
#include "AliESDFMD.h"
#include "AliFMDStripIndex.h"
#include "AliForwardUtil.h"
#include "AliForwardCorrectionManager.h"
#include "AliFMDCorrNoiseGain.h"
#include <TH1.h>
#include <TList.h>
#include <TObjArray.h>
#include <TROOT.h>
#include <TMath.h>
#include <iostream>
#include <iomanip>


//____________________________________________________________________
AliFMDESDFixer::AliFMDESDFixer() 
  : TObject(), 
    fRecoFactor(1),
    fMaxNoiseCorr(0.05),
    fRecalculateEta(true),
    fXtraDead(0),
    fHasXtraDead(false),
    fInvalidIsEmpty(false),
    fNoiseChange(0),
    fEtaChange(0),
    fDeadChange(0)
{}

//____________________________________________________________________
AliFMDESDFixer::AliFMDESDFixer(const char*) 
  : TObject(), 
    fRecoFactor(1),
    fMaxNoiseCorr(0.05),
    fRecalculateEta(false),
    fXtraDead(AliFMDStripIndex::Pack(3,'O',19,511)+1),
    fHasXtraDead(false),
    fInvalidIsEmpty(false),
    fNoiseChange(0),
    fEtaChange(0),
    fDeadChange(0)
{}


//____________________________________________________________________
AliFMDESDFixer::AliFMDESDFixer(const AliFMDESDFixer& o) 
  : TObject(), 
    fRecoFactor(o.fRecoFactor),
    fMaxNoiseCorr(o.fMaxNoiseCorr),
    fRecalculateEta(o.fRecalculateEta),
    fXtraDead(o.fXtraDead),
    fHasXtraDead(o.fHasXtraDead),
    fInvalidIsEmpty(o.fInvalidIsEmpty),
    fNoiseChange(0),
    fEtaChange(0),
    fDeadChange(0)
{}

//____________________________________________________________________
AliFMDESDFixer&
AliFMDESDFixer::operator=(const AliFMDESDFixer& o) 
{ 
  if (&o == this) return *this;

  fRecoFactor = o.fRecoFactor;
  fMaxNoiseCorr = o.fMaxNoiseCorr;
  fRecalculateEta = o.fRecalculateEta;
  fXtraDead = o.fXtraDead;
  fHasXtraDead = o.fHasXtraDead;
  fInvalidIsEmpty = o.fInvalidIsEmpty;
  fNoiseChange = 0;
  fEtaChange  = 0;
  fDeadChange = 0;

  return *this; 
};

//____________________________________________________________________
void
AliFMDESDFixer::CreateOutputObjects(TList* l)
{
  TList* d = new TList;
  d->SetName(GetName());
  l->Add(d);

  d->Add(AliForwardUtil::MakeParameter("recoFactor", fRecoFactor));
  d->Add(AliForwardUtil::MakeParameter("recalcEta",  fRecalculateEta));
  d->Add(AliForwardUtil::MakeParameter("invalidIsEmpty",  fInvalidIsEmpty));
  
  fNoiseChange = new TH1D("noiseChange", "#delta#Delta due to noise",30,0,.3);
  fNoiseChange->SetDirectory(0);
  fNoiseChange->SetFillColor(kYellow+1);
  fNoiseChange->SetFillStyle(3001);
  d->Add(fNoiseChange);

  fEtaChange = new TH1D("etaChange", "#delta#eta",40,-1,1);
  fEtaChange->SetDirectory(0);
  fEtaChange->SetFillColor(kCyan+1);
  fEtaChange->SetFillStyle(3001);
  d->Add(fEtaChange);

  fDeadChange = new TH1D("deadChange", "#deltaN_{dead}",100,0,51200);
  fDeadChange->SetDirectory(0);
  fDeadChange->SetFillColor(kMagenta+1);
  fDeadChange->SetFillStyle(3001);
  d->Add(fDeadChange);

  TObjArray* extraDead = new TObjArray;
  extraDead->SetOwner();
  extraDead->SetName("extraDead");
  fXtraDead.Compact();
  UInt_t firstBit = fXtraDead.FirstSetBit();
  UInt_t nBits    = fXtraDead.GetNbits();
  for (UInt_t i = firstBit; i < nBits; i++) {
    if (!fXtraDead.TestBitNumber(i)) continue;
    UShort_t dd, s, t;
    Char_t   r;
    AliFMDStripIndex::Unpack(i, dd, r, s, t);
    extraDead->Add(AliForwardUtil::MakeParameter(Form("FMD%d%c[%02d,%03d]",
						      dd, r, s, t), 
						 UShort_t(i)));
  }
  d->Add(extraDead);
  fHasXtraDead = nBits > 0;

}

//____________________________________________________________________
void
AliFMDESDFixer::AddDead(UShort_t d, Char_t r, UShort_t s, UShort_t t)
{
  if (d < 1 || d > 3) {
    Warning("AddDead", "Invalid detector FMD%d", d);
    return;
  }
  Bool_t inner = (r == 'I' || r == 'i');
  if (d == 1 && !inner) { 
    Warning("AddDead", "Invalid ring FMD%d%c", d, r);
    return;
  }
  if ((inner && s >= 20) || (!inner && s >= 40)) { 
    Warning("AddDead", "Invalid sector FMD%d%c[%02d]", d, r, s);
    return;
  }
  if ((inner && t >= 512) || (!inner && t >= 256)) { 
    Warning("AddDead", "Invalid strip FMD%d%c[%02d,%03d]", d, r, s, t);
    return;
  }
    
  Int_t id = AliFMDStripIndex::Pack(d, r, s, t);
  // Int_t i  = 0;
  fXtraDead.SetBitNumber(id, true);
}
//____________________________________________________________________
void
AliFMDESDFixer::AddDeadRegion(UShort_t d,  Char_t r, 
				   UShort_t s1, UShort_t s2, 
				   UShort_t t1, UShort_t t2)
{
  // Add a dead region spanning from FMD<d><r>[<s1>,<t1>] to 
  // FMD<d><r>[<s2>,<t2>] (both inclusive)
  for (Int_t s = s1; s <= s2; s++) 
    for (Int_t t = t1; t <= t2; t++) 
      AddDead(d, r, s, t);
}
//____________________________________________________________________
void
AliFMDESDFixer::AddDead(const Char_t* script)
{
  if (!script || script[0] == '\0') return;
  
  gROOT->Macro(Form("%s((AliFMDESDFixer*)%p);", script, this));
}

//____________________________________________________________________
Bool_t
AliFMDESDFixer::IsDead(UShort_t d, Char_t r, UShort_t s, UShort_t t) const
{
  Int_t id = AliFMDStripIndex::Pack(d, r, s, t);
  return fXtraDead.TestBitNumber(id); 
}

//____________________________________________________________________
Int_t
AliFMDESDFixer::FindTargetNoiseFactor(const AliESDFMD& esd, Bool_t check) const
{
  if (!IsUseNoiseCorrection()) 
    // If the reconstruction factor was high (4 or more), do nothing 
    return 0;

  Int_t target = 0;
  if (AliESDFMD::Class_Version() < 4) {
    // IF we running with older STEER - we fix it here
    target = 4;					
  } else {
#if 1
    if (!esd.TestBit(1 << 14)) { 
      // If the bit isn't set, do nothing
      return 0;
    }
#else 
    // Uncommented until Peter commits patch to STEER/ESD
    if (!esd.NeedNoiseFix()) { 
      // If the bit isn't set, do nothing
      return 0;
    }
#endif
    target = Int_t(esd.GetNoiseFactor());
  }
  // Get the target factor - even thought the method below returns a
  // floating point value, we know that the noise factor is always
  // integer, so we coerce it to be the same here. 
  target -= fRecoFactor;

  // If the target factor is the same or smaller than the assumed
  // factor, we have nothing to do here, and we return immediately
  if (target <= 0) return 0;

  // Get the scaled noise from the correction mananger 
  if (check && !AliForwardCorrectionManager::Instance().GetNoiseGain()) 
    return 0;

  return target;
}

//____________________________________________________________________
#define ETA2COS(ETA)						\
  TMath::Cos(2*TMath::ATan(TMath::Exp(-TMath::Abs(ETA))))

//____________________________________________________________________
void
AliFMDESDFixer::Fix(AliESDFMD& esd, Double_t zvtx)
{

  const AliFMDCorrNoiseGain* ng  = 0;
  Int_t tgtFactor = FindTargetNoiseFactor(esd, false);
  if (tgtFactor > 0) 
    ng  = AliForwardCorrectionManager::Instance().GetNoiseGain();

  if (!ng && !fHasXtraDead && !fRecalculateEta && !fInvalidIsEmpty) 
    // We have nothing to do!
    return;

  UShort_t nDead = 0;
  for (UShort_t d = 1; d <= 3; d++) { 
    UShort_t nQ = d == 1 ? 1 : 2;

    for (UShort_t q = 0; q < nQ; q++) { 
      Char_t   r  = (q == 0 ? 'I' : 'O');
      UShort_t nS = (q == 0 ?  20 :  40);
      UShort_t nT = (q == 0 ? 512 : 256);
      
      for (UShort_t s = 0; s < nS; s++) { 
	for (UShort_t t = 0; t < nT; t++) { 
	  Double_t mult     = esd.Multiplicity(d,r,s,t);
	  Double_t eta      = esd.Eta(d,r,s,t);
	  Double_t cosTheta = 0;

	  if (CheckDead(d,r,s,t,mult)) nDead++;
	  
	  // Possibly re-calculate eta 
	  if (fRecalculateEta) RecalculateEta(d,r,s,t,zvtx,eta,mult,cosTheta);

	  // Possibly correct for poor treatment of ZS in reconstruction. 
	  if (ng && mult != AliESDFMD::kInvalidMult) {
	    if (cosTheta <= 0) cosTheta = ETA2COS(eta);
	    if (!NoiseCorrect(tgtFactor,ng->Get(d,r,s,t), cosTheta, mult))
	      nDead++;
	  } 

	  // Write out final values to object 
	  if (mult >= AliESDFMD::kInvalidMult) mult = AliESDFMD::kInvalidMult;
	  esd.SetMultiplicity(d,r,s,t,mult);
	  esd.SetEta(d,r,s,t,eta);
	} // for t
      } // for s
    } // for q
  } // for d
  fDeadChange->Fill(nDead);
}

//____________________________________________________________________
Bool_t
AliFMDESDFixer::CheckDead(UShort_t d, Char_t r, UShort_t s, UShort_t t,
			  Double_t& mult)
{
  // Correct for zero's being flagged as invalid 
  if (mult == AliESDFMD::kInvalidMult && fInvalidIsEmpty) mult = 0;

  // Take into account what we're defined as dead 
  if (IsDead(d,r,s,t)) {
    mult = AliESDFMD::kInvalidMult;
    return true;
  }
  return false;
}

//____________________________________________________________________
void
AliFMDESDFixer::RecalculateEta(UShort_t d, Char_t r, UShort_t s, UShort_t t,
			       Double_t zvtx, Double_t& eta, Double_t& mult, 
			       Double_t& cosTheta)
{
  Double_t oldEta = eta;
  Double_t newEta = AliForwardUtil::GetEtaFromStrip(d,r,s,t, zvtx);
  eta             = newEta;

  fEtaChange->Fill(newEta-oldEta);

  if (mult == AliESDFMD::kInvalidMult) return;

  Double_t newCos = ETA2COS(newEta);
  Double_t oldCos = ETA2COS(oldEta);
  Double_t corr   = newCos / oldCos;
  cosTheta        = newCos;
  mult            *= corr;
}
//____________________________________________________________________
Bool_t
AliFMDESDFixer::NoiseCorrect(Int_t target, Double_t corr, Double_t cosTheta, 
			     Double_t& mult)
{
  if (corr > fMaxNoiseCorr || corr <= 0) { 
    mult = AliESDFMD::kInvalidMult;
    return false;
  }
  Double_t add = corr * target * cosTheta;
  fNoiseChange->Fill(add);

  mult += add;
  return true;
}

#define PF(N,V,...)					\
  AliForwardUtil::PrintField(N,V, ## __VA_ARGS__)
#define PFB(N,FLAG)				\
  do {									\
    AliForwardUtil::PrintName(N);					\
    std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
  } while(false)
#define PFV(N,VALUE)					\
  do {							\
    AliForwardUtil::PrintName(N);			\
    std::cout << (VALUE) << std::endl; } while(false)

//____________________________________________________________________
void
AliFMDESDFixer::Print(Option_t*) const
{
  AliForwardUtil::PrintTask(*this);
  gROOT->IncreaseDirLevel();
  PFB("Consider invalid null", fInvalidIsEmpty);
  PFB("Has extra dead", fHasXtraDead || fXtraDead.GetNbits() > 0);
  PFV("Reco noise factor", fRecoFactor);
  PFV("Max noise corr", fMaxNoiseCorr);
  PFB("Recalc. eta", fRecalculateEta);
  gROOT->DecreaseDirLevel();
}

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