]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TEvtGen/EvtGenModels/EvtPartWave.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / TEvtGen / EvtGenModels / EvtPartWave.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) 2000 Caltech, UCSB
10//
11// Module: EvtHelAmp.cc
12//
13// Description: Decay model for implementation of generic 2 body
14// decay specified by the partial wave amplitudes
15//
16//
17// Modification history:
18//
19// fkw February 2, 2001 changes to satisfy KCC
20// RYD September 7, 2000 Module created
21//
22//------------------------------------------------------------------------
23//
24#include "EvtGenBase/EvtPatches.hh"
25#include <stdlib.h>
26#include "EvtGenBase/EvtParticle.hh"
27#include "EvtGenBase/EvtGenKine.hh"
28#include "EvtGenBase/EvtPDL.hh"
29#include "EvtGenBase/EvtVector4C.hh"
30#include "EvtGenBase/EvtTensor4C.hh"
31#include "EvtGenBase/EvtReport.hh"
32#include "EvtGenModels/EvtPartWave.hh"
33#include "EvtGenBase/EvtEvalHelAmp.hh"
34#include "EvtGenBase/EvtId.hh"
35#include <string>
36#include "EvtGenBase/EvtConst.hh"
37#include "EvtGenBase/EvtKine.hh"
38#include "EvtGenBase/EvtCGCoefSingle.hh"
39#include <algorithm>
40using std::endl;
41EvtPartWave::~EvtPartWave() {}
42
43std::string EvtPartWave::getName(){
44
45 return "PARTWAVE";
46
47}
48
49
50EvtDecayBase* EvtPartWave::clone(){
51
52 return new EvtPartWave;
53
54}
55
56void EvtPartWave::init(){
57
58 checkNDaug(2);
59
60 //find out how many states each particle have
61 int _nA=EvtSpinType::getSpinStates(EvtPDL::getSpinType(getParentId()));
62 int _nB=EvtSpinType::getSpinStates(EvtPDL::getSpinType(getDaug(0)));
63 int _nC=EvtSpinType::getSpinStates(EvtPDL::getSpinType(getDaug(1)));
64
65 if (verbose()){
66 report(INFO,"EvtGen")<<"_nA,_nB,_nC:"
67 <<_nA<<","<<_nB<<","<<_nC<<endl;
68 }
69
70 //find out what 2 times the spin is
71 int _JA2=EvtSpinType::getSpin2(EvtPDL::getSpinType(getParentId()));
72 int _JB2=EvtSpinType::getSpin2(EvtPDL::getSpinType(getDaug(0)));
73 int _JC2=EvtSpinType::getSpin2(EvtPDL::getSpinType(getDaug(1)));
74
75 if (verbose()){
76 report(INFO,"EvtGen")<<"_JA2,_JB2,_JC2:"
77 <<_JA2<<","<<_JB2<<","<<_JC2<<endl;
78 }
79
80
81 //allocate memory
82 int* _lambdaA2=new int[_nA];
83 int* _lambdaB2=new int[_nB];
84 int* _lambdaC2=new int[_nC];
85
86 EvtComplexPtr* _HBC=new EvtComplexPtr[_nB];
87 int ib,ic;
88 for(ib=0;ib<_nB;ib++){
89 _HBC[ib]=new EvtComplex[_nC];
90 }
91
92
93 int i;
94 //find the allowed helicities (actually 2*times the helicity!)
95
96 fillHelicity(_lambdaA2,_nA,_JA2);
97 fillHelicity(_lambdaB2,_nB,_JB2);
98 fillHelicity(_lambdaC2,_nC,_JC2);
99
100 if (verbose()){
101 report(INFO,"EvtGen")<<"Helicity states of particle A:"<<endl;
102 for(i=0;i<_nA;i++){
103 report(INFO,"EvtGen")<<_lambdaA2[i]<<endl;
104 }
105
106 report(INFO,"EvtGen")<<"Helicity states of particle B:"<<endl;
107 for(i=0;i<_nB;i++){
108 report(INFO,"EvtGen")<<_lambdaB2[i]<<endl;
109 }
110
111 report(INFO,"EvtGen")<<"Helicity states of particle C:"<<endl;
112 for(i=0;i<_nC;i++){
113 report(INFO,"EvtGen")<<_lambdaC2[i]<<endl;
114 }
115
116 report(INFO,"EvtGen")<<"Will now figure out the valid (M_LS) states:"<<endl;
117
118 }
119
120 int Lmin=std::max(_JA2-_JB2-_JC2,std::max(_JB2-_JA2-_JC2,_JC2-_JA2-_JB2));
121 if (Lmin<0) Lmin=0;
122 //int Lmin=_JA2-_JB2-_JC2;
123 int Lmax=_JA2+_JB2+_JC2;
124
125 int L;
126
127 int _nPartialWaveAmp=0;
128
129 int _nL[50];
130 int _nS[50];
131
132 for (L=Lmin;L<=Lmax;L+=2){
133 int Smin=abs(L-_JA2);
134 if (Smin<abs(_JB2-_JC2)) Smin=abs(_JB2-_JC2);
135 int Smax=L+_JA2;
136 if (Smax>abs(_JB2+_JC2)) Smax=abs(_JB2+_JC2);
137 int S;
138 for (S=Smin;S<=Smax;S+=2){
139 _nL[_nPartialWaveAmp]=L;
140 _nS[_nPartialWaveAmp]=S;
141
142 _nPartialWaveAmp++;
143 if (verbose()){
144 report(INFO,"EvtGen")<<"M["<<L<<"]["<<S<<"]"<<endl;
145 }
146 }
147 }
148
149 checkNArg(_nPartialWaveAmp*2);
150
151 int argcounter=0;
152
153 EvtComplex _M[50];
154
155 double partampsqtot=0.0;
156
157 for(i=0;i<_nPartialWaveAmp;i++){
158 _M[i]=getArg(argcounter)*exp(EvtComplex(0.0,getArg(argcounter+1)));;
159 argcounter+=2;
160 partampsqtot+=abs2(_M[i]);
161 if (verbose()){
162 report(INFO,"EvtGen")<<"M["<<_nL[i]<<"]["<<_nS[i]<<"]="<<_M[i]<<endl;
163 }
164 }
165
166 //Now calculate the helicity amplitudes
167
168 double helampsqtot=0.0;
169
170 for(ib=0;ib<_nB;ib++){
171 for(ic=0;ic<_nC;ic++){
172 _HBC[ib][ic]=0.0;
173 if (abs(_lambdaB2[ib]-_lambdaC2[ic])<=_JA2){
174 for(i=0;i<_nPartialWaveAmp;i++){
175 int L=_nL[i];
176 int S=_nS[i];
177 int lambda2=_lambdaB2[ib];
178 int lambda3=_lambdaC2[ic];
179 int s1=_JA2;
180 int s2=_JB2;
181 int s3=_JC2;
182 int m1=lambda2-lambda3;
183 EvtCGCoefSingle c1(s2,s3);
184 EvtCGCoefSingle c2(L,S);
185
186 if (verbose()){
187 report(INFO,"EvtGen") << "s2,lambda2:"<<s2<<" "<<lambda2<<endl;
188 }
189 //fkw changes to satisfy KCC
190 double fkwTmp = (L+1.0)/(s1+1.0);
191
192 if (S>=abs(m1)){
193
194 EvtComplex tmp=sqrt(fkwTmp)
195 *c1.coef(S,m1,s2,s3,lambda2,-lambda3)
196 *c2.coef(s1,m1,L,S,0,m1)*_M[i];
197 _HBC[ib][ic]+=tmp;
198 }
199 }
200 if (verbose()){
201 report(INFO,"EvtGen")<<"_HBC["<<ib<<"]["<<ic<<"]="<<_HBC[ib][ic]<<endl;
202 }
203 }
204 helampsqtot+=abs2(_HBC[ib][ic]);
205 }
206 }
207
208 if (fabs(helampsqtot-partampsqtot)/(helampsqtot+partampsqtot)>1e-6){
209 report(ERROR,"EvtGen")<<"In EvtPartWave for decay "
210 << EvtPDL::name(getParentId()) << " -> "
211 << EvtPDL::name(getDaug(0)) << " "
212 << EvtPDL::name(getDaug(1)) << std::endl;
213 report(ERROR,"EvtGen")<<"With arguments: "<<std::endl;
214 for(i=0;i*2<getNArg();i++){
215 report(ERROR,"EvtGen") <<"M("<<_nL[i]<<","<<_nS[i]<<")="
216// <<getArg(2*i)<<" "<<getArg(2*i+1)<<std::endl;
217 <<_M[i]<<std::endl;
218 }
219 report(ERROR,"EvtGen")<< "The total probability in the partwave basis is: "
220 << partampsqtot << std::endl;
221 report(ERROR,"EvtGen")<< "The total probability in the helamp basis is: "
222 << helampsqtot << std::endl;
223 report(ERROR,"EvtGen")<< "Most likely this is because the specified partwave amplitudes "
224 << std::endl;
225 report(ERROR,"EvtGen")<< "project onto unphysical helicities of photons or neutrinos. "
226 << std::endl;
227 report(ERROR,"EvtGen")<< "Seriously consider if your specified amplitudes are correct. "
228 << std::endl;
229
230
231 }
232
233 _evalHelAmp=new EvtEvalHelAmp(getParentId(),
234 getDaug(0),
235 getDaug(1),
236 _HBC);
237
238}
239
240
241void EvtPartWave::initProbMax(){
242
243 double maxprob=_evalHelAmp->probMax();
244
245 if (verbose()){
246 report(INFO,"EvtGen")<<"Calculated probmax"<<maxprob<<endl;
247 }
248
249 setProbMax(maxprob);
250
251}
252
253
254void EvtPartWave::decay( EvtParticle *p){
255
256 //first generate simple phase space
257 p->initializePhaseSpace(getNDaug(),getDaugs());
258
259 _evalHelAmp->evalAmp(p,_amp2);
260
261 return;
262
263}
264
265
266
267void EvtPartWave::fillHelicity(int* lambda2,int n,int J2){
268
269 int i;
270
271 //photon is special case!
272 if (n==2&&J2==2) {
273 lambda2[0]=2;
274 lambda2[1]=-2;
275 return;
276 }
277
278 assert(n==J2+1);
279
280 for(i=0;i<n;i++){
281 lambda2[i]=n-i*2-1;
282 }
283
284 return;
285
286}
287
288
289
290
291
292
293
294
295
296
297