BOSS 7.0.4
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtCPUtil Class Reference

#include <EvtCPUtil.hh>

Static Public Member Functions

static void fractB0CP (EvtComplex Af, EvtComplex Abarf, double deltam, double beta, double &fract)
 
static void fractB0nonCP (EvtComplex Af, EvtComplex Abarf, EvtComplex Afbar, EvtComplex Abarfbar, double deltam, double beta, int flip, double &fract)
 
static void OtherB (EvtParticle *p, double &t, EvtId &otherb)
 
static void OtherB (EvtParticle *p, double &t, EvtId &otherb, double probB0)
 
static void incoherentMix (const EvtId id, double &t, int &mix)
 

Detailed Description

Definition at line 29 of file EvtCPUtil.hh.

Member Function Documentation

◆ fractB0CP()

void EvtCPUtil::fractB0CP ( EvtComplex  Af,
EvtComplex  Abarf,
double  deltam,
double  beta,
double &  fract 
)
static

Definition at line 41 of file EvtCPUtil.cc.

42 {
43//this function returns the number of B0 tags for decays into CP-eigenstates
44//(the "probB0" in the new EvtOtherB)
45
46 //double gamma_B = EvtPDL::getWidth(B0);
47 //double xd = deltam/gamma_B;
48 //double xd = 0.65;
49 double ratio = 1/(1 + 0.65*0.65);
50
51 EvtComplex rf, rbarf;
52
53 rf = EvtComplex(cos(2.0*beta),sin(2.0*beta))*Abarf/Af;
54 rbarf = EvtComplex(1.0)/rf;
55
56 double A2 = real(Af)*real(Af) + imag(Af)*imag(Af);
57 double Abar2 = real(Abarf)*real(Abarf) + imag(Abarf)*imag(Abarf);
58
59 double rf2 = real(rf)*real(rf) + imag(rf)*imag(rf);
60 double rbarf2 = real(rbarf)*real(rbarf) + imag(rbarf)*imag(rbarf);
61
62 fract = (Abar2*(1+ rbarf2 + (1 - rbarf2)*ratio))/(Abar2*(1+ rbarf2 + (1 - rbarf2)*ratio) + A2*(1+ rf2 + (1 - rf2)*ratio));
63 return;
64
65}
double imag(const EvtComplex &c)
Definition: EvtComplex.hh:246
double sin(const BesAngle a)
double cos(const BesAngle a)

◆ fractB0nonCP()

void EvtCPUtil::fractB0nonCP ( EvtComplex  Af,
EvtComplex  Abarf,
EvtComplex  Afbar,
EvtComplex  Abarfbar,
double  deltam,
double  beta,
int  flip,
double &  fract 
)
static

Definition at line 66 of file EvtCPUtil.cc.

