EvtGen 2.2.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
Loading...
Searching...
No Matches
EvtXPsiGamma.cpp
Go to the documentation of this file.
1
2/***********************************************************************
3* Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
4* *
5* This file is part of EvtGen. *
6* *
7* EvtGen is free software: you can redistribute it and/or modify *
8* it under the terms of the GNU General Public License as published by *
9* the Free Software Foundation, either version 3 of the License, or *
10* (at your option) any later version. *
11* *
12* EvtGen is distributed in the hope that it will be useful, *
13* but WITHOUT ANY WARRANTY; without even the implied warranty of *
14* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15* GNU General Public License for more details. *
16* *
17* You should have received a copy of the GNU General Public License *
18* along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
19***********************************************************************/
20
22
24#include "EvtGenBase/EvtPDL.hh"
30
31#include <iostream>
32#include <stdlib.h>
33#include <string>
34
35using namespace std;
36
37std::string EvtXPsiGamma::getName() const
38{
39 return "X38722-+_PSI_GAMMA";
40}
41
43{
44 return new EvtXPsiGamma;
45}
46
48{
49 checkNArg( 0, 6 );
50
51 if ( getNArg() == 0 ) {
52 // X -> omega psi, rho0 psi couplings from table II in F. Brazzi et al, arXiv:1103.3155
53 m_gOmega = 1.58;
54 m_gPOmega = -0.74;
55 m_gRho = -0.29;
56 m_gPRho = 0.28;
57
58 // Decay constants used in F. Brazzi et al, arXiv:1103.3155, taken from J. Sakurai, Currents and Mesons (1969)
59 m_fOmega = 0.036;
60 m_fRho = 0.121;
61
62 } else {
63 m_gOmega = getArg( 0 );
64 m_gPOmega = getArg( 1 );
65 m_gRho = getArg( 2 );
66 m_gPRho = getArg( 3 );
67 m_fOmega = getArg( 4 );
68 m_fRho = getArg( 5 );
69 }
70
71 checkNDaug( 2 );
72
74
76
77 m_ID0 = getDaug( 0 );
78
79 if ( m_ID0 != EvtPDL::getId( "gamma" ) &&
80 m_ID0 != EvtPDL::getId( "omega" ) && m_ID0 != EvtPDL::getId( "rho0" ) ) {
81 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
82 << " " << getName() << " - Decays with '" << getDaug( 0 ).getName()
83 << "' as first daughter are not supported. Choose among: 'gamma', 'omega', or 'rho0'."
84 << std::endl;
85 ::abort();
86 };
87}
88
90{
91 double theProbMax = 1.;
92
93 // Create a tensor parent at rest and initialize it
94 // Use noLifeTime() cludge to avoid generating random numbers
95
96 EvtTensorParticle parent{};
97 parent.noLifeTime();
98 parent.init( getParentId(),
99 EvtVector4R( EvtPDL::getMass( getParentId() ), 0, 0, 0 ) );
100 parent.setDiagonalSpinDensity();
101
102 // Create daughters and initialize amplitude
103 EvtAmp amp;
104 EvtId daughters[2] = { getDaug( 0 ), getDaug( 1 ) };
105 amp.init( getParentId(), 2, daughters );
106 parent.makeDaughters( 2, daughters );
107
108 EvtParticle* child1 = parent.getDaug( 0 );
109 EvtParticle* child2 = parent.getDaug( 1 );
110
111 child1->noLifeTime();
112 child2->noLifeTime();
113
114 EvtSpinDensity rho;
115 rho.setDiag( parent.getSpinStates() );
116
117 // Momentum of daughters in parent's frame
118 const double parentMass = EvtPDL::getMass( getParentId() );
119
120 // The daughter CMS momentum pstar (and thus the phase space) is larger if the mass of the daughters is lower.
121 // Thus the probability is maximal for the minimal resonance mass for rho0 and omega resonances.
122 // For photons the minimal mass is always zero.
123 const double d1Mass = EvtPDL::getMinMass( getDaug( 0 ) );
124
125 const double d2Mass = EvtPDL::getMass( getDaug( 1 ) );
126
127 const double pstar = calcPstar( parentMass, d1Mass, d2Mass );
128
129 EvtVector4R p4_1, p4_2;
130
131 const int nsteps = 180;
132
133 double prob_max = 0;
134 double theta_max = 0;
135
136 for ( int i = 0; i <= nsteps; i++ ) {
137 const double theta = i * EvtConst::pi / nsteps;
138
139 p4_1.set( sqrt( pow( pstar, 2 ) + pow( d1Mass, 2 ) ), 0,
140 +pstar * sin( theta ), +pstar * cos( theta ) );
141
142 p4_2.set( sqrt( pow( pstar, 2 ) + pow( d2Mass, 2 ) ), 0,
143 -pstar * sin( theta ), -pstar * cos( theta ) );
144
145 child1->init( getDaug( 0 ), p4_1 );
146 child2->init( getDaug( 1 ), p4_2 );
147
148 calcAmp( parent, amp );
149
150 const double i_prob = rho.normalizedProb( amp.getSpinDensity() );
151
152 if ( i_prob > prob_max ) {
153 prob_max = i_prob;
154 theta_max = theta;
155 }
156 }
157
158 EvtGenReport( EVTGEN_INFO, "EvtGen" )
159 << " " << getName() << " - probability " << prob_max
160 << " found for p* (child momenta in parent's frame) = " << pstar
161 << ", at theta* = " << theta_max << std::endl;
162
163 theProbMax *= 1.01 * prob_max;
164
165 // For wide resonances we have to account for the phase space increasing with pstar
166 if ( m_ID0 != EvtPDL::getId( "gamma" ) )
167 theProbMax /= pstar;
168
169 setProbMax( theProbMax );
170
171 EvtGenReport( EVTGEN_INFO, "EvtGen" )
172 << " " << getName() << " - set up maximum probability to " << theProbMax
173 << std::endl;
174}
175
177{
178 parent->initializePhaseSpace( getNDaug(), getDaugs() );
179
180 if ( m_ID0 != EvtPDL::getId( "gamma" ) ) {
181 // This weight compensates for the phase space becoming small at resonance masses
182 // close to kinematic boundary (only for omega and rho which have large widths)
183 setWeight( calcPstar( parent->mass(), parent->getDaug( 0 )->mass(),
184 parent->getDaug( 1 )->mass() ) );
185 }
186
187 calcAmp( *parent, m_amp2 );
188}
189
191{
192 static const double mOmega2 =
193 pow( EvtPDL::getMeanMass( EvtPDL::getId( "omega" ) ), 2 );
194 static const double mRho2 =
195 pow( EvtPDL::getMeanMass( EvtPDL::getId( "rho0" ) ), 2 );
196
197 if ( m_ID0 == EvtPDL::getId( "gamma" ) ) {
198 for ( int iPsi = 0; iPsi < 3; iPsi++ ) {
199 for ( int iGamma = 0; iGamma < 2; iGamma++ ) {
200 for ( int iChi = 0; iChi < 4; iChi++ ) {
201 const EvtComplex T2 = fT2(
202 parent.getDaug( 1 )->getP4(),
203 parent.getDaug( 0 )->getP4(), parent.epsTensor( iChi ),
204 parent.getDaug( 1 )->epsParent( iPsi ).conj(),
205 parent.getDaug( 0 )->epsParentPhoton( iGamma ).conj() );
206 const EvtComplex T3 = fT3(
207 parent.getDaug( 1 )->getP4(),
208 parent.getDaug( 0 )->getP4(), parent.epsTensor( iChi ),
209 parent.getDaug( 1 )->epsParent( iPsi ).conj(),
210 parent.getDaug( 0 )->epsParentPhoton( iGamma ).conj() );
211 amp.vertex( iChi, iGamma, iPsi,
212 ( m_fOmega / mOmega2 * m_gOmega +
213 m_fRho / mRho2 * m_gRho ) *
214 T2 +
215 ( m_fOmega / mOmega2 * m_gPOmega +
216 m_fRho / mRho2 * m_gPRho ) *
217 T3 );
218 }
219 }
220 }
221 } else if ( m_ID0 == EvtPDL::getId( "omega" ) ) {
222 for ( int iPsi = 0; iPsi < 3; iPsi++ ) {
223 for ( int iVect = 0; iVect < 3; iVect++ ) {
224 for ( int iChi = 0; iChi < 4; iChi++ ) {
225 const EvtComplex T2 = fT2(
226 parent.getDaug( 1 )->getP4(),
227 parent.getDaug( 0 )->getP4(), parent.epsTensor( iChi ),
228 parent.getDaug( 1 )->epsParent( iPsi ).conj(),
229 parent.getDaug( 0 )->epsParent( iVect ).conj() );
230 const EvtComplex T3 = fT3(
231 parent.getDaug( 1 )->getP4(),
232 parent.getDaug( 0 )->getP4(), parent.epsTensor( iChi ),
233 parent.getDaug( 1 )->epsParent( iPsi ).conj(),
234 parent.getDaug( 0 )->epsParent( iVect ).conj() );
235 amp.vertex( iChi, iVect, iPsi,
236 m_gOmega * T2 + m_gPOmega * T3 );
237 }
238 }
239 }
240 // This is for the m_ID0 == EvtPDL::getId( "rho0" ) case
241 } else {
242 for ( int iPsi = 0; iPsi < 3; iPsi++ ) {
243 for ( int iVect = 0; iVect < 3; iVect++ ) {
244 for ( int iChi = 0; iChi < 4; iChi++ ) {
245 const EvtComplex T2 = fT2(
246 parent.getDaug( 1 )->getP4(),
247 parent.getDaug( 0 )->getP4(), parent.epsTensor( iChi ),
248 parent.getDaug( 1 )->epsParent( iPsi ).conj(),
249 parent.getDaug( 0 )->epsParent( iVect ).conj() );
250 const EvtComplex T3 = fT3(
251 parent.getDaug( 1 )->getP4(),
252 parent.getDaug( 0 )->getP4(), parent.epsTensor( iChi ),
253 parent.getDaug( 1 )->epsParent( iPsi ).conj(),
254 parent.getDaug( 0 )->epsParent( iVect ).conj() );
255 amp.vertex( iChi, iVect, iPsi, m_gRho * T2 + m_gPRho * T3 );
256 }
257 }
258 }
259 }
260}
261
262double EvtXPsiGamma::calcPstar( double parentMass, double d1Mass,
263 double d2Mass ) const
264{
265 const double pstar =
266 sqrt( pow( parentMass, 2 ) - pow( ( d1Mass + d2Mass ), 2 ) ) *
267 sqrt( pow( parentMass, 2 ) - pow( ( d2Mass - d1Mass ), 2 ) ) /
268 ( 2 * parentMass );
269
270 return pstar;
271}
272
274 EvtVector4C epsEps, EvtVector4C epsEta ) const
275{
276 // T2 term from F. Brazzi et al, arXiv:1103.3155, eq. (10)
277 const EvtTensor4C epsPQ = dual(
278 EvtGenFunctions::directProd( q, p ) ); // e_{mu nu a b} p^a q^b;
279
280 const EvtVector4C tmp1 = epsPI.cont1( epsEps );
281 const EvtVector4C tmp2 = epsPQ.cont1( tmp1 );
282 const EvtComplex T2temp =
283 tmp2 * epsEta; // eps^a pi_{a mu} e_{mu nu rho si} p_nu q_rho eta_si
284
285 const EvtVector4C tmp3 = epsPI.cont1( epsEta );
286 const EvtVector4C tmp4 = epsPQ.cont1( tmp3 );
287 const EvtComplex T2 =
288 T2temp +
289 tmp4 * epsEps; // T2 - eta^a pi_{a mu} e_{mu nu rho si} q_nu p_rho eps_si
290
291 return T2;
292}
293
295 EvtVector4C epsEps, EvtVector4C epsEta ) const
296{
297 // T3 term from F. Brazzi et al, arXiv:1103.3155, eq. (11)
298 const EvtVector4R Q = p - q;
299 const EvtVector4R P = p + q;
300 const EvtVector4C tmp1 = epsPI.cont1( Q ); // Q_a pi_{a mu}
302 P, epsEps ) ); // e_{mu nu rho si} P^rho eps^si
303 const EvtVector4C tmp4 = tmp3.cont1( tmp1 );
304 const EvtComplex T3 =
305 tmp4 * epsEta; // Q_a pi_{a mu} e_{mu nu rho si} P^rho eps_si eta_nu
306 return T3;
307}
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_INFO
Definition EvtReport.hh:52
@ EVTGEN_ERROR
Definition EvtReport.hh:49
EvtTensor4C dual(const EvtTensor4C &t2)
void vertex(const EvtComplex &amp)
Definition EvtAmp.cpp:453
EvtSpinDensity getSpinDensity() const
Definition EvtAmp.cpp:141
void init(EvtId p, int ndaug, const EvtId *daug)
Definition EvtAmp.cpp:67
static const double pi
Definition EvtConst.hh:26
void setWeight(double weight)
EvtAmp m_amp2
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
EvtDecayBase()=default
int getNDaug() const
void checkSpinParent(EvtSpinType::spintype sp)
int getNArg() const
double getArg(unsigned int j)
void setProbMax(double prbmx)
EvtId getParentId() const
EvtId getDaug(int i) const
void checkNDaug(int d1, int d2=-1)
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
const EvtId * getDaugs() const
Definition EvtId.hh:27
std::string getName() const
Definition EvtId.cpp:38
static double getMass(EvtId i)
Definition EvtPDL.cpp:311
static double getMeanMass(EvtId i)
Definition EvtPDL.cpp:306
static double getMinMass(EvtId i)
Definition EvtPDL.cpp:336
static EvtId getId(const std::string &name)
Definition EvtPDL.cpp:283
void noLifeTime()
virtual EvtVector4C epsParent(int i) const
virtual void init(EvtId part_n, const EvtVector4R &p4)=0
double initializePhaseSpace(size_t numdaughter, const EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
int getSpinStates() const
void setDiagonalSpinDensity()
const EvtVector4R & getP4() const
EvtParticle * getDaug(const int i)
double mass() const
virtual EvtVector4C epsParentPhoton(int i) const
virtual EvtTensor4C epsTensor(int i) const
void makeDaughters(size_t ndaug, const EvtId *id)
double normalizedProb(const EvtSpinDensity &d)
void setDiag(int n)
EvtVector4C cont1(const EvtVector4C &v4) const
void init(EvtId part_n, double e, double px, double py, double pz)
EvtVector4C conj() const
void set(int i, double d)
EvtComplex fT3(EvtVector4R p, EvtVector4R q, EvtTensor4C epsPI, EvtVector4C epsEps, EvtVector4C epsEta) const
EvtComplex fT2(EvtVector4R p, EvtVector4R q, EvtTensor4C epsPI, EvtVector4C epsEps, EvtVector4C epsEta) const
void calcAmp(EvtParticle &parent, EvtAmp &amp)
double calcPstar(double m_parent, double m_1, double m_2) const
void init() override
void initProbMax() override
void decay(EvtParticle *p) override
std::string getName() const override
EvtDecayBase * clone() const override
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)