Pluto v6.3.0
Loading...
Searching...
No Matches
PFermiDistributions.cc
Go to the documentation of this file.
1/**************************************************
2** This class is licensed under LGPL **
3** - free for personal and commercional use - **
4** **
5** --------------------------------------- **
6** Defining the fermi motion distributions **
7** --------------------------------------- **
8** **
9** Author: L. Witthauer & M. Dieterle 2009 **
10** Version 1.0 **
11** **
12**************************************************/
13
14#include "PFermiDistributions.h"
15
16//------------------------------------------------------------------------
17
19
20PFermiDistributions::PFermiDistributions(const Char_t *id, const Char_t *de, Int_t key) :
21 PChannelModel(id, de, key) {
22
23 DeutC = new double[13];
24 DeutD = new double[13];
25 DeutM2 = new double[13];
26
27 TString Target(makeStaticData()->GetParticleName(is_pid));
28 Double_t target_mass = makeStaticData()->GetParticleMass(is_pid);
29
30#if 1
31 Target.ToUpper();
32
33
34 if (Target == "D") {
35 SetDeuteronValues();
36 version_flag = NUCLEAR_FERMI_D;
37 // FM = new TF1("FM",PFermiDistributions::FermiDisD, 0.,1.,2);
38 MeV2GeV = 1.;
39 } else if (Target == "HE3") {
40 version_flag = NUCLEAR_FERMI_3HE;
41 //FM = new TF1("FM",PFermiDistributions::FermiDis3He, 0.,1000.,2);
42 MeV2GeV = 0.001;
43 } else if (Target == "ALPHA") {
44 version_flag = NUCLEAR_FERMI_4HE;
45 //FM = new TF1("FM",PFermiDistributions::FermiDis4He, 0.,1.,1);
46 MeV2GeV = 1.;
47 } else if (Target == "7LI") {
48 version_flag = NUCLEAR_FERMI_7LI;
49 //FM = new TF1("FM",PFermiDistributions::FermiDis7Li, 0.,1000.,3);
50 MeV2GeV = 0.001;
51 } else if (Target == "12C") {
52 version_flag = NUCLEAR_FERMI_12C;
53 //FM = new TF1("FM",PFermiDistributions::FermiDis12C,0.,1000.,2);
54 MeV2GeV = 0.001;
55 } else if (Target == "40CA" || Target == "93NB" || Target == "208PB") {
56 version_flag = NUCLEAR_FERMI_40CA;
57 //FM = new TF1("FM",PFermiDistributions::FermiDis40Ca,0.,1000.,2);
58 MeV2GeV = 0.001;
59 } else if (target_mass > 0.5*(makeStaticData()->GetParticleMass("40Ca")
60 +makeStaticData()->GetParticleMass("12C"))) {
61 Warning("SetTargetMaterial","Target Material %s not found, assuming 40Ca",
62 makeStaticData()->GetParticleName(is_pid));
63 version_flag = NUCLEAR_FERMI_40CA;
64 MeV2GeV = 0.001;
65 } else if (target_mass > 0.5*(makeStaticData()->GetParticleMass("7Li")
66 +makeStaticData()->GetParticleMass("12C"))) {
67 Warning("SetTargetMaterial","Target Material %s not found, assuming 12C",
68 makeStaticData()->GetParticleName(is_pid));
69 version_flag = NUCLEAR_FERMI_12C;
70 MeV2GeV = 0.001;
71 } else if (target_mass > 0.5*(makeStaticData()->GetParticleMass("7Li")
72 +makeStaticData()->GetParticleMass("alpha"))) {
73 Warning("SetTargetMaterial","Target Material %s not found, assuming 7Li",
74 makeStaticData()->GetParticleName(is_pid));
75 version_flag = NUCLEAR_FERMI_7LI;
76 MeV2GeV = 0.001;
77 } else {
78 version_flag = 0;
79 Error("SetTargetMaterial","Target Material not found");
80 }
81#endif
82};
83
84
86 return new PFermiDistributions((const PFermiDistributions &)* this);
87};
88
90 // delete FM;
91 delete [] DeutC;
92 delete [] DeutD;
93 delete [] DeutM2;
94};
95
96Double_t PFermiDistributions::EvalPar(const double *x, const double *) {
97 return Eval(x[0]);
98}
99
100Double_t PFermiDistributions::Eval(Double_t x, Double_t, Double_t, Double_t) const {
101 // Returns connected fermi distribution
102
103 Double_t p = x/MeV2GeV;
104 if (version_flag == NUCLEAR_FERMI_D)
105 return FermiDisD(&p, NULL);
106 else if (version_flag == NUCLEAR_FERMI_3HE)
107 return FermiDis3He(&p, NULL);
108 else if (version_flag == NUCLEAR_FERMI_4HE)
109 return FermiDis4He(&p, NULL);
110 else if (version_flag == NUCLEAR_FERMI_7LI)
111 return FermiDis7Li(&p, NULL);
112 else if (version_flag == NUCLEAR_FERMI_12C)
113 return FermiDis12C(&p, NULL);
114 else if (version_flag == NUCLEAR_FERMI_40CA)
115 return FermiDis40Ca(&p, NULL);
116 return 0.;
117}
118
119
120//---------------------- Fermi Distribution of Deuteron -----------------------
121double PFermiDistributions::FermiDisD(double *x, double *) const {
122
123 const double pi = 3.1415927;
124 const double hbar = 0.197463569747999998; // unit: GeV*fm/c
125 double par0 = 0.;
126 double par1 = 0.;
127 for (int j=0; j<13; j++) {
128 par0 += DeutC[j]/(x[0]*x[0]/(hbar*hbar) + DeutM2[j]);
129 par1 += DeutD[j]/(x[0]*x[0]/(hbar*hbar) + DeutM2[j]);
130 }
131 par0 = TMath::Sqrt(2./pi)*par0;
132 par1 = TMath::Sqrt(2./pi)*par1;
133 Double_t mom = (par0*par0+par1*par1)*x[0]*x[0]/(hbar*hbar);
134
135 return mom;
136}
137
138//---------------------- Fermi Distribution of Helium-3 ---------------------
139double PFermiDistributions::FermiDis3He(double *x, double *) const {
140
141 const double pi = 3.1415927;
142 const double a = 7.09078;
143 const double b = 5.38753;
144 const double c = 9.90202;
145 const double d = 0.779408;
146
147 Double_t par0 = (4./TMath::Sqrt(pi))*TMath::Power(a,3./2.);
148 Double_t par1 = x[0]*x[0]*25./(1.E6);
149 Double_t mom = d*par0*par1*(TMath::Exp(-par1*a) + c*TMath::Exp(-TMath::Sqrt(par1)*b));
150
151 return mom;
152}
153
154//---------------------- Fermi Distribution of Helium-4 ---------------------
155double PFermiDistributions::FermiDis4He(double *x, double *) const {
156
157 const double hbar = 0.197463569747999998;
158 const double a = 0.7352;
159 const double b = 0.05511;
160
161 Double_t par0 = TMath::Exp(-x[0]*x[0]/(hbar*hbar*a));
162 Double_t mom = x[0]*x[0]/(hbar*hbar*b)*par0;
163
164 return mom;
165}
166
167//---------------------- Fermi Distribution of Lithium-7 ---------------------
168double PFermiDistributions::FermiDis7Li(double *x, double *) const {
169
170 const double a = 1.2e-4;
171 const double b = 6.87e-3;
172 const double c = 110.;
173
174 Double_t par0 = x[0]*x[0]*a;
175 Double_t par1 = (1. + b*x[0]);
176 Double_t par2 = x[0]/c;
177 Double_t mom = par0*par1*TMath::Exp(-par2*par2);
178
179 return mom;
180}
181
182//---------------------- Fermi Distribution of Carbon-12 ---------------------
183double PFermiDistributions::FermiDis12C(double *x, double *) const {
184
185 const double pi = 3.1415927;
186 const double a = 1/0.416;
187 const double b = 1/0.23;
188 const double c = 0.04;
189
190 Double_t par0 = (4./TMath::Sqrt(pi))*TMath::Power(a,3./2.);
191 Double_t par1 = x[0]*x[0]*25./(1.E6);
192 Double_t mom = par0*par1*(TMath::Exp(-par1*a) + c*TMath::Exp(-TMath::Sqrt(par1)*b));
193
194 return mom;
195}
196
197//---- Fermi Distribution of Calcium-40 (can be used for heavier nuclei) -----------------
198double PFermiDistributions::FermiDis40Ca( double *x, double *) const {
199
200 const double pi = 3.1415927;
201 const double a = 1/0.42;
202 const double b = 1/0.23;
203 const double c = 0.04;
204
205 Double_t par0 = (4./TMath::Sqrt(pi))*TMath::Power(a,3./2.);
206 Double_t par1 = x[0]*x[0]*25./(1.E6);
207 Double_t mom = par0*par1*(TMath::Exp(-par1*a) + c*TMath::Exp(-TMath::Sqrt(par1)*b));
208
209 return mom;
210}
211
212//------ Calculate Values for Deuteron Wave Function ----------------
213void PFermiDistributions::SetDeuteronValues( ) {
214
215 const double alpha = 0.23162461; // unit: 1/fm
216 const double mZero = 1.; // unit: 1/fm
217 double cj[13]={ 0.88688076E0, // unit: 1/sqrt(fm)
218 -0.34717093E0,
219 -0.30502380E1,
220 0.56207766E2,
221 -0.74957334E3,
222 0.53365279E4,
223 -0.22706863E5,
224 0.60434469E5,
225 -0.10292058E6,
226 0.11223357E6,
227 -0.75925226E5,
228 0.29059715E5,
229 0.0};
230 double dj[13]={ 0.23135193E-1, // unit: 1/sqrt(fm)
231 -0.85604572E0,
232 0.56068193E1,
233 -0.69462922E2,
234 0.41631118E3,
235 -0.12546621E4,
236 0.12387830E4,
237 0.33739172E4,
238 -0.13041151E5,
239 0.19512524E5,
240 0.0,
241 0.0,
242 0.0};
243 double sum1 = 0.;
244 double sum2 = 0.;
245 double sum3 = 0.;
246 double rtmp;
247 double mj[13];
248 double mj2[13];
249 int n;
250 int n1;
251 int n2;
252 int temp;
253
254 for (int j=0; j<13; j++) {
255 mj[j] = alpha + j*mZero;
256 mj2[j] = mj[j]*mj[j];
257 }
258
259 cj[12] = 0.;
260 for (int i=0; i<12; i++)
261 cj[12] = cj[12] - cj[i];
262
263 for (int k=0; k<5; k++) {
264 rtmp = dj[k*2]/mj2[k*2] + dj[k*2+1]/mj2[k*2+1];
265 sum1 = sum1 + rtmp;
266 rtmp = dj[k*2] + dj[k*2+1];
267 sum2 = sum2 + rtmp;
268 rtmp = dj[k*2]*mj2[k*2] + dj[k*2+1]*mj2[k*2+1];
269 sum3 = sum3 + rtmp;
270 }
271
272 n = 12;
273 n1 = 11;
274 n2 = 10;
275
276 for (int l=0; l<3; l++) {
277 dj[n2] = -mj2[n1]*mj2[n]*sum1 + (mj2[n1]+mj2[n])*sum2 - sum3;
278 dj[n2] = dj[n2] * mj2[n2]/(mj2[n]-mj2[n2])/(mj2[n1]-mj2[n2]);
279
280 temp = n2;
281 n2 = n1;
282 n1 = n;
283 n = temp;
284 }
285
286 for (int j=0; j<13; j++) {
287 DeutC[j] = cj[j];
288 DeutD[j] = dj[j];
289 DeutM2[j] = mj2[j];
290 }
291}
292
293
294//-----------------------------------------------------------------------
296
ClassImp(PFermiDistributions)
#define NUCLEAR_FERMI_40CA
#define NUCLEAR_FERMI_D
#define NUCLEAR_FERMI_12C
#define NUCLEAR_FERMI_3HE
#define NUCLEAR_FERMI_7LI
#define NUCLEAR_FERMI_4HE
PStaticData * makeStaticData()
PParticle * d
PParticle * par2[3]
virtual Double_t EvalPar(const Double_t *x, const Double_t *params)
PDistribution * Clone(const char *delme=NULL) const
virtual Double_t Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) const
double GetParticleMass(const int &id)
PChannel * c[]
PParticle * p
Definition dp_mult.C:24
Int_t n
Definition etap+omeg.C:21
PCommandList * l
PParticle * n1
PParticle * n2
PParticle * pi