ROOT logo
#ifndef ALIITSTRACKERV2_H
#define ALIITSTRACKERV2_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

//-------------------------------------------------------------------------
//                          ITS tracker
//     reads AliITSRecPoint clusters and creates AliITStrackV2 tracks
//           Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch 
//-------------------------------------------------------------------------
#include "AliTracker.h"
#include "AliITSRecoParam.h"
#include "AliITStrackV2.h"
#include "AliITSgeomTGeo.h"


class AliITSRecPoint;
class AliESDEvent;
class TTree;


//-------------------------------------------------------------------------
class AliITStrackerV2 : public AliTracker {
public:
  AliITStrackerV2();
  AliITStrackerV2(const Char_t *geom);
  ~AliITStrackerV2(){}
  AliCluster *GetCluster(Int_t index) const;
  AliITSRecPoint *GetCluster(Int_t l, Int_t c) const {
    return fgLayers[l].GetCluster(c);
  }
  Int_t GetNumberOfClustersLayer(Int_t n) const {
     return fgLayers[n].GetNumberOfClusters();
  }   
  Int_t LoadClusters(TTree *cf);
  void UnloadClusters();
  Int_t Clusters2Tracks(AliESDEvent *event);
  Int_t PropagateBack(AliESDEvent *event);
  Int_t RefitInward(AliESDEvent *event);
  Bool_t RefitAt(Double_t x, AliITStrackV2 *seed, 
                 const AliITStrackV2 *t, Bool_t extra=kFALSE);
  void SetupFirstPass(Int_t *flags, Double_t *cuts=0);
  void SetupSecondPass(Int_t *flags, Double_t *cuts=0);

  void SetLastLayerToTrackTo(Int_t l=0) {fLastLayerToTrackTo=l;} 
  void SetLayersNotToSkip(Int_t *l);

  void UseClusters(const AliKalmanTrack *t, Int_t from=0) const;

  class AliITSdetector {
  public:
    AliITSdetector():fR(0.),fPhi(0.){}
    AliITSdetector(Double_t r,Double_t phi):fR(r),fPhi(phi){}
    Double_t GetR()   const {return fR;}
    Double_t GetPhi() const {return fPhi;}
  private:
    Double_t fR;    // polar coordinates 
    Double_t fPhi;  // of this detector
  };

  class AliITSlayer {
  public:
    enum {kNsector=5, kMaxClusterPerSector=AliITSRecoParam::kMaxClusterPerLayer/kNsector};
    AliITSlayer();
    AliITSlayer(Double_t r, Double_t p, Double_t z, Int_t nl, Int_t nd);
   ~AliITSlayer();
    Int_t InsertCluster(AliITSRecPoint *c);
    void ResetClusters();
    Int_t SelectClusters(Float_t zmi, Float_t zma, Float_t ymi, Float_t yma);
    const AliITSRecPoint *GetNextCluster(Int_t &ci);
    void ResetRoad();
    Double_t GetRoad() const {return fRoad;}
    Double_t GetR() const {return fR;}
    AliITSRecPoint *GetCluster(Int_t i) const { return fClusters[i]; } 
    AliITSdetector &GetDetector(Int_t n) const { return fDetectors[n]; }
    Int_t FindDetectorIndex(Double_t phi, Double_t z) const;
    Double_t GetThickness(Double_t y, Double_t z, Double_t &x0) const;
    Int_t GetNladders() const {return fNladders;}
    Int_t GetNdetectors() const {return fNdetectors;}
    Int_t GetNumberOfClusters() const;
  protected:
    AliITSlayer(const AliITSlayer&);
    AliITSlayer &operator=(const AliITSlayer &tr);  
    Double_t fR;                // mean radius of this layer
    Double_t fPhiOffset;        // offset of the first detector in Phi
    Int_t fNladders;            // number of ladders
    Double_t fZOffset;          // offset of the first detector in Z
    Int_t fNdetectors;          // detectors/ladder
    AliITSdetector *fDetectors; // array of detectors

    AliITSRecPoint *fClusters[AliITSRecoParam::kMaxClusterPerLayer]; // pointers to clusters
    Int_t fN[kNsector];         // numbers of clusters sector by sector 

    Int_t fIndex[AliITSRecoParam::kMaxClusterPerLayer]; // indexes of selected clusters 
    Int_t fNsel;                       // number of selected clusters

