1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
20 // 1. The laser track is associated with the mirror
21 // see function FindMirror
23 // 2. The laser track is accepted for the analysis under certain condition
24 // (see function Accpet laser)
26 // 3. The drift velocity and jitter is calculated event by event
27 // (see function drift velocity)
29 // 4. The tracks are refitted at different sectors
33 // 4.c) parabola with common P2 for inner and outer
35 // To make laser scan the user interaction neccessary
38 gSystem->Load("libANALYSIS");
39 gSystem->Load("libTPCcalib");
40 TFile fcalib("CalibObjectsTrain2.root");
41 AliTPCcalibLaser * laser = ( AliTPCcalibLaser *)fcalib->Get("laserTPC");
42 laser->DumpMeanInfo(-0,0)
43 TFile fmean("laserMean.root")
45 // laser track clasification;
47 TCut cutT("cutT","abs(Tr.fP[3])<0.06");
48 TCut cutN("cutN","fTPCncls>70");
49 TCut cutP("cutP","abs(atan2(x1,x0)-atan2(lx1,lx0))<0.03")
50 TCut cutA = cutT+cutPt+cutP;
51 TChain * chainTrL = tool.MakeChain("laser.txt","Track",0,10200);
58 gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
59 gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+")
60 AliXRDPROOFtoolkit tool;
61 TChain * chain = tool.MakeChain("laserScan.txt","Mean",0,10200);
63 AliTPCcalibLaser::DumpScanInfo(chain)
64 TFile fscan("laserScan.root")
65 TTree * treeT = (TTree*)fscan.Get("Mean")
69 gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
70 gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+")
71 AliXRDPROOFtoolkit tool;
72 AliXRDPROOFtoolkit::FilterList("laser.txt","* driftvN",1)
73 TChain * chainDrift = tool.MakeChainRandom("laser.txt.Good","driftv",0,50);
75 TChain * chainDriftN = tool.MakeChainRandom("laser.txt.Good","driftvN",0,300);
76 chainDriftN->Lookup();
79 TChain * chain = tool.MakeChain("laser.txt","Residuals",0,10200);
81 TChain * chainFit = tool.MakeChain("laser.txt","FitModels",0,10200);
83 TChain * chainTrack = tool.MakeChainRandom("laser.txt","Track",0,30);
90 #include "TLinearFitter.h"
91 #include "AliTPCcalibLaser.h"
92 #include "AliExternalTrackParam.h"
93 #include "AliESDEvent.h"
94 #include "AliESDfriend.h"
95 #include "AliESDtrack.h"
96 #include "AliTPCTracklet.h"
100 #include "TVectorD.h"
101 #include "TTreeStream.h"
104 #include "TGraphErrors.h"
105 #include "AliTPCclusterMI.h"
106 #include "AliTPCseed.h"
107 #include "AliTracker.h"
109 #include "TClonesArray.h"
115 #include "TStatToolkit.h"
119 #include "TTreeStream.h"
122 #include "AliTPCLaserTrack.h"
123 #include "AliTPCcalibDB.h"
124 #include "AliTPCParam.h"
125 #include "AliTPCParamSR.h"
126 #include "TTimeStamp.h"
127 #include "AliDCSSensorArray.h"
128 #include "AliDCSSensor.h"
132 ClassImp(AliTPCcalibLaser)
134 AliTPCcalibLaser::AliTPCcalibLaser():
141 fTracksEsdParam(336),
151 fHisLaser(0), // N dim histogram of laser
152 fHisNclIn(0), //->Number of clusters inner
153 fHisNclOut(0), //->Number of clusters outer
154 fHisNclIO(0), //->Number of cluster inner outer
155 fHisLclIn(0), //->Level arm inner
156 fHisLclOut(0), //->Level arm outer
157 fHisLclIO(0), //->Number of cluster inner outer
158 fHisdEdx(0), //->dEdx histo
159 fHisdZfit(0), //->distance to the mirror after linear fit
162 fHisChi2YIn1(0), //->chi2 y inner - line
163 fHisChi2YOut1(0), //->chi2 y inner - line
164 fHisChi2YIn2(0), //->chi2 y inner - parabola
165 fHisChi2YOut2(0), //->chi2 y inner - parabola
166 fHisChi2YIO1(0), //->chi2 y IO - common
167 fHisChi2ZIn1(0), //->chi2 z inner - line
168 fHisChi2ZOut1(0), //->chi2 z inner - line
169 fHisChi2ZIn2(0), //->chi2 z inner - parabola
170 fHisChi2ZOut2(0), //->chi2 z inner - parabola
171 fHisChi2ZIO1(0), //->chi2 z IO - common
174 fHisPy1vP0(0), //-> delta y P0outer-P0inner - line
175 fHisPy2vP0(0), //-> delta y P0outer-P0inner - parabola
176 fHisPy3vP0(0), //-> delta y P0outer-P0inner - common parabola
177 fHisPy1vP1(0), //-> delta ky P1outer-P1inner - line
178 fHisPy2vP1(0), //-> delta ky P1outer-P1inner - parabola
179 fHisPy3vP1(0), //-> delta ky P1outer-P1inner - common parabola
180 fHisPy2vP2In(0), //-> Curv P2inner - parabola
181 fHisPy2vP2Out(0), //-> Curv P2outer - parabola
182 fHisPy3vP2IO(0), //-> Curv P2outerinner - common parabola
185 fHisPz1vP0(0), //-> delta z P0outer-P0inner - line
186 fHisPz2vP0(0), //-> delta z P0outer-P0inner - parabola
187 fHisPz3vP0(0), //-> delta z P0outer-P0inner - common parabola
188 fHisPz1vP1(0), //-> delta kz P1outer-P1inner - line
189 fHisPz2vP1(0), //-> delta kz P1outer-P1inner - parabola
190 fHisPz3vP1(0), //-> delta kz P1outer-P1inner - common parabola
191 fHisPz2vP2In(0), //-> Curv P2inner - parabola
192 fHisPz2vP2Out(0), //-> Curv P2outer - parabola
193 fHisPz3vP2IO(0), //-> Curv P2outerinner - common parabola
195 fDeltaYres(336), //->2D histo of residuals
196 fDeltaZres(336), //->2D histo fo residuals
197 fDeltaYres2(336), //->2D histo of residuals
198 fDeltaZres2(336), //->2D histo fo residuals
199 fDeltaYresAbs(336), //->2D histo of residuals
200 fHisYAbsErrors(0), //-> total errors per beam in the abs res y analysis
201 fDeltaZresAbs(336), //->2D histo of residuals
202 fHisZAbsErrors(0), //-> total errors per beam in the abs res z analysis
203 //fDeltaYres3(336), //->2D histo of residuals
204 //fDeltaZres3(336), //->2D histo fo residuals
205 fFitAside(new TVectorD(5)),
206 fFitCside(new TVectorD(5)),
207 fFitACside(new TVectorD(6)),
212 fBeamSectorOuter(336),
213 fBeamSectorInner(336),
214 fBeamOffsetYOuter(336),
215 fBeamSlopeYOuter(336),
216 fBeamOffsetYInner(336),
217 fBeamSlopeYInner(336),
218 fBeamOffsetZOuter(336),
219 fBeamSlopeZOuter(336),
220 fBeamOffsetZInner(336),
221 fBeamSlopeZInner(336),
222 fInverseSlopeZ(kTRUE),
224 fFixedFitAside0(0.0),
225 fFixedFitAside1(1.0),
226 fFixedFitCside0(0.0),
232 fTracksEsdParam.SetOwner(kTRUE);
235 AliTPCcalibLaser::AliTPCcalibLaser(const Text_t *name, const Text_t *title, Bool_t full):
242 fTracksEsdParam(336),
246 fDeltaZ(336), // array of histograms of delta z for each track
247 fDeltaP3(336), // array of histograms of delta z for each track
248 fDeltaP4(336), // array of histograms of P3 for each track
249 fDeltaPhi(336), // array of histograms of P4 for each track
250 fDeltaPhiP(336), // array of histograms of delta z for each track
251 fSignals(336), // array of dedx signals
254 fHisLaser(0), // N dim histogram of laser
255 fHisNclIn(0), //->Number of clusters inner
256 fHisNclOut(0), //->Number of clusters outer
257 fHisNclIO(0), //->Number of cluster inner outer
258 fHisLclIn(0), //->Level arm inner
259 fHisLclOut(0), //->Level arm outer
260 fHisLclIO(0), //->Number of cluster inner outer
261 fHisdEdx(0), //->dEdx histo
262 fHisdZfit(0), //->distance to the mirror after linear fit
265 fHisChi2YIn1(0), //->chi2 y inner - line
266 fHisChi2YOut1(0), //->chi2 y inner - line
267 fHisChi2YIn2(0), //->chi2 y inner - parabola
268 fHisChi2YOut2(0), //->chi2 y inner - parabola
269 fHisChi2YIO1(0), //->chi2 y IO - common
270 fHisChi2ZIn1(0), //->chi2 z inner - line
271 fHisChi2ZOut1(0), //->chi2 z inner - line
272 fHisChi2ZIn2(0), //->chi2 z inner - parabola
273 fHisChi2ZOut2(0), //->chi2 z inner - parabola
274 fHisChi2ZIO1(0), //->chi2 z IO - common
277 fHisPy1vP0(0), //-> delta y P0outer-P0inner - line
278 fHisPy2vP0(0), //-> delta y P0outer-P0inner - parabola
279 fHisPy3vP0(0), //-> delta y P0outer-P0inner - common parabola
280 fHisPy1vP1(0), //-> delta ky P1outer-P1inner - line
281 fHisPy2vP1(0), //-> delta ky P1outer-P1inner - parabola
282 fHisPy3vP1(0), //-> delta ky P1outer-P1inner - common parabola
283 fHisPy2vP2In(0), //-> Curv P2inner - parabola
284 fHisPy2vP2Out(0), //-> Curv P2outer - parabola
285 fHisPy3vP2IO(0), //-> Curv P2outerinner - common parabola
288 fHisPz1vP0(0), //-> delta z P0outer-P0inner - line
289 fHisPz2vP0(0), //-> delta z P0outer-P0inner - parabola
290 fHisPz3vP0(0), //-> delta z P0outer-P0inner - common parabola
291 fHisPz1vP1(0), //-> delta kz P1outer-P1inner - line
292 fHisPz2vP1(0), //-> delta kz P1outer-P1inner - parabola
293 fHisPz3vP1(0), //-> delta kz P1outer-P1inner - common parabola
294 fHisPz2vP2In(0), //-> Curv P2inner - parabola
295 fHisPz2vP2Out(0), //-> Curv P2outer - parabola
296 fHisPz3vP2IO(0), //-> Curv P2outerinner - common parabola
310 fFitAside(new TVectorD(5)), // drift fit - A side
311 fFitCside(new TVectorD(5)), // drift fit - C- side
312 fFitACside(new TVectorD(6)), // drift fit - AC- side
313 fEdgeXcuts(3), // cuts in local x direction; used in the refit of the laser tracks
314 fEdgeYcuts(3), // cuts in local y direction; used in the refit of the laser tracks
315 fNClCuts(5), // cuts on the number of clusters per tracklet; used in the refit of the laser tracks
316 fNcuts(0), // number of cuts
317 fBeamSectorOuter(336),
318 fBeamSectorInner(336),
319 fBeamOffsetYOuter(336),
320 fBeamSlopeYOuter(336),
321 fBeamOffsetYInner(336),
322 fBeamSlopeYInner(336),
323 fBeamOffsetZOuter(336),
324 fBeamSlopeZOuter(336),
325 fBeamOffsetZInner(336),
326 fBeamSlopeZInner(336),
327 fInverseSlopeZ(kTRUE),
329 fFixedFitAside0(0.0),
330 fFixedFitAside1(1.0),
331 fFixedFitCside0(0.0),
339 fTracksEsdParam.SetOwner(kTRUE);
342 AliTPCcalibLaser::AliTPCcalibLaser(const AliTPCcalibLaser& calibLaser):
343 AliTPCcalibBase(calibLaser),
349 fTracksEsdParam(336),
351 fFullCalib(calibLaser.fFullCalib),
353 fDeltaZ(calibLaser.fDeltaZ), // array of histograms of delta z for each track
354 fDeltaP3(((calibLaser.fDeltaP3))), // array of histograms of delta z for each track
355 fDeltaP4(((calibLaser.fDeltaP4))), // array of histograms of P3 for each track
356 fDeltaPhi(((calibLaser.fDeltaPhi))), // array of histograms of P4 for each track
357 fDeltaPhiP(((calibLaser.fDeltaPhiP))), // array of histograms of delta z for each track
358 fSignals(((calibLaser.fSignals))), // array of dedx signals
361 fHisLaser(0), // N dim histogram of laser
362 fHisNclIn(new TH2F(*(calibLaser.fHisNclIn))), //->Number of clusters inner
363 fHisNclOut(new TH2F(*(calibLaser.fHisNclOut))), //->Number of clusters outer
364 fHisNclIO(new TH2F(*(calibLaser.fHisNclIO))), //->Number of cluster inner outer
365 fHisLclIn(new TH2F(*(calibLaser.fHisLclIn))), //->Level arm inner
366 fHisLclOut(new TH2F(*(calibLaser.fHisLclOut))), //->Level arm outer
367 fHisLclIO(new TH2F(*(calibLaser.fHisLclIO))), //->Number of cluster inner outer
368 fHisdEdx(new TH2F(*(calibLaser.fHisdEdx))), //
369 fHisdZfit(new TH2F(*(calibLaser.fHisdZfit))), //->distance to the mirror after linear fit
372 fHisChi2YIn1(new TH2F(*(calibLaser.fHisChi2YIn1))), //->chi2 y inner - line
373 fHisChi2YOut1(new TH2F(*(calibLaser.fHisChi2YOut1))), //->chi2 y inner - line
374 fHisChi2YIn2(new TH2F(*(calibLaser.fHisChi2YIn2))), //->chi2 y inner - parabola
375 fHisChi2YOut2(new TH2F(*(calibLaser.fHisChi2YOut2))), //->chi2 y inner - parabola
376 fHisChi2YIO1(new TH2F(*(calibLaser.fHisChi2YIO1))), //->chi2 y IO - common
377 fHisChi2ZIn1(new TH2F(*(calibLaser.fHisChi2ZIn1))), //->chi2 z inner - line
378 fHisChi2ZOut1(new TH2F(*(calibLaser.fHisChi2ZOut1))), //->chi2 z inner - line
379 fHisChi2ZIn2(new TH2F(*(calibLaser.fHisChi2ZIn2))), //->chi2 z inner - parabola
380 fHisChi2ZOut2(new TH2F(*(calibLaser.fHisChi2ZOut2))), //->chi2 z inner - parabola
381 fHisChi2ZIO1(new TH2F(*(calibLaser.fHisChi2ZIO1))), //->chi2 z IO - common
384 fHisPy1vP0(new TH2F(*(calibLaser.fHisPy1vP0))), //-> delta y P0outer-P0inner - line
385 fHisPy2vP0(new TH2F(*(calibLaser.fHisPy2vP0))), //-> delta y P0outer-P0inner - parabola
386 fHisPy3vP0(new TH2F(*(calibLaser.fHisPy3vP0))), //-> delta y P0outer-P0inner - common parabola
387 fHisPy1vP1(new TH2F(*(calibLaser.fHisPy1vP1))), //-> delta ky P1outer-P1inner - line
388 fHisPy2vP1(new TH2F(*(calibLaser.fHisPy2vP1))), //-> delta ky P1outer-P1inner - parabola
389 fHisPy3vP1(new TH2F(*(calibLaser.fHisPy3vP1))), //-> delta ky P1outer-P1inner - common parabola
390 fHisPy2vP2In(new TH2F(*(calibLaser.fHisPy2vP2In))), //-> Curv P2inner - parabola
391 fHisPy2vP2Out(new TH2F(*(calibLaser.fHisPy2vP2Out))), //-> Curv P2outer - parabola
392 fHisPy3vP2IO(new TH2F(*(calibLaser.fHisPy3vP2IO))), //-> Curv P2outerinner - common parabola
395 fHisPz1vP0(new TH2F(*(calibLaser.fHisPz1vP0))), //-> delta z P0outer-P0inner - line
396 fHisPz2vP0(new TH2F(*(calibLaser.fHisPz2vP0))), //-> delta z P0outer-P0inner - parabola
397 fHisPz3vP0(new TH2F(*(calibLaser.fHisPz3vP0))), //-> delta z P0outer-P0inner - common parabola
398 fHisPz1vP1(new TH2F(*(calibLaser. fHisPz1vP1))), //-> delta kz P1outer-P1inner - line
399 fHisPz2vP1(new TH2F(*(calibLaser.fHisPz2vP1))), //-> delta kz P1outer-P1inner - parabola
400 fHisPz3vP1(new TH2F(*(calibLaser.fHisPz3vP1))), //-> delta kz P1outer-P1inner - common parabola
401 fHisPz2vP2In(new TH2F(*(calibLaser.fHisPz2vP2In))), //-> Curv P2inner - parabola
402 fHisPz2vP2Out(new TH2F(*(calibLaser. fHisPz2vP2Out))), //-> Curv P2outer - parabola
403 fHisPz3vP2IO(new TH2F(*(calibLaser.fHisPz3vP2IO))), //-> Curv P2outerinner - common parabola
406 fDeltaYres(((calibLaser.fDeltaYres))),
407 fDeltaZres(((calibLaser.fDeltaZres))),
408 fDeltaYres2(((calibLaser.fDeltaYres))),
409 fDeltaZres2(((calibLaser.fDeltaZres))),
410 fDeltaYresAbs(((calibLaser.fDeltaYresAbs))),
411 fHisYAbsErrors(new TH1F(*(calibLaser.fHisYAbsErrors))),
412 fDeltaZresAbs(((calibLaser.fDeltaZresAbs))),
413 fHisZAbsErrors(new TH1F(*(calibLaser.fHisZAbsErrors))),
414 // fDeltaYres3(((calibLaser.fDeltaYres))),
415 //fDeltaZres3(((calibLaser.fDeltaZres))),
416 fFitAside(new TVectorD(5)), // drift fit - A side
417 fFitCside(new TVectorD(5)), // drift fit - C- side
418 fFitACside(new TVectorD(6)), // drift fit - C- side
419 fEdgeXcuts(3), // cuts in local x direction; used in the refit of the laser tracks
420 fEdgeYcuts(3), // cuts in local y direction; used in the refit of the laser tracks
421 fNClCuts(5), // cuts on the number of clusters per tracklet; used in the refit of the laser tracks
422 fNcuts(0), // number of cuts
423 fBeamSectorOuter(336),
424 fBeamSectorInner(336),
425 fBeamOffsetYOuter(336),
426 fBeamSlopeYOuter(336),
427 fBeamOffsetYInner(336),
428 fBeamSlopeYInner(336),
429 fBeamOffsetZOuter(336),
430 fBeamSlopeZOuter(336),
431 fBeamOffsetZInner(336),
432 fBeamSlopeZInner(336),
433 fInverseSlopeZ(calibLaser.fInverseSlopeZ),
434 fUseFixedDriftV(calibLaser.fUseFixedDriftV),
435 fFixedFitAside0(calibLaser.fFixedFitAside0),
436 fFixedFitAside1(calibLaser.fFixedFitAside1),
437 fFixedFitCside0(calibLaser.fFixedFitCside0),
438 fFixedFitCside1(calibLaser.fFixedFitCside1)
447 AliTPCcalibLaser & AliTPCcalibLaser::operator=(const AliTPCcalibLaser& calibLaser){
449 // assgnment operator
451 if (this != &calibLaser) {
452 new (this) AliTPCcalibLaser(calibLaser);
461 AliTPCcalibLaser::~AliTPCcalibLaser() {
466 delete fHisLaser; //->
467 delete fHisNclIn; //->Number of clusters inner
468 delete fHisNclOut; //->Number of clusters outer
469 delete fHisNclIO; //->Number of cluster inner outer
470 delete fHisLclIn; //->Level arm inner
471 delete fHisLclOut; //->Level arm outer
472 delete fHisLclIO; //->Number of cluster inner outer
477 delete fHisChi2YIn1; //->chi2 y inner - line
478 delete fHisChi2YOut1; //->chi2 y inner - line
479 delete fHisChi2YIn2; //->chi2 y inner - parabola
480 delete fHisChi2YOut2; //->chi2 y inner - parabola
481 delete fHisChi2YIO1; //->chi2 y IO - common
482 delete fHisChi2ZIn1; //->chi2 z inner - line
483 delete fHisChi2ZOut1; //->chi2 z inner - line
484 delete fHisChi2ZIn2; //->chi2 z inner - parabola
485 delete fHisChi2ZOut2; //->chi2 z inner - parabola
486 delete fHisChi2ZIO1; //->chi2 z IO - common
489 delete fHisPy1vP0; //-> delta y P0outer-P0inner - line
490 delete fHisPy2vP0; //-> delta y P0outer-P0inner - parabola
491 delete fHisPy3vP0; //-> delta y P0outer-P0inner - common parabola
492 delete fHisPy1vP1; //-> delta ky P1outer-P1inner - line
493 delete fHisPy2vP1; //-> delta ky P1outer-P1inner - parabola
494 delete fHisPy3vP1; //-> delta ky P1outer-P1inner - common parabola
495 delete fHisPy2vP2In; //-> Curv P2inner - parabola
496 delete fHisPy2vP2Out; //-> Curv P2outer - parabola
497 delete fHisPy3vP2IO; //-> Curv P2outerinner - common parabola
500 delete fHisPz1vP0; //-> delta z P0outer-P0inner - line
501 delete fHisPz2vP0; //-> delta z P0outer-P0inner - parabola
502 delete fHisPz3vP0; //-> delta z P0outer-P0inner - common parabola
503 delete fHisPz1vP1; //-> delta kz P1outer-P1inner - line
504 delete fHisPz2vP1; //-> delta kz P1outer-P1inner - parabola
505 delete fHisPz3vP1; //-> delta kz P1outer-P1inner - common parabola
506 delete fHisPz2vP2In; //-> Curv P2inner - parabola
507 delete fHisPz2vP2Out; //-> Curv P2outer - parabola
508 delete fHisPz3vP2IO; //-> Curv P2outerinner - common parabola
513 fDeltaZ.SetOwner(); //-> array of histograms of delta z for each track
514 fDeltaP3.SetOwner(); //-> array of histograms of P3 for each track
515 fDeltaP4.SetOwner(); //-> array of histograms of P4 for each track
516 fDeltaPhi.SetOwner(); //-> array of histograms of delta z for each track
517 fDeltaPhiP.SetOwner(); //-> array of histograms of delta z for each track
518 fSignals.SetOwner(); //->Array of dedx signals
520 fDeltaZ.Delete(); //-> array of histograms of delta z for each track
521 fDeltaP3.Delete(); //-> array of histograms of P3 for each track
522 fDeltaP4.Delete(); //-> array of histograms of P4 for each track
523 fDeltaPhi.Delete(); //-> array of histograms of delta z for each track
524 fDeltaPhiP.Delete(); //-> array of histograms of delta z for each track
525 fSignals.Delete(); //->Array of dedx signals
527 fDeltaYres.SetOwner();
529 delete fHisYAbsErrors;
530 fDeltaZres.SetOwner();
532 delete fHisZAbsErrors;
533 fDeltaYres2.SetOwner();
534 fDeltaYres2.Delete();
535 fDeltaZres2.SetOwner();
536 fDeltaZres2.Delete();
538 fDeltaYresAbs.SetOwner();
539 fDeltaYresAbs.Delete();
540 fDeltaZresAbs.SetOwner();
541 fDeltaZresAbs.Delete();
546 void AliTPCcalibLaser::Process(AliESDEvent * event) {
549 // Loop over tracks and call Process function
551 const Int_t kMinTracks=20;
552 const Int_t kMinClusters=40;
558 fESDfriend=static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));
562 if (fESD->GetNumberOfTracks()<kMinTracks) return; //not enough tracks
563 AliDebug(4,Form("Event number in current file: %d",event->GetEventNumberInFile()));
565 // find CE background if present
567 if (AliTPCLaserTrack::GetTracks()==0) AliTPCLaserTrack::LoadTracks();
568 TH1D hisCE("hhisCE","hhisCE",100,-100,100);
569 for (Int_t i=0;i<fESD->GetNumberOfTracks();++i) {
570 AliESDtrack *track=fESD->GetTrack(i);
571 if (!track) continue;
572 hisCE.Fill(track->GetZ());
573 hisCE.Fill(track->GetZ()+2);
574 hisCE.Fill(track->GetZ()-2);
582 fTracksEsdParam.Delete();
583 for (Int_t id=0; id<336;id++) {
585 fClusterCounter[id]=0;
589 Int_t n=fESD->GetNumberOfTracks();
591 for (Int_t i=0;i<n;++i) {
592 AliESDfriendTrack *friendTrack=fESDfriend->GetTrack(i);
593 if (!friendTrack) continue;
594 AliESDtrack *track=fESD->GetTrack(i);
595 Double_t binC = hisCE.GetBinContent(hisCE.FindBin(track->GetZ()));
596 if (binC>336) continue; //remove CE background
597 TObject *calibObject=0;
599 for (Int_t j=0;(calibObject=friendTrack->GetCalibObject(j));++j)
600 if ((seed=dynamic_cast<AliTPCseed*>(calibObject)))
602 if (track&&seed&&track->GetTPCNcls()>kMinClusters && seed->GetNumberOfClusters() >kMinClusters) {
604 Int_t id = FindMirror(track,seed);
605 if (id>=0) counter++;
610 if (counter<kMinTracks) return;
614 if (!fFullCalib) return;
615 static Bool_t init=kFALSE;
617 init = kTRUE; // way around for PROOF - to be investigated
621 for (Int_t id=0; id<336; id++){
623 if (!fTracksEsdParam.At(id)) continue;
624 if (fClusterSatur[id]>0.3) continue; // tracks in saturation
626 if ( AcceptLaser(id) && fFitZ[id]<0.5){
634 void AliTPCcalibLaser::MakeDistHisto(Int_t id){
638 // for (Int_t id=0; id<336; id++){
641 if (!fTracksEsdParam.At(id)) return;
642 if (!AcceptLaser(id)) return;
643 Double_t xhis[12]={0,0,0,0,0,0,0,0,0,0,0,0};
646 TH1F * hisdz = (TH1F*)fDeltaZ.At(id);
647 if (!hisdz) MakeFitHistos();
648 hisdz = (TH1F*)fDeltaZ.At(id);
649 TH1F * hisP3 = (TH1F*)fDeltaP3.At(id);
650 TH1F * hisP4 = (TH1F*)fDeltaP4.At(id);
651 TH1F * hisdphi = (TH1F*)fDeltaPhi.At(id);
652 TH1F * hisdphiP = (TH1F*)fDeltaPhiP.At(id);
653 TH1F * hisSignal = (TH1F*)fSignals.At(id);
656 AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id);
657 AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id);
658 AliESDtrack *track = (AliESDtrack*)fTracksEsd.At(id);
667 param->GetPxPyPz(pxyz);
669 ltrp->GetPxPyPz(lpxyz);
671 Float_t dz = param->GetZ()-ltrp->GetZ();
672 Float_t dphi = (TMath::ATan2(xyz[1],xyz[0])- TMath::ATan2(lxyz[1],lxyz[0]))*254.;
673 Float_t dphiP = param->GetParameter()[2]-ltrp->GetParameter()[2];
674 if (hisdz) hisdz->Fill(dz);
675 if (hisP3) hisP3->Fill(param->GetParameter()[3]);
676 if (hisP4) hisP4->Fill(param->GetParameter()[4]);
677 if (hisdphi) hisdphi->Fill(dphi);
678 if (hisdphiP) hisdphiP->Fill(dphiP);
679 if (hisSignal) hisSignal->Fill(TMath::Sqrt(TMath::Abs(track->GetTPCsignal())));
681 xhis[0] = ltrp->GetId();
682 xhis[1] = ltrp->GetSide();
683 xhis[2] = ltrp->GetRod();
684 xhis[3] = ltrp->GetBundle();
685 xhis[4] = ltrp->GetBeam();
688 xhis[7] = param->GetParameter()[2]-ltrp->GetParameter()[2]; //dp2
689 xhis[8] = param->GetParameter()[3]-ltrp->GetParameter()[3]; //dp3
690 xhis[9] = param->GetParameter()[4];
691 xhis[10]= track->GetTPCNcls();
692 xhis[11]= TMath::Sqrt(TMath::Abs(track->GetTPCsignal()));
694 fHisLaser->Fill(xhis);
697 void AliTPCcalibLaser::FitDriftV(){
699 // Fit corrections to the drift velocity - linear approximation in the z and global y
700 //The transfromatiom from the drift time to the z position done in AliTPCTracnsform class
705 z = s* (z0 - vd*(t-t0))
709 vd - nominal drift velocity
710 zs - miscalibrated position
712 zs = s*(z0 - vd*(1+vr)*(t-(t0+dt))
713 vr - relative change of the drift velocity
718 zs ~ z - s*vr*(z0-s*z)+s*dzt
719 --------------------------------
720 1. Correction function vr constant:
723 dz = zs-z = -s*vr *(z0-s*z)+s*dzt
724 dzs/dl = dz/dl +s*s*vr*dz/dl
728 const Float_t kZCut = 240; // remove the closest laser beam
729 const Float_t kSaturCut = 0.05; // remove saturated lasers - cut on fraction of saturated
730 const Float_t kDistCut = 3; // distance sigma cut
731 const Float_t kDistCutAbs = 0.25;
732 const Float_t kMinClusters = 60; // minimal amount of the clusters
733 const Float_t kMinSignal = 16; // minimal mean height of the signal
734 const Float_t kChi2Cut = 0.1; // chi2 cut to accept drift fit
735 static TLinearFitter fdriftA(3,"hyp2");
736 static TLinearFitter fdriftC(3,"hyp2");
737 static TLinearFitter fdriftAC(4,"hyp3");
738 TVectorD fitA(3),fitC(3),fitAC(4);
740 AliTPCcalibDB* calib=AliTPCcalibDB::Instance();
741 AliTPCParam * tpcparam = calib->GetParameters();
743 for (Int_t id=0; id<336; id++) fFitZ[id]=0;
753 for (Int_t iter=0; iter<3; iter++){
754 fdriftA.ClearPoints();
755 fdriftC.ClearPoints();
756 fdriftAC.ClearPoints();
758 for (Int_t id=0; id<336; id++){
759 if (!fTracksEsdParam.At(id)) continue;
760 if (!AcceptLaser(id)) continue;
761 if ( fClusterSatur[id]>kSaturCut) continue;
762 if ( fClusterCounter[id]<kMinClusters) continue;
763 AliESDtrack *track = (AliESDtrack*)fTracksEsd.At(id);
764 if (track->GetTPCsignal()<kMinSignal) continue;
765 AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id);
766 AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id);
773 param->GetPxPyPz(pxyz);
775 ltrp->GetPxPyPz(lpxyz);
776 if (TMath::Abs(lxyz[2])>kZCut) continue;
777 Float_t sz = (ltrp->GetSide()==0) ? TMath::Sqrt(chi2A): TMath::Sqrt(chi2C);
778 if (npointsAC>0) sz =TMath::Sqrt(chi2AC);
779 if (TMath::Abs(fFitZ[id])>sz*kDistCut) continue;
780 if (iter>0 && TMath::Abs(fFitZ[id])>kDistCutAbs) continue;
783 Double_t zlength = tpcparam->GetZLength(0);
784 Double_t ldrift = zlength-TMath::Abs(lxyz[2]);
785 Double_t mdrift = zlength-TMath::Abs(xyz[2]);
786 Double_t xxx[2] = {ldrift,lxyz[1]*ldrift/(zlength*250.)};
787 if (ltrp->GetSide()==0){
788 fdriftA.AddPoint(xxx,mdrift,1);
790 fdriftC.AddPoint(xxx,mdrift,1);
792 Double_t xxx2[3] = {ltrp->GetSide(), ldrift,lxyz[1]*ldrift/(zlength*250.)};
793 fdriftAC.AddPoint(xxx2,mdrift,1);
796 if (fdriftA.GetNpoints()>10){
799 if (iter==0) fdriftA.EvalRobust(0.7);
800 else fdriftA.EvalRobust(0.8);
801 fdriftA.GetParameters(fitA);
802 npointsA= fdriftA.GetNpoints();
803 chi2A = fdriftA.GetChisquare()/fdriftA.GetNpoints();
804 if (chi2A<kChi2Cut ||(*fFitAside)[0]==0 ) {
805 if (fFitAside->GetNoElements()<5) fFitAside->ResizeTo(5);
806 (*fFitAside)[0] = fitA[0];
807 (*fFitAside)[1] = fitA[1];
808 (*fFitAside)[2] = fitA[2];
809 (*fFitAside)[3] = fdriftA.GetNpoints();
810 (*fFitAside)[4] = chi2A;
813 if (fdriftC.GetNpoints()>10){
815 if (iter==0) fdriftC.EvalRobust(0.7);
816 else fdriftC.EvalRobust(0.8);
818 fdriftC.GetParameters(fitC);
819 npointsC= fdriftC.GetNpoints();
820 chi2C = fdriftC.GetChisquare()/fdriftC.GetNpoints();
821 if (chi2C<kChi2Cut||(*fFitCside)[0]==0) {
822 if (fFitCside->GetNoElements()<5) fFitCside->ResizeTo(5);
823 (*fFitCside)[0] = fitC[0];
824 (*fFitCside)[1] = fitC[1];
825 (*fFitCside)[2] = fitC[2];
826 (*fFitCside)[3] = fdriftC.GetNpoints();
827 (*fFitCside)[4] = chi2C;
831 if (fdriftAC.GetNpoints()>10&&fdriftC.GetNpoints()>10&&fdriftA.GetNpoints()>10){
833 if (iter==0) fdriftAC.EvalRobust(0.7);
834 else fdriftAC.EvalRobust(0.8);
836 fdriftAC.GetParameters(fitAC);
837 npointsAC= fdriftAC.GetNpoints();
838 chi2AC = fdriftAC.GetChisquare()/fdriftAC.GetNpoints();
839 if (chi2AC<kChi2Cut||(*fFitACside)[0]==0) (*fFitACside) = fitAC;
842 for (Int_t id=0; id<336; id++){
843 if (!fTracksEsdParam.At(id)) continue;
845 AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id);
846 AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id);
852 param->GetPxPyPz(pxyz);
854 ltrp->GetPxPyPz(lpxyz);
855 Double_t zlength = tpcparam->GetZLength(0);
856 Double_t ldrift = zlength-TMath::Abs(lxyz[2]);
857 Double_t mdrift = zlength-TMath::Abs(xyz[2]);
860 if (ltrp->GetSide()==0){
861 fz = (fitA)[0]+(fitA)[1]*ldrift+(fitA)[2]*lxyz[1]*ldrift/(zlength*250.);
863 fz = (fitC)[0]+(fitC)[1]*ldrift+(fitC)[2]*lxyz[1]*ldrift/(zlength*250.);
866 fz = (fitAC)[0]+(fitAC)[1]*ltrp->GetSide()+(fitAC)[2]*ldrift+(fitAC)[3]*lxyz[1]*ldrift/(zlength*250.);
871 TTreeSRedirector *cstream = GetDebugStreamer();
872 TTimeStamp tstamp(fTime);
873 Float_t valuePressure0 = AliTPCcalibDB::GetPressure(tstamp,fRun,0);
874 Float_t valuePressure1 = AliTPCcalibDB::GetPressure(tstamp,fRun,1);
875 Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0);
876 Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1);
877 Double_t temp0 = AliTPCcalibDB::GetTemperature(tstamp,fRun,0);
878 Double_t temp1 = AliTPCcalibDB::GetTemperature(tstamp,fRun,1);
879 TVectorD vecGoofie(20);
880 AliDCSSensorArray* goofieArray = AliTPCcalibDB::Instance()->GetGoofieSensors(fRun);
882 for (Int_t isensor=0; isensor<goofieArray->NumSensors();isensor++){
883 AliDCSSensor *gsensor = goofieArray->GetSensor(isensor);
884 if (gsensor) vecGoofie[isensor]=gsensor->GetValue(tstamp);
888 (*cstream)<<"driftv"<<
889 "run="<<fRun<< // run number
890 "event="<<fEvent<< // event number
891 "time="<<fTime<< // time stamp of event
892 "trigger="<<fTrigger<< // trigger
893 "mag="<<fMagF<< // magnetic field
894 // Environment values
895 "press0="<<valuePressure0<<
896 "press1="<<valuePressure1<<
897 "pt0="<<ptrelative0<<
898 "pt1="<<ptrelative1<<
901 "vecGoofie.="<<&vecGoofie<<
905 "driftA.="<<fFitAside<<
906 "driftC.="<<fFitCside<<
907 "driftAC.="<<fFitACside<<
919 Bool_t AliTPCcalibLaser::FitDriftV(Float_t minFraction){
921 // Fit corrections to the drift velocity - linear approximation in the z and global y
922 //The transfromatiom from the drift time to the z position done in AliTPCTracnsform class
924 // Source of outlyers :
925 // 0. Track in the saturation - postpeak
926 // 1. gating grid close the part of the signal for first bundle
928 // The robust fit is performed in 2 itterations /robust fraction controlled by kFraction/
929 // 1. Robust fit is used in the itteration number 0
930 // only fraction of laser uted
931 // 2. Only the tracks close to the fit used in the second itteration
935 z = s* (z0 - vd*(t-t0))
939 vd - nominal drift velocity
940 zs - miscalibrated position
942 zs = s*(z0 - vd*(1+vr)*(t-(t0+dt))
943 vr - relative change of the drift velocity
948 zs ~ z - s*vr*(z0-s*z)+s*dzt
949 --------------------------------
950 1. Correction function vr constant:
953 dz = zs-z = -s*vr *(z0-s*z)+s*dzt
954 dzs/dl = dz/dl +s*s*vr*dz/dl
957 const Int_t knLaser = 336; //n laser tracks
958 const Float_t kFraction[2] = {0.70,0.95}; // robust fit fraction
960 const Float_t kSaturCut = 0.05; // remove saturated lasers - cut on fraction of saturated
961 const Float_t kDistCut = 3.; // distance sigma cut - 3 sigma
962 const Float_t kDistCutAbs = 1.; // absolute cut 1 cm
963 const Float_t kMinClusters = 60.; // minimal amount of the clusters
964 const Float_t kMinSignal = 10.; // minimal mean height of the signal
965 const Float_t kChi2Cut = 1.0; // chi2 cut to accept drift fit
967 static TLinearFitter fdriftA(3,"hyp2");
968 static TLinearFitter fdriftC(3,"hyp2");
969 static TLinearFitter fdriftAC(4,"hyp3");
970 TVectorD fitA(3),fitC(3),fitAC(4);
972 AliTPCcalibDB* calib=AliTPCcalibDB::Instance();
973 AliTPCParam * tpcparam = calib->GetParameters();
977 for (Int_t id=0; id<336; id++) fFitZ[id]=0;
978 if (fFitAside->GetNoElements()<5) fFitAside->ResizeTo(5);
979 if (fFitCside->GetNoElements()<5) fFitCside->ResizeTo(5);
980 for (Int_t i=0;i<5; i++){
992 Int_t nbA[4]={0,0,0,0};
993 Int_t nbC[4]={0,0,0,0};
994 TVectorD vecZM(336); // measured z potion of laser
995 TVectorD vecA(336); // accepted laser
996 TVectorD vecZF(336); // fitted position
997 TVectorD vecDz(336); // deltaZ
998 TVectorD vecZS(336); // surveyed position of laser
999 // additional variable to cut
1000 TVectorD vecdEdx(336); // dEdx
1001 TVectorD vecSy(336); // shape y
1002 TVectorD vecSz(336); // shape z
1005 for (Int_t id=0; id<336; id++){
1007 AliTPCLaserTrack *ltrp =
1008 (AliTPCLaserTrack*)AliTPCLaserTrack::GetTracks()->UncheckedAt(id);
1009 AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id);
1010 AliTPCseed * seed = (AliTPCseed*)fTracksTPC.At(id);
1011 vecZM(id)= (param==0) ? 0:param->GetZ();
1012 vecZS(id)= ltrp->GetZ();
1015 vecdEdx(id)=(seed)?seed->GetdEdx():0;
1016 vecSy(id) =(seed)?seed->CookShape(1):0;
1017 vecSz(id) =(seed)?seed->CookShape(2):0;
1020 if (!fTracksEsdParam.At(id)) reject|=1;
1021 if (!param) continue;
1022 if (!AcceptLaser(id)) reject|=2;
1023 if ( fClusterSatur[id]>kSaturCut) reject|=4;
1024 if ( fClusterCounter[id]<kMinClusters) reject|=8;
1026 if (reject>0) continue;
1027 if (ltrp->GetSide()==0){
1029 nbA[ltrp->GetBundle()]++;
1031 if (ltrp->GetSide()==1){
1033 nbC[ltrp->GetBundle()]++;
1037 // reject "bad events"
1042 if (npointsA<minFraction*0.5*knLaser && npointsC<minFraction*0.5*knLaser)
1044 for (Int_t i=0;i<4;i++){
1045 //count accepted for all layers
1046 if (nbA[i]>minFraction*0.5*0.25*knLaser) naA++;
1047 if (nbC[i]>minFraction*0.5*0.25*knLaser) naC++;
1049 if (naA<3 &&naC<3) isOK=kFALSE;
1050 if (isOK==kFALSE) return kFALSE;
1055 for (Int_t iter=0; iter<2; iter++){
1056 fdriftA.ClearPoints();
1057 fdriftC.ClearPoints();
1058 fdriftAC.ClearPoints();
1059 npointsA=0; npointsC=0; npointsAC=0;
1061 for (Int_t id=0; id<336; id++){
1062 if (!fTracksEsdParam.At(id)) continue;
1063 if (!AcceptLaser(id)) continue;
1064 if ( fClusterSatur[id]>kSaturCut) continue;
1065 if ( fClusterCounter[id]<kMinClusters) continue;
1066 AliESDtrack *track = (AliESDtrack*)fTracksEsd.At(id);
1067 if (track->GetTPCsignal()<kMinSignal) continue;
1068 AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id);
1069 AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id);
1075 param->GetPxPyPz(pxyz);
1077 ltrp->GetPxPyPz(lpxyz);
1078 Float_t sz = (ltrp->GetSide()==0) ? TMath::Sqrt(chi2A): TMath::Sqrt(chi2C);
1079 if (npointsAC>0) sz =TMath::Sqrt(chi2AC);
1080 if (iter>0 && TMath::Abs(fFitZ[id])>sz*kDistCut) continue;
1081 if (iter>0 && TMath::Abs(fFitZ[id])>kDistCutAbs) continue;
1083 // // drift distance
1084 // Double_t zlength = tpcparam->GetZLength(0);
1085 // Double_t ldrift = zlength-TMath::Abs(lxyz[2]);
1086 // Double_t mdrift = zlength-TMath::Abs(xyz[2]);
1088 Double_t zlength = (ltrp->GetSide()==0)? tpcparam->GetZLength(36): tpcparam->GetZLength(71);
1089 Double_t ldrift = (ltrp->GetSide()==0)?zlength-lxyz[2]:lxyz[2]+zlength;
1090 Double_t mdrift = (ltrp->GetSide()==0)?zlength-xyz[2]:xyz[2]+zlength;
1093 Double_t xxx[2] = {ldrift,lxyz[1]*ldrift/(zlength*250.)};
1094 if (iter==0 &<rp->GetBundle()==0) continue;
1095 // skip bundle 0 - can be wrong in the 0 iteration
1096 if (ltrp->GetSide()==0){
1097 fdriftA.AddPoint(xxx,mdrift,1);
1099 fdriftC.AddPoint(xxx,mdrift,1);
1101 Double_t xxx2[3] = {ltrp->GetSide(), ldrift,lxyz[1]*ldrift/(zlength*250.)};
1102 fdriftAC.AddPoint(xxx2,mdrift,1);
1105 if (fdriftA.GetNpoints()>minFraction*0.5*knLaser){
1108 npointsA= fdriftA.GetNpoints();
1109 chi2A = fdriftA.GetChisquare()/fdriftA.GetNpoints();
1110 fdriftA.EvalRobust(kFraction[iter]);
1111 fdriftA.GetParameters(fitA);
1112 if (chi2A<kChi2Cut ||(*fFitAside)[0]==0 ) {
1113 if (fFitAside->GetNoElements()<5) fFitAside->ResizeTo(5);
1114 (*fFitAside)[0] = fitA[0];
1115 (*fFitAside)[1] = fitA[1];
1116 (*fFitAside)[2] = fitA[2];
1117 (*fFitAside)[3] = fdriftA.GetNpoints();
1118 (*fFitAside)[4] = chi2A;
1121 if (fdriftC.GetNpoints()>minFraction*0.5*knLaser){
1123 npointsC= fdriftC.GetNpoints();
1124 chi2C = fdriftC.GetChisquare()/fdriftC.GetNpoints();
1125 fdriftC.EvalRobust(kFraction[iter]);
1126 fdriftC.GetParameters(fitC);
1127 if (chi2C<kChi2Cut||(*fFitCside)[0]==0) {
1128 if (fFitCside->GetNoElements()<5) fFitCside->ResizeTo(5);
1129 (*fFitCside)[0] = fitC[0];
1130 (*fFitCside)[1] = fitC[1];
1131 (*fFitCside)[2] = fitC[2];
1132 (*fFitCside)[3] = fdriftC.GetNpoints();
1133 (*fFitCside)[4] = chi2C;
1137 if (fdriftAC.GetNpoints()>minFraction*knLaser &&npointsA>0.5*minFraction*knLaser&&npointsC>0.5*minFraction*knLaser){
1139 npointsAC= fdriftAC.GetNpoints();
1140 chi2AC = fdriftAC.GetChisquare()/fdriftAC.GetNpoints();
1141 fdriftAC.EvalRobust(kFraction[iter]);
1142 fdriftAC.GetParameters(fitAC);
1143 if (chi2AC<kChi2Cut||(*fFitACside)[0]==0) (*fFitACside) = fitAC;
1144 (*fFitACside)[0] = fitAC[0];
1145 (*fFitACside)[1] = fitAC[1];
1146 (*fFitACside)[2] = fitAC[2];
1147 (*fFitACside)[3] = fdriftAC.GetNpoints();
1148 (*fFitACside)[4] = chi2AC;
1151 for (Int_t id=0; id<336; id++){
1152 if (!fTracksEsdParam.At(id)) continue;
1154 AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id);
1155 AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id);
1161 param->GetPxPyPz(pxyz);
1163 ltrp->GetPxPyPz(lpxyz);
1164 //Double_t zlength = tpcparam->GetZLength(0);
1165 //Double_t ldrift = zlength-TMath::Abs(lxyz[2]);
1166 //Double_t mdrift = zlength-TMath::Abs(xyz[2]);
1167 Double_t zlength = (ltrp->GetSide()==0)? tpcparam->GetZLength(36): tpcparam->GetZLength(71);
1168 Double_t ldrift = (ltrp->GetSide()==0)?zlength-lxyz[2]:lxyz[2]+zlength;
1169 Double_t mdrift = (ltrp->GetSide()==0)?zlength-xyz[2]:xyz[2]+zlength;
1173 if (ltrp->GetSide()==0){
1174 fz = (fitA)[0]+(fitA)[1]*ldrift+(fitA)[2]*lxyz[1]*ldrift/(zlength*250.);
1176 fz = (fitC)[0]+(fitC)[1]*ldrift+(fitC)[2]*lxyz[1]*ldrift/(zlength*250.);
1179 //fz = (fitAC)[0]+(fitAC)[1]*ltrp->GetSide()+(fitAC)[2]*ldrift+(fitAC)[3]*lxyz[1]*ldrift/(zlength*250.);
1181 fFitZ[id]=mdrift-fz;
1183 vecDz[id]=mdrift-fz;
1185 if (fStreamLevel>0){
1186 TTreeSRedirector *cstream = GetDebugStreamer();
1187 TTimeStamp tstamp(fTime);
1188 Float_t valuePressure0 = AliTPCcalibDB::GetPressure(tstamp,fRun,0);
1189 Float_t valuePressure1 = AliTPCcalibDB::GetPressure(tstamp,fRun,1);
1190 Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0);
1191 Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1);
1192 Double_t temp0 = AliTPCcalibDB::GetTemperature(tstamp,fRun,0);
1193 Double_t temp1 = AliTPCcalibDB::GetTemperature(tstamp,fRun,1);
1194 TVectorD vecGoofie(20);
1195 AliDCSSensorArray* goofieArray = AliTPCcalibDB::Instance()->GetGoofieSensors(fRun);
1197 for (Int_t isensor=0; isensor<goofieArray->NumSensors();isensor++){
1198 AliDCSSensor *gsensor = goofieArray->GetSensor(isensor);
1199 if (gsensor) vecGoofie[isensor]=gsensor->GetValue(tstamp);
1203 (*cstream)<<"driftvN"<<
1204 "run="<<fRun<< // run number
1205 "event="<<fEvent<< // event number
1206 "time="<<fTime<< // time stamp of event
1207 "trigger="<<fTrigger<< // trigger
1208 "mag="<<fMagF<< // magnetic field
1209 // Environment values
1210 "press0="<<valuePressure0<<
1211 "press1="<<valuePressure1<<
1212 "pt0="<<ptrelative0<<
1213 "pt1="<<ptrelative1<<
1216 "vecGoofie.="<<&vecGoofie<<
1219 "vecZM.="<<&vecZM<< // measured z position
1220 "vecZS.="<<&vecZS<< // surveyed z position
1221 "vecZF.="<<&vecZF<< // fitted z position
1222 "vecDz.="<<&vecDz<< // fitted z position
1223 "vecA.="<<&vecA<< // accept laser flag
1224 "vecdEdx.="<<&vecdEdx<< // dEdx - to cut on
1225 "vecSy.="<<&vecSy<< // shape y - to cut on
1226 "vecSz.="<<&vecSz<< // shape z - to cut on
1229 "driftA.="<<fFitAside<<
1230 "driftC.="<<fFitCside<<
1231 "driftAC.="<<fFitACside<<
1241 variables to check in debug mode:
1243 chainDriftN->SetAlias("driftS","250-abs(vecZS.fElements)");
1244 chainDriftN->SetAlias("driftM","250-abs(vecZM.fElements)");
1245 chainDriftN->SetAlias("driftF","vecZF.fElements");
1246 chainDriftN->SetAlias("deltaZ","driftF-driftM"); //deltaZ
1247 TCut cutA="iter==1&&sqrt(chi2A)<0.1&&vecZS.fElements>0&&vecA.fElements==0";
1248 TCut cutC="iter==1&&sqrt(chi2C)<0.1&&vecZS.fElements<0&&vecA.fElements==0";
1257 Float_t AliTPCcalibLaser::GetDistance(AliExternalTrackParam *param, AliTPCLaserTrack *ltrp){
1259 // get distance between mirror and laser track
1270 dist+=TMath::Abs((TMath::ATan2(xyz[1],xyz[0])-TMath::ATan2(lxyz[1],lxyz[0]))*param->GetX());
1273 // apply drift correction if already exist
1276 if (ltrp->GetSide()==0){
1277 if ((*fFitAside)[1]>0.) dz = ((*fFitAside)[0]+(*fFitAside)[1]*lxyz[2]+(*fFitAside)[2]*lxyz[1])-xyz[2];
1279 if ((*fFitCside)[1]>0.) dz = ((*fFitCside)[0]+(*fFitCside)[1]*lxyz[2]+(*fFitCside)[2]*lxyz[1])-xyz[2];
1281 if (TMath::Abs(dz)>3*(TMath::Abs(lxyz[2]-xyz[2])+1)) dz= TMath::Abs(lxyz[2]-xyz[2]);
1282 dist+=TMath::Abs(dz);
1284 // phi dist - divergence on 50 cm
1286 dist = TMath::Abs((param->GetParameter()[2]-ltrp->GetParameter()[2])*50);
1291 Bool_t AliTPCcalibLaser::AcceptLaser(Int_t id){
1296 TCut cutP0("cutP0","abs((atan2(x1,x0)-atan2(lx1,lx0))*254)<1.5");
1297 TCut cutP1("cutP1","abs(LTr.fP[1]-Tr.fP[1])<30");
1298 TCut cutP2("cutP2","abs(LTr.fP[2]-Tr.fP[2])<0.03");
1299 TCut cutP3("cutP3","abs(Tr.fP[3])<0.05");
1301 TCut cutA = cutP0+cutP1+cutP2+cutP3+cutP4;
1303 AliExternalTrackParam *param =(AliExternalTrackParam*)fTracksEsdParam.At(id);
1304 AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id);
1305 //AliESDtrack *track = (AliESDtrack*)fTracksEsd.At(id);
1310 if (TMath::Abs((TMath::ATan2(xyz[1],xyz[0])-TMath::ATan2(lxyz[1],lxyz[0]))*254)>1.5) return kFALSE; //cut y- P0
1311 if (TMath::Abs(param->GetParameter()[1]-ltrp->GetParameter()[1])>30) return kFALSE; // cutZ -P1
1312 if (TMath::Abs(param->GetParameter()[2]-ltrp->GetParameter()[2])>0.03) return kFALSE; // cut -P2
1313 if (TMath::Abs(param->GetParameter()[3])>0.05) return kFALSE; // cut Tl -P3
1320 Int_t AliTPCcalibLaser::FindMirror(AliESDtrack *track, AliTPCseed *seed){
1322 // Find corresponding mirror
1323 // add the corresponding tracks
1325 if (!track->GetOuterParam()) return -1;
1327 Float_t kRadius0 = 252;
1328 Float_t kRadius = 254.2;
1330 Float_t counterSatur=0;
1333 for (Int_t irow=158;irow>-1;--irow) {
1334 AliTPCclusterMI *c=seed->GetClusterPointer(irow);
1336 Double_t pedgeY = c->GetX()*TMath::DegToRad()*(10)-TMath::Abs(c->GetY());
1337 Double_t pedgeX = TMath::Min((irow)*0.75, (159.-irow)*1.5);
1338 if (pedgeY<3) continue;
1339 if (pedgeX<3) continue;
1341 if (c->GetDetector()%36<18) csideA++;
1342 if (c->GetDetector()%36>=18) csideC++;
1343 if (c->GetMax()>900) counterSatur++;
1345 counterSatur/=(countercl+1);
1349 if (csideA<0.9*seed->GetNumberOfClusters() && csideC<0.9*seed->GetNumberOfClusters()) return 0; // cross laser track can not happen
1352 if (csideC>0.5*seed->GetNumberOfClusters()) side=1;
1355 AliExternalTrackParam param(*(track->GetOuterParam()));
1356 AliTracker::PropagateTrackTo(¶m,kRadius0,0.10566,3,kTRUE);
1357 AliTracker::PropagateTrackTo(¶m,kRadius,0.10566,0.1,kTRUE);
1358 AliTPCLaserTrack ltr;
1359 AliTPCLaserTrack *ltrp=0x0;
1360 // AliTPCLaserTrack *ltrpjw=0x0;
1362 Int_t id = AliTPCLaserTrack::IdentifyTrack(¶m,side);
1363 // Int_t idjw = AliTPCLaserTrack::IdentifyTrackJW(¶m);
1364 //AliDebug(4,Form("Identified Track: %03d (%03d)",id,idjw));
1366 if (id!=-1 && (AliTPCLaserTrack::GetTracks()->UncheckedAt(id)))
1367 ltrp=(AliTPCLaserTrack*)AliTPCLaserTrack::GetTracks()->UncheckedAt(id);
1371 if (id<0) return -1;
1372 if (ltrp->GetSide()!=side) return -1;
1378 if (counterSatur>fClusterSatur[id]) fClusterSatur[id]=counterSatur;
1381 Float_t radius=TMath::Abs(ltrp->GetX());
1382 param.Rotate(ltrp->GetAlpha());
1383 AliTracker::PropagateTrackTo(¶m,radius,0.10566,0.01,kFALSE);
1385 if (!fTracksMirror.At(id)) fTracksMirror.AddAt(ltrp,id);
1386 Bool_t accept=kTRUE;
1388 // choose closer track
1390 AliExternalTrackParam * param0 = (AliExternalTrackParam *)fTracksEsdParam.At(id);
1392 Float_t dist0=GetDistance(param0,ltrp);
1393 Float_t dist1=GetDistance(¶m,ltrp);
1394 if (dist0<dist1) accept=kFALSE;
1398 fClusterCounter[id]=countercl;
1399 fTracksEsdParam.AddAt(param.Clone(),id);
1400 fTracksEsd.AddAt(track,id);
1401 fTracksTPC.AddAt(seed,id);
1408 void AliTPCcalibLaser::DumpLaser(Int_t id) {
1410 // Dump Laser info to the tree
1412 AliESDtrack *track = (AliESDtrack*)fTracksEsd.At(id);
1413 AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id);
1414 AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id);
1423 param->GetPxPyPz(pxyz);
1425 ltrp->GetPxPyPz(lpxyz);
1426 Float_t dist3D = GetDistance(param,ltrp);
1427 Float_t dist0 = (TMath::ATan2(xyz[1],xyz[0])-TMath::ATan2(lxyz[1],lxyz[0]))*param->GetX();
1428 Float_t distphi = (param->GetParameter()[2]-ltrp->GetParameter()[2])*50;
1431 if (fStreamLevel>0){
1432 TTreeSRedirector *cstream = GetDebugStreamer();
1433 Int_t time = fESD->GetTimeStamp();
1434 Bool_t accept = AcceptLaser(id);
1436 (*cstream)<<"Track"<<
1438 "run="<<fRun<< // run number
1439 "event="<<fEvent<< // event number
1440 "time="<<fTime<< // time stamp of event
1441 "trigger="<<fTrigger<< // trigger
1442 "mag="<<fMagF<< // magnetic field
1446 "driftA.="<<fFitAside<<
1447 "driftC.="<<fFitCside<<
1451 "distphi="<<distphi<<
1454 "counter="<<fCounter[id]<<
1455 "clcounter="<<fClusterCounter[id]<<
1456 "satur="<<fClusterSatur[id]<<
1480 void AliTPCcalibLaser::RefitLaserJW(Int_t id){
1482 // Refit the track with different tracklet models:
1483 // 1. Per ROC using the kalman filter, different edge cuts
1484 // 2. Per ROC linear in y and z
1485 // 3. Per ROC quadratic in y and z
1486 // 4. Per track offset for each sector, linear for each sector, common quadratic
1487 // store x, y, z information for all models and the cluster to calculate the residuals
1490 // The clusters which do not fulfill given criteria are skipped
1492 // Cluters removed from fit
1493 // 1. Extended shape > kShapeCut
1494 // 2. In saturation Max > kMax
1495 // 3. Distance to edge < cutEdge
1497 // Clusters not used for the calibration:
1499 // 1. Extended shape > kShapeCut
1500 // 2. In saturation Max > kMax
1503 AliTPCseed *track = (AliTPCseed*)fTracksTPC.At(id);
1504 AliExternalTrackParam *extparam=(AliExternalTrackParam*)fTracksEsdParam.At(id);
1505 AliTPCLaserTrack *ltrp = (AliTPCLaserTrack*)fTracksMirror.At(id);
1507 AliTPCclusterMI dummyCl;
1510 Int_t kMaxTracklets=2;
1511 Float_t kShapeCut = 1.3;
1512 Float_t kRatioCut = 2.;
1514 Float_t kMax = 900.;
1517 //=============================================//
1518 // Linear Fitters for the Different Approaches //
1519 //=============================================//
1520 //linear fit model in y and z; inner - outer sector, combined with offset
1521 static TLinearFitter fy1I(2,"hyp1");
1522 static TLinearFitter fy1O(2,"hyp1");
1523 static TLinearFitter fz1I(2,"hyp1");
1524 static TLinearFitter fz1O(2,"hyp1");
1525 static TLinearFitter fy1IO(3,"hyp2");
1526 static TLinearFitter fz1IO(3,"hyp2");
1527 //quadratic fit model in y and z; inner - sector
1528 static TLinearFitter fy2I(3,"hyp2");
1529 static TLinearFitter fy2O(3,"hyp2");
1530 static TLinearFitter fz2I(3,"hyp2");
1531 static TLinearFitter fz2O(3,"hyp2");
1532 //common quadratic fit for IROC and OROC in y and z
1533 static TLinearFitter fy4(5,"hyp4");
1534 static TLinearFitter fz4(5,"hyp4");
1544 //=============================//
1545 // Loop over all Tracklet Cuts //
1546 //=============================//
1547 for (Int_t icut=0; icut<fNcuts; icut++){
1548 Float_t xinMin = 2500, xinMax=-90;
1549 Float_t xoutMin=2500, xoutMax=-90;
1550 Float_t msigmaYIn=0;
1551 Float_t msigmaYOut=0;
1552 Float_t mqratioIn=0;
1553 Float_t mqratioOut=0;
1556 AliDebug(4,Form("Processing cut %d for track with ID %d",icut,id));
1558 Double_t edgeCutX = fEdgeXcuts[icut];
1559 Double_t edgeCutY = fEdgeYcuts[icut];
1560 Int_t nclCut = (Int_t)fNClCuts[icut];
1561 //=========================//
1562 // Parameters to calculate //
1563 //=========================//
1564 //fit parameter inner, outer tracklet and combined fit
1565 TVectorD vecy1resInner(2),vecz1resInner(2); //pol1 fit parameters inner
1566 TVectorD vecy2resInner(3),vecz2resInner(3); //pol2 fit parameters inner
1568 TVectorD vecy1resOuter(2),vecz1resOuter(2); //pol1 fit parameters outer
1569 TVectorD vecy2resOuter(3),vecz2resOuter(3); //pol2 fit parameters outer
1570 TVectorD vecy4res(5),vecz4res(5);
1571 TVectorD vecy1resIO(3),vecz1resIO(3);
1572 // cluster and track positions for each row - used for residuals
1573 TVectorD vecgX(159); // global X
1574 TVectorD vecgY(159); // global Y
1575 TVectorD vecgZ(159); // global Z
1577 TVectorD vecX(159); // x is the same for all (row center)
1578 TVectorD vecYkalman(159); // y from kalman fit
1579 TVectorD vecZkalman(159); // z from kalman fit
1580 TVectorD vecY1(159); // y from pol1 fit per ROC
1581 TVectorD vecZ1(159); // z from pol1 fit per ROC
1582 TVectorD vecY1IO(159); // y from pol1 fit per ROC
1583 TVectorD vecZ1IO(159); // z from pol1 fit per ROC
1584 TVectorD vecY2(159); // y from pol2 fit per ROC
1585 TVectorD vecZ2(159); // z from pol2 fit per ROC
1586 TVectorD vecY4(159); // y from sector fit
1587 TVectorD vecZ4(159); // z from sector fit
1588 TVectorD vecClY(159); // y cluster position
1589 TVectorD vecClZ(159); // z cluster position
1590 TVectorD vecSec(159); // sector for each row
1591 TVectorD isReject(159); // flag - cluster to be rejected
1593 Double_t chi2I1z=0; // chi2 of pol1 fit in z (inner)
1594 Double_t chi2I1y=0; // chi2 of pol1 fit in y (inner)
1595 Double_t chi2O1z=0; // chi2 of pol1 fit in z (outer)
1596 Double_t chi2O1y=0; // chi2 of pol1 fit in y (outer)
1597 Double_t chi2IO1z=0; // chi2 of pol1 fit in z (outer)
1598 Double_t chi2IO1y=0; // chi2 of pol1 fit in y (outer)
1599 Double_t chi2I2z=0; // chi2 of pol2 fit in z (inner)
1600 Double_t chi2I2y=0; // chi2 of pol2 fit in y (inner)
1601 Double_t chi2O2z=0; // chi2 of pol2 fit in z (outer)
1602 Double_t chi2O2y=0; // chi2 of pol2 fit in y (outer)
1603 Double_t chi2IOz=0; // chi2 of hyp4 fit in z (inner+outer)
1604 Double_t chi2IOy=0; // chi2 of hyp4 fit in y (inner+outer)
1606 Int_t innerSector = -1; // number of inner sector
1607 Int_t outerSector = -1; // number of outer sector
1608 Int_t nclI=0; // number of clusters (inner)
1609 Int_t nclO=0; // number of clusters (outer)
1610 //=================================================//
1611 // Perform the Kalman Fit using the Tracklet Class //
1612 //=================================================//
1613 AliTPCTracklet::SetEdgeCut(edgeCutX,edgeCutY);
1614 TObjArray tracklets=
1615 AliTPCTracklet::CreateTracklets(track,AliTPCTracklet::kKalman,
1616 kFALSE,nclCut,kMaxTracklets);
1617 // tracklet pointers
1618 AliTPCTracklet *trInner = (AliTPCTracklet*)tracklets.At(0);
1619 AliTPCTracklet *trOuter = (AliTPCTracklet*)tracklets.At(1);
1620 AliTPCTracklet *tr=0x0;
1621 AliTPCTracklet dummy;
1622 //continue if we didn't find a tracklet
1623 if ( !trInner && !trOuter ) continue;
1624 //================================================================================//
1625 // Swap Inner and Outer if necessary (inner sector is definde by smaller local x) //
1626 //================================================================================//
1627 if ( trInner && trOuter ){
1628 if ( !trInner->GetInner() || !trOuter->GetInner() ) continue;
1629 if ( trInner->GetInner()->GetX() > trOuter->GetInner()->GetX() ){
1633 AliDebug(5,Form("Swapped Sectors: %02d (%f) <-> %02d (%f)", trOuter->GetSector(), trOuter->GetInner()->GetX(), trInner->GetSector(), trInner->GetInner()->GetX()));
1637 if ( !trInner->GetInner() ) continue;
1639 if ( trInner->GetSector()>35 ){
1644 if ( !trOuter->GetInner() ) continue;
1646 if ( trOuter->GetSector()<36 ){
1652 innerSector = trInner->GetSector();
1653 if ( innerSector>=0 ) AliDebug(5,Form("Found inner Sector %02d at X %.2f", innerSector, trInner->GetInner()->GetX()));
1654 outerSector = trOuter->GetSector();
1655 if ( outerSector>=0 ) AliDebug(5,Form("Found outer Sector %02d at X %.2f", outerSector, trOuter->GetInner()->GetX()));
1657 // array of clusters
1658 TClonesArray arrCl("AliTPCclusterMI",159);
1659 arrCl.ExpandCreateFast(159);
1660 //=======================================//
1661 // fill fitters with cluster information //
1662 //=======================================//
1663 AliDebug(3,"Filing Cluster Information");
1668 for (Int_t irow=158;irow>-1;--irow) {
1669 AliTPCclusterMI *c=track->GetClusterPointer(irow);
1670 AliTPCclusterMI &cl = (AliTPCclusterMI&) (*arrCl[irow]);
1675 Float_t meanY=0, sumY=0;
1676 for (Int_t drow=-1;drow<=1;drow++) {
1677 if (irow+drow<0) continue;
1678 if (irow+drow>158) continue;
1679 AliTPCclusterMI *ccurrent=track->GetClusterPointer(irow);
1680 if (!ccurrent) continue;
1681 Int_t roc = static_cast<Int_t>(ccurrent->GetDetector());
1682 if ( roc!=innerSector && roc!=outerSector ) continue;
1683 if (ccurrent->GetX()<10) continue;
1684 if (ccurrent->GetY()==0) continue;
1685 meanY+=ccurrent->GetY();
1688 if (sumY>0) meanY/=sumY;
1693 Double_t pedgeY = c->GetX()*TMath::Tan(TMath::DegToRad()*(10))-TMath::Abs(meanY);
1694 Double_t pedgeX = TMath::Min((irow)*0.75, (159.-irow)*1.5);
1697 Int_t roc = static_cast<Int_t>(c->GetDetector());
1698 if ( roc!=innerSector && roc!=outerSector ) continue;
1700 //store clusters in clones array
1703 if (c->GetMax()<4) continue; // noise cluster?
1704 if (TMath::Abs(c->GetY())<0.0001) continue; // noise cluster?
1706 vecX[irow] = c->GetX();
1707 vecClY[irow] = c->GetY();
1708 vecClZ[irow] = c->GetZ();
1711 // c->GetGlobalXYZ(gxyz);
1712 // vecgX[irow] = gxyz[0];
1713 // vecgY[irow] = gxyz[1];
1714 // vecgZ[irow] = gxyz[2];
1716 Double_t x = vecX[irow]-133.4; //reference is between IROC and OROC
1717 Double_t y = vecClY[irow];
1718 Double_t z = vecClZ[irow];
1720 Double_t x2[2]={x,x*x}; //linear and parabolic parameters
1721 Double_t x4[4]={0,0,0,0}; //hyp4 parameters
1722 Double_t xIO[2]={0,x}; //common linear + offset IROC-OROC
1723 if ( roc == innerSector ) {
1724 x4[0]=1; //offset inner - outer sector
1725 x4[1]=x; //slope parameter inner sector
1728 x4[2]=x; //slope parameter outer sector
1730 x4[3]=x*x; //common parabolic shape
1731 if (pedgeX < fEdgeXcuts[icut]) continue;
1732 if (pedgeY < fEdgeYcuts[icut]) continue;
1733 if (c->GetMax()>900) continue; // cluster in saturation
1735 if ( roc==innerSector ){
1736 fy1I.AddPoint(x2,y);
1737 fz1I.AddPoint(x2,z);
1738 fy2I.AddPoint(x2,y);
1739 fz2I.AddPoint(x2,z);
1741 if (c->GetX()<xinMin) xinMin=c->GetX();
1742 if (c->GetX()>xinMax) xinMax=c->GetX();
1744 msigmaYIn +=TMath::Sqrt(c->GetSigmaY2());
1745 mqratioIn +=c->GetMax()/c->GetQ();
1748 if ( roc==outerSector ){
1749 fy1O.AddPoint(x2,y);
1750 fz1O.AddPoint(x2,z);
1751 fy2O.AddPoint(x2,y);
1752 fz2O.AddPoint(x2,z);
1754 if (c->GetX()<xoutMin) xoutMin=c->GetX();
1755 if (c->GetX()>xoutMax) xoutMax=c->GetX();
1756 msigmaYOut +=TMath::Sqrt(c->GetSigmaY2());
1757 mqratioOut +=c->GetMax()/c->GetQ();
1762 fy1IO.AddPoint(xIO,y);
1763 fz1IO.AddPoint(xIO,z);
1773 //======================================//
1774 // Evaluate and retrieve fit parameters //
1775 //======================================//
1776 AliDebug(5,Form("Evaluating fits with inner (outer) Sec: %02d (%02d)",innerSector,outerSector));
1778 if ( (innerSector>-1) && (fy1I.GetNpoints()>0) ){
1783 fy1I.GetParameters(vecy1resInner);
1784 fz1I.GetParameters(vecz1resInner);
1785 fy2I.GetParameters(vecy2resInner);
1786 fz2I.GetParameters(vecz2resInner);
1787 chi2I1y=fy1I.GetChisquare()/(fy1I.GetNpoints()-2);
1788 chi2I1z=fz1I.GetChisquare()/(fz1I.GetNpoints()-2);
1789 chi2I2y=fy2I.GetChisquare()/(fy2I.GetNpoints()-3);
1790 chi2I2z=fz2I.GetChisquare()/(fz2I.GetNpoints()-3);
1793 if ( (outerSector>-1) && (fy1O.GetNpoints()>0) ){
1798 fy1O.GetParameters(vecy1resOuter);
1799 fz1O.GetParameters(vecz1resOuter);
1800 fy2O.GetParameters(vecy2resOuter);
1801 fz2O.GetParameters(vecz2resOuter);
1802 chi2O1y=fy1O.GetChisquare()/(fy1O.GetNpoints()-2);
1803 chi2O1z=fz1O.GetChisquare()/(fz1O.GetNpoints()-2);
1804 chi2O2y=fy2O.GetChisquare()/(fy2O.GetNpoints()-3);
1805 chi2O2z=fz2O.GetChisquare()/(fz2O.GetNpoints()-3);
1808 if ( innerSector>0 && outerSector>0 ){
1809 if (fy4.GetNpoints()>0) {
1811 fy4.GetParameters(vecy4res);
1812 chi2IOy=fy4.GetChisquare()/(fy4.GetNpoints()-5);
1814 if (fz4.GetNpoints()>0) {
1816 fz4.GetParameters(vecz4res);
1817 chi2IOz=fz4.GetChisquare()/(fz4.GetNpoints()-5);
1819 if (fy1IO.GetNpoints()>0) {
1821 fy1IO.GetParameters(vecy1resIO);
1822 chi2IO1y=fy1IO.GetChisquare()/(fy1IO.GetNpoints()-3);
1824 if (fz1IO.GetNpoints()>0) {
1826 fz1IO.GetParameters(vecz1resIO);
1827 chi2IO1z=fz1IO.GetChisquare()/(fz1IO.GetNpoints()-3);
1831 fy4.ClearPoints(); fz4.ClearPoints();
1832 fy1I.ClearPoints(); fy1O.ClearPoints();
1833 fz1I.ClearPoints(); fz1O.ClearPoints();
1834 fy2I.ClearPoints(); fy2O.ClearPoints();
1835 fz2I.ClearPoints(); fz2O.ClearPoints();
1836 fy1IO.ClearPoints(); fz1IO.ClearPoints();
1837 //==============================//
1838 // calculate tracklet positions //
1839 //==============================//
1840 AliDebug(4,"Calculate tracklet positions");
1841 for (Int_t irow=158;irow>-1;--irow) {
1843 AliTPCclusterMI *c=track->GetClusterPointer(irow);
1844 if ( vecSec[irow]!=innerSector && vecSec[irow]!=outerSector ) { // no cluster in given sectors
1848 if (!c) { //no cluster
1851 if (c->GetMax()>kMax){ //saturation
1854 if ( vecSec[irow] == outerSector ) { //extended shape
1855 if (c->GetMax()/c->GetQ()> mqratioOut*kRatioCut) isReject[irow]+=8;
1856 if (TMath::Sqrt(c->GetSigmaY2())>msigmaYOut*kShapeCut) isReject[irow]+=16;
1858 if (c->GetMax()/c->GetQ()> mqratioIn*kRatioCut) isReject[irow]+=8;
1859 if (TMath::Sqrt(c->GetSigmaY2())>msigmaYIn*kShapeCut) isReject[irow]+=16;
1865 if ( vecSec[irow]==-1 ) continue; //no cluster info
1866 if ( vecSec[irow]!=innerSector && vecSec[irow]!=outerSector ) continue;
1868 Double_t x=vecX[irow];
1869 Double_t xref=x-133.4;
1871 Double_t yoffInner=0;
1872 Double_t zoffInner=0;
1873 Double_t yoffInner1=0;
1874 Double_t zoffInner1=0;
1875 Double_t yslopeInner=0;
1876 Double_t yslopeOuter=0;
1877 Double_t zslopeInner=0;
1878 Double_t zslopeOuter=0;
1879 //positions of hyperplane fits
1880 if ( vecSec[irow] == outerSector ) {
1882 vecY1[irow]=vecy1resOuter[0]+vecy1resOuter[1]*xref;
1883 vecZ1[irow]=vecz1resOuter[0]+vecz1resOuter[1]*xref;
1884 vecY2[irow]=vecy2resOuter[0]+vecy2resOuter[1]*xref+vecy2resOuter[2]*xref*xref;
1885 vecZ2[irow]=vecz2resOuter[0]+vecz2resOuter[1]*xref+vecz2resOuter[2]*xref*xref;
1886 yslopeOuter=vecy4res[3];
1887 zslopeOuter=vecz4res[3];
1890 vecY1[irow]=vecy1resInner[0]+vecy1resInner[1]*xref;
1891 vecZ1[irow]=vecz1resInner[0]+vecz1resInner[1]*xref;
1892 vecY2[irow]=vecy2resInner[0]+vecy2resInner[1]*xref+vecy2resInner[2]*xref*xref;
1893 vecZ2[irow]=vecz2resInner[0]+vecz2resInner[1]*xref+vecz2resInner[2]*xref*xref;
1894 yoffInner=vecy4res[1];
1895 zoffInner=vecz4res[1];
1896 yoffInner1=vecy1resIO[1];
1897 zoffInner1=vecz1resIO[1];
1898 yslopeInner=vecy4res[2];
1899 zslopeInner=vecz4res[2];
1901 vecY1IO[irow]=vecy1resIO[0]+yoffInner1+vecy1resIO[2]*xref;
1902 vecZ1IO[irow]=vecz1resIO[0]+zoffInner1+vecz1resIO[2]*xref;
1903 vecY4[irow]=vecy4res[0]+yoffInner+yslopeInner*xref+yslopeOuter*xref+vecy4res[4]*xref*xref;
1904 vecZ4[irow]=vecz4res[0]+zoffInner+zslopeInner*xref+zslopeOuter*xref+vecz4res[4]*xref*xref;
1905 //positions of kalman fits
1906 Double_t gxyz[3],xyz[3];
1907 AliExternalTrackParam *param = 0x0;
1909 param=tr->GetInner();
1911 param->GetXYZ(gxyz);
1912 Float_t bz = AliTracker::GetBz(gxyz);
1913 param->GetYAt(x, bz, xyz[1]);
1914 param->GetZAt(x, bz, xyz[2]);
1915 vecYkalman[irow]=xyz[1];
1916 vecZkalman[irow]=xyz[2];
1923 //=====================================================================//
1924 // write results from the different tracklet fits with debug streamers //
1925 //=====================================================================//
1926 if (fStreamLevel>4){
1927 TTreeSRedirector *cstream = GetDebugStreamer();
1929 Float_t dedx = track->GetdEdx();
1930 (*cstream)<<"FitModels"<<
1931 "run="<<fRun<< // run number
1932 "event="<<fEvent<< // event number
1933 "time="<<fTime<< // time stamp of event
1934 "trigger="<<fTrigger<< // trigger
1935 "mag="<<fMagF<< // magnetic field
1938 "edgeCutX=" << edgeCutX <<
1939 "edgeCutY=" << edgeCutY <<
1940 "nclCut=" << nclCut <<
1941 "innerSector="<< innerSector <<
1942 "outerSector="<< outerSector <<
1945 "Tr.=" << extparam <<
1946 "yPol1In.=" << &vecy1resInner <<
1947 "zPol1In.=" << &vecz1resInner <<
1948 "yPol1InOut.="<< &vecy1resIO <<
1949 "zPol1InOut.="<< &vecz1resIO <<
1950 "yPol2In.=" << &vecy2resInner <<
1951 "zPol2In.=" << &vecz2resInner <<
1952 "yPol1Out.=" << &vecy1resOuter <<
1953 "zPol1Out.=" << &vecz1resOuter <<
1954 "yPol2Out.=" << &vecy2resOuter <<
1955 "zPol2Out.=" << &vecz2resOuter <<
1956 "yInOut.=" << &vecy4res <<
1957 "zInOut.=" << &vecz4res <<
1958 "chi2y1In=" << chi2I1y <<
1959 "chi2z1In=" << chi2I1z <<
1960 "chi2y1InOut="<< chi2IO1y <<
1961 "chi2z1InOut="<< chi2IO1z <<
1962 "chi2y1Out=" << chi2O1y <<
1963 "chi2z1Out=" << chi2O1z <<
1964 "chi2y2In=" << chi2I2y <<
1965 "chi2z2In=" << chi2I2z <<
1966 "chi2y2Out=" << chi2O2y <<
1967 "chi2z2Out=" << chi2O2z <<
1968 "chi2yInOut=" << chi2IOy <<
1969 "chi2zInOut=" << chi2IOz <<
1970 "trletIn.=" << trInner <<
1971 "trletOut.=" << trOuter <<
1974 "xinMin=" << xinMin<<
1975 "xinMax=" << xinMax<<
1976 "xoutMin=" << xoutMin<<
1977 "xoutMax=" << xoutMax<<
1978 "msigmaYIn=" <<msigmaYIn<<
1979 "msigmaYOut=" <<msigmaYOut<<
1980 "mqratioIn=" <<mqratioIn<<
1981 "mqratioOut=" << mqratioOut <<
1986 // wirte residuals information
1987 if (fStreamLevel>5){
1988 TTreeSRedirector *cstream = GetDebugStreamer();
1990 Float_t dedx = track->GetdEdx();
1991 (*cstream)<<"Residuals"<<
1992 "run="<<fRun<< // run number
1993 "event="<<fEvent<< // event number
1994 "time="<<fTime<< // time stamp of event
1995 "trigger="<<fTrigger<< // trigger
1996 "mag="<<fMagF<< // magnetic field
1999 "edgeCutX=" << edgeCutX <<
2000 "edgeCutY=" << edgeCutY <<
2001 "nclCut=" << nclCut <<
2003 "Tr.=" << extparam<<
2006 "vX.=" << &vecgX<< // global x
2007 "vY.=" << &vecgY<< // global y
2008 "vZ.=" << &vecgZ<< // global z
2010 "TrYpol1.=" << &vecY1 <<
2011 "TrZpol1.=" << &vecZ1 <<
2012 "TrYpol2.=" << &vecY2 <<
2013 "TrZpol2.=" << &vecZ2 <<
2014 "TrYpol1InOut.="<< &vecY1IO <<
2015 "TrZpol1InOut.="<< &vecZ1IO <<
2016 "TrYInOut.=" << &vecY4 <<
2017 "TrZInOut.=" << &vecZ4 <<
2018 "ClY.=" << &vecClY <<
2019 "ClZ.=" << &vecClZ <<
2020 "isReject.=" << &isReject<<
2021 "sec.=" << &vecSec <<
2024 "xinMin=" << xinMin<<
2025 "xinMax=" << xinMax<<
2026 "xoutMin=" << xoutMin<<
2027 "xoutMax=" << xoutMax<<
2028 "msigmaYIn=" <<msigmaYIn<<
2029 "msigmaYOut=" <<msigmaYOut<<
2030 "mqratioIn=" <<mqratioIn<<
2031 "mqratioOut=" << mqratioOut <<
2032 "yInOut.=" << &vecy4res <<
2033 "zInOut.=" << &vecz4res <<
2035 "chi2y1In=" << chi2I1y << //
2036 "chi2z1In=" << chi2I1z <<
2037 "chi2y1Out=" << chi2O1y <<
2038 "chi2z1Out=" << chi2O1z <<
2039 "chi2y1InOut="<< chi2IO1y <<
2040 "chi2z1InOut="<< chi2IO1z <<
2041 "chi2y2In=" << chi2I2y <<
2042 "chi2z2In=" << chi2I2z <<
2043 "chi2y2Out=" << chi2O2y <<
2044 "chi2z2Out=" << chi2O2z <<
2045 "chi2yInOut=" << chi2IOy <<
2046 "chi2zInOut=" << chi2IOz <<
2048 "yPol1In.=" << &vecy1resInner <<
2049 "zPol1In.=" << &vecz1resInner <<
2050 "yPol2In.=" << &vecy2resInner <<
2051 "zPol2In.=" << &vecz2resInner <<
2052 "yPol1Out.=" << &vecy1resOuter <<
2053 "zPol1Out.=" << &vecz1resOuter <<
2054 "yPol1InOut.="<< &vecy1resIO <<
2055 "zPol1InOut.="<< &vecz1resIO <<
2056 "yPol2Out.=" << &vecy2resOuter <<
2057 "zPol2Out.=" << &vecz2resOuter <<
2063 //==========================//
2064 // Fill Residual Histograms //
2065 //==========================//
2066 if (!fHisNclIn) MakeFitHistos();
2068 TH2F *profy = (TH2F*)fDeltaYres.UncheckedAt(id);
2069 TH2F *profz = (TH2F*)fDeltaZres.UncheckedAt(id);
2070 TH2F *profy2 = (TH2F*)fDeltaYres2.UncheckedAt(id);
2071 TH2F *profz2 = (TH2F*)fDeltaZres2.UncheckedAt(id);
2072 TH2F *profyabs = (TH2F*)fDeltaYresAbs.UncheckedAt(id);
2073 TH2F *profzabs = (TH2F*)fDeltaZresAbs.UncheckedAt(id);
2074 // TH2F *profy3 = (TH2F*)fDeltaYres3.UncheckedAt(id);
2075 //TH2F *profz3 = (TH2F*)fDeltaZres3.UncheckedAt(id);
2077 for (Int_t irow=158;irow>-1;--irow) {
2078 if (vecSec[irow]==-1)continue; // no cluster info
2079 if (isReject[irow]>0.5) continue; //
2080 Double_t ycl = vecClY[irow];
2081 Double_t yfit = vecY1[irow];
2082 Double_t yfit2 = vecY2[irow];
2083 Double_t x = vecX[irow];
2084 Double_t yabsbeam = -1000;
2085 if(vecSec[irow]==outerSector && outerSector==fBeamSectorOuter[id])
2086 yabsbeam = fBeamSlopeYOuter[id]*x + fBeamOffsetYOuter[id];
2087 else if(innerSector==fBeamSectorInner[id])
2088 yabsbeam = fBeamSlopeYInner[id]*x + fBeamOffsetYInner[id];
2090 // Double_t yfit3 = vecY2[irow];
2091 Double_t zcl = vecClZ[irow];
2092 Double_t zfit = vecZ1[irow];
2093 Double_t zfit2 = vecZ2[irow];
2094 //Double_t zfit3 = vecZ2[irow];
2097 // The expressions for zcorrected has been obtained by
2098 // inverting the fits in the FitDriftV() method (ignoring the
2099 // global y dependence for now):
2101 // 250 - zmeasured = [0] + [1]*(250 - zreal) + .... (yglobal)
2103 // zreal = (zmeasured + [0] - (1-[1])*250.0)/[1]
2106 // 250 + zmeasured = [0] + [1]*(250+zreal) + .... (yglobal)
2108 // zreal = (zmeasured - [0] + (1 - [1])*250.0)/[1]
2110 Double_t dzabs = -1000;
2111 Double_t zcorrected = -1000;
2112 if (ltrp->GetSide()==0){
2113 if ((*fFitAside)[1]>0. || fUseFixedDriftV) {
2114 // ignore global y dependence for now
2116 if(!fUseFixedDriftV)
2117 zcorrected = (zcl + (*fFitAside)[0] -
2118 (1.0-(*fFitAside)[1])*250.0)/(*fFitAside)[1];
2120 zcorrected = (zcl + fFixedFitAside0 -
2121 (1.0-fFixedFitAside1)*250.0)/fFixedFitAside1;
2122 // zcorrected = zcl;
2123 if(vecSec[irow]==outerSector && outerSector==fBeamSectorOuter[id])
2124 dzabs = zcorrected -fBeamSlopeZOuter[id]*x -fBeamOffsetZOuter[id];
2125 else if(innerSector==fBeamSectorInner[id])
2126 dzabs = zcorrected -fBeamSlopeZInner[id]*x -fBeamOffsetZInner[id];
2129 if ((*fFitCside)[1]>0. || fUseFixedDriftV) {
2131 if(!fUseFixedDriftV)
2132 zcorrected = (zcl - (*fFitCside)[0] +
2133 (1.0-(*fFitCside)[1])*250.0)/(*fFitCside)[1];
2135 zcorrected = (zcl - fFixedFitCside0 +
2136 (1.0-fFixedFitCside1)*250.0)/fFixedFitCside1;
2138 // zcorrected = zcl;
2139 if(vecSec[irow]==outerSector && outerSector==fBeamSectorOuter[id])
2140 dzabs = zcorrected -fBeamSlopeZOuter[id]*x -fBeamOffsetZOuter[id];
2141 else if(innerSector==fBeamSectorInner[id])
2142 dzabs = zcorrected -fBeamSlopeZInner[id]*x -fBeamOffsetZInner[id];
2146 if (TMath::Abs(yfit-ycl)<2&&TMath::Abs(zfit-zcl)<2){
2148 profy->Fill(irow,ycl-yfit);
2149 profy2->Fill(irow,ycl-yfit2);
2151 fHisYAbsErrors->Fill(id);
2152 // profyabs->Fill(irow,-0.99);
2154 profyabs->Fill(irow,ycl-yabsbeam);
2156 // profy3->Fill(irow,ycl-yfit3);
2159 profz->Fill(irow,zcl-zfit);
2160 profz2->Fill(irow,zcl-zfit2);
2161 //profz3->Fill(irow,zcl-zfit3);
2164 fHisZAbsErrors->Fill(id);
2166 profzabs->Fill(irow,dzabs);
2172 // Fill laser fit histograms
2174 Float_t dedx = track->GetdEdx();
2175 if (nclI>20&&nclO>20){
2176 fHisNclIn->Fill(id,nclI); //->Number of clusters inner
2177 fHisNclOut->Fill(id,nclO); //->Number of clusters outer
2178 fHisNclIO->Fill(id,nclI+nclO); //->Number of cluster inner outer
2180 fHisLclIn->Fill(id,xinMax-xinMin); //->Level arm inner
2181 fHisLclOut->Fill(id,xoutMax-xoutMin); //->Level arm outer
2182 fHisLclIO->Fill(id,xoutMax-xinMin); //->Number of cluster inner outer
2184 fHisdEdx->Fill(id,TMath::Sqrt(TMath::Abs(dedx)));
2185 fHisdZfit->Fill(id,fFitZ[id]);
2188 fHisChi2YIn1->Fill(id,TMath::Sqrt(chi2I1y)); //->chi2 y inner - line
2189 fHisChi2YOut1->Fill(id,TMath::Sqrt(chi2O1y)); //->chi2 y inner - line
2190 fHisChi2YIn2->Fill(id,TMath::Sqrt(chi2I2y)); //->chi2 y inner - parabola
2191 fHisChi2YOut2->Fill(id,TMath::Sqrt(chi2O2y)); //->chi2 y inner - parabola
2192 fHisChi2YIO1->Fill(id,TMath::Sqrt(chi2IOy)); //->chi2 y IO - common
2195 fHisChi2ZIn1->Fill(id,TMath::Sqrt(chi2I1z)); //->chi2 z inner - line
2196 fHisChi2ZOut1->Fill(id,TMath::Sqrt(chi2O1z)); //->chi2 z inner - line
2197 fHisChi2ZIn2->Fill(id,TMath::Sqrt(chi2O2y)); //->chi2 z inner - parabola
2198 fHisChi2ZOut2->Fill(id,TMath::Sqrt(chi2O2z)); //->chi2 z inner - parabola
2199 fHisChi2ZIO1->Fill(id,TMath::Sqrt(chi2IOz)); //->chi2 z IO - common
2202 fHisPy1vP0->Fill(id,vecy1resOuter[0]-vecy1resInner[0]); //-> delta y P0outer-P0inner - line
2203 fHisPy2vP0->Fill(id,vecy2resOuter[0]-vecy2resInner[0]); //-> delta y P0outer-P0inner - parabola
2204 fHisPy3vP0->Fill(id,vecy4res[1]); //-> delta y P0outer-P0inner - common parabola
2206 fHisPy1vP1->Fill(id,vecy1resOuter[1]-vecy1resInner[1]); //-> delta ky P1outer-P1inner - line
2207 fHisPy2vP1->Fill(id,vecy2resOuter[1]-vecy2resInner[1]); //-> delta ky P1outer-P1inner - parabola
2208 fHisPy3vP1->Fill(id,vecy4res[3]-vecy4res[2]); //-> delta ky P1outer-P1inner - common parabola
2210 fHisPy3vP2IO->Fill(id,vecy4res[4]); //-> Curv P2outerinner - common parabola
2211 fHisPz1vP0->Fill(id,vecz1resOuter[0]-vecz1resInner[0]); //-> delta z P0outer-P0inner - line
2212 fHisPz2vP0->Fill(id,vecz2resOuter[0]-vecz2resInner[0]); //-> delta z P0outer-P0inner - parabola
2213 fHisPz3vP0->Fill(id,vecz4res[1]); //-> delta z P0outer-P0inner - common parabola
2215 fHisPz1vP1->Fill(id,vecz1resOuter[1]-vecz1resInner[1]); //-> delta kz P1outer-P1inner - line
2216 fHisPz2vP1->Fill(id,vecz2resOuter[1]-vecz2resInner[1]); //-> delta kz P1outer-P1inner - parabola
2217 fHisPz3vP1->Fill(id,vecz4res[3]-vecz4res[2]); //-> delta kz P1outer-P1inner - common parabola
2218 fHisPz3vP2IO->Fill(id,vecz4res[4]); //-> Curv P2outerinner - common parabola
2221 fHisPy2vP2In->Fill(id,vecy2resInner[2]); //-> Curv P2inner - parabola
2222 fHisPz2vP2In->Fill(id,vecz2resInner[2]); //-> Curv P2inner - parabola
2226 fHisPz2vP2Out->Fill(id,vecz2resOuter[2]); //-> Curv P2outer - parabola
2227 fHisPy2vP2Out->Fill(id,vecy2resOuter[2]); //-> Curv P2outer - parabola
2235 void AliTPCcalibLaser::DumpMeanInfo(Float_t bfield, Int_t run){
2237 // Dump information about laser beams
2238 // isOK variable indicates usability of the beam
2239 // Beam is not usable if:
2240 // a. No entries in range (krmsCut0)
2241 // b. Big sperad (krmscut1)
2242 // c. RMSto fit sigma bigger then (kmultiCut)
2243 // d. Too big angular spread
2246 const Float_t krmsCut0=0.001;
2247 const Float_t krmsCut1=0.16;
2248 const Float_t kmultiCut=2;
2249 const Float_t kcutP0=0.002;
2251 AliTPCcalibLaser *laser = this;
2252 TTreeSRedirector *pcstream = new TTreeSRedirector("laserMean.root");
2253 TF1 fg("fg","gaus");
2255 // start set up for absolute residuals analysis
2256 //AliTPCcalibDB* calib=AliTPCcalibDB::Instance();
2257 // AliTPCParam * tpcparam = calib->GetParameters();
2258 AliTPCParam * tpcparam = 0;
2259 if (!tpcparam) tpcparam = new AliTPCParamSR;
2261 SetBeamParameters(fBeamOffsetYOuter, fBeamSlopeYOuter, fBeamSectorOuter,0);
2262 SetBeamParameters(fBeamOffsetYInner, fBeamSlopeYInner, fBeamSectorInner,1);
2263 TLinearFitter lfabsyInner(2);
2264 lfabsyInner.SetFormula("1 ++ x");
2265 TLinearFitter lfabszInner(2);
2266 lfabszInner.SetFormula("1 ++ x");
2268 TLinearFitter lfabsyOuter(2);
2269 lfabsyOuter.SetFormula("1 ++ x");
2270 TLinearFitter lfabszOuter(2);
2271 lfabszOuter.SetFormula("1 ++ x");
2272 // end set up for absolute residuals analysis
2276 for (Int_t id=0; id<336; id++){
2278 TH1F * hisphi = (TH1F*)laser->fDeltaPhi.At(id);
2279 TH1F * hisphiP = (TH1F*)laser->fDeltaPhiP.At(id);
2280 TH1F * hisZ = (TH1F*)laser->fDeltaZ.At(id);
2281 TH1F * hisP3 = (TH1F*)laser->fDeltaP3.At(id);
2282 TH1F * hisP4 = (TH1F*)laser->fDeltaP4.At(id);
2283 TH1F * hisS = (TH1F*)laser->fSignals.At(id);
2284 //if (!hisphi) continue;
2285 Double_t entries = (hisphi==0)? 0: hisphi->GetEntries();
2286 //if (entries<minEntries) continue;
2288 AliTPCLaserTrack *ltrp = (AliTPCLaserTrack*)fTracksMirror.At(id);
2290 AliTPCLaserTrack::LoadTracks();
2291 ltrp =(AliTPCLaserTrack*)AliTPCLaserTrack::GetTracks()->UncheckedAt(id);
2293 pcstream->GetFile()->cd();
2294 if (hisphi) hisphi->Write();
2295 if (hisphiP) hisphiP->Write();
2296 if (hisZ) hisZ->Write();
2297 if (hisP3) hisP3->Write();
2298 if (hisP4) hisP4->Write();
2300 Float_t meanphi = hisphi->GetMean();
2301 Float_t rmsphi = hisphi->GetRMS();
2303 Float_t meanphiP = hisphiP->GetMean();
2304 Float_t rmsphiP = hisphiP->GetRMS();
2305 Float_t meanZ = hisZ->GetMean();
2306 Float_t rmsZ = hisZ->GetRMS();
2307 if (hisphi->GetRMS()>hisphi->GetBinWidth(1))
2308 hisphi->Fit(&fg,"","",hisphi->GetMean()-4*hisphi->GetRMS(),hisphi->GetMean()+4*hisphi->GetRMS());
2309 Double_t gphi1 = fg.GetParameter(1);
2310 Double_t gphi2 = fg.GetParameter(2);
2311 if (hisphiP->GetRMS()>0)
2312 hisphiP->Fit(&fg,"","",hisphiP->GetMean()-4*hisphiP->GetRMS(),hisphiP->GetMean()+4*hisphiP->GetRMS());
2313 Double_t gphiP1 = fg.GetParameter(1);
2314 Double_t gphiP2 = fg.GetParameter(2);
2316 if (hisZ->GetRMS()>hisZ->GetBinWidth(1))
2317 hisZ->Fit(&fg,"","");
2318 Double_t gz1 = fg.GetParameter(1);
2319 Double_t gz2 = fg.GetParameter(2);
2321 if (hisP3->GetRMS()>hisP3->GetBinWidth(1))
2322 hisP3->Fit(&fg,"","",hisP3->GetMean()-4*hisP3->GetRMS(),hisP3->GetMean()+4*hisP3->GetRMS());
2323 Double_t gp31 = fg.GetParameter(1);
2324 Double_t gp32 = fg.GetParameter(2);
2326 if (hisP4->GetRMS()>hisP4->GetBinWidth(1))
2327 hisP4->Fit(&fg,"","",hisP4->GetMean()-4*hisP4->GetRMS(),hisP4->GetMean()+4*hisP4->GetRMS());
2328 Double_t gp41 = fg.GetParameter(1);
2329 Double_t gp42 = fg.GetParameter(2);
2331 Float_t meanS=hisS->GetMean();
2336 ltrp->GetPxPyPz(lpxyz);
2338 if (rmsphi<krmsCut0) isOK=kFALSE; // empty in range - not entries inside
2339 if (rmsphi>krmsCut1) isOK=kFALSE; // empty in range - not entries inside
2340 if (rmsphi>krmsCut0) if (gphi2/rmsphi>kmultiCut) isOK=kFALSE; // multi peak structure
2341 if (gphiP2>kcutP0) isOK=kFALSE;
2347 his = fHisNclIn->ProjectionY("aaa",id+1,id+1);
2348 Float_t mnclIn = his->GetMean();
2350 his = fHisNclOut->ProjectionY("aaa",id+1,id+1);
2351 Float_t mnclOut = his->GetMean();
2353 his = fHisNclIO->ProjectionY("aaa",id+1,id+1);
2354 Float_t mnclIO = his->GetMean();
2356 his = fHisLclIn->ProjectionY("aaa",id+1,id+1);
2357 Float_t mLclIn = his->GetMean();
2359 his = fHisLclOut->ProjectionY("aaa",id+1,id+1);
2360 Float_t mLclOut = his->GetMean();
2362 his = fHisLclIO->ProjectionY("aaa",id+1,id+1);
2363 Float_t mLclIO = his->GetMean();
2366 his = fHisdEdx->ProjectionY("aaa",id+1,id+1);
2367 Float_t mdEdx = his->GetMean();
2373 his = fHisChi2YIn1->ProjectionY("aaa",id+1,id+1); //->chi2 y inner - line
2374 Float_t mChi2YIn1= his->GetMean();
2376 his = fHisChi2YOut1->ProjectionY("aaa",id+1,id+1); //->chi2 y inner - line
2377 Float_t mChi2YOut1 = his->GetMean();
2379 his = fHisChi2YIn2->ProjectionY("aaa",id+1,id+1); //->chi2 y inner - parabola
2380 Float_t mChi2YIn2 = his->GetMean();
2382 his = fHisChi2YOut2->ProjectionY("aaa",id+1,id+1); //->chi2 y inner - parabola
2383 Float_t mChi2YOut2 = his->GetMean();
2385 his = fHisChi2YIO1->ProjectionY("aaa",id+1,id+1); //->chi2 y IO - common
2386 Float_t mChi2YIO1 = his->GetMean();
2388 his = fHisChi2ZIn1->ProjectionY("aaa",id+1,id+1); //->chi2 z inner - line
2389 Float_t mChi2ZIn1 = his->GetMean();
2391 his = fHisChi2ZOut1->ProjectionY("aaa",id+1,id+1); //->chi2 z inner - line
2392 Float_t mChi2ZOut1 = his->GetMean();
2394 his = fHisChi2ZIn2->ProjectionY("aaa",id+1,id+1); //->chi2 z inner - parabola
2395 Float_t mChi2ZIn2 = his->GetMean();
2397 his = fHisChi2ZOut2->ProjectionY("aaa",id+1,id+1); //->chi2 z inner - parabola
2398 Float_t mChi2ZOut2 = his->GetMean();
2400 his = fHisChi2ZIO1->ProjectionY("aaa",id+1,id+1); //->chi2 z IO - common
2401 Float_t mChi2ZIO1 = his->GetMean();
2406 his = fHisdZfit->ProjectionY("aaa",id+1,id+1);
2407 Float_t edZfit = his->GetEntries();
2408 Float_t mdZfit = his->GetMean();
2409 Float_t rdZfit = his->GetRMS();
2412 his = fHisPy1vP0->ProjectionY("aaa",id+1,id+1); //-> delta y P0outer-P0inner - line
2413 Float_t ePy1vP0 = his->GetEntries();
2414 Float_t mPy1vP0 = his->GetMean();
2415 Float_t rPy1vP0 = his->GetRMS();
2418 his = fHisPy2vP0->ProjectionY("aaa",id+1,id+1); //-> delta y P0outer-P0inner - parabola
2419 Float_t ePy2vP0 = his->GetEntries();
2420 Float_t mPy2vP0 = his->GetMean();
2421 Float_t rPy2vP0 = his->GetRMS();
2424 his = fHisPy3vP0->ProjectionY("aaa",id+1,id+1); //-> delta y P0outer-P0inner - common parabola
2425 Float_t ePy3vP0 = his->GetEntries();
2426 Float_t mPy3vP0 = his->GetMean();
2427 Float_t rPy3vP0 = his->GetRMS();
2430 his = fHisPy1vP1->ProjectionY("aaa",id+1,id+1); //-> delta ky P1outer-P1inner - line
2431 Float_t ePy1vP1 = his->GetEntries();
2432 Float_t mPy1vP1 = his->GetMean();
2433 Float_t rPy1vP1 = his->GetRMS();
2436 his = fHisPy2vP1->ProjectionY("aaa",id+1,id+1); //-> delta ky P1outer-P1inner - parabola
2437 Float_t ePy2vP1 = his->GetEntries();
2438 Float_t mPy2vP1 = his->GetMean();
2439 Float_t rPy2vP1 = his->GetRMS();
2442 his = fHisPy3vP1->ProjectionY("aaa",id+1,id+1); //-> delta ky P1outer-P1inner - common parabola
2443 Float_t ePy3vP1 = his->GetEntries();
2444 Float_t mPy3vP1 = his->GetMean();
2445 Float_t rPy3vP1 = his->GetRMS();
2448 his = fHisPy2vP2In->ProjectionY("aaa",id+1,id+1); //-> Curv P2inner - parabola
2449 Float_t ePy2vP2In = his->GetEntries();
2450 Float_t mPy2vP2In = his->GetMean();
2451 Float_t rPy2vP2In = his->GetRMS();
2454 his = fHisPy2vP2Out->ProjectionY("aaa",id+1,id+1); //-> Curv P2outer - parabola
2455 Float_t ePy2vP2Out = his->GetEntries();
2456 Float_t mPy2vP2Out = his->GetMean();
2457 Float_t rPy2vP2Out = his->GetRMS();
2460 his = fHisPy3vP2IO->ProjectionY("aaa",id+1,id+1); //-> Curv P2outerinner - common parabola
2461 Float_t ePy3vP2IO = his->GetEntries();
2462 Float_t mPy3vP2IO = his->GetMean();
2463 Float_t rPy3vP2IO = his->GetRMS();
2468 his = fHisPz1vP0->ProjectionY("aaa",id+1,id+1); //-> delta z P0outer-P0inner - line
2469 Float_t ePz1vP0 = his->GetEntries();
2470 Float_t mPz1vP0 = his->GetMean();
2471 Float_t rPz1vP0 = his->GetRMS();
2474 his = fHisPz2vP0->ProjectionY("aaa",id+1,id+1); //-> delta z P0outer-P0inner - parabola
2475 Float_t ePz2vP0 = his->GetEntries();
2476 Float_t mPz2vP0 = his->GetMean();
2477 Float_t rPz2vP0 = his->GetRMS();
2480 his = fHisPz3vP0->ProjectionY("aaa",id+1,id+1); //-> delta z P0outer-P0inner - common parabola
2481 Float_t ePz3vP0 = his->GetEntries();
2482 Float_t mPz3vP0 = his->GetMean();
2483 Float_t rPz3vP0 = his->GetRMS();
2486 his = fHisPz1vP1->ProjectionY("aaa",id+1,id+1); //-> delta kz P1outer-P1inner - line
2487 Float_t ePz1vP1 = his->GetEntries();
2488 Float_t mPz1vP1 = his->GetMean();
2489 Float_t rPz1vP1 = his->GetRMS();
2492 his = fHisPz2vP1->ProjectionY("aaa",id+1,id+1); //-> delta kz P1outer-P1inner - parabola
2493 Float_t ePz2vP1 = his->GetEntries();
2494 Float_t mPz2vP1 = his->GetMean();
2495 Float_t rPz2vP1 = his->GetRMS();
2498 his = fHisPz3vP1->ProjectionY("aaa",id+1,id+1); //-> delta kz P1outer-P1inner - common parabola
2499 Float_t ePz3vP1 = his->GetEntries();
2500 Float_t mPz3vP1 = his->GetMean();
2501 Float_t rPz3vP1 = his->GetRMS();
2504 his = fHisPz2vP2In->ProjectionY("aaa",id+1,id+1); //-> Curv P2inner - parabola
2505 Float_t ePz2vP2In = his->GetEntries();
2506 Float_t mPz2vP2In = his->GetMean();
2507 Float_t rPz2vP2In = his->GetRMS();
2510 his = fHisPz2vP2Out->ProjectionY("aaa",id+1,id+1); //-> Curv P2outer - parabola
2511 Float_t ePz2vP2Out = his->GetEntries();
2512 Float_t mPz2vP2Out = his->GetMean();
2513 Float_t rPz2vP2Out = his->GetRMS();
2516 his = fHisPz3vP2IO->ProjectionY("aaa",id+1,id+1); //-> Curv P2outerinner - common parabola
2517 Float_t ePz3vP2IO = his->GetEntries();
2518 Float_t mPz3vP2IO = his->GetMean();
2519 Float_t rPz3vP2IO = his->GetRMS();
2522 // Fit absolute laser residuals
2523 TH2F* histAbsY = (TH2F*)laser->fDeltaYresAbs[id];
2524 TH2F* histAbsZ = (TH2F*)laser->fDeltaZresAbs[id];
2526 Int_t secInner = TMath::Nint(fBeamSectorInner[id]);
2527 Int_t secOuter = TMath::Nint(fBeamSectorOuter[id]);
2529 TVectorD vecX(159); // X
2530 TVectorD vecY(159); // Y
2531 TVectorD vecR(159); // R
2532 TVectorD vecDY(159); // absolute residuals in Y
2533 TVectorD vecDZ(159); // absolute residuals in Z
2534 TVectorD vecN(159); // number of clusters
2535 TVectorD vecEy(159); //error y
2536 TVectorD vecEz(159); //error z
2537 TVectorD vecPhi(159); // local tangent
2538 TVectorD vecPhiR(159); // local tangent
2540 lfabsyInner.ClearPoints();
2541 lfabszInner.ClearPoints();
2542 lfabsyOuter.ClearPoints();
2543 lfabszOuter.ClearPoints();
2546 Float_t yAbsInOffset = -100;
2547 Float_t yAbsInSlope = -100;
2548 Float_t yAbsInDeltay = -100;
2550 Float_t zAbsInOffset = -100;
2551 Float_t zAbsInSlope = -100;
2552 Float_t zAbsInDeltaz = -100;
2554 Float_t yAbsOutOffset = -100;
2555 Float_t yAbsOutSlope = -100;
2556 Float_t yAbsOutDeltay = -100;
2558 Float_t zAbsOutOffset = -100;
2559 Float_t zAbsOutSlope = -100;
2560 Float_t zAbsOutDeltaz = -100;
2562 Float_t lasTanPhiLocIn = -100;
2563 Float_t lasTanPhiLocOut = -100;
2565 if(histAbsY->GetEntries()>0) {
2567 Double_t rotAngOut = 10;
2568 Double_t rotAngIn = 10;
2569 if((secInner%36)!=(secOuter%36))
2570 rotAngIn += 20; // 30 degrees
2572 // Calculate laser mirror X position in local frame
2573 Double_t laserposOut =
2574 TMath::Abs(ltrp->GetX()*TMath::Cos(rotAngOut*TMath::DegToRad()));
2575 Double_t laserposIn =
2576 TMath::Abs(ltrp->GetX()*TMath::Cos(rotAngIn*TMath::DegToRad()));
2578 // Calculate laser tan phi in local frame
2579 lasTanPhiLocOut = TMath::ASin(ltrp->GetSnp());
2580 if(lasTanPhiLocOut<0) {
2581 lasTanPhiLocIn = lasTanPhiLocOut - rotAngIn*TMath::DegToRad();
2582 lasTanPhiLocOut -= rotAngOut*TMath::DegToRad();
2585 lasTanPhiLocIn = lasTanPhiLocOut + rotAngIn*TMath::DegToRad();
2586 lasTanPhiLocOut += rotAngOut*TMath::DegToRad();
2589 lasTanPhiLocIn = TMath::Tan(lasTanPhiLocIn);
2590 lasTanPhiLocOut = TMath::Tan(lasTanPhiLocOut);
2592 TProfile* yprof = histAbsY->ProfileX("yprof");
2593 TProfile* zprof = histAbsZ->ProfileX("zprof");
2595 for(Int_t bin = 1; bin<=159; bin++) {
2597 if(yprof->GetBinEntries(bin)<10&&
2598 zprof->GetBinEntries(bin)<10) {
2602 // There is a problem in defining inner and outer sectors for
2603 // the outer beams (0 and 6) where both sectors are OROCs. To
2604 // make sure there is no overlap row 94 to 99 are cutted.
2605 if(((ltrp->GetBeam()==0)||(ltrp->GetBeam()==6))&&bin>=95&&bin<=100)
2608 Int_t row = (bin-1);
2612 Bool_t isOuter = kTRUE;
2613 Int_t sector = TMath::Nint(fBeamSectorOuter[id]);
2616 (((ltrp->GetBeam()==0)||(ltrp->GetBeam()==6))&&bin<=95)) {
2619 sector = TMath::Nint(fBeamSectorInner[id]);
2623 Double_t x = tpcparam->GetPadRowRadii(sector, row); // slope
2624 vecN[bin-1] =yprof->GetBinEntries(bin);
2625 vecEy[bin-1]=yprof->GetBinError(bin);
2626 vecEz[bin-1]=zprof->GetBinError(bin);
2628 vecDY[bin-1] = yprof->GetBinContent(bin);
2629 vecDZ[bin-1] = zprof->GetBinContent(bin);
2630 if(!isOuter) { // inner
2631 vecPhi[bin-1]=lasTanPhiLocIn;
2632 // Calculate local y from residual and database
2633 Double_t y = fBeamSlopeYInner[id]*x + fBeamOffsetYInner[id]
2636 Double_t r = TMath::Sqrt(x*x + y*y);
2638 // Find angle between laser vector and R vector
2639 // cos angle = (x,y).(1,fBeamSlopeYInner)/R/sqrt(1+fBeamSlopeYInner**2)
2640 Double_t cosPhi = x + y*fBeamSlopeYInner[id];
2641 cosPhi /= r*TMath::Sqrt(1+fBeamSlopeYInner[id]*fBeamSlopeYInner[id]);
2642 vecPhiR[bin-1] = TMath::Tan(TMath::ACos(cosPhi));
2643 if(lasTanPhiLocIn<0)
2644 vecPhiR[bin-1]*=-1; // to have the same sign
2646 if(yprof->GetBinEntries(bin)>=10) {
2647 lfabsyInner.AddPoint(&x, yprof->GetBinContent(bin),
2648 TMath::Max(yprof->GetBinError(bin), 0.001));
2650 if(zprof->GetBinEntries(bin)>=10) {
2651 lfabszInner.AddPoint(&x, zprof->GetBinContent(bin),
2652 TMath::Max(zprof->GetBinError(bin), 0.001));
2655 vecPhi[bin-1]=lasTanPhiLocOut;
2656 // Calculate local y from residual and database
2657 Double_t y = fBeamSlopeYOuter[id]*x + fBeamOffsetYOuter[id]
2660 Double_t r = TMath::Sqrt(x*x + y*y);
2663 Double_t cosPhi = x + y*fBeamSlopeYOuter[id];
2664 cosPhi /= r*TMath::Sqrt(1+fBeamSlopeYOuter[id]*fBeamSlopeYOuter[id]);
2665 vecPhiR[bin-1] = TMath::Tan(TMath::ACos(cosPhi));
2666 if(lasTanPhiLocOut<0)
2667 vecPhiR[bin-1]*=-1; // to have the same sign
2669 if(yprof->GetBinEntries(bin)>=10) {
2670 lfabsyOuter.AddPoint(&x, yprof->GetBinContent(bin),
2671 TMath::Max(yprof->GetBinError(bin), 0.001));
2673 if(zprof->GetBinEntries(bin)>=10) {
2674 lfabszOuter.AddPoint(&x, zprof->GetBinContent(bin),
2675 TMath::Max(zprof->GetBinError(bin), 0.001));
2681 delete yprof; delete zprof;
2684 // Fit laser abs residuals with linear robust fit (exclude 5% outliers)
2685 nClInY = lfabsyInner.GetNpoints();
2686 if(lfabsyInner.GetNpoints()>10) {
2687 lfabsyInner.EvalRobust(0.95);
2690 lfabsyInner.GetParameters(result);
2691 yAbsInOffset = result[0];
2692 yAbsInSlope = result[1];
2693 yAbsInDeltay = yAbsInSlope*laserposIn + yAbsInOffset;
2695 nClInZ = lfabszInner.GetNpoints();
2696 if(lfabszInner.GetNpoints()>10) {
2697 lfabszInner.EvalRobust(0.95);
2700 lfabszInner.GetParameters(result);
2701 zAbsInOffset = result[0];
2702 zAbsInSlope = result[1];
2703 zAbsInDeltaz = zAbsInSlope*laserposIn + zAbsInOffset;
2705 nClOutY = lfabsyOuter.GetNpoints();
2706 if(lfabsyOuter.GetNpoints()>10) {
2707 lfabsyOuter.EvalRobust(0.95);
2710 lfabsyOuter.GetParameters(result);
2711 yAbsOutOffset = result[0];
2712 yAbsOutSlope = result[1];
2713 yAbsOutDeltay = yAbsOutSlope*laserposOut + yAbsOutOffset;
2715 nClOutZ = lfabszOuter.GetNpoints();
2716 if(lfabszOuter.GetNpoints()>10) {
2717 lfabszOuter.EvalRobust(0.95);
2720 lfabszOuter.GetParameters(result);
2721 zAbsOutOffset = result[0];
2722 zAbsOutSlope = result[1];
2723 zAbsOutDeltaz = zAbsOutSlope*laserposOut + zAbsOutOffset;
2729 Float_t coverIA=AliTPCcalibDB::GetCoverVoltage(run,0,itime);
2730 Float_t coverIC=AliTPCcalibDB::GetCoverVoltage(run,18,itime);
2731 Float_t coverOA=AliTPCcalibDB::GetCoverVoltage(run,36,itime);
2732 Float_t coverOC=AliTPCcalibDB::GetCoverVoltage(run,54,itime);
2734 Float_t skirtA=AliTPCcalibDB::GetSkirtVoltage(run,0,itime);
2735 Float_t skirtC=AliTPCcalibDB::GetSkirtVoltage(run,18,itime);
2737 Float_t ggOffA=AliTPCcalibDB::GetGGoffsetVoltage(run,0,itime);
2738 Float_t ggOffC=AliTPCcalibDB::GetGGoffsetVoltage(run,18,itime);
2741 (*pcstream)<<"Mean"<<
2754 "id="<<id<< // track id
2755 "entries="<<entries<< // number of entries
2756 "bz="<<bfield<< // bfield
2757 "LTr.="<<ltrp<< // refernece track
2759 "mnclIn="<<mnclIn<< // mean number of clusters in inner
2760 "mnclOut="<<mnclOut<< // mean number of clusters in outer
2761 "mnclIO="<<mnclIO<< // mean number of clusters in inner+outer
2762 "mLclIn="<<mLclIn<< // mean number of clusters in inner
2763 "mLclOut="<<mLclOut<< // mean number of clusters in outer
2764 "mLclIO="<<mLclIO<< // mean number of clusters in inner+outer
2765 "mdEdx="<<mdEdx<< // mean dEdx
2766 "edZfit="<<edZfit<< // entries z fit
2767 "mdZfit="<<mdZfit<< // mean z fit
2768 "rdZfit="<<rdZfit<< // RMS z fit
2771 "mChi2YIn1="<<mChi2YIn1<< //->chi2 y inner - line
2772 "mChi2YOut1="<<mChi2YOut1<< //->chi2 y inner - line
2773 "mChi2YIn2="<<mChi2YIn2<< //->chi2 y inner - parabola
2774 "mChi2YOut2="<<mChi2YOut2<< //->chi2 y inner - parabola
2775 "mChi2YIO1="<<mChi2YIO1<< //->chi2 y IO - common
2776 "mChi2ZIn1="<<mChi2ZIn1<< //->chi2 z inner - line
2777 "mChi2ZOut1="<<mChi2ZOut1<< //->chi2 z inner - line
2778 "mChi2ZIn2="<<mChi2ZIn2<< //->chi2 z inner - parabola
2779 "mChi2ZOut2="<<mChi2ZOut2<< //->chi2 z inner - parabola
2780 "mChi2ZIO1="<<mChi2ZIO1<< //->chi2 z IO - common
2783 "ePy1vP0="<<ePy1vP0<<
2784 "mPy1vP0="<<mPy1vP0<<
2785 "rPy1vP0="<<rPy1vP0<<
2786 "ePy2vP0="<<ePy2vP0<<
2787 "mPy2vP0="<<mPy2vP0<<
2788 "rPy2vP0="<<rPy2vP0<<
2789 "ePy3vP0="<<ePy3vP0<<
2790 "mPy3vP0="<<mPy3vP0<<
2791 "rPy3vP0="<<rPy3vP0<<
2792 "ePy1vP1="<<ePy1vP1<<
2793 "mPy1vP1="<<mPy1vP1<<
2794 "rPy1vP1="<<rPy1vP1<<
2795 "ePy2vP1="<<ePy2vP1<<
2796 "mPy2vP1="<<mPy2vP1<<
2797 "rPy2vP1="<<rPy2vP1<<
2798 "ePy3vP1="<<ePy3vP1<<
2799 "mPy3vP1="<<mPy3vP1<<
2800 "rPy3vP1="<<rPy3vP1<<
2801 "ePy2vP2In="<<ePy2vP2In<<
2802 "mPy2vP2In="<<mPy2vP2In<<
2803 "rPy2vP2In="<<rPy2vP2In<<
2804 "ePy2vP2Out="<<ePy2vP2Out<<
2805 "mPy2vP2Out="<<mPy2vP2Out<<
2806 "rPy2vP2Out="<<rPy2vP2Out<<
2807 "ePy3vP2IO="<<ePy3vP2IO<<
2808 "mPy3vP2IO="<<mPy3vP2IO<<
2809 "rPy3vP2IO="<<rPy3vP2IO<<
2812 "ePz1vP0="<<ePz1vP0<<
2813 "mPz1vP0="<<mPz1vP0<<
2814 "rPz1vP0="<<rPz1vP0<<
2815 "ePz2vP0="<<ePz2vP0<<
2816 "mPz2vP0="<<mPz2vP0<<
2817 "rPz2vP0="<<rPz2vP0<<
2818 "ePz3vP0="<<ePz3vP0<<
2819 "mPz3vP0="<<mPz3vP0<<
2820 "rPz3vP0="<<rPz3vP0<<
2821 "ePz1vP1="<<ePz1vP1<<
2822 "mPz1vP1="<<mPz1vP1<<
2823 "rPz1vP1="<<rPz1vP1<<
2824 "ePz2vP1="<<ePz2vP1<<
2825 "mPz2vP1="<<mPz2vP1<<
2826 "rPz2vP1="<<rPz2vP1<<
2827 "ePz3vP1="<<ePz3vP1<<
2828 "mPz3vP1="<<mPz3vP1<<
2829 "rPz3vP1="<<rPz3vP1<<
2830 "ePz2vP2In="<<ePz2vP2In<<
2831 "mPz2vP2In="<<mPz2vP2In<<
2832 "rPz2vP2In="<<rPz2vP2In<<
2833 "ePz2vP2Out="<<ePz2vP2Out<<
2834 "mPz2vP2Out="<<mPz2vP2Out<<
2835 "rPz2vP2Out="<<rPz2vP2Out<<
2836 "ePz3vP2IO="<<ePz3vP2IO<<
2837 "mPz3vP2IO="<<mPz3vP2IO<<
2838 "rPz3vP2IO="<<rPz3vP2IO<<
2842 "lx0="<<lxyz[0]<< // reference x
2843 "lx1="<<lxyz[1]<< // reference y
2844 "lx2="<<lxyz[2]<< // refernece z
2845 "lpx0="<<lpxyz[0]<< // reference x
2846 "lpx1="<<lpxyz[1]<< // reference y
2847 "lpx2="<<lpxyz[2]<< // refernece z
2851 "mphi="<<meanphi<< //
2852 "rmsphi="<<rmsphi<< //
2856 "mphiP="<<meanphiP<< //
2857 "rmsphiP="<<rmsphiP<< //
2866 "gp31="<<gp31<< //gaus mean - tgl
2867 "gp32="<<gp32<< //gaus rms -tgl
2868 "gp41="<<gp41<< //gaus mean - P4
2869 "gp42="<<gp42<< //gaus rms - P4
2870 // Parameters from abs res analysis
2871 "SecIn="<<secInner<< // inner sector
2872 "SecOut="<<secOuter<< // outer sector
2873 "lasTanPhiLocIn="<<lasTanPhiLocIn<< // laser tan phi in local frame (inner)
2874 "lasTanPhiLocOut="<<lasTanPhiLocOut<<// laser tan phi in local frame (outer)
2875 "X.="<<&vecX<< // local x
2876 "Y.="<<&vecY<< // local y
2877 "R.="<<&vecR<< // radius
2878 "dY.="<<&vecDY<< // abs y residuals
2879 "dZ.="<<&vecDZ<< // abs z residuals
2880 "eY.="<<&vecEy<< // error of y residuals
2881 "eZ.="<<&vecEz<< // error of z residuals
2882 "kY.="<<&vecPhi<< // local tangent y (fixed for sector)
2883 "kYR.="<<&vecPhiR<< // tangent between laser and R vector (varies inside sector)
2884 "nCl.="<<&vecN<< // number of clusters
2886 "nClInY="<<nClInY<< // Number of clusters for inner y
2887 "yAbsInOffset="<<yAbsInOffset<< // fitted offset absres (inner y)
2888 "yAbsInSlope="<<yAbsInSlope << // fitted slope absres (inner y)
2889 "yAbsInDeltay="<<yAbsInDeltay<< // fitted laser offset absres (inner y)
2890 "nClInZ="<<nClInZ<< // Number of clusters for inner z
2891 "zAbsInOffset="<<zAbsInOffset<< // fitted offset absres (inner z)
2892 "zAbsInSlope="<<zAbsInSlope << // fitted slope absres (inner z)
2893 "zAbsInDeltaz="<<zAbsInDeltaz<< // fitted laser offset absres (inner z)
2895 "nClOutY="<<nClOutY<< // Number of clusters for outer y
2896 "yAbsOutOffset="<<yAbsOutOffset<< // fitted offset absres (outer y)
2897 "yAbsOutSlope="<<yAbsOutSlope << // fitted slope absres (outer y)
2898 "yAbsOutDeltay="<<yAbsOutDeltay<< // fitted laser offset absres (outer y)
2899 "nClOutZ="<<nClOutZ<< // Number of clusters for outer z
2900 "zAbsOutOffset="<<zAbsOutOffset<< // fitted offset absres (outer z)
2901 "zAbsOutSlope="<<zAbsOutSlope << // fitted slope absres (outer z)
2902 "zAbsOutDeltaz="<<zAbsOutDeltaz<< // fitted laser offset absres (outer z)
2909 TFile fmean("laserMean.root");
2919 void AliTPCcalibLaser::DumpScanInfo(TTree * chain, const char * cutUser){
2923 TTreeSRedirector *pcstream = new TTreeSRedirector("laserScan.root");
2924 TFile * f = pcstream->GetFile();
2926 f->mkdir("dirphiP");
2928 TF1 fp("p1","pol1");
2933 char grnamefull[1000];
2936 Double_t mphiP[100];
2937 Double_t smphi[100];
2938 Double_t smphiP[100];
2949 for (Int_t id=0; id<336; id++){
2951 sprintf(cut,"fId==%d&&%s",id,cutUser);
2952 Int_t entries = chain->Draw("bz",cut,"goff");
2953 if (entries<3) continue;
2954 AliTPCLaserTrack *ltrp = 0;
2955 if (!AliTPCLaserTrack::GetTracks()) AliTPCLaserTrack::LoadTracks();
2956 ltrp =(AliTPCLaserTrack*)AliTPCLaserTrack::GetTracks()->UncheckedAt(id);
2960 ltrp->GetPxPyPz(lpxyz);
2962 chain->Draw("bz",cut,"goff");
2963 memcpy(bz, chain->GetV1(), entries*sizeof(Double_t));
2964 chain->Draw("0.01*abs(bz)+0.02",cut,"goff");
2965 memcpy(sbz, chain->GetV1(), entries*sizeof(Double_t));
2967 chain->Draw("gphi1",cut,"goff");
2968 memcpy(mphi, chain->GetV1(), entries*sizeof(Double_t));
2969 chain->Draw("0.05*abs(mphi)+abs(gphi2)*0.5+0.05",cut,"goff");
2970 memcpy(smphi, chain->GetV1(), entries*sizeof(Double_t));
2972 chain->Draw("gphiP1",cut,"goff");
2973 memcpy(mphiP, chain->GetV1(), entries*sizeof(Double_t));
2974 chain->Draw("0.05*abs(mphiP)+abs(gphiP2)*0.5+0.001",cut,"goff");
2975 memcpy(smphiP, chain->GetV1(), entries*sizeof(Double_t));
2977 chain->Draw("gz1",cut,"goff");
2978 memcpy(mZ, chain->GetV1(), entries*sizeof(Double_t));
2979 chain->Draw("0.01*abs(meanZ)+abs(gz2)*0.5+0.1",cut,"goff");
2980 memcpy(smZ, chain->GetV1(), entries*sizeof(Double_t));
2983 sprintf(grnamefull,"Side_%d_Bundle_%d_Rod_%d_Beam_%d",
2984 ltrp->GetSide(), ltrp->GetBundle(), ltrp->GetRod(), ltrp->GetBeam());
2991 for (Int_t ientry=0; ientry<entries; ientry++){
2992 if (TMath::Abs(bz[ientry])<0.05){
2993 phiB0 = mphi[ientry];
2994 phiPB0 = mphiP[ientry];
2998 TGraphErrors *grphi = new TGraphErrors(entries,bz,mphi,sbz,smphi);
3001 pphi[0] = fp.GetParameter(0); // offset
3002 pphi[1] = fp.GetParameter(1); // slope
3003 pphi[2] = TMath::Sqrt(fp.GetChisquare()/(entries-2.)); // normalized chi2
3004 sprintf(grname,"phi_id%d",id);
3005 grphi->SetName(grname); grphi->SetTitle(grnamefull);
3006 grphi->GetXaxis()->SetTitle("b_{z} (T)");
3007 grphi->GetYaxis()->SetTitle("#Delta r#phi (cm)");
3008 grphi->SetMaximum(1.2);
3009 grphi->SetMinimum(-1.2);
3013 gPad->SaveAs(Form("pic/phi/phi_%s.gif",grnamefull));
3016 TGraphErrors *grphiP = new TGraphErrors(entries,bz,mphiP,sbz,smphiP);
3019 pphiP[0] = fp.GetParameter(0); // offset
3020 pphiP[1] = fp.GetParameter(1); // slope
3021 pphiP[2] = TMath::Sqrt(fp.GetChisquare()/(entries-2.)); // normalized chi2
3022 sprintf(grname,"phiP_id%d",id);
3023 grphiP->SetName(grname); grphiP->SetTitle(grnamefull);
3024 grphiP->GetXaxis()->SetTitle("b_{z} (T)");
3025 grphiP->GetYaxis()->SetTitle("#Delta #phi (rad)");
3026 grphiP->SetMaximum(pphiP[0]+0.005);
3027 grphiP->SetMinimum(pphiP[0]-0.005);
3029 gPad->SaveAs(Form("pic/phiP/phiP_%s.gif",grnamefull));
3034 TGraphErrors *grmZ = new TGraphErrors(entries,bz,mZ,sbz,smZ);
3037 pmZ[0] = fp.GetParameter(0); // offset
3038 pmZ[1] = fp.GetParameter(1); // slope
3039 pmZ[2] = TMath::Sqrt(fp.GetChisquare()/(entries-2.)); // normalized chi2
3040 sprintf(grname,"mZ_id%d",id);
3041 grmZ->SetName(grname); grmZ->SetTitle(grnamefull);
3042 grmZ->GetXaxis()->SetTitle("b_{z} (T)");
3043 grmZ->GetYaxis()->SetTitle("#Delta z (cm)");
3045 gPad->SaveAs(Form("pic/z/z_%s.gif",grnamefull));
3051 for (Int_t ientry=0; ientry<entries; ientry++){
3052 (*pcstream)<<"Mean"<<
3055 "entries="<<entries<<
3057 "lx0="<<lxyz[0]<< // reference x
3058 "lx1="<<lxyz[1]<< // reference y
3059 "lx2="<<lxyz[2]<< // refernece z
3060 "lpx0="<<lpxyz[0]<< // reference x
3061 "lpx1="<<lpxyz[1]<< // reference y
3062 "lpx2="<<lpxyz[2]<< // refernece z
3064 "phiB0="<<phiB0<< // position shift at 0 field
3065 "phiPB0="<<phiPB0<< // angular shift at 0 field
3066 "zB0="<<zB0<< // z shift for 0 field
3068 "gphi1="<<mphi[ientry]<< // mean - from gaus fit
3069 "pphi0="<<pphi[0]<< // offset
3070 "pphi1="<<pphi[1]<< // slope
3071 "pphi2="<<pphi[2]<< // norm chi2
3073 "gphiP1="<<mphiP[ientry]<< // mean - from gaus fit
3074 "pphiP0="<<pphiP[0]<< // offset
3075 "pphiP1="<<pphiP[1]<< // slope
3076 "pphiP2="<<pphiP[2]<< // norm chi2
3078 "gz1="<<mZ[ientry]<<
3079 "pmZ0="<<pmZ[0]<< // offset
3080 "pmZ1="<<pmZ[1]<< // slope
3081 "pmZ2="<<pmZ[2]<< // norm chi2
3091 void AliTPCcalibLaser::Analyze(){
3098 Long64_t AliTPCcalibLaser::Merge(TCollection *li) {
3100 TIterator* iter = li->MakeIterator();
3101 AliTPCcalibLaser* cal = 0;
3102 static Int_t counter0=0;
3103 while ((cal = (AliTPCcalibLaser*)iter->Next())) {
3104 if (!cal->InheritsFrom(AliTPCcalibLaser::Class())) {
3105 // Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
3108 printf("Marging number %d\n", counter0);
3111 MergeFitHistos(cal);
3116 // TProfile *hp=0x0;
3117 //TProfile *hpm=0x0;
3119 for (Int_t id=0; id<336; id++){
3120 // merge fDeltaZ histograms
3121 hm = (TH1F*)cal->fDeltaZ.At(id);
3122 h = (TH1F*)fDeltaZ.At(id);
3124 h=new TH1F(Form("hisdz%d",id),Form("hisdz%d",id),1000,-10,10);
3126 fDeltaZ.AddAt(h,id);
3129 // merge fP3 histograms
3130 hm = (TH1F*)cal->fDeltaP3.At(id);
3131 h = (TH1F*)fDeltaP3.At(id);
3133 h=new TH1F(Form("hisPar3v%d",id),Form("hisPar3v%d",id),400,-0.06,0.06);
3135 fDeltaP3.AddAt(h,id);
3138 // merge fP4 histograms
3139 hm = (TH1F*)cal->fDeltaP4.At(id);
3140 h = (TH1F*)fDeltaP4.At(id);
3142 h=new TH1F(Form("hisPar4v%d",id),Form("hisPar4v%d",id),200,-0.06,0.06);
3144 fDeltaP4.AddAt(h,id);
3149 // merge fDeltaPhi histograms
3150 hm = (TH1F*)cal->fDeltaPhi.At(id);
3151 h = (TH1F*)fDeltaPhi.At(id);
3153 h= new TH1F(Form("hisdphi%d",id),Form("hisdphi%d",id),1000,-1,1);
3155 fDeltaPhi.AddAt(h,id);
3158 // merge fDeltaPhiP histograms
3159 hm = (TH1F*)cal->fDeltaPhiP.At(id);
3160 h = (TH1F*)fDeltaPhiP.At(id);
3162 h=new TH1F(Form("hisdphiP%d",id),Form("hisdphiP%d",id),1000,-0.01,0.01);
3164 fDeltaPhiP.AddAt(h,id);
3167 // merge fSignals histograms
3168 hm = (TH1F*)cal->fSignals.At(id);
3169 h = (TH1F*)fSignals.At(id);
3171 h=new TH1F(Form("hisSignal%d",id),Form("hisSignal%d",id),100,0,300);
3173 fSignals.AddAt(h,id);
3178 // merge ProfileY histograms -0
3179 h2m = (TH2F*)cal->fDeltaYres.At(id);
3180 h2 = (TH2F*)fDeltaYres.At(id);
3181 if (h2m&&h2) h2->Add(h2m);
3183 h2m = (TH2F*)cal->fDeltaZres.At(id);
3184 h2 = (TH2F*)fDeltaZres.At(id);
3185 if (h2m&&h2) h2->Add(h2m);
3186 // merge ProfileY histograms - 2
3187 h2m = (TH2F*)cal->fDeltaYres2.At(id);
3188 h2 = (TH2F*)fDeltaYres2.At(id);
3189 if (h2m&&h2) h2->Add(h2m);
3191 h2m = (TH2F*)cal->fDeltaZres2.At(id);
3192 h2 = (TH2F*)fDeltaZres2.At(id);
3193 if (h2m&&h2) h2->Add(h2m);
3195 // merge ProfileY histograms - abs
3196 h2m = (TH2F*)cal->fDeltaYresAbs.At(id);
3197 h2 = (TH2F*)fDeltaYresAbs.At(id);
3198 if (h2m&&h2) h2->Add(h2m);
3200 h2m = (TH2F*)cal->fDeltaZresAbs.At(id);
3201 h2 = (TH2F*)fDeltaZresAbs.At(id);
3202 if (h2m&&h2) h2->Add(h2m);
3203 // merge ProfileY histograms - 3
3204 //h2m = (TH2F*)cal->fDeltaYres3.At(id);
3205 //h2 = (TH2F*)fDeltaYres3.At(id);
3206 //if (h2m) h2->Add(h2m);
3208 //h2m = (TH2F*)cal->fDeltaZres3.At(id);
3209 //h2 = (TH2F*)fDeltaZres3.At(id);
3210 //if (h2m) h->Add(h2m);
3218 void AliTPCcalibLaser::MakeFitHistos(){
3220 // Make a fit histograms
3222 // Number of clusters
3224 //TH2F *fHisNclIn; //->Number of clusters inner
3225 //TH2F *fHisNclOut; //->Number of clusters outer
3226 //TH2F *fHisNclIO; //->Number of cluster inner outer
3227 // TH2F *fHisdEdx; //->dEdx histo
3228 fHisNclIn = new TH2F("HisNclIn","HisNclIn",336,0,336,64,10,64);
3229 fHisNclOut = new TH2F("HisNclOut","HisNclOut",336,0,336,100,10,100);
3230 fHisNclIO = new TH2F("HisNclIO","HisNclIO",336,0,336,160,10,160);
3232 fHisLclIn = new TH2F("HisLclIn","HisLclIn",336,0,336,64,10,64);
3233 fHisLclOut = new TH2F("HisLclOut","HisLclOut",336,0,336,100,10,150);
3234 fHisLclIO = new TH2F("HisLclIO","HisLclIO",336,0,336,160,10,160);
3236 fHisdEdx = new TH2F("HisdEdx","HisdEdx",336,0,336,160,1,50);
3237 fHisdZfit = new TH2F("HisdZfit","HisdZfit",336,0,336,300,-0.3,0.3);
3242 // TH2F *fHisChi2YIn1; //->chi2 y inner - line
3243 // TH2F *fHisChi2YOut1; //->chi2 y inner - line
3244 // TH2F *fHisChi2YIn2; //->chi2 y inner - parabola
3245 // TH2F *fHisChi2YOut2; //->chi2 y inner - parabola
3246 // TH2F *fHisChi2YIO1; //->chi2 y IO - common
3247 fHisChi2YIn1 = new TH2F("Chi2YIn1","Chi2YIn1",336,0,336,500,0.001,0.5);
3248 fHisChi2YOut1 = new TH2F("Chi2YOut1","Chi2YOut1",336,0,336,500,0.001,0.5);
3249 fHisChi2YIn2 = new TH2F("Chi2YIn2","Chi2YIn2",336,0,336,500,0.001,0.5);
3250 fHisChi2YOut2 = new TH2F("Chi2YOut2","Chi2YOut2",336,0,336,500,0.001,0.5);
3251 fHisChi2YIO1 = new TH2F("Chi2YIO1","Chi2YIO1",336,0,336,500,0.001,0.5);
3252 // TH2F *fHisChi2ZIn1; //->chi2 z inner - line
3253 // TH2F *fHisChi2ZOut1; //->chi2 z inner - line
3254 // TH2F *fHisChi2ZIn2; //->chi2 z inner - parabola
3255 // TH2F *fHisChi2ZOut2; //->chi2 z inner - parabola
3256 // TH2F *fHisChi2ZIO1; //->chi2 z IO - common
3257 fHisChi2ZIn1 = new TH2F("Chi2ZIn1","Chi2ZIn1",336,0,336,500,0.001,0.5);
3258 fHisChi2ZOut1 = new TH2F("Chi2ZOut1","Chi2ZOut1",336,0,336,500,0.001,0.5);
3259 fHisChi2ZIn2 = new TH2F("Chi2ZIn2","Chi2ZIn2",336,0,336,500,0.001,0.5);
3260 fHisChi2ZOut2 = new TH2F("Chi2ZOut2","Chi2ZOut2",336,0,336,500,0.001,0.5);
3261 fHisChi2ZIO1 = new TH2F("Chi2ZIO1","Chi2ZIO1",336,0,336,500,0.001,0.5);
3266 // TH2F *fHisPy1vP0; //-> delta y P0outer-P0inner - line
3267 // TH2F *fHisPy2vP0; //-> delta y P0outer-P0inner - parabola
3268 // TH2F *fHisPy3vP0; //-> delta y P0outer-P0inner - common parabola
3269 // TH2F *fHisPy1vP1; //-> delta ky P1outer-P1inner - line
3270 // TH2F *fHisPy2vP1; //-> delta ky P1outer-P1inner - parabola
3271 // TH2F *fHisPy3vP1; //-> delta ky P1outer-P1inner - common parabola
3272 // TH2F *fHisPy2vP2In; //-> Curv P2inner - parabola
3273 // TH2F *fHisPy2vP2Out; //-> Curv P2outer - parabola
3274 // TH2F *fHisPy3vP2IO; //-> Curv P2outerinner - common parabola
3275 fHisPy1vP0 = new TH2F("HisPy1vP0", "HisPy1vP0",336,0,336,500,-0.3,0.3);
3276 fHisPy2vP0 = new TH2F("HisPy2vP0", "HisPy2vP0",336,0,336,500,-0.3,0.3);
3277 fHisPy3vP0 = new TH2F("HisPy3vP0", "HisPy3vP0",336,0,336,500,-0.3,0.3);
3278 fHisPy1vP1 = new TH2F("HisPy1vP1", "HisPy1vP1",336,0,336,500,-0.01,0.01);
3279 fHisPy2vP1 = new TH2F("HisPy2vP1", "HisPy2vP1",336,0,336,500,-0.01,0.01);
3280 fHisPy3vP1 = new TH2F("HisPy3vP1", "HisPy3vP1",336,0,336,500,-0.01,0.01);
3281 fHisPy2vP2In = new TH2F("HisPy2vP2In", "HisPy2vP2In",336,0,336,500,-0.0003,0.0003);
3282 fHisPy2vP2Out= new TH2F("HisPy2vP2Out","HisPy2vP2Out",336,0,336,500,-0.0003,0.0003);
3283 fHisPy3vP2IO = new TH2F("HisPy3vP2IO", "HisPy3vP2IO",336,0,336,500,-0.0003,0.0003);
3286 // TH2F *fHisPz1vP0; //-> delta z P0outer-P0inner - line
3287 // TH2F *fHisPz2vP0; //-> delta z P0outer-P0inner - parabola
3288 // TH2F *fHisPz3vP0; //-> delta z P0outer-P0inner - common parabola
3289 // TH2F *fHisPz1vP1; //-> delta kz P1outer-P1inner - line
3290 // TH2F *fHisPz2vP1; //-> delta kz P1outer-P1inner - parabola
3291 // TH2F *fHisPz3vP1; //-> delta kz P1outer-P1inner - common parabola
3292 // TH2F *fHisPz2vP2In; //-> Curv P2inner - parabola
3293 // TH2F *fHisPz2vP2Out; //-> Curv P2outer - parabola
3294 // TH2F *fHisPz3vP2IO; //-> Curv P2outerinner - common parabola
3295 fHisPz1vP0 = new TH2F("HisPz1vP0", "HisPz1vP0",336,0,336,500,-0.3,0.3);
3296 fHisPz2vP0 = new TH2F("HisPz2vP0", "HisPz2vP0",336,0,336,500,-0.3,0.3);
3297 fHisPz3vP0 = new TH2F("HisPz3vP0", "HisPz3vP0",336,0,336,500,-0.3,0.3);
3298 fHisPz1vP1 = new TH2F("HisPz1vP1", "HisPz1vP1",336,0,336,500,-0.01,0.01);
3299 fHisPz2vP1 = new TH2F("HisPz2vP1", "HisPz2vP1",336,0,336,500,-0.01,0.01);
3300 fHisPz3vP1 = new TH2F("HisPz3vP1", "HisPz3vP1",336,0,336,500,-0.01,0.01);
3301 fHisPz2vP2In = new TH2F("HisPz2vP2In", "HisPz2vP2In",336,0,336,500,-0.0003,0.0003);
3302 fHisPz2vP2Out= new TH2F("HisPz2vP2Out","HisPz2vP2Out",336,0,336,500,-0.0002,0.0002);
3303 fHisPz3vP2IO = new TH2F("HisPz3vP2IO", "HisPz3vP2IO",336,0,336,500,-0.0002,0.0002);
3305 fHisYAbsErrors = new TH1F("HisYabsErrors", "Errors per beam (y)", 336, 0, 336);
3306 fHisZAbsErrors = new TH1F("HisZabsErrors", "Errors per beam (z)", 336, 0, 336);
3308 fHisNclIn->SetDirectory(0); //->Number of clusters inner
3309 fHisNclOut->SetDirectory(0); //->Number of clusters outer
3310 fHisNclIO->SetDirectory(0); //->Number of cluster inner outer
3311 fHisLclIn->SetDirectory(0); //->Level arm inner
3312 fHisLclOut->SetDirectory(0); //->Level arm outer
3313 fHisLclIO->SetDirectory(0); //->Number of cluster inner outer
3314 fHisdEdx->SetDirectory(0); //->Number of cluster inner outer
3315 fHisdZfit->SetDirectory(0); //->Number of cluster inner outer
3318 fHisChi2YIn1->SetDirectory(0); //->chi2 y inner - line
3319 fHisChi2YOut1->SetDirectory(0); //->chi2 y inner - line
3320 fHisChi2YIn2->SetDirectory(0); //->chi2 y inner - parabola
3321 fHisChi2YOut2->SetDirectory(0); //->chi2 y inner - parabola
3322 fHisChi2YIO1->SetDirectory(0); //->chi2 y IO - common
3323 fHisChi2ZIn1->SetDirectory(0); //->chi2 z inner - line
3324 fHisChi2ZOut1->SetDirectory(0); //->chi2 z inner - line
3325 fHisChi2ZIn2->SetDirectory(0); //->chi2 z inner - parabola
3326 fHisChi2ZOut2->SetDirectory(0); //->chi2 z inner - parabola
3327 fHisChi2ZIO1->SetDirectory(0); //->chi2 z IO - common
3330 fHisPy1vP0->SetDirectory(0); //-> delta y P0outer-P0inner - line
3331 fHisPy2vP0->SetDirectory(0); //-> delta y P0outer-P0inner - parabola
3332 fHisPy3vP0->SetDirectory(0); //-> delta y P0outer-P0inner - common parabola
3333 fHisPy1vP1->SetDirectory(0); //-> delta ky P1outer-P1inner - line
3334 fHisPy2vP1->SetDirectory(0); //-> delta ky P1outer-P1inner - parabola
3335 fHisPy3vP1->SetDirectory(0); //-> delta ky P1outer-P1inner - common parabola
3336 fHisPy2vP2In->SetDirectory(0); //-> Curv P2inner - parabola
3337 fHisPy2vP2Out->SetDirectory(0); //-> Curv P2outer - parabola
3338 fHisPy3vP2IO->SetDirectory(0); //-> Curv P2outerinner - common parabola
3341 fHisPz1vP0->SetDirectory(0); //-> delta z P0outer-P0inner - line
3342 fHisPz2vP0->SetDirectory(0); //-> delta z P0outer-P0inner - parabola
3343 fHisPz3vP0->SetDirectory(0); //-> delta z P0outer-P0inner - common parabola
3344 fHisPz1vP1->SetDirectory(0); //-> delta kz P1outer-P1inner - line
3345 fHisPz2vP1->SetDirectory(0); //-> delta kz P1outer-P1inner - parabola
3346 fHisPz3vP1->SetDirectory(0); //-> delta kz P1outer-P1inner - common parabola
3347 fHisPz2vP2In->SetDirectory(0); //-> Curv P2inner - parabola
3348 fHisPz2vP2Out->SetDirectory(0); //-> Curv P2outer - parabola
3349 fHisPz3vP2IO->SetDirectory(0); //-> Curv P2outerinner - common parabola
3351 fHisYAbsErrors->SetDirectory(0); //-> total errors per beam in the abs res y analysis
3352 fHisZAbsErrors->SetDirectory(0); //-> total errors per beam in the abs res z analysis
3359 for (Int_t id=0; id<336;id++){
3360 TH2F *profy = (TH2F*)fDeltaYres.UncheckedAt(id);
3361 TH2F *profz = (TH2F*)fDeltaZres.UncheckedAt(id);
3362 TH2F *profy2 = (TH2F*)fDeltaYres2.UncheckedAt(id);
3363 TH2F *profz2 = (TH2F*)fDeltaZres2.UncheckedAt(id);
3364 TH2F *profyabs = (TH2F*)fDeltaYresAbs.UncheckedAt(id);
3365 TH2F *profzabs = (TH2F*)fDeltaYresAbs.UncheckedAt(id);
3366 // TH2F *profy3 = (TH2F*)fDeltaYres3.UncheckedAt(id);
3367 //TH2F *profz3 = (TH2F*)fDeltaZres3.UncheckedAt(id);
3369 profy=new TH2F(Form("pry%03d",id),Form("Y Residuals for Laser Beam %03d -Linear",id),160,0,160,50,-0.5,0.5);
3370 profy->SetDirectory(0);
3371 fDeltaYres.AddAt(profy,id);
3372 profy2=new TH2F(Form("pry%03d",id),Form("Y Residuals for Laser Beam %03d -Parabolic",id),160,0,160,50,-0.5,0.5);
3373 profy2->SetDirectory(0);
3374 fDeltaYres2.AddAt(profy2,id);
3375 if(!fUseFixedDriftV)
3376 profyabs=new TH2F(Form("pryabs%03d",id),Form("Y Residuals for Laser Beam %03d -Absolute",id),160,0,160,100,-1.0,1.0); // has to be bigger based on earlier studies
3378 profyabs=new TH2F(Form("pryabs%03d",id),Form("Y Residuals for Laser Beam %03d -Absolute",id),160,0,160,200,-2.0,2.0); // has to be bigger based on earlier studies
3379 profyabs->SetDirectory(0);
3380 fDeltaYresAbs.AddAt(profyabs,id);
3381 //profy3=new TH2F(Form("pry%03d",id),Form("Y Residuals for Laser Beam %03d- Parabolic2",id),160,0,160,100,-0.5,0.5);
3382 //profy3->SetDirectory(0);
3383 //fDeltaYres3.AddAt(profy3,id);
3386 profz=new TH2F(Form("prz%03d",id),Form("Z Residuals for Laser Beam %03d Linear",id),160,0,160,50,-0.5,0.5);
3387 profz->SetDirectory(0);
3388 fDeltaZres.AddAt(profz,id);
3389 profz2=new TH2F(Form("prz%03d",id),Form("Z Residuals for Laser Beam %03d - Parabolic",id),160,0,160,50,-0.5,0.5);
3390 profz2->SetDirectory(0);
3391 fDeltaZres2.AddAt(profz2,id);
3392 if(!fUseFixedDriftV)
3393 profzabs=new TH2F(Form("przabs%03d",id),Form("Z Residuals for Laser Beam %03d -Absolute",id),160,0,160,100,-1.0,1.0); // has to be bigger based on earlier studies
3395 profzabs=new TH2F(Form("przabs%03d",id),Form("Z Residuals for Laser Beam %03d -Absolute",id),160,0,160,200,-2.0,2.0); // has to be bigger based on earlier studies
3396 profzabs->SetDirectory(0);
3397 fDeltaZresAbs.AddAt(profzabs,id);
3398 //profz3=new TH2F(Form("prz%03d",id),Form("Z Residuals for Laser Beam %03d- Parabolic2",id),160,0,160,100,-0.5,0.5);
3399 //profz3->SetDirectory(0);
3400 //fDeltaZres3.AddAt(profz3,id);
3405 for (Int_t id=0; id<336;id++){
3406 TH1F * hisdz = (TH1F*)fDeltaZ.At(id);
3407 TH1F * hisP3 = (TH1F*)fDeltaP3.At(id);
3408 TH1F * hisP4 = (TH1F*)fDeltaP4.At(id);
3410 TH1F * hisdphi = (TH1F*)fDeltaPhi.At(id);
3411 TH1F * hisdphiP = (TH1F*)fDeltaPhiP.At(id);
3412 TH1F * hisSignal = (TH1F*)fSignals.At(id);
3415 hisdz = new TH1F(Form("hisdz%d",id),Form("hisdz%d",id),1000,-10,10);
3416 hisdz->SetDirectory(0);
3417 fDeltaZ.AddAt(hisdz,id);
3419 hisP3 = new TH1F(Form("hisPar3v%d",id),Form("hisPar3v%d",id),400,-0.06,0.06);
3420 hisP3->SetDirectory(0);
3421 fDeltaP3.AddAt(hisP3,id);
3423 hisP4 = new TH1F(Form("hisPar4v%d",id),Form("hisPar4v%d",id),200,-0.06,0.06);
3424 hisP4->SetDirectory(0);
3425 fDeltaP4.AddAt(hisP4,id);
3428 hisdphi = new TH1F(Form("hisdphi%d",id),Form("hisdphi%d",id),1000,-1,1);
3429 hisdphi->SetDirectory(0);
3430 fDeltaPhi.AddAt(hisdphi,id);
3432 hisdphiP = new TH1F(Form("hisdphiP%d",id),Form("hisdphiP%d",id),1000,-0.01,0.01);
3433 hisdphiP->SetDirectory(0);
3434 fDeltaPhiP.AddAt(hisdphiP,id);
3435 hisSignal = new TH1F(Form("hisSignal%d",id),Form("hisSignal%d",id),100,0,300);
3436 hisSignal->SetDirectory(0);
3437 fSignals.AddAt(hisSignal,id);
3441 SetBeamParameters(fBeamOffsetZOuter, fBeamSlopeZOuter, fBeamSectorOuter,2);
3442 SetBeamParameters(fBeamOffsetZInner, fBeamSlopeZInner, fBeamSectorInner,3);
3443 SetBeamParameters(fBeamOffsetYOuter, fBeamSlopeYOuter, fBeamSectorOuter,0);
3444 SetBeamParameters(fBeamOffsetYInner, fBeamSlopeYInner, fBeamSectorInner,1);
3448 // id side rod bundle beam dP0 dP1 dP2 dP3 dP4 ncl dEdx
3449 Int_t binsLaser[12]= {336, //id
3461 Double_t xminLaser[12]= {0, //id
3473 Double_t xmaxLaser[12]= {336, //id
3486 TString nameLaser[12]= {"id",
3498 TString titleLaser[12]= {"id",
3510 fHisLaser = new THnSparseS("dLaser","#Delta_{Laser}", 12, binsLaser,xminLaser, xmaxLaser);
3511 for (Int_t iaxis=1; iaxis<12; iaxis++){
3512 fHisLaser->GetAxis(iaxis)->SetName(nameLaser[iaxis]);
3513 fHisLaser->GetAxis(iaxis)->SetTitle(titleLaser[iaxis]);
3517 void AliTPCcalibLaser::MergeFitHistos(AliTPCcalibLaser * laser){
3519 // Merge content of histograms
3521 // Only first histogram is checked - all other should be the same
3522 if (fHisLaser &&laser->fHisLaser) fHisLaser->Add(laser->fHisLaser);
3524 if (!laser->fHisNclIn) return; // empty histograms
3525 if (!fHisNclIn) MakeFitHistos();
3527 fHisNclIn->Add(laser->fHisNclIn ); //->Number of clusters inner
3528 fHisNclOut->Add(laser->fHisNclOut ); //->Number of clusters outer
3529 fHisNclIO->Add(laser->fHisNclIO ); //->Number of cluster inner outer
3530 fHisLclIn->Add(laser->fHisLclIn ); //->Level arm inner
3531 fHisLclOut->Add(laser->fHisLclOut ); //->Level arm outer
3532 fHisLclIO->Add(laser->fHisLclIO ); //->Number of cluster inner outer
3533 fHisdEdx->Add(laser->fHisdEdx ); //->dedx
3534 fHisdZfit->Add(laser->fHisdZfit ); //->dedx
3537 fHisChi2YIn1->Add(laser->fHisChi2YIn1 ); //->chi2 y inner - line
3538 fHisChi2YOut1->Add(laser->fHisChi2YOut1 ); //->chi2 y inner - line
3539 fHisChi2YIn2->Add(laser->fHisChi2YIn2 ); //->chi2 y inner - parabola
3540 fHisChi2YOut2->Add(laser->fHisChi2YOut2 ); //->chi2 y inner - parabola
3541 fHisChi2YIO1->Add(laser->fHisChi2YIO1 ); //->chi2 y IO - common
3542 fHisChi2ZIn1->Add(laser->fHisChi2ZIn1 ); //->chi2 z inner - line
3543 fHisChi2ZOut1->Add(laser->fHisChi2ZOut1 ); //->chi2 z inner - line
3544 fHisChi2ZIn2->Add(laser->fHisChi2ZIn2 ); //->chi2 z inner - parabola
3545 fHisChi2ZOut2->Add(laser->fHisChi2ZOut2 ); //->chi2 z inner - parabola
3546 fHisChi2ZIO1->Add(laser->fHisChi2ZIO1 ); //->chi2 z IO - common
3549 fHisPy1vP0->Add(laser->fHisPy1vP0 ); //-> delta y P0outer-P0inner - line
3550 fHisPy2vP0->Add(laser->fHisPy2vP0 ); //-> delta y P0outer-P0inner - parabola
3551 fHisPy3vP0->Add(laser->fHisPy3vP0 ); //-> delta y P0outer-P0inner - common parabola
3552 fHisPy1vP1->Add(laser->fHisPy1vP1 ); //-> delta ky P1outer-P1inner - line
3553 fHisPy2vP1->Add(laser->fHisPy2vP1 ); //-> delta ky P1outer-P1inner - parabola
3554 fHisPy3vP1->Add(laser->fHisPy3vP1 ); //-> delta ky P1outer-P1inner - common parabola
3555 fHisPy2vP2In->Add(laser-> fHisPy2vP2In ); //-> Curv P2inner - parabola
3556 fHisPy2vP2Out->Add(laser->fHisPy2vP2Out ); //-> Curv P2outer - parabola
3557 fHisPy3vP2IO->Add(laser->fHisPy3vP2IO ); //-> Curv P2outerinner - common parabola
3560 fHisPz1vP0->Add(laser->fHisPz1vP0 ); //-> delta z P0outer-P0inner - line
3561 fHisPz2vP0->Add(laser->fHisPz2vP0 ); //-> delta z P0outer-P0inner - parabola
3562 fHisPz3vP0->Add(laser->fHisPz3vP0 ); //-> delta z P0outer-P0inner - common parabola
3563 fHisPz1vP1->Add(laser->fHisPz1vP1 ); //-> delta kz P1outer-P1inner - line
3564 fHisPz2vP1->Add(laser->fHisPz2vP1 ); //-> delta kz P1outer-P1inner - parabola
3565 fHisPz3vP1->Add(laser->fHisPz3vP1 ); //-> delta kz P1outer-P1inner - common parabola
3566 fHisPz2vP2In->Add(laser->fHisPz2vP2In ); //-> Curv P2inner - parabola
3567 fHisPz2vP2Out->Add(laser->fHisPz2vP2Out ); //-> Curv P2outer - parabola
3568 fHisPz3vP2IO->Add(laser->fHisPz3vP2IO ); //-> Curv P2outerinner - common parabola
3569 fHisYAbsErrors->Add(laser->fHisYAbsErrors); //-> total errors per beam in the abs res y analysis
3570 fHisZAbsErrors->Add(laser->fHisZAbsErrors); //-> total errors per beam in the abs res z analysis
3583 void AliTPCcalibLaser::DumpFitInfo(TTree * chainFit,Int_t id){
3585 // Dump fit information - collect information from the streamers
3588 TChain * chainFit=0;
3589 TChain * chainTrack=0;
3592 gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
3593 gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+");
3594 AliXRDPROOFtoolkit tool;
3595 chainTrack = tool.MakeChain("laser.txt","Track",0,10200);
3596 chainTrack->Lookup();
3597 chainTrack->SetProof(kTRUE);
3598 chainDrift = tool.MakeChain("laser.txt","driftv",0,10200);
3599 chainDrift->Lookup();
3600 chainDrift->SetProof(kTRUE);
3602 chain = tool.MakeChain("laser.txt","Residuals",0,10200);
3604 chainFit = tool.MakeChain("laser.txt","FitModels",0,10200);
3606 chainFit->SetProof(kTRUE);
3607 chain->SetProof(kTRUE);
3608 AliTPCLaserTrack::LoadTracks();
3609 //AliTPCcalibLaser::DumpFitInfo(chainFit,0);
3615 TCut cutP3("abs(Tr.fP[3])<0.1");
3616 TCut cutP4("abs(Tr.fP[4])<0.5");
3617 TCut cutPx = cutP3+cutP4;
3618 TCut cutChi2YOut("sqrt(chi2y2Out*dEdx)<5&&chi2y2Out>0");
3619 TCut cutChi2ZOut("sqrt(chi2z2Out*dEdx)<5&&chi2z2Out>0");
3620 TCut cutChi2YIn("sqrt(chi2y2In*dEdx)<5&&chi2y2In>0");
3621 TCut cutChi2ZIn("sqrt(chi2z2In*dEdx)<5&&chi2z2In>0");
3623 TCut cutdEdx("sqrt(dEdx)>3");
3624 TCut cutDY("abs(yPol2In.fElements[2]*nclI*nclI/4.)<3");
3625 TCut cutN("nclO>20&&nclI>20");
3626 TCut cutA = cutChi2YOut+cutChi2ZOut+cutChi2YIn+cutChi2ZIn+cutN+cutdEdx+cutPx+"accept";
3630 TCut cutClY("abs(Cl[].fY-TrYpol2.fElements)<0.15");
3631 TCut cutClZ("abs(Cl[].fZ-TrZpol2.fElements)<0.15");
3632 TCut cutClX("abs(Cl[].fX)>10");
3633 TCut cutE("abs(Cl[].fY/Cl[].fX)<0.14");
3634 TCut cutSY("sqrt(Cl[].fSigmaY2)>0.05");
3635 TCut cutSZ("sqrt(Cl[].fSigmaZ2)>0.05");
3636 TCut cutQ("sqrt(Cl[].fMax)>4");
3637 TCut cutCl=cutClY+cutClZ+cutClX+cutE+cutSY+cutSZ+cutQ;
3641 TH1F * phisAccept = 0;
3643 TProfile * pdEdx = 0;
3651 TProfile * pNclI = 0;
3652 TProfile * pNclO = 0;
3654 TProfile * pchi2YIn =0;
3655 TProfile * pchi2ZIn =0;
3656 TProfile * pchi2YOut =0;
3657 TProfile * pchi2ZOut =0;
3658 TProfile * pchi2YInOut =0;
3659 TProfile * pchi2ZInOut =0;;
3661 chainFit->Draw("LTr.fId>>hisAl(350,0,350)","LTr.fId<350");
3662 phisAl = (TH1F*)gROOT->FindObject("hisAl");
3663 chainFit->Draw("LTr.fId>>hisAccept(350,0,350)","LTr.fId<350"+cutA);
3664 phisAccept = (TH1F*)gROOT->FindObject("hisAccept");
3665 chainFit->Draw("LTr.fId>>hisOut(350,0,350)","LTr.fId<350"+!cutA);
3666 phisOut = (TH1F*)gROOT->FindObject("hisOut");
3668 chainFit->Draw("sqrt(dEdx):LTr.fId>>hdEdx(350,0,350)","","prof");
3669 pdEdx = (TProfile*)gROOT->FindObject("hdEdx");
3672 chainFit->Draw("Tr.fP[0]:LTr.fId>>hP0(350,0,350)","Tr.fP[4]/sqrt(Tr.fC[14])<20"+cutA,"prof");
3673 pP0 = (TProfile*)gROOT->FindObject("hP0");
3674 chainFit->Draw("Tr.fP[1]:LTr.fId>>hP1(350,0,350)","Tr.fP[4]/sqrt(Tr.fC[14])<20"+cutA,"prof");
3675 pP1 = (TProfile*)gROOT->FindObject("hP1");
3676 chainFit->Draw("Tr.fP[2]:LTr.fId>>hP2(350,0,350)","Tr.fP[4]/sqrt(Tr.fC[14])<20"+cutA,"prof");
3677 pP2 = (TProfile*)gROOT->FindObject("hP2");
3678 chainFit->Draw("Tr.fP[3]:LTr.fId>>hP3(350,0,350)","Tr.fP[4]/sqrt(Tr.fC[14])<20"+cutA,"prof");
3679 pP3 = (TProfile*)gROOT->FindObject("hP3");
3680 chainFit->Draw("Tr.fP[4]:LTr.fId>>hP4(350,0,350)","Tr.fP[4]/sqrt(Tr.fC[14])<20"+cutA,"prof");
3681 pP4 = (TProfile*)gROOT->FindObject("hP4");
3683 chainFit->Draw("nclI:LTr.fId>>hNclI(350,0,350)","","prof");
3684 pNclI = (TProfile*)gROOT->FindObject("hNclI");
3685 chainFit->Draw("nclO:LTr.fId>>hNclO(350,0,350)","","prof");
3686 pNclO = (TProfile*)gROOT->FindObject("hNclO");
3689 chainFit->Draw("sqrt(chi2y2In):LTr.fId>>hChi2YIn(350,0,350)",cutA+"","prof");
3690 pchi2YIn = (TProfile*)gROOT->FindObject("hChi2YIn");
3691 chainFit->Draw("sqrt(chi2y2Out):LTr.fId>>hChi2YOut(350,0,350)",cutA+"","prof");
3692 pchi2YOut = (TProfile*)gROOT->FindObject("hChi2YOut");
3693 chainFit->Draw("sqrt(chi2yInOut):LTr.fId>>hChi2YInOut(350,0,350)",cutA+"","prof");
3694 pchi2YInOut = (TProfile*)gROOT->FindObject("hChi2YInOut");
3695 chainFit->Draw("sqrt(chi2z2In):LTr.fId>>hChi2ZIn(350,0,350)",cutA+"","prof");
3696 pchi2ZIn = (TProfile*)gROOT->FindObject("hChi2ZIn");
3697 chainFit->Draw("sqrt(chi2z2Out):LTr.fId>>hChi2ZOut(350,0,350)",cutA+"","prof");
3698 pchi2ZOut = (TProfile*)gROOT->FindObject("hChi2ZOut");
3699 chainFit->Draw("sqrt(chi2zInOut):LTr.fId>>hChi2ZInOut(350,0,350)",cutA+"","prof");
3700 pchi2ZInOut = (TProfile*)gROOT->FindObject("hChi2ZInOut");
3702 // second derivatives
3704 TH2F * phisPy2In = new TH2F("Py2Inner","Py2Inner",350,0,350,100,-0.001,0.001);
3705 chainFit->Draw("yPol2In.fElements[2]:LTr.fId>>Py2Inner",cutA,"");
3706 TH2F * phisPy2Out = new TH2F("Py2Outer","Py2Outer",350,0,350,200,-0.0005,0.0005);
3707 chainFit->Draw("yPol2Out.fElements[2]:LTr.fId>>Py2Outer",cutA,"");
3708 TH2F * phisPy2InOut = new TH2F("Py2InOut","Py2InOut",350,0,350,200,-0.0005,0.0005);
3709 chainFit->Draw("yInOut.fElements[4]:LTr.fId>>Py2InOut",cutA,"");
3711 phisPy2In->FitSlicesY();
3712 TH1D * phisPy2InEntries = (TH1D*)gROOT->FindObject("Py2Inner_0");
3713 TH1D * phisPy2InMean = (TH1D*)gROOT->FindObject("Py2Inner_1");
3714 TH1D * phisPy2InSigma = (TH1D*)gROOT->FindObject("Py2Inner_2");
3716 phisPy2Out->FitSlicesY();
3717 TH1D * phisPy2OutEntries = (TH1D*)gROOT->FindObject("Py2Outer_0");
3718 TH1D * phisPy2OutMean = (TH1D*)gROOT->FindObject("Py2Outer_1");
3719 TH1D * phisPy2OutSigma = (TH1D*)gROOT->FindObject("Py2Outer_2");
3721 phisPy2InOut->FitSlicesY();
3722 TH1D * phisPy2InOutEntries = (TH1D*)gROOT->FindObject("Py2InOut_0");
3723 TH1D * phisPy2InOutMean = (TH1D*)gROOT->FindObject("Py2InOut_1");
3724 TH1D * phisPy2InOutSigma = (TH1D*)gROOT->FindObject("Py2InOut_2");
3726 TH2F * phisPz2In = new TH2F("Pz2Inner","Pz2Inner",350,0,350,100,-0.001,0.001);
3727 chainFit->Draw("zPol2In.fElements[2]:LTr.fId>>Pz2Inner",cutA,"");
3728 TH2F * phisPz2Out = new TH2F("Pz2Outer","Pz2Outer",350,0,350,200,-0.0005,0.0005);
3729 chainFit->Draw("zPol2Out.fElements[2]:LTr.fId>>Pz2Outer",cutA,"");
3730 TH2F * phisPz2InOut = new TH2F("Pz2InOut","Pz2InOut",350,0,350,200,-0.0005,0.0005);
3731 chainFit->Draw("zInOut.fElements[4]:LTr.fId>>Pz2InOut",cutA,"");
3733 phisPz2In->FitSlicesY();
3734 TH1D * phisPz2InEntries = (TH1D*)gROOT->FindObject("Pz2Inner_0");
3735 TH1D * phisPz2InMean = (TH1D*)gROOT->FindObject("Pz2Inner_1");
3736 TH1D * phisPz2InSigma = (TH1D*)gROOT->FindObject("Pz2Inner_2");
3738 phisPz2Out->FitSlicesY();
3739 TH1D * phisPz2OutEntries = (TH1D*)gROOT->FindObject("Pz2Outer_0");
3740 TH1D * phisPz2OutMean = (TH1D*)gROOT->FindObject("Pz2Outer_1");
3741 TH1D * phisPz2OutSigma = (TH1D*)gROOT->FindObject("Pz2Outer_2");
3743 phisPz2InOut->FitSlicesY();
3744 TH1D * phisPz2InOutEntries = (TH1D*)gROOT->FindObject("Pz2InOut_0");
3745 TH1D * phisPz2InOutMean = (TH1D*)gROOT->FindObject("Pz2InOut_1");
3746 TH1D * phisPz2InOutSigma = (TH1D*)gROOT->FindObject("Pz2InOut_2");
3753 TTreeSRedirector *pcstream = new TTreeSRedirector("vscan.root");
3754 for (Int_t ilaser=0; ilaser<336; ilaser++){
3755 Float_t all=phisAl->GetBinContent(ilaser+1);
3756 Float_t accept=phisAccept->GetBinContent(ilaser+1);
3757 Float_t out=phisOut->GetBinContent(ilaser+1);
3758 Float_t sdedx = pdEdx->GetBinContent(ilaser+1);
3759 Float_t mP0 = pP0->GetBinContent(ilaser+1);
3760 Float_t mP1 = pP1->GetBinContent(ilaser+1);
3761 Float_t mP2 = pP2->GetBinContent(ilaser+1);
3762 Float_t mP3 = pP3->GetBinContent(ilaser+1);
3763 Float_t mP4 = pP4->GetBinContent(ilaser+1);
3766 Float_t nclI = pNclI->GetBinContent(ilaser+1);
3767 Float_t nclO = pNclO->GetBinContent(ilaser+1);
3769 Float_t chi2YIn=pchi2YIn->GetBinContent(ilaser+1);
3770 Float_t chi2YOut=pchi2YOut->GetBinContent(ilaser+1);
3771 Float_t chi2YInOut=pchi2YInOut->GetBinContent(ilaser+1);
3772 Float_t chi2ZIn=pchi2ZIn->GetBinContent(ilaser+1);
3773 Float_t chi2ZOut=pchi2ZOut->GetBinContent(ilaser+1);
3774 Float_t chi2ZInOut=pchi2ZInOut->GetBinContent(ilaser+1);
3776 Float_t entriesPy2In = phisPy2InEntries->GetBinContent(ilaser+1);
3777 Float_t meanPy2In = phisPy2InMean->GetBinContent(ilaser+1);
3778 Float_t sigmaPy2In = phisPy2InSigma->GetBinContent(ilaser+1);
3780 Float_t entriesPy2Out = phisPy2OutEntries->GetBinContent(ilaser+1);
3781 Float_t meanPy2Out = phisPy2OutMean->GetBinContent(ilaser+1);
3782 Float_t sigmaPy2Out = phisPy2OutSigma->GetBinContent(ilaser+1);
3784 Float_t entriesPy2InOut = phisPy2InOutEntries->GetBinContent(ilaser+1);
3785 Float_t meanPy2InOut = phisPy2InOutMean->GetBinContent(ilaser+1);
3786 Float_t sigmaPy2InOut = phisPy2InOutSigma->GetBinContent(ilaser+1);
3788 Float_t entriesPz2In = phisPz2InEntries->GetBinContent(ilaser+1);
3789 Float_t meanPz2In = phisPz2InMean->GetBinContent(ilaser+1);
3790 Float_t sigmaPz2In = phisPz2InSigma->GetBinContent(ilaser+1);
3792 Float_t entriesPz2Out = phisPz2OutEntries->GetBinContent(ilaser+1);
3793 Float_t meanPz2Out = phisPz2OutMean->GetBinContent(ilaser+1);
3794 Float_t sigmaPz2Out = phisPz2OutSigma->GetBinContent(ilaser+1);
3796 Float_t entriesPz2InOut = phisPz2InOutEntries->GetBinContent(ilaser+1);
3797 Float_t meanPz2InOut = phisPz2InOutMean->GetBinContent(ilaser+1);
3798 Float_t sigmaPz2InOut = phisPz2InOutSigma->GetBinContent(ilaser+1);
3800 AliTPCLaserTrack* ltrp =(AliTPCLaserTrack*)AliTPCLaserTrack::GetTracks()->UncheckedAt(ilaser);
3801 (*pcstream)<<"Scan"<<
3815 "chi2YIn="<<chi2YIn<<
3816 "chi2YOut="<<chi2YOut<<
3817 "chi2YInOut="<<chi2YInOut<<
3818 "chi2ZIn="<<chi2ZIn<<
3819 "chi2ZOut="<<chi2ZOut<<
3820 "chi2ZInOut="<<chi2ZInOut<<
3822 "nPy2In="<<entriesPy2In<<
3823 "mPy2In="<<meanPy2In<<
3824 "sPy2In="<<sigmaPy2In<<
3826 "nPy2Out="<<entriesPy2Out<<
3827 "mPy2Out="<<meanPy2Out<<
3828 "sPy2Out="<<sigmaPy2Out<<
3830 "nPy2InOut="<<entriesPy2InOut<<
3831 "mPy2InOut="<<meanPy2InOut<<
3832 "sPy2InOut="<<sigmaPy2InOut<<
3834 "nPz2In="<<entriesPz2In<<
3835 "mPz2In="<<meanPz2In<<
3836 "sPz2In="<<sigmaPz2In<<
3838 "nPz2Out="<<entriesPz2Out<<
3839 "mPz2Out="<<meanPz2Out<<
3840 "sPz2Out="<<sigmaPz2Out<<
3842 "nPz2InOut="<<entriesPz2InOut<<
3843 "mPz2InOut="<<meanPz2InOut<<
3844 "sPz2InOut="<<sigmaPz2InOut<<
3852 void AliTPCcalibLaser::SetBeamParameters(TVectorD& meanOffset,
3853 TVectorD& meanSlope,
3854 TVectorD& sectorArray,
3857 // This method should ideally go in AliTPCLaser
3858 // option == 0 (pads outer - closest to beam)
3859 // option == 1 (pads inner)
3860 // option == 2 (time outer)
3861 // option == 3 (time inner)
3862 Int_t nFailures = 0;
3864 for(Int_t id = 0; id < 336; id++) {
3866 if (!AliTPCLaserTrack::GetTracks())
3867 AliTPCLaserTrack::LoadTracks();
3868 AliTPCLaserTrack *ltrp =
3869 (AliTPCLaserTrack*)AliTPCLaserTrack::GetTracks()->UncheckedAt(id);
3871 AliExternalTrackParam trackParam(*ltrp);
3873 Double_t deltaangle = 10.0; // sector is 1/2 a sector away from mirror
3874 if((option==1 || option==3)&& (ltrp->GetBeam()<=1 || ltrp->GetBeam()>=5))
3875 deltaangle = 30.0; // inner sector is 1 sector further away from mirror
3877 Double_t angle = trackParam.GetAlpha();
3879 angle += 2*TMath::Pi();
3880 if(trackParam.GetSnp()>0) // track points to sector "before"
3881 angle -= deltaangle*TMath::DegToRad();
3882 else // track points to sector "after"
3883 angle += deltaangle*TMath::DegToRad();
3885 Bool_t success = trackParam.Rotate(angle);
3888 // cout << "WARNING: Rotate failed for ID: " << id << endl;
3892 angle *= TMath::RadToDeg();
3894 Int_t sector = TMath::Nint((angle-10.0)/20.0);
3899 if(ltrp->GetSide()==1) // C side
3901 if(option==0 || option==2)
3903 if((option==1||option==3)&&(ltrp->GetBeam()==0||ltrp->GetBeam()==6))
3906 sectorArray[id] = sector;
3908 const Double_t x0 = 0;
3910 Double_t slopey = TMath::Tan(TMath::ASin(trackParam.GetSnp()));
3911 Double_t slopez = trackParam.GetTgl();
3912 // One needs a factor sqrt(1+slopey**2) to take into account the
3913 // longer path length
3914 slopez *= TMath::Sqrt(1.0 + slopey*slopey);
3915 if(fInverseSlopeZ) // wrong sign in database, should be fixed there
3917 // Double_t offsetz = trackParam.GetZ();
3918 Double_t offsety = trackParam.GetY() + slopey*(x0-trackParam.GetX());
3919 Double_t offsetz = trackParam.GetZ() + slopez*(x0-trackParam.GetX());
3920 if(option==2 || option==3) {
3921 meanOffset[id] = offsetz; meanSlope[id] = slopez;
3923 meanOffset[id] = offsety; meanSlope[id] = slopey;
3928 AliWarning(Form("Rotate method failed %d times", nFailures));
3933 TFile f("vscan.root");
3938 chain->Draw("Cl[].fPad-int(Cl[].fPad)",cutA+cutCl+"Cl[].fZ>0&&Cl[].fPad>1","",10000);
3940 chain->Draw("Cl[].fY-TrYpol1.fElements:Cl[].fPad-int(Cl[].fPad)",cutA+cutCl+"Cl[].fZ>0&&Cl[].fPad>1","prof",10000);
3943 chain->Draw("Cl.fY-TrYpol1.fElements-AliTPCClusterParam::SPosCorrection(0,1,Cl[].fPad,Cl[].fTimeBin,Cl[].fZ,Cl[].fSigmaY2,Cl[].fSigmaZ2,Cl[].fMax):Cl[].fPad-int(Cl[].fPad)",cutA+cutCl+"Cl[].fZ>0&&Cl[].fPad>1","prof",10000);
3946 chain->Draw("Cl[].fZ-TrZpol1.fElements-0*AliTPCClusterParam::SPosCorrection(1,1,Cl[].fPad,Cl[].fTimeBin,Cl[].fZ,Cl[].fSigmaY2,Cl[].fSigmaZ2,Cl[].fMax):Cl[].fTimeBin-int(Cl[].fTimeBin)",cutA+cutCl+"Cl[].fZ>0","prof",10000)
3955 // check edge effects
3956 chain->Draw("Cl.fY-TrYpol1.fElements:Cl.fY/Cl.fX",""+cutA+cutCl,"prof",10000)
3958 chain->Draw("Cl.fY-TrYpol2.fElements:Cl.fPad-int(Cl.fPad)","Cl.fZ>0"+cutA+cutCl+cutE,"prof",100000)
3960 chain->Draw("Cl.fY-TrYpol2.fElements:Cl.fPad-int(Cl.fPad)","Cl.fX>80&&Cl.fZ>0&&Cl.fDetector>35"+cutA+cutCl+cutE,"prof",100000)
3964 chainFit->Draw("yInOut.fElements[4]:LTr.fP[2]","LTr.fP[1]<0"+cutA,"prof",1000);
3965 chainFit->Draw("yPol2In.fElements[2]*90*90/4.:LTr.fP[2]","nclO>40&<r.fP[1]<0"+cutA+cutD,"prof")
3976 dedge = sign(Cl.fY)*(Cl.fX*tan(pi/18)-abs(Cl.fY))
3979 chain->Draw("sign(Cl.fY)*(Cl.fY-TrYpol1.fElements):pi/18-abs(Cl.fY/Cl.fX)>>hisYdphi(100,0,0.03)",""+cutA+cutCl,"prof",10000)
3981 chain->Draw("sign(Cl.fY)*(Cl.fY-TrYpol1.fElements):Cl.fX*(pi/18-abs(Cl.fY/Cl.fX))>>hisYdy(100,0,5)",""+cutA+cutCl,"prof",10000)
3987 chain->Draw("sign(Cl.fY)*(Cl.fY-TrYpol1.fElements):Cl.fX*(pi/18-abs(Cl.fY/Cl.fX))>>hisYdyIROC(100,0,5)","Cl.fDetector<36"+cutA+cutCl,"prof",100000)
3989 chain->Draw("sign(Cl.fY)*(Cl.fY-TrYpol1.fElements):Cl.fX*(pi/18-abs(Cl.fY/Cl.fX))>>hisYdyOROC(100,0,5)","Cl.fDetector>36"+cutA+cutCl,"prof",100000)
3993 chain->Draw("Cl.fY-TrYpol1.fElements:sign(Cl.fY)*(Cl.fX*tan(pi/18)-abs(Cl.fY))>>his(100,-5,5)",""+cutA+cutCl,"prof",100000)
3995 chain->Draw("Cl.fY-TrYpol1.fElements:sign(Cl.fY)*(Cl.fX*tan(pi/18)-abs(Cl.fY))>>hisdyInner(100,-5,5)","Cl.fDetector<36"+cutA+cutCl,"prof",100000)
4004 chainFit->Draw("yPol2Out.fElements[2]*90*90/4.:LTr.fP[2]","nclO>40&<r.fP[1]<0"+cutA+cutDY,"prof")
4006 chainFit->Draw("yPol2In.fElements[2]*64*64/4.:LTr.fP[2]","nclI>20&<r.fP[1]<0"+cutA+cutDY,"prof")
4010 chainFit->Draw("LTr.fId","nclI>10",100000)
4012 chainFit->Draw("yPol2In.fElements[2]:LTr.fId>>his(350,0,350,100,-0.002,0.002)","nclI>20","")
4014 chainFit->Draw("yPol2In.fElements[2]:LTr.fId>>hisPy2In0(350,0,350,100,-0.002,0.002)","nclI>20","");
4016 TH2 * phisPy2In = (TH2*) gROOT->FindObject("hisPy2In0")
4026 gSystem->Load("libSTAT.so")
4027 TStatToolkit toolkit;
4033 TCut cutA("entries>2&&pphi2<3&&abs(gphiP1-pphiP0)<0.003&&abs(gz1)<6");
4038 fstring+="(abs(LTr.fP[1]/250)^3-1)*bz++"; //1
4039 fstring+="(abs(LTr.fP[1]/250)^3-1)*bz*LTr.fP[2]++"; //2
4040 fstring+="(abs(LTr.fP[1]/250)^1-1)*bz++"; //3
4041 fstring+="(abs(LTr.fP[1]/250)-1)*bz*LTr.fP[2]++"; //4
4043 fstring+="(abs(LTr.fP[1]/250)^3-1)*bz*sin(atan2(lx1,lx0))++" //5
4044 fstring+="(abs(LTr.fP[1]/250)^3-1)*bz*sin(atan2(lx1,lx0))*LTr.fP[2]++" //6
4045 fstring+="(abs(LTr.fP[1]/250)-1)*bz*sin(atan2(lx1,lx0))++" //7
4046 fstring+="(abs(LTr.fP[1]/250)-1)*bz*sin(atan2(lx1,lx0))*LTr.fP[2]++" //8
4048 fstring+="(abs(LTr.fP[1]/250)^3-1)*bz*cos(atan2(lx1,lx0))++" //9
4049 fstring+="(abs(LTr.fP[1]/250)^3-1)*bz*cos(atan2(lx1,lx0))*LTr.fP[2]++" //10
4050 fstring+="(abs(LTr.fP[1]/250)-1)*bz*cos(atan2(lx1,lx0))++" //11
4051 fstring+="(abs(LTr.fP[1]/250)-1)*bz*cos(atan2(lx1,lx0))*LTr.fP[2]++" //12
4056 TString *strq0 = toolkit.FitPlane(treeT,"gphi1-pphi0",fstring->Data(), "fSide==1"+cutA, chi2,npoints,fitParam,covMatrix);
4058 treeT->SetAlias("fit",strq0->Data());
4061 TString *strqP = toolkit.FitPlane(treeT,"1000*(gphiP1-pphiP0)",fstring->Data(), "fSide==1"+cutA, chi2,npoints,fitParam,covMatrix);
4063 treeT->SetAlias("fitP",strqP->Data());
4066 TString *strqDrift = toolkit.FitPlane(treeT,"gz1","LTr.fP[1]++(1-2*(fSide==1))++lx1", cutA, chi2,npoints,fitParam,covMatrix);
4067 treeT->SetAlias("fitD",strqDrift->Data());
4070 treeT->Draw("fit:LTr.fP[1]","abs(bz+0.4)<0.05"+cutA,"");
4072 for (Int_t i=0; i<6;i++){
4073 treeT->SetLineColor(i+2);
4074 treeT->SetMarkerSize(1);
4075 treeT->SetMarkerStyle(22+i);
4076 treeT->SetMarkerColor(i+2);
4078 treeT->Draw("fit:LTr.fP[1]",Form("abs(bz+0.4)<0.05&fRod==%d",i)+cutA,"same");
4086 TTree * tree = (TTree*)f.Get("FitModels");
4088 TEventList listLFit0("listLFit0","listLFit0");
4089 TEventList listLFit1("listLFit1","listLFit1");
4090 tree->Draw(">>listLFit0","seed.fdEdx<200&&seed.fdEdx>40");
4091 tree->SetEventList(&listLFit0);
4096 gSystem->Load("libSTAT.so")
4097 TStatToolkit toolkit;
4103 chain->SetAlias("dp","((Cl.fPad-int(Cl.fPad))*pi)");
4104 chain->SetAlias("dt","((Cl.fTimeBin-int(Cl.fTimeBin))*pi)");
4108 fstring+="cos(dp)++";
4109 fstring+="sin(dp)++";
4110 fstring+="cos(dt)++";
4111 fstring+="sin(dt)++";
4113 TString *str = toolkit.FitPlane(chain,"Cl.fZ-TrZInOut.fElements",fstring->Data(), "Cl.fDetector>35", chi2,npoints,fitParam,covMatrix,-1,0,200);
4126 gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
4127 gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+")
4128 AliXRDPROOFtoolkit tool;
4129 TChain * chainTrack = tool.MakeChain("laser.txt","Track",0,10200);
4130 chainTrack->Lookup();
4131 chainTrack->SetProof(kTRUE);
4133 TChain * chain = tool.MakeChain("laser.txt","Residuals",0,10200);
4135 TChain * chainFit = tool.MakeChain("laser.txt","FitModels",0,10200);
4137 chainFit->SetProof(kTRUE);
4138 chain->SetProof(kTRUE);
4142 TCut cutChi2YOut("sqrt(chi2y2Out*dEdx)<10");
4143 TCut cutChi2ZOut("sqrt(chi2z2Out*dEdx)<10");
4144 TCut cutChi2YIn("sqrt(chi2y2In*dEdx)<10");
4145 TCut cutChi2ZIn("sqrt(chi2z2In*dEdx)<10");
4147 TCut cutdEdx("sqrt(dEdx)<30&&sqrt(dEdx)>3");
4148 TCut cutDY("abs(yPol2In.fElements[2]*nclO*nclO/4.)<3")
4149 TCut cutN("nclO>20&&nclI>20");
4150 TCut cutA = cutChi2YOut+cutChi2ZOut+cutChi2YIn+cutChi2ZIn+cutN+cutdEdx;
4154 TCut cutClY("abs(Cl.fY-TrYpol2.fElements)<0.2");
4155 TCut cutClZ("abs(Cl.fZ-TrZpol2.fElements)<0.4");
4156 TCut cutClX("abs(Cl.fX)>10");
4157 TCut cutE("abs(Cl.fY/Cl.fX)<0.14");
4158 TCut cutCl=cutClY+cutClZ+cutClX;
4161 // check edge effects
4162 chain->Draw("Cl.fY-TrYpol1.fElements:Cl.fY/Cl.fX",""+cutA+cutCl,"prof",10000)
4164 chain->Draw("Cl.fY-TrYpol2.fElements:Cl.fPad-int(Cl.fPad)","Cl.fZ>0"+cutA+cutCl+cutE,"prof",100000)
4166 chain->Draw("Cl.fY-TrYpol2.fElements:Cl.fPad-int(Cl.fPad)","Cl.fX>80&&Cl.fZ>0&&Cl.fDetector>35"+cutA+cutCl+cutE,"prof",100000)
4170 chainFit->Draw("yInOut.fElements[4]:LTr.fP[2]","LTr.fP[1]<0"+cutA,"prof",1000);
4171 chainFit->Draw("yPol2In.fElements[2]*90*90/4.:LTr.fP[2]","nclO>40&<r.fP[1]<0"+cutA+cutD,"prof")