69 {
70
71//this function returns the number of B0 tags for decays into non-CP eigenstates
72//(the "probB0" in the new EvtOtherB)
73//this needs more thought...
74
75 //double gamma_B = EvtPDL::getWidth(B0);
76 //report(INFO,"EvtGen") << "gamma " << gamma_B<< endl;
77 //double xd = deltam/gamma_B;
78
79 //why is the width of B0 0 in PDL??
80
81 double xd = 0.65;
82 double gamma_B = deltam/xd;
83 double IAf, IAfbar, IAbarf, IAbarfbar;
84 EvtComplex rf, rfbar, rbarf, rbarfbar;
85 double rf2, rfbar2, rbarf2, rbarfbar2;
86 double Af2, Afbar2, Abarf2, Abarfbar2;
87
88 rf = EvtComplex(cos(2.0*beta),sin(2.0*beta))*Abarf/Af;
89 rfbar = EvtComplex(cos(2.0*beta),sin(2.0*beta))*Abarfbar/Afbar;
90 rbarf = EvtComplex(cos(-2.0*beta),sin(-2.0*beta))*Af/Abarf;
91 rbarfbar = EvtComplex(cos(-2.0*beta),sin(-2.0*beta))*Afbar/Abarfbar;
92
93
94 rf2 = real(rf)*real(rf) + imag(rf)*imag(rf);
95 rfbar2 = real(rfbar)*real(rfbar) + imag(rfbar)*imag(rfbar);
96 rbarf2 = real(rbarf)*real(rbarf) + imag(rbarf)*imag(rbarf);
97 rbarfbar2 = real(rbarfbar)*real(rbarfbar) + imag(rbarfbar)*imag(rbarfbar);
98
99 Af2 = real(Af)*real(Af) + imag(Af)*imag(Af);
100 Afbar2 = real(Afbar)*real(Afbar) + imag(Afbar)*imag(Afbar);
101 Abarf2 = real(Abarf)*real(Abarf) + imag(Abarf)*imag(Abarf);
102 Abarfbar2 = real(Abarfbar)*real(Abarfbar) + imag(Abarfbar)*imag(Abarfbar);
103
104
105//
106//IAf = integral(gamma(B0->f)), etc.
107//
108
109 IAf = (Af2/(2*gamma_B))*(1+rf2+(1-rf2)/(1+xd*xd));
110 IAfbar = (Afbar2/(2*gamma_B))*(1+rfbar2+(1-rfbar2)/(1+xd*xd));
111 IAbarf = (Abarf2/(2*gamma_B))*(1+rbarf2+(1-rbarf2)/(1+xd*xd));
112 IAbarfbar = (Abarfbar2/(2*gamma_B))*(1+rbarfbar2+(1-rbarfbar2)/(1+xd*xd));
113
114//flip specifies the relative fraction of fbar events
115
116 fract = IAbarf/(IAbarf+IAf) + flip*IAbarfbar/(IAfbar+IAbarfbar);
117
118
119 return;
120}

◆ incoherentMix()

void EvtCPUtil::incoherentMix ( const EvtId  id,
double &  t,
int &  mix 
)
static

Definition at line 294 of file EvtCPUtil.cc.

294 {
295
296 int stdHepNum=EvtPDL::getStdHep(id);
297 stdHepNum=abs(stdHepNum);
298
299 EvtId partId=EvtPDL::evtIdFromStdHep(stdHepNum);
300
301 std::string partName=EvtPDL::name(partId);
302 std::string hname=partName+std::string("H");
303 std::string lname=partName+std::string("L");
304
305 EvtId lId=EvtPDL::getId(lname);
306 EvtId hId=EvtPDL::getId(hname);
307
308 double ctauL=EvtPDL::getctau(lId);
309 double ctauH=EvtPDL::getctau(hId);
310 double ctau=0.5*(ctauL+ctauH);
311 double y=(ctauH-ctauL)/ctau;
312
313 //need to figure out how to get these parameters into the code...
314
315 std::string qoverpParmName=std::string("qoverp_incohMix_")+partName;
316 std::string mdParmName=std::string("dm_incohMix_")+partName;
317 int ierr;
318 double qoverp=atof(EvtSymTable::Get(qoverpParmName,ierr).c_str());
319 double x=atof(EvtSymTable::Get(mdParmName,ierr).c_str())*ctau/EvtConst::c;
320 double fac;
321
322 if(id==partId){
323 fac=1.0/(qoverp*qoverp);
324 }
325 else{
326 fac=qoverp*qoverp;
327 }
328
329 double mixprob=(x*x+y*y)/(x*x+y*y+fac*(2+x*x-y*y));
330
331 int mixsign;
332
333 mixsign=(mixprob>EvtRandom::Flat(0.0,1.0))?-1:1;
334
335 double prob;
336
337 do{
338 t=-log(EvtRandom::Flat())*ctauL;
339 prob=1+exp(y*t/ctau)+mixsign*2*exp(0.5*y*t/ctau)*cos(x*t);
340 }while(prob<4*EvtRandom::Flat());
341
342 mix=0;
343
344 if (mixsign==-1) mix=1;
345
346 return;
347}
Double_t x[10]
EvtComplex exp(const EvtComplex &c)
Definition: EvtComplex.hh:252
static const double c
Definition: EvtConst.hh:32
Definition: EvtId.hh:27
static int getStdHep(EvtId id)
Definition: EvtPDL.hh:56
static EvtId evtIdFromStdHep(int stdhep)
Definition: EvtPDL.cc:244
static std::string name(EvtId i)
Definition: EvtPDL.hh:64
static EvtId getId(const std::string &name)
Definition: EvtPDL.cc:287
static double getctau(EvtId i)
Definition: EvtPDL.hh:55
static double Flat()
Definition: EvtRandom.cc:74
static std::string Get(const std::string &name, int &ierr)
Definition: EvtSymTable.cc:55
char * c_str(Index i)
Definition: EvtCyclic3.cc:252
int t()
Definition: t.c:1

