BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtAmp.cc
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2//
3// Environment:
4// This software is part of the EvtGen package developed jointly
5// for the BaBar and CLEO collaborations. If you use all or part
6// of it, please give an appropriate acknowledgement.
7//
8// Copyright Information: See EvtGen/COPYRIGHT
9// Copyright (C) 1998 Caltech, UCSB
10//
11// Module: EvtAmp.cc
12//
13// Description: Class to manipulate the amplitudes in the decays.
14//
15// Modification history:
16//
17// RYD May 29, 1997 Module created
18//
19//------------------------------------------------------------------------
20//
21#include "EvtAmp.hh"
22#include "EvtComplex.hh"
23#include "EvtId.hh"
24#include "EvtPDL.hh"
25#include "EvtParticle.hh"
26#include "EvtPatches.hh"
27#include "EvtReport.hh"
28#include "EvtSpinDensity.hh"
29#include <assert.h>
30#include <iostream>
31#include <math.h>
32using std::cout;
33using std::endl;
34
36 _ndaug = 0;
37 _pstates = 0;
38 _nontrivial = 0;
39}
40
41EvtAmp::EvtAmp( const EvtAmp& amp ) {
42
43 int i;
44
45 _ndaug = amp._ndaug;
46 _pstates = amp._pstates;
47 for ( i = 0; i < _ndaug; i++ )
48 {
49 dstates[i] = amp.dstates[i];
50 _dnontrivial[i] = amp._dnontrivial[i];
51 }
52 _nontrivial = amp._nontrivial;
53
54 int namp = _pstates;
55
56 for ( i = 0; i < _nontrivial; i++ )
57 {
58 _nstate[i] = amp._nstate[i];
59 namp *= _nstate[i];
60 }
61
62 for ( i = 0; i < namp; i++ ) { _amp[i] = amp._amp[i]; }
63}
64
65void EvtAmp::init( EvtId p, int ndaugs, EvtId* daug ) {
66 setNDaug( ndaugs );
67 int ichild;
68 int daug_states[100], parstates;
69 for ( ichild = 0; ichild < ndaugs; ichild++ )
70 { daug_states[ichild] = EvtSpinType::getSpinStates( EvtPDL::getSpinType( daug[ichild] ) ); }
71
73
74 setNState( parstates, daug_states );
75}
76
77void EvtAmp::setNDaug( int n ) { _ndaug = n; }
78
79void EvtAmp::setNState( int parent_states, int* daug_states ) {
80
81 _nontrivial = 0;
82 _pstates = parent_states;
83
84 if ( _pstates > 1 )
85 {
86 _nstate[_nontrivial] = _pstates;
87 _nontrivial++;
88 }
89
90 int i;
91
92 for ( i = 0; i < _ndaug; i++ )
93 {
94 dstates[i] = daug_states[i];
95 _dnontrivial[i] = -1;
96 if ( daug_states[i] > 1 )
97 {
98 _nstate[_nontrivial] = daug_states[i];
99 _dnontrivial[i] = _nontrivial;
100 _nontrivial++;
101 }
102 }
103
104 if ( _nontrivial > 5 )
105 { report( ERROR, "EvtGen" ) << "Too many nontrivial states in EvtAmp!" << endl; }
106}
107
108void EvtAmp::setAmp( int* ind, const EvtComplex& a ) {
109
110 int nstatepad = 1;
111 int position = ind[0];
112
113 for ( int i = 1; i < _nontrivial; i++ )
114 {
115 nstatepad *= _nstate[i - 1];
116 position += nstatepad * ind[i];
117 }
118 _amp[position] = a;
119}
120
121const EvtComplex& EvtAmp::getAmp( int* ind ) const {
122
123 int nstatepad = 1;
124 int position = ind[0];
125
126 for ( int i = 1; i < _nontrivial; i++ )
127 {
128 nstatepad *= _nstate[i - 1];
129 position += nstatepad * ind[i];
130 }
131
132 return _amp[position];
133}
134
136
137 EvtSpinDensity rho;
138 rho.SetDim( _pstates );
139
140 EvtComplex temp;
141
142 int i, j, n;
143
144 if ( _pstates == 1 )
145 {
146
147 if ( _nontrivial == 0 )
148 {
149
150 rho.Set( 0, 0, _amp[0] * conj( _amp[0] ) );
151 return rho;
152 }
153
154 n = 1;
155
156 temp = EvtComplex( 0.0 );
157
158 for ( i = 0; i < _nontrivial; i++ ) { n *= _nstate[i]; }
159
160 for ( i = 0; i < n; i++ ) { temp += _amp[i] * conj( _amp[i] ); }
161
162 rho.Set( 0, 0, temp );
163 ;
164
165 return rho;
166 }
167
168 else
169 {
170
171 for ( i = 0; i < _pstates; i++ )
172 {
173 for ( j = 0; j < _pstates; j++ )
174 {
175
176 temp = EvtComplex( 0.0 );
177
178 int kk;
179
180 int allloop = 1;
181 for ( kk = 0; kk < ( _nontrivial - 1 ); kk++ ) { allloop *= dstates[kk]; }
182
183 for ( kk = 0; kk < allloop; kk++ )
184 { temp += _amp[_pstates * kk + i] * conj( _amp[_pstates * kk + j] ); }
185
186 // if (_nontrivial>3){
187 // report(ERROR,"EvtGen") << "Can't handle so many states in EvtAmp!"<<endl;
188 //}
189
190 rho.Set( i, j, temp );
191 }
192 }
193 return rho;
194 }
195}
196
198
199 EvtSpinDensity rho;
200
201 rho.SetDim( _pstates );
202
203 if ( _pstates == 1 )
204 {
205 rho.Set( 0, 0, EvtComplex( 1.0, 0.0 ) );
206 return rho;
207 }
208
209 int k;
210
211 EvtAmp ampprime;
212
213 ampprime = ( *this );
214
215 for ( k = 0; k < _ndaug; k++ )
216 {
217
218 if ( dstates[k] != 1 )
219 { ampprime = ampprime.contract( _dnontrivial[k], rho_list[k + 1] ); }
220 }
221
222 return ampprime.contract( 0, ( *this ) );
223}
224
226
227 EvtSpinDensity rho;
228
229 rho.SetDim( dstates[i] );
230
231 int k;
232
233 if ( dstates[i] == 1 )
234 {
235
236 rho.Set( 0, 0, EvtComplex( 1.0, 0.0 ) );
237
238 return rho;
239 }
240
241 EvtAmp ampprime;
242
243 ampprime = ( *this );
244
245 if ( _pstates != 1 ) { ampprime = ampprime.contract( 0, rho_list[0] ); }
246
247 for ( k = 0; k < i; k++ )
248 {
249
250 if ( dstates[k] != 1 )
251 { ampprime = ampprime.contract( _dnontrivial[k], rho_list[k + 1] ); }
252 }
253
254 return ampprime.contract( _dnontrivial[i], ( *this ) );
255}
256
258
259 EvtAmp temp;
260
261 int i, j;
262 temp._ndaug = _ndaug;
263 temp._pstates = _pstates;
264 temp._nontrivial = _nontrivial;
265
266 for ( i = 0; i < _ndaug; i++ )
267 {
268 temp.dstates[i] = dstates[i];
269 temp._dnontrivial[i] = _dnontrivial[i];
270 }
271
272 if ( _nontrivial == 0 )
273 { report( ERROR, "EvtGen" ) << "Should not be here EvtAmp!" << endl; }
274
275 for ( i = 0; i < _nontrivial; i++ ) { temp._nstate[i] = _nstate[i]; }
276
277 EvtComplex c;
278
279 int index[10];
280 for ( i = 0; i < 10; i++ ) { index[i] = 0; }
281
282 int allloop = 1;
283 int indflag, ii;
284 for ( i = 0; i < _nontrivial; i++ ) { allloop *= _nstate[i]; }
285
286 for ( i = 0; i < allloop; i++ )
287 {
288
289 c = EvtComplex( 0.0 );
290 int tempint = index[k];
291 for ( j = 0; j < _nstate[k]; j++ )
292 {
293 index[k] = j;
294 c += rho.Get( j, tempint ) * getAmp( index );
295 }
296 index[k] = tempint;
297
298 temp.setAmp( index, c );
299
300 indflag = 0;
301 for ( ii = 0; ii < _nontrivial; ii++ )
302 {
303 if ( indflag == 0 )
304 {
305 if ( index[ii] == ( _nstate[ii] - 1 ) ) { index[ii] = 0; }
306 else
307 {
308 indflag = 1;
309 index[ii] += 1;
310 }
311 }
312 }
313 }
314 return temp;
315}
316
318
319 int i, j, l;
320
321 EvtComplex temp;
322 EvtSpinDensity rho;
323
324 rho.SetDim( _nstate[k] );
325
326 int allloop = 1;
327 int indflag, ii;
328 for ( i = 0; i < _nontrivial; i++ ) { allloop *= _nstate[i]; }
329
330 int index[10];
331 int index1[10];
332 // int l;
333 for ( i = 0; i < _nstate[k]; i++ )
334 {
335
336 for ( j = 0; j < _nstate[k]; j++ )
337 {
338 if ( _nontrivial == 0 )
339 {
340 report( ERROR, "EvtGen" ) << "Should not be here1 EvtAmp!" << endl;
341 rho.Set( 0, 0, EvtComplex( 1.0, 0.0 ) );
342 return rho;
343 }
344
345 for ( ii = 0; ii < 10; ii++ )
346 {
347 index[ii] = 0;
348 index1[ii] = 0;
349 }
350 index[k] = i;
351 index1[k] = j;
352
353 temp = EvtComplex( 0.0 );
354
355 for ( l = 0; l < int( allloop / _nstate[k] ); l++ )
356 {
357
358 temp += getAmp( index ) * conj( amp2.getAmp( index1 ) );
359 indflag = 0;
360 for ( ii = 0; ii < _nontrivial; ii++ )
361 {
362 if ( ii != k )
363 {
364 if ( indflag == 0 )
365 {
366 if ( index[ii] == ( _nstate[ii] - 1 ) )
367 {
368 index[ii] = 0;
369 index1[ii] = 0;
370 }
371 else
372 {
373 indflag = 1;
374 index[ii] += 1;
375 index1[ii] += 1;
376 }
377 }
378 }
379 }
380 }
381 rho.Set( i, j, temp );
382 }
383 }
384
385 return rho;
386}
387
388EvtAmp EvtAmp::contract( int i, const EvtAmp& a1, const EvtAmp& a2 ) {
389
390 assert( a2._pstates > 1 && a2._nontrivial == 1 );
391
392 EvtAmp tmp;
393 report( DEBUG, "EvtGen" ) << "EvtAmp::contract not written yet" << endl;
394 return tmp;
395}
396
398
399 int i, list[10];
400
401 report( DEBUG, "EvtGen" ) << "Number of daugthers:" << _ndaug << endl;
402 report( DEBUG, "EvtGen" ) << "Number of states of the parent:" << _pstates << endl;
403 report( DEBUG, "EvtGen" ) << "Number of states on daughters:";
404 for ( i = 0; i < _ndaug; i++ ) { report( DEBUG, "EvtGen" ) << dstates[i] << " "; }
405 report( DEBUG, "EvtGen" ) << endl;
406 report( DEBUG, "EvtGen" ) << "Nontrivial index of daughters:";
407 for ( i = 0; i < _ndaug; i++ ) { report( DEBUG, "EvtGen" ) << _dnontrivial[i] << " "; }
408 report( DEBUG, "EvtGen" ) << endl;
409 report( DEBUG, "EvtGen" ) << "number of nontrivial states:" << _nontrivial << endl;
410 report( DEBUG, "EvtGen" ) << "Nontrivial particles number of states:";
411 for ( i = 0; i < _nontrivial; i++ ) { report( DEBUG, "EvtGen" ) << _nstate[i] << " "; }
412 report( DEBUG, "EvtGen" ) << endl;
413 report( DEBUG, "EvtGen" ) << "Amplitudes:" << endl;
414 if ( _nontrivial == 0 )
415 {
416 list[0] = 0;
417 report( DEBUG, "EvtGen" ) << getAmp( list ) << endl;
418 }
419
420 int allloop[10];
421 allloop[0] = 1;
422 for ( i = 0; i < _nontrivial; i++ )
423 {
424 if ( i == 0 ) { allloop[i] *= _nstate[i]; }
425 else { allloop[i] = allloop[i - 1] * _nstate[i]; }
426 }
427 int index = 0;
428 for ( i = 0; i < allloop[_nontrivial - 1]; i++ )
429 {
430 report( DEBUG, "EvtGen" ) << getAmp( list ) << " ";
431 if ( i == allloop[index] - 1 )
432 {
433 index++;
434 report( DEBUG, "EvtGen" ) << endl;
435 }
436 }
437
438 report( DEBUG, "EvtGen" ) << "-----------------------------------" << endl;
439}
440
441void EvtAmp::vertex( const EvtComplex& c ) {
442 int list[1];
443 list[0] = 0;
444 setAmp( list, c );
445}
446
447void EvtAmp::vertex( int i, const EvtComplex& c ) {
448 int list[1];
449 list[0] = i;
450 setAmp( list, c );
451}
452
453void EvtAmp::vertex( int i, int j, const EvtComplex& c ) {
454 int list[2];
455 list[0] = i;
456 list[1] = j;
457 setAmp( list, c );
458}
459
460void EvtAmp::vertex( int i, int j, int k, const EvtComplex& c ) {
461 int list[3];
462 list[0] = i;
463 list[1] = j;
464 list[2] = k;
465 setAmp( list, c );
466}
467
468void EvtAmp::vertex( int* i1, const EvtComplex& c ) { setAmp( i1, c ); }
469
471
472 int i;
473
474 _ndaug = amp._ndaug;
475 _pstates = amp._pstates;
476 for ( i = 0; i < _ndaug; i++ )
477 {
478 dstates[i] = amp.dstates[i];
479 _dnontrivial[i] = amp._dnontrivial[i];
480 }
481 _nontrivial = amp._nontrivial;
482
483 int namp = _pstates;
484
485 for ( i = 0; i < _nontrivial; i++ )
486 {
487 _nstate[i] = amp._nstate[i];
488 namp *= _nstate[i];
489 }
490
491 for ( i = 0; i < namp; i++ ) { _amp[i] = amp._amp[i]; }
492
493 return *this;
494}
const Int_t n
Evt3Rank3C conj(const Evt3Rank3C &t2)
ostream & report(Severity severity, const char *facility)
Definition EvtReport.cc:34
@ DEBUG
Definition EvtReport.hh:53
@ ERROR
Definition EvtReport.hh:49
const EvtComplex & getAmp(int *ind) const
Definition EvtAmp.cc:121
EvtSpinDensity contract(int i, const EvtAmp &a)
Definition EvtAmp.cc:317
void setAmp(int *ind, const EvtComplex &amp)
Definition EvtAmp.cc:108
void vertex(const EvtComplex &amp)
Definition EvtAmp.cc:441
EvtAmp()
Definition EvtAmp.cc:35
void init(EvtId p, int ndaug, EvtId *daug)
Definition EvtAmp.cc:65
void dump()
Definition EvtAmp.cc:397
EvtSpinDensity getBackwardSpinDensity(EvtSpinDensity *rho_list)
Definition EvtAmp.cc:197
EvtSpinDensity getForwardSpinDensity(EvtSpinDensity *rho_list, int k)
Definition EvtAmp.cc:225
EvtSpinDensity getSpinDensity()
Definition EvtAmp.cc:135
EvtAmp & operator=(const EvtAmp &amp)
Definition EvtAmp.cc:470
Definition EvtId.hh:27
static EvtSpinType::spintype getSpinType(EvtId i)
Definition EvtPDL.hh:66
const EvtComplex & Get(int i, int j) const
void Set(int i, int j, const EvtComplex &rhoij)
void SetDim(int n)
static int getSpinStates(spintype stype)