00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <Stiostream.h>
00030 #include "StProbPidTraits.h"
00031 #include "StParticleTypes.hh"
00032 #include "TMath.h"
00033 ClassImp(StProbPidTraits)
00034
00035 static const char rcsid[] = "$Id: StProbPidTraits.cxx,v 2.5 2004/07/21 14:09:57 fisyak Exp $";
00036 StParticleDefinition *StProbPidTraits::mPidParticleDefinitions[KPidParticles] = {
00037 StElectron::instance(),
00038 StProton::instance(),
00039 StKaonMinus::instance(),
00040 StPionMinus::instance(),
00041 StMuonMinus::instance(),
00042 StDeuteron::instance(),
00043 StTriton::instance(),
00044 StHe3::instance(),
00045 StAlpha::instance()
00046 };
00047
00048
00049 StProbPidTraits::StProbPidTraits(const Int_t NDF, const StDetectorId Id, const StPidParticle N,
00050 const Float_t *PidArray, Double_t *Fractions) :
00051 StTrackPidTraits(Id), mNDF(NDF), mSum(0), mFractions(Fractions) {
00052 if (PidArray) mPidArray = new TArrayF(N,PidArray);
00053 else mPidArray = new TArrayF(N);
00054 }
00055
00056
00057 StProbPidTraits::~StProbPidTraits() { delete mPidArray;}
00058
00059
00060 Double_t StProbPidTraits::GetProbability(Int_t PartId) {
00061 if (mSum > 0) return mProbability[PartId];
00062 Int_t N = mPidArray->GetSize();
00063 mSum = 0;
00064 memset(&mProbability[0],0,KPidParticles*sizeof(Double_t));
00065 const Float_t *Array = mPidArray->GetArray();
00066 Int_t i;
00067 for (i=kPidElectron; i< N; i++) {
00068 if (mFractions)
00069 mProbability[i] = TMath::Exp(-Array[i]/2.)*mFractions[i];
00070 else
00071 mProbability[i] = TMath::Exp(-Array[i]/2.);
00072 mSum += mProbability[i];
00073 }
00074 if (mSum > 0) for (i=kPidElectron; i< N; i++) mProbability[i] /= mSum;
00075 return mSum > 0 ? mProbability[PartId] : 0;
00076 }
00077
00078 Double_t StProbPidTraits::GetChi2Prob(Int_t k) const {
00079 if (mNDF < 1 || ! mPidArray ) return -1;
00080 Int_t N = mPidArray->GetSize();
00081 if (k >= N) return -1;
00082 const Float_t *Array = mPidArray->GetArray();
00083 return TMath::Prob(Array[k],mNDF);
00084 }
00085
00086 void StProbPidTraits::Print(Option_t *opt) const {
00087 StProbPidTraits *This = (StProbPidTraits *) this;
00088 Int_t N = mPidArray->GetSize();
00089 const Float_t *Array = mPidArray->GetArray();
00090 Int_t i;
00091 cout << "\tNDF = \t" << mNDF << endl;
00092 for (i = kPidElectron; i < N; i++) {
00093 cout << "Particle : \t" << mPidParticleDefinitions[i]->name();
00094 if (mFractions) cout << "\tFraction : \t" << mFractions[i];
00095 cout << "\tProbability :\t" << This->GetProbability(i)
00096 << "\tChisq :\t" << Array[i];
00097 if (mNDF > 0) cout << "\t Chisq Prob:\t" << GetChi2Prob(i);
00098 cout << endl;
00099 }
00100 }