Referenced by EvtParticle::initDecay().

◆ OtherB() [1/2]

void EvtCPUtil::OtherB ( EvtParticle p,
double &  t,
EvtId otherb 
)
static

Definition at line 229 of file EvtCPUtil.cc.

229 {
230
231
232 static EvtId BSB=EvtPDL::getId("anti-B_s0");
233 static EvtId BS0=EvtPDL::getId("B_s0");
234 static EvtId B0B=EvtPDL::getId("anti-B0");
235 static EvtId B0=EvtPDL::getId("B0");
236 static EvtId UPS4=EvtPDL::getId("Upsilon(4S)");
237
238 if (p->getId()==BS0||p->getId()==BSB){
239 static double ctauL=EvtPDL::getctau(EvtPDL::getId("B_s0L"));
240 static double ctauH=EvtPDL::getctau(EvtPDL::getId("B_s0H"));
241 static double ctau=ctauL<ctauH?ctauH:ctauL;
242 t=-log(EvtRandom::Flat())*ctau;
243 EvtParticle* parent=p->getParent();
244 if (parent!=0&&(parent->getId()==BS0||parent->getId()==BSB)){
245 if (parent->getId()==BS0) otherb=BSB;
246 if (parent->getId()==BSB) otherb=BS0;
247 parent->setLifetime(t);
248 return;
249 }
250 if (p->getId()==BS0) otherb=BSB;
251 if (p->getId()==BSB) otherb=BS0;
252 p->setLifetime(t);
253 return;
254 }
255
256
257
258
259 p->setLifetime();
260
261
262// now get the time between the decay of this B and the other B!
263
264 EvtParticle *parent=p->getParent();
265
266 if (parent==0||parent->getId()!=UPS4) {
267 //report(ERROR,"EvtGen") <<
268 // "Warning CP violation with B having no parent!"<<endl;
269 t=p->getLifetime();
270 if (p->getId()==B0) otherb=B0B;
271 if (p->getId()==B0B) otherb=B0;
272 if (p->getId()==BS0) otherb=BSB;
273 if (p->getId()==BSB) otherb=BS0;
274 return;
275 }
276 else{
277 if (parent->getDaug(0)!=p){
278 otherb=parent->getDaug(0)->getId();
279 parent->getDaug(0)->setLifetime();
280 t=p->getLifetime()-parent->getDaug(0)->getLifetime();
281 }
282 else{
283 otherb=parent->getDaug(1)->getId();
284 parent->getDaug(1)->setLifetime();
285 t=p->getLifetime()-parent->getDaug(1)->getLifetime();
286 }
287 }
288
289
290 return ;
291}
EvtId getId() const
Definition: EvtParticle.cc:113
EvtParticle * getParent()
Definition: EvtParticle.cc:87
double getLifetime()
Definition: EvtParticle.cc:99
void setLifetime(double tau)
Definition: EvtParticle.cc:89
EvtParticle * getDaug(int i)
Definition: EvtParticle.cc:85

