2 /**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
17 ////////////////////////////////////////////////////////////////////////////////
19 // AliTPCComposedCorrection class //
21 // This class is creating a correction that is composed out of smaller //
23 // There are two ways the sub-corrections can be combined into this one: //
24 // 1. kParallel: All corrections are applied at the given position x and //
25 // the dx terms are summed up (this commutes). //
26 // 2. kQueue: The corrections are called in order. The first one at the //
27 // given position x resulting in dx1, the second one is called at //
28 // the corrected position (x+dx1) resulting in dx2, the third one //
29 // is then called at position (x+dx1+dx2) and so forth. dx=dx1+dx2+... //
31 // For the inverse of the correction this is taken into account by reversing //
32 // the order the corrections are applied in the kQueue case (no issue for //
35 // date: 27/04/2010 //
36 // Authors: Magnus Mager, Stefan Rossegger, Jim Thomas //
40 // AliMagF mag("mag","mag"); //
41 // AliTPCExBBShape exb; // B field shape distortions //
42 // exb.SetBField(&mag); //
44 // AliTPCExBTwist twist; // ExB Twist distortions //
45 // twist.SetXTwist(0.001); //
47 // TObjArray cs; cs.Add(&exb); cs.Add(&twist); //
49 // AliTPCComposedCorrection cc; //
50 // cc.SetCorrections(&cs); //
51 // cc.SetOmegaTauT1T2(wt,T1,T2); //
53 // cc.CreateHistoDRPhiinZR(0,100,100)->Draw("surf2"); //
54 ////////////////////////////////////////////////////////////////////////////////
57 #include <TCollection.h>
58 #include <TTimeStamp.h>
59 #include <TIterator.h>
62 #include "AliTPCComposedCorrection.h"
65 AliTPCComposedCorrection::AliTPCComposedCorrection()
66 : AliTPCCorrection("composed_correction",
67 "composition of corrections"),
70 fWeights(0) // weights of corrections
73 // default constructor
77 AliTPCComposedCorrection::AliTPCComposedCorrection(TCollection *corrections,
78 AliTPCComposedCorrection::CompositionType mode)
79 : AliTPCCorrection("composed_correction",
80 "composition of corrections"),
81 fCorrections(corrections),
83 fWeights(0) //weights of correction
86 // Constructor that defines the set of corrections, this one is composed of.
90 AliTPCComposedCorrection::~AliTPCComposedCorrection() {
95 AliInfo("No Correction-models were set: can not delete them");
97 TIterator *i=fCorrections->MakeIterator();
99 while (0!=(c=dynamic_cast<AliTPCCorrection*>(i->Next()))) {
104 if (fWeights) delete fWeights;
108 void AliTPCComposedCorrection::GetCorrection(const Float_t x[],const Short_t roc,Float_t dx[]) {
110 // This applies all correction and the specified manner (see general
111 // class description for details).
115 AliInfo("No Corrections-models were set: can not calculate distortions");
118 TIterator *i=fCorrections->MakeIterator();
124 for (int j=0;j<3;++j) dx[j]=0.;
125 while (0!=(c=dynamic_cast<AliTPCCorrection*>(i->Next()))) {
126 c->GetCorrection(x,roc,dxi);
128 if (fWeights) w=(*fWeights)[weightIndex++];
129 for (Int_t j=0;j<3;++j) dx[j]+=w*dxi[j];
134 for (Int_t j=0;j<3;++j) xi[j]=x[j];
135 while (0!=(c=dynamic_cast<AliTPCCorrection*>(i->Next()))) {
136 c->GetCorrection(xi,roc,dx);
138 if (fWeights) w=(*fWeights)[weightIndex++];
139 for (Int_t j=0;j<3;++j) xi[j]+=w*dx[j];
141 for (Int_t j=0;j<3;++j) dx[j]=xi[j]-x[j];
147 void AliTPCComposedCorrection::GetDistortion(const Float_t x[],const Short_t roc,Float_t dx[]) {
149 // This applies all distortions and the specified manner (see general
150 // class descxiption for details).
154 AliInfo("No Corrections-models were set: can not calculate distortions");
157 TIterator *i=fCorrections->MakeReverseIterator();
163 for (int j=0;j<3;++j) dx[j]=0.;
164 while (0!=(c=dynamic_cast<AliTPCCorrection*>(i->Next()))) {
165 c->GetDistortion(x,roc,dxi);
167 if (fWeights) w=(*fWeights)[weightIndex++];
168 for (Int_t j=0;j<3;++j) dx[j]+=w*dxi[j];
173 for (Int_t j=0;j<3;++j) xi[j]=x[j];
174 while (0!=(c=dynamic_cast<AliTPCCorrection*>(i->Next()))) {
175 c->GetDistortion(xi,roc,dx);
177 if (fWeights) w=(*fWeights)[weightIndex++];
178 for (Int_t j=0;j<3;++j) xi[j]+=w*dx[j];
180 for (Int_t j=0;j<3;++j) dx[j]=xi[j]-x[j];
187 void AliTPCComposedCorrection::Print(Option_t* option) const {
189 // Print function to check which correction classes are used
190 // option=="d" prints details regarding the setted magnitude
191 // option=="a" prints the C0 and C1 coefficents for calibration purposes
194 printf("Composed TPC spacepoint correction \"%s\" -- composed of:\n",GetTitle());
195 TString opt = option; opt.ToLower();
198 printf(" - composed correction is empty!\n");
201 TIterator *i=fCorrections->MakeIterator();
203 while (0!=(c=dynamic_cast<AliTPCCorrection*>(i->Next()))) {
204 if (opt.Contains("d")) {
206 printf("%d. %s\t%s\n",in,c->GetTitle(), c->GetName());
209 printf("%d. %s\t%s\n",in,c->GetTitle(), c->GetName());
213 if (in==1) printf(" Info: The correction compound is empty: No corrections set\n");
218 void AliTPCComposedCorrection::Init() {
220 // Initialization funtion (not used at the moment)
223 AliInfo("No Correction-models were set");
226 TIterator *i=fCorrections->MakeIterator();
228 while (0!=(c=dynamic_cast<AliTPCCorrection*>(i->Next())))
234 void AliTPCComposedCorrection::Update(const TTimeStamp &timeStamp) {
239 AliInfo("No Correction-models were set");
243 TIterator *i=fCorrections->MakeIterator();
245 while (0!=(c=dynamic_cast<AliTPCCorrection*>(i->Next())))
246 c->Update(timeStamp);
253 void AliTPCComposedCorrection::SetOmegaTauT1T2(Float_t omegaTau,Float_t t1,Float_t t2) {
255 // Gives the possibility to set the OmegaTau plus Tensor corrections T1 and T2 (effective omega Tau)
256 // to each subcorrection (since they might become event specific due to changing drift velocity)
258 // The omegaTau comes idealy from the Database, since it is a function of drift velocity, B and E field
259 // e.g. omegaTau = -10.0 * Bz * vdrift / Ez ; // with Bz in kG and Ez in V/cm
260 // omegaTau = -0.325 for Bz=5kG, Ez=400V/cm and vdrift = 2.6cm/muSec
261 // The T1 and T2 tensors were measured in a dedicated calibration run
263 // Note: overwrites previously set values!
267 AliInfo("No Correction-models were set");
271 TIterator *i=fCorrections->MakeIterator();
273 while (0!=(c=dynamic_cast<AliTPCCorrection*>(i->Next()))) {
274 c->SetOmegaTauT1T2(omegaTau,t1,t2);
279 ClassImp(AliTPCComposedCorrection)