#ifndef ALIITSUSEED_H #define ALIITSUSEED_H #include "AliExternalTrackParam.h" #include "AliITSUAux.h" class AliESDtrack; using namespace AliITSUAux; class AliITSUSeed: public AliExternalTrackParam { public: enum {kKilled=BIT(14),kSave=BIT(15),kMark=BIT(16),kFake=BIT(17)}; enum {kF02,kF04,kF12,kF13,kF14,kF24, kF44,kNFElem}; // non-trivial elems of propagation matrix enum {kK00,kK01,kK10,kK11,kK20,kK21,kK30,kK31,kK40,kK41, kNKElem}; // non-trivial elems of gain matrix enum {kS00,kS10,kS11,kS20,kS21,kS22,kS30,kS31,kS32,kS33,kS40,kS41,kS42,kS43,kS44,kNSElem}; // elements of 5x5 sym matrix enum {kR00,kR22,kNRElem}; // non trivial elements of rotation matrix // AliITSUSeed(); AliITSUSeed(const AliITSUSeed& src); AliITSUSeed &operator=(const AliITSUSeed &src); virtual ~AliITSUSeed(); virtual void Print(Option_t* option = "") const; // void SetLrClusterID(Int_t lr, Int_t cl); void SetLr(Int_t lr) {SetLrClusterID(lr,-1);} // lr w/o cluster void SetLrClusterID(UInt_t id) {fClID = id;} void SetParent(TObject* par) {fParent = par;} void SetChi2Cl(Double_t v) {fChi2Cl= v; v>0 ? fChi2Glo+=v : fChi2Penalty -= v;} void Kill(Bool_t v=kTRUE) {SetBit(kKilled, v);} void SetFake(Bool_t v=kTRUE) {SetBit(kFake, v);} void Save(Bool_t v=kTRUE) {SetBit(kSave,v);} void SetMark(Bool_t v=kTRUE) {SetBit(kMark,v);} void FlagTree(UInt_t bits, Bool_t v=kTRUE); void SetChi2ITSTPC(Float_t v) {fChi2Match = v;} void SetChi2ITSSA(Float_t v) {fChi2ITSSA = v;} // UInt_t GetLrClusterID() const {return fClID;} Int_t GetLrCluster(Int_t &lr) const {return UnpackCluster(fClID,lr);} Int_t GetLayerID() const {return UnpackLayer(fClID);} Int_t GetClusterID() const {return UnpackCluster(fClID);} Bool_t HasClusterOnLayer(Int_t lr) const {return fHitsPattern&(0x1<0) or penalty for missing cluster (if < 0) Float_t fChi2Penalty; // total penalty (e.g. for missing clusters) Float_t fChi2Match; // ITS/TPC matching chi2 (per NDF) // RS: to move to separate object of final seed Float_t fChi2ITSSA; // ITSSA backward fit chi2 (per NDF) // RS: to move to separate object of final seed Double_t fFMatrix[kNFElem]; // matrix of propagation from prev layer (non-trivial elements) Double_t fKMatrix[kNKElem]; // Gain matrix non-trivial elements (note: standard MBF formula uses I-K*H) Double_t fRMatrix[kNRElem]; // rotation matrix non-trivial elements Double_t fCovIYZ[3]; // inverted matrix of propagation + meas errors = [Hi * Pi|i-1 * Hi^T + Ri]^-1 Double_t fResid[2]; // residuals vector TObject* fParent; // parent track (in higher tree hierarchy) // #ifdef _ITSU_TUNING_MODE_ // this is used only for tuning histo filling UShort_t fOrdBranch; //! order in the seed branching UShort_t fOrdCand; //! order in candidates tree #endif // ClassDef(AliITSUSeed,1) }; //_________________________________________________________________________ inline void AliITSUSeed::SetLrClusterID(Int_t lr, Int_t cl) { // assign layer, cluster (if -1 - no hit on this layer) fClID = PackCluster(lr,cl); if (cl>=0) fHitsPattern |= 0x1<GetLayerID())>=0 ) { if (lrt==lr) break; par = dynamic_cast(par->GetParent()); } return par; } //__________________________________________________________________ inline Int_t AliITSUSeed::GetNClusters() const { // count number of clusters (some layers may have >1 hit) int ncl = 0; const AliITSUSeed* seed = this; while(seed) { if (seed->HasCluster()) ncl++; seed = (AliITSUSeed*)seed->GetParent(); } return ncl; // } //__________________________________________________________________ inline void AliITSUSeed::FlagTree(UInt_t bits, Bool_t v) { // set bits on all tree levels AliITSUSeed* seed = this; do {seed->SetBit(bits,v);} while ( (seed=(AliITSUSeed*)seed->GetParent()) ); // } //__________________________________________________________________ inline Float_t AliITSUSeed::GetQualityVar() const { // return variable for quality check (the smaller - the better) // return GetChi2ITSSA()/Pt(); // this may change! RS return GetChi2GloNrm()/Pt(); } #endif