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
EvtPhiDalitz.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"
31
32#include <math.h>
33#include <stdlib.h>
34#include <string>
35
36// Implementation of KLOE measurement
37// PL B561: 55-60 (2003) + Erratum B609:449-450 (2005)
38// or hep-ex/0303016v2
39
40std::string EvtPhiDalitz::getName() const
41{
42 return "PHI_DALITZ";
43}
44
46{
47 return new EvtPhiDalitz;
48}
49
51{
52 // check that there are 0 arguments
53 checkNArg( 0 );
54 checkNDaug( 3 );
55
57
61
62 // results taken from KLOE results: arxiv.org/abs/hep-ex/0303016
63 m_mRho = 0.7758;
64 m_gRho = 0.1439;
65 m_aD = 0.78;
66 m_phiD = -2.47;
67 m_aOmega = 0.0071;
68 m_phiOmega = -0.22;
69
70 m_locPip = -1;
71 m_locPim = -1;
72 m_locPi0 = -1;
73
74 for ( int i = 0; i < 3; i++ ) {
75 if ( getDaug( i ) == EvtPDL::getId( "pi+" ) )
76 m_locPip = i;
77 if ( getDaug( i ) == EvtPDL::getId( "pi-" ) )
78 m_locPim = i;
79 if ( getDaug( i ) == EvtPDL::getId( "pi0" ) )
80 m_locPi0 = i;
81 }
82 if ( m_locPip == -1 || m_locPim == -1 || m_locPi0 == -1 ) {
83 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
84 << getModelName()
85 << "generator expects daughters to be pi+ pi- pi0\n";
86 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
87 << "Found " << EvtPDL::name( getDaug( 0 ) ) << " "
88 << EvtPDL::name( getDaug( 1 ) ) << " "
89 << EvtPDL::name( getDaug( 2 ) ) << std::endl;
90 }
91}
92
94{
95 setProbMax( 300.0 );
96}
97
99{
100 const EvtId PIP = EvtPDL::getId( "pi+" );
101 const EvtId PIM = EvtPDL::getId( "pi-" );
102 const EvtId PIZ = EvtPDL::getId( "pi0" );
103 const EvtId OMEGA = EvtPDL::getId( "omega" );
104
106
107 const EvtVector4R Ppip = p->getDaug( m_locPip )->getP4();
108 const EvtVector4R Ppim = p->getDaug( m_locPim )->getP4();
109 const EvtVector4R Ppi0 = p->getDaug( m_locPi0 )->getP4();
110 const EvtVector4R Qm = ( Ppim + Ppi0 );
111 const EvtVector4R Qp = ( Ppip + Ppi0 );
112 const EvtVector4R Q0 = ( Ppip + Ppim );
113 const double m_pip = EvtPDL::getMeanMass( PIP );
114 const double m_pim = EvtPDL::getMeanMass( PIM );
115 const double m_pi0 = EvtPDL::getMeanMass( PIZ );
116 const double Mrhop = m_mRho;
117 const double Mrhom = m_mRho;
118 const double Mrho0 = m_mRho;
119 const double M2rhop = pow( Mrhop, 2 );
120 const double M2rhom = pow( Mrhom, 2 );
121 const double M2rho0 = pow( Mrho0, 2 );
122 const double M2omega = pow( EvtPDL::getMeanMass( OMEGA ), 2 );
123
124 const double Wrhop = m_gRho;
125 const double Wrhom = m_gRho;
126 const double Wrho0 = m_gRho;
127 const double Womega = EvtPDL::getWidth( OMEGA );
128
129 const double QmM = Qm.mass();
130 const double QmM2 = Qm.mass2();
131 const double QpM = Qp.mass();
132 const double QpM2 = Qp.mass2();
133 const double Q0M = Q0.mass();
134 const double Q0M2 = Q0.mass2();
135
136 //Rho- Resonance Amplitude
137 const double qm = calc_q( QmM, m_pim, m_pi0 );
138 const double qm_0 = calc_q( Mrhom, m_pim, m_pi0 );
139 const double Gm = Wrhom * pow( qm / qm_0, 3 ) * ( M2rhom / QmM2 );
140 const EvtComplex Drhom( ( QmM2 - M2rhom ), QmM * Gm );
141 const EvtComplex A1( M2rhom / Drhom );
142
143 //Rho+ Resonance Amplitude
144 const double qp = calc_q( QpM, m_pip, m_pi0 );
145 const double qp_0 = calc_q( Mrhop, m_pip, m_pi0 );
146 const double Gp = Wrhop * pow( qp / qp_0, 3 ) * ( M2rhop / QpM2 );
147 const EvtComplex Drhop( ( QpM2 - M2rhop ), QpM * Gp );
148 const EvtComplex A2( M2rhop / Drhop );
149
150 //Rho0 Resonance Amplitude
151 const double q0 = calc_q( Q0M, m_pip, m_pim );
152 const double q0_0 = calc_q( Mrho0, m_pip, m_pim );
153 const double G0 = Wrho0 * pow( q0 / q0_0, 3 ) * ( M2rho0 / Q0M2 );
154 const EvtComplex Drho0( ( Q0M2 - M2rho0 ), Q0M * G0 );
155 const EvtComplex A3( M2rho0 / Drho0 );
156
157 //Omega Resonance Amplitude
158 const EvtComplex OmegaA( m_aOmega * cos( m_phiOmega ),
159 m_aOmega * sin( m_phiOmega ) );
160 const EvtComplex DOmega( ( Q0M2 - M2omega ), Q0M * Womega );
161 const EvtComplex A4( OmegaA * M2omega / DOmega );
162
163 //Direct Decay Amplitude
164 const EvtComplex A5( m_aD * cos( m_phiD ), m_aD * sin( m_phiD ) );
165
166 const EvtComplex Atot = A1 + A2 + A3 + A4 + A5;
167
168 // Polarization
169
170 const EvtVector4C ep0 = p->eps( 0 );
171 const EvtVector4C ep1 = p->eps( 1 );
172 const EvtVector4C ep2 = p->eps( 2 );
173
174 const EvtVector3R p1( Ppip.get( 1 ), Ppip.get( 2 ), Ppip.get( 3 ) );
175 const EvtVector3R p2( Ppim.get( 1 ), Ppim.get( 2 ), Ppim.get( 3 ) );
176 const EvtVector3R q = cross( p1, p2 );
177
178 const EvtVector3C e1( ep0.get( 1 ), ep0.get( 2 ), ep0.get( 3 ) );
179 const EvtVector3C e2( ep1.get( 1 ), ep1.get( 2 ), ep1.get( 3 ) );
180 const EvtVector3C e3( ep2.get( 1 ), ep2.get( 2 ), ep2.get( 3 ) );
181
182 //This is an approximate formula of the maximum value that
183 //|q| can have.
184 const double pM = p->mass();
185 const double mSum = Ppip.mass() + Ppim.mass() + Ppi0.mass();
186 const double norm = 10.26 / ( pM * pM - mSum * mSum );
187
188 vertex( 0, norm * e1 * q * Atot );
189 vertex( 1, norm * e2 * q * Atot );
190 vertex( 2, norm * e3 * q * Atot );
191
192 return;
193}
194
195double EvtPhiDalitz::calc_q( double M, double m1, double m2 ) const
196{
197 const double m12Sum = m1 + m2;
198
199 if ( M > m12Sum ) {
200 const double MSq = M * M;
201 const double m12Diff = m1 - m2;
202
203 return sqrt( ( MSq - ( m12Sum ) * ( m12Sum ) ) *
204 ( MSq - ( m12Diff ) * ( m12Diff ) ) ) /
205 ( 2.0 * M );
206 } else {
207 return 0.0;
208 }
209}
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_ERROR
Definition EvtReport.hh:49
EvtVector3R cross(const EvtVector3R &p1, const EvtVector3R &p2)
void vertex(const EvtComplex &amp)
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
EvtDecayBase()=default
int getNDaug() const
void checkSpinParent(EvtSpinType::spintype sp)
void setProbMax(double prbmx)
std::string getModelName() 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
static double getWidth(EvtId i)
Definition EvtPDL.cpp:346
static std::string name(EvtId i)
Definition EvtPDL.cpp:376
static double getMeanMass(EvtId i)
Definition EvtPDL.cpp:306
static EvtId getId(const std::string &name)
Definition EvtPDL.cpp:283
double initializePhaseSpace(size_t numdaughter, const EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
const EvtVector4R & getP4() const
EvtParticle * getDaug(const int i)
double mass() const
virtual EvtVector4C eps(int i) const
EvtDecayBase * clone() const override
void decay(EvtParticle *p) override
void initProbMax() override
double calc_q(double, double, double) const
double m_phiOmega
std::string getName() const override
void init() override
const EvtComplex & get(int) const
double mass() const
double get(int i) const
double mass2() const