]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/AliITStrackerSA.cxx
Bug fix concerning multiple found tracks (F. Prino)
[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;
390 delete fCluLayer[i];
391 fCluLayer[i] = new TClonesArray("AliITSRecPoint",nclusters[i]);
392 delete fCluCoord[i];
393 fCluCoord[i] = new TClonesArray("AliITSclusterTable",nclusters[i]);
394 }
395
396 for(Int_t ilay=0;ilay<AliITSgeomTGeo::GetNLayers();ilay++){
397 TClonesArray &clulay = *fCluLayer[ilay];
398 TClonesArray &clucoo = *fCluCoord[ilay];
399 AliITSlayer &layer=fgLayers[ilay];
4fa7f7d1 400 if (!ForceSkippingOfLayer(ilay)) {
25be2b21 401 for(Int_t cli=0;cli<layer.GetNumberOfClusters();cli++){
402 AliITSRecPoint* cls = (AliITSRecPoint*)layer.GetCluster(cli);
403 if(cls->TestBit(kSAflag)==kTRUE) continue;
404 if(cls->GetQ()==0) continue;
3733ccd2 405 if(ilay>1 && cls->GetQ()<=fMinQ) continue;
25be2b21 406 Double_t phi=0;Double_t lambda=0;
407 Float_t x=0;Float_t y=0;Float_t z=0;
408 Float_t sx=0;Float_t sy=0;Float_t sz=0;
409 GetCoorAngles(cls,phi,lambda,x,y,z,primaryVertex);
410 GetCoorErrors(cls,sx,sy,sz);
411 new (clulay[dmar[ilay]]) AliITSRecPoint(*cls);
412 new (clucoo[dmar[ilay]]) AliITSclusterTable(x,y,z,sx,sy,sz,phi,lambda,cli);
413 dmar[ilay]++;
414 }
ebda3140 415 }
416 }
7e5bf5af 417
6f178e14 418 // track counter
419 Int_t ntrack=0;
420
deae0246 421 static Int_t nClusLay[AliITSgeomTGeo::kNLayers];//counter for clusters on each layer
6f178e14 422
12b1afb7 423 // loop on minimum number of points
424 for(Int_t iMinNPoints=AliITSgeomTGeo::GetNLayers(); iMinNPoints>=fMinNPoints; iMinNPoints--) {
425
426 if(!fInwardFlag){ // Tracking outwards from the inner layers
427 // loop on starting layer for track finding
428 for(Int_t innLay=0; innLay<=fOuterStartLayer; innLay++) {
4fa7f7d1 429 if(ForceSkippingOfLayer(innLay)) continue;
12b1afb7 430 Int_t minNPoints=iMinNPoints-innLay;
431 for(Int_t i=innLay+1;i<AliITSgeomTGeo::GetNLayers();i++)
4fa7f7d1 432 if(ForceSkippingOfLayer(i))
12b1afb7 433 minNPoints--;
434 if(minNPoints<fMinNPoints) continue;
435
436 // loop on phi and lambda window size
437 for(Int_t nloop=0;nloop<fNloop;nloop++){
438 Int_t nclInnLay=fCluLayer[innLay]->GetEntries();
439 while(nclInnLay--){
440 ResetForFinding();
441 Bool_t useRP=SetFirstPoint(innLay,nclInnLay,primaryVertex);
442 if(!useRP) continue;
443 AliITStrackSA* trs = new AliITStrackSA();
444
445 Int_t pflag=0;
446 Int_t kk;
447 for(kk=0;kk<AliITSgeomTGeo::GetNLayers();kk++) nClusLay[kk] = 0;
448
449 kk=0;
450 nClusLay[kk] = SearchClusters(innLay,fPhiWin[nloop],fLambdaWin[nloop],
451 trs,primaryVertex[2],pflag);
452 for(Int_t nextLay=innLay+1; nextLay<AliITSgeomTGeo::GetNLayers(); nextLay++) {
453 kk++;
454 nClusLay[kk] = SearchClusters(nextLay,fPhiWin[nloop],fLambdaWin[nloop],
455 trs,primaryVertex[2],pflag);
456 if(nClusLay[kk]!=0){
457 pflag=1;
458 if(kk==1) {
459 fPoint3[0]=fPointc[0];
460 fPoint3[1]=fPointc[1];
461 } else {
462 UpdatePoints();
463 }
464 }
465 }
466
467 Int_t layOK=0;
468 for(Int_t nnp=0;nnp<AliITSgeomTGeo::GetNLayers()-innLay;nnp++){
469 if(nClusLay[nnp]!=0) layOK+=1;
470 }
471 if(layOK>=minNPoints){
b881f1fd 472 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 473 AliITStrackV2* tr2 = 0;
474 tr2 = FitTrack(trs,primaryVertex);
475 if(!tr2) continue;
b881f1fd 476 AliDebug(2,Form("---NPOINTS fit: %d\n",tr2->GetNumberOfClusters()));
12b1afb7 477
478 StoreTrack(tr2,event);
479 ntrack++;
480
481 }
482
483 delete trs;
484 }//end loop on clusters of innLay
485 } //end loop on window sizes
486 } //end loop on innLay
487 }else{// Tracking inwards from the outer layers
488 // loop on starting layer for track finding
489 for(Int_t outLay=AliITSgeomTGeo::GetNLayers()-1; outLay>=fInnerStartLayer; outLay--) {
490
4fa7f7d1 491 if(ForceSkippingOfLayer(outLay)) continue;
12b1afb7 492 Int_t minNPoints=iMinNPoints-(AliITSgeomTGeo::GetNLayers()-1-outLay);
493 for(Int_t i=0;i<outLay-1;i++)
4fa7f7d1 494 if(ForceSkippingOfLayer(i))
12b1afb7 495 minNPoints--;
496 if(minNPoints<fMinNPoints) continue;
ebda3140 497
12b1afb7 498 // loop on phi and lambda window size
499 for(Int_t nloop=0;nloop<fNloop;nloop++){
500 Int_t nclOutLay=fCluLayer[outLay]->GetEntries();
501 while(nclOutLay--){
502 ResetForFinding();
503 Bool_t useRP=SetFirstPoint(outLay,nclOutLay,primaryVertex);
504 if(!useRP) continue;
505 AliITStrackSA* trs = new AliITStrackSA();
506
507 Int_t pflag=0;
508 Int_t kk;
509 for(kk=0;kk<AliITSgeomTGeo::GetNLayers();kk++) nClusLay[kk] = 0;
510
511 kk=0;
512 nClusLay[kk] = SearchClusters(outLay,fPhiWin[nloop],fLambdaWin[nloop],
b8ed1a92 513 trs,primaryVertex[2],pflag);
12b1afb7 514 for(Int_t nextLay=outLay-1; nextLay>=0; nextLay--) {
515 kk++;
516 nClusLay[kk] = SearchClusters(nextLay,fPhiWin[nloop],fLambdaWin[nloop],
517 trs,primaryVertex[2],pflag);
518 if(nClusLay[kk]!=0){
519 pflag=1;
520 if(kk==1) {
521 fPoint3[0]=fPointc[0];
522 fPoint3[1]=fPointc[1];
523 } else {
524 UpdatePoints();
525 }
ebda3140 526 }
527 }
ebda3140 528
12b1afb7 529 Int_t layOK=0;
530 for(Int_t nnp=outLay; nnp>=0; nnp--){
531 if(nClusLay[nnp]!=0) layOK+=1;
532 }
533 if(layOK>=minNPoints){
b881f1fd 534 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 535 AliITStrackV2* tr2 = 0;
536 tr2 = FitTrack(trs,primaryVertex);
537 if(!tr2) continue;
b881f1fd 538 AliDebug(2,Form("---NPOINTS fit: %d\n",tr2->GetNumberOfClusters()));
12b1afb7 539
540 StoreTrack(tr2,event);
541 ntrack++;
542
543 }
ebda3140 544
12b1afb7 545 delete trs;
ebda3140 546 }//end loop on clusters of innLay
12b1afb7 547 } //end loop on window sizes
548 } //end loop on innLay
549 } // end if (fInwardFlag)
550 }//end loop on min points
5a03f353 551
8403ece4 552 // search for 1-point tracks in SPD, only for cosmics
5a03f353 553 // (A.Dainese 21.03.08)
554 if(AliITSReconstructor::GetRecoParam()->GetSAOnePointTracks() &&
555 TMath::Abs(event->GetMagneticField())<0.01) {
8403ece4 556 Int_t outerLayer=1; // only SPD
557 for(Int_t innLay=0; innLay<=TMath::Min(1,fOuterStartLayer); innLay++) {
5a03f353 558 // counter for clusters on each layer
deae0246 559
5a03f353 560 for(Int_t nloop=0;nloop<fNloop;nloop++){
561 Int_t nclInnLay=fCluLayer[innLay]->GetEntries();
562 while(nclInnLay--){ //loop starting from layer innLay
563 ResetForFinding();
12b1afb7 564 Bool_t useRP=SetFirstPoint(innLay,nclInnLay,primaryVertex);
565 if(!useRP) continue;
5a03f353 566 AliITStrackSA* trs = new AliITStrackSA();
12b1afb7 567
568 Int_t pflag=0;
5a03f353 569 Int_t kk;
deae0246 570 for(kk=0;kk<AliITSgeomTGeo::GetNLayers();kk++) nClusLay[kk] = 0;
5a03f353 571
572 kk=0;
deae0246 573 nClusLay[kk] = SearchClusters(innLay,fPhiWin[nloop],fLambdaWin[nloop],
5a03f353 574 trs,primaryVertex[2],pflag);
8403ece4 575 for(Int_t nextLay=innLay+1; nextLay<=outerLayer; nextLay++) {
5a03f353 576 kk++;
deae0246 577 nClusLay[kk] = SearchClusters(nextLay,fPhiWin[nloop],fLambdaWin[nloop],
5a03f353 578 trs,primaryVertex[2],pflag);
deae0246 579 if(nClusLay[kk]!=0){
5a03f353 580 pflag=1;
581 if(kk==1) {
582 fPoint3[0]=fPointc[0];
583 fPoint3[1]=fPointc[1];
584 } else {
585 UpdatePoints();
586 }
587 }
588 }
589
590 Int_t layOK=0;
591 for(Int_t nnp=0;nnp<AliITSgeomTGeo::GetNLayers()-innLay;nnp++){
deae0246 592 if(nClusLay[nnp]!=0) layOK+=1;
5a03f353 593 }
594 if(layOK==1) {
b881f1fd 595 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 596 AliITStrackV2* tr2 = 0;
597 Bool_t onePoint = kTRUE;
598 tr2 = FitTrack(trs,primaryVertex,onePoint);
599 if(!tr2) continue;
b881f1fd 600 AliDebug(2,Form("----NPOINTS fit: %d\n",tr2->GetNumberOfClusters()));
5a03f353 601
c421499f 602 StoreTrack(tr2,event);
5a03f353 603 ntrack++;
604
605 }
606
607 delete trs;
608 }//end loop on clusters of innLay
609 } //end loop on window sizes
610
5a03f353 611 } //end loop on innLay
612 } // end search 1-point tracks
ebda3140 613
bef31448 614 Info("FindTracks","Number of found tracks: %d",event->GetNumberOfTracks());
2257f27e 615 return 0;
bef31448 616
617}
7e5bf5af 618
13918578 619//________________________________________________________________________
620
5a03f353 621AliITStrackV2* AliITStrackerSA::FitTrack(AliITStrackSA* tr,Double_t *primaryVertex,Bool_t onePoint) {
ebda3140 622 //fit of the found track (most general case, also <6 points, layers missing)
623 // A.Dainese 16.11.07
13918578 624
13918578 625
deae0246 626 const Int_t kMaxClu=AliITStrackSA::kMaxNumberOfClusters;
13918578 627
deae0246 628 static Int_t firstmod[AliITSgeomTGeo::kNLayers];
629
630 static Int_t clind[AliITSgeomTGeo::kNLayers][kMaxClu];
631 static Int_t clmark[AliITSgeomTGeo::kNLayers][kMaxClu];
deae0246 632 static Int_t end[AliITSgeomTGeo::kNLayers];
633 static AliITSRecPoint *listlayer[AliITSgeomTGeo::kNLayers][kMaxClu];
13918578 634
ebda3140 635 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) {
b8ed1a92 636 firstmod[i]=AliITSgeomTGeo::GetModuleIndex(i+1,1,1);
deae0246 637 end[i]=0;
638 for(Int_t j=0;j<kMaxClu; j++){
ebda3140 639 clind[i][j]=0;
640 clmark[i][j]=0;
deae0246 641 listlayer[i][j]=0;
642 }
b8ed1a92 643 }
2755f080 644
2755f080 645
646 Int_t nclusters = tr->GetNumberOfClustersSA();
2755f080 647 for(Int_t ncl=0;ncl<nclusters;ncl++){
648 Int_t index = tr->GetClusterIndexSA(ncl);
649 AliITSRecPoint* cl = (AliITSRecPoint*)GetCluster(index);
650 if(cl->TestBit(kSAflag)==kTRUE) cl->ResetBit(kSAflag);
651 Int_t lay = (index & 0xf0000000) >> 28;
deae0246 652 Int_t nInLay=end[lay];
653 listlayer[lay][nInLay]=cl;
5691e727 654 clind[lay][nInLay]=index;
deae0246 655 end[lay]++;
2755f080 656 }
2755f080 657
658 for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
659 for(Int_t ncl=0;ncl<tr->GetNumberOfMarked(nlay);ncl++){
660 Int_t mark = tr->GetClusterMark(nlay,ncl);
5691e727 661 clmark[nlay][ncl]=mark;
2755f080 662 }
663 }
664
2755f080 665
666 Int_t firstLay=-1,secondLay=-1;
2755f080 667 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) {
deae0246 668 if(end[i]==0) {
2755f080 669 end[i]=1;
deae0246 670 }else{
2755f080 671 if(firstLay==-1) {
672 firstLay=i;
673 } else if(secondLay==-1) {
674 secondLay=i;
675 }
676 }
677 }
678
deae0246 679 if(firstLay==-1 || (secondLay==-1 && !onePoint)) return 0;
680
2755f080 681 for(Int_t l0=0;l0<end[0];l0++){ //loop on layer 1
deae0246 682 AliITSRecPoint* cl0 = (AliITSRecPoint*)listlayer[0][l0];
2755f080 683 for(Int_t l1=0;l1<end[1];l1++){ //loop on layer 2
deae0246 684 AliITSRecPoint* cl1 = (AliITSRecPoint*)listlayer[1][l1];
2755f080 685 for(Int_t l2=0;l2<end[2];l2++){ //loop on layer 3
deae0246 686 AliITSRecPoint* cl2 = (AliITSRecPoint*)listlayer[2][l2];
2755f080 687 for(Int_t l3=0;l3<end[3];l3++){ //loop on layer 4
deae0246 688 AliITSRecPoint* cl3 = (AliITSRecPoint*)listlayer[3][l3];
2755f080 689 for(Int_t l4=0;l4<end[4];l4++){ //loop on layer 5
deae0246 690 AliITSRecPoint* cl4 = (AliITSRecPoint*)listlayer[4][l4];
2755f080 691 for(Int_t l5=0;l5<end[5];l5++){ //loop on layer 6
deae0246 692 AliITSRecPoint* cl5 = (AliITSRecPoint*)listlayer[5][l5];
2755f080 693
694
695 Double_t x1,y1,z1,sx1,sy1,sz1;
696 Double_t x2,y2,z2,sx2,sy2,sz2;
697 AliITSRecPoint* p1=0;
698 AliITSRecPoint* p2=0;
699 Int_t index1=0,index2=0;
700 Int_t mrk1=0,mrk2=0;
701
702 switch(firstLay) {
703 case 0:
704 p1=cl0;
ebda3140 705 index1=clind[0][l0];mrk1=clmark[0][l0];
2755f080 706 break;
707 case 1:
708 p1=cl1;
ebda3140 709 index1=clind[1][l1];mrk1=clmark[1][l1];
2755f080 710 break;
711 case 2:
712 p1=cl2;
ebda3140 713 index1=clind[2][l2];mrk1=clmark[2][l2];
2755f080 714 break;
715 case 3:
716 p1=cl3;
ebda3140 717 index1=clind[3][l3];mrk1=clmark[3][l3];
2755f080 718 break;
719 case 4:
720 p1=cl4;
ebda3140 721 index1=clind[4][l4];mrk1=clmark[4][l4];
2755f080 722 break;
723 }
724
725 switch(secondLay) {
726 case 1:
727 p2=cl1;
ebda3140 728 index2=clind[1][l1];mrk2=clmark[1][l1];
2755f080 729 break;
730 case 2:
731 p2=cl2;
ebda3140 732 index2=clind[2][l2];mrk2=clmark[2][l2];
2755f080 733 break;
734 case 3:
735 p2=cl3;
ebda3140 736 index2=clind[3][l3];mrk2=clmark[3][l3];
2755f080 737 break;
738 case 4:
739 p2=cl4;
ebda3140 740 index2=clind[4][l4];mrk2=clmark[4][l4];
2755f080 741 break;
742 case 5:
743 p2=cl5;
ebda3140 744 index2=clind[5][l5];mrk2=clmark[5][l5];
2755f080 745 break;
5a03f353 746 default:
747 p2=0;
748 index2=-1;mrk2=-1;
749 break;
2755f080 750 }
751
752 Int_t module1 = p1->GetDetectorIndex()+firstmod[firstLay];
5a03f353 753 Int_t layer,ladder,detector;
754 AliITSgeomTGeo::GetModuleId(module1,layer,ladder,detector);
755 Float_t yclu1 = p1->GetY();
756 Float_t zclu1 = p1->GetZ();
757 Double_t cv=0,tgl2=0,phi2=0;
2755f080 758
759 Int_t cln1=mrk1;
2755f080 760 AliITSclusterTable* arr1 = (AliITSclusterTable*)GetClusterCoord(firstLay,cln1);
2755f080 761 x1 = arr1->GetX();
2755f080 762 y1 = arr1->GetY();
2755f080 763 z1 = arr1->GetZ();
2755f080 764 sx1 = arr1->GetSx();
2755f080 765 sy1 = arr1->GetSy();
2755f080 766 sz1 = arr1->GetSz();
225a692b 767
5a03f353 768 if(secondLay>0) {
769 Int_t cln2=mrk2;
770 AliITSclusterTable* arr2 = (AliITSclusterTable*)GetClusterCoord(secondLay,cln2);
771 x2 = arr2->GetX();
772 y2 = arr2->GetY();
773 z2 = arr2->GetZ();
774 sx2 = arr2->GetSx();
775 sy2 = arr2->GetSy();
776 sz2 = arr2->GetSz();
777 cv = Curvature(primaryVertex[0],primaryVertex[1],x1,y1,x2,y2);
778 tgl2 = (z2-z1)/TMath::Sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
779 phi2 = TMath::ATan2((y2-y1),(x2-x1));
780 } else { // special case of 1-point tracks, only for cosmics (B=0)
781 x2 = primaryVertex[0];
782 y2 = primaryVertex[1];
783 z2 = primaryVertex[2];
784 cv = 0;
785 tgl2 = (z1-z2)/TMath::Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
786 phi2 = TMath::ATan2((y1-y2),(x1-x2));
787 }
788
789
2755f080 790 AliITStrackSA* trac = new AliITStrackSA(layer,ladder,detector,yclu1,zclu1,phi2,tgl2,cv,1);
225a692b 791
792
2755f080 793 if(cl5!=0) {
ebda3140 794 trac->AddClusterV2(5,(clind[5][l5] & 0x0fffffff)>>0);
795 trac->AddClusterMark(5,clmark[5][l5]);
b8ed1a92 796 }
797 if(cl4!=0){
ebda3140 798 trac->AddClusterV2(4,(clind[4][l4] & 0x0fffffff)>>0);
799 trac->AddClusterMark(4,clmark[4][l4]);
b8ed1a92 800 }
801 if(cl3!=0){
ebda3140 802 trac->AddClusterV2(3,(clind[3][l3] & 0x0fffffff)>>0);
803 trac->AddClusterMark(3,clmark[3][l3]);
b8ed1a92 804 }
805 if(cl2!=0){
ebda3140 806 trac->AddClusterV2(2,(clind[2][l2] & 0x0fffffff)>>0);
807 trac->AddClusterMark(2,clmark[2][l2]);
b8ed1a92 808 }
809 if(cl1!=0){
ebda3140 810 trac->AddClusterV2(1,(clind[1][l1] & 0x0fffffff)>>0);
811 trac->AddClusterMark(1,clmark[1][l1]);
b8ed1a92 812 }
813 if(cl0!=0){
ebda3140 814 trac->AddClusterV2(0,(clind[0][l0] & 0x0fffffff)>>0);
815 trac->AddClusterMark(0,clmark[0][l0]);
b8ed1a92 816 }
817
b8ed1a92 818 //fit with Kalman filter using AliITStrackerMI::RefitAt()
819 AliITStrackMI* ot = new AliITStrackSA(*trac);
820
821 ot->ResetCovariance(10.);
822 ot->ResetClusters();
823
b881f1fd 824 // Propagate inside the innermost layer with a cluster
825 if(ot->Propagate(ot->GetX()-0.1*ot->GetX())) {
826
827 if(RefitAt(AliITSRecoParam::GetrInsideITSscreen(),ot,trac)){ //fit from layer 1 to layer 6
828 AliITStrackMI *otrack2 = new AliITStrackMI(*ot);
829 otrack2->ResetCovariance(10.);
830 otrack2->ResetClusters();
831 //fit from layer 6 to layer 1
832 if(RefitAt(AliITSRecoParam::GetrInsideSPD1(),otrack2,ot)) {
833 fListOfTracks->AddLast(otrack2);
834 fListOfSATracks->AddLast(trac);
835 } else {
836 delete otrack2;
837 delete trac;
838 }
b8ed1a92 839
b881f1fd 840 }
841 }
b8ed1a92 842 delete ot;
b8ed1a92 843 }//end loop layer 6
844 }//end loop layer 5
845 }//end loop layer 4
846 }//end loop layer 3
847 }//end loop layer 2
848 }//end loop layer 1
849
b8ed1a92 850
225a692b 851
b8ed1a92 852
deae0246 853 if(fListOfTracks->GetEntries()==0) return 0;
b8ed1a92 854
deae0246 855 Int_t lowchi2 = FindTrackLowChiSquare();
b8ed1a92 856 AliITStrackV2* otrack =(AliITStrackV2*)fListOfTracks->At(lowchi2);
deae0246 857 AliITStrackSA* trsa = (AliITStrackSA*)fListOfSATracks->At(lowchi2);
b8ed1a92 858
deae0246 859 if(otrack==0) return 0;
860
861 Int_t indexc[AliITSgeomTGeo::kNLayers];
b8ed1a92 862 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) indexc[i]=0;
863 for(Int_t nind=0;nind<otrack->GetNumberOfClusters();nind++){
864 indexc[nind] = otrack->GetClusterIndex(nind);
865 }
866 Int_t labl[6][3];
867 for(Int_t i=0;i<AliITSgeomTGeo::GetNLayers();i++) {
868 if(i<otrack->GetNumberOfClusters()) {
869 AliITSRecPoint* cl = (AliITSRecPoint*)GetCluster(indexc[i]);
870 labl[i][0]=cl->GetLabel(0);
871 labl[i][1]=cl->GetLabel(1);
872 labl[i][2]=cl->GetLabel(2);
873 } else {
874 labl[i][0]=-1;
875 labl[i][1]=-1;
876 labl[i][2]=-1;
877 }
878 }
2755f080 879
b8ed1a92 880 CookLabel(otrack,0.); //MI change - to see fake ratio
881
882 Int_t label=FindLabel(labl[0][0],labl[1][0],labl[2][0],labl[3][0],labl[4][0],labl[5][0]);
883 Int_t lflag=0;
2755f080 884 for(Int_t i=0;i<otrack->GetNumberOfClusters();i++)
b8ed1a92 885 if(labl[i][0]==label || labl[i][1]==label || labl[i][2]==label) lflag++;
886
2755f080 887 if(lflag<otrack->GetNumberOfClusters()) label = -label;
b8ed1a92 888 otrack->SetLabel(label);
889
890 //remove clusters of found track
891 for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
892 for(Int_t cln=0;cln<trsa->GetNumberOfMarked(nlay);cln++){
893 Int_t index = trsa->GetClusterMark(nlay,cln);
894 fCluLayer[nlay]->RemoveAt(index);
895 RemoveClusterCoord(nlay,index);
896 fCluLayer[nlay]->Compress();
7e5bf5af 897 }
898 }
7e5bf5af 899
13918578 900 return otrack;
901
902}
903
c421499f 904//_______________________________________________________
905void AliITStrackerSA::StoreTrack(AliITStrackV2 *t,AliESDEvent *event) const
906{
907 //
908 // Add new track to the ESD
909 //
910 AliESDtrack outtrack;
911 outtrack.UpdateTrackParams(t,AliESDtrack::kITSin);
912 for(Int_t i=0;i<12;i++) {
913 outtrack.SetITSModuleIndex(i,t->GetModuleIndex(i));
914 }
09cf9d66 915 Double_t sdedx[4]={0.,0.,0.,0.};
916 for(Int_t i=0; i<4; i++) sdedx[i]=t->GetSampledEdx(i);
917 outtrack.SetITSdEdxSamples(sdedx);
c421499f 918 event->AddTrack(&outtrack);
919
920 return;
921}
bef31448 922
4e05ab9a 923
bef31448 924//_______________________________________________________
7e5bf5af 925Int_t AliITStrackerSA::SearchClusters(Int_t layer,Double_t phiwindow,Double_t lambdawindow, AliITStrackSA* trs,Double_t /*zvertex*/,Int_t pflag){
13918578 926 //function used to to find the clusters associated to the track
2755f080 927
4fa7f7d1 928 if(ForceSkippingOfLayer(layer)) return 0;
2755f080 929
13918578 930 Int_t nc=0;
931 AliITSlayer &lay = fgLayers[layer];
7e5bf5af 932 Double_t r=lay.GetR();
2755f080 933 if(pflag==1){
cfe729e0 934 Float_t cx1,cx2,cy1,cy2;
935 FindEquation(fPoint1[0],fPoint1[1],fPoint2[0],fPoint2[1],fPoint3[0],fPoint3[1],fCoef1,fCoef2,fCoef3);
936 if (FindIntersection(fCoef1,fCoef2,fCoef3,-r*r,cx1,cy1,cx2,cy2)==0)
937 return 0;
1966f03c 938 Double_t fi1=TMath::ATan2(cy1-fPoint1[1],cx1-fPoint1[0]);
939 Double_t fi2=TMath::ATan2(cy2-fPoint1[1],cx2-fPoint1[0]);
cfe729e0 940 fPhiEstimate=ChoosePoint(fi1,fi2,fPhic);
941 }
13918578 942
7e5bf5af 943
944 Int_t ncl = fCluLayer[layer]->GetEntries();
945 for (Int_t index=0; index<ncl; index++) {
00a7cc50 946 AliITSRecPoint *c = (AliITSRecPoint*)fCluLayer[layer]->At(index);
7e5bf5af 947 if (!c) continue;
948 if (c->GetQ()<=0) continue;
3733ccd2 949 if(layer>1 && c->GetQ()<=fMinQ) continue;
7e5bf5af 950
951 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(layer,index);
952 Double_t phi = arr->GetPhi();
cfe729e0 953 if (TMath::Abs(phi-fPhiEstimate)>phiwindow) continue;
494fda7c 954
7e5bf5af 955 Double_t lambda = arr->GetLambda();
cfe729e0 956 if (TMath::Abs(lambda-fLambdac)>lambdawindow) continue;
957
7e5bf5af 958 if(trs->GetNumberOfClustersSA()==trs->GetMaxNumberOfClusters()) return 0;
959 if(trs->GetNumberOfMarked(layer)==trs->GetMaxNMarkedPerLayer()) return 0;
960 Int_t orind = arr->GetOrInd();
961 trs->AddClusterSA(layer,orind);
962 trs->AddClusterMark(layer,index);
963
cfe729e0 964 nc++;
965 fLambdac=lambda;
966 fPhiEstimate=phi;
cfe729e0 967
7e5bf5af 968 fPointc[0]=arr->GetX();
969 fPointc[1]=arr->GetY();
970
cfe729e0 971 }
972 return nc;
973}
13918578 974
12b1afb7 975//________________________________________________________________
976Bool_t AliITStrackerSA::SetFirstPoint(Int_t lay, Int_t clu, Double_t* primaryVertex){
977 // Sets the first point (seed) for tracking
978
979 AliITSRecPoint* cl = (AliITSRecPoint*)fCluLayer[lay]->At(clu);
980 if(!cl) return kFALSE;
981 if (cl->GetQ()<=0) return kFALSE;
982 if(lay>1 && cl->GetQ()<=fMinQ) return kFALSE;
983
984 AliITSclusterTable* arr = (AliITSclusterTable*)GetClusterCoord(lay,clu);
985 fPhic = arr->GetPhi();
986 fLambdac = arr->GetLambda();
987 fPhiEstimate = fPhic;
988 fPoint1[0]=primaryVertex[0];
989 fPoint1[1]=primaryVertex[1];
990 fPoint2[0]=arr->GetX();
991 fPoint2[1]=arr->GetY();
992 return kTRUE;
993}
994
bef31448 995//________________________________________________________________
996void AliITStrackerSA::UpdatePoints(){
997 //update of points for the estimation of the curvature
13918578 998
bef31448 999 fPoint2[0]=fPoint3[0];
1000 fPoint2[1]=fPoint3[1];
1001 fPoint3[0]=fPointc[0];
1002 fPoint3[1]=fPointc[1];
13918578 1003
1004
13918578 1005}
13918578 1006
13918578 1007//___________________________________________________________________
1008Int_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){
1009
1010 //given (x,y) of three recpoints (in global coordinates)
1011 //returns the parameters a,b,c of circonference x*x + y*y +a*x + b*y +c
1012
1013 Float_t den = (x3-x1)*(y2-y1)-(x2-x1)*(y3-y1);
1014 if(den==0) return 0;
1015 a = ((y3-y1)*(x2*x2+y2*y2-x1*x1-y1*y1)-(y2-y1)*(x3*x3+y3*y3-x1*x1-y1*y1))/den;
1016 b = -(x2*x2-x1*x1+y2*y2-y1*y1+a*(x2-x1))/(y2-y1);
1017 c = -x1*x1-y1*y1-a*x1-b*y1;
1018 return 1;
1019 }
1020//__________________________________________________________________________
1021 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){
1022
1023 //Finds the intersection between the circonference of the track and the circonference centered in (0,0) represented by one layer
1024 //c2 is -rlayer*rlayer
1025
1026 if(a1==0) return 0;
3a2f227d 1027 Double_t m = c2-c1;
1028 Double_t aA = (b1*b1)/(a1*a1)+1;
1029 Double_t bB = (-2*m*b1/(a1*a1));
1030 Double_t cC = c2+(m*m)/(a1*a1);
1031 Double_t dD = bB*bB-4*aA*cC;
1032 if(dD<0) return 0;
13918578 1033
3a2f227d 1034 y1 = (-bB+TMath::Sqrt(dD))/(2*aA);
1035 y2 = (-bB-TMath::Sqrt(dD))/(2*aA);
13918578 1036 x1 = (c2-c1-b1*y1)/a1;
1037 x2 = (c2-c1-b1*y2)/a1;
1038
1039 return 1;
1040}
1041//____________________________________________________________________
1042Double_t AliITStrackerSA::Curvature(Double_t x1,Double_t y1,Double_t
1043x2,Double_t y2,Double_t x3,Double_t y3){
1044
1045 //calculates the curvature of track
1046 Double_t den = (x3-x1)*(y2-y1)-(x2-x1)*(y3-y1);
1047 if(den==0) return 0;
1048 Double_t a = ((y3-y1)*(x2*x2+y2*y2-x1*x1-y1*y1)-(y2-y1)*(x3*x3+y3*y3-x1*x1-y1*y1))/den;
1049 Double_t b = -(x2*x2-x1*x1+y2*y2-y1*y1+a*(x2-x1))/(y2-y1);
1050 Double_t c = -x1*x1-y1*y1-a*x1-b*y1;
1051 Double_t xc=-a/2.;
1052
1053 if((a*a+b*b-4*c)<0) return 0;
1054 Double_t rad = TMath::Sqrt(a*a+b*b-4*c)/2.;
1055 if(rad==0) return 0;
1056
1057 if((x1>0 && y1>0 && x1<xc)) rad*=-1;
1058 if((x1<0 && y1>0 && x1<xc)) rad*=-1;
1059 // if((x1<0 && y1<0 && x1<xc)) rad*=-1;
1060 // if((x1>0 && y1<0 && x1<xc)) rad*=-1;
1061
1062 return 1/rad;
1063
1064}
7e5bf5af 1065
1066
13918578 1067//____________________________________________________________________
1068Double_t AliITStrackerSA::ChoosePoint(Double_t p1, Double_t p2, Double_t pp){
1069
1070 //Returns the point closest to pp
1071
1072 Double_t diff1 = p1-pp;
1073 Double_t diff2 = p2-pp;
1074
1075 if(TMath::Abs(diff1)<TMath::Abs(diff2)) fPhiEstimate=p1;
1076 else fPhiEstimate=p2;
1077 return fPhiEstimate;
1078
1079}
1080
1081
1082//_________________________________________________________________
deae0246 1083Int_t AliITStrackerSA::FindTrackLowChiSquare() const {
1084 // returns track with lowest chi square
1085 Int_t dim=fListOfTracks->GetEntries();
1086 if(dim<=1) return 0;
1087 AliITStrackV2* trk = (AliITStrackV2*)fListOfTracks->At(0);
1088 Double_t minChi2=trk->GetChi2();
1089 Int_t index=0;
1090 for(Int_t i=1;i<dim;i++){
4adcf390 1091 trk = (AliITStrackV2*)fListOfTracks->At(i);
deae0246 1092 Double_t chi2=trk->GetChi2();
1093 if(chi2<minChi2){
1094 minChi2=chi2;
1095 index=i;
13918578 1096 }
13918578 1097 }
deae0246 1098 return index;
13918578 1099}
1100
1101//__________________________________________________________
2755f080 1102Int_t AliITStrackerSA::FindLabel(Int_t l0, Int_t l1, Int_t l2, Int_t l3, Int_t l4, Int_t l5){
13918578 1103
1104 //function used to determine the track label
1105
2755f080 1106 Int_t lb[6] = {l0,l1,l2,l3,l4,l5};
13918578 1107 Int_t aa[6]={1,1,1,1,1,1};
1108 Int_t ff=0;
1109 Int_t ll=0;
1110 Int_t k=0;Int_t w=0;Int_t num=6;
8b3779ef 1111 for(Int_t i=5;i>=0;i--) if(lb[i]==-1) num=i;
13918578 1112
1113 while(k<num){
1114
1115 for(Int_t i=k+1;i<num;i++){
1116
1117 if(lb[k]==lb[i] && aa[k]!=0){
1118
1119 aa[k]+=1;
1120 aa[i]=0;
1121 }
1122 }
8b3779ef 1123 k++;
13918578 1124 }
1125
1126 while(w<num){
8b3779ef 1127
13918578 1128 for(Int_t j=0;j<6;j++){
1129 if(aa[w]<aa[j]){
1130 ff=aa[w];
1131 aa[w]=aa[j];
1132 aa[j]=ff;
1133 ll=lb[w];
1134 lb[w]=lb[j];
1135 lb[j]=ll;
1136 }
1137 }
8b3779ef 1138 w++;
13918578 1139 }
8b3779ef 1140
1141 if(num<1) return -1;
1142 return lb[num-1];
13918578 1143}
1144
1145//_____________________________________________________________________________
1146Int_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 1147Int_t gl12, Int_t gl13, Int_t gl14,Int_t gl15, Int_t gl16, Int_t gl17, Int_t gl18, Int_t minNPoints){
13918578 1148
1149
1150 //function used to assign label to the found track. If track is fake, the label is negative
1151
1152 Int_t lb0[6] = {gl1,gl2,gl3,gl4,gl5,gl6};
1153 Int_t lb1[6] = {gl7,gl8,gl9,gl10,gl11,gl12};
1154 Int_t lb2[6] = {gl13,gl14,gl15,gl16,gl17,gl18};
1155 Int_t ll=FindLabel(lb0[0],lb0[1],lb0[2],lb0[3],lb0[4],lb0[5]);
1156 Int_t lflag=0;Int_t num=6;
1157 if(lb0[5]==-1 && lb1[5]==-1 && lb2[5]==-1) num=5;
1158
1159 for(Int_t i=0;i<num;i++){
1160 if(lb0[i]==ll || lb1[i]==ll || lb2[i]==ll) lflag+=1;
1161 }
1162
2755f080 1163 if(lflag>=minNPoints) return ll;
13918578 1164 else return -ll;
1165
1166
1167}
13918578 1168//_____________________________________________________________________________
5b4dedce 1169void AliITStrackerSA::SetCalculatedWindowSizes(Int_t n, Float_t phimin, Float_t phimax, Float_t lambdamin, Float_t lambdamax){
1170 // Set sizes of the phi and lambda windows used for track finding
1171 fNloop = n;
1172 if(fPhiWin) delete [] fPhiWin;
1173 if(fLambdaWin) delete [] fLambdaWin;
1174 fPhiWin = new Double_t[fNloop];
1175 fLambdaWin = new Double_t[fNloop];
1176 Float_t stepPhi=(phimax-phimin)/(Float_t)(fNloop-1);
1177 Float_t stepLambda=(lambdamax-lambdamin)/(Float_t)(fNloop-1);
1178 for(Int_t k=0;k<fNloop;k++){
1179 Float_t phi=phimin+k*stepPhi;
1180 Float_t lam=lambdamin+k*stepLambda;
1181 fPhiWin[k]=phi;
1182 fLambdaWin[k]=lam;
1183 }
1184}
1185//_____________________________________________________________________________
1186void AliITStrackerSA::SetFixedWindowSizes(Int_t n, Double_t *phi, Double_t *lam){
13918578 1187 // Set sizes of the phi and lambda windows used for track finding
1188 fNloop = n;
1189 if(phi){ // user defined values
1190 fPhiWin = new Double_t[fNloop];
1191 fLambdaWin = new Double_t[fNloop];
1192 for(Int_t k=0;k<fNloop;k++){
1193 fPhiWin[k]=phi[k];
1194 fLambdaWin[k]=lam[k];
1195 }
1196 }
1197 else { // default values
627b6db6 1198
1199 Double_t phid[33] = {0.002,0.003,0.004,0.0045,0.0047,
bef31448 1200 0.005,0.0053,0.0055,
1201 0.006,0.0063,0.0065,0.007,0.0073,0.0075,0.0077,
1202 0.008,0.0083,0.0085,0.0087,0.009,0.0095,0.0097,
627b6db6 1203 0.01,0.0105,0.011,0.0115,0.012,0.0125,0.013,0.0135,0.0140,0.0145};
1204 Double_t lambdad[33] = {0.003,0.004,0.005,0.005,0.005,
1205 0.005,0.005,0.006,
1206 0.006,0.006,0.006,0.007,0.007,0.007,0.007,
1207 0.007,0.007,0.007,0.007,0.007,0.007,0.007,
1208 0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008,0.008};
bef31448 1209
627b6db6 1210 if(fNloop!=33){
1211 fNloop = 33;
13918578 1212 }
627b6db6 1213
1214
13918578 1215 fPhiWin = new Double_t[fNloop];
1216 fLambdaWin = new Double_t[fNloop];
e340bb86 1217
e340bb86 1218 Double_t factor=AliITSReconstructor::GetRecoParam()->GetFactorSAWindowSizes(); // possibility to enlarge windows for cosmics reco with large misalignments (A.Dainese)
2755f080 1219
1220 for(Int_t k=0;k<fNloop;k++){
e340bb86 1221 fPhiWin[k]=phid[k]*factor;
1222 fLambdaWin[k]=lambdad[k]*factor;
13918578 1223 }
1224
1225 }
1226
1227}
7e5bf5af 1228//_______________________________________________________________________
cc088660 1229void AliITStrackerSA::GetCoorAngles(AliITSRecPoint* cl,Double_t &phi,Double_t &lambda, Float_t &x, Float_t &y,Float_t &z,Double_t* vertex){
7e5bf5af 1230 //Returns values of phi (azimuthal) and lambda angles for a given cluster
cc088660 1231/*
7e5bf5af 1232 Double_t rot[9]; fGeom->GetRotMatrix(module,rot);
1233 Int_t lay,lad,det; fGeom->GetModuleId(module,lay,lad,det);
1234 Float_t tx,ty,tz; fGeom->GetTrans(lay,lad,det,tx,ty,tz);
1235
1236 Double_t alpha=TMath::ATan2(rot[1],rot[0])+TMath::Pi();
1237 Double_t phi1=TMath::Pi()/2+alpha;
1238 if (lay==1) phi1+=TMath::Pi();
1239
1240 Float_t cp=TMath::Cos(phi1), sp=TMath::Sin(phi1);
1241 Float_t r=tx*cp+ty*sp;
1242
cc088660 1243 xyz= r*cp - cl->GetY()*sp;
7e5bf5af 1244 y= r*sp + cl->GetY()*cp;
1245 z=cl->GetZ();
cc088660 1246*/
1247 Float_t xyz[3];
1248 cl->GetGlobalXYZ(xyz);
1249 x=xyz[0];
1250 y=xyz[1];
1251 z=xyz[2];
1252
1966f03c 1253 phi=TMath::ATan2(y-vertex[1],x-vertex[0]);
7e5bf5af 1254 lambda=TMath::ATan2(z-vertex[2],TMath::Sqrt((x-vertex[0])*(x-vertex[0])+(y-vertex[1])*(y-vertex[1])));
1255}
13918578 1256
7e5bf5af 1257//________________________________________________________________________
cc088660 1258void AliITStrackerSA::GetCoorErrors(AliITSRecPoint* cl,Float_t &sx,Float_t &sy, Float_t &sz){
7e5bf5af 1259
cc088660 1260 //returns sigmax, y, z of cluster in global coordinates
1261/*
7e5bf5af 1262 Double_t rot[9]; fGeom->GetRotMatrix(module,rot);
cc088660 1263 Int_t lay,lad,det;
1264 AliITSgeomTGeo::GetModuleId(module,lay,lad,det);
7e5bf5af 1265
1266 Double_t alpha=TMath::ATan2(rot[1],rot[0])+TMath::Pi();
1267 Double_t phi=TMath::Pi()/2+alpha;
1268 if (lay==1) phi+=TMath::Pi();
1269
1270 Float_t cp=TMath::Cos(phi), sp=TMath::Sin(phi);
cc088660 1271*/
1272 Float_t covm[6];
1273 cl->GetGlobalCov(covm);
1274 sx=TMath::Sqrt(covm[0]);
1275 sy=TMath::Sqrt(covm[3]);
1276 sz=TMath::Sqrt(covm[5]);
1277/*
7e5bf5af 1278 sx = TMath::Sqrt(sp*sp*cl->GetSigmaY2());
1279 sy = TMath::Sqrt(cp*cp*cl->GetSigmaY2());
1280 sz = TMath::Sqrt(cl->GetSigmaZ2());
cc088660 1281*/
7e5bf5af 1282}