EvtGen
2.2.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
Toggle main menu visibility
Loading...
Searching...
No Matches
src
EvtGenBase
EvtAmp.cpp
Go to the documentation of this file.
1
2
/***********************************************************************
3
* Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
4
* *
5
* This file is part of EvtGen. *
6
* *
7
* EvtGen is free software: you can redistribute it and/or modify *
8
* it under the terms of the GNU General Public License as published by *
9
* the Free Software Foundation, either version 3 of the License, or *
10
* (at your option) any later version. *
11
* *
12
* EvtGen is distributed in the hope that it will be useful, *
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15
* GNU General Public License for more details. *
16
* *
17
* You should have received a copy of the GNU General Public License *
18
* along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
19
***********************************************************************/
20
21
#include "
EvtGenBase/EvtAmp.hh
"
22
23
#include "
EvtGenBase/EvtComplex.hh
"
24
#include "
EvtGenBase/EvtId.hh
"
25
#include "
EvtGenBase/EvtPDL.hh
"
26
#include "
EvtGenBase/EvtParticle.hh
"
27
#include "
EvtGenBase/EvtReport.hh
"
28
#include "
EvtGenBase/EvtSpinDensity.hh
"
29
30
#include <assert.h>
31
#include <iostream>
32
#include <math.h>
33
using
std::endl;
34
35
EvtAmp::EvtAmp
()
36
{
37
m_ndaug
= 0;
38
m_pstates
= 0;
39
m_nontrivial
= 0;
40
}
41
42
EvtAmp::EvtAmp
(
const
EvtAmp
& amp )
43
{
44
int
i;
45
46
m_ndaug
= amp.
m_ndaug
;
47
m_pstates
= amp.
m_pstates
;
48
for
( i = 0; i <
m_ndaug
; i++ ) {
49
m_dstates
[i] = amp.
m_dstates
[i];
50
m_dnontrivial
[i] = amp.
m_dnontrivial
[i];
51
}
52
m_nontrivial
= amp.
m_nontrivial
;
53
54
int
namp = 1;
55
56
for
( i = 0; i <
m_nontrivial
; i++ ) {
57
m_nstate
[i] = amp.
m_nstate
[i];
58
namp *=
m_nstate
[i];
59
}
60
61
for
( i = 0; i < namp; i++ ) {
62
assert( i < 125 );
63
m_amp
[i] = amp.
m_amp
[i];
64
}
65
}
66
67
void
EvtAmp::init
(
EvtId
p,
int
ndaugs,
const
EvtId
* daug )
68
{
69
setNDaug
( ndaugs );
70
int
ichild;
71
int
daug_states[100], parstates;
72
for
( ichild = 0; ichild < ndaugs; ichild++ ) {
73
daug_states[ichild] =
EvtSpinType::getSpinStates
(
74
EvtPDL::getSpinType
( daug[ichild] ) );
75
}
76
77
parstates =
EvtSpinType::getSpinStates
(
EvtPDL::getSpinType
( p ) );
78
79
setNState
( parstates, daug_states );
80
}
81
82
void
EvtAmp::setNDaug
(
int
n )
83
{
84
m_ndaug
= n;
85
}
86
87
void
EvtAmp::setNState
(
int
parent_states,
int
* daug_states )
88
{
89
m_nontrivial
= 0;
90
m_pstates
= parent_states;
91
92
if
(
m_pstates
> 1 ) {
93
m_nstate
[
m_nontrivial
] =
m_pstates
;
94
m_nontrivial
++;
95
}
96
97
int
i;
98
99
for
( i = 0; i <
m_ndaug
; i++ ) {
100
m_dstates
[i] = daug_states[i];
101
m_dnontrivial
[i] = -1;
102
if
( daug_states[i] > 1 ) {
103
m_nstate
[
m_nontrivial
] = daug_states[i];
104
m_dnontrivial
[i] =
m_nontrivial
;
105
m_nontrivial
++;
106
}
107
}
108
109
if
(
m_nontrivial
> 5 ) {
110
EvtGenReport
(
EVTGEN_ERROR
,
"EvtGen"
)
111
<<
"Too many nontrivial states in EvtAmp!"
<< endl;
112
}
113
}
114
115
void
EvtAmp::setAmp
(
int
* ind,
const
EvtComplex
& a )
116
{
117
int
nstatepad = 1;
118
int
position = ind[0];
119
120
for
(
int
i = 1; i <
m_nontrivial
; i++ ) {
121
nstatepad *=
m_nstate
[i - 1];
122
position += nstatepad * ind[i];
123
}
124
assert( position < 125 );
125
m_amp
[position] = a;
126
}
127
128
const
EvtComplex
&
EvtAmp::getAmp
(
int
* ind )
const
129
{
130
int
nstatepad = 1;
131
int
position = ind[0];
132
133
for
(
int
i = 1; i <
m_nontrivial
; i++ ) {
134
nstatepad *=
m_nstate
[i - 1];
135
position += nstatepad * ind[i];
136
}
137
138
return
m_amp
[position];
139
}
140
141
EvtSpinDensity
EvtAmp::getSpinDensity
()
const
142
{
143
EvtSpinDensity
rho;
144
rho.
setDim
(
m_pstates
);
145
146
EvtComplex
temp;
147
148
int
i, j, n;
149
150
if
(
m_pstates
== 1 ) {
151
if
(
m_nontrivial
== 0 ) {
152
rho.
set
( 0, 0,
m_amp
[0] *
conj
(
m_amp
[0] ) );
153
return
rho;
154
}
155
156
n = 1;
157
158
temp =
EvtComplex
( 0.0 );
159
160
for
( i = 0; i <
m_nontrivial
; i++ ) {
161
n *=
m_nstate
[i];
162
}
163
164
for
( i = 0; i < n; i++ ) {
165
temp +=
m_amp
[i] *
conj
(
m_amp
[i] );
166
}
167
168
rho.
set
( 0, 0, temp );
169
;
170
171
return
rho;
172
173
}
174
175
else
{
176
for
( i = 0; i <
m_pstates
; i++ ) {
177
for
( j = 0; j <
m_pstates
; j++ ) {
178
temp =
EvtComplex
( 0.0 );
179
180
int
kk;
181
182
int
allloop = 1;
183
for
( kk = 0; kk <
m_ndaug
; kk++ ) {
184
allloop *=
m_dstates
[kk];
185
}
186
187
for
( kk = 0; kk < allloop; kk++ ) {
188
temp +=
m_amp
[
m_pstates
* kk + i] *
189
conj
(
m_amp
[
m_pstates
* kk + j] );
190
}
191
192
// if (m_nontrivial>3){
193
//EvtGenReport(EVTGEN_ERROR,"EvtGen") << "Can't handle so many states in EvtAmp!"<<endl;
194
//}
195
196
rho.
set
( i, j, temp );
197
}
198
}
199
return
rho;
200
}
201
}
202
203
EvtSpinDensity
EvtAmp::getBackwardSpinDensity
(
EvtSpinDensity
* rho_list )
const
204
{
205
EvtSpinDensity
rho;
206
207
rho.
setDim
(
m_pstates
);
208
209
if
(
m_pstates
== 1 ) {
210
rho.
set
( 0, 0,
EvtComplex
( 1.0, 0.0 ) );
211
return
rho;
212
}
213
214
int
k;
215
216
EvtAmp
ampprime;
217
218
ampprime = ( *this );
219
220
for
( k = 0; k <
m_ndaug
; k++ ) {
221
if
(
m_dstates
[k] != 1 ) {
222
ampprime = ampprime.
contract
(
m_dnontrivial
[k], rho_list[k + 1] );
223
}
224
}
225
226
return
ampprime.
contract
( 0, ( *
this
) );
227
}
228
229
EvtSpinDensity
EvtAmp::getForwardSpinDensity
(
EvtSpinDensity
* rho_list,
int
i )
const
230
{
231
EvtSpinDensity
rho;
232
233
rho.
setDim
(
m_dstates
[i] );
234
235
int
k;
236
237
if
(
m_dstates
[i] == 1 ) {
238
rho.
set
( 0, 0,
EvtComplex
( 1.0, 0.0 ) );
239
240
return
rho;
241
}
242
243
EvtAmp
ampprime;
244
245
ampprime = ( *this );
246
247
if
(
m_pstates
!= 1 ) {
248
ampprime = ampprime.
contract
( 0, rho_list[0] );
249
}
250
251
for
( k = 0; k < i; k++ ) {
252
if
(
m_dstates
[k] != 1 ) {
253
ampprime = ampprime.
contract
(
m_dnontrivial
[k], rho_list[k + 1] );
254
}
255
}
256
257
return
ampprime.
contract
(
m_dnontrivial
[i], ( *
this
) );
258
}
259
260
EvtAmp
EvtAmp::contract
(
int
k,
const
EvtSpinDensity
& rho )
const
261
{
262
EvtAmp
temp;
263
264
int
i, j;
265
temp.
m_ndaug
=
m_ndaug
;
266
temp.
m_pstates
=
m_pstates
;
267
temp.
m_nontrivial
=
m_nontrivial
;
268
269
for
( i = 0; i <
m_ndaug
; i++ ) {
270
temp.
m_dstates
[i] =
m_dstates
[i];
271
temp.
m_dnontrivial
[i] =
m_dnontrivial
[i];
272
}
273
274
if
(
m_nontrivial
== 0 ) {
275
EvtGenReport
(
EVTGEN_ERROR
,
"EvtGen"
)
276
<<
"Should not be here EvtAmp!"
<< endl;
277
}
278
279
for
( i = 0; i <
m_nontrivial
; i++ ) {
280
temp.
m_nstate
[i] =
m_nstate
[i];
281
}
282
283
EvtComplex
c;
284
285
int
index[10];
286
for
( i = 0; i < 10; i++ ) {
287
index[i] = 0;
288
}
289
290
int
allloop = 1;
291
int
indflag, ii;
292
for
( i = 0; i <
m_nontrivial
; i++ ) {
293
allloop *=
m_nstate
[i];
294
}
295
296
for
( i = 0; i < allloop; i++ ) {
297
c =
EvtComplex
( 0.0 );
298
int
tempint = index[k];
299
for
( j = 0; j <
m_nstate
[k]; j++ ) {
300
index[k] = j;
301
c += rho.
get
( j, tempint ) *
getAmp
( index );
302
}
303
index[k] = tempint;
304
305
temp.
setAmp
( index, c );
306
307
indflag = 0;
308
for
( ii = 0; ii <
m_nontrivial
; ii++ ) {
309
if
( indflag == 0 ) {
310
if
( index[ii] == (
m_nstate
[ii] - 1 ) ) {
311
index[ii] = 0;
312
}
else
{
313
indflag = 1;
314
index[ii] += 1;
315
}
316
}
317
}
318
}
319
return
temp;
320
}
321
322
EvtSpinDensity
EvtAmp::contract
(
int
k,
const
EvtAmp
& amp2 )
const
323
{
324
int
i, j, l;
325
326
EvtComplex
temp;
327
EvtSpinDensity
rho;
328
329
rho.
setDim
(
m_nstate
[k] );
330
331
int
allloop = 1;
332
int
indflag, ii;
333
for
( i = 0; i <
m_nontrivial
; i++ ) {
334
allloop *=
m_nstate
[i];
335
}
336
337
int
index[10];
338
int
index1[10];
339
// int l;
340
for
( i = 0; i <
m_nstate
[k]; i++ ) {
341
for
( j = 0; j <
m_nstate
[k]; j++ ) {
342
if
(
m_nontrivial
== 0 ) {
343
EvtGenReport
(
EVTGEN_ERROR
,
"EvtGen"
)
344
<<
"Should not be here1 EvtAmp!"
<< endl;
345
rho.
set
( 0, 0,
EvtComplex
( 1.0, 0.0 ) );
346
return
rho;
347
}
348
349
for
( ii = 0; ii < 10; ii++ ) {
350
index[ii] = 0;
351
index1[ii] = 0;
352
}
353
index[k] = i;
354
index1[k] = j;
355
356
temp =
EvtComplex
( 0.0 );
357
358
for
( l = 0; l < int( allloop /
m_nstate
[k] ); l++ ) {
359
temp +=
getAmp
( index ) *
conj
( amp2.
getAmp
( index1 ) );
360
indflag = 0;
361
for
( ii = 0; ii <
m_nontrivial
; ii++ ) {
362
if
( ii != k ) {
363
if
( indflag == 0 ) {
364
if
( index[ii] == (
m_nstate
[ii] - 1 ) ) {
365
index[ii] = 0;
366
index1[ii] = 0;
367
}
else
{
368
indflag = 1;
369
index[ii] += 1;
370
index1[ii] += 1;
371
}
372
}
373
}
374
}
375
}
376
rho.
set
( i, j, temp );
377
}
378
}
379
380
return
rho;
381
}
382
383
EvtAmp
EvtAmp::contract
(
int
,
const
EvtAmp
&,
const
EvtAmp
& )
const
384
{
385
//Do we need this method?
386
EvtAmp
tmp;
387
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
)
388
<<
"EvtAmp::contract not written yet"
<< endl;
389
return
tmp;
390
}
391
392
void
EvtAmp::dump
()
const
393
{
394
int
i, list[10];
395
for
( i = 0; i < 10; i++ ) {
396
list[i] = 0;
397
}
398
399
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
)
400
<<
"Number of daugthers:"
<<
m_ndaug
<< endl;
401
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
)
402
<<
"Number of states of the parent:"
<<
m_pstates
<< endl;
403
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) <<
"Number of states on daughters:"
;
404
for
( i = 0; i <
m_ndaug
; i++ ) {
405
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) <<
m_dstates
[i] <<
" "
;
406
}
407
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) << endl;
408
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) <<
"Nontrivial index of daughters:"
;
409
for
( i = 0; i <
m_ndaug
; i++ ) {
410
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) <<
m_dnontrivial
[i] <<
" "
;
411
}
412
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) << endl;
413
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
)
414
<<
"number of nontrivial states:"
<<
m_nontrivial
<< endl;
415
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
)
416
<<
"Nontrivial particles number of states:"
;
417
for
( i = 0; i <
m_nontrivial
; i++ ) {
418
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) <<
m_nstate
[i] <<
" "
;
419
}
420
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) << endl;
421
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) <<
"Amplitudes:"
<< endl;
422
if
(
m_nontrivial
== 0 ) {
423
list[0] = 0;
424
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) <<
getAmp
( list ) << endl;
425
}
426
427
int
allloop[10];
428
for
( i = 0; i < 10; i++ ) {
429
allloop[i] = 0;
430
}
431
432
allloop[0] = 1;
433
for
( i = 0; i <
m_nontrivial
; i++ ) {
434
if
( i == 0 ) {
435
allloop[i] *=
m_nstate
[i];
436
}
else
{
437
allloop[i] = allloop[i - 1] *
m_nstate
[i];
438
}
439
}
440
int
index = 0;
441
for
( i = 0; i < allloop[
m_nontrivial
- 1]; i++ ) {
442
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) <<
getAmp
( list ) <<
" "
;
443
if
( i == allloop[index] - 1 ) {
444
index++;
445
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
) << endl;
446
}
447
}
448
449
EvtGenReport
(
EVTGEN_DEBUG
,
"EvtGen"
)
450
<<
"-----------------------------------"
<< endl;
451
}
452
453
void
EvtAmp::vertex
(
const
EvtComplex
& c )
454
{
455
int
list[1];
456
list[0] = 0;
457
setAmp
( list, c );
458
}
459
460
void
EvtAmp::vertex
(
int
i,
const
EvtComplex
& c )
461
{
462
int
list[1];
463
list[0] = i;
464
setAmp
( list, c );
465
}
466
467
void
EvtAmp::vertex
(
int
i,
int
j,
const
EvtComplex
& c )
468
{
469
int
list[2];
470
list[0] = i;
471
list[1] = j;
472
setAmp
( list, c );
473
}
474
475
void
EvtAmp::vertex
(
int
i,
int
j,
int
k,
const
EvtComplex
& c )
476
{
477
int
list[3];
478
list[0] = i;
479
list[1] = j;
480
list[2] = k;
481
setAmp
( list, c );
482
}
483
484
void
EvtAmp::vertex
(
int
* i1,
const
EvtComplex
& c )
485
{
486
setAmp
( i1, c );
487
}
488
489
EvtAmp
&
EvtAmp::operator=
(
const
EvtAmp
& amp )
490
{
491
int
i;
492
493
m_ndaug
= amp.
m_ndaug
;
494
m_pstates
= amp.
m_pstates
;
495
for
( i = 0; i <
m_ndaug
; i++ ) {
496
m_dstates
[i] = amp.
m_dstates
[i];
497
m_dnontrivial
[i] = amp.
m_dnontrivial
[i];
498
}
499
m_nontrivial
= amp.
m_nontrivial
;
500
501
int
namp = 1;
502
503
for
( i = 0; i <
m_nontrivial
; i++ ) {
504
m_nstate
[i] = amp.
m_nstate
[i];
505
namp *=
m_nstate
[i];
506
}
507
508
for
( i = 0; i < namp; i++ ) {
509
assert( i < 125 );
510
m_amp
[i] = amp.
m_amp
[i];
511
}
512
513
return
*
this
;
514
}
EvtAmp.hh
EvtComplex.hh
conj
EvtComplex conj(const EvtComplex &c)
Definition
EvtComplex.hh:198
EvtId.hh
EvtPDL.hh
EvtParticle.hh
EvtReport.hh
EvtGenReport
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition
EvtReport.cpp:32
EVTGEN_DEBUG
@ EVTGEN_DEBUG
Definition
EvtReport.hh:53
EVTGEN_ERROR
@ EVTGEN_ERROR
Definition
EvtReport.hh:49
EvtSpinDensity.hh
EvtAmp::setNDaug
void setNDaug(int n)
Definition
EvtAmp.cpp:82
EvtAmp::getAmp
const EvtComplex & getAmp(int *ind) const
Definition
EvtAmp.cpp:128
EvtAmp::setAmp
void setAmp(int *ind, const EvtComplex &)
Definition
EvtAmp.cpp:115
EvtAmp::vertex
void vertex(const EvtComplex &)
Definition
EvtAmp.cpp:453
EvtAmp::m_pstates
int m_pstates
Definition
EvtAmp.hh:93
EvtAmp::contract
EvtSpinDensity contract(int i, const EvtAmp &a) const
Definition
EvtAmp.cpp:322
EvtAmp::m_dstates
int m_dstates[10]
Definition
EvtAmp.hh:96
EvtAmp::EvtAmp
EvtAmp()
Definition
EvtAmp.cpp:35
EvtAmp::dump
void dump() const
Definition
EvtAmp.cpp:392
EvtAmp::getBackwardSpinDensity
EvtSpinDensity getBackwardSpinDensity(EvtSpinDensity *rho_list) const
Definition
EvtAmp.cpp:203
EvtAmp::m_dnontrivial
int m_dnontrivial[10]
Definition
EvtAmp.hh:99
EvtAmp::m_nstate
int m_nstate[5]
Definition
EvtAmp.hh:105
EvtAmp::m_amp
EvtComplex m_amp[125]
Definition
EvtAmp.hh:87
EvtAmp::m_nontrivial
int m_nontrivial
Definition
EvtAmp.hh:102
EvtAmp::getSpinDensity
EvtSpinDensity getSpinDensity() const
Definition
EvtAmp.cpp:141
EvtAmp::getForwardSpinDensity
EvtSpinDensity getForwardSpinDensity(EvtSpinDensity *rho_list, int k) const
Definition
EvtAmp.cpp:229
EvtAmp::operator=
EvtAmp & operator=(const EvtAmp &)
Definition
EvtAmp.cpp:489
EvtAmp::setNState
void setNState(int parent_states, int *daug_states)
Definition
EvtAmp.cpp:87
EvtAmp::init
void init(EvtId p, int ndaug, const EvtId *daug)
Definition
EvtAmp.cpp:67
EvtAmp::m_ndaug
int m_ndaug
Definition
EvtAmp.hh:90
EvtComplex
Definition
EvtComplex.hh:29
EvtId
Definition
EvtId.hh:27
EvtPDL::getSpinType
static EvtSpinType::spintype getSpinType(EvtId i)
Definition
EvtPDL.cpp:371
EvtSpinDensity
Definition
EvtSpinDensity.hh:28
EvtSpinDensity::setDim
void setDim(int n)
Definition
EvtSpinDensity.cpp:79
EvtSpinDensity::get
const EvtComplex & get(int i, int j) const
Definition
EvtSpinDensity.cpp:112
EvtSpinDensity::set
void set(int i, int j, const EvtComplex &rhoij)
Definition
EvtSpinDensity.cpp:106
EvtSpinType::getSpinStates
static int getSpinStates(spintype stype)
Definition
EvtSpinType.cpp:56
Generated by
1.17.0