AliRoot Core  edcc906 (edcc906)
AnalyzeLaserCE.C
Go to the documentation of this file.
1 
76 
77 #include <fstream>
78 #include "TString.h"
79 #include "TSystem.h"
80 #include "TTree.h"
81 #include "TEntryList.h"
82 #include "TCut.h"
83 #include "TStatToolkit.h"
84 #include "AliTPCCalibViewer.h"
85 #include "AliTPCCalibViewerGUI.h"
87 #include "AliTPCCalibCE.h"
88 #include "AliTPCCalibPulser.h"
89 #include "TStopwatch.h"
90 //
91 //Define interesting variables - file names
92 //
93 char * inname = "treeCE.root"; // input file with tree
94 //
95 // variable name definition in input tree - change it according the input
96 //
97 TString qaside("CE_Q");
98 TString taside("CE_T");
99 TString raside("CE_RMS");
100 TString qcside("CE_Q");
101 TString tcside("CE_T");
102 TString rcside("CE_RMS");
103 
104 //
105 // correction variable - usually Pulser time
106 //
107 TString tcor("-pulCorr");
108 
109 //
110 char * fname = "treefitCE.root"; // output file with tree
111 char * oname = "fitCE.root"; // output file with CalPads fit
112 
113 //
114 //
115 // Input CalPads
116 //
117 AliTPCCalPad *calPadIn = 0; // original time pad
118 AliTPCCalPad *calPadF1 = 0; // original time pad - fit plane
119 AliTPCCalPad *calPadF2 = 0; // original time pad - fit parabola
120 AliTPCCalPad *calPadQIn = 0; // original Q pad
121 AliTPCCalPad *calPadQF1 = 0; // original Q pad
122 AliTPCCalPad *calPadQF2 = 0; // original Q pad
123 
124 AliTPCCalPad *calPadCor = 0; // base correction CalPad
125 AliTPCCalPad *calPadOut = 0; // outlyer CalPad
126 //
127 // cuts
128 //
129 const Float_t tThr=0.3; // max diff in the sector
130 const Float_t qThr0=0.5; // max Q diff in the sector
131 const Float_t qThr1=2; // max Q diff in the sector
132 
133 //
134 //
135 // fit Cal Pads
136 AliTPCCalPad *calPad0 = 0; // global fit 0 - base
137 AliTPCCalPad *calPad1 = 0; // global fit 1 - common behavior rotation -A-C
138 AliTPCCalPad *calPad2 = 0; // gloabl fit 2 - CE missalign rotation A-C
139 //
140 AliTPCCalPad *calPadInOut = 0; // misaalign in-out
141 AliTPCCalPad *calPadLX = 0; // local x missalign
142 AliTPCCalPad *calPadTL = 0; // tan
143 AliTPCCalPad *calPadQ = 0; // time (q) correction
144 AliTPCCalPad *calPadGXY = 0; // global XY missalign (drift velocity grad)
145 AliTPCCalPad *calPadOff = 0; // normalization offset fit
146 AliTPCCalPad *calPadRes = 0; // final calibration
147 
148 TObjString strFit0=""; // string fit 0
149 TObjString strFit1=""; // string fit 1
150 TObjString strFit2=""; // string fit 2
151 TVectorD vecFit0; // parameters fit 0
152 TVectorD vecFit1; // parameters fit 1
153 TVectorD vecFit2; // parameters fit 2
154 TEntryList *elist=0; // event list -slection criterias
155 //
156 // working variables
157 //
158 AliTPCCalibViewerGUI * viewer=0; //viewerGUI
160 TTree * tree=0; // working tree
161 
162 void LoadViewer();
163 void RebuildData(); // transform the input data to the fit format
164 void MakeFit(); // make fits
165 void MakeFitPulser(); // make fit for pulser correction data
166 //
167 // internal functions
168 //
169 void MakeAliases0(); // Make Aliases 0 - for user tree
170 void MakeAliases1(); // Make Aliases 1 - for default tree
171 void LoadData(); // Load data
172 void StoreData(); // store current data
173 void StoreTree(); // store fit data in the output tree
174 
175 
176 
179 
180  LoadViewer();
181  MakeAliases1();
182 }
183 
186  Int_t npoints;
187  Double_t chi2;
188  TVectorD vec0,vec1,vec2;
189  TMatrixD mat;
190  TString fitvar="P_T.fElements";
191  TCut out("abs(P_T.fElements/P_T_Mean.fElements-1.001)<.002");
192  TCut fitadd("P_T.fElements>446");
193  TString fstring="";
194  fstring+="(sector>=0&&sector<9)++";
195  fstring+="(sector>=9&&sector<18)++";
196  fstring+="(sector>=18&&sector<27)++";
197  fstring+="(sector>=27&&sector<36)++";
198  fstring+="(sector>=36&&sector<45)++";
199  fstring+="(sector>=45&&sector<54)++";
200  fstring+="(sector>=54&&sector<63)++";
201  fstring+="(sector>=63&&sector<72)";
202 
203  TString *pulOff =stat.FitPlane(tree,fitvar.Data(),fstring.Data(),(out+fitadd).GetTitle(),chi2,npoints,vec0,mat);
204 
205  tree->SetAlias("pul0",pulOff->Data());
206  tree->SetAlias("pulCorr","P_T.fElements-pul0");
207  tree->SetAlias("pulOut",out.GetTitle());
208 }
209 
210 void MakeFit(){
212 
213  LoadData();
214  //LoadViewer();
215  //
216  makePad = new AliTPCCalibViewer(fname);
217  tree = makePad->GetTree();
218  MakeAliases1();
219  //
220  // MakeFitPulser();
222  Int_t npoints;
223  Double_t chi2;
224  TMatrixD mat;
225  TString fstring="";
226  //
227  //Basic correction
228  //
229  fstring+="side++"; // offset on 2 different sides //1
230  //fstring+="(1/qp)++"; // Q -threshold effect correction //2
231  //fstring+="(qp)++"; // Q -threshold effect correction //3
232  fstring+="(inn)++"; // inner outer misalign - common //4
233  fstring+="(side*inn)++"; // - opposite //5
234  //
235  fstring+="(gyr)++"; // drift velocity gradient - common //6
236  fstring+="(side*gyr)++"; // - opposite //7
237  fstring+="(gxr)++"; // global x tilt - common //8
238  fstring+="(side*gxr)++"; // - opposite //9
239  //
240  fstring+="tl^2++"; // local phi correction //10
241  //
242  fstring+="(lxr)++"; // zr angle - common //11
243  fstring+="(side*lxr)++"; // - opposite //12
244  fstring+="(inn*lxr)++"; // inner outer angle - common //13
245  fstring+="(side*inn*lxr)++";// - opposite //14
246  fstring+="(lxr^2)++"; // zr second - common //15
247  fstring+="(side*lxr^2)++"; // - opposite //16
248  fstring+="(inn*lxr^2)++"; // zr second - common //15
249  fstring+="(inn*side*lxr^2)++"; // - opposite //16
250  //
251  printf("Fit0\t start\n");
252  TString *fit0 =stat.FitPlane(tree,"dt",fstring.Data(),"cutF&&cutCE",chi2,npoints,vecFit0,mat,0.9);
253  tree->SetAlias("f0",fit0->Data());
254  strFit0 = fit0->Data();
255  printf("Fit0\t end\n");
256  printf("Chi2/npoints\t=%f\n",TMath::Sqrt(chi2/npoints));
257  fit0->Tokenize("++")->Print();
258  //
259  printf("Global tendencies extraction\n");
260  //
261  // Extract variables
262  //
263  TString tmpstr = fstring;
264  TObjArray *arr = tmpstr.Tokenize("++");
265  TString fitQ("0"); // q correction
266  TString fitLX("0"); // lx correction
267  TString fitInOut("0"); // inner-outer - match
268  TString fitGXY("0"); // global xy fit
269  TString fitOff("0"); // side offsets
270  TString fitTL("0"); // side offsets
271  //
272  fitOff+="+";
273  fitOff+=vecFit0[0];
274  fitOff+="+side*";
275  fitOff+=vecFit0[1];
276  {
277  for(Int_t i=0;i<arr->GetEntriesFast();i++){
278  if (!arr->At(i)) continue;
279  TString *fitstr = new TString(arr->At(i)->GetName());
280  //
281  //Bool_t isQ = fitstr->Contains("qp)");
282  Bool_t isRot = fitstr->Contains("sin(")+fitstr->Contains("cos(");
283  Bool_t isLX = fitstr->Contains("lxr");
284  Bool_t isIn = fitstr->Contains("inn");
285  Bool_t isGXY = fitstr->Contains("gxr")+fitstr->Contains("gyr");
286  if (fitstr->Contains("tl^2")){
287  fitTL+="+";
288  fitTL+=(*fitstr)+"*";
289  fitTL+=vecFit0[i+1];
290  }
291  if (isGXY){
292  fitGXY+="+";
293  fitGXY+=(*fitstr)+"*";
294  fitGXY+=vecFit0[i+1];
295  }
296  //
297  if (isLX&&!isRot&&!isIn){
298  fitLX+="+";
299  fitLX+=(*fitstr)+"*";
300  fitLX+=vecFit0[i+1];
301  }
302  //
303  if (!isRot&&isIn){
304  fitInOut+="+";
305  fitInOut+=(*fitstr)+"*";
306  fitInOut+=vecFit0[i+1];
307  }
308  }
309  }
310  //
311  tree->SetAlias("fInOut",fitInOut.Data());
312  tree->SetAlias("fLX",fitLX.Data());
313  tree->SetAlias("fGXY",fitGXY.Data());
314  tree->SetAlias("fOff",fitOff.Data());
315  //tree->SetAlias("fQ",fitQ.Data());
316  tree->SetAlias("fTL",fitTL.Data());
317 
318  //
319  //
320  // Common "deformation" tendencies
321  //
322  fstring+="(sin(atan2(gy.fElements,gx.fElements)))++";
323  fstring+="(cos(atan2(gy.fElements,gx.fElements)))++";
324  //
325  fstring+="(sin(atan2(gy.fElements,gx.fElements)*2))++";
326  fstring+="(cos(atan2(gy.fElements,gx.fElements)*2))++";
327  fstring+="(sin(atan2(gy.fElements,gx.fElements)*3))++";
328  fstring+="(cos(atan2(gy.fElements,gx.fElements)*3))++";
329  //
330  fstring+="(sin(atan2(gy.fElements,gx.fElements)*2))*lxr++";
331  fstring+="(cos(atan2(gy.fElements,gx.fElements)*2))*lxr++";
332  fstring+="(sin(atan2(gy.fElements,gx.fElements)*3))*lxr++";
333  fstring+="(cos(atan2(gy.fElements,gx.fElements)*3))*lxr++";
334  //
335 
336  TString *fit1 =stat.FitPlane(tree,"dt",fstring.Data(),"cutF&&cutCE",chi2,npoints,vecFit1,mat,0.9);
337  tree->SetAlias("f1",fit1->Data());
338  strFit1 = fit1->Data();
339  printf("Fit1\t end\n");
340  printf("Chi2/npoints\t=%f\n",TMath::Sqrt(chi2/npoints));
341  fit1->Tokenize("++")->Print();
342 
343  //
344  // Central electrode "deformation"
345  //
346  fstring+="(side*sin(atan2(gy.fElements,gx.fElements)))++";
347  fstring+="(side*cos(atan2(gy.fElements,gx.fElements)))++";
348  //
349  fstring+="(side*sin(atan2(gy.fElements,gx.fElements)*2))++";
350  fstring+="(side*cos(atan2(gy.fElements,gx.fElements)*2))++";
351  fstring+="(side*sin(atan2(gy.fElements,gx.fElements)*3))++";
352  fstring+="(side*cos(atan2(gy.fElements,gx.fElements)*3))++";
353  //
354  fstring+="(side*sin(atan2(gy.fElements,gx.fElements)*2))*lxr++";
355  fstring+="(side*cos(atan2(gy.fElements,gx.fElements)*2))*lxr++";
356  fstring+="(side*sin(atan2(gy.fElements,gx.fElements)*3))*lxr++";
357  fstring+="(side*cos(atan2(gy.fElements,gx.fElements)*3))*lxr++";
358 
359  TString *fit2 =stat.FitPlane(tree,"dt",fstring.Data(),"cutF&&abs(dt-f0)<0.7&&cutCE",chi2,npoints,vecFit2,mat,0.9);
360  strFit2 = fit2->Data();
361  printf("Fit2\t end\n");
362  printf("Chi2/npoints\t=%f\n",TMath::Sqrt(chi2/npoints));
363  fit2->Tokenize("++")->Print();
364  tree->SetAlias("f2",fit2->Data());
365  //
366  //
367  //
368  calPad0 = makePad->GetCalPad("f0","1", "ffit0");
369  calPad1 = makePad->GetCalPad("f1","1", "ffit1");
370  calPad2 = makePad->GetCalPad("f2","1", "ffit2");
371  calPadInOut = makePad->GetCalPad("fInOut","1", "fInOut");
372  calPadLX = makePad->GetCalPad("fLX","1", "fLX");
373  calPadTL = makePad->GetCalPad("fTL","1", "fTL");
374  //calPadQ = makePad->GetCalPad("fQ","1", "fQ");
375  calPadGXY = makePad->GetCalPad("fGXY","1", "fGXY");
376  calPadOff = makePad->GetCalPad("fOff","1", "fOff");
377 }
378 
379 
380 
381 void LoadViewer(){
383 
385  viewer = (AliTPCCalibViewerGUI*)array->At(0);
386  makePad = viewer->GetViewer();
387  tree = viewer->GetViewer()->GetTree();
388  MakeAliases1();
389 }
390 
391 
392 
393 
394 
395 
396 void RebuildData(){
398 
399  TStopwatch timer;
400  makePad = new AliTPCCalibViewer(inname);
401  tree = makePad->GetTree();
402  //
403 
404  timer.Print();
405  timer.Continue();
406  printf("-1. MaQkeFitPulser\n");
407  MakeFitPulser();
408  timer.Print();
409  timer.Continue();
410  MakeAliases0(); //
411  //
412  printf("0. GetCalPads\n");
413  timer.Print();
414  calPadCor = makePad->GetCalPad("tcor","1", "tcor");
415  calPadOut = makePad->GetCalPad("1","!((cutA||cutC)&&abs(ly.fElements/lx.fElements)<0.16)", "out");
416  calPadIn = makePad->GetCalPad("dt","1","timeIn");
417 
418  calPadF1 = calPadIn->GlobalFit("timeF1", calPadOut,kFALSE,0,0,0.8); // use robust fit
419  calPadQIn = makePad->GetCalPad("qa*(sector%36<18)+qc*(sector%36>17)","1","qIn");
420  //
421  //
422  printf("1. Create outlyer map\n");
423  timer.Print();
424  timer.Continue();
425  //
426  // Update outlyer maps
427  //
428  for (Int_t isector=0;isector<72; isector++){
429  for (UInt_t ich=0;ich<calPadIn->GetCalROC(isector)->GetNchannels();ich++){
430  Float_t val0= calPadIn->GetCalROC(isector)->GetValue(ich);
431  Float_t val1= calPadF1->GetCalROC(isector)->GetValue(ich);
432  if (TMath::Abs(val0-val1)>tThr) calPadOut->GetCalROC(isector)->SetValue(ich,1);
433  }
434  }
435  printf("2. Fit sector parabolas\n");
436  timer.Print();
437  timer.Continue();
438  calPadF1 = calPadIn->GlobalFit("timeF1", calPadOut,kFALSE,0,0,0.9);
439  calPadF2 = calPadIn->GlobalFit("timeF2", calPadOut,kFALSE,1,0,0.9);
440  calPadQF1 = calPadQIn->GlobalFit("qF1", calPadOut,kFALSE,1);
441  calPadQF2 = calPadQIn->GlobalFit("qF2", calPadOut,kFALSE,1);
442 
443  //
444  // Update outlyer maps
445  //
446  printf("3. Update outlyer map\n");
447  for (Int_t isector=0;isector<72; isector++){
448  for (UInt_t ich=0;ich<calPadIn->GetCalROC(isector)->GetNchannels();ich++){
449  Float_t val0= calPadQIn->GetCalROC(isector)->GetValue(ich);
450  Float_t val1= calPadQF2->GetCalROC(isector)->GetValue(ich);
451  if (val1<=0) {
452  continue;
453  }
454  if (TMath::Abs(val0/val1)<qThr0) calPadOut->GetCalROC(isector)->SetValue(ich,1);
455  if (TMath::Abs(val0/val1)>qThr1) calPadOut->GetCalROC(isector)->SetValue(ich,1);
456  }
457  }
458  printf("4. Redo fit of the of parabola \n");
459  timer.Print();
460  timer.Continue();
461  //
462  //
463  AliTPCCalPad *calPadInCor = makePad->GetCalPad("dt","1","timeIn");
464  calPadF1 = calPadInCor->GlobalFit("timeF1", calPadOut,kFALSE,0,0.9);
465  calPadF2 = calPadInCor->GlobalFit("timeF2", calPadOut,kFALSE,1,0.9);
466  calPadQF1 = calPadQIn->GlobalFit("qF1", calPadOut,kFALSE,0,0,0.9);
467  calPadQF2 = calPadQIn->GlobalFit("qF2", calPadOut,kFALSE,1,0,0.9);
468  printf("5. End\n");
469  timer.Print();
470 
471 }
472 
473 void LoadData(){
475 
476  TFile f(oname);
477  calPadIn = (AliTPCCalPad*)f.Get("timeIn"); // original time pad
478  calPadF1 = (AliTPCCalPad*)f.Get("timeF1"); // original time pad - fit plane
479  calPadF2 = (AliTPCCalPad*)f.Get("timeF2"); // original time pad - fit parabola
480  //
481  calPadQIn = (AliTPCCalPad*)f.Get("qIn"); // original time pad
482  calPadQF1 = (AliTPCCalPad*)f.Get("qF1"); // original time pad - fit plane
483  calPadQF2 = (AliTPCCalPad*)f.Get("qF2"); // original time pad - fit parabola
484  //
485  calPadCor = (AliTPCCalPad*)f.Get("tcor"); // base correction CalPad
486  calPadOut = (AliTPCCalPad*)f.Get("out"); // outlyer CalPad
487  //
488  calPad0 = (AliTPCCalPad*)f.Get("ffit0"); // global fit 0 - base
489  calPad1 = (AliTPCCalPad*)f.Get("ffit1"); // global fit 1 - common behavior rotation -A-C
490  calPad2 = (AliTPCCalPad*)f.Get("ffit2"); // gloabl fit 2 - CE missalign rotation A-C
491  calPadInOut = (AliTPCCalPad*)f.Get("fInOut");// misaalign in-out
492  calPadLX = (AliTPCCalPad*)f.Get("fLX"); // local x missalign
493  calPadTL = (AliTPCCalPad*)f.Get("fTL"); // local y/x missalign
494  calPadQ = (AliTPCCalPad*)f.Get("fQ"); // time (q) correction
495  calPadGXY = (AliTPCCalPad*)f.Get("fGXY"); // global XY missalign (drift velocity grad)
496  calPadOff = (AliTPCCalPad*)f.Get("fOff"); // normalization offset fit
497  calPadRes = (AliTPCCalPad*)f.Get("Result"); //resulting calibration
498 }
499 
500 void StoreData(){
502 
503  TFile * fstore = new TFile(oname,"recreate");
504  if (calPadIn) calPadIn->Write("timeIn"); // original time pad
505  if (calPadF1) calPadF1->Write("timeF1"); // original time pad - fit plane
506  if (calPadF2) calPadF2->Write("timeF2"); // original time pad - fit parabola
507  //
508  if (calPadQIn) calPadQIn->Write("qIn"); // original time pad
509  if (calPadQF1) calPadQF1->Write("qF1"); // original time pad - fit plane
510  if (calPadQF2) calPadQF2->Write("qF2"); // original time pad - fit parabola
511  //
512  if (calPadCor) calPadCor->Write("tcor"); // base correction CalPad
513  if (calPadOut) calPadOut->Write("out"); // outlyer CalPad
514  //
515  if (calPad0) calPad0->Write("ffit0"); // global fit 0 - base
516  if (calPad1) calPad1->Write("ffit1"); // global fit 1 - common behavior rotation -A-C
517  if (calPad2) calPad2->Write("ffit2"); // gloabl fit 2 - CE missalign rotation A-C
518  if (calPadInOut)calPadInOut->Write("fInOut"); // misaalign in-out
519  if (calPadLX) calPadLX->Write("fLX"); // local x missalign
520  if (calPadTL) calPadTL->Write("fTL"); // local y/x missalign
521  if (calPadQ) calPadQ->Write("fQ"); // time (q) correction
522  if (calPadGXY) calPadGXY->Write("fGXY"); // global XY missalign (drift velocity grad)
523  if (calPadOff) calPadOff->Write("fOff"); // normalization offset fit
524  if (calPadRes) calPadRes->Write("Result"); //resulting calibration
525  fstore->Close();
526  delete fstore;
527 }
528 
529 void StoreTree(){
531 
533  //
534  if (calPadIn) preprocesor->AddComponent(calPadIn->Clone());
535  if (calPadF1) preprocesor->AddComponent(calPadF1->Clone());
536  if (calPadF2) preprocesor->AddComponent(calPadF2->Clone());
537  //
538  if (calPadQIn) preprocesor->AddComponent(calPadQIn->Clone());
539  if (calPadQF1) preprocesor->AddComponent(calPadQF1->Clone());
540  if (calPadQF2) preprocesor->AddComponent(calPadQF2->Clone());
541  //
542  if (calPadCor) preprocesor->AddComponent(calPadCor->Clone());
543  if (calPadOut) preprocesor->AddComponent(calPadOut->Clone());
544  //
545  if (calPad0) preprocesor->AddComponent(calPad0->Clone());
546  if (calPad1) preprocesor->AddComponent(calPad1->Clone());
547  if (calPad2) preprocesor->AddComponent(calPad2->Clone());
548  if (calPadInOut)preprocesor->AddComponent(calPadInOut->Clone());
549  if (calPadLX) preprocesor->AddComponent(calPadLX->Clone());
550  if (calPadTL) preprocesor->AddComponent(calPadTL->Clone());
551  if (calPadQ) preprocesor->AddComponent(calPadQ->Clone());
552  if (calPadGXY) preprocesor->AddComponent(calPadGXY->Clone());
553  if (calPadOff) preprocesor->AddComponent(calPadOff->Clone());
554  if (calPadRes) preprocesor->AddComponent(calPadRes->Clone());
555  preprocesor->DumpToFile(fname);
556  delete preprocesor;
557 }
558 
559 
562 
563  tree->SetAlias("tcor",tcor.Data()); // correction variable
564  tree->SetAlias("ta",taside+".fElements");
565  tree->SetAlias("tc",tcside+".fElements");
566  tree->SetAlias("qa",qaside+".fElements");
567  tree->SetAlias("qc",qcside+".fElements");
568  tree->SetAlias("ra",raside+".fElements");
569  tree->SetAlias("rc",rcside+".fElements");
570  tree->SetAlias("side","1-(sector%36>17)*2");
571  tree->SetAlias("dt","(ta)*(sector%36<18)+(tc)*(sector%36>17)+tcor");
572  tree->SetAlias("cutA","qa>30&&qa<400&&abs(ta)<2&&ra>0.5&&ra<2");
573  tree->SetAlias("cutC","qc>30&&qc<400&&abs(tc)<2&&rc>0.5&&rc<2");
574  tree->SetAlias("cutF","((row.fElements+pad.fElements+sector)%19==0)"); // use just part of the statistic - 5 %
575  tree->SetAlias("cutCE","V.out.fElements");
576  //
577  // fit param aliases
578  //
579  tree->SetAlias("inn","sector<36");
580  tree->SetAlias("gxr","(gx.fElements/250.)"); //
581  tree->SetAlias("gyr","(gy.fElements/250.)"); //
582  tree->SetAlias("lxr","(lx.fElements-133.41)/250.");
583  tree->SetAlias("qp","((sector%36<18)*sqrt(qa)/10.+(sector%36>17)*sqrt(qc)/10.)"); //
584  tree->SetAlias("tl","(ly.fElements/lx.fElements)/0.17");
585 }
586 
587 
590 
591  tree->SetAlias("tcor","tcor.fElements"); // correction variable
592  tree->SetAlias("side","1-(sector%36>17)*2");
593  tree->SetAlias("dt","timeIn.fElements");
594  //
595  tree->SetAlias("cutA","out.fElements==1");
596  tree->SetAlias("cutC","out.fElements==1");
597  tree->SetAlias("cutF","((row.fElements+pad.fElements+sector.fElements)%19==0)"); // use just part of the statistic - 5 %
598 
599  tree->SetAlias("cutCE","out.fElements<0.5");
600  //
601  // fit param aliases
602  //
603  tree->SetAlias("inn","sector<36");
604  tree->SetAlias("gxr","(gx.fElements/250.)"); //
605  tree->SetAlias("gyr","(gy.fElements/250.)"); //
606  tree->SetAlias("lxr","(lx.fElements-133.41)/250.");
607  tree->SetAlias("qp","(sqrt(qIn.fElements)/10.+(out.fElements>0.5))"); //
608  tree->SetAlias("tl","(ly.fElements/lx.fElements)/0.17");
609 }
610 
611 
612 void MakeRes()
613 {
615 
616  AliTPCCalPad * calPadRes0 =new AliTPCCalPad(*calPadIn);
617  calPadRes0->Add(calPad2,-1); // remove global fit
618  calPadRes = calPadRes0->GlobalFit("Result", calPadOut,kTRUE,1,0.9);
619  //
620  //
621  {
622  Float_t tlmedian = calPadTL->GetMedian();
623  for (Int_t isector=0;isector<72; isector++){
624  for (UInt_t ich=0;ich<calPadIn->GetCalROC(isector)->GetNchannels();ich++){
625  //
626  //
627  Float_t val0 = calPadRes->GetCalROC(isector)->GetValue(ich);
628  if (TMath::Abs(val0)>0.5) calPadRes->GetCalROC(isector)->SetValue(ich,0);
629  Float_t tl = calPadTL->GetCalROC(isector)->GetValue(ich);
630  Float_t inOut = calPadInOut->GetCalROC(isector)->GetValue(ich);
631  calPadRes->GetCalROC(isector)->SetValue(ich,calPadRes->GetCalROC(isector)->GetValue(ich)+tl+inOut);
632  //
633  }
634  }
635  }
636  calPadRes->Add(calPadCor,-1); // remove back correction (e.g Pulser time 0)
637 }
638 
639 
640 
641 
642 void RebuildCE(char *finname, char *pulname){
646 
647  TFile f(finname);
648  AliTPCCalibCE * ce = (AliTPCCalibCE*)f.Get("AliTPCCalibCE");
649  //
650  AliTPCCalPad *padtime = new AliTPCCalPad((TObjArray*)ce->GetCalPadT0());
651  AliTPCCalPad *padRMS = new AliTPCCalPad((TObjArray*)ce->GetCalPadRMS());
652  AliTPCCalPad *padq = new AliTPCCalPad((TObjArray*)ce->GetCalPadQ());
653  padtime->SetName("CE_T");
654  padRMS->SetName("CE_RMS");
655  padq->SetName("CE_Q");
656 
657  TFile f2(pulname);
658  AliTPCCalibPulser *pul = (AliTPCCalibPulser*)f2.Get("AliTPCCalibPulser");
659  AliTPCCalPad *pultime = new AliTPCCalPad((TObjArray*)pul->GetCalPadT0());
660  AliTPCCalPad *pulRMS = new AliTPCCalPad((TObjArray*)pul->GetCalPadRMS());
661  AliTPCCalPad *pulq = new AliTPCCalPad((TObjArray*)pul->GetCalPadQ());
662  pultime->SetName("P_T");
663  pulRMS->SetName("P_RMS");
664  pulq->SetName("P_Q");
665 
666 
668  preprocesor->AddComponent(padtime);
669  preprocesor->AddComponent(padq);
670  preprocesor->AddComponent(padRMS);
671  preprocesor->AddComponent(pultime);
672  preprocesor->AddComponent(pulq);
673  preprocesor->AddComponent(pulRMS);
674  preprocesor->DumpToFile(inname);
675 }
676 
677 
679  RebuildCE("ce.root","pul.root");
680  StoreData();
681  StoreTree();
682  RebuildData();
683  StoreData();
684  StoreTree();
685  MakeFit();
686  StoreData();
687  StoreTree();
688  MakeRes();
689 }
690 
691 
692 
693 void AddFiles(char *list){
695 
696  fstream finput;
697  finput.open(list, ios_base::in);
698  //
699  TString currentFile;
700  Int_t counter=0;
701  if (!elist ) {
702  elist = new TEntryList("elist","elist");
703  tree->Draw(Form(">>elist%d",counter),"1","entrylist");
704  }
705  while(finput.good()) {
706  finput >> currentFile;
707  printf("Getting file%s\n",currentFile.Data());
708  TFile * fC = new TFile(currentFile.Data());
709  TTree * treeC = (TTree*) fC->Get("calPads");
710  makePad->AddFriend(treeC,Form("T%d",counter));
711  //
712  TString cutStrF1=Form("abs(T%d.timeIn.fElements-T%d.timeF1.fElements)<1.5",counter,counter);
713  TEntryList *celist = new TEntryList(Form("listF1%d",counter),Form("listF1%d",counter));
714  tree->Draw(Form(">>listF1%d",counter),cutStrF1,"entrylist");
715  if (celist->GetN()>0) elist->Add(celist);
716  counter++;
717  }
718  viewer->Reload();
719 }
720 
721 //void AnalyzeSectors(){
722 // //
723 // // Analyze sector by sector
724 // //
725 // TTreeSRedirector cstream("fits.root");
726 // for (Int_t
727 //}
AliTPCCalPad * calPadTL
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
AliTPCCalROC * GetCalROC(Int_t sector) const
Definition: AliTPCCalPad.h:39
void LoadViewer()
const TObjArray * GetCalPadRMS() const
Definition: AliTPCCalibCE.h:57
Summary of statistics functions.
void StoreTree()
AliTPCCalPad * calPadF2
AliTPCCalPad * calPadOut
#define TObjArray
GUI for the AliTPCCalibViewer used for the calibration monitor All functionalities of the AliTPCCalib...
void AnalyzeLaser()
TStopwatch timer
Definition: kNNSpeed.C:15
TString taside("CE_T")
AliTPCCalPad * calPad2
Float_t GetValue(UInt_t row, UInt_t pad) const
Definition: AliTPCCalROC.h:38
AliTPCCalibViewerGUI * viewer
AliTPCCalPad * calPadGXY
const TObjArray * GetCalPadT0() const
Definition: AliTPCCalibCE.h:54
TMatrixD mat
Definition: AnalyzeLaser.C:9
Double_t GetMedian(AliTPCCalPad *outlierPad=0, AliTPCCalROC::EPadType padType=AliTPCCalROC::kAll) const
TFriendElement * AddFriend(const char *treename, const char *filename)
Class for viewing/visualizing TPC calibration data.
TString qcside("CE_Q")
AliTPCCalibViewer * GetViewer()
AliTPCCalPad * calPadQF1
TTree * tree
npoints
Definition: driftITSTPC.C:85
void MakeRes()
const Float_t tThr
void MakeFitPulser()
void AddFiles(char *list)
const TObjArray * GetCalPadRMS() const
TStatToolkit stat
Definition: AnalyzeLaser.C:5
TObjArray * array
Definition: AnalyzeLaser.C:12
TVectorD vecFit0
AliTPCCalPad * calPadQ
AliTPCCalibViewer * makePad
Implementation of the TPC pulser calibration.
TString qaside("CE_Q")
AliTPCCalPad * calPad1
void MakeFit()
AliTPCCalPad * calPadF1
Double_t chi2
Definition: AnalyzeLaser.C:7
const Float_t qThr0
void LoadData()
void RebuildCE(char *finname, char *pulname)
TEntryList * elist
const TObjArray * GetCalPadT0() const
const Float_t qThr1
AliTPCCalPad * calPadOff
void RebuildData()
void SetValue(UInt_t row, UInt_t pad, Float_t vd)
Definition: AliTPCCalROC.h:40
void Add(Float_t c1)
char * inname
void MakeAliases1()
AliTPCCalPad * calPadRes
AliTPCCalPad * calPadInOut
char * oname
AliTPCCalPad * calPadQIn
AliTPCCalPad * calPadLX
TVectorD vecFit2
TVectorD vecFit1
TString rcside("CE_RMS")
static TObjArray * ShowGUI(const char *fileName=0)
TF1 * f
Definition: interpolTest.C:21
TString tcor("-pulCorr")
TObjString strFit0
UInt_t GetNchannels() const
Definition: AliTPCCalROC.h:34
AliTPCCalPad * GetCalPad(const char *desiredData, const char *cuts="", const char *calPadName="NoName") const
void DumpToFile(const char *fileName)
AliTPCCalPad * calPadIn
Preprocessor class for HLT and DAQ.
TObjString strFit1
const TObjArray * GetCalPadQ() const
Definition: AliTPCCalibCE.h:56
Implementation of the TPC Central Electrode calibration.
Definition: AliTPCCalibCE.h:29
class TVectorT< Double_t > TVectorD
void MakeAliases0()
TString raside("CE_RMS")
AliTPCCalPad * GlobalFit(const char *padName, AliTPCCalPad *Padoutliers=0, Bool_t robust=kFALSE, Int_t fitType=1, Double_t chi2Threshold=5, Double_t robustFraction=0.7, Double_t err=1, TObjArray *fitParArr=0x0, TObjArray *fitCovArr=0x0, AliTPCCalROC::EPadType padType=AliTPCCalROC::kAll)
TString tcside("CE_T")
void StoreData()
TObjString strFit2
TTree * GetTree() const
char * fname
AliTPCCalPad * calPadQF2
const TObjArray * GetCalPadQ() const
class TMatrixT< Double_t > TMatrixD
AliTPCCalPad * calPad0
AliTPCCalPad * calPadCor
void AnalyzeLaserCE()