**************************************************************************/
////////////////////////////////////////////////////////////////////////////
-// //
// AliTPCGGVoltError class //
-// The class calculates the electric field and space point distortions //
-// due a Gating Grid (GG) Error voltage. It uses the exact calculation //
-// technique based on bessel functions. (original code from STAR) //
-// The class allows "effective Omega Tau" corrections. //
-// //
-// date: 27/04/2010 //
-// Authors: Jim Thomas, Stefan Rossegger, Magnus Mager //
-// //
-// Example usage: //
-// AliTPCGGVoltError GGerror; //
-// GGerror.SetOmegaTauT1T2(0.32,1.,1.); // values ideally from OCDB //
-// GGerror.SetDeltaVGGA(50.); // voltage offset A-side //
-// GGerror.SetDeltaVGGC(50.); // voltage offset C-side //
-// GGerror.InitGGVoltErrorDistortion(); // initialization of the look up //
-// // plot dRPhi distortions ... //
-// GGerror.CreateHistoDRPhiinZR(1.,100,100)->Draw("surf2"); //
////////////////////////////////////////////////////////////////////////////
+#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.)
+ fDeltaVGGA(0.),fDeltaVGGC(0.),
+ fInitLookUp(kFALSE)
{
//
// default constructor
//
}
+void AliTPCGGVoltError::Init() {
+ //
+ // Init function
+ //
+ AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
+ if (!magF) AliError("Magneticd field - not initialized");
+ Double_t bzField = magF->SolenoidField()/10.; //field in T
+ AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters();
+ if (!param) AliError("Parameters - not initialized");
+ Double_t vdrift = param->GetDriftV()/1000000.; // [cm/us] // From dataBase: to be updated: per second (ideally)
+ Double_t ezField = 400; // [V/cm] // to be updated: never (hopefully)
+ Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ;
+ //
+ SetOmegaTauT1T2(wt,fT1,fT2);
+ InitGGVoltErrorDistortion();
+ //SetDeltaVGGA(0.0);// ideally from the database
+ //SetDeltaVGGC(0.0);// ideally from the database
+}
+
+void AliTPCGGVoltError::Update(const TTimeStamp &/*timeStamp*/) {
+ //
+ // Update function
+ //
+ AliMagF* magF= (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
+ if (!magF) AliError("Magneticd field - not initialized");
+ Double_t bzField = magF->SolenoidField()/10.; //field in T
+ AliTPCParam *param= AliTPCcalibDB::Instance()->GetParameters();
+ if (!param) AliError("Parameters - not initialized");
+ Double_t vdrift = param->GetDriftV()/1000000.; // [cm/us] // From dataBase: to be updated: per second (ideally)
+ Double_t ezField = 400; // [V/cm] // to be updated: never (hopefully)
+ Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ;
+
+ SetOmegaTauT1T2(wt,fT1,fT2);
+ // InitGGVoltErrorDistortion(); // not necessary in here since the Voltage should not change!
+}
+
+
+
void AliTPCGGVoltError::GetCorrection(const Float_t x[],const Short_t roc,Float_t dx[]) {
//
// Electrostatic Equations from StarNote SN0253 by Howard Wieman.
//
+ if (!fInitLookUp) AliError("Lookup table was not initialized! You should do InitGGVoltErrorDistortion() ...");
+
Int_t order = 1 ; // FIXME: hardcoded? Linear interpolation = 1, Quadratic = 2
Double_t intEr, intEphi ;
// Calculate correction in cartesian coordinates
dx[0] = r * TMath::Cos(phi) - x[0];
dx[1] = r * TMath::Sin(phi) - x[1];
- dx[2] = 0.; // z distortion not implemented (1st order distortions)
+ dx[2] = 0.; // z distortion not implemented (1st order distortions) - see e.g. AliTPCBoundaryVoltError-class
+
+
}
// This function is purely for calibration purposes
// Calculates the integral (int Er/Ez dz) for the setted GG voltage offset
//
-
+
+ if (!fInitLookUp) AliError("Lookup table was not initialized! You should do InitGGVoltErrorDistortion() ...");
+
Int_t order = 1 ; // FIXME: so far hardcoded? Linear interpolation = 1, Quadratic = 2
Double_t intEr;
fGGVoltErrorER[i][j] = 0.0 ;
Double_t intz = 0.0 ;
for ( Int_t n = 1 ; n < nterms ; ++n ) {
- Double_t k = n * TMath::Pi() / fgkTPC_Z0 ;
+ Double_t k = n * TMath::Pi() / fgkTPCZ0 ;
Double_t ein = 0 ; // Error potential on the IFC
Double_t eout = 0 ; // Error potential on the OFC
if ( z < 0 ) {
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*(fgkTPC_Z0-TMath::Abs(z)) ) - 1 ;
+ Double_t zterm = TMath::Cos( k*(fgkTPCZ0-TMath::Abs(z)) ) - 1 ;
intz += zterm * numerator / denominator ;
// Assume series converges, break if small terms
if ( n>10 && TMath::Abs(intz)*1.e-10 > TMath::Abs(numerator/denominator) ) break;
}
}
+
+ fInitLookUp = kTRUE;
}
-void AliTPCGGVoltError::Print(Option_t* option) const {
+void AliTPCGGVoltError::Print(const Option_t* option) const {
//
// Print function to check the settings (e.g. voltage offsets)
// option=="a" prints the C0 and C1 coefficents for calibration purposes
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")) { // Print all details
+ 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() ...");
}