ROOTPWA
pputil.cc
Go to the documentation of this file.
1 #include <cstdlib>
2 
3 #include "pputil.h"
4 
5 
6 using namespace std;
7 
8 
9 complex<double>
10 D(const double alpha,
11  const double beta,
12  const double gamma,
13  const int j,
14  const int m,
15  const int n)
16 {
17  const complex<double> i(0, 1);
18  const complex<double> c = exp(-i * ((m / 2.0) * alpha + (n / 2.0) * gamma) ) * d_jmn_b(j, m, n, beta);
19  return c;
20 }
21 
22 
23 double
24 d_jmn_b(int J,
25  int M,
26  int N,
27  double beta)
28 {
29  int temp_M, k, k_low, k_hi;
30  double const_term = 0.0, sum_term = 0.0, d = 1.0;
31  int m_p_n, j_p_m, j_p_n, j_m_m, j_m_n;
32  int kmn1, kmn2, jmnk, jmk, jnk;
33  double kk;
34 
35  if (J < 0 || abs(M) > J || abs(N) > J) {
36  cerr << endl;
37  cerr << "d_jmn_b: you have entered an illegal number for J, M, N." << endl;
38  cerr << "Must follow these rules: J >= 0, abs(M) <= J, and abs(N) <= J." << endl;
39  cerr << "J = " << J << " M = " << M << " N = " << N << endl;
40  exit (1);
41  }
42 
43  if (beta < 0) {
44  beta = fabs (beta);
45  temp_M = M;
46  M = N;
47  N = temp_M;
48  }
49 
50  m_p_n = (M + N) / 2;
51  j_p_m = (J + M) / 2;
52  j_m_m = (J - M) / 2;
53  j_p_n = (J + N) / 2;
54  j_m_n = (J - N) / 2;
55 
56  kk = (double) fact (j_p_m) * (double) fact (j_m_m) * (double) fact (j_p_n) * (double) fact (j_m_n) ;
57  const_term = pow ((-1.0), (j_p_m)) * sqrt (kk);
58 
59  k_low = MAX (0, m_p_n);
60  k_hi = MIN (j_p_m, j_p_n);
61 
62  for (k = k_low; k <= k_hi; k++) {
63 
64  kmn1 = 2 * k - (M + N) / 2;
65  jmnk = J + (M + N) / 2 - 2 * k;
66  jmk = (J + M) / 2 - k;
67  jnk = (J + N) / 2 - k;
68  kmn2 = k - (M + N) / 2;
69 
70  sum_term += pow ((-1.0), (k)) *
71  ((pow (cos (beta / 2.0), kmn1)) * (pow (sin (beta / 2.0), jmnk))) /
72  (fact (k) * fact (jmk) * fact (jnk) * fact (kmn2));
73  }
74 
75  d = const_term * sum_term;
76  return d;
77 }
78 
79 
80 double
81 clebsch(const int j1,
82  const int j2,
83  const int j3,
84  const int m1,
85  const int m2,
86  const int m3)
87 {
88  int nu = 0;
89  double exp;
90  double n0, n1, n2, n3, n4, n5;
91  double d0, d1, d2, d3, d4;
92  double sum;
93  double A;
94 
95  if ((m1 + m2) != m3) {
96  return 0;
97  }
98 
99  sum = 0;
100  while ( (d3=(j1-j2-m3)/2+nu) < 0
101  || (n2=(j1-m1)/2+nu) < 0 ) { nu++;}
102  while ( (d1=(j3-j1+j2)/2-nu) >= 0
103  && (d2=(j3+m3)/2-nu) >= 0
104  && (n1=(j2+j3+m1)/2-nu) >= 0 ) {
105  d3=((j1-j2-m3)/2+nu);
106  n2=((j1-m1)/2+nu);
107  d0=dfact((double) nu);
108  exp=nu+(j2+m2)/2;
109  n0 = (double) pow(-1,exp);
110  sum+=(n0*dfact(n1)*dfact(n2))/(d0*dfact(d1)*dfact(d2)*dfact(d3));
111  nu++;
112  }
113 
114  if ( sum == 0 ) {
115  return 0;
116  }
117 
118  n0 = j3+1;
119  n1 = dfact((double) (j3+j1-j2)/2);
120  n2 = dfact((double) (j3-j1+j2)/2);
121  n3 = dfact((double) (j1+j2-j3)/2);
122  n4 = dfact((double) (j3+m3)/2);
123  n5 = dfact((j3-m3)/2);
124 
125  d0 = dfact((double) (j1+j2+j3)/2+1);
126  d1 = dfact((double) (j1-m1)/2);
127  d2 = dfact((double) (j1+m1)/2);
128  d3 = dfact((double) (j2-m2)/2);
129  d4 = dfact((double) (j2+m2)/2);
130 
131  A = ((double) (n0*n1*n2*n3*n4*n5))/((double) (d0*d1*d2*d3*d4));
132 
133  return pow(A,0.5)*sum;
134 }
135 
136 
137 double
138 dfact(const double i)
139 {
140  if (i < 0.00001)
141  return 1;
142  if (i < 0)
143  return 0;
144  return i * dfact(i - 1);
145 }
146 
147 
148 double
149 F(const int n,
150  const double p)
151 {
152 #define Pr 0.1973 // Gev/c corresponds to 1 fermi
153  double ret;
154  double z = (p/Pr) * (p/Pr);
155  int m = n/2;
156  switch (m) {
157  case 0:
158  ret = 1.0;
159  break;
160  case 1:
161  ret = sqrt((2.0 * z)/(z + 1));
162  break;
163  case 2:
164  ret = sqrt((13.0 * z * z)/(pow(z - 3.0,2.0) + 9.0 * z));
165  break;
166  case 3:
167  ret = sqrt( (277.0 * pow(z,3.0))/(z * pow(z - 15.0,2.0) + 9.0 * pow(2.0 * z - 5.0,2.0)));
168  break;
169  case 4:
170  ret = sqrt( (12746.0 * pow(z,4.0))/( pow(z * z - 45.0 * z + 105.0,2.0) + 25.0 * z * pow(2.0 * z - 21.0,2.0)));
171  break;
172  case 5:
173  ret = sqrt((998881 * z*z*z*z*z)/(893025.0 +99225.0*z +6300.0*z*z +315.0*z*z*z +15.0*z*z*z*z +z*z*z*z*z));
174  break;
175  default:
176  cerr << "Blatt-Weisskopf called for undefined L = " << n/2 << endl;
177  ret = 1.0;
178  break;
179  }
180  return ret;
181 }
182 
183 
184 double
185 lambda(const double a,
186  const double b,
187  const double c)
188 {
189  return a * a + b * b + c * c - 2.0 * (a * b + b * c + c * a);
190 }
191 
192 
193 complex<double>
194 q(const double M,
195  const double m1,
196  const double m2)
197 {
198  const double lam = lambda(M * M, m1 * m1, m2 * m2);
199  const double ret = sqrt(fabs(lam / (4 * M * M)));
200  if (lam < 0)
201  return complex<double>(0.0, ret);
202  return complex<double>(ret, 0.0);
203 }
204 
205 
206 int
207 fact(int i)
208 {
209  int f = 1;
210  if (i == 0 || i == 1)
211  f = 1;
212  else {
213  while (i > 0) {
214  f = f * i;
215  i--;
216  }
217  }
218  return f;
219 }
220 
221 
222 int ntab = 0;
223 int tabsize = 8;
224 
225 
226 void
228 {
229  ntab++;
230 }
231 
232 
233 void
235 {
236  ntab--;
237  if (ntab < 0)
238  ntab = 0;
239 }
240 
241 
242 void
244 {
245  for (int i = 0; i < ntab; i++)
246  for (int s = 0; s < tabsize ; s++)
247  cout << " ";
248 }
249 
250 
251 void
252 settab(const int nchar)
253 {
254  tabsize = nchar;
255 }
256 
257 
258 string
259 id2name(const Geant_ID type)
260 {
261  switch (type) {
262  case g_EtaPrime:
263  return "eta'(958)";
264  break;
265  case g_PiMinus:
266  case g_PiPlus:
267  return "pi";
268  break;
269  case g_KMinus:
270  case g_KPlus:
271  return "K";
272  break;
273  case g_KShort:
274  return "K0";
275  break;
276  case g_Pi0:
277  return "pi0";
278  break;
279  case g_Eta:
280  return "eta";
281  break;
282  case g_Rho0:
283  return ("rho(770)");
284  break;
285  case g_RhoPlus:
286  return ("rho(770)");
287  break;
288  case g_RhoMinus:
289  return ("rho(770)");
290  break;
291  case g_omega:
292  return ("omega(782)");
293  break;
294  case g_phiMeson:
295  return ("phi(1020)");
296  break;
297  case g_Proton:
298  return "p";
299  break;
300  case g_AntiProton:
301  return("pbar");
302  break;
303  case g_Neutron:
304  return "n";
305  break;
306  case g_Gamma:
307  return ("gamma");
308  break;
309  case g_Electron:
310  case g_Positron:
311  return ("e");
312  break;
313  case g_Deuteron:
314  return("d");
315  break;
316  case g_Lambda:
317  return ("lambda");
318  break;
319  default:
320  return "unknown";
321  break;
322  }
323 }
324 
325 
326 Geant_ID
327 name2id(const string& name,
328  const int q)
329 {
330  if (name == "pi") {
331  switch (q) {
332  case -1:
333  return g_PiMinus;
334  break;
335  case 1:
336  return g_PiPlus;
337  break;
338  }
339  }
340  else if (name == "omega(782)") {
341  return(g_omega);
342  }
343  else if (name == "e") {
344  switch (q) {
345  case -1:
346  return g_Electron;
347  break;
348  case 1:
349  return g_Positron;
350  break;
351  }
352  }
353  else if (name == "K") {
354  switch (q) {
355  case -1:
356  return g_KMinus;
357  break;
358  case 1:
359  return g_KPlus;
360  break;
361  }
362  }
363  else if (name == "K0") {
364  return g_KShort;
365  }
366  else if (name == "KLong") {
367  return g_KLong;
368  }
369  else if (name == "pi0") {
370  return g_Pi0;
371  }
372  else if (name == "eta") {
373  return g_Eta;
374  }
375  else if (name == "phi(1020)") {
376  return g_phiMeson;
377  }
378  else if (name == "p") {
379  return g_Proton;
380  }
381  else if (name == "pbar") {
382  return g_AntiProton;
383  }
384  else if (name == "n") {
385  return g_Neutron;
386  }
387  else if (name == "d") {
388  return g_Deuteron;
389  }
390  else if (name == "gamma") {
391  return g_Gamma;
392  }
393  else if (name == "eta'(958)") {
394  return g_EtaPrime;
395  }
396  else if (name == "lambda") {
397  return g_Lambda;
398  }
399  else
400  return (g_Unknown);
401  return (g_Unknown);
402 }
403 
404 
405 string
406 itos(const int i)
407 {
408  int digits = (int)log10((float) i) + 2;
409  char* c_s = (char*)malloc(digits * sizeof(char));
410  string s;
411  sprintf(c_s, "%d", i);
412  s = c_s;
413  return s;
414 }
415 
416 
417 string
418 chargetos(int charge)
419 {
420  string s;
421  string c;
422  if (charge) {
423  c = (charge < 0) ? "-" : "+";
424  charge = abs(charge);
425  while (charge--)
426  s += c;
427  }
428  return s;
429 }