// <h2> AliTPCSpaceCharge class </h2>
// The class calculates the space point distortions due to a rotational
// symmetric space charge distribution with the TPC drift volume.
// <p>
// The class uses the PoissonRelaxation2D to calculate the resulting
// electrical field inhomogeneities in the (r,z)-plane. Then, the
// Langevin-integral formalism is used to calculate the space point distortions.
// <p>
// The class assumes, that the distortions scales linearly with the magnitude
// of the space charge distribution $\rho(r,z)$. The in here assumed distribution is
// $$\rho(r,z) = \frac{(A-B\,z)}{r^2} $$ wherein the factors A and B scale with the
// event multiplicity and the interaction rate.
// <p>
// The scaling factor can be set via the function SetCorrectionFactor. An example of
// the shape of the distortions is given below.
//
// MI modification - 22.05.2013
// As an optional input the Space charge histogram RZ is used in case it is provided
// - using the SetInputSpaceCharge function
//
// End_Html
// {
// gROOT->SetStyle("Plain"); gStyle->SetPalette(1);
// TCanvas *c2 = new TCanvas("cAliTPCSpaceCharge","cAliTPCSpaceCharge",500,300);
// AliTPCSpaceCharge sc;
// sc.SetOmegaTauT1T2(-0.32,1,1); // B=0.5 Tesla
// sc.SetCorrectionFactor(0.0015);
// sc.CreateHistoDRinZR(0.)->Draw("surf2");
// return c2;
// }
// End_Macro
// <p>
// Date: 23/08/2010 <br>
// Authors: Jim Thomas, Stefan Rossegger
// End_Html
#include "AliMagF.h"
#include "TGeoGlobalMagField.h"
#include "AliTPCcalibDB.h"
#include "AliTPCParam.h"
#include "AliLog.h"
#include "TMatrixD.h"
#include "TH2.h"
#include "TMath.h"
#include "AliTPCROC.h"
#include "AliTPCSpaceCharge.h"
ClassImp(AliTPCSpaceCharge)
AliTPCSpaceCharge::AliTPCSpaceCharge()
: AliTPCCorrection("SpaceCharge2D","Space Charge 2D"),
fC0(0.),fC1(0.),fCorrectionFactor(0.001),fSpaceChargeHistogram(0),
fInitLookUp(kFALSE)
{
}
AliTPCSpaceCharge::~AliTPCSpaceCharge() {
}
void AliTPCSpaceCharge::Init() {
AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
if (!magF) AliError("Magneticd field - not initialized");
Double_t bzField = magF->SolenoidField()/10.;
AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters();
if (!param) AliError("Parameters - not initialized");
Double_t vdrift = param->GetDriftV()/1000000.;
Double_t ezField = 400;
Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ;
SetOmegaTauT1T2(wt,fT1,fT2);
InitSpaceChargeDistortion();
}
void AliTPCSpaceCharge::Update(const TTimeStamp &) {
AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
if (!magF) AliError("Magneticd field - not initialized");
Double_t bzField = magF->SolenoidField()/10.;
AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters();
if (!param) AliError("Parameters - not initialized");
Double_t vdrift = param->GetDriftV()/1000000.;
Double_t ezField = 400;
Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ;
SetOmegaTauT1T2(wt,fT1,fT2);
}
void AliTPCSpaceCharge::GetCorrection(const Float_t x[],const Short_t roc,Float_t dx[]) {
if (!fInitLookUp) {
AliInfo("Lookup table was not initialized! Perform the inizialisation now ...");
InitSpaceChargeDistortion();
}
Int_t order = 1 ;
Double_t intEr, intEphi, intdEz;
Double_t r, phi, z ;
Int_t sign;
r = TMath::Sqrt( x[0]*x[0] + x[1]*x[1] ) ;
phi = TMath::ATan2(x[1],x[0]) ;
if ( phi < 0 ) phi += TMath::TwoPi() ;
z = x[2] ;
if ( (roc%36) < 18 ) {
sign = 1;
} else {
sign = -1;
}
if ( sign==1 && z < fgkZOffSet ) z = fgkZOffSet;
if ( sign==-1 && z > -fgkZOffSet ) z = -fgkZOffSet;
if ( (sign==1 && z<0) || (sign==-1 && z>0) )
AliError("ROC number does not correspond to z coordinate! Calculation of distortions is most likely wrong!");
intEphi = 0.0;
Interpolate2DEdistortion( order, r, z, fLookUpErOverEz, intEr );
Interpolate2DEdistortion( order, r, z, fLookUpDeltaEz, intdEz );
if ( r > 0.0 ) {
phi = phi + fCorrectionFactor *( fC0*intEphi - fC1*intEr ) / r;
r = r + fCorrectionFactor *( fC0*intEr + fC1*intEphi );
}
Double_t dz = intdEz*fCorrectionFactor;
dx[0] = - (r * TMath::Cos(phi) - x[0]);
dx[1] = - (r * TMath::Sin(phi) - x[1]);
dx[2] = - dz;
}
void AliTPCSpaceCharge::InitSpaceChargeDistortion() {
const Float_t gridSizeR = (fgkOFCRadius-fgkIFCRadius) / (kRows-1) ;
const Float_t gridSizeZ = fgkTPCZ0 / (kColumns-1) ;
TMatrixD voltArray(kRows,kColumns);
TMatrixD chargeDensity(kRows,kColumns);
TMatrixD arrayErOverEz(kRows,kColumns);
TMatrixD arrayDeltaEz(kRows,kColumns);
Double_t rList[kRows], zedList[kColumns] ;
for ( Int_t j = 0 ; j < kColumns ; j++ ) {
Double_t zed = j*gridSizeZ ;
zedList[j] = zed ;
for ( Int_t i = 0 ; i < kRows ; i++ ) {
Double_t radius = fgkIFCRadius + i*gridSizeR ;
rList[i] = radius ;
voltArray(i,j) = 0;
chargeDensity(i,j) = 0;
}
}
for ( Int_t j = 1 ; j < kColumns-1 ; j++ ) {
Double_t zed = j*gridSizeZ ;
for ( Int_t i = 1 ; i < kRows-1 ; i++ ) {
Double_t radius = fgkIFCRadius + i*gridSizeR ;
Double_t zterm = (fgkTPCZ0-zed) * (fgkOFCRadius*fgkOFCRadius - fgkIFCRadius*fgkIFCRadius) / fgkTPCZ0 ;
chargeDensity(i,j) = zterm / ( TMath::Log(fgkOFCRadius/fgkIFCRadius) * ( radius*radius ) ) ;
}
}
if (fSpaceChargeHistogram){
for ( Int_t j = 1 ; j < kColumns-1 ; j++ ) {
Double_t zed = j*gridSizeZ ;
for ( Int_t i = 1 ; i < kRows-1 ; i++ ) {
Double_t radius = fgkIFCRadius + i*gridSizeR ;
Double_t zterm = (fgkTPCZ0-zed) * (fgkOFCRadius*fgkOFCRadius - fgkIFCRadius*fgkIFCRadius) / fgkTPCZ0 ;
chargeDensity(i,j) = fSpaceChargeHistogram->Interpolate(radius,zed);
}
}
}
PoissonRelaxation2D( voltArray, chargeDensity, arrayErOverEz, arrayDeltaEz, kRows, kColumns, kIterations ) ;
Int_t ilow=0, jlow=0 ;
Double_t z,r;
Float_t saveEr[2], saveEz[2] ;
for ( Int_t i = 0 ; i < kNZ ; ++i ) {
z = TMath::Abs( fgkZList[i] ) ;
for ( Int_t j = 0 ; j < kNR ; ++j ) {
r = fgkRList[j] ;
Search( kRows, rList, r, ilow ) ;
Search( kColumns, zedList, z, jlow ) ;
if ( ilow < 0 ) ilow = 0 ;
if ( jlow < 0 ) jlow = 0 ;
if ( ilow + 1 >= kRows - 1 ) ilow = kRows - 2 ;
if ( jlow + 1 >= kColumns - 1 ) jlow = kColumns - 2 ;
saveEr[0] = arrayErOverEz(ilow,jlow) +
(arrayErOverEz(ilow,jlow+1)-arrayErOverEz(ilow,jlow))*(z-zedList[jlow])/gridSizeZ ;
saveEr[1] = arrayErOverEz(ilow+1,jlow) +
(arrayErOverEz(ilow+1,jlow+1)-arrayErOverEz(ilow+1,jlow))*(z-zedList[jlow])/gridSizeZ ;
saveEz[0] = arrayDeltaEz(ilow,jlow) +
(arrayDeltaEz(ilow,jlow+1)-arrayDeltaEz(ilow,jlow))*(z-zedList[jlow])/gridSizeZ ;
saveEz[1] = arrayDeltaEz(ilow+1,jlow) +
(arrayDeltaEz(ilow+1,jlow+1)-arrayDeltaEz(ilow+1,jlow))*(z-zedList[jlow])/gridSizeZ ;
fLookUpErOverEz[i][j] = saveEr[0] + (saveEr[1]-saveEr[0])*(r-rList[ilow])/gridSizeR ;
fLookUpDeltaEz[i][j] = saveEz[0] + (saveEz[1]-saveEz[0])*(r-rList[ilow])/gridSizeR ;
if (fgkZList[i]<0) fLookUpDeltaEz[i][j] *= -1;
}
}
fInitLookUp = kTRUE;
}
void AliTPCSpaceCharge::Print(const Option_t* option) const {
TString opt = option; opt.ToLower();
printf("%s\n",GetTitle());
printf(" - Space Charge effects assuming a radial symmetric z over r^2 SC-distribution.\n");
printf(" SC correction factor: %f \n",fCorrectionFactor);
if (opt.Contains("a")) {
printf(" - T1: %1.4f, T2: %1.4f \n",fT1,fT2);
printf(" - C1: %1.4f, C0: %1.4f \n",fC1,fC0);
}
if (!fInitLookUp) AliError("Lookup table was not initialized! You should do InitSpaceChargeDistortion() ...");
}
AliTPCSpaceCharge.cxx:100 AliTPCSpaceCharge.cxx:101 AliTPCSpaceCharge.cxx:102 AliTPCSpaceCharge.cxx:103 AliTPCSpaceCharge.cxx:104 AliTPCSpaceCharge.cxx:105 AliTPCSpaceCharge.cxx:106 AliTPCSpaceCharge.cxx:107 AliTPCSpaceCharge.cxx:108 AliTPCSpaceCharge.cxx:109 AliTPCSpaceCharge.cxx:110 AliTPCSpaceCharge.cxx:111 AliTPCSpaceCharge.cxx:112 AliTPCSpaceCharge.cxx:113 AliTPCSpaceCharge.cxx:114 AliTPCSpaceCharge.cxx:115 AliTPCSpaceCharge.cxx:116 AliTPCSpaceCharge.cxx:117 AliTPCSpaceCharge.cxx:118 AliTPCSpaceCharge.cxx:119 AliTPCSpaceCharge.cxx:120 AliTPCSpaceCharge.cxx:121 AliTPCSpaceCharge.cxx:122 AliTPCSpaceCharge.cxx:123 AliTPCSpaceCharge.cxx:124 AliTPCSpaceCharge.cxx:125 AliTPCSpaceCharge.cxx:126 AliTPCSpaceCharge.cxx:127 AliTPCSpaceCharge.cxx:128 AliTPCSpaceCharge.cxx:129 AliTPCSpaceCharge.cxx:130 AliTPCSpaceCharge.cxx:131 AliTPCSpaceCharge.cxx:132 AliTPCSpaceCharge.cxx:133 AliTPCSpaceCharge.cxx:134 AliTPCSpaceCharge.cxx:135 AliTPCSpaceCharge.cxx:136 AliTPCSpaceCharge.cxx:137 AliTPCSpaceCharge.cxx:138 AliTPCSpaceCharge.cxx:139 AliTPCSpaceCharge.cxx:140 AliTPCSpaceCharge.cxx:141 AliTPCSpaceCharge.cxx:142 AliTPCSpaceCharge.cxx:143 AliTPCSpaceCharge.cxx:144 AliTPCSpaceCharge.cxx:145 AliTPCSpaceCharge.cxx:146 AliTPCSpaceCharge.cxx:147 AliTPCSpaceCharge.cxx:148 AliTPCSpaceCharge.cxx:149 AliTPCSpaceCharge.cxx:150 AliTPCSpaceCharge.cxx:151 AliTPCSpaceCharge.cxx:152 AliTPCSpaceCharge.cxx:153 AliTPCSpaceCharge.cxx:154 AliTPCSpaceCharge.cxx:155 AliTPCSpaceCharge.cxx:156 AliTPCSpaceCharge.cxx:157 AliTPCSpaceCharge.cxx:158 AliTPCSpaceCharge.cxx:159 AliTPCSpaceCharge.cxx:160 AliTPCSpaceCharge.cxx:161 AliTPCSpaceCharge.cxx:162 AliTPCSpaceCharge.cxx:163 AliTPCSpaceCharge.cxx:164 AliTPCSpaceCharge.cxx:165 AliTPCSpaceCharge.cxx:166 AliTPCSpaceCharge.cxx:167 AliTPCSpaceCharge.cxx:168 AliTPCSpaceCharge.cxx:169 AliTPCSpaceCharge.cxx:170 AliTPCSpaceCharge.cxx:171 AliTPCSpaceCharge.cxx:172 AliTPCSpaceCharge.cxx:173 AliTPCSpaceCharge.cxx:174 AliTPCSpaceCharge.cxx:175 AliTPCSpaceCharge.cxx:176 AliTPCSpaceCharge.cxx:177 AliTPCSpaceCharge.cxx:178 AliTPCSpaceCharge.cxx:179 AliTPCSpaceCharge.cxx:180 AliTPCSpaceCharge.cxx:181 AliTPCSpaceCharge.cxx:182 AliTPCSpaceCharge.cxx:183 AliTPCSpaceCharge.cxx:184 AliTPCSpaceCharge.cxx:185 AliTPCSpaceCharge.cxx:186 AliTPCSpaceCharge.cxx:187 AliTPCSpaceCharge.cxx:188 AliTPCSpaceCharge.cxx:189 AliTPCSpaceCharge.cxx:190 AliTPCSpaceCharge.cxx:191 AliTPCSpaceCharge.cxx:192 AliTPCSpaceCharge.cxx:193 AliTPCSpaceCharge.cxx:194 AliTPCSpaceCharge.cxx:195 AliTPCSpaceCharge.cxx:196 AliTPCSpaceCharge.cxx:197 AliTPCSpaceCharge.cxx:198 AliTPCSpaceCharge.cxx:199 AliTPCSpaceCharge.cxx:200 AliTPCSpaceCharge.cxx:201 AliTPCSpaceCharge.cxx:202 AliTPCSpaceCharge.cxx:203 AliTPCSpaceCharge.cxx:204 AliTPCSpaceCharge.cxx:205 AliTPCSpaceCharge.cxx:206 AliTPCSpaceCharge.cxx:207 AliTPCSpaceCharge.cxx:208 AliTPCSpaceCharge.cxx:209 AliTPCSpaceCharge.cxx:210 AliTPCSpaceCharge.cxx:211 AliTPCSpaceCharge.cxx:212 AliTPCSpaceCharge.cxx:213 AliTPCSpaceCharge.cxx:214 AliTPCSpaceCharge.cxx:215 AliTPCSpaceCharge.cxx:216 AliTPCSpaceCharge.cxx:217 AliTPCSpaceCharge.cxx:218 AliTPCSpaceCharge.cxx:219 AliTPCSpaceCharge.cxx:220 AliTPCSpaceCharge.cxx:221 AliTPCSpaceCharge.cxx:222 AliTPCSpaceCharge.cxx:223 AliTPCSpaceCharge.cxx:224 AliTPCSpaceCharge.cxx:225 AliTPCSpaceCharge.cxx:226 AliTPCSpaceCharge.cxx:227 AliTPCSpaceCharge.cxx:228 AliTPCSpaceCharge.cxx:229 AliTPCSpaceCharge.cxx:230 AliTPCSpaceCharge.cxx:231 AliTPCSpaceCharge.cxx:232 AliTPCSpaceCharge.cxx:233 AliTPCSpaceCharge.cxx:234 AliTPCSpaceCharge.cxx:235 AliTPCSpaceCharge.cxx:236 AliTPCSpaceCharge.cxx:237 AliTPCSpaceCharge.cxx:238 AliTPCSpaceCharge.cxx:239 AliTPCSpaceCharge.cxx:240 AliTPCSpaceCharge.cxx:241 AliTPCSpaceCharge.cxx:242 AliTPCSpaceCharge.cxx:243 AliTPCSpaceCharge.cxx:244 AliTPCSpaceCharge.cxx:245 AliTPCSpaceCharge.cxx:246 AliTPCSpaceCharge.cxx:247 AliTPCSpaceCharge.cxx:248 AliTPCSpaceCharge.cxx:249 AliTPCSpaceCharge.cxx:250 AliTPCSpaceCharge.cxx:251 AliTPCSpaceCharge.cxx:252 AliTPCSpaceCharge.cxx:253 AliTPCSpaceCharge.cxx:254 AliTPCSpaceCharge.cxx:255 AliTPCSpaceCharge.cxx:256 AliTPCSpaceCharge.cxx:257 AliTPCSpaceCharge.cxx:258 AliTPCSpaceCharge.cxx:259 AliTPCSpaceCharge.cxx:260 AliTPCSpaceCharge.cxx:261 AliTPCSpaceCharge.cxx:262 AliTPCSpaceCharge.cxx:263 AliTPCSpaceCharge.cxx:264 AliTPCSpaceCharge.cxx:265 AliTPCSpaceCharge.cxx:266 AliTPCSpaceCharge.cxx:267 AliTPCSpaceCharge.cxx:268 AliTPCSpaceCharge.cxx:269 AliTPCSpaceCharge.cxx:270 AliTPCSpaceCharge.cxx:271 AliTPCSpaceCharge.cxx:272 AliTPCSpaceCharge.cxx:273 AliTPCSpaceCharge.cxx:274 AliTPCSpaceCharge.cxx:275 AliTPCSpaceCharge.cxx:276 AliTPCSpaceCharge.cxx:277 AliTPCSpaceCharge.cxx:278 AliTPCSpaceCharge.cxx:279 AliTPCSpaceCharge.cxx:280 AliTPCSpaceCharge.cxx:281 AliTPCSpaceCharge.cxx:282 AliTPCSpaceCharge.cxx:283 AliTPCSpaceCharge.cxx:284 AliTPCSpaceCharge.cxx:285 AliTPCSpaceCharge.cxx:286 AliTPCSpaceCharge.cxx:287 AliTPCSpaceCharge.cxx:288 AliTPCSpaceCharge.cxx:289 AliTPCSpaceCharge.cxx:290 AliTPCSpaceCharge.cxx:291 AliTPCSpaceCharge.cxx:292 AliTPCSpaceCharge.cxx:293 AliTPCSpaceCharge.cxx:294 AliTPCSpaceCharge.cxx:295 AliTPCSpaceCharge.cxx:296 AliTPCSpaceCharge.cxx:297 AliTPCSpaceCharge.cxx:298 AliTPCSpaceCharge.cxx:299 AliTPCSpaceCharge.cxx:300 AliTPCSpaceCharge.cxx:301 AliTPCSpaceCharge.cxx:302 AliTPCSpaceCharge.cxx:303 AliTPCSpaceCharge.cxx:304 AliTPCSpaceCharge.cxx:305