]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/AliITStrackerSA.cxx
Bug fix
[u/mrichter/AliRoot.git] / ITS / AliITStrackerSA.cxx
CommitLineData
13918578 1/**************************************************************************
2 * Copyright(c) 1998-2003, 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
bf6adc12 16/* $Id$ */
17
13918578 18////////////////////////////////////////////////////
19// Stand alone tracker class //
20// Origin: Elisabetta Crescio //
21// e-mail: crescio@to.infn.it //
22// tracks are saved as AliITStrackV2 objects //
23////////////////////////////////////////////////////
24
aa4b78e1 25#include <stdlib.h>
bf6adc12 26
27#include <TArrayI.h>
13918578 28#include <TBranch.h>
13918578 29#include <TObjArray.h>
30#include <TTree.h>
bf6adc12 31
af885e0f 32#include "AliESDEvent.h"
bf6adc12 33#include "AliESDVertex.h"
34#include "AliESDtrack.h"
bf6adc12 35#include "AliITSVertexer.h"
13918578 36#include "AliITSclusterTable.h"
00a7cc50 37#include "AliITSRecPoint.h"
cc088660 38#include "AliITSgeomTGeo.h"
13918578 39#include "AliITStrackSA.h"
bf6adc12 40#include "AliITStrackerSA.h"
e340bb86 41#include "AliITSReconstructor.h"
b881f1fd 42#include "AliLog.h"
bf6adc12 43#include "AliRun.h"
13918578 44
45ClassImp(AliITStrackerSA)
46
47//____________________________________________________________________________
e399f961 48AliITStrackerSA::AliITStrackerSA():AliITStrackerMI(),
49fPhiEstimate(0),
1966f03c 50fITSStandAlone(0),
e399f961 51fLambdac(0),
52fPhic(0),
53fCoef1(0),
54fCoef2(0),
55fCoef3(0),
56fNloop(0),
57fPhiWin(0),
58fLambdaWin(0),
59fVert(0),
60fVertexer(0),
e399f961 61fListOfTracks(0),
deae0246 62fListOfSATracks(0),
e399f961 63fITSclusters(0),
12b1afb7 64fInwardFlag(0),
b8ed1a92 65fOuterStartLayer(0),
12b1afb7 66fInnerStartLayer(5),
67fMinNPoints(0),
3733ccd2 68fMinQ(0.),
e399f961 69fCluLayer(0),
70fCluCoord(0){
13918578 71 // Default constructor
72 Init();
627b6db6 73
13918578 74}
2257f27e 75//____________________________________________________________________________
cc088660 76AliITStrackerSA::AliITStrackerSA(const Char_t *geom):AliITStrackerMI(0),
e399f961 77fPhiEstimate(0),
1966f03c 78fITSStandAlone(0),
e399f961 79fLambdac(0),
80fPhic(0),
81fCoef1(0),
82fCoef2(0),
83fCoef3(0),
84fNloop(0),
85fPhiWin(0),
86fLambdaWin(0),
87fVert(0),
88fVertexer(0),
e399f961 89fListOfTracks(0),
deae0246 90fListOfSATracks(0),
e399f961 91fITSclusters(0),
12b1afb7 92fInwardFlag(0),
b8ed1a92 93fOuterStartLayer(0),
12b1afb7 94fInnerStartLayer(5),
95fMinNPoints(0),
3733ccd2 96fMinQ(0.),
e399f961 97fCluLayer(0),
98fCluCoord(0)
2257f27e 99{
100 // Standard constructor (Vertex is known and passed to this obj.)
cc088660 101 if (geom) {
102 AliWarning("\"geom\" is actually a dummy argument !");
103 }
104
2257f27e 105 Init();
106 fVert = 0;
627b6db6 107
2257f27e 108}
109
13918578 110//____________________________________________________________________________
cc088660 111AliITStrackerSA::AliITStrackerSA(const Char_t *geom, AliESDVertex *vert):AliITStrackerMI(0),
e399f961 112fPhiEstimate(0),
1966f03c 113fITSStandAlone(0),
e399f961 114fLambdac(0),
115fPhic(0),
116fCoef1(0),
117fCoef2(0),
118fCoef3(0),
119fNloop(0),
120fPhiWin(0),
121fLambdaWin(0),
122fVert(vert),
123fVertexer(0),
e399f961 124fListOfTracks(0),
deae0246 125fListOfSATracks(0),
e399f961 126fITSclusters(0),
12b1afb7 127fInwardFlag(0),
b8ed1a92 128fOuterStartLayer(0),
12b1afb7 129fInnerStartLayer(5),
130fMinNPoints(0),
3733ccd2 131fMinQ(0.),
e399f961 132fCluLayer(0),
1966f03c 133fCluCoord(0)
13918578 134{
135 // Standard constructor (Vertex is known and passed to this obj.)
cc088660 136 if (geom) {
137 AliWarning("\"geom\" is actually a dummy argument !");
138 }
13918578 139 Init();
627b6db6 140
13918578 141}
142
13918578 143//____________________________________________________________________________
cc088660 144AliITStrackerSA::AliITStrackerSA(const Char_t *geom, AliITSVertexer *vertexer):AliITStrackerMI(0),
e399f961 145fPhiEstimate(0),
1966f03c 146fITSStandAlone(0),
e399f961 147fLambdac(0),
148fPhic(0),
149fCoef1(0),
150fCoef2(0),
151fCoef3(0),
152fNloop(0),
153fPhiWin(0),
154fLambdaWin(0),
155fVert(),
156fVertexer(vertexer),
e399f961 157fListOfTracks(0),
deae0246 158fListOfSATracks(0),
e399f961 159fITSclusters(0),
12b1afb7 160fInwardFlag(0),
b8ed1a92 161fOuterStartLayer(0),
12b1afb7 162fInnerStartLayer(5),
163fMinNPoints(0),
3733ccd2 164fMinQ(0.),
e399f961 165fCluLayer(0),
1966f03c 166fCluCoord(0)
13918578 167{
168 // Standard constructor (Vertex is unknown - vertexer is passed to this obj)
cc088660 169 if (geom) {
170 AliWarning("\"geom\" is actually a dummy argument !");
171 }
13918578 172 Init();
173 fVertexer = vertexer;
627b6db6 174
13918578 175}
176
177//____________________________________________________________________________
e399f961 178AliITStrackerSA::AliITStrackerSA(const AliITStrackerSA& tracker):AliITStrackerMI(),
179fPhiEstimate(tracker.fPhiEstimate),
1966f03c 180fITSStandAlone(tracker.fITSStandAlone),
e399f961 181fLambdac(tracker.fLambdac),
182fPhic(tracker.fPhic),
183fCoef1(tracker.fCoef1),
184fCoef2(tracker.fCoef2),
185fCoef3(tracker.fCoef3),
186fNloop(tracker.fNloop),
187fPhiWin(tracker.fPhiWin),
188fLambdaWin(tracker.fLambdaWin),
189fVert(tracker.fVert),
190fVertexer(tracker.fVertexer),
e399f961 191fListOfTracks(tracker.fListOfTracks),
deae0246 192fListOfSATracks(tracker.fListOfSATracks),
e399f961 193fITSclusters(tracker.fITSclusters),
12b1afb7 194fInwardFlag(tracker.fInwardFlag),
b8ed1a92 195fOuterStartLayer(tracker.fOuterStartLayer),
12b1afb7 196fInnerStartLayer(tracker.fInnerStartLayer),
197fMinNPoints(tracker.fMinNPoints),
3733ccd2 198fMinQ(tracker.fMinQ),
e399f961 199fCluLayer(tracker.fCluLayer),
200fCluCoord(tracker.fCluCoord) {
13918578 201 // Copy constructor
13918578 202 for(Int_t i=0;i<2;i++){
203 fPoint1[i]=tracker.fPoint1[i];
204 fPoint2[i]=tracker.fPoint2[i];
205 fPoint3[i]=tracker.fPoint3[i];
206 fPointc[i]=tracker.fPointc[i];
207 }
13918578 208 if(tracker.fVertexer && tracker.fVert){
d681bb2d 209 fVert = new AliESDVertex(*tracker.fVert);
13918578 210 }
211 else {
212 fVert = tracker.fVert;
213 }
cc088660 214 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
7e5bf5af 215 fCluLayer[i] = tracker.fCluLayer[i];
216 fCluCoord[i] = tracker.fCluCoord[i];
217 }
13918578 218}
7d62fb64 219//______________________________________________________________________
e399f961 220AliITStrackerSA& AliITStrackerSA::operator=(const AliITStrackerSA& source){
221 // Assignment operator.
222 this->~AliITStrackerSA();
223 new(this) AliITStrackerSA(source);
224 return *this;
225
7d62fb64 226}
13918578 227
228//____________________________________________________________________________
229AliITStrackerSA::~AliITStrackerSA(){
230 // destructor
d681bb2d 231 // if fVertexer is not null, the AliESDVertex obj. is owned by this class
13918578 232 // and is deleted here
233 if(fVertexer){
234 if(fVert)delete fVert;
235 }
236 fVert = 0;
237 fVertexer = 0;
7e5bf5af 238
13918578 239 if(fPhiWin)delete []fPhiWin;
240 if(fLambdaWin)delete []fLambdaWin;
4e05ab9a 241 fListOfTracks->Delete();
adda6c2b 242 delete fListOfTracks;
deae0246 243 fListOfSATracks->Delete();
244 delete fListOfSATracks;
7e5bf5af 245 if(fCluLayer){
cc088660 246 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
7e5bf5af 247 if(fCluLayer[i]){
248 fCluLayer[i]->Delete();
249 delete fCluLayer[i];
250 }
251 }
252 delete [] fCluLayer;
253 }
254 if(fCluCoord){
cc088660 255 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
7e5bf5af 256 if(fCluCoord[i]){
257 fCluCoord[i]->Delete();
258 delete fCluCoord[i];
259 }
260 }
261 delete [] fCluCoord;
627b6db6 262 }
7e5bf5af 263
7e5bf5af 264}
13918578 265
1966f03c 266//____________________________________________________________________________
af885e0f 267Int_t AliITStrackerSA::Clusters2Tracks(AliESDEvent *event){
1966f03c 268// This method is used to find and fit the tracks. By default the corresponding
269// method in the parent class is invoked. In this way a combined tracking
270// TPC+ITS is performed. If the flag fITSStandAlone is true, the tracking
271// is done in the ITS only. In the standard reconstruction chain this option
272// can be set via AliReconstruction::SetOption("ITS","onlyITS")
273 Int_t rc=0;
274 if(!fITSStandAlone){
275 rc=AliITStrackerMI::Clusters2Tracks(event);
276 }
277 else {
278 AliDebug(1,"Stand Alone flag set: doing tracking in ITS alone\n");
279 }
280 if(!rc) rc=FindTracks(event);
281 return rc;
282}
283
13918578 284//____________________________________________________________________________
285void AliITStrackerSA::Init(){
286 // Reset all data members
287 fPhiEstimate=0;
288 for(Int_t i=0;i<3;i++){fPoint1[i]=0;fPoint2[i]=0;fPoint3[i]=0;}
289 fLambdac=0;
290 fPhic=0;
291 fCoef1=0;
292 fCoef2=0;
293 fCoef3=0;
294 fPointc[0]=0;
295 fPointc[1]=0;
296 fVert = 0;
297 fVertexer = 0;
5b4dedce 298 Int_t nLoops=AliITSReconstructor::GetRecoParam()->GetNLoopsSA();
299 if(nLoops==33){
300 SetFixedWindowSizes();
301 }else{
302 Double_t phimin=AliITSReconstructor::GetRecoParam()->GetMinPhiSA();
303 Double_t phimax=AliITSReconstructor::GetRecoParam()->GetMaxPhiSA();
304 Double_t lambmin=AliITSReconstructor::GetRecoParam()->GetMinLambdaSA();
305 Double_t lambmax=AliITSReconstructor::GetRecoParam()->GetMaxLambdaSA();
306 SetCalculatedWindowSizes(nLoops,phimin,phimax,lambmin,lambmax);
307 }
3733ccd2 308 fMinQ=AliITSReconstructor::GetRecoParam()->GetSAMinClusterCharge();
2257f27e 309 fITSclusters = 0;
12b1afb7 310 SetOuterStartLayer(1);
1966f03c 311 SetSAFlag(kFALSE);
4e05ab9a 312 fListOfTracks=new TObjArray(0,0);
deae0246 313 fListOfSATracks=new TObjArray(0,0);
7e5bf5af 314 fCluLayer = 0;
315 fCluCoord = 0;
12b1afb7 316 fMinNPoints = 3;
627b6db6 317 }
13918578 318//_______________________________________________________________________
319void AliITStrackerSA::ResetForFinding(){
320 // Reset data members used in all loops during track finding
321 fPhiEstimate=0;
322 for(Int_t i=0;i<3;i++){fPoint1[i]=0;fPoint2[i]=0;fPoint3[i]=0;}
323 fLambdac=0;
324 fPhic=0;
325 fCoef1=0;
326 fCoef2=0;
327 fCoef3=0;
328 fPointc[0]=0;
329 fPointc[1]=0;
4e05ab9a 330 fListOfTracks->Delete();
deae0246 331 fListOfSATracks->Delete();
13918578 332}
bef31448 333
7e5bf5af 334
2257f27e 335
bef31448 336//______________________________________________________________________
af885e0f 337Int_t AliITStrackerSA::FindTracks(AliESDEvent* event){
bef31448 338
7e5bf5af 339// Track finder using the ESD object
6f178e14 340
b881f1fd 341 AliDebug(2,Form(" field is %f",event->GetMagneticField()));
4fa7f7d1 342 AliDebug(2,Form("SKIPPING %d %d %d %d %d %d",ForceSkippingOfLayer(0),ForceSkippingOfLayer(1),ForceSkippingOfLayer(2),ForceSkippingOfLayer(3),ForceSkippingOfLayer(4),ForceSkippingOfLayer(5)));
343
2257f27e 344 if(!fITSclusters){
345 Fatal("FindTracks","ITS cluster tree is not accessed - Abort!!!\n Please use method SetClusterTree to pass the pointer to the tree\n");
346 return -1;
bef31448 347 }
7e5bf5af 348 //Reads event and mark clusters of traks already found, with flag kITSin
ebda3140 349 Int_t nentr=event->GetNumberOfTracks();
5a03f353 350 if(AliITSReconstructor::GetRecoParam()->GetSAUseAllClusters()==kFALSE) {
351 while (nentr--) {
352 AliESDtrack *track=event->GetTrack(nentr);
5af4a2d0 353 if ((track->GetStatus()&AliESDtrack::kITSin) == AliESDtrack::kITSin){
5a03f353 354 Int_t idx[12];
355 Int_t ncl = track->GetITSclusters(idx);
356 for(Int_t k=0;k<ncl;k++){
357 AliITSRecPoint* cll = (AliITSRecPoint*)GetCluster(idx[k]);
358 cll->SetBit(kSAflag);
359 }
ebda3140 360 }
361 }
362 }
363 //Get primary vertex
364 Double_t primaryVertex[3];
365 event->GetVertex()->GetXYZ(primaryVertex);
366 //Creates TClonesArray with clusters for each layer. The clusters already used
367 //by AliITStrackerMI are not considered
deae0246 368 Int_t nclusters[AliITSgeomTGeo::kNLayers]={0,0,0,0,0,0};
369 Int_t dmar[AliITSgeomTGeo::kNLayers]={0,0,0,0,0,0};
ebda3140 370 if (fCluLayer == 0) {
deae0246 371 fCluLayer = new TClonesArray*[AliITSgeomTGeo::kNLayers];
372 fCluCoord = new TClonesArray*[AliITSgeomTGeo::kNLayers];
ebda3140 373 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) {
374 fCluLayer[i]=0;
375 fCluCoord[i]=0;
376 }
377 }
ebda3140 378 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++){
ebda3140 379 AliITSlayer &layer=fgLayers[i];
4fa7f7d1 380 if (!ForceSkippingOfLayer(i)) {
25be2b21 381 for(Int_t cli=0;cli<layer.GetNumberOfClusters();cli++){
382 AliITSRecPoint* cls = (AliITSRecPoint*)layer.GetCluster(cli);
383 if(cls->TestBit(kSAflag)==kTRUE) continue; //clusters used by TPC prol.
384 if(cls->GetQ()==0) continue; //fake clusters dead zones
3733ccd2 385 if(i>1 && cls->GetQ()<=fMinQ) continue; // cut on SDD and SSD cluster charge
25be2b21 386 nclusters[i]++;
387 }
ebda3140 388 }
389 dmar[i]=0;
855b4730 390 if(!fCluLayer[i]){
391 fCluLayer[i] = new TClonesArray("AliITSRecPoint",nclusters[i]);
392 }else{
393 fCluLayer[i]->Delete();
394 fCluLayer[i]->Expand(nclusters[i]);
395 }
396 if(!fCluCoord[i]){
397 fCluCoord[i] = new TClonesArray("AliITSclusterTable",nclusters[i]);
398 }else{
399 fCluCoord[i]->Delete();
400 fCluCoord[i]->Expand(nclusters[i]);
401 }
ebda3140 402 }
403
404 for(Int_t ilay=0;ilay<AliITSgeomTGeo::GetNLayers();ilay++){
405 TClonesArray &clulay = *fCluLayer[ilay];
406 TClonesArray &clucoo = *fCluCoord[ilay];
407 AliITSlayer &layer=fgLayers[ilay];
4fa7f7d1 408 if (!ForceSkippingOfLayer(ilay)) {
25be2b21 409 for(Int_t cli=0;cli<layer.GetNumberOfClusters();cli++){
410 AliITSRecPoint* cls = (AliITSRecPoint*)layer.GetCluster(cli);
411 if(cls->TestBit(kSAflag)==kTRUE) continue;
412 if(cls->GetQ()==0) continue;
3733ccd2 413 if(ilay>1 && cls->GetQ()<=fMinQ) continue;
25be2b21 414 Double_t phi=0;Double_t lambda=0;
415 Float_t x=0;Float_t y=0;Float_t z=0;
416 Float_t sx=0;Float_t sy=0;Float_t sz=0;
417 GetCoorAngles(cls,phi,lambda,x,y,z,primaryVertex);
418 GetCoorErrors(cls,sx,sy,sz);
419 new (clulay[dmar[ilay]]) AliITSRecPoint(*cls);
420 new (clucoo[dmar[ilay]]) AliITSclusterTable(x,y,z,sx,sy,sz,phi,lambda,cli);
421 dmar[ilay]++;
422 }
ebda3140 423 }
424 }
7e5bf5af 425
6f178e14 426 // track counter
427 Int_t ntrack=0;
428
deae0246 429 static Int_t nClusLay[AliITSgeomTGeo::kNLayers];//counter for clusters on each layer
6f178e14 430
12b1afb7 431 // loop on minimum number of points
432 for(Int_t iMinNPoints=AliITSgeomTGeo::GetNLayers(); iMinNPoints>=fMinNPoints; iMinNPoints--) {
433
434 if(!fInwardFlag){ // Tracking outwards from the inner layers
435 // loop on starting layer for track finding
436 for(Int_t innLay=0; innLay<=fOuterStartLayer; innLay++) {
4fa7f7d1 437 if(ForceSkippingOfLayer(innLay)) continue;
12b1afb7 438 Int_t minNPoints=iMinNPoints-innLay;
439 for(Int_t i=innLay+1;i<AliITSgeomTGeo::GetNLayers();i++)
4fa7f7d1 440 if(ForceSkippingOfLayer(i))
12b1afb7 441 minNPoints--;
442 if(minNPoints<fMinNPoints) continue;
443
444 // loop on phi and lambda window size
445 for(Int_t nloop=0;nloop<fNloop;nloop++){
446 Int_t nclInnLay=fCluLayer[innLay]->GetEntries();
447 while(nclInnLay--){
448 ResetForFinding();
449 Bool_t useRP=SetFirstPoint(innLay,nclInnLay,primaryVertex);
450 if(!useRP) continue;
451 AliITStrackSA* trs = new AliITStrackSA();
452
453 Int_t pflag=0;
454 Int_t kk;
455 for(kk=0;kk<AliITSgeomTGeo::GetNLayers();kk++) nClusLay[kk] = 0;
456
457 kk=0;
458 nClusLay[kk] = SearchClusters(innLay,fPhiWin[nloop],fLambdaWin[nloop],
459 trs,primaryVertex[2],pflag);
460 for(Int_t nextLay=innLay+1; nextLay<AliITSgeomTGeo::GetNLayers(); nextLay++) {
461 kk++;
462 nClusLay[kk] = SearchClusters(nextLay,fPhiWin[nloop],fLambdaWin[nloop],
463 trs,primaryVertex[2],pflag);
464 if(nClusLay[kk]!=0){
465 pflag=1;
466 if(kk==1) {
467 fPoint3[0]=fPointc[0];
468 fPoint3[1]=fPointc[1];
469 } else {
470 UpdatePoints();
471 }
472 }
473 }
474
475 Int_t layOK=0;
476 for(Int_t nnp=0;nnp<AliITSgeomTGeo::GetNLayers()-innLay;nnp++){
477 if(nClusLay[nnp]!=0) layOK+=1;
478 }
479 if(layOK>=minNPoints){
b881f1fd 480 AliDebug(2,Form("---NPOINTS: %d; MAP: %d %d %d %d %d %d\n",layOK,nClusLay[0],nClusLay[1],nClusLay[2],nClusLay[3],nClusLay[4],nClusLay[5]));
12b1afb7 481 AliITStrackV2* tr2 = 0;
482 tr2 = FitTrack(trs,primaryVertex);
92bb7af4 483 if(!tr2){
484 delete trs;
485 continue;
486 }
b881f1fd 487 AliDebug(2,Form("---NPOINTS fit: %d\n",tr2->GetNumberOfClusters()));
12b1afb7 488
489 StoreTrack(tr2,event);
490 ntrack++;
491
492 }
493
494 delete trs;
495 }//end loop on clusters of innLay
496 } //end loop on window sizes
497 } //end loop on innLay
498 }else{// Tracking inwards from the outer layers
499 // loop on starting layer for track finding
500 for(Int_t outLay=AliITSgeomTGeo::GetNLayers()-1; outLay>=fInnerStartLayer; outLay--) {
501
4fa7f7d1 502 if(ForceSkippingOfLayer(outLay)) continue;
12b1afb7 503 Int_t minNPoints=iMinNPoints-(AliITSgeomTGeo::GetNLayers()-1-outLay);
504 for(Int_t i=0;i<outLay-1;i++)
4fa7f7d1 505 if(ForceSkippingOfLayer(i))
12b1afb7 506 minNPoints--;
507 if(minNPoints<fMinNPoints) continue;
ebda3140 508
12b1afb7 509 // loop on phi and lambda window size
510 for(Int_t nloop=0;nloop<fNloop;nloop++){
511 Int_t nclOutLay=fCluLayer[outLay]->GetEntries();
512 while(nclOutLay--){
513 ResetForFinding();
514 Bool_t useRP=SetFirstPoint(outLay,nclOutLay,primaryVertex);
515 if(!useRP) continue;
516 AliITStrackSA* trs = new AliITStrackSA();
517
518 Int_t pflag=0;
519 Int_t kk;
520 for(kk=0;kk<AliITSgeomTGeo::GetNLayers();kk++) nClusLay[kk] = 0;
521
522 kk=0;
523 nClusLay[kk] = SearchClusters(outLay,fPhiWin[nloop],fLambdaWin[nloop],
b8ed1a92 524 trs,primaryVertex[2],pflag);
12b1afb7 525 for(Int_t nextLay=outLay-1; nextLay>=0; nextLay--) {
526 kk++;
527 nClusLay[kk] = SearchClusters(nextLay,fPhiWin[nloop],fLambdaWin[nloop],
528 trs,primaryVertex[2],pflag);
529 if(nClusLay[kk]!=0){
530 pflag=1;
531 if(kk==1) {
532 fPoint3[0]=fPointc[0];
533 fPoint3[1]=fPointc[1];
534 } else {
535 UpdatePoints();
536 }
ebda3140 537 }
538 }
ebda3140 539
12b1afb7 540 Int_t layOK=0;
541 for(Int_t nnp=outLay; nnp>=0; nnp--){
542 if(nClusLay[nnp]!=0) layOK+=1;
543 }
544 if(layOK>=minNPoints){
b881f1fd 545 AliDebug(2,Form("---NPOINTS: %d; MAP: %d %d %d %d %d %d\n",layOK,nClusLay[0],nClusLay[1],nClusLay[2],nClusLay[3],nClusLay[4],nClusLay[5]));
12b1afb7 546 AliITStrackV2* tr2 = 0;
547 tr2 = FitTrack(trs,primaryVertex);
92bb7af4 548 if(!tr2){
549 delete trs;
550 continue;
551 }
b881f1fd 552 AliDebug(2,Form("---NPOINTS fit: %d\n",tr2->GetNumberOfClusters()));
12b1afb7 553
554 StoreTrack(tr2,event);
555 ntrack++;
556
557 }
ebda3140 558
12b1afb7 559 delete trs;
ebda3140 560 }//end loop on clusters of innLay
12b1afb7 561 } //end loop on window sizes
562 } //end loop on innLay
563 } // end if (fInwardFlag)
564 }//end loop on min points
5a03f353 565
8403ece4 566 // search for 1-point tracks in SPD, only for cosmics
5a03f353 567 // (A.Dainese 21.03.08)
568 if(AliITSReconstructor::GetRecoParam()->GetSAOnePointTracks() &&
569 TMath::Abs(event->GetMagneticField())<0.01) {
8403ece4 570 Int_t outerLayer=1; // only SPD
571 for(Int_t innLay=0; innLay<=TMath::Min(1,fOuterStartLayer); innLay++) {
5a03f353 572 // counter for clusters on each layer
deae0246 573
5a03f353 574 for(Int_t nloop=0;nloop<fNloop;nloop++){
575 Int_t nclInnLay=fCluLayer[innLay]->GetEntries();
576 while(nclInnLay--){ //loop starting from layer innLay
577 ResetForFinding();
12b1afb7 578 Bool_t useRP=SetFirstPoint(innLay,nclInnLay,primaryVertex);
579 if(!useRP) continue;
5a03f353 580 AliITStrackSA* trs = new AliITStrackSA();
12b1afb7 581
582 Int_t pflag=0;
5a03f353 583 Int_t kk;
deae0246 584 for(kk=0;kk<AliITSgeomTGeo::GetNLayers();kk++) nClusLay[kk] = 0;
5a03f353 585
586 kk=0;
deae0246 587 nClusLay[kk] = SearchClusters(innLay,fPhiWin[nloop],fLambdaWin[nloop],
5a03f353 588 trs,primaryVertex[2],pflag);
8403ece4 589 for(Int_t nextLay=innLay+1; nextLay<=outerLayer; nextLay++) {
5a03f353 590 kk++;
deae0246 591 nClusLay[kk] = SearchClusters(nextLay,fPhiWin[nloop],fLambdaWin[nloop],
5a03f353 592 trs,primaryVertex[2],pflag);
deae0246 593 if(nClusLay[kk]!=0){
5a03f353 594 pflag=1;
595 if(kk==1) {
596 fPoint3[0]=fPointc[0];
597 fPoint3[1]=fPointc[1];
598 } else {
599 UpdatePoints();
600 }
601 }
602 }
603
604 Int_t layOK=0;
605 for(Int_t nnp=0;nnp<AliITSgeomTGeo::GetNLayers()-innLay;nnp++){
deae0246 606 if(nClusLay[nnp]!=0) layOK+=1;
5a03f353 607 }
608 if(layOK==1) {
b881f1fd 609 AliDebug(2,Form("----NPOINTS: %d; MAP: %d %d %d %d %d %d\n",layOK,nClusLay[0],nClusLay[1],nClusLay[2],nClusLay[3],nClusLay[4],nClusLay[5]));
5a03f353 610 AliITStrackV2* tr2 = 0;
611 Bool_t onePoint = kTRUE;
612 tr2 = FitTrack(trs,primaryVertex,onePoint);
92bb7af4 613 if(!tr2){
614 delete trs;
615 continue;
616 }
b881f1fd 617 AliDebug(2,Form("----NPOINTS fit: %d\n",tr2->GetNumberOfClusters()));
5a03f353 618
c421499f 619 StoreTrack(tr2,event);
5a03f353 620 ntrack++;
621
622 }
623
624 delete trs;
625 }//end loop on clusters of innLay
626 } //end loop on window sizes
627
5a03f353 628 } //end loop on innLay
629 } // end search 1-point tracks
ebda3140 630
2d03436a 631 AliInfo(Form("Number of found tracks: %d",event->GetNumberOfTracks()));
632 ResetForFinding();
2257f27e 633 return 0;
bef31448 634
635}
7e5bf5af 636
13918578 637//________________________________________________________________________
638
5a03f353 639AliITStrackV2* AliITStrackerSA::FitTrack(AliITStrackSA* tr,Double_t *primaryVertex,Bool_t onePoint) {
ebda3140 640 //fit of the found track (most general case, also <6 points, layers missing)
641 // A.Dainese 16.11.07
13918578 642
13918578 643
deae0246 644 const Int_t kMaxClu=AliITStrackSA::kMaxNumberOfClusters;
13918578 645
deae0246 646 static Int_t firstmod[AliITSgeomTGeo::kNLayers];
647
648 static Int_t clind[AliITSgeomTGeo::kNLayers][kMaxClu];
649 static Int_t clmark[AliITSgeomTGeo::kNLayers][kMaxClu];
deae0246 650 static Int_t end[AliITSgeomTGeo::kNLayers];
651 static AliITSRecPoint *listlayer[AliITSgeomTGeo::kNLayers][kMaxClu];
13918578 652
ebda3140 653 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) {
b8ed1a92 654 firstmod[i]=AliITSgeomTGeo::GetModuleIndex(i+1,1,1);
deae0246 655 end[i]=0;
656 for(Int_t j=0;j<kMaxClu; j++){
ebda3140 657 clind[i][j]=0;
658 clmark[i][j]=0;
deae0246 659 listlayer[i][j]=0;
660 }
b8ed1a92 661 }
2755f080 662
2755f080 663
664 Int_t nclusters = tr->GetNumberOfClustersSA();
2755f080 665 for(Int_t ncl=0;ncl<nclusters;ncl++){
666 Int_t index = tr->GetClusterIndexSA(ncl);
667 AliITSRecPoint* cl = (AliITSRecPoint*)GetCluster(index);
668 if(cl->TestBit(kSAflag)==kTRUE) cl->ResetBit(kSAflag);
669 Int_t lay = (index & 0xf0000000) >> 28;
deae0246 670 Int_t nInLay=end[lay];
671 listlayer[lay][nInLay]=cl;
5691e727 672 clind[lay][nInLay]=index;
deae0246 673 end[lay]++;
2755f080 674 }
2755f080 675
676 for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
677 for(Int_t ncl=0;ncl<tr->GetNumberOfMarked(nlay);ncl++){
678 Int_t mark = tr->GetClusterMark(nlay,ncl);
5691e727 679 clmark[nlay][ncl]=mark;
2755f080 680 }
681 }
682
2755f080 683
684 Int_t firstLay=-1,secondLay=-1;
2755f080 685 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) {
deae0246 686 if(end[i]==0) {
2755f080 687 end[i]=1;
deae0246 688 }else{
2755f080 689 if(firstLay==-1) {
690 firstLay=i;
691 } else if(secondLay==-1) {
692 secondLay=i;
693 }
694 }
695 }
696
deae0246 697 if(firstLay==-1 || (secondLay==-1 && !onePoint)) return 0;
698
2755f080 699 for(Int_t l0=0;l0<end[0];l0++){ //loop on layer 1
deae0246 700 AliITSRecPoint* cl0 = (AliITSRecPoint*)listlayer[0][l0];
2755f080 701 for(Int_t l1=0;l1<end[1];l1++){ //loop on layer 2
deae0246 702 AliITSRecPoint* cl1 = (AliITSRecPoint*)listlayer[1][l1];
2755f080 703 for(Int_t l2=0;l2<end[2];l2++){ //loop on layer 3
deae0246 704 AliITSRecPoint* cl2 = (AliITSRecPoint*)listlayer[2][l2];
2755f080 705 for(Int_t l3=0;l3<end[3];l3++){ //loop on layer 4
deae0246 706 AliITSRecPoint* cl3 = (AliITSRecPoint*)listlayer[3][l3];
2755f080 707 for(Int_t l4=0;l4<end[4];l4++){ //loop on layer 5
deae0246 708 AliITSRecPoint* cl4 = (AliITSRecPoint*)listlayer[4][l4];
2755f080 709 for(Int_t l5=0;l5<end[5];l5++){ //loop on layer 6
deae0246 710 AliITSRecPoint* cl5 = (AliITSRecPoint*)listlayer[5][l5];
2755f080 711
712
713 Double_t x1,y1,z1,sx1,sy1,sz1;
714 Double_t x2,y2,z2,sx2,sy2,sz2;
715 AliITSRecPoint* p1=0;
716 AliITSRecPoint* p2=0;
717 Int_t index1=0,index2=0;
718 Int_t mrk1=0,mrk2=0;
719
720 switch(firstLay) {
721 case 0:
722 p1=cl0;
ebda3140 723 index1=clind[0][l0];mrk1=clmark[0][l0];
2755f080 724 break;
725 case 1:
726 p1=cl1;
ebda3140 727 index1=clind[1][l1];mrk1=clmark[1][l1];
2755f080 728 break;
729 case 2:
730 p1=cl2;
ebda3140 731 index1=clind[2][l2];mrk1=clmark[2][l2];
2755f080 732 break;
733 case 3:
734 p1=cl3;
ebda3140 735 index1=clind[3][l3];mrk1=clmark[3][l3];
2755f080 736 break;
737 case 4:
738 p1=cl4;
ebda3140 739 index1=clind[4][l4];mrk1=clmark[4][l4];
2755f080 740 break;
741 }
742
743 switch(secondLay) {
744 case 1:
745 p2=cl1;
ebda3140 746 index2=clind[1][l1];mrk2=clmark[1][l1];
2755f080 747 break;
748 case 2:
749 p2=cl2;
ebda3140 750 index2=clind[2][l2];mrk2=clmark[2][l2];
2755f080 751 break;
752 case 3:
753 p2=cl3;
ebda3140 754 index2=clind[3][l3];mrk2=clmark[3][l3];
2755f080 755 break;
756 case 4:
757 p2=cl4;
ebda3140 758 index2=clind[4][l4];mrk2=clmark[4][l4];
2755f080 759 break;
760 case 5:
761 p2=cl5;
ebda3140 762 index2=clind[5][l5];mrk2=clmark[5][l5];
2755f080 763 break;
5a03f353 764 default:
765 p2=0;
766 index2=-1;mrk2=-1;
767 break;
2755f080 768 }
769
770 Int_t module1 = p1->GetDetectorIndex()+firstmod[firstLay];
5a03f353 771 Int_t layer,ladder,detector;
772 AliITSgeomTGeo::GetModuleId(module1,layer,ladder,detector);
773 Float_t yclu1 = p1->GetY();
774 Float_t zclu1 = p1->GetZ();
775 Double_t cv=0,tgl2=0,phi2=0;
2755f080 776
777 Int_t cln1=mrk1;
2755f080 778 AliITSclusterTable* arr1 = (AliITSclusterTable*)GetClusterCoord(firstLay,cln1);
2755f080 779 x1 = arr1->GetX();
2755f080 780 y1 = arr1->GetY();
2755f080 781 z1 = arr1->GetZ();
2755f080 782 sx1 = arr1->GetSx();
2755f080 783 sy1 = arr1->GetSy();
2755f080 784 sz1 = arr1->GetSz();
225a692b 785
5a03f353 786 if(secondLay>0) {
787 Int_t cln2=mrk2;
788 AliITSclusterTable* arr2 = (AliITSclusterTable*)GetClusterCoord(secondLay,cln2);
789 x2 = arr2->GetX();
790 y2 = arr2->GetY();
791 z2 = arr2->GetZ();
792 sx2 = arr2->GetSx();
793 sy2 = arr2->GetSy();
794 sz2 = arr2->GetSz();
795 cv = Curvature(primaryVertex[0],primaryVertex[1],x1,y1,x2,y2);
796 tgl2 = (z2-z1)/TMath::Sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
797 phi2 = TMath::ATan2((y2-y1),(x2-x1));
798 } else { // special case of 1-point tracks, only for cosmics (B=0)
799 x2 = primaryVertex[0];
800 y2 = primaryVertex[1];
801 z2 = primaryVertex[2];
802 cv = 0;
803 tgl2 = (z1-z2)/TMath::Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
804 phi2 = TMath::ATan2((y1-y2),(x1-x2));
805 }
806
807
2755f080 808 AliITStrackSA* trac = new AliITStrackSA(layer,ladder,detector,yclu1,zclu1,phi2,tgl2,cv,1);
225a692b 809
810
2755f080 811 if(cl5!=0) {
ebda3140 812 trac->AddClusterV2(5,(clind[5][l5] & 0x0fffffff)>>0);
813 trac->AddClusterMark(5,clmark[5][l5]);
b8ed1a92 814 }
815 if(cl4!=0){
ebda3140 816 trac->AddClusterV2(4,(clind[4][l4] & 0x0fffffff)>>0);
817 trac->AddClusterMark(4,clmark[4][l4]);
b8ed1a92 818 }
819 if(cl3!=0){
ebda3140 820 trac->AddClusterV2(3,(clind[3][l3] & 0x0fffffff)>>0);
821 trac->AddClusterMark(3,clmark[3][l3]);
b8ed1a92 822 }
823 if(cl2!=0){
ebda3140 824 trac->AddClusterV2(2,(clind[2][l2] & 0x0fffffff)>>0);
825 trac->AddClusterMark(2,clmark[2][l2]);
b8ed1a92 826 }
827 if(cl1!=0){
ebda3140 828 trac->AddClusterV2(1,(clind[1][l1] & 0x0fffffff)>>0);
829 trac->AddClusterMark(1,clmark[1][l1]);
b8ed1a92 830 }
831 if(cl0!=0){
ebda3140 832 trac->AddClusterV2(0,(clind[0][l0] & 0x0fffffff)>>0);
833 trac->AddClusterMark(0,clmark[0][l0]);
b8ed1a92 834 }
835
b8ed1a92 836 //fit with Kalman filter using AliITStrackerMI::RefitAt()
837 AliITStrackMI* ot = new AliITStrackSA(*trac);
838
839 ot->ResetCovariance(10.);
840 ot->ResetClusters();
841
b881f1fd 842 // Propagate inside the innermost layer with a cluster
843 if(ot->Propagate(ot->GetX()-0.1*ot->GetX())) {
844
845 if(RefitAt(AliITSRecoParam::GetrInsideITSscreen(),ot,trac)){ //fit from layer 1 to layer 6
846 AliITStrackMI *otrack2 = new AliITStrackMI(*ot);
847 otrack2->ResetCovariance(10.);
848 otrack2->ResetClusters();
849 //fit from layer 6 to layer 1
850 if(RefitAt(AliITSRecoParam::GetrInsideSPD1(),otrack2,ot)) {
851 fListOfTracks->AddLast(otrack2);
852 fListOfSATracks->AddLast(trac);
853 } else {
854 delete otrack2;
855 delete trac;
856 }
b8ed1a92 857
b881f1fd 858 }
859 }
b8ed1a92 860 delete ot;
b8ed1a92 861 }//end loop layer 6
862 }//end loop layer 5
863 }//end loop layer 4
864 }//end loop layer 3
865 }//end loop layer 2
866 }//end loop layer 1
867
b8ed1a92 868
225a692b 869
b8ed1a92 870
deae0246 871 if(fListOfTracks->GetEntries()==0) return 0;
b8ed1a92 872
deae0246 873 Int_t lowchi2 = FindTrackLowChiSquare();
b8ed1a92 874 AliITStrackV2* otrack =(AliITStrackV2*)fListOfTracks->At(lowchi2);
deae0246 875 AliITStrackSA* trsa = (AliITStrackSA*)fListOfSATracks->At(lowchi2);
b8ed1a92 876
deae0246 877 if(otrack==0) return 0;
878
879 Int_t indexc[AliITSgeomTGeo::kNLayers];
b8ed1a92 880 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) indexc[i]=0;
881 for(Int_t nind=0;nind<otrack->GetNumberOfClusters();nind++){
882 indexc[nind] = otrack->GetClusterIndex(nind);
883 }
884 Int_t labl[6][3];
885 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) {
886 if(i<otrack->GetNumberOfClusters()) {
887 AliITSRecPoint* cl = (AliITSRecPoint*)GetCluster(indexc[i]);
888 labl[i][0]=cl->GetLabel(0);
889 labl[i][1]=cl->GetLabel(1);
890 labl[i][2]=cl->GetLabel(2);
891 } else {
892 labl[i][0]=-1;
893 labl[i][1]=-1;
894 labl[i][2]=-1;
895 }
896 }
2755f080 897
b8ed1a92 898 CookLabel(otrack,0.); //MI change - to see fake ratio
899
900 Int_t label=FindLabel(labl[0][0],labl[1][0],labl[2][0],labl[3][0],labl[4][0],labl[5][0]);
901 Int_t lflag=0;
2755f080 902 for(Int_t i=0;i<otrack->GetNumberOfClusters();i++)
b8ed1a92 903 if(labl[i][0]==label || labl[i][1]==label || labl[i][2]==label) lflag++;
904
2755f080 905 if(lflag<otrack->GetNumberOfClusters()) label = -label;
b8ed1a92 906 otrack->SetLabel(label);
907
908 //remove clusters of found track
909 for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
910 for(Int_t cln=0;cln<trsa->GetNumberOfMarked(nlay);cln++){
911 Int_t index = trsa->GetClusterMark(nlay,cln);
912 fCluLayer[nlay]->RemoveAt(index);
913 RemoveClusterCoord(nlay,index);
914 fCluLayer[nlay]->Compress();
7e5bf5af 915 }
916 }
7e5bf5af 917
13918578 918 return otrack;
919
920}
921
c421499f 922//_______________________________________________________
923void AliITStrackerSA::StoreTrack(AliITStrackV2 *t,AliESDEvent *event) const
924{
925 //
926 // Add new track to the ESD
927 //
928 AliESDtrack outtrack;
929 outtrack.UpdateTrackParams(t,AliESDtrack::kITSin);
930 for(Int_t i=0;i<12;i++) {
931 outtrack.SetITSModuleIndex(i,t->GetModuleIndex(i));
932 }
09cf9d66 933 Double_t sdedx[4]={0.,0.,0.,0.};
934 for(Int_t i=0; i<4; i++) sdedx[i]=t->GetSampledEdx(i);
935 outtrack.SetITSdEdxSamples(sdedx);
c421499f 936 event->AddTrack(&outtrack);
937
938 return;
939}
bef31448 940
4e05ab9a 941
bef31448 942//_______________________________________________________
7e5bf5af 943Int_t AliITStrackerSA::SearchClusters(Int_t layer,Double_t phiwindow,Double_t lambdawindow, AliITStrackSA* trs,Double_t /*zvertex*/,Int_t pflag){
13918578 944 //function used to to find the clusters associated to the track
2755f080 945
4fa7f7d1 946 if(ForceSkippingOfLayer(layer)) return 0;
2755f080 947
13918578 948 Int_t nc=0;
949 AliITSlayer &lay = fgLayers[layer];
7e5bf5af 950 Double_t r=lay.GetR();
2755f080 951 if(pflag==1){
cfe729e0 952 Float_t cx1,cx2,cy1,cy2;
953 FindEquation(fPoint1[0],fPoint1[1],fPoint2[0],fPoint2[1],fPoint3[0],fPoint3[1],fCoef1,fCoef2,fCoef3);
954 if (FindIntersection(fCoef1,fCoef2,fCoef3,-r*r,cx1,cy1,cx2,cy2)==0)
955 return 0;
1966f03c 956 Double_t fi1=TMath::ATan2(cy1-fPoint1[1],cx1-fPoint1[0]);
957 Double_t fi2=TMath::ATan2(cy2-fPoint1[1],cx2-fPoint1[0]);
cfe729e0 958 fPhiEstimate=ChoosePoint(fi1,fi2,fPhic);
959 }
13918578 960
7e5bf5af 961
962 Int_t ncl = fCluLayer[layer]->GetEntries();
963 for (Int_t index=0; index<ncl; index++) {
00a7cc50 964 AliITSRecPoint *c = (AliITSRecPoint*)fCluLayer[layer]->At(index);
7e5bf5af 965 if (!c) continue;
966 if (c->GetQ()<=0) continue;
3733ccd2 967 if(layer>1 && c->GetQ()<=fMinQ) continue;
7e5bf5af 968
969 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(layer,index);
970 Double_t phi = arr->GetPhi();
cfe729e0 971 if (TMath::Abs(phi-fPhiEstimate)>phiwindow) continue;
494fda7c 972
7e5bf5af 973 Double_t lambda = arr->GetLambda();
cfe729e0 974 if (TMath::Abs(lambda-fLambdac)>lambdawindow) continue;
975
7e5bf5af 976 if(trs->GetNumberOfClustersSA()==trs->GetMaxNumberOfClusters()) return 0;
977 if(trs->GetNumberOfMarked(layer)==trs->GetMaxNMarkedPerLayer()) return 0;
978 Int_t orind = arr->GetOrInd();
979 trs->AddClusterSA(layer,orind);
980 trs->AddClusterMark(layer,index);
981
cfe729e0 982 nc++;
983 fLambdac=lambda;
984 fPhiEstimate=phi;
cfe729e0 985
7e5bf5af 986 fPointc[0]=arr->GetX();
987 fPointc[1]=arr->GetY();
988
cfe729e0 989 }
990 return nc;
991}
13918578 992
12b1afb7 993//________________________________________________________________
994Bool_t AliITStrackerSA::SetFirstPoint(Int_t lay, Int_t clu, Double_t* primaryVertex){
995 // Sets the first point (seed) for tracking
996
997 AliITSRecPoint* cl = (AliITSRecPoint*)fCluLayer[lay]->At(clu);
998 if(!cl) return kFALSE;
999 if (cl->GetQ()<=0) return kFALSE;
1000 if(lay>1 && cl->GetQ()<=fMinQ) return kFALSE;
1001
1002 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(lay,clu);
1003 fPhic = arr->GetPhi();
1004 fLambdac = arr->GetLambda();
1005 fPhiEstimate = fPhic;
1006 fPoint1[0]=primaryVertex[0];
1007 fPoint1[1]=primaryVertex[1];
1008 fPoint2[0]=arr->GetX();
1009 fPoint2[1]=arr->GetY();
1010 return kTRUE;
1011}
1012
bef31448 1013//________________________________________________________________
1014void AliITStrackerSA::UpdatePoints(){
1015 //update of points for the estimation of the curvature
13918578 1016
bef31448 1017 fPoint2[0]=fPoint3[0];
1018 fPoint2[1]=fPoint3[1];
1019 fPoint3[0]=fPointc[0];
1020 fPoint3[1]=fPointc[1];
13918578 1021
1022
13918578 1023}
13918578 1024
13918578 1025//___________________________________________________________________
1026Int_t AliITStrackerSA::FindEquation(Float_t x1, Float_t y1, Float_t x2, Float_t y2, Float_t x3, Float_t y3,Float_t& a, Float_t& b, Float_t& c){
1027
1028 //given (x,y) of three recpoints (in global coordinates)
1029 //returns the parameters a,b,c of circonference x*x + y*y +a*x + b*y +c
1030
1031 Float_t den = (x3-x1)*(y2-y1)-(x2-x1)*(y3-y1);
1032 if(den==0) return 0;
1033 a = ((y3-y1)*(x2*x2+y2*y2-x1*x1-y1*y1)-(y2-y1)*(x3*x3+y3*y3-x1*x1-y1*y1))/den;
1034 b = -(x2*x2-x1*x1+y2*y2-y1*y1+a*(x2-x1))/(y2-y1);
1035 c = -x1*x1-y1*y1-a*x1-b*y1;
1036 return 1;
1037 }
1038//__________________________________________________________________________
1039 Int_t AliITStrackerSA::FindIntersection(Float_t a1, Float_t b1, Float_t c1, Float_t c2,Float_t& x1,Float_t& y1, Float_t& x2, Float_t& y2){
1040
1041 //Finds the intersection between the circonference of the track and the circonference centered in (0,0) represented by one layer
1042 //c2 is -rlayer*rlayer
1043
1044 if(a1==0) return 0;
3a2f227d 1045 Double_t m = c2-c1;
1046 Double_t aA = (b1*b1)/(a1*a1)+1;
1047 Double_t bB = (-2*m*b1/(a1*a1));
1048 Double_t cC = c2+(m*m)/(a1*a1);
1049 Double_t dD = bB*bB-4*aA*cC;
1050 if(dD<0) return 0;
13918578 1051
3a2f227d 1052 y1 = (-bB+TMath::Sqrt(dD))/(2*aA);
1053 y2 = (-bB-TMath::Sqrt(dD))/(2*aA);
13918578 1054 x1 = (c2-c1-b1*y1)/a1;
1055 x2 = (c2-c1-b1*y2)/a1;
1056
1057 return 1;
1058}
1059//____________________________________________________________________
1060Double_t AliITStrackerSA::Curvature(Double_t x1,Double_t y1,Double_t
1061x2,Double_t y2,Double_t x3,Double_t y3){
1062
1063 //calculates the curvature of track
1064 Double_t den = (x3-x1)*(y2-y1)-(x2-x1)*(y3-y1);
1065 if(den==0) return 0;
1066 Double_t a = ((y3-y1)*(x2*x2+y2*y2-x1*x1-y1*y1)-(y2-y1)*(x3*x3+y3*y3-x1*x1-y1*y1))/den;
1067 Double_t b = -(x2*x2-x1*x1+y2*y2-y1*y1+a*(x2-x1))/(y2-y1);
1068 Double_t c = -x1*x1-y1*y1-a*x1-b*y1;
1069 Double_t xc=-a/2.;
1070
1071 if((a*a+b*b-4*c)<0) return 0;
1072 Double_t rad = TMath::Sqrt(a*a+b*b-4*c)/2.;
1073 if(rad==0) return 0;
1074
1075 if((x1>0 && y1>0 && x1<xc)) rad*=-1;
1076 if((x1<0 && y1>0 && x1<xc)) rad*=-1;
1077 // if((x1<0 && y1<0 && x1<xc)) rad*=-1;
1078 // if((x1>0 && y1<0 && x1<xc)) rad*=-1;
1079
1080 return 1/rad;
1081
1082}
7e5bf5af 1083
1084
13918578 1085//____________________________________________________________________
1086Double_t AliITStrackerSA::ChoosePoint(Double_t p1, Double_t p2, Double_t pp){
1087
1088 //Returns the point closest to pp
1089
1090 Double_t diff1 = p1-pp;
1091 Double_t diff2 = p2-pp;
1092
1093 if(TMath::Abs(diff1)<TMath::Abs(diff2)) fPhiEstimate=p1;
1094 else fPhiEstimate=p2;
1095 return fPhiEstimate;
1096
1097}
1098
1099
1100//_________________________________________________________________
deae0246 1101Int_t AliITStrackerSA::FindTrackLowChiSquare() const {
1102 // returns track with lowest chi square
1103 Int_t dim=fListOfTracks->GetEntries();
1104 if(dim<=1) return 0;
1105 AliITStrackV2* trk = (AliITStrackV2*)fListOfTracks->At(0);
1106 Double_t minChi2=trk->GetChi2();
1107 Int_t index=0;
1108 for(Int_t i=1;i<dim;i++){
4adcf390 1109 trk = (AliITStrackV2*)fListOfTracks->At(i);
deae0246 1110 Double_t chi2=trk->GetChi2();
1111 if(chi2<minChi2){
1112 minChi2=chi2;
1113 index=i;
13918578 1114 }
13918578 1115 }
deae0246 1116 return index;
13918578 1117}
1118
1119//__________________________________________________________
2755f080 1120Int_t AliITStrackerSA::FindLabel(Int_t l0, Int_t l1, Int_t l2, Int_t l3, Int_t l4, Int_t l5){
13918578 1121
1122 //function used to determine the track label
1123
2755f080 1124 Int_t lb[6] = {l0,l1,l2,l3,l4,l5};
13918578 1125 Int_t aa[6]={1,1,1,1,1,1};
1126 Int_t ff=0;
1127 Int_t ll=0;
1128 Int_t k=0;Int_t w=0;Int_t num=6;
8b3779ef 1129 for(Int_t i=5;i>=0;i--) if(lb[i]==-1) num=i;
13918578 1130
1131 while(k<num){
1132
1133 for(Int_t i=k+1;i<num;i++){
1134
1135 if(lb[k]==lb[i] && aa[k]!=0){
1136
1137 aa[k]+=1;
1138 aa[i]=0;
1139 }
1140 }
8b3779ef 1141 k++;
13918578 1142 }
1143
1144 while(w<num){
8b3779ef 1145
13918578 1146 for(Int_t j=0;j<6;j++){
1147 if(aa[w]<aa[j]){
1148 ff=aa[w];
1149 aa[w]=aa[j];
1150 aa[j]=ff;
1151 ll=lb[w];
1152 lb[w]=lb[j];
1153 lb[j]=ll;
1154 }
1155 }
8b3779ef 1156 w++;
13918578 1157 }
8b3779ef 1158
1159 if(num<1) return -1;
1160 return lb[num-1];
13918578 1161}
1162
1163//_____________________________________________________________________________
1164Int_t AliITStrackerSA::Label(Int_t gl1, Int_t gl2, Int_t gl3, Int_t gl4, Int_t gl5, Int_t gl6,Int_t gl7, Int_t gl8, Int_t gl9, Int_t gl10,Int_t gl11,
2755f080 1165Int_t gl12, Int_t gl13, Int_t gl14,Int_t gl15, Int_t gl16, Int_t gl17, Int_t gl18, Int_t minNPoints){
13918578 1166
1167
1168 //function used to assign label to the found track. If track is fake, the label is negative
1169
1170 Int_t lb0[6] = {gl1,gl2,gl3,gl4,gl5,gl6};
1171 Int_t lb1[6] = {gl7,gl8,gl9,gl10,gl11,gl12};
1172 Int_t lb2[6] = {gl13,gl14,gl15,gl16,gl17,gl18};
1173 Int_t ll=FindLabel(lb0[0],lb0[1],lb0[2],lb0[3],lb0[4],lb0[5]);
1174 Int_t lflag=0;Int_t num=6;
1175 if(lb0[5]==-1 && lb1[5]==-1 && lb2[5]==-1) num=5;
1176
1177 for(Int_t i=0;i<num;i++){
1178 if(lb0[i]==ll || lb1[i]==ll || lb2[i]==ll) lflag+=1;
1179 }
1180
2755f080 1181 if(lflag>=minNPoints) return ll;
13918578 1182 else return -ll;
1183
1184
1185}
13918578 1186//_____________________________________________________________________________
5b4dedce 1187void AliITStrackerSA::SetCalculatedWindowSizes(Int_t n, Float_t phimin, Float_t phimax, Float_t lambdamin, Float_t lambdamax){
1188 // Set sizes of the phi and lambda windows used for track finding
1189 fNloop = n;
1190 if(fPhiWin) delete [] fPhiWin;
1191 if(fLambdaWin) delete [] fLambdaWin;
1192 fPhiWin = new Double_t[fNloop];
1193 fLambdaWin = new Double_t[fNloop];
1194 Float_t stepPhi=(phimax-phimin)/(Float_t)(fNloop-1);
1195 Float_t stepLambda=(lambdamax-lambdamin)/(Float_t)(fNloop-1);
1196 for(Int_t k=0;k<fNloop;k++){
1197 Float_t phi=phimin+k*stepPhi;
1198 Float_t lam=lambdamin+k*stepLambda;
1199 fPhiWin[k]=phi;
1200 fLambdaWin[k]=lam;
1201 }
1202}
1203//_____________________________________________________________________________
1204void AliITStrackerSA::SetFixedWindowSizes(Int_t n, Double_t *phi, Double_t *lam){
13918578 1205 // Set sizes of the phi and lambda windows used for track finding
1206 fNloop = n;
1207 if(phi){ // user defined values
1208 fPhiWin = new Double_t[fNloop];
1209 fLambdaWin = new Double_t[fNloop];
1210 for(Int_t k=0;k<fNloop;k++){
1211 fPhiWin[k]=phi[k];
1212 fLambdaWin[k]=lam[k];
1213 }
1214 }
1215 else { // default values
627b6db6 1216
1217 Double_t phid[33] = {0.002,0.003,0.004,0.0045,0.0047,
bef31448 1218 0.005,0.0053,0.0055,
1219 0.006,0.0063,0.0065,0.007,0.0073,0.0075,0.0077,
1220 0.008,0.0083,0.0085,0.0087,0.009,0.0095,0.0097,
627b6db6 1221 0.01,0.0105,0.011,0.0115,0.012,0.0125,0.013,0.0135,0.0140,0.0145};
1222 Double_t lambdad[33] = {0.003,0.004,0.005,0.005,0.005,
1223 0.005,0.005,0.006,
1224 0.006,0.006,0.006,0.007,0.007,0.007,0.007,
1225 0.007,0.007,0.007,0.007,0.007,0.007,0.007,
1226 0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008};
bef31448 1227
627b6db6 1228 if(fNloop!=33){
1229 fNloop = 33;
13918578 1230 }
627b6db6 1231
1232
13918578 1233 fPhiWin = new Double_t[fNloop];
1234 fLambdaWin = new Double_t[fNloop];
e340bb86 1235
e340bb86 1236 Double_t factor=AliITSReconstructor::GetRecoParam()->GetFactorSAWindowSizes(); // possibility to enlarge windows for cosmics reco with large misalignments (A.Dainese)
2755f080 1237
1238 for(Int_t k=0;k<fNloop;k++){
e340bb86 1239 fPhiWin[k]=phid[k]*factor;
1240 fLambdaWin[k]=lambdad[k]*factor;
13918578 1241 }
1242
1243 }
1244
1245}
7e5bf5af 1246//_______________________________________________________________________
cc088660 1247void AliITStrackerSA::GetCoorAngles(AliITSRecPoint* cl,Double_t &phi,Double_t &lambda, Float_t &x, Float_t &y,Float_t &z,Double_t* vertex){
7e5bf5af 1248 //Returns values of phi (azimuthal) and lambda angles for a given cluster
cc088660 1249/*
7e5bf5af 1250 Double_t rot[9]; fGeom->GetRotMatrix(module,rot);
1251 Int_t lay,lad,det; fGeom->GetModuleId(module,lay,lad,det);
1252 Float_t tx,ty,tz; fGeom->GetTrans(lay,lad,det,tx,ty,tz);
1253
1254 Double_t alpha=TMath::ATan2(rot[1],rot[0])+TMath::Pi();
1255 Double_t phi1=TMath::Pi()/2+alpha;
1256 if (lay==1) phi1+=TMath::Pi();
1257
1258 Float_t cp=TMath::Cos(phi1), sp=TMath::Sin(phi1);
1259 Float_t r=tx*cp+ty*sp;
1260
cc088660 1261 xyz= r*cp - cl->GetY()*sp;
7e5bf5af 1262 y= r*sp + cl->GetY()*cp;
1263 z=cl->GetZ();
cc088660 1264*/
1265 Float_t xyz[3];
1266 cl->GetGlobalXYZ(xyz);
1267 x=xyz[0];
1268 y=xyz[1];
1269 z=xyz[2];
1270
1966f03c 1271 phi=TMath::ATan2(y-vertex[1],x-vertex[0]);
7e5bf5af 1272 lambda=TMath::ATan2(z-vertex[2],TMath::Sqrt((x-vertex[0])*(x-vertex[0])+(y-vertex[1])*(y-vertex[1])));
1273}
13918578 1274
7e5bf5af 1275//________________________________________________________________________
cc088660 1276void AliITStrackerSA::GetCoorErrors(AliITSRecPoint* cl,Float_t &sx,Float_t &sy, Float_t &sz){
7e5bf5af 1277
cc088660 1278 //returns sigmax, y, z of cluster in global coordinates
1279/*
7e5bf5af 1280 Double_t rot[9]; fGeom->GetRotMatrix(module,rot);
cc088660 1281 Int_t lay,lad,det;
1282 AliITSgeomTGeo::GetModuleId(module,lay,lad,det);
7e5bf5af 1283
1284 Double_t alpha=TMath::ATan2(rot[1],rot[0])+TMath::Pi();
1285 Double_t phi=TMath::Pi()/2+alpha;
1286 if (lay==1) phi+=TMath::Pi();
1287
1288 Float_t cp=TMath::Cos(phi), sp=TMath::Sin(phi);
cc088660 1289*/
1290 Float_t covm[6];
1291 cl->GetGlobalCov(covm);
1292 sx=TMath::Sqrt(covm[0]);
1293 sy=TMath::Sqrt(covm[3]);
1294 sz=TMath::Sqrt(covm[5]);
1295/*
7e5bf5af 1296 sx = TMath::Sqrt(sp*sp*cl->GetSigmaY2());
1297 sy = TMath::Sqrt(cp*cp*cl->GetSigmaY2());
1298 sz = TMath::Sqrt(cl->GetSigmaZ2());
cc088660 1299*/
7e5bf5af 1300}