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