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 implementation AliTPCExB is using an aproximate calculation of the ExB
// effect. Therefore the drift ODE is Taylor expanded and only the first
// order part is taken.
//
// 
// The ExB correction map is stored in the calib DB
// To test current version:
/*
  char *storage = "local://OCDBres"
  Int_t RunNumber=0;
  AliCDBManager::Instance()->SetDefaultStorage(storage);
  AliCDBManager::Instance()->SetRun(RunNumber) 
  AliTPCExBFirst * exb = AliTPCcalibDB::Instance()->GetExB();

  //  exb->TestExB("exb.root");
  // TFile f("exb.root");
  //positions->Draw("drphi");
*/



#include "TMath.h"
//#include "AliFieldMap.h"
#include "AliMagF.h"
#include "TTreeStream.h"
#include "AliTPCExBFirst.h"

ClassImp(AliTPCExBFirst)

const Double_t AliTPCExBFirst::fgkEM=1.602176487e-19/9.10938215e-31;
const Double_t AliTPCExBFirst::fgkDriftField=-40.e3;

AliTPCExBFirst::AliTPCExBFirst()
  : fDriftVelocity(0),
    fkNX(0),fkNY(0),fkNZ(0),
    fkXMin(-250.),fkXMax(250.),fkYMin(-250.),fkYMax(250.),
    fkZMin(-250.),fkZMax(250.),
    fkNMean(0),
    fkMeanBx(0),fkMeanBy(0),fkMeanBz(0.) {
  //
  // purely for I/O
  //
  SetInstance(this);
}

AliTPCExBFirst::AliTPCExBFirst(const AliMagF *bField,
			       Double_t driftVelocity,
			       Int_t nx,Int_t ny,Int_t nz)
  : fDriftVelocity(driftVelocity),
    fkNX(nx),fkNY(ny),fkNZ(nz),
    fkXMin(-250.),fkXMax(250.),fkYMin(-250.),fkYMax(250.),
    fkZMin(-250.),fkZMax(250.),
    fkNMean(0),
    fkMeanBx(0),fkMeanBy(0),fkMeanBz(0.) {
  //
  // The constructor. One has to supply a magnetic field and an (initial)
  // drift velocity. Since some kind of lookuptable is created the
  // number of its meshpoints can be supplied.
  //
  //  ConstructCommon(0,bField);
  ConstructCommon(bField);
  SetInstance(this);
}

/*
AliTPCExBFirst::AliTPCExBFirst(const AliFieldMap *bFieldMap,
			       Double_t driftVelocity) 
  : fDriftVelocity(driftVelocity),
    fkNX(0),fkNY(0),fkNZ(0),
    fkXMin(-250.),fkXMax(250.),fkYMin(-250.),fkYMax(250.),
    fkZMin(-250.),fkZMax(250.),
    fkNMean(0),
    fkMeanBx(0),fkMeanBy(0),fkMeanBz(0.) {
  //
  // The constructor. One has to supply a field map and an (initial)
  // drift velocity.
  //
  SetInstance(this);
  fkXMin=bFieldMap->Xmin()
    -TMath::Ceil( (bFieldMap->Xmin()+250.0)/bFieldMap->DelX())
    *bFieldMap->DelX();
  fkXMax=bFieldMap->Xmax()
    -TMath::Floor((bFieldMap->Xmax()-250.0)/bFieldMap->DelX())
    *bFieldMap->DelX();
  fkYMin=bFieldMap->Ymin()
    -TMath::Ceil( (bFieldMap->Ymin()+250.0)/bFieldMap->DelY())
    *bFieldMap->DelY();
  fkYMax=bFieldMap->Ymax()
    -TMath::Floor((bFieldMap->Ymax()-250.0)/bFieldMap->DelY())
    *bFieldMap->DelY();
  fkZMin=bFieldMap->Zmin()
    -TMath::Ceil( (bFieldMap->Zmin()+250.0)/bFieldMap->DelZ())
    *bFieldMap->DelZ();
  fkZMax=bFieldMap->Zmax()
    -TMath::Floor((bFieldMap->Zmax()-250.0)/bFieldMap->DelZ())
    *bFieldMap->DelZ();

  fkNX=static_cast<Int_t>((fkXMax-fkXMin)/bFieldMap->DelX()+1.1);
  fkNY=static_cast<Int_t>((fkYMax-fkYMin)/bFieldMap->DelY()+1.1);
  fkNZ=static_cast<Int_t>((fkZMax-fkZMin)/bFieldMap->DelZ()+1.1);

  ConstructCommon(bFieldMap,0);
}
*/

AliTPCExBFirst::~AliTPCExBFirst() { 
  //
  // destruct the poor object.
  //
  delete[] fkMeanBx;
  delete[] fkMeanBy;
}