    Double_t fRoad;     // road defined by the cluster density
    Int_t FindClusterIndex(Float_t z, Int_t s) const;
  };

protected:
  AliITStrackerV2(const AliITStrackerV2&);
  void CookLabel(AliKalmanTrack *t,Float_t wrong) const;
  Double_t GetEffectiveThickness(Double_t y, Double_t z) const;
  void  FollowProlongation();
  Int_t TakeNextProlongation();
  void ResetBestTrack() {
     fBestTrack.~AliITStrackV2();
     new(&fBestTrack) AliITStrackV2(fTrackToFollow);
  }
  void ResetTrackToFollow(const AliITStrackV2 &t) {
     fTrackToFollow.~AliITStrackV2();
     new(&fTrackToFollow) AliITStrackV2(t);
  }
  Int_t fI;                              // index of the current layer
  static AliITSlayer fgLayers[AliITSgeomTGeo::kNLayers];// ITS layers
  AliITStrackV2 fTracks[AliITSgeomTGeo::kNLayers];      // track estimations at the ITS layers
  AliITStrackV2 fBestTrack;              // "best" track 
  AliITStrackV2 fTrackToFollow;          // followed track
  Int_t fPass;                           // current pass through the data 
  Int_t fConstraint[2];                  // constraint flags

  Int_t fLayersNotToSkip[AliITSgeomTGeo::kNLayers];     // layer masks
  Int_t fLastLayerToTrackTo;             // the innermost layer to track to

private:
  AliITStrackerV2 &operator=(const AliITStrackerV2 &tr);  
  ClassDef(AliITStrackerV2,1)   //ITS tracker V2
};


inline void AliITStrackerV2::SetupFirstPass(Int_t *flags, Double_t *cuts) {
  // This function sets up flags and cuts for the first tracking pass   
  //
  //   flags[0] - vertex constaint flag                                
  //              negative means "skip the pass"                        
  //              0        means "no constraint"                        
  //              positive means "normal constraint"                    

   fConstraint[0]=flags[0];
   if (cuts==0) return;
}

inline void AliITStrackerV2::SetupSecondPass(Int_t *flags, Double_t *cuts) {
  // This function sets up flags and cuts for the second tracking pass   
  //
  //   flags[0] - vertex constaint flag                                
  //              negative means "skip the pass"                        
  //              0        means "no constraint"                        
  //              positive means "normal constraint"                    

   fConstraint[1]=flags[0];
   if (cuts==0) return;
}

inline void AliITStrackerV2::CookLabel(AliKalmanTrack *t,Float_t wrong) const {
  //--------------------------------------------------------------------
  //This function "cooks" a track label. If label<0, this track is fake.
  //--------------------------------------------------------------------
   Int_t tpcLabel=t->GetLabel();
   if (tpcLabel<0) return;
   AliTracker::CookLabel(t,wrong);
   if (tpcLabel != t->GetLabel()) t->SetLabel(-tpcLabel); 
}

