]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TPC/AliTPCcalibDB.cxx
Adding new class AliTPCcalibTime
[u/mrichter/AliRoot.git] / TPC / AliTPCcalibDB.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16
17 ///////////////////////////////////////////////////////////////////////////////
18 //                                                                           //
19 // Class providing the calibration parameters by accessing the CDB           //
20 //                                                                           //
21 // Request an instance with AliTPCcalibDB::Instance()                        //
22 // If a new event is processed set the event number with SetRun              //
23 // Then request the calibration data                                         ////
24 //
25 //
26 // Calibration data:
27 // 0.)  Altro mapping
28 //          Simulation      - not yet 
29 //          Reconstruction  - AliTPCclustererMI::Digits2Clusters(AliRawReader* rawReader)
30 //
31 // 1.)  pad by pad calibration -  AliTPCCalPad
32 //      
33 //      a.) fPadGainFactor
34 //          Simulation: AliTPCDigitizer::ExecFast - Multiply by gain
35 //          Reconstruction : AliTPCclustererMI::Digits2Clusters - Divide by gain  
36 //
37 //      b.) fPadNoise -
38 //          Simulation:        AliTPCDigitizer::ExecFast
39 //          Reconstruction:    AliTPCclustererMI::FindClusters(AliTPCCalROC * noiseROC)
40 //                             Noise depending cut on clusters charge (n sigma)
41 //      c.) fPedestal:
42 //          Simulation:     Not used yet - To be impleneted - Rounding to the nearest integer
43 //          Reconstruction: Used in AliTPCclustererMI::Digits2Clusters(AliRawReader* rawReader) 
44 //                          if data taken without zero suppression  
45 //                          Currently switch in  fRecoParam->GetCalcPedestal();
46 //      
47 //      d.) fPadTime0
48 //          Simulation:      applied in the AliTPC::MakeSector - adding offset
49 //          Reconstruction:  AliTPCTransform::Transform() - remove offset
50 //                           AliTPCTransform::Transform() - to be called
51 //                           in AliTPCtracker::Transform()      
52 //
53 // 
54 // 2.)  Space points transformation:
55 //
56 //      a.) General coordinate tranformation - AliTPCtransform (see $ALICE_ROOT/TPC/AliTPCtransform.cxx)
57 //          Created on fly - use the other calibration components
58 //                 Unisochronity  - (substract time0 - pad by pad)
59 //                 Drift velocity - Currently common drift velocity - functionality of AliTPCParam
60 //                 ExB effect    
61 //          Simulation     - Not used directly (the effects are applied one by one (see AliTPC::MakeSector)
62 //          Reconstruction - 
63 //                           AliTPCclustererMI::AddCluster
64 //                           AliTPCtrackerMI::Transform
65 //      b.) ExB effect calibration - 
66 //             classes (base class AliTPCExB, implementation- AliTPCExBExact.h  AliTPCExBFirst.h)
67 //             a.a) Simulation:   applied in the AliTPC::MakeSector - 
68 //                                calib->GetExB()->CorrectInverse(dxyz0,dxyz1);
69 //             a.b) Reconstruction -  
70 //                  
71 //                  in AliTPCtransform::Correct() - called calib->GetExB()->Correct(dxyz0,dxyz1)
72 //
73 //  3.)   cluster error, shape and Q parameterization
74 //
75 //
76 //
77 ///////////////////////////////////////////////////////////////////////////////
78
79 #include <iostream>
80 #include <fstream>
81
82
83 #include <AliCDBManager.h>
84 #include <AliCDBEntry.h>
85 #include <AliLog.h>
86 #include <AliMagF.h>
87 #include <AliMagWrapCheb.h>
88
89 #include "AliTPCcalibDB.h"
90 #include "AliTPCAltroMapping.h"
91 #include "AliTPCExB.h"
92
93 #include "AliTPCCalROC.h"
94 #include "AliTPCCalPad.h"
95 #include "AliTPCSensorTempArray.h"
96 #include "AliTPCTransform.h"
97
98 class AliCDBStorage;
99 class AliTPCCalDet;
100 //
101 //
102
103 #include "TFile.h"
104 #include "TKey.h"
105
106 #include "TObjArray.h"
107 #include "TObjString.h"
108 #include "TString.h"
109 #include "AliTPCCalPad.h"
110 #include "AliTPCCalibPulser.h"
111 #include "AliTPCCalibPedestal.h"
112 #include "AliTPCCalibCE.h"
113 #include "AliTPCExBFirst.h"
114
115
116
117
118
119 ClassImp(AliTPCcalibDB)
120
121 AliTPCcalibDB* AliTPCcalibDB::fgInstance = 0;
122 Bool_t AliTPCcalibDB::fgTerminated = kFALSE;
123 TObjArray    AliTPCcalibDB::fgExBArray;    // array of ExB corrections
124
125
126 //_ singleton implementation __________________________________________________
127 AliTPCcalibDB* AliTPCcalibDB::Instance()
128 {
129   //
130   // Singleton implementation
131   // Returns an instance of this class, it is created if neccessary
132   //
133   
134   if (fgTerminated != kFALSE)
135     return 0;
136
137   if (fgInstance == 0)
138     fgInstance = new AliTPCcalibDB();
139   
140   return fgInstance;
141 }
142
143 void AliTPCcalibDB::Terminate()
144 {
145   //
146   // Singleton implementation
147   // Deletes the instance of this class and sets the terminated flag, instances cannot be requested anymore
148   // This function can be called several times.
149   //
150   
151   fgTerminated = kTRUE;
152   
153   if (fgInstance != 0)
154   {
155     delete fgInstance;
156     fgInstance = 0;
157   }
158 }
159
160 //_____________________________________________________________________________
161 AliTPCcalibDB::AliTPCcalibDB():
162   TObject(),
163   fRun(-1),
164   fTransform(0),
165   fExB(0),
166   fPadGainFactor(0),
167   fDedxGainFactor(0),
168   fPadTime0(0),
169   fPadNoise(0),
170   fPedestals(0),
171   fTemperature(0),
172   fMapping(0),
173   fParam(0),
174   fClusterParam(0)
175 {
176   //
177   // constructor
178   //  
179   //
180   Update();    // temporary
181 }
182
183 AliTPCcalibDB::AliTPCcalibDB(const AliTPCcalibDB& ):
184   TObject(),
185   fRun(-1),
186   fTransform(0),
187   fExB(0),
188   fPadGainFactor(0),
189   fDedxGainFactor(0),
190   fPadTime0(0),
191   fPadNoise(0),
192   fPedestals(0),
193   fTemperature(0),
194   fMapping(0),
195   fParam(0),
196   fClusterParam(0)
197
198 {
199   //
200   // Copy constructor invalid -- singleton implementation
201   //
202    Error("copy constructor","invalid -- singleton implementation");
203 }
204
205 AliTPCcalibDB& AliTPCcalibDB::operator= (const AliTPCcalibDB& )
206 {
207 //
208 // Singleton implementation - no assignment operator
209 //
210   Error("operator =", "assignment operator not implemented");
211   return *this;
212 }
213
214
215
216 //_____________________________________________________________________________
217 AliTPCcalibDB::~AliTPCcalibDB() 
218 {
219   //
220   // destructor
221   //
222   
223   // don't delete anything, CDB cache is active!
224   //if (fPadGainFactor) delete fPadGainFactor;
225   //if (fPadTime0) delete fPadTime0;
226   //if (fPadNoise) delete fPadNoise;
227 }
228
229
230 //_____________________________________________________________________________
231 AliCDBEntry* AliTPCcalibDB::GetCDBEntry(const char* cdbPath)
232 {
233   // 
234   // Retrieves an entry with path <cdbPath> from the CDB.
235   //
236   char chinfo[1000];
237     
238   AliCDBEntry* entry = AliCDBManager::Instance()->Get(cdbPath, fRun); 
239   if (!entry) 
240   { 
241     sprintf(chinfo,"AliTPCcalibDB: Failed to get entry:\t%s ", cdbPath);
242     AliError(chinfo); 
243     return 0; 
244   }
245   return entry;
246 }
247
248
249 //_____________________________________________________________________________
250 void AliTPCcalibDB::SetRun(Long64_t run)
251 {
252   //
253   // Sets current run number. Calibration data is read from the corresponding file. 
254   //  
255   if (fRun == run)
256     return;  
257   fRun = run;
258   Update();
259 }
260   
261
262
263 void AliTPCcalibDB::Update(){
264   //
265   AliCDBEntry * entry=0;
266   
267   Bool_t cdbCache = AliCDBManager::Instance()->GetCacheFlag(); // save cache status
268   AliCDBManager::Instance()->SetCacheFlag(kTRUE); // activate CDB cache
269   
270   //
271   entry          = GetCDBEntry("TPC/Calib/PadGainFactor");
272   if (entry){
273     //if (fPadGainFactor) delete fPadGainFactor;
274     entry->SetOwner(kTRUE);
275     fPadGainFactor = (AliTPCCalPad*)entry->GetObject();
276   }
277   //
278   entry          = GetCDBEntry("TPC/Calib/GainFactorDedx");
279   if (entry){
280     entry->SetOwner(kTRUE);
281     fDedxGainFactor = (AliTPCCalPad*)entry->GetObject();
282   }
283   //
284   entry          = GetCDBEntry("TPC/Calib/PadTime0");
285   if (entry){
286     //if (fPadTime0) delete fPadTime0;
287     entry->SetOwner(kTRUE);
288     fPadTime0 = (AliTPCCalPad*)entry->GetObject();
289   }
290   //
291   //
292   entry          = GetCDBEntry("TPC/Calib/PadNoise");
293   if (entry){
294     //if (fPadNoise) delete fPadNoise;
295     entry->SetOwner(kTRUE);
296     fPadNoise = (AliTPCCalPad*)entry->GetObject();
297   }
298
299   entry          = GetCDBEntry("TPC/Calib/Pedestals");
300   if (entry){
301     //if (fPedestals) delete fPedestals;
302     entry->SetOwner(kTRUE);
303     fPedestals = (AliTPCCalPad*)entry->GetObject();
304   }
305
306   entry          = GetCDBEntry("TPC/Calib/Temperature");
307   if (entry){
308     //if (fTemperature) delete fTemperature;
309     entry->SetOwner(kTRUE);
310     fTemperature = (AliTPCSensorTempArray*)entry->GetObject();
311   }
312
313   entry          = GetCDBEntry("TPC/Calib/Parameters");
314   if (entry){
315     //if (fPadNoise) delete fPadNoise;
316     entry->SetOwner(kTRUE);
317     fParam = (AliTPCParam*)(entry->GetObject()->Clone());
318   }
319
320   entry          = GetCDBEntry("TPC/Calib/ClusterParam");
321   if (entry){
322     //if (fPadNoise) delete fPadNoise;
323     entry->SetOwner(kTRUE);
324     fClusterParam = (AliTPCClusterParam*)(entry->GetObject()->Clone());
325   }
326
327   entry          = GetCDBEntry("TPC/Calib/Mapping");
328   if (entry){
329     //if (fPadNoise) delete fPadNoise;
330     entry->SetOwner(kTRUE);
331     TObjArray * array = dynamic_cast<TObjArray*>(entry->GetObject());
332     if (array && array->GetEntriesFast()==6){
333       fMapping = new AliTPCAltroMapping*[6];
334       for (Int_t i=0; i<6; i++){
335         fMapping[i] =  dynamic_cast<AliTPCAltroMapping*>(array->At(i));
336       }
337     }
338   }
339
340
341
342   //entry          = GetCDBEntry("TPC/Calib/ExB");
343   //if (entry) {
344   //  entry->SetOwner(kTRUE);
345   //  fExB=dynamic_cast<AliTPCExB*>(entry->GetObject()->Clone());
346   //}
347   //
348   // ExB  - calculate during initialization 
349   //      - 
350   fExB =  GetExB(-5,kTRUE);
351      //
352   if (!fTransform) {
353     fTransform=new AliTPCTransform(); 
354   }
355
356   //
357   AliCDBManager::Instance()->SetCacheFlag(cdbCache); // reset original CDB cache
358   
359 }
360
361
362
363 void AliTPCcalibDB::CreateObjectList(const Char_t *filename, TObjArray *calibObjects)
364 {
365 //
366 // Create calibration objects and read contents from OCDB
367 //
368    if ( calibObjects == 0x0 ) return;
369    ifstream in;
370    in.open(filename);
371    if ( !in.is_open() ){
372       fprintf(stderr,"Error: cannot open list file '%s'", filename);
373       return;
374    }
375    
376    AliTPCCalPad *calPad=0x0;
377    
378    TString sFile;
379    sFile.ReadFile(in);
380    in.close();
381    
382    TObjArray *arrFileLine = sFile.Tokenize("\n");
383    
384    TIter nextLine(arrFileLine);
385    
386    TObjString *sObjLine=0x0;
387    while ( (sObjLine = (TObjString*)nextLine()) ){
388       TString sLine(sObjLine->GetString());
389       
390       TObjArray *arrNextCol = sLine.Tokenize("\t");
391       
392       TObjString *sObjType     = (TObjString*)(arrNextCol->At(0));
393       TObjString *sObjFileName = (TObjString*)(arrNextCol->At(1));
394       
395       if ( !sObjType || ! sObjFileName ) continue;
396       TString sType(sObjType->GetString());
397       TString sFileName(sObjFileName->GetString());
398       printf("%s\t%s\n",sType.Data(),sFileName.Data());
399       
400       TFile *fIn = TFile::Open(sFileName);
401       if ( !fIn ){
402          fprintf(stderr,"File not found: '%s'", sFileName.Data());
403          continue;
404       }
405       
406       if ( sType == "CE" ){
407          AliTPCCalibCE *ce = (AliTPCCalibCE*)fIn->Get("AliTPCCalibCE");
408          
409          calPad = new AliTPCCalPad((TObjArray*)ce->GetCalPadT0());         
410          calPad->SetNameTitle("CETmean","CETmean");
411          calibObjects->Add(calPad);
412          
413          calPad = new AliTPCCalPad((TObjArray*)ce->GetCalPadQ());         
414          calPad->SetNameTitle("CEQmean","CEQmean");
415          calibObjects->Add(calPad);        
416          
417          calPad = new AliTPCCalPad((TObjArray*)ce->GetCalPadRMS());
418          calPad->SetNameTitle("CETrms","CETrms");
419          calibObjects->Add(calPad);         
420                   
421       } else if ( sType == "Pulser") {
422          AliTPCCalibPulser *sig = (AliTPCCalibPulser*)fIn->Get("AliTPCCalibPulser");
423          
424          calPad = new AliTPCCalPad((TObjArray*)sig->GetCalPadT0());         
425          calPad->SetNameTitle("PulserTmean","PulserTmean");
426          calibObjects->Add(calPad);
427          
428          calPad = new AliTPCCalPad((TObjArray*)sig->GetCalPadQ());         
429          calPad->SetNameTitle("PulserQmean","PulserQmean");
430          calibObjects->Add(calPad);        
431          
432          calPad = new AliTPCCalPad((TObjArray*)sig->GetCalPadRMS());
433          calPad->SetNameTitle("PulserTrms","PulserTrms");
434          calibObjects->Add(calPad);         
435       
436       } else if ( sType == "Pedestals") {
437          AliTPCCalibPedestal *ped = (AliTPCCalibPedestal*)fIn->Get("AliTPCCalibPedestal");
438          
439          calPad = new AliTPCCalPad((TObjArray*)ped->GetCalPadPedestal());         
440          calPad->SetNameTitle("Pedestals","Pedestals");
441          calibObjects->Add(calPad);
442          
443          calPad = new AliTPCCalPad((TObjArray*)ped->GetCalPadRMS());         
444          calPad->SetNameTitle("Noise","Noise");
445          calibObjects->Add(calPad);        
446      
447       } else {
448          fprintf(stderr,"Undefined Type: '%s'",sType.Data());
449          
450       }
451       delete fIn;
452    }
453 }
454
455
456
457 void AliTPCcalibDB::MakeTree(const char * fileName, TObjArray * array, const char * mapFileName, AliTPCCalPad* outlierPad, Float_t ltmFraction) {
458   //
459   // Write a tree with all available information
460   // if mapFileName is specified, the Map information are also written to the tree
461   // pads specified in outlierPad are not used for calculating statistics
462   //  - the same function as AliTPCCalPad::MakeTree - 
463   //
464    AliTPCROC* tpcROCinstance = AliTPCROC::Instance();
465
466    TObjArray* mapIROCs = 0;
467    TObjArray* mapOROCs = 0;
468    TVectorF *mapIROCArray = 0;
469    TVectorF *mapOROCArray = 0;
470    Int_t mapEntries = 0;
471    TString* mapNames = 0;
472    
473    if (mapFileName) {
474       TFile mapFile(mapFileName, "read");
475       
476       TList* listOfROCs = mapFile.GetListOfKeys();
477       mapEntries = listOfROCs->GetEntries()/2;
478       mapIROCs = new TObjArray(mapEntries*2);
479       mapOROCs = new TObjArray(mapEntries*2);
480       mapIROCArray = new TVectorF[mapEntries];
481       mapOROCArray = new TVectorF[mapEntries];
482       
483       mapNames = new TString[mapEntries];
484       for (Int_t ivalue = 0; ivalue < mapEntries; ivalue++) {
485         TString nameROC(((TKey*)(listOfROCs->At(ivalue*2)))->GetName());
486          nameROC.Remove(nameROC.Length()-4, 4);
487          mapIROCs->AddAt((AliTPCCalROC*)mapFile.Get((nameROC + "IROC").Data()), ivalue);
488          mapOROCs->AddAt((AliTPCCalROC*)mapFile.Get((nameROC + "OROC").Data()), ivalue);
489          mapNames[ivalue].Append(nameROC);
490       }
491       
492       for (Int_t ivalue = 0; ivalue < mapEntries; ivalue++) {
493          mapIROCArray[ivalue].ResizeTo(tpcROCinstance->GetNChannels(0));
494          mapOROCArray[ivalue].ResizeTo(tpcROCinstance->GetNChannels(36));
495       
496          for (UInt_t ichannel = 0; ichannel < tpcROCinstance->GetNChannels(0); ichannel++)
497             (mapIROCArray[ivalue])[ichannel] = ((AliTPCCalROC*)(mapIROCs->At(ivalue)))->GetValue(ichannel);
498          for (UInt_t ichannel = 0; ichannel < tpcROCinstance->GetNChannels(36); ichannel++)
499             (mapOROCArray[ivalue])[ichannel] = ((AliTPCCalROC*)(mapOROCs->At(ivalue)))->GetValue(ichannel);
500       }
501
502    } //  if (mapFileName)
503   
504    TTreeSRedirector cstream(fileName);
505    Int_t arrayEntries = array->GetEntries();
506    
507    TString* names = new TString[arrayEntries];
508    for (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++)
509       names[ivalue].Append(((AliTPCCalPad*)array->At(ivalue))->GetName());
510
511    for (UInt_t isector = 0; isector < tpcROCinstance->GetNSectors(); isector++) {
512       //
513       // get statistic for given sector
514       //
515       TVectorF median(arrayEntries);
516       TVectorF mean(arrayEntries);
517       TVectorF rms(arrayEntries);
518       TVectorF ltm(arrayEntries);
519       TVectorF ltmrms(arrayEntries);
520       TVectorF medianWithOut(arrayEntries);
521       TVectorF meanWithOut(arrayEntries);
522       TVectorF rmsWithOut(arrayEntries);
523       TVectorF ltmWithOut(arrayEntries);
524       TVectorF ltmrmsWithOut(arrayEntries);
525       
526       TVectorF *vectorArray = new TVectorF[arrayEntries];
527       for (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++)
528          vectorArray[ivalue].ResizeTo(tpcROCinstance->GetNChannels(isector));
529       
530       for (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++) {
531          AliTPCCalPad* calPad = (AliTPCCalPad*) array->At(ivalue);
532          AliTPCCalROC* calROC = calPad->GetCalROC(isector);
533          AliTPCCalROC* outlierROC = 0;
534          if (outlierPad) outlierROC = outlierPad->GetCalROC(isector);
535          if (calROC) {
536             median[ivalue] = calROC->GetMedian();
537             mean[ivalue] = calROC->GetMean();
538             rms[ivalue] = calROC->GetRMS();
539             Double_t ltmrmsValue = 0;
540             ltm[ivalue] = calROC->GetLTM(&ltmrmsValue, ltmFraction);
541             ltmrms[ivalue] = ltmrmsValue;
542             if (outlierROC) {
543                medianWithOut[ivalue] = calROC->GetMedian(outlierROC);
544                meanWithOut[ivalue] = calROC->GetMean(outlierROC);
545                rmsWithOut[ivalue] = calROC->GetRMS(outlierROC);
546                ltmrmsValue = 0;
547                ltmWithOut[ivalue] = calROC->GetLTM(&ltmrmsValue, ltmFraction, outlierROC);
548                ltmrmsWithOut[ivalue] = ltmrmsValue;
549             }
550          }
551          else {
552             median[ivalue] = 0.;
553             mean[ivalue] = 0.;
554             rms[ivalue] = 0.;
555             ltm[ivalue] = 0.;
556             ltmrms[ivalue] = 0.;
557             medianWithOut[ivalue] = 0.;
558             meanWithOut[ivalue] = 0.;
559             rmsWithOut[ivalue] = 0.;
560             ltmWithOut[ivalue] = 0.;
561             ltmrmsWithOut[ivalue] = 0.;
562          }
563       }
564       
565       //
566       // fill vectors of variable per pad
567       //
568       TVectorF *posArray = new TVectorF[8];
569       for (Int_t ivalue = 0; ivalue < 8; ivalue++)
570          posArray[ivalue].ResizeTo(tpcROCinstance->GetNChannels(isector));
571
572       Float_t posG[3] = {0};
573       Float_t posL[3] = {0};
574       Int_t ichannel = 0;
575       for (UInt_t irow = 0; irow < tpcROCinstance->GetNRows(isector); irow++) {
576          for (UInt_t ipad = 0; ipad < tpcROCinstance->GetNPads(isector, irow); ipad++) {
577             tpcROCinstance->GetPositionLocal(isector, irow, ipad, posL);
578             tpcROCinstance->GetPositionGlobal(isector, irow, ipad, posG);
579             posArray[0][ichannel] = irow;
580             posArray[1][ichannel] = ipad;
581             posArray[2][ichannel] = posL[0];
582             posArray[3][ichannel] = posL[1];
583             posArray[4][ichannel] = posG[0];
584             posArray[5][ichannel] = posG[1];
585             posArray[6][ichannel] = (Int_t)(ipad - (Double_t)(tpcROCinstance->GetNPads(isector, irow))/2);
586             posArray[7][ichannel] = ichannel;
587             
588             // loop over array containing AliTPCCalPads
589             for (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++) {
590                AliTPCCalPad* calPad = (AliTPCCalPad*) array->At(ivalue);
591                AliTPCCalROC* calROC = calPad->GetCalROC(isector);
592                if (calROC)
593                   (vectorArray[ivalue])[ichannel] = calROC->GetValue(irow, ipad);
594                else
595                   (vectorArray[ivalue])[ichannel] = 0;
596             }
597             ichannel++;
598          }
599       }
600       
601       cstream << "calPads" <<
602          "sector=" << isector;
603       
604       for  (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++) {
605          cstream << "calPads" <<
606             (Char_t*)((names[ivalue] + "_Median=").Data()) << median[ivalue] <<
607             (Char_t*)((names[ivalue] + "_Mean=").Data()) << mean[ivalue] <<
608             (Char_t*)((names[ivalue] + "_RMS=").Data()) << rms[ivalue] <<
609             (Char_t*)((names[ivalue] + "_LTM=").Data()) << ltm[ivalue] <<
610             (Char_t*)((names[ivalue] + "_RMS_LTM=").Data()) << ltmrms[ivalue];
611          if (outlierPad) {
612             cstream << "calPads" <<
613                (Char_t*)((names[ivalue] + "_Median_OutlierCutted=").Data()) << medianWithOut[ivalue] <<
614                (Char_t*)((names[ivalue] + "_Mean_OutlierCutted=").Data()) << meanWithOut[ivalue] <<
615                (Char_t*)((names[ivalue] + "_RMS_OutlierCutted=").Data()) << rmsWithOut[ivalue] <<
616                (Char_t*)((names[ivalue] + "_LTM_OutlierCutted=").Data()) << ltmWithOut[ivalue] <<
617                (Char_t*)((names[ivalue] + "_RMS_LTM_OutlierCutted=").Data()) << ltmrmsWithOut[ivalue];
618          }
619       }
620
621       for  (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++) {
622          cstream << "calPads" <<
623             (Char_t*)((names[ivalue] + ".=").Data()) << &vectorArray[ivalue];
624       }
625
626       if (mapFileName) {
627          for  (Int_t ivalue = 0; ivalue < mapEntries; ivalue++) {
628             if (isector < 36)
629                cstream << "calPads" <<
630                   (Char_t*)((mapNames[ivalue] + ".=").Data()) << &mapIROCArray[ivalue];
631             else
632                cstream << "calPads" <<
633                   (Char_t*)((mapNames[ivalue] + ".=").Data()) << &mapOROCArray[ivalue];
634          }
635       }
636
637       cstream << "calPads" <<
638          "row.=" << &posArray[0] <<
639          "pad.=" << &posArray[1] <<
640          "lx.=" << &posArray[2] <<
641          "ly.=" << &posArray[3] <<
642          "gx.=" << &posArray[4] <<
643          "gy.=" << &posArray[5] <<
644          "rpad.=" << &posArray[6] <<
645          "channel.=" << &posArray[7];
646          
647       cstream << "calPads" <<
648          "\n";
649
650       delete[] posArray;
651       delete[] vectorArray;
652    }
653    
654
655    delete[] names;
656    if (mapFileName) {
657       delete mapIROCs;
658       delete mapOROCs;
659       delete[] mapIROCArray;
660       delete[] mapOROCArray;
661       delete[] mapNames;
662    }
663 }
664
665
666
667 void AliTPCcalibDB::RegisterExB(Int_t index, Float_t bz, Bool_t bdelete){
668   //
669   // Register static ExB correction map
670   // index - registration index - used for visualization
671   // bz    - bz field in kGaus
672
673   Float_t factor =  bz/(-5.);  // default b filed in Cheb with minus sign
674   
675   AliMagF*   bmap = new AliMagWrapCheb("Maps","Maps", 2, factor, 10., AliMagWrapCheb::k5kG,kTRUE,"$(ALICE_ROOT)/data/maps/mfchebKGI_sym.root");
676   
677   AliTPCExBFirst *exb  = new  AliTPCExBFirst(bmap,0.88*2.6400e+04,50,50,50);
678   AliTPCExB::SetInstance(exb);
679   
680   if (bdelete){
681     delete bmap;
682   }else{
683     AliTPCExB::RegisterField(index,bmap);
684   }
685   if (index>=fgExBArray.GetEntries()) fgExBArray.Expand((index+1)*2+11);
686   fgExBArray.AddAt(exb,index);
687 }
688
689
690 AliTPCExB*    AliTPCcalibDB::GetExB(Float_t bz, Bool_t deleteB) {
691   //
692   // bz filed in KGaus not in tesla
693   // Get ExB correction map
694   // if doesn't exist - create it
695   //
696   Int_t index = TMath::Nint(5+bz);
697   if (index>fgExBArray.GetEntries()) fgExBArray.Expand((index+1)*2+11);
698   if (!fgExBArray.At(index)) AliTPCcalibDB::RegisterExB(index,bz,deleteB);
699   return (AliTPCExB*)fgExBArray.At(index);
700 }
701
702
703 void  AliTPCcalibDB::SetExBField(Float_t bz){
704   //
705   // Set magnetic filed for ExB correction
706   //
707   printf("Set magnetic field for ExB correction = %f\n",bz); 
708   fExB = GetExB(bz,kFALSE);
709 }