void AliTPCExBFirst::Correct(const Double_t *position,Double_t *corrected) {
  //
  // correct for the distortion
  //
  Double_t bx,by;
  GetMeanFields(position[0],position[1],position[2],&bx,&by);
  if (position[2]>0.) {
    Double_t bxe,bye;
    GetMeanFields(position[0],position[1],250.,&bxe,&bye);
    if (position[2]!=250.) {
      bx=(500.*bxe-(position[2]+250.)*bx)/(250.-position[2]);
      by=(500.*bye-(position[2]+250.)*by)/(250.-position[2]);
    }
    else {
      bx=bxe;
      by=bye;
    }
  }
  
  Double_t mu=fDriftVelocity/fgkDriftField;
  Double_t wt=mu*fkMeanBz;
  
  corrected[0]=mu*(wt*bx-by)/(1.+wt*wt);
  corrected[1]=mu*(wt*by+bx)/(1.+wt*wt);
  
  if (position[2]>0.) {
    corrected[0]*=(250.-position[2]);
    corrected[1]*=(250.-position[2]);
  }
  else {
    corrected[0]*=(-250.-position[2]);
    corrected[1]*=(-250.-position[2]);
  }

  corrected[0]=position[0]-corrected[0];
  corrected[1]=position[1]-corrected[1];
  corrected[2]=position[2];
}

void AliTPCExBFirst::TestThisBeautifulObject(const char* fileName) {
  //
  // well, as the name sais...
  //
  TTreeSRedirector ts(fileName);
  Double_t x[3];
  for (x[0]=-250.;x[0]<=250.;x[0]+=10.)
    for (x[1]=-250.;x[1]<=250.;x[1]+=10.)
      for (x[2]=-250.;x[2]<=250.;x[2]+=10.) {
	Double_t d[3];
	Correct(x,d);
	Double_t r=TMath::Sqrt(x[0]*x[0]+x[1]*x[1]);
	Double_t rd=TMath::Sqrt(d[0]*d[0]+d[1]*d[1]);
	Double_t dr=r-rd;
	Double_t phi=TMath::ATan2(x[0],x[1]);
	Double_t phid=TMath::ATan2(d[0],d[1]);
	Double_t dphi=phi-phid;
	if (dphi<0.) dphi+=TMath::TwoPi();
	if (dphi>TMath::Pi()) dphi=TMath::TwoPi()-dphi;
	Double_t drphi=r*dphi;
	Double_t dx=x[0]-d[0];
	Double_t dy=x[1]-d[1];
	Double_t dz=x[2]-d[2];
	ts<<"positions"
	  <<"x0="<<x[0]
	  <<"x1="<<x[1]
	  <<"x2="<<x[2]
	  <<"dx="<<dx
	  <<"dy="<<dy
	  <<"dz="<<dz
	  <<"r="<<r
	  <<"phi="<<phi
	  <<"dr="<<dr
	  <<"drphi="<<drphi
	  <<"\n";
      }
}


void AliTPCExBFirst::ConstructCommon(//const AliFieldMap *bFieldMap,
				     const AliMagF *bField) {
  //
  // THIS IS PRIVATE! (a helper for the constructor)
  //
  fkNMean=fkNX*fkNY*fkNZ;
  fkMeanBx=new Double_t[fkNMean];
  fkMeanBy=new Double_t[fkNMean];

  Double_t x[3];
  Double_t nBz=0;
  fkMeanBz=0.;
  for (int i=0;i<fkNX;++i) {
    x[0]=fkXMin+i*(fkXMax-fkXMin)/(fkNX-1);
    for (int j=0;j<fkNY;++j) {
      x[1]=fkYMin+j*(fkYMax-fkYMin)/(fkNY-1);
      Double_t r=TMath::Sqrt(x[0]*x[0]+x[1]*x[1]);
      Double_t bx=0.,by=0.;
      for (int k=0;k<fkNZ;++k) {
	x[2]=fkZMin+k*(fkZMax-fkZMin)/(fkNZ-1);
	Double_t b[3];
	// the x is not const in the Field function...
	Double_t xt[3];
	for (int l=0;l<3;++l) xt[l]=x[l];
	// that happens due to the lack of a sophisticated class design:
	//	if (bFieldMap!=0)
	//	  bFieldMap->Field(xt,b);
	//	else 
	((AliMagF*)bField)->Field(xt,b);
	bx+=b[0]/10.;
	by+=b[1]/10.;
	fkMeanBx[(k*fkNY+j)*fkNX+i]=bx;
	fkMeanBy[(k*fkNY+j)*fkNX+i]=by;
	if (90.<=r&&r<=250.) {
	  fkMeanBz+=b[2]/10.;
	  ++nBz;
	}
      }
    }
  }
  fkMeanBz/=nBz;
}