Referenced by EvtBto2piCPiso::decay(), EvtBTo3piCP::decay(), EvtBTo4piCP::decay(), EvtBToKpipiCP::decay(), EvtIntervalDecayAmp< T >::decay(), EvtSSDCP::decay(), EvtSSSCP::decay(), EvtSSSCPpng::decay(), EvtSSSCPT::decay(), EvtSTSCP::decay(), EvtSVPCP::decay(), EvtSVSCP::decay(), EvtSVSCPiso::decay(), EvtSVSCPLH::decay(), EvtSVSNONCPEIGEN::decay(), EvtSVVCP::decay(), EvtSVVCPLH::decay(), EvtSVVNONCPEIGEN::decay(), and OtherB().

◆ OtherB() [2/2]

void EvtCPUtil::OtherB ( EvtParticle p,
double &  t,
EvtId otherb,
double  probB0 
)
static

Definition at line 122 of file EvtCPUtil.cc.

122 {
123
124 //Can not call this recursively!!!
125 static int entryCount=0;
126 entryCount++;
127
128 //added by Lange Jan4,2000
129 static EvtId B0B=EvtPDL::getId("anti-B0");
130 static EvtId B0=EvtPDL::getId("B0");
131
132 int isB0=EvtRandom::Flat(0.0,1.0)<probB0;
133
134 int idaug;
135
136 p->setLifetime();
137
138 // now get the time between the decay of this B and the other B!
139
140 EvtParticle *parent=p->getParent();
141
143
144 if (parent==0) {
145 //report(ERROR,"EvtGen") <<
146 // "Warning CP violation with B having no parent!"<<endl;
147 p->setLifetime();
148 t=p->getLifetime();
149 if (p->getId()==B0) otherb=B0B;
150 if (p->getId()==B0B) otherb=B0;
151 entryCount--;
152 return;
153 }
154 else{
155 if (parent->getDaug(0)!=p){
156 other=parent->getDaug(0);
157 idaug=0;
158 }
159 else{
160 other=parent->getDaug(1);
161 idaug=1;
162 }
163 }
164
165 if (parent != 0 ) {
166
167 //if (entryCount>1){
168 // report(INFO,"EvtGen") << "Double CP decay:"<<entryCount<<endl;
169 //}
170
171 //kludge!! Lange Mar21, 2003
172 // if the other B is an alias... don't change the flavor..
173 if ( other->getId().isAlias() ) {
174 OtherB(p,t,otherb);
175 entryCount--;
176 return;
177
178 }
179
180 if (entryCount==1){
181
182 EvtVector4R p_init=other->getP4();
183 //int decayed=other->getNDaug()>0;
184 bool decayed = other->isDecayed();
185
186 other->deleteTree();
187
188 EvtScalarParticle* scalar_part;
189
190 scalar_part=new EvtScalarParticle;
191 if (isB0) {
192 scalar_part->init(B0,p_init);
193 }
194 else{
195 scalar_part->init(B0B,p_init);
196 }
197 other=(EvtParticle *)scalar_part;
198 // other->set_type(EvtSpinType::SCALAR);
199 other->setDiagonalSpinDensity();
200
201 parent->insertDaugPtr(idaug,other);
202
203 if (decayed){
204 //report(INFO,"EvtGen") << "In CP Util calling decay \n";
205 other->decay();
206 }
207
208 }
209
210 otherb=other->getId();
211
212 other->setLifetime();
213 t=p->getLifetime()-other->getLifetime();
214
215 otherb = other->getId();
216
217 }
218 else {
219 report(INFO,"EvtGen") << "We have an error here!!!!"<<endl;
220 otherb = EvtId(-1,-1);
221 }
222
223 entryCount--;
224 return ;
225}
ostream & report(Severity severity, const char *facility)
Definition: EvtReport.cc:36
@ INFO
Definition: EvtReport.hh:52
static void OtherB(EvtParticle *p, double &t, EvtId &otherb)
Definition: EvtCPUtil.cc:229
void insertDaugPtr(int idaug, EvtParticle *partptr)
Definition: EvtParticle.hh:220
void init(EvtId part_n, double e, double px, double py, double pz)
Index other(Index i, Index j)
Definition: EvtCyclic3.cc:118

The documentation for this class was generated from the following files: