4 Register primitive corrections: base functions for minimization:
5 Id numbers are assoctied to given primitive corrections.
6 See comments in the function headers.
7 Used only for residuals minimization not in the reconstruction.
8 File with all primitives expected to be in the current directory
9 filename = TPCCorrectionPrimitives.root
12 RegisterCorrection(); - Reserved id's 0 -999
14 RegisterAliTPCFCVoltError3D(); - Reserved id's 0 -99
15 RegisterAliTPCBoundaryVoltError(); - Reserved id's 100-199
16 RegisterAliTPCCalibGlobalMisalignment(); - Reserved id's 200-499
17 RegisterAliTPCExBBShape(); - Reserved id's 500-600
18 RegisterAliTPCExBTwist(); - Reserved id's 600-700
21 .L $ALICE_ROOT/TPC/CalibMacros/RegisterCorrection.C+
25 #if !defined(__CINT__) || defined(__MAKECINT__)
27 #include "TObjArray.h"
28 #include "TTreeStream.h"
40 #include "AliTPCParamSR.h"
41 #include "TDatabasePDG.h"
42 #include "AliTPCCorrection.h"
43 #include "AliTPCFCVoltError3D.h"
44 #include "AliTPCROCVoltError3D.h"
45 #include "AliTPCComposedCorrection.h"
46 #include "AliTPCBoundaryVoltError.h"
47 #include "AliTPCCalibGlobalMisalignment.h"
48 #include "AliTPCExBBShape.h"
49 #include "AliTPCExBTwist.h"
51 #include "AliCDBEntry.h"
52 #include "AliTPCROC.h"
53 #include <TStatToolkit.h>
55 #include "TGraphErrors.h"
56 #include "AliTrackerBase.h"
57 #include "TGeoGlobalMagField.h"
63 TFile *fCorrections=0; //file with corrections
65 //models E field distortion AliTPCFCVoltError3D
67 AliTPCFCVoltError3D *rotOFC =0; // fit models
68 AliTPCFCVoltError3D *rodOFC1 =0;
69 AliTPCFCVoltError3D *rodOFC2 =0;
70 AliTPCFCVoltError3D *rotIFC =0;
71 AliTPCFCVoltError3D *rodIFC1 =0;
72 AliTPCFCVoltError3D *rodIFC2 =0;
73 AliTPCFCVoltError3D *rodIFCShift=0; //common IFC shift
74 AliTPCFCVoltError3D *rodOFCShift=0; //common OFC shift
75 AliTPCFCVoltError3D *rodIFCSin=0; //common IFC shift -sinus
76 AliTPCFCVoltError3D *rodOFCSin=0; //common OFC shift -sinus
77 AliTPCFCVoltError3D *rodIFCCos=0; //common IFC shift -cos
78 AliTPCFCVoltError3D *rodOFCCos=0; //common OFC shift -cos
79 AliTPCBoundaryVoltError *boundaryVoltErrorA[8]; // boundary voltage error A side
80 AliTPCBoundaryVoltError *boundaryVoltErrorC[8]; // boundary voltage error C side
81 AliTPCExBBShape *exbShape = 0;
82 AliTPCExBTwist *twistX = 0;
83 AliTPCExBTwist *twistY = 0;
85 AliTPCCalibGlobalMisalignment *alignRot0=0;
86 AliTPCCalibGlobalMisalignment *alignRot1=0;
87 AliTPCCalibGlobalMisalignment *alignRot2=0;
88 AliTPCCalibGlobalMisalignment *alignTrans0=0;
89 AliTPCCalibGlobalMisalignment *alignTrans1=0;
90 AliTPCCalibGlobalMisalignment *alignTrans2=0;
95 void RegisterAliTPCFCVoltError3D();
96 void RegisterAliTPCCalibGlobalMisalignment();
97 void RegisterAliTPCBoundaryVoltError();
98 void RegisterAliTPCExBShape();
99 void RegisterAliTPCExBTwist();
101 void RegisterCorrection(){
105 // check the presence of corrections in file
107 fCorrections = new TFile("TPCCorrectionPrimitives.root");
108 AliTPCComposedCorrection *corrField3D = (AliTPCComposedCorrection*) fCorrections->Get("TPCFCVoltError3D");
109 // if not make new file
110 if (!corrField3D) fCorrections = new TFile("TPCCorrectionPrimitives.root","update");
113 RegisterAliTPCCalibGlobalMisalignment();
114 RegisterAliTPCBoundaryVoltError();
115 RegisterAliTPCFCVoltError3D();
116 RegisterAliTPCExBShape();
117 RegisterAliTPCExBTwist();
118 if (fCorrections) fCorrections->Close();
124 void RegisterAliTPCFCVoltError3D(){
126 // Load the models from the file
128 // Register functions with following IDs:
129 // IMPORTANT: The nominal shift is in mm
144 printf("RegisterAliTPCFCVoltError3D()");
145 Int_t volt = 40; // 40 V ~ 1mm
146 AliTPCComposedCorrection *corrField3D = (AliTPCComposedCorrection*) fCorrections->Get("TPCFCVoltError3D");
147 if (corrField3D) { // load form file
148 corrField3D->Print();
149 TCollection *iter = corrField3D->GetCorrections();
150 rotOFC = (AliTPCFCVoltError3D*)iter->FindObject("rotOFC");
151 rodOFC1 = (AliTPCFCVoltError3D*)iter->FindObject("rodOFC1");
152 rodOFC2 = (AliTPCFCVoltError3D*)iter->FindObject("rodOFC2");
153 rotIFC = (AliTPCFCVoltError3D*)iter->FindObject("rotIFC");
154 rodIFC1 = (AliTPCFCVoltError3D*)iter->FindObject("rodIFC1");
155 rodIFC2 = (AliTPCFCVoltError3D*)iter->FindObject("rodIFC2");
157 rodIFCShift = (AliTPCFCVoltError3D*)iter->FindObject("rodIFCShift");
158 rodOFCShift = (AliTPCFCVoltError3D*)iter->FindObject("rodOFCShift");
159 rodIFCSin = (AliTPCFCVoltError3D*)iter->FindObject("rodIFCSin");
160 rodOFCSin = (AliTPCFCVoltError3D*)iter->FindObject("rodOFCSin");
161 rodIFCCos = (AliTPCFCVoltError3D*)iter->FindObject("rodIFCCos");
162 rodOFCCos = (AliTPCFCVoltError3D*)iter->FindObject("rodOFCCos");
165 rotOFC = new AliTPCFCVoltError3D();
166 rotOFC->SetOmegaTauT1T2(0,1,1);
167 rotOFC->SetRotatedClipVoltA(1,volt);
168 rotOFC->SetRotatedClipVoltC(1,volt);
170 rodOFC1 = new AliTPCFCVoltError3D();
171 rodOFC1->SetOmegaTauT1T2(0,1,1);
172 rodOFC1->SetRodVoltShiftA(18,volt);
173 rodOFC1->SetRodVoltShiftC(18,volt);
175 rodOFC2 = new AliTPCFCVoltError3D();
176 rodOFC2->SetOmegaTauT1T2(0,1,1);
177 rodOFC2->SetCopperRodShiftA(18,volt);
178 rodOFC2->SetCopperRodShiftC(18,volt);
180 rotIFC = new AliTPCFCVoltError3D();
181 rotIFC->SetOmegaTauT1T2(0,1,1);
182 rotIFC->SetRotatedClipVoltA(0,volt);
183 rotIFC->SetRotatedClipVoltC(0,volt);
185 rodIFC1 = new AliTPCFCVoltError3D();
186 rodIFC1->SetOmegaTauT1T2(0,1,1);
187 rodIFC1->SetRodVoltShiftA(0,volt);
188 rodIFC1->SetRodVoltShiftC(0,volt);
190 rodIFC2 = new AliTPCFCVoltError3D();
191 rodIFC2->SetOmegaTauT1T2(0,1,1);
192 rodIFC2->SetCopperRodShiftA(0,volt);
193 rodIFC2->SetCopperRodShiftC(0,volt);
195 rodIFCShift = new AliTPCFCVoltError3D();
196 rodIFCSin = new AliTPCFCVoltError3D();
197 rodIFCCos = new AliTPCFCVoltError3D();
198 rodOFCShift = new AliTPCFCVoltError3D();
199 rodOFCSin = new AliTPCFCVoltError3D();
200 rodOFCCos = new AliTPCFCVoltError3D();
201 for (Int_t isec=0; isec<18; isec++){
202 Double_t phi=TMath::Pi()*isec/9.;
203 rodIFCShift->SetOmegaTauT1T2(0,1,1);
204 rodIFCShift->SetRodVoltShiftA(isec,volt);
205 rodIFCShift->SetRodVoltShiftC(isec,volt);
206 rodIFCSin->SetOmegaTauT1T2(0,1,1);
207 rodIFCSin->SetRodVoltShiftA(isec,volt*TMath::Sin(phi));
208 rodIFCSin->SetRodVoltShiftC(isec,volt*TMath::Sin(phi));
209 rodIFCCos->SetOmegaTauT1T2(0,1,1);
210 rodIFCCos->SetRodVoltShiftA(isec,volt*TMath::Cos(phi));
211 rodIFCCos->SetRodVoltShiftC(isec,volt*TMath::Cos(phi));
213 rodOFCShift->SetOmegaTauT1T2(0,1,1);
214 rodOFCShift->SetRodVoltShiftA(18+isec,volt);
215 rodOFCShift->SetRodVoltShiftC(18+isec,volt);
216 rodOFCSin->SetOmegaTauT1T2(0,1,1);
217 rodOFCSin->SetRodVoltShiftA(18+isec,volt*TMath::Sin(phi));
218 rodOFCSin->SetRodVoltShiftC(18+isec,volt*TMath::Sin(phi));
219 rodOFCCos->SetOmegaTauT1T2(0,1,1);
220 rodOFCCos->SetRodVoltShiftA(18+isec,volt*TMath::Cos(phi));
221 rodOFCCos->SetRodVoltShiftC(18+isec,volt*TMath::Cos(phi));
225 // Initialization of the lookup tables
227 printf(" ------- OFC rotated clip:\n"); rotOFC->InitFCVoltError3D();
228 printf(" ------- OFC rod & strip:\n"); rodOFC1->InitFCVoltError3D();
229 printf(" ------- OFC copper rod:\n"); rodOFC2->InitFCVoltError3D();
230 printf(" ------- IFC rotated clip:\n"); rotIFC->InitFCVoltError3D();
231 printf(" ------- IFC rod & strip:\n"); rodIFC1->InitFCVoltError3D();
232 printf(" ------- IFC copper rod:\n"); rodIFC2->InitFCVoltError3D();
234 printf(" ------- IFC rod & strip shift:\n"); rodIFCShift->InitFCVoltError3D();
235 printf(" ------- IFC rod & strip sin:\n"); rodIFCSin->InitFCVoltError3D();
236 printf(" ------- IFC rod & strip cos:\n"); rodIFCCos->InitFCVoltError3D();
237 printf(" ------- OFC rod & strip shift:\n"); rodOFCShift->InitFCVoltError3D();
238 printf(" ------- OFC rod & strip sin:\n"); rodOFCSin->InitFCVoltError3D();
239 printf(" ------- OFC rod & strip cos:\n"); rodOFCCos->InitFCVoltError3D();
242 rotOFC->SetName("rotOFC");rotOFC->SetTitle("rotOFC");
243 rodOFC1->SetName("rodOFC1");rodOFC1->SetTitle("rodOFC1");
244 rodOFC2->SetName("rodOFC2");rodOFC2->SetTitle("rodOFC2");
245 rotIFC->SetName("rotIFC");rotIFC->SetTitle("rotIFC");
246 rodIFC1->SetName("rodIFC1");rodIFC1->SetTitle("rodIFC1");
247 rodIFC2->SetName("rodIFC2");rodIFC2->SetTitle("rodIFC2");
249 rodIFCShift->SetName("rodIFCShift");rodIFCShift->SetTitle("rodIFCShift");
250 rodIFCSin->SetName("rodIFCSin");rodIFCSin->SetTitle("rodIFCSin");
251 rodIFCCos->SetName("rodIFCCos");rodIFCCos->SetTitle("rodIFCCos");
253 rodOFCShift->SetName("rodOFCShift");rodOFCShift->SetTitle("rodOFCShift");
254 rodOFCSin->SetName("rodOFCSin");rodOFCSin->SetTitle("rodOFCSin");
255 rodOFCCos->SetName("rodOFCCos");rodOFCCos->SetTitle("rodOFCCos");
258 corrField3D = new AliTPCComposedCorrection();
259 TObjArray *cs = new TObjArray();
260 cs->Add(rotIFC); cs->Add(rotOFC);
261 cs->Add(rodIFC1); cs->Add(rodOFC1);
262 cs->Add(rodIFC2); cs->Add(rodOFC2);
263 cs->Add(rodIFCShift); cs->Add(rodIFCSin); cs->Add(rodIFCCos);
264 cs->Add(rodOFCShift); cs->Add(rodOFCSin); cs->Add(rodOFCCos);
266 corrField3D->SetCorrections(cs);
267 corrField3D->SetOmegaTauT1T2(0,1.,1.);
268 corrField3D->Print();
270 corrField3D->Write("TPCFCVoltError3D");
273 AliTPCCorrection::AddVisualCorrection(rotOFC,0);
274 AliTPCCorrection::AddVisualCorrection(rodOFC1,1);
275 AliTPCCorrection::AddVisualCorrection(rodOFC2,2);
276 AliTPCCorrection::AddVisualCorrection(rotIFC,3);
277 AliTPCCorrection::AddVisualCorrection(rodIFC1,4);
278 AliTPCCorrection::AddVisualCorrection(rodIFC2,5);
279 // common corrections
281 AliTPCCorrection::AddVisualCorrection(rodIFCShift,6);
282 AliTPCCorrection::AddVisualCorrection(rodIFCSin,7);
283 AliTPCCorrection::AddVisualCorrection(rodIFCCos,8);
285 AliTPCCorrection::AddVisualCorrection(rodIFCShift,9);
286 AliTPCCorrection::AddVisualCorrection(rodIFCSin,10);
287 AliTPCCorrection::AddVisualCorrection(rodIFCCos,11);
291 void RegisterAliTPCCalibGlobalMisalignment(){
293 // Register primitive alignment components.
294 // Linear conbination of primitev forulas used for fit
295 // The nominal delta 1 mm in shift and 1 mrad in rotation
296 // Primitive formulas registeren in AliTPCCoreection::AddvisualCorrection
304 printf("RegisterAliTPCCalibGlobalMisalignment()\n");
310 TGeoRotation rot2; //transformation matrices
311 TGeoRotation rot90; //transformation matrices
312 matrixX.SetDx(0.1); matrixY.SetDy(0.1); matrixZ.SetDz(0.1); //1 mm translation
313 rot0.SetAngles(0.001*TMath::RadToDeg(),0,0);
314 rot1.SetAngles(0,0.001*TMath::RadToDeg(),0);
315 rot2.SetAngles(0,0,0.001*TMath::RadToDeg());
317 rot90.SetAngles(0,90,0);
318 rot2.MultiplyBy(&rot90,kTRUE);
319 rot90.SetAngles(0,-90,0);
320 rot2.MultiplyBy(&rot90,kFALSE);
321 alignRot0 =new AliTPCCalibGlobalMisalignment;
322 alignRot0->SetAlignGlobal(&rot0);
323 alignRot0->SetName("alignRot0");
324 alignRot1=new AliTPCCalibGlobalMisalignment;
325 alignRot1->SetAlignGlobal(&rot1);
326 alignRot1->SetName("alignRot1");
327 alignRot2=new AliTPCCalibGlobalMisalignment;
328 alignRot2->SetAlignGlobal(&rot2);
329 alignRot2->SetName("alignRot2");
331 alignTrans0 =new AliTPCCalibGlobalMisalignment;
332 alignTrans0->SetAlignGlobal(&matrixX);
333 alignTrans0->SetName("alignTrans0");
334 alignTrans1=new AliTPCCalibGlobalMisalignment;
335 alignTrans1->SetAlignGlobal(&matrixY);
336 alignTrans1->SetName("alignTrans1");
337 alignTrans2=new AliTPCCalibGlobalMisalignment;
338 alignTrans2->SetAlignGlobal(&matrixZ);
339 alignTrans2->SetName("alignTrans2");
341 AliTPCCorrection::AddVisualCorrection(alignTrans0 ,200);
342 AliTPCCorrection::AddVisualCorrection(alignTrans1 ,201);
343 AliTPCCorrection::AddVisualCorrection(alignTrans2 ,202);
344 AliTPCCorrection::AddVisualCorrection(alignRot0 ,203);
345 AliTPCCorrection::AddVisualCorrection(alignRot1 ,204);
346 AliTPCCorrection::AddVisualCorrection(alignRot2 ,205);
348 TObjArray arrAlign(6);
349 arrAlign.AddAt(alignTrans0->Clone(),0);
350 arrAlign.AddAt(alignTrans1->Clone(),1);
351 arrAlign.AddAt(alignTrans2->Clone(),2);
352 arrAlign.AddAt(alignRot0->Clone(),3);
353 arrAlign.AddAt(alignRot1->Clone(),4);
354 arrAlign.AddAt(alignRot2->Clone(),5);
355 //combAlign.SetCorrections((TObjArray*)arrAlign.Clone());
359 void RegisterAliTPCBoundaryVoltError(){
361 // Register phi symetric E filed distortions
364 printf("RegisterAliTPCBoundaryVoltError()\n");
365 AliTPCComposedCorrection *corrField2D = (AliTPCComposedCorrection*) fCorrections->Get("TPCFCVoltError2D");
368 TObjArray *array=new TObjArray(16);
369 Double_t val = 40.; // 1mm
370 Float_t bound0[8] = { 0, 0,0,0,0,0,0,0};
371 Float_t boundAi[8] = { 0, 0,0,0,0,0,0,0};
372 Float_t boundCi[8] = { 0, 0,0,0,0,0,0,0};
373 for (Int_t ipar=0; ipar<8; ipar++){
375 boundaryVoltErrorA[ipar] = new AliTPCBoundaryVoltError;
376 boundaryVoltErrorC[ipar] = new AliTPCBoundaryVoltError;
377 boundaryVoltErrorA[ipar]->SetName(Form("BoundaryVoltErrorAsidePar%d",ipar));
378 boundaryVoltErrorA[ipar]->SetTitle(Form("BoundaryVoltErrorAsidePar%d",ipar));
379 boundaryVoltErrorC[ipar]->SetName(Form("BoundaryVoltErrorCsidePar%d",ipar));
380 boundaryVoltErrorC[ipar]->SetTitle(Form("BoundaryVoltErrorCsidePar%d",ipar));
381 for (Int_t jpar=0; jpar<8; jpar++) if (ipar!=jpar){
388 boundaryVoltErrorA[ipar]->SetBoundariesA(boundAi);
389 boundaryVoltErrorA[ipar]->SetBoundariesC(bound0);
390 boundaryVoltErrorA[ipar]->InitBoundaryVoltErrorDistortion();
391 boundaryVoltErrorA[ipar]->SetOmegaTauT1T2(0.,1,1);
393 Float_t tempboundAi[8] = { 0, 0,0,0,0,0,-boundCi[6],-boundCi[7]};
394 boundaryVoltErrorC[ipar]->SetBoundariesA(tempboundAi);
395 boundaryVoltErrorC[ipar]->SetBoundariesC(boundCi);
397 boundaryVoltErrorC[ipar]->InitBoundaryVoltErrorDistortion();
398 boundaryVoltErrorC[ipar]->SetOmegaTauT1T2(0.,1,1);
399 array->AddAt(boundaryVoltErrorA[ipar],ipar);
400 array->AddAt(boundaryVoltErrorC[ipar],ipar+8);
401 boundaryVoltErrorA[ipar]->Print();
402 boundaryVoltErrorC[ipar]->Print();
403 AliTPCCorrection::AddVisualCorrection(boundaryVoltErrorA[ipar], 100+ipar);
404 AliTPCCorrection::AddVisualCorrection(boundaryVoltErrorC[ipar], 150+ipar);
406 corrField2D = new AliTPCComposedCorrection;
407 corrField2D->SetCorrections(array);
408 corrField2D->SetOmegaTauT1T2(0,1.,1.);
409 corrField2D->Print();
411 corrField2D->SetName("TPCFCVoltError2D");
412 corrField2D->SetTitle("TPCFCVoltError2D");
413 corrField2D->Write("TPCFCVoltError2D");
415 TObjArray *array = (TObjArray*)corrField2D->GetCorrections();
416 for (Int_t ipar=0; ipar<8; ipar++){
417 boundaryVoltErrorA[ipar] = (AliTPCBoundaryVoltError*) array->At(ipar);
418 boundaryVoltErrorC[ipar] = (AliTPCBoundaryVoltError*) array->At(ipar+8);
419 if (boundaryVoltErrorA[ipar]) AliTPCCorrection::AddVisualCorrection(boundaryVoltErrorA[ipar], 40+ipar);
420 if (boundaryVoltErrorC[ipar]) AliTPCCorrection::AddVisualCorrection(boundaryVoltErrorC[ipar], 50+ipar);
427 void RegisterAliTPCExBShape(){
431 AliMagF *magF = new AliMagF("mag","mag");
433 exbShape = new AliTPCExBBShape;
434 exbShape->SetBField(magF);
435 exbShape->SetName("TPCExBShape");
436 exbShape->SetTitle("TPCExBShape");
437 exbShape->SetOmegaTauT1T2(0,1.,1.);
439 AliTPCCorrection::AddVisualCorrection(exbShape,500);
443 void RegisterAliTPCExBTwist(){
447 twistX = new AliTPCExBTwist;
448 twistY = new AliTPCExBTwist;
449 twistX->SetXTwist(0.001); // 1 mrad twist in x
450 twistX->SetName("ExBTwistX");
451 twistX->SetTitle("ExBTwistX");
452 twistY->SetYTwist(0.001); // 1 mrad twist in y
453 twistY->SetName("ExBTwistY");
454 twistY->SetTitle("ExBTwistY");
455 twistX->SetOmegaTauT1T2(0,1.,1.);
456 twistY->SetOmegaTauT1T2(0,1.,1.);
457 AliTPCCorrection::AddVisualCorrection(twistX,600);
458 AliTPCCorrection::AddVisualCorrection(twistY,601);
462 AliTPCComposedCorrection * MakeComposedCorrectionExB(){
464 // make composed corection for ExB scanning
466 RegisterCorrection();
468 Double_t bzField=AliTrackerBase::GetBz();
469 // AliMagF* magF= (AliMagF*)(TGeoGlobalMagField::Instance()->GetField());
470 Double_t vdrift = 2.6; // [cm/us] // to be updated: per second (ideally)
471 Double_t ezField = 400; // [V/cm] // to be updated: never (hopefully)
472 Double_t wt = -10.0 * (bzField*10) * vdrift / ezField ;
476 TObjArray * corr = new TObjArray;
477 corr->AddLast(twistX);
478 corr->AddLast(twistY);
479 for (Int_t i=0; i<8; i++){
480 corr->AddLast(boundaryVoltErrorA[i]);
481 corr->AddLast(boundaryVoltErrorC[i]);
483 corr->AddLast(alignTrans0);
484 corr->AddLast(alignTrans1);
485 corr->AddLast(alignTrans2);
486 corr->AddLast(alignRot0);
487 corr->AddLast(alignRot1);
488 corr->AddLast(alignRot2);
490 AliTPCComposedCorrection *cc= new AliTPCComposedCorrection ;
491 cc->SetCorrections((TObjArray*)(corr));
492 cc->SetOmegaTauT1T2(wt,T1,T2);
494 cc->Print("DA"); // Print used correction classes
495 cc->SetName("ComposedExB");
496 TFile fexb("RegisterCorrectionExB.root","recreate");
497 cc->Write("ComposedExB");