27 const Int_t kMAXP = 18;
29 ClassImp(TGenPhaseSpace);
34 Double_t TGenPhaseSpace::PDK(Double_t a, Double_t b, Double_t c)
36 Double_t x = (a-b-c)*(a+b+c)*(a-b+c)*(a+b-c);
37 x = TMath::Sqrt(x)/(2*a);
44 Int_t DoubleMax(
const void *a,
const void *b)
46 Double_t aa = * ((Double_t *) a);
47 Double_t bb = * ((Double_t *) b);
48 if (aa > bb)
return 1;
49 if (aa < bb)
return -1;
57 TGenPhaseSpace::TGenPhaseSpace(
const TGenPhaseSpace &gen) : TObject(gen)
61 fTeCmTm = gen.fTeCmTm;
62 fBeta[0] = gen.fBeta[0];
63 fBeta[1] = gen.fBeta[1];
64 fBeta[2] = gen.fBeta[2];
65 for (Int_t i=0;i<fNt;i++) {
66 fMass[i] = gen.fMass[i];
67 fDecPro[i] = gen.fDecPro[i];
75 TGenPhaseSpace& TGenPhaseSpace::operator=(
const TGenPhaseSpace &gen)
77 TObject::operator=(gen);
80 fTeCmTm = gen.fTeCmTm;
81 fBeta[0] = gen.fBeta[0];
82 fBeta[1] = gen.fBeta[1];
83 fBeta[2] = gen.fBeta[2];
84 for (Int_t i=0;i<fNt;i++) {
85 fMass[i] = gen.fMass[i];
86 fDecPro[i] = gen.fDecPro[i];
98 Double_t TGenPhaseSpace::Generate()
104 for (n=1; n<fNt-1; n++) rno[n]=gRandom->Rndm();
105 qsort(rno+1 ,fNt-2 ,
sizeof(Double_t) ,DoubleMax);
109 Double_t invMas[kMAXP], sum=0;
110 for (n=0; n<fNt; n++) {
112 invMas[n] = rno[n]*fTeCmTm + sum;
120 for (n=0; n<fNt-1; n++) {
121 pd[n] = PDK(invMas[n+1],invMas[n],fMass[n+1]);
128 fDecPro[0].SetPxPyPzE(0, pd[0], 0 , TMath::Sqrt(pd[0]*pd[0]+fMass[0]*fMass[0]) );
133 fDecPro[i].SetPxPyPzE(0, -pd[i-1], 0 , TMath::Sqrt(pd[i-1]*pd[i-1]+fMass[i]*fMass[i]) );
135 Double_t cZ = 2*gRandom->Rndm() - 1;
136 Double_t sZ = TMath::Sqrt(1-cZ*cZ);
137 Double_t angY = 2*TMath::Pi() * gRandom->Rndm();
138 Double_t cY = TMath::Cos(angY);
139 Double_t sY = TMath::Sin(angY);
140 for (j=0; j<=i; j++) {
141 TLorentzVector *v = fDecPro+j;
142 Double_t x = v->Px();
143 Double_t y = v->Py();
144 v->SetPx( cZ*x - sZ*y );
145 v->SetPy( sZ*x + cZ*y );
147 Double_t z = v->Pz();
148 v->SetPx( cY*x - sY*z );
149 v->SetPz( sY*x + cY*z );
152 if (i == (fNt-1))
break;
154 Double_t beta = pd[i] / sqrt(pd[i]*pd[i] + invMas[i]*invMas[i]);
155 for (j=0; j<=i; j++) fDecPro[j].Boost(0,beta,0);
162 for (n=0;n<fNt;n++) fDecPro[n].Boost(fBeta[0],fBeta[1],fBeta[2]);
173 TLorentzVector *TGenPhaseSpace::GetDecay(Int_t n)
192 Bool_t TGenPhaseSpace::SetDecay(TLorentzVector &P, Int_t nt,
193 const Double_t *mass, Option_t *opt)
197 if (fNt<2 || fNt>18)
return kFALSE;
203 for (n=0;n<fNt;n++) {
208 if (fTeCmTm<=0)
return kFALSE;
215 if (strcasecmp(opt,
"fermi")==0) {
218 ,3.141592, 19.73921, 62.01255, 129.8788, 204.0131
219 ,256.3704, 268.4705, 240.9780, 189.2637
220 ,132.1308, 83.0202, 47.4210, 24.8295
221 ,12.0006, 5.3858, 2.2560, 0.8859 };
222 fWtMax = TMath::Power(fTeCmTm,fNt-2) * ffq[fNt-1] / P.Mag();
225 Double_t emmax = fTeCmTm + fMass[0];
228 for (n=1; n<fNt; n++) {
231 wtmax *= PDK(emmax, emmin, fMass[n]);
240 Double_t w = P.Beta()/P.Rho();
245 else fBeta[0]=fBeta[1]=fBeta[2]=0;