]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TEvtGen/EvtGenBase/EvtAmp.cxx
Removing the flat makefiles
[u/mrichter/AliRoot.git] / TEvtGen / EvtGenBase / EvtAmp.cxx
CommitLineData
da0e9ce3 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 "EvtGenBase/EvtPatches.hh"
22#include <iostream>
23#include <math.h>
24#include <assert.h>
25#include "EvtGenBase/EvtComplex.hh"
26#include "EvtGenBase/EvtSpinDensity.hh"
27#include "EvtGenBase/EvtAmp.hh"
28#include "EvtGenBase/EvtReport.hh"
29#include "EvtGenBase/EvtId.hh"
30#include "EvtGenBase/EvtPDL.hh"
31#include "EvtGenBase/EvtParticle.hh"
32using std::endl;
33
34
35
36EvtAmp::EvtAmp(){
37 _ndaug=0;
38 _pstates=0;
39 _nontrivial=0;
40}
41
42
43EvtAmp::EvtAmp(const EvtAmp& amp){
44
45 int i;
46
47 _ndaug=amp._ndaug;
48 _pstates=amp._pstates;
49 for(i=0;i<_ndaug;i++){
50 dstates[i]=amp.dstates[i];
51 _dnontrivial[i]=amp._dnontrivial[i];
52 }
53 _nontrivial=amp._nontrivial;
54
55 int namp=1;
56
57 for(i=0;i<_nontrivial;i++){
58 _nstate[i]=amp._nstate[i];
59 namp*=_nstate[i];
60 }
61
62 for(i=0;i<namp;i++){
63 assert(i<125);
64 _amp[i]=amp._amp[i];
65 }
66
67}
68
69
70
71void EvtAmp::init(EvtId p,int ndaugs,EvtId *daug){
72 setNDaug(ndaugs);
73 int ichild;
74 int daug_states[100],parstates;
75 for(ichild=0;ichild<ndaugs;ichild++){
76
77 daug_states[ichild]=
78 EvtSpinType::getSpinStates(EvtPDL::getSpinType(daug[ichild]));
79
80 }
81
82 parstates=EvtSpinType::getSpinStates(EvtPDL::getSpinType(p));
83
84 setNState(parstates,daug_states);
85
86}
87
88
89
90
91void EvtAmp::setNDaug(int n){
92 _ndaug=n;
93}
94
95void EvtAmp::setNState(int parent_states,int *daug_states){
96
97 _nontrivial=0;
98 _pstates=parent_states;
99
100 if(_pstates>1) {
101 _nstate[_nontrivial]=_pstates;
102 _nontrivial++;
103 }
104
105 int i;
106
107 for(i=0;i<_ndaug;i++){
108 dstates[i]=daug_states[i];
109 _dnontrivial[i]=-1;
110 if(daug_states[i]>1) {
111 _nstate[_nontrivial]=daug_states[i];
112 _dnontrivial[i]=_nontrivial;
113 _nontrivial++;
114 }
115 }
116
117 if (_nontrivial>5) {
118 report(ERROR,"EvtGen") << "Too many nontrivial states in EvtAmp!"<<endl;
119 }
120
121}
122
123void EvtAmp::setAmp(int *ind, const EvtComplex& a){
124
125 int nstatepad = 1;
126 int position = ind[0];
127
128 for ( int i=1; i<_nontrivial; i++ ) {
129 nstatepad *= _nstate[i-1];
130 position += nstatepad*ind[i];
131 }
132 assert(position<125);
133 _amp[position] = a;
134
135}
136
137const EvtComplex& EvtAmp::getAmp(int *ind)const{
138
139 int nstatepad = 1;
140 int position = ind[0];
141
142 for ( int i=1; i<_nontrivial; i++ ) {
143 nstatepad *= _nstate[i-1];
144 position += nstatepad*ind[i];
145 }
146
147 return _amp[position];
148}
149
150
151EvtSpinDensity EvtAmp::getSpinDensity(){
152
153 EvtSpinDensity rho;
154 rho.setDim(_pstates);
155
156 EvtComplex temp;
157
158 int i,j,n;
159
160 if (_pstates==1) {
161
162 if (_nontrivial==0) {
163
164 rho.set(0,0,_amp[0]*conj(_amp[0]));
165 return rho;
166
167 }
168
169 n=1;
170
171 temp = EvtComplex(0.0);
172
173 for(i=0;i<_nontrivial;i++){
174 n*=_nstate[i];
175 }
176
177 for(i=0;i<n;i++){
178 temp+=_amp[i]*conj(_amp[i]);
179 }
180
181 rho.set(0,0,temp);;
182
183 return rho;
184
185 }
186
187 else{
188
189 for(i=0;i<_pstates;i++){
190 for(j=0;j<_pstates;j++){
191
192 temp = EvtComplex(0.0);
193
194 int kk;
195
196 int allloop = 1;
197 for (kk=0;kk<(_nontrivial-1); kk++ ) {
198 allloop *= dstates[kk];
199 }
200
201 for (kk=0; kk<allloop; kk++) {
202 temp += _amp[_pstates*kk+i]*conj(_amp[_pstates*kk+j]);}
203
204 // if (_nontrivial>3){
205 //report(ERROR,"EvtGen") << "Can't handle so many states in EvtAmp!"<<endl;
206 //}
207
208 rho.set(i,j,temp);
209
210 }
211 }
212 return rho;
213 }
214
215}
216
217
218EvtSpinDensity EvtAmp::getBackwardSpinDensity(EvtSpinDensity *rho_list){
219
220 EvtSpinDensity rho;
221
222 rho.setDim(_pstates);
223
224 if (_pstates==1){
225 rho.set(0,0,EvtComplex(1.0,0.0));
226 return rho;
227 }
228
229 int k;
230
231 EvtAmp ampprime;
232
233 ampprime=(*this);
234
235 for(k=0;k<_ndaug;k++){
236
237 if (dstates[k]!=1){
238 ampprime=ampprime.contract(_dnontrivial[k],rho_list[k+1]);
239 }
240 }
241
242 return ampprime.contract(0,(*this));
243
244}
245
246
247EvtSpinDensity EvtAmp::getForwardSpinDensity(EvtSpinDensity *rho_list,int i){
248
249 EvtSpinDensity rho;
250
251 rho.setDim(dstates[i]);
252
253 int k;
254
255 if (dstates[i]==1) {
256
257 rho.set(0,0,EvtComplex(1.0,0.0));
258
259 return rho;
260
261 }
262
263 EvtAmp ampprime;
264
265 ampprime=(*this);
266
267 if (_pstates!=1){
268 ampprime=ampprime.contract(0,rho_list[0]);
269 }
270
271 for(k=0;k<i;k++){
272
273 if (dstates[k]!=1){
274 ampprime=ampprime.contract(_dnontrivial[k],rho_list[k+1]);
275 }
276
277 }
278
279 return ampprime.contract(_dnontrivial[i],(*this));
280
281}
282
283EvtAmp EvtAmp::contract(int k,const EvtSpinDensity& rho){
284
285 EvtAmp temp;
286
287 int i,j;
288 temp._ndaug=_ndaug;
289 temp._pstates=_pstates;
290 temp._nontrivial=_nontrivial;
291
292 for(i=0;i<_ndaug;i++){
293 temp.dstates[i]=dstates[i];
294 temp._dnontrivial[i]=_dnontrivial[i];
295 }
296
297 if (_nontrivial==0) {
298 report(ERROR,"EvtGen")<<"Should not be here EvtAmp!"<<endl;
299 }
300
301
302 for(i=0;i<_nontrivial;i++){
303 temp._nstate[i]=_nstate[i];
304 }
305
306
307 EvtComplex c;
308
309 int index[10];
310 for (i=0;i<10;i++) {
311 index[i] = 0;
312 }
313
314 int allloop = 1;
315 int indflag,ii;
316 for (i=0;i<_nontrivial;i++) {
317 allloop *= _nstate[i];
318 }
319
320 for ( i=0;i<allloop;i++) {
321
322 c = EvtComplex(0.0);
323 int tempint = index[k];
324 for (j=0;j<_nstate[k];j++) {
325 index[k] = j;
326 c+=rho.get(j,tempint)*getAmp(index);
327 }
328 index[k] = tempint;
329
330 temp.setAmp(index,c);
331
332 indflag = 0;
333 for ( ii=0;ii<_nontrivial;ii++) {
334 if ( indflag == 0 ) {
335 if ( index[ii] == (_nstate[ii]-1) ) {
336 index[ii] = 0;
337 }
338 else {
339 indflag = 1;
340 index[ii] += 1;
341 }
342 }
343 }
344
345 }
346 return temp;
347
348}
349
350
351EvtSpinDensity EvtAmp::contract(int k,const EvtAmp& amp2){
352
353 int i,j,l;
354
355 EvtComplex temp;
356 EvtSpinDensity rho;
357
358 rho.setDim(_nstate[k]);
359
360 int allloop = 1;
361 int indflag,ii;
362 for (i=0;i<_nontrivial;i++) {
363 allloop *= _nstate[i];
364 }
365
366 int index[10];
367 int index1[10];
368 // int l;
369 for(i=0;i<_nstate[k];i++){
370
371 for(j=0;j<_nstate[k];j++){
372 if (_nontrivial==0) {
373 report(ERROR,"EvtGen")<<"Should not be here1 EvtAmp!"<<endl;
374 rho.set(0,0,EvtComplex(1.0,0.0));
375 return rho;
376 }
377
378 for (ii=0;ii<10;ii++) {
379 index[ii] = 0;
380 index1[ii] = 0;
381 }
382 index[k] = i;
383 index1[k] = j;
384
385 temp = EvtComplex(0.0);
386
387 for ( l=0;l<int(allloop/_nstate[k]);l++) {
388
389 temp+=getAmp(index)*conj(amp2.getAmp(index1));
390 indflag = 0;
391 for ( ii=0;ii<_nontrivial;ii++) {
392 if ( ii!= k) {
393 if ( indflag == 0 ) {
394 if ( index[ii] == (_nstate[ii]-1) ) {
395 index[ii] = 0;
396 index1[ii] = 0;
397 }
398 else {
399 indflag = 1;
400 index[ii] += 1;
401 index1[ii] += 1;
402 }
403 }
404 }
405 }
406 }
407 rho.set(i,j,temp);
408
409 }
410 }
411
412 return rho;
413}
414
415
416EvtAmp EvtAmp::contract(int i, const EvtAmp& a1,const EvtAmp& a2){
417
418 //Do we need this method?
419
420 assert(a2._pstates>1&&a2._nontrivial==1);
421 assert(i<=a1._nontrivial);
422
423 EvtAmp tmp;
424 report(DEBUG,"EvtGen") << "EvtAmp::contract not written yet" << endl;
425 return tmp;
426
427}
428
429
430void EvtAmp::dump(){
431
432 int i,list[10];
433
434 report(DEBUG,"EvtGen") << "Number of daugthers:"<<_ndaug<<endl;
435 report(DEBUG,"EvtGen") << "Number of states of the parent:"<<_pstates<<endl;
436 report(DEBUG,"EvtGen") << "Number of states on daughters:";
437 for (i=0;i<_ndaug;i++){
438 report(DEBUG,"EvtGen") <<dstates[i]<<" ";
439 }
440 report(DEBUG,"EvtGen") << endl;
441 report(DEBUG,"EvtGen") << "Nontrivial index of daughters:";
442 for (i=0;i<_ndaug;i++){
443 report(DEBUG,"EvtGen") <<_dnontrivial[i]<<" ";
444 }
445 report(DEBUG,"EvtGen") <<endl;
446 report(DEBUG,"EvtGen") <<"number of nontrivial states:"<<_nontrivial<<endl;
447 report(DEBUG,"EvtGen") << "Nontrivial particles number of states:";
448 for (i=0;i<_nontrivial;i++){
449 report(DEBUG,"EvtGen") <<_nstate[i]<<" ";
450 }
451 report(DEBUG,"EvtGen") <<endl;
452 report(DEBUG,"EvtGen") <<"Amplitudes:"<<endl;
453 if (_nontrivial==0){
454 list[0] = 0;
455 report(DEBUG,"EvtGen") << getAmp(list) << endl;
456 }
457
458 int allloop[10];
459 allloop[0]=1;
460 for (i=0;i<_nontrivial;i++) {
461 if (i==0){
462 allloop[i] *= _nstate[i];
463 }
464 else{
465 allloop[i] = allloop[i-1]*_nstate[i];
466 }
467 }
468 int index = 0;
469 for (i=0;i<allloop[_nontrivial-1];i++) {
470 report(DEBUG,"EvtGen") << getAmp(list) << " ";
471 if ( i==allloop[index]-1 ) {
472 index ++;
473 report(DEBUG,"EvtGen") << endl;
474 }
475 }
476
477 report(DEBUG,"EvtGen") << "-----------------------------------"<<endl;
478
479}
480
481
482void EvtAmp::vertex(const EvtComplex& c){
483 int list[1];
484 list[0] = 0;
485 setAmp(list,c);
486}
487
488void EvtAmp::vertex(int i,const EvtComplex& c){
489 int list[1];
490 list[0] = i;
491 setAmp(list,c);
492}
493
494void EvtAmp::vertex(int i,int j,const EvtComplex& c){
495 int list[2];
496 list[0] = i;
497 list[1] = j;
498 setAmp(list,c);
499}
500
501void EvtAmp::vertex(int i,int j,int k,const EvtComplex& c){
502 int list[3];
503 list[0] = i;
504 list[1] = j;
505 list[2] = k;
506 setAmp(list,c);
507}
508
509void EvtAmp::vertex(int *i1,const EvtComplex& c){
510
511 setAmp(i1,c);
512}
513
514
515EvtAmp& EvtAmp::operator=(const EvtAmp& amp){
516
517 int i;
518
519 _ndaug=amp._ndaug;
520 _pstates=amp._pstates;
521 for(i=0;i<_ndaug;i++){
522 dstates[i]=amp.dstates[i];
523 _dnontrivial[i]=amp._dnontrivial[i];
524 }
525 _nontrivial=amp._nontrivial;
526
527 int namp=1;
528
529 for(i=0;i<_nontrivial;i++){
530 _nstate[i]=amp._nstate[i];
531 namp*=_nstate[i];
532 }
533
534 for(i=0;i<namp;i++){
535 assert(i<125);
536 _amp[i]=amp._amp[i];
537 }
538
539 return *this;
540}
541
542
543
544
545
546
547
548
549
550
551