PandaRoot
KinTools.h
Go to the documentation of this file.
1 // --------------------------------------------------------------------------
2 // KinTools.cpp - Helper tools for DalitzGUI
3 // --------------------------------------------------------------------------
4 //
5 // Original author: Klaus Goetzen - GSI Darmstadt
6 // Last modified : 2014/08/15
7 // --------------------------------------------------------------------------
8 #pragma once
9 
10 #include <iostream>
11 #include "TComplex.h"
12 #include "TColor.h"
13 #include "TArrayD.h"
14 #include "TStyle.h"
15 #include "CRes.h"
16 #include "DalitzGlobals.h"
17 
18 using namespace DalitzGuiGlobals;
19 
20 //**************************************
21 //**************************************
22 //**************************************
23 
24 namespace KinTools {
25 
26 inline Double_t breakup(Double_t M, Double_t m1, Double_t m2)
27 {
28  Double_t sum12 = m1 + m2;
29  Double_t dif12 = m1 - m2;
30 
31  Double_t q = 0.;
32 
33  if (M > sum12)
34  q = sqrt((M * M - sum12 * sum12) * (M * M - dif12 * dif12)) / (2. * M);
35 
36  return q;
37 }
38 
39 inline Double_t BarrierP(Double_t q, Double_t q0, Int_t L, Double_t d = 5.07)
40 {
41  Double_t result = 1.0;
42 
43  Double_t z0 = q0 * q0 * d * d;
44  Double_t z = q * q * d * d;
45 
46  switch (L) {
47  case 1: result = sqrt((1. + z0) / (1. + z)); break;
48 
49  case 2: result = sqrt(((z0 - 3.) * (z0 - 3.) + 9. * z0) / ((z - 3.) * (z - 3.) + 9. * z)); break;
50 
51  default: break;
52  }
53 
54  return result;
55 }
56 
57 inline Double_t Barrier(Double_t q, Int_t L, Double_t d = 5.07)
58 {
59  Double_t result = 1.0;
60 
61  Double_t z = q * q * d * d;
62 
63  switch (L) {
64  case 1: result = sqrt(2. * z / (1. + z)); break;
65 
66  case 2: result = sqrt((13. * z * z) / ((z - 3.) * (z - 3.) + 9. * z)); break;
67 
68  default: break;
69  }
70 
71  return result;
72 }
73 
74 inline Double_t BWGamma(Double_t m, Double_t m0, Double_t Gamma0, Double_t m1, Double_t m2, Int_t L, Double_t d = 5.07)
75 {
76  Double_t q0 = breakup(m0, m1, m2);
77  Double_t q = breakup(m, m1, m2);
78 
79  if (0. == q)
80  return 0.;
81 
82  Double_t phsp = q / q0;
83 
84  switch (L) {
85  case 1: phsp = phsp * phsp * phsp; break;
86  case 2: phsp = phsp * phsp * phsp * phsp * phsp; break;
87  default: break;
88  }
89 
90  Double_t bar = BarrierP(q, q0, L, d);
91 
92  Double_t G = Gamma0 * phsp * (m0 / m) * bar * bar;
93 
94  return G;
95 }
96 
97 inline TComplex BreitWigner(Double_t m, Double_t m0, Double_t Gamma0, Double_t m1, Double_t m2, Int_t L, Double_t d = 5.07)
98 {
99  TComplex I(0., 1.);
100  TComplex G(BWGamma(m, m0, Gamma0, m1, m2, L, d));
101 
102  TComplex BW = G / (m0 * m0 - m * m - I * m0 * G);
103 
104  return BW;
105 }
106 
107 inline Double_t lambda(Double_t x, Double_t y, Double_t z)
108 {
109  return x * x + y * y + z * z - 2. * x * y - 2. * y * z - 2. * z * x;
110 }
111 
112 inline Double_t simin(Int_t i, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
113 {
114  Double_t result = 0.;
115 
116  switch (i) {
117  case 1: result = (m2 + m3) * (m2 + m3); break;
118  case 2: result = (m1 + m3) * (m1 + m3); break;
119  case 3: result = (m1 + m2) * (m1 + m2); break;
120  }
121  return result;
122 }
123 
124 inline Double_t simax(Int_t i, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
125 {
126  Double_t result = 0.;
127 
128  switch (i) {
129  case 1: result = (m0 - m1) * (m0 - m1); break;
130  case 2: result = (m0 - m2) * (m0 - m2); break;
131  case 3: result = (m0 - m3) * (m0 - m3); break;
132  }
133  return result;
134 }
135 
136 inline Double_t s2min(Double_t s1, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
137 {
138  Double_t s = m0 * m0;
139  Double_t lamterm = sqrt(lambda(s1, s, m1 * m1)) * sqrt(lambda(s1, m2 * m2, m3 * m3));
140 
141  Double_t result = m1 * m1 + m3 * m3 + ((s - s1 - m1 * m1) * (s1 - m2 * m2 + m3 * m3) - lamterm) / (2. * s1);
142 
143  return result;
144 }
145 
146 inline Double_t s2max(Double_t s1, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
147 {
148  Double_t s = m0 * m0;
149  Double_t lamterm = sqrt(lambda(s1, s, m1 * m1)) * sqrt(lambda(s1, m2 * m2, m3 * m3));
150 
151  Double_t result = m1 * m1 + m3 * m3 + ((s - s1 - m1 * m1) * (s1 - m2 * m2 + m3 * m3) + lamterm) / (2. * s1);
152 
153  return result;
154 }
155 
156 inline Double_t s3min(Double_t s1, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
157 {
158  Double_t s = m0 * m0;
159  Double_t lamterm = sqrt(lambda(s1, s, m1 * m1)) * sqrt(lambda(s1, m3 * m3, m1 * m1));
160 
161  Double_t result = m1 * m1 + m2 * m2 + ((s - s1 - m1 * m1) * (s1 - m1 * m1 + m2 * m2) - lamterm) / (2. * s1);
162 
163  return result;
164 }
165 
166 inline Double_t s3max(Double_t s1, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
167 {
168  Double_t s = m0 * m0;
169  Double_t lamterm = sqrt(lambda(s1, s, m1 * m1)) * sqrt(lambda(s1, m3 * m3, m1 * m1));
170 
171  Double_t result = m1 * m1 + m2 * m2 + ((s - s1 - m1 * m1) * (s1 - m1 * m1 + m3 * m3) + lamterm) / (2. * s1);
172 
173  return result;
174 }
175 
176 inline Double_t s1min(Double_t s2, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
177 {
178  Double_t s = m0 * m0;
179  Double_t lamterm = sqrt(lambda(s2, s, m2 * m2)) * sqrt(lambda(s2, m3 * m3, m1 * m1));
180 
181  Double_t result = m2 * m2 + m3 * m3 + ((s - s2 - m2 * m2) * (s2 - m1 * m1 + m3 * m3) - lamterm) / (2. * s2);
182 
183  return result;
184 }
185 
186 inline Double_t s1max(Double_t s2, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
187 {
188  Double_t s = m0 * m0;
189  Double_t lamterm = sqrt(lambda(s2, s, m2 * m2)) * sqrt(lambda(s2, m1 * m1, m3 * m3));
190 
191  Double_t result = m2 * m2 + m3 * m3 + ((s - s2 - m2 * m2) * (s2 - m1 * m1 + m3 * m3) + lamterm) / (2. * s2);
192 
193  return result;
194 }
195 
196 inline void palette2(Int_t mode = 0)
197 {
198  const int ncol = 99;
199  static Int_t col0[99], col1[99], col2[99], col3[99];
200  static Bool_t initialized = kFALSE;
201 
202  if (!initialized) {
203  {
204  Double_t blu[3] = {1, 0.2, 0};
205  Double_t red[3] = {1, 0.2, 0};
206  Double_t grn[3] = {1, 0.2, 0};
207  Double_t stp[3] = {0, 0.5, 1};
208 
209  Int_t FI = TColor::CreateGradientColorTable(3, stp, red, grn, blu, ncol);
210  for (int i = 0; i < ncol; i++)
211  col0[i] = FI + i;
212  }
213  {
214  Double_t blu2[6] = {1, 1, 1, 0, 0, 0};
215  Double_t red2[6] = {1, 0, 0, 0, 1, 1};
216  Double_t grn2[6] = {1, 0, 1, 1, 1, 0};
217  Double_t stp2[6] = {0.0, 0.12, 0.34, 0.56, 0.78, 1.0};
218 
219  Int_t FI = TColor::CreateGradientColorTable(6, stp2, red2, grn2, blu2, ncol);
220  for (int i = 0; i < ncol; i++)
221  col1[i] = FI + i;
222  }
223  {
224  Double_t blu3[5] = {0, 0, 1, 0, 0};
225  Double_t red3[5] = {0, 1, 1, 0, 0};
226  Double_t grn3[5] = {0, 0, 1, 1, 0};
227  Double_t stp3[5] = {0., 0.25, 0.5, 0.75, 1.0};
228 
229  Int_t FI = TColor::CreateGradientColorTable(5, stp3, red3, grn3, blu3, ncol);
230  for (int i = 0; i < ncol; i++)
231  col2[i] = FI + i;
232  }
233  {
234  Double_t blu4[6] = {1, 0, 0, 0, 0.06, 0};
235  Double_t red4[6] = {1, 1, 1, 0.5, 0.55, 0};
236  Double_t grn4[6] = {1, 1, 0.5, 0.25, 0.10, 0};
237  Double_t stp4[6] = {0., 0.2, 0.4, 0.60, 0.75, 1.0};
238 
239  Int_t FI = TColor::CreateGradientColorTable(6, stp4, red4, grn4, blu4, ncol);
240  for (int i = 0; i < ncol; i++)
241  col3[i] = FI + i;
242  }
243  initialized = kTRUE;
244  }
245 
246  switch (mode) {
247  case 0: gStyle->SetPalette(ncol, col0); break;
248  case 1: gStyle->SetPalette(ncol, col1); break;
249  case 2: gStyle->SetPalette(ncol, col2); break;
250  case 3: gStyle->SetPalette(56, 0); break;
251  }
252 }
253 
254 inline Double_t Z_Ralt(Double_t s, Double_t smin, Double_t smax, Int_t J, double m_R = 0., double m_ab = 0., double m_c = 0.)
255 {
256  Double_t res = 1.0;
257 
258  Double_t x = (s - smin) / (smax - smin) * 2. - 1.0;
259 
260  double relcorr = 1.0, xi2 = 1.;
261 
262  if (m_R > 1e-6) {
263  xi2 = pow((m_R * m_R + m_ab * m_ab - m_c * m_c) / (2 * m_ab * m_R), 2) - 1;
264  }
265 
266  switch (J) {
267  case 1:
268  res = 3. * x * x;
269  if (m_R > 1e-6)
270  relcorr = sqrt(1. + xi2);
271  break;
272  case 2:
273  res = 5. * (x * x - 1. / 3.) * (x * x - 1. / 3.) * 9. / 4.;
274  if (m_R > 1e-6)
275  relcorr = sqrt(xi2 + 1.5);
276  break;
277  }
278 
279  return relcorr * sqrt(res); // *** new: return now sqrt(angle) to cope for computation of the intensity = amp*amp
280 }
281 
282 inline Double_t Z_R(Double_t s, Double_t sab, Double_t sac, Double_t sbc, int i, Double_t mR, Int_t J, double fma, double fmb, double fmc)
283 {
284  double res = 1.;
285 
286  if (J == 0)
287  return res;
288 
289  double mR2 = 2 * mR;
290 
291  double mA2 = fma * fma, mB2 = fmb * fmb, mC2 = fmc * fmc;
292 
293  switch (J) {
294  case 1:
295  res = sac - sbc + (s - mC2) * (mA2 - mB2) / mR2; //(mAC*mAC-mBC*mBC+((mD*mD-mC*mC)*(mB*mB-mA*mA)/(mdenom*mdenom)))
296  break;
297  case 2:
298  res = pow(sbc - sac + ((s - mC2) * (mA2 - mB2) / mR), 2) - 1. / 3. * (sab - 2 * s - 2 * mC2 + pow((s - mC2) / mR, 2)) * (sab - 2 * mA2 - 2 * mB2 + pow((mA2 - mB2) / mR, 2));
299  break;
300  }
301 
302  return res;
303 }
304 
305 inline TComplex getAmp(CRes *r, Double_t m, Double_t m1, Double_t m2, Double_t qR, Double_t qM)
306 {
307  TComplex bw1 = BreitWigner(m, r->GetM0(), r->GetG0(), m1, m2, r->GetJ());
308  TComplex c = r->GetCoeff();
309  c *= 1. / sqrt(r->GetG0()); // weight taking into account width (give narrow resonances more weight)
310  Double_t bar1 = Barrier(qR, r->GetJ());
311  Double_t bar2 = BarrierP(qM, breakup(r->GetM0(), m1, m2), r->GetJ());
312  return bar1 * bar2 * c * bw1;
313 }
314 
315 inline TComplex getAmpEvt(CRes *r, double sab, double sac, double sbc, double ma, double mb, double mc)
316 {
317  double mAB2 = sab;
318  // double mBC2 = sbc;
319  // double mAC2 = sac;
320  double mA2 = ma * ma;
321  double mB2 = mb * mb;
322  double mC2 = mc * mc;
323  double mD2 = sab + sac + sbc - mA2 - mB2 - mC2;
324 
325  double mR = r->GetM0();
326  double mR2 = mR * mR;
327  double gammaR = r->GetG0();
328  // double mdenom = mR;
329 
330  double pAB = sqrt((((mAB2 - mA2 - mB2) * (mAB2 - mA2 - mB2) / 4.0) - mA2 * mB2) / (mAB2));
331  double pR = sqrt((((mR2 - mA2 - mB2) * (mR2 - mA2 - mB2) / 4.0) - mA2 * mB2) / (mR2));
332  double pD = (((mD2 - mR2 - mC2) * (mD2 - mR2 - mC2) / 4.0) - mR2 * mC2) / (mD2);
333  if (pD > 0) {
334  pD = sqrt(pD);
335  } else {
336  pD = 0;
337  }
338  double pDAB = sqrt((((mD2 - mAB2 - mC2) * (mD2 - mAB2 - mC2) / 4.0) - mAB2 * mC2) / (mD2));
339 
340  double fR = 1;
341  double fD = 1;
342  int power = 0;
343  int _spin = r->GetJ();
344  switch (_spin) {
345  case 0:
346  fR = 1.0;
347  fD = 1.0;
348  power = 1;
349  break;
350  case 1:
351  fR = sqrt(1.0 + 1.5 * 1.5 * pR * pR) / sqrt(1.0 + 1.5 * 1.5 * pAB * pAB);
352  fD = sqrt(1.0 + 5.0 * 5.0 * pD * pD) / sqrt(1.0 + 5.0 * 5.0 * pDAB * pDAB);
353  power = 3;
354  break;
355  case 2:
356  fR = sqrt((9 + 3 * pow((1.5 * pR), 2) + pow((1.5 * pR), 4)) / (9 + 3 * pow((1.5 * pAB), 2) + pow((1.5 * pAB), 4)));
357  fD = sqrt((9 + 3 * pow((5.0 * pD), 2) + pow((5.0 * pD), 4)) / (9 + 3 * pow((5.0 * pDAB), 2) + pow((5.0 * pDAB), 4)));
358  power = 5;
359  break;
360  }
361 
362  double gammaAB = gammaR * pow(pAB / pR, power) * (mR / sqrt(mAB2)) * fR * fR;
363 
364  TComplex ampl = sqrt(r->GetG0()) * r->GetCoeff() * fR * fD / (mR2 - mAB2 - TComplex(0.0, mR * gammaAB));
365 
366  return ampl;
367 }
368 
369 } // namespace KinTools
Int_t GetJ()
Definition: CRes.h:32
Double_t BWGamma(Double_t m, Double_t m0, Double_t Gamma0, Double_t m1, Double_t m2, Int_t L, Double_t d=5.07)
Definition: KinTools.h:74
Double_t GetM0()
Definition: CRes.h:28
Double_t Barrier(Double_t q, Int_t L, Double_t d=5.07)
Definition: KinTools.h:57
Double_t Z_R(Double_t s, Double_t sab, Double_t sac, Double_t sbc, int i, Double_t mR, Int_t J, double fma, double fmb, double fmc)
Definition: KinTools.h:282
Double_t lambda(Double_t x, Double_t y, Double_t z)
Definition: KinTools.h:107
Double_t s2min(Double_t s1, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
Definition: KinTools.h:136
Definition: CRes.h:21
__m128 m
Definition: P4_F32vec4.h:26
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:28
Double_t s2max(Double_t s1, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
Definition: KinTools.h:146
TComplex BreitWigner(Double_t m, Double_t m0, Double_t Gamma0, Double_t m1, Double_t m2, Int_t L, Double_t d=5.07)
Definition: KinTools.h:97
Double_t s3min(Double_t s1, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
Definition: KinTools.h:156
Double_t BarrierP(Double_t q, Double_t q0, Int_t L, Double_t d=5.07)
Definition: KinTools.h:39
Double_t s1min(Double_t s2, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
Definition: KinTools.h:176
unsigned int i
Definition: P4_F32vec4.h:21
Double_t breakup(Double_t M, Double_t m1, Double_t m2)
Definition: KinTools.h:26
Double_t s1max(Double_t s2, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
Definition: KinTools.h:186
Double_t simax(Int_t i, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
Definition: KinTools.h:124
void palette2(Int_t mode=0)
Definition: KinTools.h:196
TComplex getAmp(CRes *r, Double_t m, Double_t m1, Double_t m2, Double_t qR, Double_t qM)
Definition: KinTools.h:305
Double_t simin(Int_t i, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
Definition: KinTools.h:112
Double_t GetG0()
Definition: CRes.h:29
TComplex getAmpEvt(CRes *r, double sab, double sac, double sbc, double ma, double mb, double mc)
Definition: KinTools.h:315
Double_t Z_Ralt(Double_t s, Double_t smin, Double_t smax, Int_t J, double m_R=0., double m_ab=0., double m_c=0.)
Definition: KinTools.h:254
Double_t s3max(Double_t s1, Double_t m0, Double_t m1, Double_t m2, Double_t m3)
Definition: KinTools.h:166
TComplex GetCoeff()
Definition: CRes.h:45