EvtGen 2.2.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
Loading...
Searching...
No Matches
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
24#include "EvtGenBase/EvtId.hh"
25#include "EvtGenBase/EvtPDL.hh"
29
30#include <assert.h>
31#include <iostream>
32#include <math.h>
33using std::endl;
34
36{
37 m_ndaug = 0;
38 m_pstates = 0;
39 m_nontrivial = 0;
40}
41
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 }
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
67void 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
78
79 setNState( parstates, daug_states );
80}
81
82void EvtAmp::setNDaug( int n )
83{
84 m_ndaug = n;
85}
86
87void EvtAmp::setNState( int parent_states, int* daug_states )
88{
89 m_nontrivial = 0;
90 m_pstates = parent_states;
91
92 if ( m_pstates > 1 ) {
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];
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
115void 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
128const 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
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
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
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
260EvtAmp 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;
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
322EvtSpinDensity 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
383EvtAmp 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
392void 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
454{
455 int list[1];
456 list[0] = 0;
457 setAmp( list, c );
458}
459
460void EvtAmp::vertex( int i, const EvtComplex& c )
461{
462 int list[1];
463 list[0] = i;
464 setAmp( list, c );
465}
466
467void 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
475void 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
484void EvtAmp::vertex( int* i1, const EvtComplex& c )
485{
486 setAmp( i1, c );
487}
488
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 }
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}
EvtComplex conj(const EvtComplex &c)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_DEBUG
Definition EvtReport.hh:53
@ EVTGEN_ERROR
Definition EvtReport.hh:49
void setNDaug(int n)
Definition EvtAmp.cpp:82
const EvtComplex & getAmp(int *ind) const
Definition EvtAmp.cpp:128
void setAmp(int *ind, const EvtComplex &amp)
Definition EvtAmp.cpp:115
void vertex(const EvtComplex &amp)
Definition EvtAmp.cpp:453
int m_pstates
Definition EvtAmp.hh:93
EvtSpinDensity contract(int i, const EvtAmp &a) const
Definition EvtAmp.cpp:322
int m_dstates[10]
Definition EvtAmp.hh:96
EvtAmp()
Definition EvtAmp.cpp:35
void dump() const
Definition EvtAmp.cpp:392
EvtSpinDensity getBackwardSpinDensity(EvtSpinDensity *rho_list) const
Definition EvtAmp.cpp:203
int m_dnontrivial[10]
Definition EvtAmp.hh:99
int m_nstate[5]
Definition EvtAmp.hh:105
EvtComplex m_amp[125]
Definition EvtAmp.hh:87
int m_nontrivial
Definition EvtAmp.hh:102
EvtSpinDensity getSpinDensity() const
Definition EvtAmp.cpp:141
EvtSpinDensity getForwardSpinDensity(EvtSpinDensity *rho_list, int k) const
Definition EvtAmp.cpp:229
EvtAmp & operator=(const EvtAmp &amp)
Definition EvtAmp.cpp:489
void setNState(int parent_states, int *daug_states)
Definition EvtAmp.cpp:87
void init(EvtId p, int ndaug, const EvtId *daug)
Definition EvtAmp.cpp:67
int m_ndaug
Definition EvtAmp.hh:90
Definition EvtId.hh:27
static EvtSpinType::spintype getSpinType(EvtId i)
Definition EvtPDL.cpp:371
void setDim(int n)
const EvtComplex & get(int i, int j) const
void set(int i, int j, const EvtComplex &rhoij)
static int getSpinStates(spintype stype)