4 #include "MicroStat/mdweight.h"
6 #include "KVNucleusEvent.h"
20 Double_t mdweight::edist(Double_t* arg, Double_t* par)
28 Double_t massRat = par[1];
31 if ((e > 0) && (e * massRat < 1) && (N > 2)) {
32 val = TMath::Sqrt(e) * TMath::Power(1. - massRat * e, (3.*N - 8.) / 2.);
43 TF1* mdweight::getKEdist(Int_t N, Double_t R)
48 TString fn = Form(
"fKE_N%d_R%f", N, R);
51 f =
new TF1(
"mdweight::SPKEDist", mdweight::edist, 0, 1, 2);
53 f->SetParameters((Double_t)N, R);
77 if (abs(par[0] - par[1]) < 1.e-6)
return par[1];
81 double cosTheta = x[0];
82 double alpha = TMath::Pi() * cosTheta;
83 return (a - b) / 2.*(1. - TMath::Cos(alpha)) + b;
94 log2pi = TMath::Log(TMath::TwoPi());
95 log10twelve = TMath::Log(1e+12);
127 setAvailableEnergy(0.);
131 setAvailableEnergy(E);
133 Double_t logmass_sum, mass_sum;
134 logmass_sum = mass_sum = 0.;
136 Double_t m = n.GetMass();
137 logmass_sum += TMath::Log(m);
140 A = (3 * (N - 1) / 2.) * log2pi - TMath::LnGamma(3 * (N - 1) / 2.)
141 + 1.5 * (logmass_sum - TMath::Log(mass_sum));
142 B = (3 * N - 5) / 2.;
144 Double_t w = TMath::Exp((A + B * TMath::Log(E)) - log10twelve);
161 for (
auto& e :
EventIterator(partition)) massTot0 += e.GetMass();
196 Double_t mPart = part->
GetMass();
197 Double_t rR = mPart / massTot;
199 if (rR < 1.) ratio = 1. / (1. - rR);
202 Double_t ppx, ppy, ppz;
208 ec = eDisp * getKEdist(N, ratio)->GetRandom();
209 p = sqrt(2.*mPart * ec);
213 p = sqrt(2.*(massTot - mPart) * mPart * eDisp / massTot);
214 ec = p * p / 2. / mPart;
216 Double_t ct = fCosTheta.GetRandom(-1, 1);
217 Double_t st = TMath::Sqrt(1. - ct * ct);
218 Double_t phi = gRandom->Rndm() * 2.*TMath::Pi();
220 ppx = st * TMath::Cos(phi) * p;
221 ppy = st * TMath::Sin(phi) * p;
Class for iterating over nuclei in events accessed through base pointer/reference.
Abstract base class container for multi-particle events.
virtual Int_t GetMult(Option_t *opt="") const
Description of properties and kinematics of atomic nuclei.
void SetMomentum(const TVector3 &v)
void Add(TObject *obj) override
TObject * FindObject(const char *name) const override
void SetOwner(Bool_t enable=kTRUE) override
Double_t GetAvailableEnergy() const
Calculate molecular dynamics ensemble weights for events .
void resetGenerateEvent()
void initGenerateEvent(KVEvent *partition)
virtual void SetWeight(KVEvent *e, Double_t E)
virtual ~mdweight()
Destructor.
virtual void nextparticleGenerateEvent(Int_t, KVNucleus *)
void SetAnisotropy(double a, double b)
double CosThetaDist(double *x, double *par)