Line data Source code
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) 2001 Royal Holloway, University of London
10 : //
11 : // Module: EvtSVVNONCPEIGEN.cc
12 : //
13 : // Description: Routine to decay scalar -> vector vector
14 : // and has CP violation.
15 : //
16 : // This model does all the ckm-suppressed decays and mixing for you. It randomly 'overwrites'
17 : // any reco or tagging state as set in the Y(4S) decay model (VSS_(B)MIX) with its own generated states.
18 : //
19 : // As such, the corresponding dec file requires only one decay-mode description, for example:
20 : // Decay MyB0
21 : // 1.000 rho+ MyD*- SVV_NONCPEIGEN dm beta gamma 0.322 0.31 0.941 0 0.107 1.42 0.02 0 0.02 0 0.02 0 ;
22 : // EndDecay
23 : // and furthermore Y(4S) only needs to decay to B0's (or B0bar's).
24 : // The decay above should be a CKM-favored mode (eg. B0->D*-rho+ or B0bar->D*+rho-).
25 : // All ckm-suppressed decays and the mixing are derived from this line in the ::Decay function.
26 : //
27 : // There are 15 or 27 arguments. The first three are dm, phase1
28 : // and phase2. dm is the B0-B0bar mass difference. Phases 1
29 : // and 2 are the CKM weak phases relevant for the particular mode,
30 : // eg for B-->DstRho phase1 is beta and phase2 is gamma.
31 : //
32 : // The next arguments are the 2 amplitudes (= 12 input parameters)
33 : // in the order: A_f, Abar_f. In the example above, the 'A_f' amplitude now
34 : // stands for the ckm-favored decay 'B0->D*-rho+', and 'Abar_f' stands for 'B0bar->D*-rho+'
35 : //
36 : // Each amplitude has its 3 helicity states in the order +, 0, -, which are each
37 : // specified by a magnitude and a strong phase.
38 : //
39 : // The last 2 arguments A_fbar and Abar_fbar (=12 input parameters) are not necessary,
40 : // but can included if one wants to set them differently from A_f, Abar_f.
41 : //
42 : // Mind you that Hbar_+- = H_-+ (ignoring the weak phase, which flips sign).
43 : // It is custumary to select one set of helicity states (eg H_+-) and to adopt these for
44 : // the CP-conjugate decays as well (ie. depict Hbar_-+ with H_+-), which is the interpretation
45 : // we use for the input-parameters above.
46 : // However, the angular decay in EvtGen is just a formula in which helicity amplitudes are 'plugged' in,
47 : // making no difference between B0 or B0bar decays. In the model below we (thus) account for the +-
48 : // flipping between B0 and B0bar.
49 : //
50 : //
51 : // Modification history:
52 : // Ajit Kurup 9 March 2001 Module created (from EvtSVSNONCPEIGEN)
53 : // Max Baak 01/16/2004 Fix of Helicity amplitude ordering.
54 : // Decay also works for B0bar decays.
55 : //------------------------------------------------------------------------
56 : //
57 : #include "EvtGenBase/EvtPatches.hh"
58 : #include <stdlib.h>
59 : #include "EvtGenBase/EvtParticle.hh"
60 : #include "EvtGenBase/EvtRandom.hh"
61 : #include "EvtGenBase/EvtGenKine.hh"
62 : #include "EvtGenBase/EvtCPUtil.hh"
63 : #include "EvtGenBase/EvtPDL.hh"
64 : #include "EvtGenBase/EvtReport.hh"
65 : #include "EvtGenBase/EvtVector4C.hh"
66 : #include "EvtGenModels/EvtSVVNONCPEIGEN.hh"
67 : #include <string>
68 : #include "EvtGenModels/EvtSVVHelAmp.hh"
69 : #include "EvtGenBase/EvtConst.hh"
70 :
71 0 : EvtSVVNONCPEIGEN::~EvtSVVNONCPEIGEN() {}
72 :
73 : std::string EvtSVVNONCPEIGEN::getName(){
74 :
75 0 : return "SVV_NONCPEIGEN";
76 :
77 : }
78 :
79 :
80 : EvtDecayBase* EvtSVVNONCPEIGEN::clone(){
81 :
82 0 : return new EvtSVVNONCPEIGEN;
83 :
84 0 : }
85 :
86 : void EvtSVVNONCPEIGEN::init(){
87 :
88 : // check that there are 27 arguments
89 0 : checkNArg(27,15);
90 0 : checkNDaug(2);
91 :
92 0 : checkSpinDaughter(0,EvtSpinType::VECTOR);
93 0 : checkSpinDaughter(1,EvtSpinType::VECTOR);
94 :
95 : // The ordering of A_f is :
96 : // A_f[0-2] = A_f
97 : // A_f[3-5] = Abar_f
98 : // A_f[6-8] = A_fbar
99 : // A_f[9-11] = Abar_fbar
100 : //
101 : // Each of the 4 amplitudes include the 3 different helicity states in
102 : // the order +, 0, -. See more about helicity amplitude ordering in ::decay
103 :
104 : int i=0;
105 0 : int j=(getNArg()-3)/2;
106 :
107 0 : for(i=0; i<j; ++i){
108 0 : _A_f[i] = getArg((2*i)+3) * EvtComplex( cos(getArg((2*i)+4)),sin(getArg((2*i)+4)) );
109 : }
110 :
111 : // If only 6 amplitudes are specified, calculate the last 6 from the first 6:
112 0 : if(6 == j){
113 0 : for(i = 0; i < 3; ++i){
114 0 : _A_f[6+i] = _A_f[3+i];
115 0 : _A_f[9+i] = _A_f[i];
116 : }
117 : }
118 0 : }
119 :
120 : void EvtSVVNONCPEIGEN::initProbMax() {
121 : double probMax = 0;
122 0 : for (int i = 0; i < 12; ++i){
123 0 : double amp = abs(_A_f[i]);
124 0 : probMax += amp * amp;
125 : }
126 :
127 0 : setProbMax(probMax);
128 0 : }
129 :
130 : void EvtSVVNONCPEIGEN::decay( EvtParticle *p){
131 :
132 : //added by Lange Jan4,2000
133 0 : static EvtId B0=EvtPDL::getId("B0");
134 0 : static EvtId B0B=EvtPDL::getId("anti-B0");
135 :
136 0 : double t;
137 0 : EvtId other_b;
138 0 : EvtId daugs[2];
139 :
140 :
141 : // MB: flip selects the final of the decay
142 0 : int flip = ((p->getId() == B0) ? 0 : 1);
143 0 : daugs[0]=getDaug(0);
144 0 : daugs[1]=getDaug(1);
145 0 : p->initializePhaseSpace(2,daugs);
146 :
147 0 : EvtCPUtil::getInstance()->OtherB(p,t,other_b,0.5);
148 :
149 0 : EvtComplex amp[3];
150 :
151 0 : double dmt2 = getArg(0) * t / (2 * EvtConst::c);
152 0 : double phiCKM = (2.0 * getArg(1) + getArg(2)); // 2b+g
153 0 : EvtComplex ePlusIPhi(cos(phiCKM), sin(phiCKM));
154 0 : EvtComplex eMinusIPhi(cos(-phiCKM), sin(-phiCKM));
155 :
156 : // flip == 0 : D*-rho+
157 : // flip == 1 : D*+rho-
158 :
159 0 : if (!flip) {
160 0 : if (other_b==B0B){
161 : // At t=0 we have a B0
162 0 : for (int i=0; i<3; ++i) {
163 0 : amp[i] = _A_f[i]*cos(dmt2) + eMinusIPhi*EvtComplex(0.0,sin(dmt2))*_A_f[i+3];
164 : }
165 0 : }
166 0 : if (other_b==B0){
167 : // At t=0 we have a B0bar
168 0 : for(int i=0; i<3; ++i) {
169 0 : amp[i] = _A_f[i]*ePlusIPhi*EvtComplex(0.0,sin(dmt2)) + _A_f[i+3]*cos(dmt2);
170 : }
171 0 : }
172 : } else{
173 0 : if (other_b==B0B){
174 : // At t=0 we have a B0
175 :
176 : // M.Baak 01/16/2004
177 : // Note: \bar{H}+- = H-+
178 : // If one wants to use the correct helicities for B0 and B0bar decays but the same formula-notation (as done in EvtSVV_HelAmp),
179 : // count the B0bar helicities backwards. (Equivalently, one could flip the chi angle.)
180 :
181 0 : for(int i=0; i<3; ++i) {
182 0 : amp[i] = _A_f[8-i]*cos(dmt2) + eMinusIPhi*EvtComplex(0.0,sin(dmt2))*_A_f[11-i];
183 : }
184 0 : }
185 0 : if (other_b==B0){
186 : // At t=0 we have a B0bar
187 0 : for(int i=0; i<3; ++i) {
188 0 : amp[i] = _A_f[8-i] * ePlusIPhi * EvtComplex(0.0,sin(dmt2)) + _A_f[11-i]*cos(dmt2);
189 : }
190 0 : }
191 : }
192 :
193 0 : EvtSVVHelAmp::SVVHel(p,_amp2,daugs[0],daugs[1],amp[0],amp[1],amp[2]);
194 :
195 : return ;
196 0 : }
197 :
198 : std::string EvtSVVNONCPEIGEN::getParamName(int i) {
199 0 : switch(i) {
200 : case 0:
201 0 : return "deltaM";
202 : case 1:
203 0 : return "weakPhase1";
204 : case 2:
205 0 : return "weakPhase2";
206 : case 3:
207 0 : return "AfPlusHelAmp";
208 : case 4:
209 0 : return "AfPlusHelAmpPhase";
210 : case 5:
211 0 : return "AfZeroHelAmp";
212 : case 6:
213 0 : return "AfZeroHelAmpPhase";
214 : case 7:
215 0 : return "AfMinusHelAmp";
216 : case 8:
217 0 : return "AfMinusHelAmpPhase";
218 : case 9:
219 0 : return "AbarfPlusHelAmp";
220 : case 10:
221 0 : return "AbarfPlusHelAmpPhase";
222 : case 11:
223 0 : return "AbarfZeroHelAmp";
224 : case 12:
225 0 : return "AbarfZeroHelAmpPhase";
226 : case 13:
227 0 : return "AbarfMinusHelAmp";
228 : case 14:
229 0 : return "AbarfMinusHelAmpPhase";
230 : case 15:
231 0 : return "AfbarPlusHelAmp";
232 : case 16:
233 0 : return "AfbarPlusHelAmpPhase";
234 : case 17:
235 0 : return "AfbarZeroHelAmp";
236 : case 18:
237 0 : return "AfbarZeroHelAmpPhase";
238 : case 19:
239 0 : return "AfbarMinusHelAmp";
240 : case 20:
241 0 : return "AfbarMinusHelAmpPhase";
242 : case 21:
243 0 : return "AbarfbarPlusHelAmp";
244 : case 22:
245 0 : return "AbarfbarPlusHelAmpPhase";
246 : case 23:
247 0 : return "AbarfbarZeroHelAmp";
248 : case 24:
249 0 : return "AbarfbarZeroHelAmpPhase";
250 : case 25:
251 0 : return "AbarfbarMinusHelAmp";
252 : case 26:
253 0 : return "AbarfbarMinusHelAmpPhase";
254 : default:
255 0 : return "";
256 : }
257 0 : }
258 :
259 : std::string EvtSVVNONCPEIGEN::getParamDefault(int i) {
260 0 : switch(i) {
261 : case 3:
262 0 : return "1.0";
263 : case 4:
264 0 : return "0.0";
265 : case 5:
266 0 : return "1.0";
267 : case 6:
268 0 : return "0.0";
269 : case 7:
270 0 : return "1.0";
271 : case 8:
272 0 : return "0.0";
273 : case 9:
274 0 : return "1.0";
275 : case 10:
276 0 : return "0.0";
277 : case 11:
278 0 : return "1.0";
279 : case 12:
280 0 : return "0.0";
281 : case 13:
282 0 : return "1.0";
283 : case 14:
284 0 : return "0.0";
285 : default:
286 0 : return "";
287 : }
288 0 : }
|