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.                  *
 **************************************************************************/

////////////////////////////////////////////////////////////////////////////
// AliTPCExBTwist class                                                   //
////////////////////////////////////////////////////////////////////////////


#include "AliMagF.h"
#include "TGeoGlobalMagField.h"
#include "AliTPCcalibDB.h"
#include "AliTPCParam.h"
#include "AliLog.h"

#include "AliTPCExBTwist.h"

AliTPCExBTwist::AliTPCExBTwist()
  : AliTPCCorrection("exb_twist","ExB twist"),
    fC1(0.),fC2(0.),
    fXTwist(0.),fYTwist(0.)
{
  //
  // default constructor
  //
}

AliTPCExBTwist::~AliTPCExBTwist() {
  //
  // default destructor
  //
}

Bool_t AliTPCExBTwist::AddCorrectionCompact(AliTPCCorrection* corr, Double_t weight){
  //
  // Add correction  and make them compact
  // Assumptions:
  //  - origin of distortion/correction are additive
  //  - only correction ot the same type supported ()
  if (corr==NULL) {
    AliError("Zerro pointer - correction");
    return kFALSE;
  }  
  AliTPCExBTwist * corrC = dynamic_cast< AliTPCExBTwist*>(corr);
  if (corrC == NULL) return kFALSE;
  fXTwist+=weight*corrC->fXTwist;        // Twist of E to B field in X-Z [rad]
  fYTwist+=weight*corrC->fYTwist;        // Twist of E to B field in Y-Z [rad]
  return kTRUE;
}



void AliTPCExBTwist::Init() {
  //
  // Initialization funtion
  //
  
  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 ; 
  // Correction Terms for effective omegaTau; obtained by a laser calibration run
  SetOmegaTauT1T2(wt,fT1,fT2);


}

void AliTPCExBTwist::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 ; 
  // Correction Terms for effective omegaTau; obtained by a laser calibration run
  SetOmegaTauT1T2(wt,fT1,fT2);


}



void AliTPCExBTwist::GetCorrection(const Float_t x[],const Short_t roc,Float_t dx[]) {
  //
  // Calculates the correction of a mismatch between the E and B field axis
  // 
  
  const Float_t zstart=x[2];
  const Float_t zend  =(roc%36<18?fgkTPCZ0:-fgkTPCZ0);
  const Float_t zdrift=zstart-zend;
  
  dx[0]=(fC2*fXTwist-fC1*fYTwist)*zdrift;
  dx[1]=(fC1*fXTwist+fC2*fYTwist)*zdrift;
  dx[2]=0.;
}

void AliTPCExBTwist::Print(const Option_t* option) const {
  //
  // Print function to check the settings (e.g. the twist in the X direction)
  // option=="a" prints the C0 and C1 coefficents for calibration purposes
  //

  TString opt = option; opt.ToLower();
  printf("%s\n",GetTitle());
  
  printf(" - Twist settings: X-Twist: %1.5f rad, Y-Twist: %1.5f rad \n",fXTwist,fYTwist);
  if (opt.Contains("a")) { // Print all details
    printf(" - T1: %1.4f, T2: %1.4f \n",fT1,fT2);
    printf(" - C1: %1.4f, C2: %1.4f \n",fC1,fC2);
  }    
 
 
}
 AliTPCExBTwist.cxx:1
 AliTPCExBTwist.cxx:2
 AliTPCExBTwist.cxx:3
 AliTPCExBTwist.cxx:4
 AliTPCExBTwist.cxx:5
 AliTPCExBTwist.cxx:6
 AliTPCExBTwist.cxx:7
 AliTPCExBTwist.cxx:8
 AliTPCExBTwist.cxx:9
 AliTPCExBTwist.cxx:10
 AliTPCExBTwist.cxx:11
 AliTPCExBTwist.cxx:12
 AliTPCExBTwist.cxx:13
 AliTPCExBTwist.cxx:14
 AliTPCExBTwist.cxx:15
 AliTPCExBTwist.cxx:16
 AliTPCExBTwist.cxx:17
 AliTPCExBTwist.cxx:18
 AliTPCExBTwist.cxx:19
 AliTPCExBTwist.cxx:20
 AliTPCExBTwist.cxx:21
 AliTPCExBTwist.cxx:22
 AliTPCExBTwist.cxx:23
 AliTPCExBTwist.cxx:24
 AliTPCExBTwist.cxx:25
 AliTPCExBTwist.cxx:26
 AliTPCExBTwist.cxx:27
 AliTPCExBTwist.cxx:28
 AliTPCExBTwist.cxx:29
 AliTPCExBTwist.cxx:30
 AliTPCExBTwist.cxx:31
 AliTPCExBTwist.cxx:32
 AliTPCExBTwist.cxx:33
 AliTPCExBTwist.cxx:34
 AliTPCExBTwist.cxx:35
 AliTPCExBTwist.cxx:36
 AliTPCExBTwist.cxx:37
 AliTPCExBTwist.cxx:38
 AliTPCExBTwist.cxx:39
 AliTPCExBTwist.cxx:40
 AliTPCExBTwist.cxx:41
 AliTPCExBTwist.cxx:42
 AliTPCExBTwist.cxx:43
 AliTPCExBTwist.cxx:44
 AliTPCExBTwist.cxx:45
 AliTPCExBTwist.cxx:46
 AliTPCExBTwist.cxx:47
 AliTPCExBTwist.cxx:48
 AliTPCExBTwist.cxx:49
 AliTPCExBTwist.cxx:50
 AliTPCExBTwist.cxx:51
 AliTPCExBTwist.cxx:52
 AliTPCExBTwist.cxx:53
 AliTPCExBTwist.cxx:54
 AliTPCExBTwist.cxx:55
 AliTPCExBTwist.cxx:56
 AliTPCExBTwist.cxx:57
 AliTPCExBTwist.cxx:58
 AliTPCExBTwist.cxx:59
 AliTPCExBTwist.cxx:60
 AliTPCExBTwist.cxx:61
 AliTPCExBTwist.cxx:62
 AliTPCExBTwist.cxx:63
 AliTPCExBTwist.cxx:64
 AliTPCExBTwist.cxx:65
 AliTPCExBTwist.cxx:66
 AliTPCExBTwist.cxx:67
 AliTPCExBTwist.cxx:68
 AliTPCExBTwist.cxx:69
 AliTPCExBTwist.cxx:70
 AliTPCExBTwist.cxx:71
 AliTPCExBTwist.cxx:72
 AliTPCExBTwist.cxx:73
 AliTPCExBTwist.cxx:74
 AliTPCExBTwist.cxx:75
 AliTPCExBTwist.cxx:76
 AliTPCExBTwist.cxx:77
 AliTPCExBTwist.cxx:78
 AliTPCExBTwist.cxx:79
 AliTPCExBTwist.cxx:80
 AliTPCExBTwist.cxx:81
 AliTPCExBTwist.cxx:82
 AliTPCExBTwist.cxx:83
 AliTPCExBTwist.cxx:84
 AliTPCExBTwist.cxx:85
 AliTPCExBTwist.cxx:86
 AliTPCExBTwist.cxx:87
 AliTPCExBTwist.cxx:88
 AliTPCExBTwist.cxx:89
 AliTPCExBTwist.cxx:90
 AliTPCExBTwist.cxx:91
 AliTPCExBTwist.cxx:92
 AliTPCExBTwist.cxx:93
 AliTPCExBTwist.cxx:94
 AliTPCExBTwist.cxx:95
 AliTPCExBTwist.cxx:96
 AliTPCExBTwist.cxx:97
 AliTPCExBTwist.cxx:98
 AliTPCExBTwist.cxx:99
 AliTPCExBTwist.cxx:100
 AliTPCExBTwist.cxx:101
 AliTPCExBTwist.cxx:102
 AliTPCExBTwist.cxx:103
 AliTPCExBTwist.cxx:104
 AliTPCExBTwist.cxx:105
 AliTPCExBTwist.cxx:106
 AliTPCExBTwist.cxx:107
 AliTPCExBTwist.cxx:108
 AliTPCExBTwist.cxx:109
 AliTPCExBTwist.cxx:110
 AliTPCExBTwist.cxx:111
 AliTPCExBTwist.cxx:112
 AliTPCExBTwist.cxx:113
 AliTPCExBTwist.cxx:114
 AliTPCExBTwist.cxx:115
 AliTPCExBTwist.cxx:116
 AliTPCExBTwist.cxx:117
 AliTPCExBTwist.cxx:118
 AliTPCExBTwist.cxx:119
 AliTPCExBTwist.cxx:120
 AliTPCExBTwist.cxx:121
 AliTPCExBTwist.cxx:122
 AliTPCExBTwist.cxx:123
 AliTPCExBTwist.cxx:124
 AliTPCExBTwist.cxx:125
 AliTPCExBTwist.cxx:126
 AliTPCExBTwist.cxx:127
 AliTPCExBTwist.cxx:128
 AliTPCExBTwist.cxx:129
 AliTPCExBTwist.cxx:130
 AliTPCExBTwist.cxx:131
 AliTPCExBTwist.cxx:132
 AliTPCExBTwist.cxx:133