00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef KFParticleBASE_H
00018 #define KFParticleBASE_H
00019 #include "TObject.h"
00020 class KFParticleBase : public TObject {
00021 public:
00022
00023
00024 virtual void GetFieldValue(const Double_t xyz[], Double_t B[]) const = 0;
00025
00026
00027
00028
00029
00030
00031 virtual Double_t GetDStoPoint( const Double_t xyz[] ) const = 0;
00032
00033 virtual void GetDStoParticle( const KFParticleBase &p,
00034 Double_t &DS, Double_t &DSp ) const = 0;
00035
00036 virtual void Transport( Double_t dS, Double_t P[], Double_t C[] ) const = 0;
00037 KFParticleBase();
00038 virtual ~KFParticleBase() {}
00039
00040
00041 void Initialize( const Double_t Param[], const Double_t Cov[], Int_t Charge, Double_t Mass );
00042
00043 void Initialize();
00044
00045 void SetVtxGuess( Double_t x, Double_t y, Double_t z );
00046 void SetID(Int_t id=0) {fID = id;}
00047
00048 Int_t GetID() const {return fID;}
00049 Double_t GetX () const { return fP[0]; }
00050 Double_t GetY () const { return fP[1]; }
00051 Double_t GetZ () const { return fP[2]; }
00052 Double_t GetPx () const { return fP[3]; }
00053 Double_t GetPy () const { return fP[4]; }
00054 Double_t GetPz () const { return fP[5]; }
00055 Double_t GetE () const { return fP[6]; }
00056 Double_t GetS () const { return fP[7]; }
00057 Int_t GetQ () const { return fQ; }
00058 Double_t GetChi2 () const { return fChi2; }
00059 Int_t GetNDF () const { return fNDF; }
00060
00061 Double_t GetParameter ( Int_t i ) const { return fP[i]; }
00062 Double_t GetCovariance( Int_t i ) const { return fC[i]; }
00063 Double_t GetCovariance( Int_t i, Int_t j ) const { return fC[IJ(i,j)]; }
00064
00065
00066
00067
00068 Int_t GetMomentum ( Double_t &P, Double_t &SigmaP ) const ;
00069 Int_t GetPt ( Double_t &Pt, Double_t &SigmaPt ) const ;
00070 Int_t GetEta ( Double_t &Eta, Double_t &SigmaEta ) const ;
00071 Int_t GetPhi ( Double_t &Phi, Double_t &SigmaPhi ) const ;
00072 Int_t GetMass ( Double_t &M, Double_t &SigmaM ) const ;
00073 Int_t GetDecayLength ( Double_t &L, Double_t &SigmaL ) const ;
00074 Int_t GetDecayLengthXY ( Double_t &L, Double_t &SigmaL ) const ;
00075 Int_t GetLifeTime ( Double_t &T, Double_t &SigmaT ) const ;
00076 Int_t GetR ( Double_t &R, Double_t &SigmaR ) const ;
00077
00078
00079
00080
00081
00082 Double_t & X () { return fP[0]; }
00083 Double_t & Y () { return fP[1]; }
00084 Double_t & Z () { return fP[2]; }
00085 Double_t & Px () { return fP[3]; }
00086 Double_t & Py () { return fP[4]; }
00087 Double_t & Pz () { return fP[5]; }
00088 Double_t & E () { return fP[6]; }
00089 Double_t & S () { return fP[7]; }
00090 Int_t & Q () { return fQ; }
00091 Double_t & Chi2 () { return fChi2; }
00092 Int_t & NDF () { return fNDF; }
00093
00094 Double_t & Parameter ( Int_t i ) { return fP[i]; }
00095 Double_t & Covariance( Int_t i ) { return fC[i]; }
00096 Double_t & Covariance( Int_t i, Int_t j ) { return fC[IJ(i,j)]; }
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 void operator +=( const KFParticleBase &Daughter );
00108
00109
00110
00111 void AddDaughter( const KFParticleBase &Daughter );
00112
00113
00114
00115 void SetProductionVertex( const KFParticleBase &Vtx );
00116
00117
00118
00119 void SetMassConstraint( Double_t Mass, Double_t SigmaMass = 0 );
00120
00121
00122
00123 void SetNoDecayLength();
00124
00125
00126
00127
00128 void Construct( const KFParticleBase *vDaughters[], Int_t NDaughters,
00129 const KFParticleBase *ProdVtx=0, Double_t Mass=-1, Bool_t IsConstrained=0 );
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 void TransportToDecayVertex();
00143
00144
00145
00146 void TransportToProductionVertex();
00147
00148
00149
00150 void TransportToDS( Double_t dS );
00151
00152
00153
00154 Double_t GetDStoPointBz( Double_t Bz, const Double_t xyz[] ) const;
00155
00156 void GetDStoParticleBz( Double_t Bz, const KFParticleBase &p,
00157 Double_t &dS, Double_t &dS1 ) const ;
00158
00159
00160
00161 void TransportBz( Double_t Bz, Double_t dS, Double_t P[], Double_t C[] ) const;
00162 void TransportCBM( Double_t dS, Double_t P[], Double_t C[] ) const;
00163
00164
00165
00166
00167
00168
00169
00170
00171 Double_t GetDistanceFromVertex( const Double_t vtx[] ) const;
00172 Double_t GetDistanceFromVertex( const KFParticleBase &Vtx ) const;
00173 Double_t GetDistanceFromParticle( const KFParticleBase &p ) const;
00174
00175
00176
00177
00178 Double_t GetDeviationFromVertex( const Double_t v[],
00179 const Double_t Cv[]=0 ) const;
00180 Double_t GetDeviationFromVertex( const KFParticleBase &Vtx ) const;
00181 Double_t GetDeviationFromParticle( const KFParticleBase &p ) const;
00182
00183
00184
00185 void SubtractFromVertex( KFParticleBase &Vtx ) const ;
00186
00187
00188
00189 void ConstructGammaBz( const KFParticleBase &daughter1,
00190 const KFParticleBase &daughter2, Double_t Bz );
00191 virtual void Print(Option_t *opt="") const;
00192 Int_t IdTruth() const { return fIdTruth;}
00193 Int_t QaTruth() const { return fQuality; }
00194 Int_t IdParentVx() const {return fIdParentVx;}
00195
00196 void SetIdTruth(Int_t idtru,Int_t qatru=0) {fIdTruth = (UShort_t) idtru; fQuality = (UShort_t) qatru;}
00197 void SetIdParentVx(Int_t id) {fIdParentVx = id;}
00198 protected:
00199
00200 static Int_t IJ( Int_t i, Int_t j ){
00201 return ( j<=i ) ? i*(i+1)/2+j :j*(j+1)/2+i;
00202 }
00203
00204 Double_t & Cij( Int_t i, Int_t j ){ return fC[IJ(i,j)]; }
00205
00206 void Convert( Bool_t ToProduction );
00207 void TransportLine( Double_t S, Double_t P[], Double_t C[] ) const ;
00208 Double_t GetDStoPointLine( const Double_t xyz[] ) const;
00209
00210 static Bool_t InvertSym3( const Double_t A[], Double_t Ainv[] );
00211
00212 static void MultQSQt( const Double_t Q[], const Double_t S[],
00213 Double_t SOut[] );
00214
00215 static Double_t GetSCorrection( const Double_t Part[], const Double_t XYZ[] );
00216
00217 void GetMeasurement( const Double_t XYZ[], Double_t m[], Double_t V[] ) const ;
00218
00219 Int_t fID;
00220 Double_t fP[8];
00221 Double_t fC[36];
00222 Int_t fQ;
00223 Int_t fNDF;
00224 Double_t fChi2;
00225
00226 Double_t fSFromDecay;
00227
00228 Bool_t fAtProductionVertex;
00229
00230
00231 Double_t fVtxGuess[3];
00232
00233
00234 Bool_t fIsLinearized;
00235 UShort_t fIdTruth;
00236 UShort_t fQuality;
00237 Int_t fIdParentVx;
00238
00239 ClassDef(KFParticleBase,1)
00240 };
00241 ostream& operator<<(ostream& os, KFParticleBase const & particle);
00242 #endif