#ifndef ALITRDTRACKV1_H #define ALITRDTRACKV1_H /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * See cxx source for full Copyright notice */ /* $Id$ */ /////////////////////////////////////////////////////////////////////////////// // // // Represents a reconstructed TRD track // // // /////////////////////////////////////////////////////////////////////////////// #ifndef ALIKALMANTRACK_H #include "AliKalmanTrack.h" #endif #ifndef ALITRDSEEDV1_H #include "AliTRDseedV1.h" #endif template class TVectorT; typedef class TVectorT TVectorD; class AliESDtrack; class AliTRDcluster; class AliTRDReconstructor; class AliTRDtrackV1 : public AliKalmanTrack { friend class AliHLTTRDTrack; // allow HLT special access public: enum ETRDtrackSize { kNdet = AliTRDgeometry::kNdet ,kNstacks = AliTRDgeometry::kNstack*AliTRDgeometry::kNsector ,kNplane = AliTRDgeometry::kNlayer ,kNcham = AliTRDgeometry::kNstack ,kNsect = AliTRDgeometry::kNsector ,kMAXCLUSTERSPERTRACK = 210 }; // bits from 0-13 are reserved by ROOT (see TObject.h) enum ETRDtrackStatus { kOwner = BIT(14) ,kStopped = BIT(15) ,kKink = BIT(16) ,kPrimary = BIT(17) ,kSeeder = BIT(18) // if set other than TPC (ITS, TRD) }; // propagation/update error codes (up to 4 bits) enum ETRDtrackError { kProlongation = 1 ,kPropagation ,kAdjustSector ,kSnp ,kTrackletInit ,kUpdate ,kUnknown = 0xff }; // data/clusters/tracklet error codes (up to 4 bits/layer) enum ETRDlayerError { kGeometry = 1 ,kBoundary ,kNoClusters ,kNoAttach ,kNoClustersTracklet ,kNoFit ,kChi2 }; AliTRDtrackV1(); AliTRDtrackV1(AliTRDseedV1 * const trklts, const Double_t p[5], const Double_t cov[15], Double_t x, Double_t alpha); AliTRDtrackV1(const AliESDtrack &ref); AliTRDtrackV1(const AliTRDtrackV1 &ref); virtual ~AliTRDtrackV1(); AliTRDtrackV1 &operator=(const AliTRDtrackV1 &ref); virtual void Copy(TObject &ref) const; virtual TObject* Clone(const char* newname = "") const; Bool_t CookPID(); Double_t CookTruncatedMean(const Bool_t kinvq, const Double_t mag, const Int_t charge, const Int_t kcalib, Int_t &nch, Int_t &ncls, TVectorD *Qs=NULL, TVectorD *Xs=NULL, Int_t timeBin0=-1, Int_t timeBin1=1000, Int_t tstep=1) const; Int_t CookLabel(Float_t wrong, Int_t *labs=NULL, Float_t *freq=NULL); AliTRDtrackV1* GetBackupTrack() const {return fBackupTrack;} Double_t GetBudget(Int_t i) const { return fBudget[i];} AliTRDcluster* GetCluster(Int_t id); Int_t GetClusterIndex(Int_t id) const; Float_t GetEdep() const {return fDE;} Int_t GetESDid() const {return fESDid;} inline Float_t GetMomentum(Int_t plane=-1) const; inline Int_t GetNCross(); inline Int_t GetNumberOfTracklets() const; Double_t GetPIDsignal() const { return 0.;} Double_t GetPID(Int_t is) const { return (is >=0 && is < AliPID::kSPECIES) ? fPID[is] : -1.;} UChar_t GetNumberOfTrackletsPID() const; Int_t GetNumberOfPhysicsSlices() const { return fNdEdxSlices; }; Double_t GetPredictedChi2(const AliTRDseedV1 *tracklet, Double_t *cov) const; Double_t GetPredictedChi2(const AliCluster* /*c*/) const { return 0.0; } Int_t GetProlongation(Double_t xk, Double_t &y, Double_t &z) const; inline UChar_t GetStatusTRD(Int_t ly=-1) const; Int_t GetSector() const; AliTRDseedV1* GetTracklet(Int_t plane) const {return plane >=0 && plane =0 && plane=0 && i<3) fBudget[i] = b;} void SetEdep(Double32_t inDE){fDE = inDE;}; void SetESDid(Int_t id) {fESDid = id;} void SetKink(Bool_t k) { SetBit(kKink, k);} void SetPrimary(Bool_t k) { SetBit(kPrimary, k);} void SetNonTPCseeded(Bool_t k){ SetBit(kSeeder, k);} void SetNumberOfClusters(); void SetOwner(); void SetPID(Short_t is, Double_t inPID){if (is >=0 && is < AliPID::kSPECIES) fPID[is]=inPID;}; void SetPIDquality(UChar_t /*inPIDquality*/) const {/*fPIDquality = inPIDquality*/;}; inline void SetErrStat(UChar_t stat, Int_t ly=-1); void SetStopped(Bool_t stop) {SetBit(kStopped, stop);} void SetTracklet(AliTRDseedV1 *const trklt, Int_t index); void SetTrackIn(); void SetTrackOut(const AliExternalTrackParam *op=NULL); inline void SetReconstructor(const AliTRDReconstructor *rec); inline Float_t StatusForTOF(); void UnsetTracklet(Int_t plane); Bool_t Update(const AliCluster *, Double_t, Int_t) { return kFALSE; }; void UpdateChi2(Float_t chi2); void UpdateESDtrack(AliESDtrack *t); private: UInt_t fStatus; // Bit map for the status of propagation Int_t fTrackletIndex[kNplane];// Tracklets index in the tracker list Int_t fESDid; // ESD track id Double32_t fPID[AliPID::kSPECIES]; // PID probabilities Double32_t fBudget[3]; // Integrated material budget Double32_t fDE; // Integrated delta energy Double32_t fTruncatedMean; // Truncated mean Int_t fNchamberdEdx; // number of chambers used in calculating truncated mean Int_t fNclusterdEdx; // number of clusters used in calculating truncated mean Int_t fNdEdxSlices; // number of "physics slices" fill via AliTRDPIDResponse const AliTRDReconstructor *fkReconstructor;//! reconstructor link AliTRDtrackV1 *fBackupTrack; //! Backup track AliTRDseedV1 *fTracklet[kNplane]; // Tracklets array defining the track AliExternalTrackParam *fTrackLow; // parameters of the track which enter TRD from below (TPC) AliExternalTrackParam *fTrackHigh; // parameters of the track which enter TRD from above (HMPID, PHOS) ClassDef(AliTRDtrackV1, 8) // TRD track - tracklet based }; //____________________________________________________ inline Float_t AliTRDtrackV1::GetMomentum(Int_t plane) const { // Return ESD momentum stored in the tracklet reconstructed in layer = "plane". // By default returns the ESD momentum in first tracklet attached to track if(plane==-1){ for(Int_t i(0); iGetMomentum(); } } else if( plane >=0 && plane < kNplane){ if(fTracklet[plane]) return fTracklet[plane]->GetMomentum(); } return -1.; } //____________________________________________________ inline Int_t AliTRDtrackV1::GetNCross() { Int_t ncross = 0; for(Int_t ip=0; ipIsRowCross(); } return ncross; } //____________________________________________________ inline Int_t AliTRDtrackV1::GetNumberOfTracklets() const { Int_t n = 0; for(Int_t ip=0; ip=-1 && ly>((ly+1)*4))&0xf; return kUnknown; } //____________________________________________________ inline Bool_t AliTRDtrackV1::IsTrackError(ETRDtrackError error, UInt_t status) { return (status&0xf)==UChar_t(error); } //____________________________________________________ inline Bool_t AliTRDtrackV1::IsLayerError(ETRDlayerError error, Int_t ly, UInt_t status) { if(ly>=kNplane || ly<0) return kFALSE; return ((status>>((ly+1)*4))&0xf) == UChar_t(error); } //____________________________________________________ inline void AliTRDtrackV1::SetReconstructor(const AliTRDReconstructor *rec) { for(Int_t ip=0; ipSetReconstructor(rec); } fkReconstructor = rec; } //____________________________________________________ inline void AliTRDtrackV1::SetErrStat(UChar_t status, Int_t ly) { if(lyGetN() / 20.0); res *= (0.25 + 0.8 * 40.0 / (40.0 + fBudget[2])); return res; } #endif