3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice */
8 ////////////////////////////////////////////////////////////////////////////
10 // The TRD track seed //
12 ////////////////////////////////////////////////////////////////////////////
15 #include "AliTRDseed.h"
18 #ifndef ALITRDGEOMETRY_H
19 #include "AliTRDgeometry.h"
27 #include "AliRieman.h"
30 class TTreeSRedirector;
34 class AliTRDtrackingChamber;
37 class AliTRDReconstructor;
38 class AliTRDseedV1 : public AliTRDseed
46 // bits from 0-13 are reserved by ROOT (see TObject.h)
47 enum AliTRDtrackletStatus {
52 AliTRDseedV1(Int_t det = -1);
54 AliTRDseedV1(const AliTRDseedV1 &ref);
55 AliTRDseedV1& operator=(const AliTRDseedV1 &ref);
57 Bool_t AttachClustersIter(
58 AliTRDtrackingChamber *chamber, Float_t quality,
59 Bool_t kZcorr = kFALSE, AliTRDcluster *c=0x0);
60 Bool_t AttachClusters(
61 AliTRDtrackingChamber *chamber, Bool_t tilt = kFALSE);
62 void Bootstrap(const AliTRDReconstructor *rec);
63 void CookdEdx(Int_t nslices);
64 Bool_t Fit(Bool_t tilt=kTRUE, Int_t errors = 2);
66 Bool_t Init(AliTRDtrackV1 *track);
67 inline void Init(const AliRieman *fit);
68 Bool_t IsEqual(const TObject *inTracklet) const;
69 Bool_t IsOwner() const { return TestBit(kOwner);}
70 Bool_t IsRowCross() const { return TestBit(kRowCross);}
72 inline Float_t GetChi2Z(const Float_t z = 999.) const;
73 inline Float_t GetChi2Y(const Float_t y = 999.) const;
74 static void GetClusterXY(const AliTRDcluster *c, Double_t &x, Double_t &y);
75 void GetCovAt(Double_t x, Double_t *cov) const;
76 void GetCovXY(Double_t *cov) const { memcpy(cov, &fCov[0], 3*sizeof(Double_t));}
77 void GetCovRef(Double_t *cov) const { memcpy(cov, &fRefCov[0], 3*sizeof(Double_t));}
78 Double_t* GetCrossXYZ() { return &fCross[0];}
79 Double_t GetCrossSz2() const { return fCross[3];}
80 Float_t GetdX() const { return fdX;}
81 Float_t* GetdEdx() { return &fdEdx[0];}
82 Float_t GetdQdl(Int_t ic) const;
83 Int_t GetDetector() const { return fDet;}
84 Float_t GetExB() const { return fExB;}
85 Double_t GetMomentum() const { return fMom;}
86 Int_t GetN() const { return fN2;}
87 Float_t GetQuality(Bool_t kZcorr) const;
88 Int_t GetPlane() const { return AliTRDgeometry::GetLayer(fDet); }
90 Double_t* GetProbability();
91 Double_t GetSnp() const { return fSnp;}
92 Double_t GetTgl() const { return fTgl;}
93 Float_t GetXref() const { return fX0 - fXref;}
94 Double_t GetYat(Double_t x) const { return fYfit[0] - fYfit[1] * (fX0-x);}
95 Double_t GetZat(Double_t x) const { return fZfit[0] - fZfit[1] * (fX0-x);}
97 inline AliTRDcluster* NextCluster();
98 inline AliTRDcluster* PrevCluster();
99 void Print(Option_t *o = "") const;
100 inline void ResetClusterIter(Bool_t forward = kTRUE);
102 void SetCovRef(const Double_t *cov) { memcpy(&fRefCov[0], cov, 3*sizeof(Double_t));}
103 void SetMomentum(Double_t mom){ fMom = mom;}
105 void SetDetector(Int_t d) { fDet = d; }
106 void SetDX(Float_t inDX) { fdX = inDX;}
107 void SetSnp(Double_t snp) { fSnp = snp;}
108 void SetTgl(Double_t tgl) { fTgl = tgl;}
109 void SetReconstructor(const AliTRDReconstructor *rec) {fReconstructor = rec;}
110 void UpDate(const AliTRDtrackV1* trk);
113 void Copy(TObject &ref) const;
117 const AliTRDReconstructor *fReconstructor;//! local reconstructor
118 AliTRDcluster **fClusterIter; //! clusters iterator
119 Char_t fClusterIdx; //! clusters iterator
120 Int_t fDet; // TRD detector
121 Float_t fMom; // Momentum estimate for tracklet [GeV/c]
122 Float_t fSnp; // sin of track with respect to x direction in XY plane
123 Float_t fTgl; // tg of track with respect to x direction in XZ plane
124 Float_t fdX; // length of time bin
125 Float_t fXref; // average radial position of clusters
126 Float_t fExB; // tg(a_L) for the tracklet reagion
127 Float_t fdEdx[knSlices]; // dE/dx measurements for tracklet
128 Double_t fCross[4]; // spatial parameters of the pad row crossing
129 Double_t fRefCov[3]; // covariance matrix of the track in the yz plane
130 Double_t fCov[3]; // covariance matrix of the tracklet in the xy plane
131 Double_t fProb[AliPID::kSPECIES]; // PID probabilities
133 ClassDef(AliTRDseedV1, 4) // New TRD seed
137 //____________________________________________________________
138 inline Float_t AliTRDseedV1::GetChi2Z(const Float_t z) const
140 Float_t z1 = (z == 999.) ? fMeanz : z;
141 Float_t chi = fZref[0] - z1;
145 //____________________________________________________________
146 inline Float_t AliTRDseedV1::GetChi2Y(const Float_t y) const
148 Float_t y1 = (y == 999.) ? fYfitR[0] : y;
149 Float_t chi = fYref[0] - y1;
153 //____________________________________________________________
154 inline void AliTRDseedV1::Init(const AliRieman *rieman)
156 fZref[0] = rieman->GetZat(fX0);
157 fZref[1] = rieman->GetDZat(fX0);
158 fYref[0] = rieman->GetYat(fX0);
159 fYref[1] = rieman->GetDYat(fX0);
161 fChi2 = rieman->GetChi2();
164 //____________________________________________________________
165 inline AliTRDcluster* AliTRDseedV1::NextCluster()
167 // Mimic the usage of STL iterators.
170 fClusterIdx++; fClusterIter++;
171 while(fClusterIdx < AliTRDseed::knTimebins){
172 if(!(*fClusterIter)){
177 return *fClusterIter;
182 //____________________________________________________________
183 inline AliTRDcluster* AliTRDseedV1::PrevCluster()
185 // Mimic the usage of STL iterators.
188 fClusterIdx--; fClusterIter--;
189 while(fClusterIdx >= 0){
190 if(!(*fClusterIter)){
195 return *fClusterIter;
200 //____________________________________________________________
201 inline void AliTRDseedV1::ResetClusterIter(Bool_t forward)
203 // Mimic the usage of STL iterators.
204 // Facilitate the usage of NextCluster for forward like
205 // iterator (kTRUE) and PrevCluster for backward like iterator (kFALSE)
208 fClusterIter = &fClusters[0]; fClusterIter--;
211 fClusterIter = &fClusters[AliTRDseed::knTimebins-1]; fClusterIter++;
212 fClusterIdx=AliTRDseed::knTimebins;