ROOT logo
#ifndef ALIITSUTRACKERCooked_H
#define ALIITSUTRACKERCooked_H

//-------------------------------------------------------------------------
//                   The stand-alone ITSU tracker
//    The pattern recongintion based on the "cooked covariance" approach
//-------------------------------------------------------------------------

#include "AliITSUTrackerGlo.h"

class TTree;
class TClonesArray;
class TObjArray;

class AliESDEvent;
class AliCluster;
class AliITSUClusterPix;
class AliITSUTrackCooked;
class AliITSUReconstructor;

//-------------------------------------------------------------------------
class AliITSUTrackerCooked : public AliITSUTrackerGlo {
public:
  enum {
     kNLayers=7, kMaxClusterPerLayer=150000, kMaxSelected=kMaxClusterPerLayer/10
  };
  AliITSUTrackerCooked(AliITSUReconstructor *rec);
  virtual ~AliITSUTrackerCooked();

  // These functions must be implemented 
  Int_t Clusters2Tracks(AliESDEvent *event);
  Int_t PropagateBack(AliESDEvent *event);
  Int_t RefitInward(AliESDEvent *event);
  Int_t LoadClusters(TTree *ct);
  void UnloadClusters();
  Bool_t 
  RefitAt(Double_t x, AliITSUTrackCooked *seed, const AliITSUTrackCooked *t);

  AliCluster *GetCluster(Int_t index) const;

  void SetSAonly(Bool_t sa=kTRUE) {fSAonly=sa;}
  Bool_t GetSAonly() const {return fSAonly;}

  // internal helper classes
  class AliITSUlayer;

protected:
  AliITSUTrackerCooked(const AliITSUTrackerCooked&);
  // Other protected functions
  Int_t MakeSeeds();
  Bool_t AddCookedSeed(const Float_t r1[3], Int_t l1, Int_t i1,
                       const Float_t r2[3], Int_t l2, Int_t i2,
                       const AliCluster *c3,Int_t l3, Int_t i3);
  void  FollowProlongation();
  Int_t TakeNextProlongation();
  void ResetTrackToFollow(const AliITSUTrackCooked &t);
  void ResetBestTrack();

private:
  AliITSUTrackerCooked &operator=(const AliITSUTrackerCooked &tr);

  // Data members
  // Internal tracker arrays, layers, modules, etc
  static AliITSUlayer fgLayers[kNLayers];// Layers
    
  TObjArray *fSeeds; // Track seeds

  Int_t fI;                              // index of the current layer
  AliITSUTrackCooked *fBestTrack;        // "best" track 
  AliITSUTrackCooked *fTrackToFollow;    // followed track
  
  Bool_t fSAonly; // kTRUE if the standalone tracking only

  ClassDef(AliITSUTrackerCooked,2)   //ITSU stand-alone tracker
};



// The helper classes
class AliITSUTrackerCooked::AliITSUlayer {
  public:
    AliITSUlayer();
    ~AliITSUlayer();

    void InsertClusters(TClonesArray *clusters, Bool_t seedingLayer, Bool_t sa);
    void SetR(Double_t r) {fR=r;}
    void DeleteClusters();
    void ResetSelectedClusters() {fI=0;}
    void SelectClusters(Float_t phi, Float_t dy, Float_t z, Float_t dz);
    const AliCluster *GetNextCluster(Int_t &i); 
    void ResetTrack(const AliITSUTrackCooked &t);
    Int_t FindClusterIndex(Double_t z) const;
    Float_t GetR() const {return fR;}
    AliCluster *GetCluster(Int_t i) const { return fClusters[i]; } 
    Float_t GetXRef(Int_t i) const { return fXRef[i]; } 
    Float_t GetAlphaRef(Int_t i) const { return fAlphaRef[i]; } 
    Float_t GetClusterPhi(Int_t i) const { return fPhi[i]; } 
    Int_t GetNumberOfClusters() const {return fN;}
    const AliITSUTrackCooked *GetTrack() const {return fTrack;}

  protected:
    AliITSUlayer(const AliITSUlayer&);
    AliITSUlayer &operator=(const AliITSUlayer &tr);  
    Int_t InsertCluster(AliCluster *c);

    Float_t fR;                // mean radius of this layer

    AliCluster *fClusters[kMaxClusterPerLayer]; // All clusters
    Float_t fXRef[kMaxClusterPerLayer];     // x of the reference plane
    Float_t fAlphaRef[kMaxClusterPerLayer]; // alpha of the reference plane
    Float_t fPhi[kMaxClusterPerLayer]; // cluster phi 
    Int_t fN; // Total number of clusters 

    Int_t fIndex[kMaxSelected]; 
    Int_t fNsel;      // Number of selected clusters
    Int_t fI;         // Running index for the selected clusters  

    AliITSUTrackCooked *fTrack; // track estimation at this layer
  };