void AliTPCExBFirst::GetMeanFields(Double_t rx,Double_t ry,Double_t rz,
				   Double_t *Bx,Double_t *By) const {
  //
  // THIS IS PRIVATE! (calculates the mean field utilising a lookup table)
  //
  Double_t x=(fkNX-1)*(rx-fkXMin)/(fkXMax-fkXMin);
  Int_t xi1=static_cast<Int_t>(x);
  xi1=TMath::Max(TMath::Min(xi1,fkNX-2),0);
  Int_t xi2=xi1+1;
  Double_t dx=(x-xi1);
  Double_t dx1=(xi2-x);

  Double_t y=(fkNY-1)*(ry-fkYMin)/(fkYMax-fkYMin);
  Int_t yi1=static_cast<Int_t>(y);
  yi1=TMath::Max(TMath::Min(yi1,fkNY-2),0);
  Int_t yi2=yi1+1;
  Double_t dy=(y-yi1);
  Double_t dy1=(yi2-y);
  
  Double_t z=(fkNZ-1)*(rz-fkZMin)/(fkZMax-fkZMin);
  Int_t zi1=static_cast<Int_t>(z);
  zi1=TMath::Max(TMath::Min(zi1,fkNZ-2),0);
  Int_t zi2=zi1+1;
  Double_t dz=(z-zi1);

  double s0x=fkMeanBx[yi1*fkNX+xi1]*dx1*dy1
	    +fkMeanBx[yi2*fkNX+xi1]*dx1*dy
            +fkMeanBx[yi1*fkNX+xi2]*dx *dy1
            +fkMeanBx[yi2*fkNX+xi2]*dx *dy;
  double s0y=fkMeanBy[yi1*fkNX+xi1]*dx1*dy1
	    +fkMeanBy[yi2*fkNX+xi1]*dx1*dy
            +fkMeanBy[yi1*fkNX+xi2]*dx *dy1
            +fkMeanBy[yi2*fkNX+xi2]*dx *dy;
  Int_t zi0=zi1-1;
  double snmx,snmy;
  if (zi0>=0) {
    snmx=fkMeanBx[(zi0*fkNY+yi1)*fkNX+xi1]*dx1*dy1
        +fkMeanBx[(zi0*fkNY+yi2)*fkNX+xi1]*dx1*dy
        +fkMeanBx[(zi0*fkNY+yi1)*fkNX+xi2]*dx *dy1
        +fkMeanBx[(zi0*fkNY+yi2)*fkNX+xi2]*dx *dy;
    snmy=fkMeanBy[(zi0*fkNY+yi1)*fkNX+xi1]*dx1*dy1
        +fkMeanBy[(zi0*fkNY+yi2)*fkNX+xi1]*dx1*dy
        +fkMeanBy[(zi0*fkNY+yi1)*fkNX+xi2]*dx *dy1
        +fkMeanBy[(zi0*fkNY+yi2)*fkNX+xi2]*dx *dy;
  }
  else
    snmx=snmy=0.;
  double snx=fkMeanBx[(zi1*fkNY+yi1)*fkNX+xi1]*dx1*dy1
 	    +fkMeanBx[(zi1*fkNY+yi2)*fkNX+xi1]*dx1*dy
            +fkMeanBx[(zi1*fkNY+yi1)*fkNX+xi2]*dx *dy1
            +fkMeanBx[(zi1*fkNY+yi2)*fkNX+xi2]*dx *dy;
  double sny=fkMeanBy[(zi1*fkNY+yi1)*fkNX+xi1]*dx1*dy1
 	    +fkMeanBy[(zi1*fkNY+yi2)*fkNX+xi1]*dx1*dy
            +fkMeanBy[(zi1*fkNY+yi1)*fkNX+xi2]*dx *dy1
            +fkMeanBy[(zi1*fkNY+yi2)*fkNX+xi2]*dx *dy;
  double snpx=fkMeanBx[(zi2*fkNY+yi1)*fkNX+xi1]*dx1*dy1
	     +fkMeanBx[(zi2*fkNY+yi2)*fkNX+xi1]*dx1*dy
             +fkMeanBx[(zi2*fkNY+yi1)*fkNX+xi2]*dx *dy1
             +fkMeanBx[(zi2*fkNY+yi2)*fkNX+xi2]*dx *dy;
  double snpy=fkMeanBy[(zi2*fkNY+yi1)*fkNX+xi1]*dx1*dy1
	     +fkMeanBy[(zi2*fkNY+yi2)*fkNX+xi1]*dx1*dy
             +fkMeanBy[(zi2*fkNY+yi1)*fkNX+xi2]*dx *dy1
             +fkMeanBy[(zi2*fkNY+yi2)*fkNX+xi2]*dx *dy;



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