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 **************************************************************************/
16 ////////////////////////////////////////////////////////////////////////////
18 // Surveyed Laser Track positions //
19 // the position and direction information are stored in //
20 // the AliExternalTrackParam base class //
21 // This class extends this information by identification parameters //
24 //Dump positions to a tree:
25 AliTPCLaserTrack::LoadTracks();
26 TObjArray *arr=AliTPCLaserTrack::GetTracks();
27 TTreeSRedirector *s=new TTreeSRedirector("LaserTracks.root");
30 while ( (o=next()) ) (*s) << "tracks" << "l.=" << o << "\n";
34 TFile f("LaserTracks.root");
35 TTree *tracks=(TTree*)f.Get("tracks");
36 tracks->Draw("fVecGY.fElements:fVecGX.fElements");
38 tracks->Draw("fVecGY.fElements:fVecGX.fElements>>h(500,-250,250,500,-250,250)","fId<7")
41 ////////////////////////////////////////////////////////////////////////////
44 #include <TObjArray.h>
50 #include "AliCDBManager.h"
51 #include "AliCDBEntry.h"
52 #include "AliCDBPath.h"
53 #include "AliTPCLaserTrack.h"
54 #include "AliTPCROC.h"
56 ClassImp(AliTPCLaserTrack)
58 TObjArray *AliTPCLaserTrack::fgArrLaserTracks=0x0;
60 AliTPCLaserTrack::AliTPCLaserTrack() :
61 AliExternalTrackParam(),
68 fVecSec(0), // points vectors - sector
69 fVecP2(0), // points vectors - snp
70 fVecPhi(0), // points vectors - global phi
71 fVecGX(0), // points vectors - globalX
72 fVecGY(0), // points vectors - globalY
73 fVecGZ(0), // points vectors - globalZ
74 fVecLX(0), // points vectors - localX
75 fVecLY(0), // points vectors - localY
76 fVecLZ(0) // points vectors - localZ
79 // // Default constructor
84 AliTPCLaserTrack::AliTPCLaserTrack(const AliTPCLaserTrack <r) :
85 AliExternalTrackParam(ltr),
91 fRayLength(ltr.fRayLength),
92 fVecSec(0), // points vectors - sector
93 fVecP2(0), // points vectors - snp
94 fVecPhi(0), // points vectors - global phi
95 fVecGX(0), // points vectors - globalX
96 fVecGY(0), // points vectors - globalY
97 fVecGZ(0), // points vectors - globalZ
98 fVecLX(0), // points vectors - localX
99 fVecLY(0), // points vectors - localY
100 fVecLZ(0) // points vectors - localZ
103 // Default constructor
105 fVecSec=new TVectorD(*ltr.fVecSec); // points vectors - sector
106 fVecP2 =new TVectorD(*ltr.fVecP2); // points vectors - snp
107 fVecPhi=new TVectorD(*ltr.fVecPhi); // points vectors - global phi
108 fVecGX =new TVectorD(*ltr.fVecGX); // points vectors - globalX
109 fVecGY =new TVectorD(*ltr.fVecGY); // points vectors - globalY
110 fVecGZ =new TVectorD(*ltr.fVecGZ); // points vectors - globalZ
111 fVecLX =new TVectorD(*ltr.fVecLX); // points vectors - localX
112 fVecLY =new TVectorD(*ltr.fVecLY); // points vectors - localY
113 fVecLZ =new TVectorD(*ltr.fVecLZ); // points vectors - localY
117 AliTPCLaserTrack::AliTPCLaserTrack(const Int_t id, const Int_t side, const Int_t rod,
118 const Int_t bundle, const Int_t beam,
119 Double_t x, Double_t alpha,
120 const Double_t param[5],
121 const Double_t covar[15], const Float_t rayLength) :
122 AliExternalTrackParam(x,alpha,param,covar),
128 fRayLength(rayLength),
129 fVecSec(new TVectorD(159)), // points vectors - sector
130 fVecP2(new TVectorD(159)), // points vectors - snp
131 fVecPhi(new TVectorD(159)), // points vectors - global phi
132 fVecGX(new TVectorD(159)), // points vectors - globalX
133 fVecGY(new TVectorD(159)), // points vectors - globalY
134 fVecGZ(new TVectorD(159)), // points vectors - globalZ
135 fVecLX(new TVectorD(159)), // points vectors - localX
136 fVecLY(new TVectorD(159)), // points vectors - localY
137 fVecLZ(new TVectorD(159)) // points vectors - localZ
141 // create laser track from arguments
145 //_____________________________________________________________________
146 AliTPCLaserTrack& AliTPCLaserTrack::operator = (const AliTPCLaserTrack &source)
149 // assignment operator
151 if (&source == this) return *this;
152 new (this) AliTPCLaserTrack(source);
158 AliTPCLaserTrack::~AliTPCLaserTrack(){
162 delete fVecSec; // - sector numbers
163 delete fVecP2; // - P2
164 delete fVecPhi; // points vectors - global phi
165 delete fVecGX; // points vectors - globalX
166 delete fVecGY; // points vectors - globalY
167 delete fVecGZ; // points vectors - globalZ
168 delete fVecLX; // points vectors - localX
169 delete fVecLY; // points vectors - localY
170 delete fVecLZ; // points vectors - localZ
173 void AliTPCLaserTrack::LoadTracks()
176 // Load all design positions from file into the static array fgArrLaserTracks
179 if ( fgArrLaserTracks ) return;
180 TObjArray *arrLaserTracks = 0x0;
182 AliCDBManager *man=AliCDBManager::Instance();
183 if (!man->GetDefaultStorage() && gSystem->Getenv("ALICE_ROOT")) man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
184 if (man->GetDefaultStorage()){
185 if (man->GetRun()<0) man->SetRun(0);
186 AliCDBEntry *entry=man->Get(AliCDBPath("TPC/Calib/LaserTracks"));
188 arrLaserTracks = (TObjArray*)entry->GetObject();
189 entry->SetOwner(kTRUE);
191 if (!gSystem->AccessPathName("LaserTracks.root")){
192 TFile f("LaserTracks.root");
193 arrLaserTracks=(TObjArray*)f.Get("arrLaserTracks");
197 if ( !arrLaserTracks ) {
198 // AliWarning(Form("Could not get laser position data from file: '%s'",fgkDataFileName));
202 arrLaserTracks->SetOwner();
204 fgArrLaserTracks = new TObjArray(fgkNLaserTracks);
205 fgArrLaserTracks->SetOwner();
206 for (Int_t itrack=0; itrack<fgkNLaserTracks; itrack++){
207 AliTPCLaserTrack *ltr = (AliTPCLaserTrack*)arrLaserTracks->At(itrack);
209 // AliWarning(Form("No informatino found for Track %d!",itrack));
213 fgArrLaserTracks->AddAt(new AliTPCLaserTrack(*ltr),itrack);
216 delete arrLaserTracks;
220 void AliTPCLaserTrack::UpdatePoints(){
222 // update track points
224 const Double_t kMaxSnp=0.97;
225 AliTPCROC* roc = AliTPCROC::Instance();
229 fVecSec=new TVectorD(159);
230 fVecP2 =new TVectorD(159); // - P2
231 fVecPhi=new TVectorD(159); // - Phi
232 fVecGX=new TVectorD(159); // points vectors - globalX
233 fVecGY=new TVectorD(159); // points vectors - globalY
234 fVecGZ=new TVectorD(159); // points vectors - globalZ
235 fVecLX=new TVectorD(159); // points vectors - localX
236 fVecLY=new TVectorD(159); // points vectors - localY
237 fVecLZ=new TVectorD(159); // points vectors - localZ
240 for (Int_t irow=158; irow>=0; irow--){
241 (*fVecSec)[irow]= -1; // -
242 (*fVecP2)[irow] = 0; // - P2 -snp
243 (*fVecPhi)[irow]= 0; // - global phi
244 (*fVecGX)[irow] = 0; // points vectors - globalX
245 (*fVecGY)[irow] = 0; // points vectors - globalY
246 (*fVecGZ)[irow] = 0; // points vectors - globalZ
247 (*fVecLX)[irow] = 0; // points vectors - localX
248 (*fVecLY)[irow] = 0; // points vectors - localY
249 (*fVecLZ)[irow] = 0; // points vectors - localZ
254 AliTPCLaserTrack*ltrp=new AliTPCLaserTrack(*this); //make temporary track
256 for (Int_t irow=158; irow>=0; irow--){
260 if (srow >=roc->GetNRows(0)) {
261 srow-=roc->GetNRows(0);
264 lxyz[0]= roc->GetPadRowRadii(sector,srow);
265 if (!ltrp->PropagateTo(lxyz[0],5)) break;
268 Double_t alpha=TMath::ATan2(gxyz[1],gxyz[0]);
269 if (alpha<0) alpha+=2*TMath::Pi();
270 sector +=TMath::Nint(-0.5+9*alpha/TMath::Pi());
271 if (gxyz[2]<0) sector+=18;
272 Double_t salpha = TMath::Pi()*(sector+0.5)/9.;
273 if (!ltrp->Rotate(salpha)) break;
274 if (!ltrp->PropagateTo(lxyz[0],5)) break;
275 if (TMath::Abs(ltrp->GetSnp())>kMaxSnp) break;
277 lxyz[1]=ltrp->GetY();
278 lxyz[2]=ltrp->GetZ();
279 (*fVecSec)[irow]= sector;
280 (*fVecP2)[irow] = ltrp->GetSnp(); // - P2 -snp
281 (*fVecPhi)[irow]= TMath::ATan2(gxyz[1],gxyz[0]); // - global phi
282 (*fVecGX)[irow] = gxyz[0]; // points vectors - globalX
283 (*fVecGY)[irow] = gxyz[1]; // points vectors - globalY
284 (*fVecGZ)[irow] = gxyz[2]; // points vectors - globalZ
285 (*fVecLX)[irow] = lxyz[0]; // points vectors - localX
286 (*fVecLY)[irow] = lxyz[1]; // points vectors - localY
287 (*fVecLZ)[irow] = lxyz[2]; // points vectors - localZ
290 delete ltrp; // delete temporary track
293 Int_t AliTPCLaserTrack::IdentifyTrack(AliExternalTrackParam *track, Int_t side)
296 // Find the laser track which is corresponding closest to 'track'
300 const Float_t kMaxdphi=0.2;
301 const Float_t kMaxdphiP=0.05;
302 const Float_t kMaxdz=40;
304 if ( !fgArrLaserTracks ) LoadTracks();
305 TObjArray *arrTracks = GetTracks();
310 track->GetXYZ(lxyz0);
311 track->GetDirection(pxyz0);
313 Float_t mindist=10; // maxima minimal distance
315 for (Int_t itrack=0; itrack<fgkNLaserTracks; itrack++){
316 AliTPCLaserTrack *ltr = (AliTPCLaserTrack*)arrTracks->UncheckedAt(itrack);
317 if (side>=0) if (ltr->GetSide()!=side) continue;
318 Double_t * kokot = (Double_t*)ltr->GetParameter();
319 kokot[4]=-0.0000000001;
322 if (TMath::Abs(lxyz1[2]-lxyz0[2])>kMaxdz) continue;
324 Double_t phi0 = TMath::ATan2(lxyz0[1],lxyz0[0]);
325 Double_t phi1 = TMath::ATan2(lxyz1[1],lxyz1[0]);
326 if (TMath::Abs(phi0-phi1)>kMaxdphi) continue;
328 ltr->GetDirection(pxyz1);
329 Float_t direction= pxyz0[0]*pxyz1[0] + pxyz0[1]*pxyz1[1] + pxyz0[2]*pxyz1[2];
330 Float_t distdir = (1-TMath::Abs(direction))*90.; //distance at entrance
331 if (1-TMath::Abs(direction)>kMaxdphiP)
335 dist+=TMath::Abs(lxyz1[0]-lxyz0[0]);
336 dist+=TMath::Abs(lxyz1[1]-lxyz0[1]);
337 // dist+=TMath::Abs(lxyz1[2]-lxyz0[2]); //z is not used for distance calculation
345 if (dist>mindist) continue;