#endif
 AliITStrackerV2.h:1
 AliITStrackerV2.h:2
 AliITStrackerV2.h:3
 AliITStrackerV2.h:4
 AliITStrackerV2.h:5
 AliITStrackerV2.h:6
 AliITStrackerV2.h:7
 AliITStrackerV2.h:8
 AliITStrackerV2.h:9
 AliITStrackerV2.h:10
 AliITStrackerV2.h:11
 AliITStrackerV2.h:12
 AliITStrackerV2.h:13
 AliITStrackerV2.h:14
 AliITStrackerV2.h:15
 AliITStrackerV2.h:16
 AliITStrackerV2.h:17
 AliITStrackerV2.h:18
 AliITStrackerV2.h:19
 AliITStrackerV2.h:20
 AliITStrackerV2.h:21
 AliITStrackerV2.h:22
 AliITStrackerV2.h:23
 AliITStrackerV2.h:24
 AliITStrackerV2.h:25
 AliITStrackerV2.h:26
 AliITStrackerV2.h:27
 AliITStrackerV2.h:28
 AliITStrackerV2.h:29
 AliITStrackerV2.h:30
 AliITStrackerV2.h:31
 AliITStrackerV2.h:32
 AliITStrackerV2.h:33
 AliITStrackerV2.h:34
 AliITStrackerV2.h:35
 AliITStrackerV2.h:36
 AliITStrackerV2.h:37
 AliITStrackerV2.h:38
 AliITStrackerV2.h:39
 AliITStrackerV2.h:40
 AliITStrackerV2.h:41
 AliITStrackerV2.h:42
 AliITStrackerV2.h:43
 AliITStrackerV2.h:44
 AliITStrackerV2.h:45
 AliITStrackerV2.h:46
 AliITStrackerV2.h:47
 AliITStrackerV2.h:48
 AliITStrackerV2.h:49
 AliITStrackerV2.h:50
 AliITStrackerV2.h:51
 AliITStrackerV2.h:52
 AliITStrackerV2.h:53
 AliITStrackerV2.h:54
 AliITStrackerV2.h:55
 AliITStrackerV2.h:56
 AliITStrackerV2.h:57
 AliITStrackerV2.h:58
 AliITStrackerV2.h:59
 AliITStrackerV2.h:60
 AliITStrackerV2.h:61
 AliITStrackerV2.h:62
 AliITStrackerV2.h:63
 AliITStrackerV2.h:64
 AliITStrackerV2.h:65
 AliITStrackerV2.h:66
 AliITStrackerV2.h:67
 AliITStrackerV2.h:68
 AliITStrackerV2.h:69
 AliITStrackerV2.h:70
 AliITStrackerV2.h:71
 AliITStrackerV2.h:72
 AliITStrackerV2.h:73
 AliITStrackerV2.h:74
 AliITStrackerV2.h:75
 AliITStrackerV2.h:76
 AliITStrackerV2.h:77
 AliITStrackerV2.h:78
 AliITStrackerV2.h:79
 AliITStrackerV2.h:80
 AliITStrackerV2.h:81
 AliITStrackerV2.h:82
 AliITStrackerV2.h:83
 AliITStrackerV2.h:84
 AliITStrackerV2.h:85
 AliITStrackerV2.h:86
 AliITStrackerV2.h:87
 AliITStrackerV2.h:88
 AliITStrackerV2.h:89
 AliITStrackerV2.h:90
 AliITStrackerV2.h:91
 AliITStrackerV2.h:92
 AliITStrackerV2.h:93
 AliITStrackerV2.h:94
 AliITStrackerV2.h:95
 AliITStrackerV2.h:96
 AliITStrackerV2.h:97
 AliITStrackerV2.h:98
 AliITStrackerV2.h:99
 AliITStrackerV2.h:100
 AliITStrackerV2.h:101
 AliITStrackerV2.h:102
 AliITStrackerV2.h:103
 AliITStrackerV2.h:104
 AliITStrackerV2.h:105
 AliITStrackerV2.h:106
 AliITStrackerV2.h:107
 AliITStrackerV2.h:108
 AliITStrackerV2.h:109
 AliITStrackerV2.h:110
 AliITStrackerV2.h:111
 AliITStrackerV2.h:112
 AliITStrackerV2.h:113
 AliITStrackerV2.h:114
 AliITStrackerV2.h:115
 AliITStrackerV2.h:116
 AliITStrackerV2.h:117
 AliITStrackerV2.h:118
 AliITStrackerV2.h:119
 AliITStrackerV2.h:120
 AliITStrackerV2.h:121
 AliITStrackerV2.h:122
 AliITStrackerV2.h:123
 AliITStrackerV2.h:124
 AliITStrackerV2.h:125
 AliITStrackerV2.h:126
 AliITStrackerV2.h:127
 AliITStrackerV2.h:128
 AliITStrackerV2.h:129
 AliITStrackerV2.h:130
 AliITStrackerV2.h:131
 AliITStrackerV2.h:132
 AliITStrackerV2.h:133
 AliITStrackerV2.h:134
 AliITStrackerV2.h:135
 AliITStrackerV2.h:136
 AliITStrackerV2.h:137
 AliITStrackerV2.h:138
 AliITStrackerV2.h:139
 AliITStrackerV2.h:140
 AliITStrackerV2.h:141
 AliITStrackerV2.h:142
 AliITStrackerV2.h:143
 AliITStrackerV2.h:144
 AliITStrackerV2.h:145
 AliITStrackerV2.h:146
 AliITStrackerV2.h:147
 AliITStrackerV2.h:148
 AliITStrackerV2.h:149
 AliITStrackerV2.h:150
 AliITStrackerV2.h:151
 AliITStrackerV2.h:152
 AliITStrackerV2.h:153
 AliITStrackerV2.h:154
 AliITStrackerV2.h:155
 AliITStrackerV2.h:156
 AliITStrackerV2.h:157
 AliITStrackerV2.h:158
 AliITStrackerV2.h:159
 AliITStrackerV2.h:160
 AliITStrackerV2.h:161
 AliITStrackerV2.h:162
 AliITStrackerV2.h:163
 AliITStrackerV2.h:164
 AliITStrackerV2.h:165
 AliITStrackerV2.h:166