#ifndef ALITPCTRACKERMI_H #define ALITPCTRACKERMI_H /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * See cxx source for full Copyright notice */ /* $Id$ */ //------------------------------------------------------- // TPC trackerMI // // Origin: //------------------------------------------------------- #include "AliTracker.h" #include "AliTPCtrack.h" #include "TClonesArray.h" //#include "AliTPCClustersArray.h" #include "AliTPCreco.h" #include "Rtypes.h" #include "AliComplexCluster.h" class TFile; class AliTPCParam; class AliTPCseed; class AliTPCclusterMI; class AliTPCTrackerPoint; class AliESD; class TTree; class AliTPCseed : public AliTPCtrack { public: AliTPCseed(); virtual ~AliTPCseed(); AliTPCseed(const AliTPCtrack &t); AliTPCseed(const AliKalmanTrack &t, Double_t a); Int_t Compare(const TObject *o) const; void Reset(Bool_t all = kTRUE); Int_t GetProlongation(Double_t xr, Double_t &y, Double_t & z) const; virtual Double_t GetPredictedChi2(const AliTPCclusterMI *cluster) const; virtual Int_t Update(const AliTPCclusterMI* c, Double_t chi2, UInt_t i); AliTPCTrackerPoint * GetTrackPoint(Int_t i); void RebuildSeed(); // rebuild seed to be ready for storing AliTPCseed(UInt_t index, const Double_t xx[5], const Double_t cc[15], Double_t xr, Double_t alpha); Double_t GetDensityFirst(Int_t n); Double_t GetSigma2C(){return fC44;} void GetClusterStatistic(Int_t first, Int_t last, Int_t &found, Int_t &foundable, Int_t &shared, Bool_t plus2); void Modify(Double_t factor); void SetClusterIndex2(Int_t row, Int_t index){ fIndex[row] = index; } Int_t GetClusterIndex2(Int_t row){ return fIndex[row]; } Int_t GetClusterSector(Int_t row){ Int_t pica = -1; if (fIndex[row]>=0) pica = ((fIndex[row]&0xff000000)>>24); return pica; } void SetErrorY2(Float_t sy2){fErrorY2=sy2;} void SetErrorZ2(Float_t sz2){fErrorZ2=sz2;} void CookdEdx(Double_t low=0.05, Double_t up=0.70, Int_t i1=0, Int_t i2=159, Bool_t onlyused = kFALSE); // void CookdEdx2(Double_t low=0.05, Double_t up=0.70); Bool_t IsActive(){ return !(fRemoval);} void Desactivate(Int_t reason){ fRemoval = reason;} // // AliTPCclusterMI* fClusterPointer[160]; //! array of cluster pointers - TClonesArray * fPoints; // array with points along the track TClonesArray * fEPoints; // array with exact points - calculated in special macro not used in tracking //---CURRENT VALUES Int_t fRow; //!current row number Int_t fSector; //!current sector number Int_t fRelativeSector; //! index of current relative sector Float_t fCurrentSigmaY2; //!expected current cluster sigma Y Float_t fCurrentSigmaZ2; //!expected current cluster sigma Z Float_t fErrorY2; //!sigma of current cluster Float_t fErrorZ2; //!sigma of current cluster AliTPCclusterMI * fCurrentCluster; //!pointer to the current cluster for prolongation Int_t fCurrentClusterIndex1; //! index of the current cluster Bool_t fInDead; //! indicate if the track is in dead zone Bool_t fIsSeeding; //!indicates if it is proces of seeading Int_t fNoCluster; //!indicates number of rows without clusters Int_t fSort; //!indicate criteria for sorting Bool_t fBSigned; //indicates that clusters of this trackes are signed to be used // // Float_t fDEDX[4]; // dedx according padrows Float_t fSDEDX[4]; // sdedx according padrows Int_t fNCDEDX[4]; // number of clusters for dedx measurment // Int_t fSeedType; //seeding type Int_t fSeed1; //first row for seeding Int_t fSeed2; //last row for seeding Int_t fOverlapLabels[12]; //track labels and the length of the overlap private: Float_t fMAngular; // mean angular factor AliTPCTrackerPoint fTrackPoints[160]; //!track points - array track points ClassDef(AliTPCseed,1) }; class AliTPCtrackerMI : public AliTracker { public: AliTPCtrackerMI():AliTracker(),fkNIS(0),fkNOS(0) { fInnerSec=fOuterSec=0; fSeeds=0; } AliTPCtrackerMI(const AliTPCParam *par); ~AliTPCtrackerMI(); // //to be implemented later virtual Int_t Clusters2Tracks (AliESD *){return 0;} virtual Int_t RefitInward (AliESD *){return 0;} virtual Int_t LoadClusters (TTree *){return 0;} // void SetIO(); //set default IO from folders void SetIO(TTree * input, TTree * output, AliESD * event); void WriteTracks(); void DeleteSeeds(); void SetDebug(Int_t debug){ fDebug = debug;} Int_t ReadSeeds(const TFile *in); Int_t LoadClusters(); void UnloadClusters(); TObjArray * GetSeeds(){return fSeeds;} // AliCluster * GetCluster (int) const {return 0;} AliTPCclusterMI *GetClusterMI(Int_t index) const; Int_t Clusters2Tracks(const TFile */*in*/, TFile */*out*/){return 0;} Int_t Clusters2Tracks(); virtual void CookLabel(AliTPCseed *t,Float_t wrong) const; void RotateToLocal(AliTPCseed *seed); Int_t FollowProlongation(AliTPCseed& t, Int_t rf=0, Int_t step=1); Int_t FollowProlongationFast(AliTPCseed& t, Int_t rf=0, Int_t step=1); Int_t FollowBackProlongation(AliTPCseed& t, Int_t rf); Int_t FollowToNext(AliTPCseed& t, Int_t nr); Int_t FollowToNextFast(AliTPCseed& t, Int_t nr); Int_t UpdateClusters(AliTPCseed& t, Int_t nr); Int_t FollowToNextCluster( AliTPCseed& t, Int_t nr); virtual Int_t PropagateBack (const TFile *, TFile *){return 0;} Int_t PropagateBack(TObjArray * arr); Int_t PropagateBack(AliESD * event); Int_t PropagateBack(AliTPCseed *pt, Int_t row0, Int_t row1); Int_t PropagateForward(); Int_t PropagateForward2(TObjArray * arr); Int_t CheckKinkPoint(AliTPCseed*seed, Float_t th); void SortTracks(TObjArray * arr, Int_t mode); virtual Double_t ErrY2(AliTPCseed* seed, AliTPCclusterMI * cl = 0); virtual Double_t ErrZ2(AliTPCseed* seed, AliTPCclusterMI * cl = 0); Double_t f1(Double_t x1,Double_t y1, Double_t x2,Double_t y2, Double_t x3,Double_t y3); Double_t f1old(Double_t x1,Double_t y1, Double_t x2,Double_t y2, Double_t x3,Double_t y3); Double_t f2(Double_t x1,Double_t y1, Double_t x2,Double_t y2, Double_t x3,Double_t y3); Double_t f2old(Double_t x1,Double_t y1, Double_t x2,Double_t y2, Double_t x3,Double_t y3); Double_t f3(Double_t x1,Double_t y1, Double_t x2,Double_t y2, Double_t z1,Double_t z2); Double_t f3n(Double_t x1,Double_t y1, Double_t x2,Double_t y2, Double_t z1,Double_t z2, Double_t c); Bool_t GetProlongation(Double_t x1, Double_t x2, Double_t x[5], Double_t &y, Double_t &z); public: //**************** Internal tracker class ********************** class AliTPCRow { public: AliTPCRow() {fN=0;} ~AliTPCRow(); void InsertCluster(const AliTPCclusterMI *c, UInt_t index); operator int() const {return fN;} Int_t GetN() const {return fN;} const AliTPCclusterMI* operator[](Int_t i) const {return fClusters[i];} UInt_t GetIndex(Int_t i) const {return fIndex[i];} inline Int_t Find(Double_t z) const; AliTPCclusterMI * FindNearest(Double_t y, Double_t z, Double_t roady, Double_t roadz) const; AliTPCclusterMI * FindNearest2(Double_t y, Double_t z, Double_t roady, Double_t roadz, UInt_t & index) const; AliTPCclusterMI * FindNearest3(Double_t y, Double_t z, Double_t roady, Double_t roadz, UInt_t & index) const; void SetX(Double_t x) {fX=x;} Double_t GetX() const {return fX;} Float_t fDeadZone; // the width of the dead zone // void RebuildRow(){;} // AliTPCclusterMI *fClusters1; //array with clusters 1 Int_t fN1; AliTPCclusterMI *fClusters2; //array with clusters 2 Int_t fN2; Short_t fFastCluster[510]; private: Int_t fN; //number of clusters const AliTPCclusterMI *fClusters[kMaxClusterPerRow]; //pointers to clusters // indexes for cluster at given position z // AliTPCclusterMI *fClustersArray; // UInt_t fIndex[kMaxClusterPerRow]; //indeces of clusters Double_t fX; //X-coordinate of this row //private: AliTPCRow(const AliTPCRow& r); //dummy copy constructor AliTPCRow &operator=(const AliTPCRow& r); //dummy assignment operator }; //**************** Internal tracker class ********************** class AliTPCSector { public: AliTPCSector() { fN=0; fRow = 0; } ~AliTPCSector() { delete[] fRow; } AliTPCRow& operator[](Int_t i) const { return *(fRow+i); } Int_t GetNRows() const { return fN; } void Setup(const AliTPCParam *par, Int_t flag); Double_t GetX(Int_t l) const {return fRow[l].GetX();} Double_t GetMaxY(Int_t l) const { return GetX(l)*TMath::Tan(0.5*GetAlpha()); } Double_t GetAlpha() const {return fAlpha;} Double_t GetAlphaShift() const {return fAlphaShift;} //Int_t GetFirst(){return fFirstRow;} Int_t GetRowNumber(Double_t x) const { //return pad row number for this x Double_t r; if (fN < 64){ r=fRow[fN-1].GetX(); if (x > r) return fN; r=fRow[0].GetX(); if (x < r) return -1; return Int_t((x-r)/fPadPitchLength + 0.5);} else{ r=fRow[fN-1].GetX(); if (x > r) return fN; r=fRow[0].GetX(); if (x < r) return -1; Double_t r1=fRow[64].GetX(); if(xforward // TObjArray * fTrackPointPool; // ! pool with track points // TObjArray * fSeedPool; //! pool with seeds Double_t fXRow[200]; // radius of the pad row Double_t fYMax[200]; // max y for given pad row Double_t fPadLength[200]; // max y for given pad row const AliTPCParam *fParam; //pointer to the parameters ClassDef(AliTPCtrackerMI,1) }; AliTPCtrackerMI::AliTPCRow & AliTPCtrackerMI::GetRow(Int_t sec, Int_t row) { // return (row>=fInnerSec->GetNRows()) ? fOuterSec[sec][row-fInnerSec->GetNRows()]:fInnerSec[sec][row]; } Double_t AliTPCtrackerMI::GetXrow(Int_t row) { // return (row>=fInnerSec->GetNRows()) ? fOuterSec->GetX(row-fInnerSec->GetNRows()):fInnerSec->GetX(row); return fXRow[row]; } Double_t AliTPCtrackerMI::GetMaxY(Int_t row) { //return (row>=fInnerSec->GetNRows()) ? fOuterSec->GetMaxY(row-fInnerSec->GetNRows()):fInnerSec->GetMaxY(row); return fYMax[row]; } Int_t AliTPCtrackerMI::GetRowNumber(Double_t x) { // return (x>133.) ? fOuterSec->GetRowNumber(x)+fInnerSec->GetNRows():fInnerSec->GetRowNumber(x); } Double_t AliTPCtrackerMI::GetPadPitchLength(Double_t x) { // return (x>133.) ? fOuterSec->GetPadPitchLength(x):fInnerSec->GetPadPitchLength(x); //return fPadLength[row]; } Double_t AliTPCtrackerMI::GetPadPitchLength(Int_t row) { // return fPadLength[row]; } #endif