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 **************************************************************************/
17 laser track clasification;
18 TCut cutT("cutT","abs(Tr.fP[3])<0.06");
19 TCut cutPt("cutPt","abs(Tr.fP[4])<0.1");
20 TCut cutN("cutN","fTPCncls>70");
21 TCut cutP("cutP","abs(atan2(x1,x0)-atan2(lx1,lx0))<0.03")
22 TCut cutA = cutT+cutPt+cutP;
23 TFile f("laserTPCDebug.root");
24 TTree * treeT = (TTree*)f.Get("Track");
27 treeT->Draw("(atan2(x1,x0)-atan2(lx1,lx0))*250.:fBundle","fSide==1&&fRod==0"+cutA,"prof")
29 gSystem->Load("libSTAT.so")
35 TString *strq0 = toolkit.FitPlane(treeT,"Tr.fP[1]-LTr.fP[1]","lx1++lx2", "fSide==1"+cutA, chi2,npoints,fitParam,covMatrix);
41 #include "TLinearFitter.h"
42 #include "AliTPCcalibLaser.h"
43 #include "AliExternalTrackParam.h"
44 #include "AliESDEvent.h"
45 #include "AliESDfriend.h"
46 #include "AliESDtrack.h"
47 #include "AliTPCTracklet.h"
50 #include "TTreeStream.h"
53 #include "TGraphErrors.h"
54 #include "AliTPCclusterMI.h"
55 #include "AliTPCseed.h"
56 #include "AliTracker.h"
57 #include "TClonesArray.h"
60 #include "TTreeStream.h"
63 #include "AliTPCLaserTrack.h"
67 ClassImp(AliTPCcalibLaser)
69 AliTPCcalibLaser::AliTPCcalibLaser():
77 fDeltaZ(336), // array of histograms of delta z for each track
78 fDeltaPhi(336), // array of histograms of delta z for each track
79 fDeltaPhiP(336), // array of histograms of delta z for each track
80 fFitAside(new TVectorD(3)), // drift fit - A side
81 fFitCside(new TVectorD(3)), // drift fit - C- side
87 fTracksEsdParam.SetOwner(kTRUE);
90 AliTPCcalibLaser::AliTPCcalibLaser(const Text_t *name, const Text_t *title):
98 fDeltaZ(336), // array of histograms of delta z for each track
99 fDeltaPhi(336), // array of histograms of delta z for each track
100 fDeltaPhiP(336), // array of histograms of delta z for each track
101 fFitAside(new TVectorD(3)), // drift fit - A side
102 fFitCside(new TVectorD(3)), // drift fit - C- side
110 fTracksEsdParam.SetOwner(kTRUE);
113 AliTPCcalibLaser::~AliTPCcalibLaser() {
121 void AliTPCcalibLaser::Process(AliESDEvent * event) {
124 // Loop over tracks and call Process function
130 fESDfriend=static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));
136 fTracksEsdParam.Delete();
138 Int_t n=fESD->GetNumberOfTracks();
139 Int_t run = fESD->GetRunNumber();
141 for (Int_t i=0;i<n;++i) {
142 AliESDfriendTrack *friendTrack=fESDfriend->GetTrack(i);
143 AliESDtrack *track=fESD->GetTrack(i);
144 TObject *calibObject=0;
146 for (Int_t j=0;(calibObject=friendTrack->GetCalibObject(j));++j)
147 if ((seed=dynamic_cast<AliTPCseed*>(calibObject)))
149 if (track&&seed) FindMirror(track,seed);
156 for (Int_t id=0; id<336; id++){
159 if (!fTracksEsdParam.At(id)) continue;
166 void AliTPCcalibLaser::MakeDistHisto(){
170 for (Int_t id=0; id<336; id++){
173 if (!fTracksEsdParam.At(id)) continue;
174 if (!AcceptLaser(id)) continue;
177 TH1F * hisdz = (TH1F*)fDeltaZ.At(id);
178 TH1F * hisdphi = (TH1F*)fDeltaPhi.At(id);
179 TH1F * hisdphiP = (TH1F*)fDeltaPhiP.At(id);
181 hisdz = new TH1F(Form("hisdz%d",id),Form("hisdz%d",id),500,-10,10);
182 fDeltaZ.AddAt(hisdz,id);
184 hisdphi = new TH1F(Form("hisdphi%d",id),Form("hisdphi%d",id),500,-2,2);
185 fDeltaPhi.AddAt(hisdphi,id);
187 hisdphiP = new TH1F(Form("hisdphiP%d",id),Form("hisdphiP%d",id),500,-0.02,0.02);
188 fDeltaPhiP.AddAt(hisdphiP,id);
191 AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id);
192 AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id);
198 param->GetPxPyPz(pxyz);
200 ltrp->GetPxPyPz(lpxyz);
202 Float_t dz = param->GetZ()-ltrp->GetZ();
203 Float_t dphi = (TMath::ATan2(xyz[1],xyz[0])- TMath::ATan2(lxyz[1],lxyz[0]))*254.;
204 Float_t dphiP = param->GetParameter()[2]-ltrp->GetParameter()[2];
207 hisdphiP->Fill(dphiP);
211 void AliTPCcalibLaser::FitDriftV(){
213 // Fit drift velocity - linear approximation in the z and global y
215 static TLinearFitter fdriftA(3,"hyp2");
216 static TLinearFitter fdriftC(3,"hyp2");
217 fdriftA.ClearPoints();
218 fdriftC.ClearPoints();
220 for (Int_t id=0; id<336; id++){
221 if (!fTracksEsdParam.At(id)) continue;
222 if (!AcceptLaser(id)) continue;
223 AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id);
224 AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id);
230 param->GetPxPyPz(pxyz);
232 ltrp->GetPxPyPz(lpxyz);
233 Double_t xxx[2] = {lxyz[2],lxyz[1]};
234 if (ltrp->GetSide()==0){
235 fdriftA.AddPoint(xxx,xyz[2],1);
237 fdriftC.AddPoint(xxx,xyz[2],1);
245 if (fdriftA.GetNpoints()>10){
247 fdriftA.EvalRobust(0.8);
248 fdriftA.GetParameters(*fFitAside);
249 npointsA= fdriftA.GetNpoints();
250 chi2A = fdriftA.GetChisquare()/fdriftA.GetNpoints();
252 if (fdriftC.GetNpoints()>10){
254 fdriftC.EvalRobust(0.8);
255 fdriftC.GetParameters(*fFitCside);
256 npointsC= fdriftC.GetNpoints();
257 chi2C = fdriftC.GetChisquare()/fdriftC.GetNpoints();
261 TTreeSRedirector *cstream = GetDebugStreamer();
262 Int_t time = fESD->GetTimeStamp();
264 (*cstream)<<"driftv"<<
265 "driftA.="<<fFitAside<<
266 "driftC.="<<fFitCside<<
279 Bool_t AliTPCcalibLaser::AcceptLaser(Int_t id){
284 TCut cutT("cutT","abs(Tr.fP[3])<0.06");
285 TCut cutPt("cutPt","abs(Tr.fP[4])<0.1");
286 TCut cutN("cutN","fTPCncls>70");
287 TCut cutP("cutP","abs(atan2(x1,x0)-atan2(lx1,lx0))<0.03")
288 TCut cutA = cutT+cutPt+cutP;
290 AliExternalTrackParam *param =(AliExternalTrackParam*)fTracksEsdParam.At(id);
291 AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id);
292 AliESDtrack *track = (AliESDtrack*)fTracksEsd.At(id);
294 if (TMath::Abs(param->GetParameter()[4])>0.03) return kFALSE;
295 if (TMath::Abs(param->GetParameter()[3])>0.06) return kFALSE;
296 if (TMath::Abs(param->GetParameter()[2]-ltrp->GetParameter()[2])>0.06) return kFALSE;
297 if (TMath::Abs(param->GetParameter()[1]-ltrp->GetParameter()[1])>10) return kFALSE;
301 if (TMath::Abs(track->GetTPCsignal())<20) return kFALSE;
302 if (TMath::Abs(track->GetTPCsignal())>800) return kFALSE;
307 Int_t AliTPCcalibLaser::FindMirror(AliESDtrack *track, AliTPCseed *seed){
309 // Find corresponding mirror
310 // add the corresponding tracks
312 Float_t kRadius0 = 252;
313 Float_t kRadius = 253.4;
314 if (!track->GetOuterParam()) return -1;
315 AliExternalTrackParam param(*(track->GetOuterParam()));
316 AliTracker::PropagateTrackTo(¶m,kRadius0,0.10566,3,kTRUE);
317 AliTracker::PropagateTrackTo(¶m,kRadius,0.10566,0.1,kTRUE);
318 AliTPCLaserTrack ltr;
319 AliTPCLaserTrack *ltrp=0x0;
321 Int_t id = AliTPCLaserTrack::IdentifyTrack(¶m);
322 if (id!=-1 && (AliTPCLaserTrack::GetTracks()->UncheckedAt(id)))
323 ltrp=(AliTPCLaserTrack*)AliTPCLaserTrack::GetTracks()->UncheckedAt(id);
330 Float_t radius=TMath::Abs(ltrp->GetX());
331 AliTracker::PropagateTrackTo(¶m,radius,0.10566,0.01,kTRUE);
333 if (!fTracksMirror.At(id)) fTracksMirror.AddAt(ltrp,id);
334 fTracksEsdParam.AddAt(param.Clone(),id);
335 fTracksEsd.AddAt(track,id);
336 fTracksTPC.AddAt(seed,id);
345 void AliTPCcalibLaser::DumpLaser(Int_t id) {
347 // Dump Laser info to the tree
349 AliESDtrack *track = (AliESDtrack*)fTracksEsd.At(id);
350 AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id);
351 AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id);
360 param->GetPxPyPz(pxyz);
362 ltrp->GetPxPyPz(lpxyz);
365 TTreeSRedirector *cstream = GetDebugStreamer();
366 Int_t time = fESD->GetTimeStamp();
367 Bool_t accept = AcceptLaser(id);
369 (*cstream)<<"Track"<<
373 "driftA.="<<fFitAside<<
374 "driftC.="<<fFitCside<<
399 void AliTPCcalibLaser::RefitLaser(Int_t id){
401 // Refit the track store residuals
404 AliTPCseed *track = (AliTPCseed*)fTracksTPC.At(id);
405 AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id);
406 AliTPCLaserTrack *ltrp = (AliTPCLaserTrack*)fTracksMirror.At(id);
409 static TLinearFitter fy2(3,"hyp2");
410 static TLinearFitter fz2(3,"hyp2");
411 static TLinearFitter fy1(2,"hyp1");
412 static TLinearFitter fz1(2,"hyp1");
413 static TVectorD vecy2,vecz2,vecy1,vecz1;
415 const Int_t kMinClusters=20;
418 for (Int_t i=0;i<72;++i) nclusters[i]=0;
420 for (Int_t i=0;i<160;++i) {
421 AliTPCclusterMI *c=track->GetClusterPointer(i);
422 if (c) nclusters[c->GetDetector()]++;
425 for (Int_t isec=0; isec<72;isec++){
426 if (nclusters[isec]<kMinClusters) continue;
432 for (Int_t irow=0;irow<160;++irow) {
433 AliTPCclusterMI *c=track->GetClusterPointer(irow);
434 //if (c && RejectCluster(c)) continue;
435 if (c&&c->GetDetector()==isec) {
436 Double_t xd = c->GetX()-120;;
437 Double_t x[2]={xd,xd*xd};
438 fy2.AddPoint(x,c->GetY());
439 fz2.AddPoint(x,c->GetZ());
441 fy1.AddPoint(x,c->GetY());
442 fz1.AddPoint(x,c->GetZ());
449 fy1.GetParameters(vecy1);
450 fy2.GetParameters(vecy2);
451 fz1.GetParameters(vecz1);
452 fz2.GetParameters(vecz2);
455 TTreeSRedirector *cstream = GetDebugStreamer();
457 Float_t dedx = track->GetdEdx();
458 (*cstream)<<"Tracklet"<<
462 "ncl="<<nclusters[isec]<<
476 // for (Int_t irow=0;irow<160;++irow) {
477 // AliTPCclusterMI *c=track->GetClusterPointer(irow);
478 // if (c && RejectCluster(c)) continue;
479 // if (c&&c->GetDetector()==isec) {
480 // Double_t x[2]={c->GetX(),c->GetX()*c->GetX()};
481 // fy2.AddPoint(&x,c->GetY());
482 // fz2.AddPoint(&x,c->GetZ());
484 // fy1.AddPoint(&x,c->GetY());
485 // fz1.AddPoint(&x,c->GetZ());
492 void AliTPCcalibLaser::Analyze(){