#include "AliMagF.h"
#include "TGeoGlobalMagField.h"
#include "AliTPCcalibDB.h"
#include "AliTPCParam.h"
#include "AliLog.h"
#include "AliTPCGGVoltError.h"
#include <TMath.h>
AliTPCGGVoltError::AliTPCGGVoltError()
: AliTPCCorrection("GGVoltError","GatingGrid (GG) Voltage Error"),
fC0(0.),fC1(0.),
fDeltaVGGA(0.),fDeltaVGGC(0.),
fInitLookUp(kFALSE)
{
}
AliTPCGGVoltError::~AliTPCGGVoltError() {
}
void AliTPCGGVoltError::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);
InitGGVoltErrorDistortion();
}
void AliTPCGGVoltError::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 AliTPCGGVoltError::GetCorrection(const Float_t x[],const Short_t roc,Float_t dx[]) {
if (!fInitLookUp) AliError("Lookup table was not initialized! You should do InitGGVoltErrorDistortion() ...");
Int_t order = 1 ;
Double_t intEr, intEphi ;
Double_t r, phi, z ;
Int_t sign ;
Double_t deltaVGG;
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;
deltaVGG = fDeltaVGGA;
} else {
sign = -1;
deltaVGG = fDeltaVGGC;
}
if ( sign==1 && z < fgkZOffSet ) z = fgkZOffSet;
if ( sign==-1 && z > -fgkZOffSet ) z = -fgkZOffSet;
Interpolate2DEdistortion( order, r, z, fGGVoltErrorER, intEr );
intEphi = 0.0;
if ( r > 0.0 ) {
phi = phi + deltaVGG*( fC0*intEphi - fC1*intEr ) / r;
r = r + deltaVGG*( fC0*intEr + fC1*intEphi );
}
dx[0] = r * TMath::Cos(phi) - x[0];
dx[1] = r * TMath::Sin(phi) - x[1];
dx[2] = 0.;
}
Float_t AliTPCGGVoltError::GetIntErOverEz(const Float_t x[],const Short_t roc) {
if (!fInitLookUp) AliError("Lookup table was not initialized! You should do InitGGVoltErrorDistortion() ...");
Int_t order = 1 ;
Double_t intEr;
Double_t r, phi, z ;
Int_t sign ;
Double_t deltaVGG;
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;
deltaVGG = fDeltaVGGA;
} else {
sign = -1;
deltaVGG = fDeltaVGGC;
}
if ( sign==1 && z < fgkZOffSet ) z = fgkZOffSet;
if ( sign==-1 && z > -fgkZOffSet ) z = -fgkZOffSet;
Interpolate2DEdistortion(order, r, z, fGGVoltErrorER, intEr );
return (intEr*deltaVGG);
}
void AliTPCGGVoltError::InitGGVoltErrorDistortion() {
Double_t r,z;
Int_t nterms = 100 ;
for ( Int_t i = 0 ; i < kNZ ; ++i ) {
z = fgkZList[i] ;
for ( Int_t j = 0 ; j < kNR ; ++j ) {
r = fgkRList[j] ;
fGGVoltErrorER[i][j] = 0.0 ;
Double_t intz = 0.0 ;
for ( Int_t n = 1 ; n < nterms ; ++n ) {
Double_t k = n * TMath::Pi() / fgkTPCZ0 ;
Double_t ein = 0 ;
Double_t eout = 0 ;
if ( z < 0 ) {
ein = -2.0 / ( k * (fgkCathodeV - fgkGG) ) ;
eout = -2.0 / ( k * (fgkCathodeV - fgkGG) ) ;
}
if ( z == 0 ) continue ;
if ( z > 0 ) {
ein = -2.0 / ( k * (fgkCathodeV - fgkGG) ) ;
eout = -2.0 / ( k * (fgkCathodeV - fgkGG) ) ;
}
Double_t an = ein * TMath::BesselK0( k*fgkOFCRadius ) - eout * TMath::BesselK0( k*fgkIFCRadius ) ;
Double_t bn = eout * TMath::BesselI0( k*fgkIFCRadius ) - ein * TMath::BesselI0( k*fgkOFCRadius ) ;
Double_t numerator =
an * TMath::BesselI1( k*r ) - bn * TMath::BesselK1( k*r ) ;
Double_t denominator =
TMath::BesselK0( k*fgkOFCRadius ) * TMath::BesselI0( k*fgkIFCRadius ) -
TMath::BesselK0( k*fgkIFCRadius ) * TMath::BesselI0( k*fgkOFCRadius ) ;
Double_t zterm = TMath::Cos( k*(fgkTPCZ0-TMath::Abs(z)) ) - 1 ;
intz += zterm * numerator / denominator ;
if ( n>10 && TMath::Abs(intz)*1.e-10 > TMath::Abs(numerator/denominator) ) break;
}
fGGVoltErrorER[i][j] = (Double_t) intz ;
}
}
fInitLookUp = kTRUE;
}
void AliTPCGGVoltError::Print(const Option_t* option) const {
TString opt = option; opt.ToLower();
printf("%s\n",GetTitle());
printf(" - GG Voltage offset: A-side: %3.1f V, C-side: %3.1f V \n",fDeltaVGGA,fDeltaVGGC);
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 InitGGVoltErrorDistortion() ...");
}
AliTPCGGVoltError.cxx:100 AliTPCGGVoltError.cxx:101 AliTPCGGVoltError.cxx:102 AliTPCGGVoltError.cxx:103 AliTPCGGVoltError.cxx:104 AliTPCGGVoltError.cxx:105 AliTPCGGVoltError.cxx:106 AliTPCGGVoltError.cxx:107 AliTPCGGVoltError.cxx:108 AliTPCGGVoltError.cxx:109 AliTPCGGVoltError.cxx:110 AliTPCGGVoltError.cxx:111 AliTPCGGVoltError.cxx:112 AliTPCGGVoltError.cxx:113 AliTPCGGVoltError.cxx:114 AliTPCGGVoltError.cxx:115 AliTPCGGVoltError.cxx:116 AliTPCGGVoltError.cxx:117 AliTPCGGVoltError.cxx:118 AliTPCGGVoltError.cxx:119 AliTPCGGVoltError.cxx:120 AliTPCGGVoltError.cxx:121 AliTPCGGVoltError.cxx:122 AliTPCGGVoltError.cxx:123 AliTPCGGVoltError.cxx:124 AliTPCGGVoltError.cxx:125 AliTPCGGVoltError.cxx:126 AliTPCGGVoltError.cxx:127 AliTPCGGVoltError.cxx:128 AliTPCGGVoltError.cxx:129 AliTPCGGVoltError.cxx:130 AliTPCGGVoltError.cxx:131 AliTPCGGVoltError.cxx:132 AliTPCGGVoltError.cxx:133 AliTPCGGVoltError.cxx:134 AliTPCGGVoltError.cxx:135 AliTPCGGVoltError.cxx:136 AliTPCGGVoltError.cxx:137 AliTPCGGVoltError.cxx:138 AliTPCGGVoltError.cxx:139 AliTPCGGVoltError.cxx:140 AliTPCGGVoltError.cxx:141 AliTPCGGVoltError.cxx:142 AliTPCGGVoltError.cxx:143 AliTPCGGVoltError.cxx:144 AliTPCGGVoltError.cxx:145 AliTPCGGVoltError.cxx:146 AliTPCGGVoltError.cxx:147 AliTPCGGVoltError.cxx:148 AliTPCGGVoltError.cxx:149 AliTPCGGVoltError.cxx:150 AliTPCGGVoltError.cxx:151 AliTPCGGVoltError.cxx:152 AliTPCGGVoltError.cxx:153 AliTPCGGVoltError.cxx:154 AliTPCGGVoltError.cxx:155 AliTPCGGVoltError.cxx:156 AliTPCGGVoltError.cxx:157 AliTPCGGVoltError.cxx:158 AliTPCGGVoltError.cxx:159 AliTPCGGVoltError.cxx:160 AliTPCGGVoltError.cxx:161 AliTPCGGVoltError.cxx:162 AliTPCGGVoltError.cxx:163 AliTPCGGVoltError.cxx:164 AliTPCGGVoltError.cxx:165 AliTPCGGVoltError.cxx:166 AliTPCGGVoltError.cxx:167 AliTPCGGVoltError.cxx:168 AliTPCGGVoltError.cxx:169 AliTPCGGVoltError.cxx:170 AliTPCGGVoltError.cxx:171 AliTPCGGVoltError.cxx:172 AliTPCGGVoltError.cxx:173 AliTPCGGVoltError.cxx:174 AliTPCGGVoltError.cxx:175 AliTPCGGVoltError.cxx:176 AliTPCGGVoltError.cxx:177 AliTPCGGVoltError.cxx:178 AliTPCGGVoltError.cxx:179 AliTPCGGVoltError.cxx:180 AliTPCGGVoltError.cxx:181 AliTPCGGVoltError.cxx:182 AliTPCGGVoltError.cxx:183 AliTPCGGVoltError.cxx:184 AliTPCGGVoltError.cxx:185 AliTPCGGVoltError.cxx:186 AliTPCGGVoltError.cxx:187 AliTPCGGVoltError.cxx:188 AliTPCGGVoltError.cxx:189 AliTPCGGVoltError.cxx:190 AliTPCGGVoltError.cxx:191 AliTPCGGVoltError.cxx:192 AliTPCGGVoltError.cxx:193 AliTPCGGVoltError.cxx:194 AliTPCGGVoltError.cxx:195 AliTPCGGVoltError.cxx:196 AliTPCGGVoltError.cxx:197 AliTPCGGVoltError.cxx:198 AliTPCGGVoltError.cxx:199 AliTPCGGVoltError.cxx:200 AliTPCGGVoltError.cxx:201 AliTPCGGVoltError.cxx:202 AliTPCGGVoltError.cxx:203 AliTPCGGVoltError.cxx:204 AliTPCGGVoltError.cxx:205 AliTPCGGVoltError.cxx:206 AliTPCGGVoltError.cxx:207 AliTPCGGVoltError.cxx:208 AliTPCGGVoltError.cxx:209 AliTPCGGVoltError.cxx:210 AliTPCGGVoltError.cxx:211 AliTPCGGVoltError.cxx:212 AliTPCGGVoltError.cxx:213 AliTPCGGVoltError.cxx:214 AliTPCGGVoltError.cxx:215 AliTPCGGVoltError.cxx:216 AliTPCGGVoltError.cxx:217 AliTPCGGVoltError.cxx:218 AliTPCGGVoltError.cxx:219 AliTPCGGVoltError.cxx:220 AliTPCGGVoltError.cxx:221 AliTPCGGVoltError.cxx:222 AliTPCGGVoltError.cxx:223 AliTPCGGVoltError.cxx:224 AliTPCGGVoltError.cxx:225 AliTPCGGVoltError.cxx:226 AliTPCGGVoltError.cxx:227 AliTPCGGVoltError.cxx:228 AliTPCGGVoltError.cxx:229 AliTPCGGVoltError.cxx:230 AliTPCGGVoltError.cxx:231 AliTPCGGVoltError.cxx:232 AliTPCGGVoltError.cxx:233 AliTPCGGVoltError.cxx:234 AliTPCGGVoltError.cxx:235 AliTPCGGVoltError.cxx:236 AliTPCGGVoltError.cxx:237 AliTPCGGVoltError.cxx:238 AliTPCGGVoltError.cxx:239 AliTPCGGVoltError.cxx:240 AliTPCGGVoltError.cxx:241 AliTPCGGVoltError.cxx:242 AliTPCGGVoltError.cxx:243