skip clusters when the roc voltage is funny
[u/mrichter/AliRoot.git] / TPC / Base / AliTPCLaserTrack.cxx
CommitLineData
23b18f4e 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
7442bceb 16////////////////////////////////////////////////////////////////////////////
17// //
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 //
22/*
23
24//Dump positions to a tree:
25AliTPCLaserTrack::LoadTracks();
26TObjArray *arr=AliTPCLaserTrack::GetTracks();
27TTreeSRedirector *s=new TTreeSRedirector("LaserTracks.root");
28TIter next(arr);
29TObject *o=0x0;
30while ( (o=next()) ) (*s) << "tracks" << "l.=" << o << "\n";
31delete s;
32
33//draw something
34TFile f("LaserTracks.root");
35TTree *tracks=(TTree*)f.Get("tracks");
36tracks->Draw("fVecGY.fElements:fVecGX.fElements");
37
38 tracks->Draw("fVecGY.fElements:fVecGX.fElements>>h(500,-250,250,500,-250,250)","fId<7")
39*/
40// //
41////////////////////////////////////////////////////////////////////////////
42
23b18f4e 43
44#include <TObjArray.h>
45#include <TFile.h>
46#include <TString.h>
47#include <TSystem.h>
48
49#include "AliLog.h"
7442bceb 50#include "AliCDBManager.h"
51#include "AliCDBEntry.h"
52#include "AliCDBPath.h"
23b18f4e 53#include "AliTPCLaserTrack.h"
e955044f 54#include "AliTPCROC.h"
23b18f4e 55
56ClassImp(AliTPCLaserTrack)
57
58TObjArray *AliTPCLaserTrack::fgArrLaserTracks=0x0;
59
60AliTPCLaserTrack::AliTPCLaserTrack() :
61 AliExternalTrackParam(),
62 fId(-1),
63 fSide(-1),
64 fRod(-1),
65 fBundle(-1),
7804aba0 66 fBeam(-1),
e955044f 67 fRayLength(0),
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
23b18f4e 77{
78 //
7442bceb 79// // Default constructor
23b18f4e 80 //
81
82}
83
7804aba0 84AliTPCLaserTrack::AliTPCLaserTrack(const AliTPCLaserTrack &ltr) :
23b18f4e 85 AliExternalTrackParam(ltr),
86 fId(ltr.fId),
87 fSide(ltr.fSide),
88 fRod(ltr.fRod),
89 fBundle(ltr.fBundle),
7804aba0 90 fBeam(ltr.fBeam),
e955044f 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
23b18f4e 101{
102 //
103 // Default constructor
104 //
e955044f 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
23b18f4e 114
115}
116
117AliTPCLaserTrack::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],
7804aba0 121 const Double_t covar[15], const Float_t rayLength) :
23b18f4e 122 AliExternalTrackParam(x,alpha,param,covar),
123 fId(id),
124 fSide(side),
125 fRod(rod),
126 fBundle(bundle),
7804aba0 127 fBeam(beam),
e955044f 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
138
23b18f4e 139{
140 //
141 // create laser track from arguments
142 //
e955044f 143
23b18f4e 144}
7804aba0 145//_____________________________________________________________________
146AliTPCLaserTrack& AliTPCLaserTrack::operator = (const AliTPCLaserTrack &source)
147{
148 //
149 // assignment operator
150 //
151 if (&source == this) return *this;
152 new (this) AliTPCLaserTrack(source);
153
154 return *this;
155}
23b18f4e 156
e955044f 157
158AliTPCLaserTrack::~AliTPCLaserTrack(){
159 //
160 // destructor
161 //
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
171}
172
23b18f4e 173void AliTPCLaserTrack::LoadTracks()
174{
7442bceb 175 //
176 // Load all design positions from file into the static array fgArrLaserTracks
177 //
178
179 if ( fgArrLaserTracks ) return;
78f17711 180 TObjArray *arrLaserTracks = 0x0;
7442bceb 181
182 AliCDBManager *man=AliCDBManager::Instance();
78f17711 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"));
768e46f1 187 if (!entry) return;
78f17711 188 arrLaserTracks = (TObjArray*)entry->GetObject();
189 entry->SetOwner(kTRUE);
190 } else {
191 if (!gSystem->AccessPathName("LaserTracks.root")){
192 TFile f("LaserTracks.root");
193 arrLaserTracks=(TObjArray*)f.Get("arrLaserTracks");
194 f.Close();
195 }
196 }
7442bceb 197 if ( !arrLaserTracks ) {
23b18f4e 198// AliWarning(Form("Could not get laser position data from file: '%s'",fgkDataFileName));
7442bceb 199 return;
200 }
201
78f17711 202 arrLaserTracks->SetOwner();
203
7442bceb 204 fgArrLaserTracks = new TObjArray(fgkNLaserTracks);
78f17711 205 fgArrLaserTracks->SetOwner();
7442bceb 206 for (Int_t itrack=0; itrack<fgkNLaserTracks; itrack++){
207 AliTPCLaserTrack *ltr = (AliTPCLaserTrack*)arrLaserTracks->At(itrack);
208 if ( !ltr ){
23b18f4e 209// AliWarning(Form("No informatino found for Track %d!",itrack));
7442bceb 210 continue;
23b18f4e 211 }
7442bceb 212 ltr->UpdatePoints();
213 fgArrLaserTracks->AddAt(new AliTPCLaserTrack(*ltr),itrack);
214 }
78f17711 215
216 delete arrLaserTracks;
23b18f4e 217}
218
f1fcccb7 219
e955044f 220void AliTPCLaserTrack::UpdatePoints(){
221 //
222 // update track points
223 //
7442bceb 224 const Double_t kMaxSnp=0.97;
e955044f 225 AliTPCROC* roc = AliTPCROC::Instance();
226 //
227 //
228 if (!fVecSec){
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
238
239 }
240 for (Int_t irow=158; irow>=0; irow--){
7442bceb 241 (*fVecSec)[irow]= -1; // -
e955044f 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
250
251 }
252 Double_t gxyz[3];
253 Double_t lxyz[3];
254 AliTPCLaserTrack*ltrp=new AliTPCLaserTrack(*this); //make temporary track
255
256 for (Int_t irow=158; irow>=0; irow--){
257 UInt_t srow = irow;
258 Int_t sector=0;
259
260 if (srow >=roc->GetNRows(0)) {
261 srow-=roc->GetNRows(0);
262 sector=36 ;
263 }
264 lxyz[0]= roc->GetPadRowRadii(sector,srow);
265 if (!ltrp->PropagateTo(lxyz[0],5)) break;
266 ltrp->GetXYZ(gxyz);
267 //
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());
fb962ae3 271 if (gxyz[2]<0) sector+=18;
e955044f 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;
276 ltrp->GetXYZ(gxyz);
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
288
289 }
290 delete ltrp; // delete temporary track
291}
292
38b1a1ca 293Int_t AliTPCLaserTrack::IdentifyTrack(AliExternalTrackParam *track, Int_t side)
23b18f4e 294{
f1fcccb7 295 //
296 // Find the laser track which is corresponding closest to 'track'
297 // return its id
298 //
299 //
b51d4393 300 const Float_t kMaxdphi=0.2;
265e5fdb 301 const Float_t kMaxdphiP=0.05;
302 const Float_t kMaxdz=40;
f1fcccb7 303
304 if ( !fgArrLaserTracks ) LoadTracks();
305 TObjArray *arrTracks = GetTracks();
f1fcccb7 306 Double_t lxyz0[3];
307 Double_t lxyz1[3];
308 Double_t pxyz0[3];
309 Double_t pxyz1[3];
310 track->GetXYZ(lxyz0);
38b1a1ca 311 track->GetDirection(pxyz0);
265e5fdb 312 //
38b1a1ca 313 Float_t mindist=10; // maxima minimal distance
f1fcccb7 314 Int_t id = -1;
38b1a1ca 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;
f1fcccb7 318 Double_t * kokot = (Double_t*)ltr->GetParameter();
319 kokot[4]=-0.0000000001;
23b18f4e 320 //
f1fcccb7 321 ltr->GetXYZ(lxyz1);
b51d4393 322 if (TMath::Abs(lxyz1[2]-lxyz0[2])>kMaxdz) continue;
f1fcccb7 323 // phi position
324 Double_t phi0 = TMath::ATan2(lxyz0[1],lxyz0[0]);
325 Double_t phi1 = TMath::ATan2(lxyz1[1],lxyz1[0]);
b51d4393 326 if (TMath::Abs(phi0-phi1)>kMaxdphi) continue;
f1fcccb7 327 // phi direction
38b1a1ca 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)
f1fcccb7 332 continue;
23b18f4e 333 //
265e5fdb 334 Float_t dist=0;
335 dist+=TMath::Abs(lxyz1[0]-lxyz0[0]);
336 dist+=TMath::Abs(lxyz1[1]-lxyz0[1]);
38b1a1ca 337 // dist+=TMath::Abs(lxyz1[2]-lxyz0[2]); //z is not used for distance calculation
265e5fdb 338 dist+=distdir;
339 //
340 if (id<0) {
341 id =itrack;
342 mindist=dist;
265e5fdb 343 continue;
344 }
345 if (dist>mindist) continue;
346 id = itrack;
347 mindist=dist;
f1fcccb7 348 }
349 return id;
23b18f4e 350}
351