#endif
 AliITSUTrackerCooked.h:1
 AliITSUTrackerCooked.h:2
 AliITSUTrackerCooked.h:3
 AliITSUTrackerCooked.h:4
 AliITSUTrackerCooked.h:5
 AliITSUTrackerCooked.h:6
 AliITSUTrackerCooked.h:7
 AliITSUTrackerCooked.h:8
 AliITSUTrackerCooked.h:9
 AliITSUTrackerCooked.h:10
 AliITSUTrackerCooked.h:11
 AliITSUTrackerCooked.h:12
 AliITSUTrackerCooked.h:13
 AliITSUTrackerCooked.h:14
 AliITSUTrackerCooked.h:15
 AliITSUTrackerCooked.h:16
 AliITSUTrackerCooked.h:17
 AliITSUTrackerCooked.h:18
 AliITSUTrackerCooked.h:19
 AliITSUTrackerCooked.h:20
 AliITSUTrackerCooked.h:21
 AliITSUTrackerCooked.h:22
 AliITSUTrackerCooked.h:23
 AliITSUTrackerCooked.h:24
 AliITSUTrackerCooked.h:25
 AliITSUTrackerCooked.h:26
 AliITSUTrackerCooked.h:27
 AliITSUTrackerCooked.h:28
 AliITSUTrackerCooked.h:29
 AliITSUTrackerCooked.h:30
 AliITSUTrackerCooked.h:31
 AliITSUTrackerCooked.h:32
 AliITSUTrackerCooked.h:33
 AliITSUTrackerCooked.h:34
 AliITSUTrackerCooked.h:35
 AliITSUTrackerCooked.h:36
 AliITSUTrackerCooked.h:37
 AliITSUTrackerCooked.h:38
 AliITSUTrackerCooked.h:39
 AliITSUTrackerCooked.h:40
 AliITSUTrackerCooked.h:41
 AliITSUTrackerCooked.h:42
 AliITSUTrackerCooked.h:43
 AliITSUTrackerCooked.h:44
 AliITSUTrackerCooked.h:45
 AliITSUTrackerCooked.h:46
 AliITSUTrackerCooked.h:47
 AliITSUTrackerCooked.h:48
 AliITSUTrackerCooked.h:49
 AliITSUTrackerCooked.h:50
 AliITSUTrackerCooked.h:51
 AliITSUTrackerCooked.h:52
 AliITSUTrackerCooked.h:53
 AliITSUTrackerCooked.h:54
 AliITSUTrackerCooked.h:55
 AliITSUTrackerCooked.h:56
 AliITSUTrackerCooked.h:57
 AliITSUTrackerCooked.h:58
 AliITSUTrackerCooked.h:59
 AliITSUTrackerCooked.h:60
 AliITSUTrackerCooked.h:61
 AliITSUTrackerCooked.h:62
 AliITSUTrackerCooked.h:63
 AliITSUTrackerCooked.h:64
 AliITSUTrackerCooked.h:65
 AliITSUTrackerCooked.h:66
 AliITSUTrackerCooked.h:67
 AliITSUTrackerCooked.h:68
 AliITSUTrackerCooked.h:69
 AliITSUTrackerCooked.h:70
 AliITSUTrackerCooked.h:71
 AliITSUTrackerCooked.h:72
 AliITSUTrackerCooked.h:73
 AliITSUTrackerCooked.h:74
 AliITSUTrackerCooked.h:75
 AliITSUTrackerCooked.h:76
 AliITSUTrackerCooked.h:77
 AliITSUTrackerCooked.h:78
 AliITSUTrackerCooked.h:79
 AliITSUTrackerCooked.h:80
 AliITSUTrackerCooked.h:81
 AliITSUTrackerCooked.h:82
 AliITSUTrackerCooked.h:83
 AliITSUTrackerCooked.h:84
 AliITSUTrackerCooked.h:85
 AliITSUTrackerCooked.h:86
 AliITSUTrackerCooked.h:87
 AliITSUTrackerCooked.h:88
 AliITSUTrackerCooked.h:89
 AliITSUTrackerCooked.h:90
 AliITSUTrackerCooked.h:91
 AliITSUTrackerCooked.h:92
 AliITSUTrackerCooked.h:93
 AliITSUTrackerCooked.h:94
 AliITSUTrackerCooked.h:95
 AliITSUTrackerCooked.h:96
 AliITSUTrackerCooked.h:97
 AliITSUTrackerCooked.h:98
 AliITSUTrackerCooked.h:99
 AliITSUTrackerCooked.h:100
 AliITSUTrackerCooked.h:101
 AliITSUTrackerCooked.h:102
 AliITSUTrackerCooked.h:103
 AliITSUTrackerCooked.h:104
 AliITSUTrackerCooked.h:105
 AliITSUTrackerCooked.h:106
 AliITSUTrackerCooked.h:107
 AliITSUTrackerCooked.h:108
 AliITSUTrackerCooked.h:109
 AliITSUTrackerCooked.h:110
 AliITSUTrackerCooked.h:111
 AliITSUTrackerCooked.h:112
 AliITSUTrackerCooked.h:113
 AliITSUTrackerCooked.h:114
 AliITSUTrackerCooked.h:115
 AliITSUTrackerCooked.h:116
 AliITSUTrackerCooked.h:117
 AliITSUTrackerCooked.h:118
 AliITSUTrackerCooked.h:119
 AliITSUTrackerCooked.h:120
 AliITSUTrackerCooked.h:121
 AliITSUTrackerCooked.h:122