00001 //-------------------------------------------------------------------------- 00002 // 00003 // Environment: 00004 // This software is part of the EvtGen package developed jointly 00005 // for the BaBar and CLEO collaborations. If you use all or part 00006 // of it, please give an appropriate acknowledgement. 00007 // 00008 // Copyright Information: See EvtGen/COPYRIGHT 00009 // Copyright (C) 2001 Royal Holloway, University of London 00010 // 00011 // Module: EvtSVVNONCPEIGEN.cc 00012 // 00013 // Description: Routine to decay scalar -> vector vector 00014 // and has CP violation. 00015 // 00016 // This model does all the ckm-suppressed decays and mixing for you. It randomly 'overwrites' 00017 // any reco or tagging state as set in the Y(4S) decay model (VSS_(B)MIX) with its own generated states. 00018 // 00019 // As such, the corresponding dec file requires only one decay-mode description, for example: 00020 // Decay MyB0 00021 // 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 ; 00022 // EndDecay 00023 // and furthermore Y(4S) only needs to decay to B0's (or B0bar's). 00024 // The decay above should be a CKM-favored mode (eg. B0->D*-rho+ or B0bar->D*+rho-). 00025 // All ckm-suppressed decays and the mixing are derived from this line in the ::Decay function. 00026 // 00027 // There are 15 or 27 arguments. The first three are dm, phase1 00028 // and phase2. dm is the B0-B0bar mass difference. Phases 1 00029 // and 2 are the CKM weak phases relevant for the particular mode, 00030 // eg for B-->DstRho phase1 is beta and phase2 is gamma. 00031 // 00032 // The next arguments are the 2 amplitudes (= 12 input parameters) 00033 // in the order: A_f, Abar_f. In the example above, the 'A_f' amplitude now 00034 // stands for the ckm-favored decay 'B0->D*-rho+', and 'Abar_f' stands for 'B0bar->D*-rho+' 00035 // 00036 // Each amplitude has its 3 helicity states in the order +, 0, -, which are each 00037 // specified by a magnitude and a strong phase. 00038 // 00039 // The last 2 arguments A_fbar and Abar_fbar (=12 input parameters) are not necessary, 00040 // but can included if one wants to set them differently from A_f, Abar_f. 00041 // 00042 // Mind you that Hbar_+- = H_-+ (ignoring the weak phase, which flips sign). 00043 // It is custumary to select one set of helicity states (eg H_+-) and to adopt these for 00044 // the CP-conjugate decays as well (ie. depict Hbar_-+ with H_+-), which is the interpretation 00045 // we use for the input-parameters above. 00046 // However, the angular decay in EvtGen is just a formula in which helicity amplitudes are 'plugged' in, 00047 // making no difference between B0 or B0bar decays. In the model below we (thus) account for the +- 00048 // flipping between B0 and B0bar. 00049 // 00050 // 00051 // Modification history: 00052 // Ajit Kurup 9 March 2001 Module created (from EvtSVSNONCPEIGEN) 00053 // Max Baak 01/16/2004 Fix of Helicity amplitude ordering. 00054 // Decay also works for B0bar decays. 00055 //------------------------------------------------------------------------ 00056 // 00057 #include "EvtGenBase/EvtPatches.hh" 00058 #include <stdlib.h> 00059 #include "EvtGenBase/EvtParticle.hh" 00060 #include "EvtGenBase/EvtRandom.hh" 00061 #include "EvtGenBase/EvtGenKine.hh" 00062 #include "EvtGenBase/EvtCPUtil.hh" 00063 #include "EvtGenBase/EvtPDL.hh" 00064 #include "EvtGenBase/EvtReport.hh" 00065 #include "EvtGenBase/EvtVector4C.hh" 00066 #include "EvtGenModels/EvtSVVNONCPEIGEN.hh" 00067 #include <string> 00068 #include "EvtGenModels/EvtSVVHelAmp.hh" 00069 #include "EvtGenBase/EvtConst.hh" 00070 00071 EvtSVVNONCPEIGEN::~EvtSVVNONCPEIGEN() {} 00072 00073 void EvtSVVNONCPEIGEN::getName(std::string& model_name){ 00074 00075 model_name="SVV_NONCPEIGEN"; 00076 00077 } 00078 00079 00080 EvtDecayBase* EvtSVVNONCPEIGEN::clone(){ 00081 00082 return new EvtSVVNONCPEIGEN; 00083 00084 } 00085 00086 void EvtSVVNONCPEIGEN::init(){ 00087 00088 // check that there are 27 arguments 00089 checkNArg(27,15); 00090 checkNDaug(2); 00091 00092 checkSpinDaughter(0,EvtSpinType::VECTOR); 00093 checkSpinDaughter(1,EvtSpinType::VECTOR); 00094 00095 // The ordering of A_f is : 00096 // A_f[0-2] = A_f 00097 // A_f[3-5] = Abar_f 00098 // A_f[6-8] = A_fbar 00099 // A_f[9-11] = Abar_fbar 00100 // 00101 // Each of the 4 amplitudes include the 3 different helicity states in 00102 // the order +, 0, -. See more about helicity amplitude ordering in ::decay 00103 00104 int i=0; 00105 int j=(getNArg()-3)/2; 00106 00107 for(i=0; i<j; ++i){ 00108 _A_f[i] = getArg((2*i)+3) * EvtComplex( cos(getArg((2*i)+4)),sin(getArg((2*i)+4)) ); 00109 } 00110 00111 // If only 6 amplitudes are specified, calculate the last 6 from the first 6: 00112 if(6 == j){ 00113 for(i = 0; i < 3; ++i){ 00114 _A_f[6+i] = _A_f[3+i]; 00115 _A_f[9+i] = _A_f[i]; 00116 } 00117 } 00118 } 00119 00120 void EvtSVVNONCPEIGEN::initProbMax() { 00121 double probMax = 0; 00122 for (int i = 0; i < 12; ++i){ 00123 double amp = abs(_A_f[i]); 00124 probMax += amp * amp; 00125 } 00126 00127 setProbMax(probMax); 00128 } 00129 00130 void EvtSVVNONCPEIGEN::decay( EvtParticle *p){ 00131 00132 //added by Lange Jan4,2000 00133 static EvtId B0=EvtPDL::getId("B0"); 00134 static EvtId B0B=EvtPDL::getId("anti-B0"); 00135 00136 double t; 00137 EvtId other_b; 00138 EvtId daugs[2]; 00139 00140 00141 // MB: flip selects the final of the decay 00142 int flip = ((p->getId() == B0) ? 0 : 1); 00143 daugs[0]=getDaug(0); 00144 daugs[1]=getDaug(1); 00145 p->initializePhaseSpace(2,daugs); 00146 00147 EvtCPUtil::OtherB(p,t,other_b,0.5); 00148 00149 EvtComplex amp[3]; 00150 00151 double dmt2 = getArg(0) * t / (2 * EvtConst::c); 00152 double phiCKM = (2.0 * getArg(1) + getArg(2)); // 2b+g 00153 EvtComplex ePlusIPhi(cos(phiCKM), sin(phiCKM)); 00154 EvtComplex eMinusIPhi(cos(-phiCKM), sin(-phiCKM)); 00155 00156 // flip == 0 : D*-rho+ 00157 // flip == 1 : D*+rho- 00158 00159 if (!flip) { 00160 if (other_b==B0B){ 00161 // At t=0 we have a B0 00162 for (int i=0; i<3; ++i) { 00163 amp[i] = _A_f[i]*cos(dmt2) + eMinusIPhi*EvtComplex(0.0,sin(dmt2))*_A_f[i+3]; 00164 } 00165 } 00166 if (other_b==B0){ 00167 // At t=0 we have a B0bar 00168 for(int i=0; i<3; ++i) { 00169 amp[i] = _A_f[i]*ePlusIPhi*EvtComplex(0.0,sin(dmt2)) + _A_f[i+3]*cos(dmt2); 00170 } 00171 } 00172 } else{ 00173 if (other_b==B0B){ 00174 // At t=0 we have a B0 00175 00176 // M.Baak 01/16/2004 00177 // Note: \bar{H}+- = H-+ 00178 // If one wants to use the correct helicities for B0 and B0bar decays but the same formula-notation (as done in EvtSVV_HelAmp), 00179 // count the B0bar helicities backwards. (Equivalently, one could flip the chi angle.) 00180 00181 for(int i=0; i<3; ++i) { 00182 amp[i] = _A_f[8-i]*cos(dmt2) + eMinusIPhi*EvtComplex(0.0,sin(dmt2))*_A_f[11-i]; 00183 } 00184 } 00185 if (other_b==B0){ 00186 // At t=0 we have a B0bar 00187 for(int i=0; i<3; ++i) { 00188 amp[i] = _A_f[8-i] * ePlusIPhi * EvtComplex(0.0,sin(dmt2)) + _A_f[11-i]*cos(dmt2); 00189 } 00190 } 00191 } 00192 00193 EvtSVVHelAmp::SVVHel(p,_amp2,daugs[0],daugs[1],amp[0],amp[1],amp[2]); 00194 00195 return ; 00196 } 00197