X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDtracker.h;h=b54f4d7cc0246278657a7a97b125f2f6b616b743;hb=eab5961ed9b69f5bb7036af12fd7b350e3a878f7;hp=e0b7d8844eef7878b21884689f1850070e2777e1;hpb=a2b90f83f274c4e3f873d61e00fa82a1a7715150;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDtracker.h b/TRD/AliTRDtracker.h index e0b7d8844ee..b54f4d7cc02 100644 --- a/TRD/AliTRDtracker.h +++ b/TRD/AliTRDtracker.h @@ -4,48 +4,187 @@ /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * See cxx source for full Copyright notice */ -#include +#include "AliTracker.h" +#include "TObjArray.h" class TFile; +class TTree; class TParticle; class TParticlePDG; -class TObjArray; class AliTRDgeometry; -class AliTRDtrackingSector; +class AliTRDparameter; class AliTRDtrack; -class AliTRDmcTrack; +class AliTRDcluster; +class AliBarrelTrack; +class AliESD; +const unsigned kMaxLayersPerSector = 1000; +const unsigned kMaxTimeBinIndex = 216; // (30 drift + 6 ampl) * 6 planes +const unsigned kMaxClusterPerTimeBin = 7000; +const unsigned kZones = 5; +const Int_t kTrackingSectors = 18; -class AliTRDtracker : public TNamed { +class AliTRDtracker : public AliTracker { public: AliTRDtracker(); - AliTRDtracker(const Text_t* name, const Text_t* title); - ~AliTRDtracker(); - - virtual void Clusters2Tracks(); - Double_t ExpectedSigmaY2(Double_t r, Double_t tgl, Double_t pt); - Double_t ExpectedSigmaZ2(Double_t r, Double_t tgl); - Int_t FindProlongation(AliTRDtrack& t, AliTRDtrackingSector *sec, - Int_t s, Int_t rf=0); - void GetEvent(const Char_t *hitfile, const Char_t *clusterfile); - void SetUpSectors(AliTRDtrackingSector *sec); - virtual void MakeSeeds(Int_t inner, Int_t outer); - virtual void FindTracks(); - virtual void UseClusters(AliTRDtrack t); - virtual Int_t GetTrackLabel(AliTRDtrack t); - Int_t WriteTracks(const Char_t *filename); - void ReadClusters(TObjArray *array, const Char_t *filename, - Int_t option = 1); + AliTRDtracker(const TFile *in); + virtual ~AliTRDtracker(); - protected: + Int_t Clusters2Tracks(AliESD* event); + Int_t PropagateBack(AliESD* event); + Int_t RefitInward(AliESD* event); + + Int_t LoadClusters(TTree *cTree); + void UnloadClusters(); + AliCluster *GetCluster(Int_t index) const { if (index >= fNclusters) return NULL; + return (AliCluster*) fClusters->UncheckedAt(index); }; + virtual void CookLabel(AliKalmanTrack *t,Float_t wrong) const; + virtual void UseClusters(const AliKalmanTrack *t, Int_t from=0) const; + + void SetAddTRDseeds() { fAddTRDseeds = kTRUE; } + void SetNoTilt() { fNoTilt = kTRUE; } + + Double_t GetTiltFactor(const AliTRDcluster* c); + + Int_t ReadClusters(TObjArray *array, TTree *in) const; + Int_t CookSectorIndex(Int_t gs) const { return kTrackingSectors - 1 - gs; } + AliTRDcluster * GetCluster(AliTRDtrack * track, Int_t plane, Int_t timebin); + Int_t GetLastPlane(AliTRDtrack * track); //return last updated plane + + Float_t GetSeedGap() const {return fgkSeedGap;} + Int_t GetMaxGap() const {return fMaxGap;} + Int_t GetTimeBinsPerPlane() const {return fTimeBinsPerPlane;} + Float_t GetSeedStep() const {return fgkSeedStep;} + Float_t GetSeedDepth() const {return fgkSeedDepth;} + Float_t GetSkipDepth() const {return fgkSkipDepth;} + Double_t GetMaxChi2() const {return fgkMaxChi2;} + Float_t GetMaxSeedC() const {return fgkMaxSeedC;} + Float_t GetMaxSeedTan() const {return fgkMaxSeedTan;} + Double_t GetSeedErrorSY() const {return fgkSeedErrorSY;} + Double_t GetSeedErrorSY3() const {return fgkSeedErrorSY3;} + Double_t GetSeedErrorSZ() const {return fgkSeedErrorSZ;} + Float_t GetLabelFraction() const {return fgkLabelFraction;} + Float_t GetWideRoad() const {return fgkWideRoad;} + + Float_t GetMinClustersInTrack() const {return fgkMinClustersInTrack;} + Float_t GetMinClustersInSeed() const {return fgkMinClustersInSeed;} + Float_t GetMaxSeedDeltaZ() const {return fgkMaxSeedDeltaZ;} + Float_t GetMaxSeedVertexZ() const {return fgkMaxSeedVertexZ;} + + // x <-> timebin conversions useful in analysis macros + Double_t GetX(Int_t sec, Int_t plane, Int_t localTB) const; + Double_t GetX(Int_t sec, Int_t pl) const { + return fTrSec[sec]->GetLayer(pl)->GetX(); } + Int_t GetGlobalTimeBin(Int_t sec, Int_t plane, Int_t localTB) const { + return fTrSec[sec]->CookTimeBinIndex(plane,localTB); } + Double_t GetLayerNumber(Int_t sec, Double_t x) const { + return fTrSec[sec]->GetLayerNumber(x); } + + class AliTRDpropagationLayer { + // ***************** internal class ******************* + public: + AliTRDpropagationLayer(Double_t x, Double_t dx, Double_t rho, + Double_t x0, Int_t tbIndex); - Int_t fEvent; // Event number + ~AliTRDpropagationLayer() { + if(fTimeBinIndex >= 0) { delete[] fClusters; delete[] fIndex; } + } + void InsertCluster(AliTRDcluster *c, UInt_t index); + operator Int_t() const {return fN;} + AliTRDcluster* operator[](Int_t i) {return fClusters[i];} + UInt_t GetIndex(Int_t i) const {return fIndex[i];} + Double_t GetX() const { return fX; } + Double_t GetdX() const { return fdX; } + Double_t GetRho() const { return fRho; } + Double_t GetX0() const { return fX0; } + Int_t GetTimeBinIndex() const { return fTimeBinIndex; } + void GetPropagationParameters(Double_t y, Double_t z, + Double_t &dx, Double_t &rho, Double_t &x0, + Bool_t &lookForCluster) const; + Int_t GetZone( Double_t z) const; + Int_t Find(Double_t y) const; + void SetZmax(Int_t cham, Double_t center, Double_t w) + { fZc[cham] = center; fZmax[cham] = w; } + void SetZ(Double_t* center, Double_t *w, Double_t *wsensitive); + void SetHoles(Bool_t* holes); + void SetYmax(Double_t w, Double_t wsensitive) { fYmax = w; fYmaxSensitive = wsensitive; } + Double_t GetYmax() const { return fYmax; } + Double_t GetZmax(Int_t c) const { return fZmax[c]; } + Double_t GetZc(Int_t c) const { return fZc[c]; } + + void SetHole(Double_t Zmax, Double_t Ymax, + Double_t rho = 1.29e-3, Double_t x0 = 36.66, + Double_t Yc = 0, Double_t Zc = 0); + + Bool_t IsSensitive() const {return (fTimeBinIndex>=0)? kTRUE: kFALSE;} + + void Clear() {for(Int_t i=0; iGetX(); } + void MapTimeBinLayers(); + Int_t GetLayerNumber(Double_t x) const; + Int_t GetInnerTimeBin() const; + Int_t GetOuterTimeBin() const; + Int_t GetLayerNumber(Int_t tb) const {return fTimeBinIndex[tb];} + Float_t GetTzeroShift() const { return fTzeroShift; } + Int_t Find(Double_t x) const; + void InsertLayer(AliTRDpropagationLayer* pl); + // AliTRDpropagationLayer* operator[](Int_t i) { return fLayers[i]; } + AliTRDpropagationLayer* GetLayer(Int_t i) { return fLayers[i]; } + Int_t CookTimeBinIndex(Int_t plane, Int_t localTB) const; + + private: + Int_t fN; // total number of layers + AliTRDgeometry *fGeom; // geometry + AliTRDparameter *fPar; // parameter + AliTRDpropagationLayer *fLayers[kMaxLayersPerSector]; // layers + Int_t fTimeBinIndex[kMaxTimeBinIndex]; // time bin index + Float_t fTzeroShift; // T0 shift in cm + Int_t fGeomSector; // sector # in AliTRDgeometry + }; + + protected: + + AliTRDgeometry *fGeom; // Pointer to TRD geometry + AliTRDparameter *fPar; // Pointer to TRD parameter + + AliTRDtrackingSector *fTrSec[kTrackingSectors]; // array of tracking sectors; Int_t fNclusters; // Number of clusters in TRD TObjArray *fClusters; // List of clusters for all sectors @@ -55,27 +194,83 @@ class AliTRDtracker : public TNamed { Int_t fNtracks; // Number of reconstructed tracks TObjArray *fTracks; // List of reconstructed tracks - static const Int_t fSeedGap; // Distance between inner and outer - // time bin in seeding + Float_t fSY2corr; // Correction coefficient for + // cluster SigmaY2 + + Float_t fSZ2corr; // Correction coefficient for + // cluster SigmaZ2 + + static const Float_t fgkSeedGap; // Distance between inner and outer + // time bin in seeding + // (fraction of all time bins) - static const Int_t fSeedStep; // Step in iterations - static const Float_t fSeedDepth; // Fraction of TRD allocated for seeding - static const Float_t fSkipDepth; // Fraction of TRD which can be skipped - // in track prolongation - static const Double_t fMaxChi2; // max increment in track chi2 - - static const Float_t fMinClustersInTrack; // min fraction of clusters in track - static const Float_t fMinClustersInSeed; // min fraction of clusters in seed - static const Float_t fMaxSeedDeltaZ; // max dZ in MakeSeeds - static const Float_t fMaxSeedC; // max initial curvature in MakeSeeds - static const Float_t fMaxSeedTan; // max initial Tangens(lambda) in MakeSeeds - static const Float_t fMaxSeedVertexZ; // max vertex Z in MakeSeeds - static const Double_t fSeedErrorSY; // sy parameter in MakeSeeds - static const Double_t fSeedErrorSY3; // sy3 parameter in MakeSeeds - static const Double_t fSeedErrorSZ; // sz parameter in MakeSeeds - static const Float_t fLabelFraction; // min fraction of clusters in GetTrackLabel - static const Float_t fWideRoad; // max road width in FindProlongation + static const Float_t fgkSeedStep; // Step in iterations + static const Float_t fgkSeedDepth; // Fraction of TRD allocated for seeding + static const Float_t fgkSkipDepth; // Fraction of TRD which can be skipped + // in track prolongation + Int_t fTimeBinsPerPlane; // number of sensitive timebins per plane + Int_t fMaxGap; // max gap (in time bins) in the track + // in track prolongation + + static const Double_t fgkMaxChi2; // max increment in track chi2 + + static const Float_t fgkMinClustersInTrack; // min number of clusters in track + // out of total timebins + + static const Float_t fgkMinFractionOfFoundClusters; // min found clusters + // out of expected + + static const Float_t fgkMinClustersInSeed; // min fraction of clusters in seed + static const Float_t fgkMaxSeedDeltaZ; // max dZ in MakeSeeds + static const Float_t fgkMaxSeedDeltaZ12; // max abs(z1-z2) in MakeSeeds + static const Float_t fgkMaxSeedC; // max initial curvature in MakeSeeds + static const Float_t fgkMaxSeedTan; // max initial Tangens(lambda) in MakeSeeds + static const Float_t fgkMaxSeedVertexZ; // max vertex Z in MakeSeeds + static const Double_t fgkSeedErrorSY; // sy parameter in MakeSeeds + static const Double_t fgkSeedErrorSY3; // sy3 parameter in MakeSeeds + static const Double_t fgkSeedErrorSZ; // sz parameter in MakeSeeds + static const Float_t fgkLabelFraction; // min fraction of same label + static const Float_t fgkWideRoad; // max road width in FindProlongation + + Bool_t fVocal; // Whatever... + Bool_t fAddTRDseeds; // Something else + + Bool_t fNoTilt; // No tilt, or what? + Bool_t fHoles[5][18]; // holes + + Bool_t AdjustSector(AliTRDtrack *track); + + // Barrel tracks [SR, 03.04.2003] + + static const Int_t fgkFirstPlane; // Id of the first (innermost) reference plane + static const Int_t fgkLastPlane; // Id of the last (outermost) reference plane + + void SetBarrelTree(const char *mode); + void StoreBarrelTrack(AliTRDtrack *ps, Int_t refPlane, Int_t isIn); + + TFile *fBarrelFile; // Some kind of barrel file + TTree *fBarrelTree; // And a barrel tree + TClonesArray *fBarrelArray; // Wow, there even an array for that barrel + AliBarrelTrack *fBarrelTrack; // And, finally, the track + + private: + + virtual void MakeSeeds(Int_t inner, Int_t outer, Int_t turn); + + Int_t FollowProlongation(AliTRDtrack& t, Int_t rf); + Int_t FollowBackProlongation(AliTRDtrack& t); + Int_t Refit(AliTRDtrack& t, Int_t rf); + void CookdEdxTimBin(AliTRDtrack& t); + + Int_t PropagateToTPC(AliTRDtrack& t); + Int_t PropagateToOuterPlane(AliTRDtrack& t, Double_t x); + + void SetSY2corr(Float_t w) {fSY2corr = w;} + void SetSZ2corr(Float_t w) {fSZ2corr = w;} + Double_t ExpectedSigmaY2(Double_t r, Double_t tgl, Double_t pt) const; + Double_t ExpectedSigmaZ2(Double_t r, Double_t tgl) const; + ClassDef(AliTRDtracker,1) // manager base class };