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) 1999 Caltech, UCSB
10 : //
11 : // Module: EvtPVVCPLH.cc
12 : //
13 : // Description: The decay of a scalar to two vector particles are
14 : // performed with CP violation and different widths for
15 : // the CP-even and CP-odd states. E.g. Bs->J/psi phi.
16 : //
17 : // Modification history:
18 : //
19 : // RYD November 5, 1999 Module EvtSVVCPLH created
20 : //
21 : // DUPREE October 10, 2006 Large modification: EvtSVVCPLH->EvtPVVCPLH
22 : // Time-dependence correctly
23 : //
24 : // COWAN June 10, 2009 Modified to use the new EvtCPUtils class.
25 : // EvtIncoherentMixing removed.
26 : //
27 : //------------------------------------------------------------------------
28 : //
29 : #include <stdlib.h>
30 : #include "EvtGenBase/EvtParticle.hh"
31 : #include "EvtGenBase/EvtGenKine.hh"
32 : #include "EvtGenBase/EvtCPUtil.hh"
33 : #include "EvtGenBase/EvtPDL.hh"
34 : #include "EvtGenModels/EvtSVVHelAmp.hh"
35 : #include "EvtGenBase/EvtReport.hh"
36 : #include "EvtGenModels/EvtPVVCPLH.hh"
37 : #include "EvtGenBase/EvtId.hh"
38 : #include <string>
39 : #include "EvtGenBase/EvtConst.hh"
40 : #include "EvtGenBase/EvtRandom.hh"
41 :
42 0 : EvtPVVCPLH::~EvtPVVCPLH() {}
43 :
44 : std::string EvtPVVCPLH::getName() {
45 0 : return "PVV_CPLH";
46 : }
47 :
48 :
49 : EvtDecayBase* EvtPVVCPLH::clone(){
50 :
51 0 : return new EvtPVVCPLH;
52 :
53 0 : }
54 :
55 : void EvtPVVCPLH::init(){
56 :
57 : // check that there are 8 arguments (deltaMs no argument anymore)
58 0 : checkNArg(8);
59 0 : checkNDaug(2);
60 :
61 0 : checkSpinParent(EvtSpinType::SCALAR);
62 :
63 0 : checkSpinDaughter(0,EvtSpinType::VECTOR);
64 0 : checkSpinDaughter(1,EvtSpinType::VECTOR);
65 :
66 0 : }
67 :
68 : void EvtPVVCPLH::initProbMax(){
69 :
70 : //This is probably not quite right, but it should do as a start...
71 : //Anders
72 :
73 0 : setProbMax(2*(getArg(2)*getArg(2)+getArg(4)*getArg(4)+getArg(6)*getArg(6)));
74 :
75 0 : }
76 :
77 : void EvtPVVCPLH::decay( EvtParticle *p){
78 :
79 : //added by Lange Jan4,2000
80 0 : static EvtId BS0=EvtPDL::getId("B_s0");
81 0 : static EvtId BSB=EvtPDL::getId("anti-B_s0");
82 :
83 : //This is only to get tag-ID
84 : //Mixing is not relevant
85 : //Lifetime is made correctly later
86 : //Tristan
87 0 : EvtId other_b;
88 0 : double t;
89 :
90 : // To generate integrated CP asymmetry, EvtGen uses the "flipping".
91 : // CP-asymmetry in this channel very small, since:
92 : // deltaMs large ..and..
93 : // CPV-phase small
94 0 : EvtCPUtil::getInstance()->OtherB(p,t,other_b);
95 :
96 : //Here we're gonna generate and set the "envelope" lifetime
97 : //So we take the longest living component (for positive deltaGamma: tauH)
98 : //The double exponent will be taken care of later, by the amplitudes
99 : //Tristan
100 :
101 0 : static double Gamma = EvtConst::c/(EvtPDL::getctau(BS0));
102 0 : static double deltaGamma = EvtCPUtil::getInstance()->getDeltaGamma(BS0);
103 0 : static double ctauLong = EvtConst::c/(Gamma-fabs(deltaGamma)/2);
104 : // if dG>0: tauLong=tauH(CP-odd) is then largest
105 :
106 : //This overrules the lifetimes made in OtherB
107 0 : t=-log(EvtRandom::Flat())*(ctauLong);//ctauLong has same dimensions as t
108 0 : if(isBsMixed(p)){
109 0 : p->getParent()->setLifetime(t);
110 0 : }else{
111 0 : p->setLifetime(t);
112 : }
113 :
114 : //These should be filled with the transversity amplitudes at t=0 //Tristan
115 0 : EvtComplex G0P,G1P,G1M;
116 0 : G1P=EvtComplex(getArg(2)*cos(getArg(3)),getArg(2)*sin(getArg(3)));
117 0 : G0P=EvtComplex(getArg(4)*cos(getArg(5)),getArg(4)*sin(getArg(5)));
118 0 : G1M=EvtComplex(getArg(6)*cos(getArg(7)),getArg(6)*sin(getArg(7)));
119 :
120 0 : EvtComplex lambda_km=EvtComplex(cos(2*getArg(0)),sin(2*getArg(0)));//was een min in oude versie
121 :
122 : //deltaMs is no argument anymore
123 : //Tristan
124 :
125 0 : static double deltaMs = EvtCPUtil::getInstance()->getDeltaM(BS0);
126 :
127 0 : EvtComplex cG0P,cG1P,cG1M;
128 :
129 0 : double mt = exp(-std::max(0.,deltaGamma)*t/(2*EvtConst::c));
130 0 : double pt = exp(+std::min(0.,deltaGamma)*t/(2*EvtConst::c));
131 :
132 0 : EvtComplex gplus = ( mt*EvtComplex(cos(deltaMs*t/(2*EvtConst::c)),sin( deltaMs*t/(2*EvtConst::c)))
133 0 : +pt*EvtComplex(cos(deltaMs*t/(2*EvtConst::c)),sin(-deltaMs*t/(2*EvtConst::c))) )/2;
134 0 : EvtComplex gminus = ( mt*EvtComplex(cos(deltaMs*t/(2*EvtConst::c)),sin( deltaMs*t/(2*EvtConst::c)))
135 0 : -pt*EvtComplex(cos(deltaMs*t/(2*EvtConst::c)),sin(-deltaMs*t/(2*EvtConst::c))) )/2;;
136 :
137 0 : if (other_b==BSB){
138 : //These are the right equations for the transversity formalism
139 : //cGOP is de 0-component, CP-even, so lives shorter: mainly lifetime tauL
140 : //cG1P is the //-component, also CP-even, also mainly smaller exponent
141 : //cG1M is the transverse component, CP-odd, so has mainly longer lifetime tauH
142 : //Tristan
143 0 : cG0P = G0P*( gplus + lambda_km*gminus );
144 0 : cG1P = G1P*( gplus + lambda_km*gminus );
145 0 : cG1M = G1M*( gplus - lambda_km*gminus );
146 0 : } else if (other_b==BS0){
147 : //The equations for BsBar
148 : //Note the minus-sign difference
149 : //Tristan
150 0 : cG0P = G0P*( gplus + (1.0/lambda_km)*gminus );
151 0 : cG1P = G1P*( gplus + (1.0/lambda_km)*gminus );
152 0 : cG1M =-G1M*( gplus - (1.0/lambda_km)*gminus );
153 :
154 : } else{
155 0 : report(Severity::Error,"EvtGen") << "other_b was not BSB or BS0!"<<std::endl;
156 0 : ::abort();
157 : }
158 :
159 0 : EvtComplex A0,AP,AM;
160 : //Converting the transversity amplitudes
161 : //to helicity amplitudes
162 : //(to plug them into SVVHelAmp)
163 0 : A0=cG0P;
164 0 : AP=(cG1P+cG1M)/sqrt(2.0);
165 0 : AM=(cG1P-cG1M)/sqrt(2.0);
166 :
167 0 : EvtSVVHelAmp::SVVHel(p,_amp2,getDaug(0),getDaug(1),AP,A0,AM);
168 :
169 : return ;
170 0 : }
171 :
172 : bool EvtPVVCPLH::isBsMixed ( EvtParticle * p ) {
173 0 : if ( ! ( p->getParent() ) ) return false ;
174 :
175 0 : static EvtId BS0=EvtPDL::getId("B_s0");
176 0 : static EvtId BSB=EvtPDL::getId("anti-B_s0");
177 :
178 0 : if ( ( p->getId() != BS0 ) && ( p->getId() != BSB ) ) return false ;
179 :
180 0 : if ( ( p->getParent()->getId() == BS0 ) ||
181 0 : ( p->getParent()->getId() == BSB ) ) return true ;
182 :
183 0 : return false ;
184 0 : }
185 :
186 :
|