evtgen is hosted by Hepforge, IPPP Durham
EvtGen  2.0.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
EvtY3SToY1SpipiMoxhay.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 
23 #include "EvtGenBase/EvtGenKine.hh"
24 #include "EvtGenBase/EvtPDL.hh"
26 #include "EvtGenBase/EvtPatches.hh"
27 #include "EvtGenBase/EvtReport.hh"
30 
31 #include <stdlib.h>
32 #include <string>
33 using std::endl;
34 
36 {
37  return "Y3STOY1SPIPIMOXHAY";
38 }
39 
41 {
42  return new EvtY3SToY1SpipiMoxhay;
43 }
44 
46 {
47  static EvtId PIP = EvtPDL::getId( "pi+" );
48  static EvtId PIM = EvtPDL::getId( "pi-" );
49  static EvtId PI0 = EvtPDL::getId( "pi0" );
50 
51  // check that there are 2 arguments
52  checkNArg( 2 );
53  checkNDaug( 3 );
54 
57 
58  if ( ( !( getDaug( 1 ) == PIP && getDaug( 2 ) == PIM ) ) &&
59  ( !( getDaug( 1 ) == PI0 && getDaug( 2 ) == PI0 ) ) ) {
60  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
61  << "EvtY3SToY1SpipiMoxhay generator expected "
62  << " pi+ and pi- (or pi0 and pi0) "
63  << "as 2nd and 3rd daughter. " << endl;
64  EvtGenReport( EVTGEN_ERROR, "EvtGen" )
65  << "Will terminate execution!" << endl;
66  ::abort();
67  }
68 }
69 
71 {
72  setProbMax( 0.2 );
73 }
74 
76 {
78 
79  EvtParticle *v, *s1, *s2;
80 
81  v = p->getDaug( 0 );
82  s1 = p->getDaug( 1 );
83  s2 = p->getDaug( 2 );
84 
85  // setup the parameters needed for this model
86  double g_spp = 0.64;
87  double lambda = -0.73;
88  double m_sigma = 0.71;
89  double f_pi = 0.094;
90  double m_pi = s1->getP4().mass();
91 
92  double MV1 = p->getP4().mass();
93  double MV2 = v->getP4().mass();
94 
95  double q = ( s1->getP4() + s2->getP4() ).mass();
96 
97  double EV2 = ( MV1 * MV1 - MV2 * MV2 - q * q ) / ( 2.0 * q );
98 
99  double ReB_over_A = getArg( 0 );
100  double ImB_over_A = getArg( 1 );
101 
102  EvtComplex Xi;
103 
104  Xi = EvtComplex( 2.0 / EvtConst::pi *
105  ( 1.0 - sqrt( 1.0 - 4 * m_pi * m_pi / ( q * q ) ) *
106  log( ( sqrt( q * q ) +
107  sqrt( q * q - 4.0 * m_pi * m_pi ) ) /
108  ( 2 * m_pi ) ) ),
109  sqrt( 1.0 - 4 * m_pi * m_pi / ( q * q ) ) );
110 
111  // The form factor
112  EvtComplex F;
113 
114  F = ( g_spp * g_spp + lambda * ( m_sigma * m_sigma - q * q ) ) /
115  ( ( ( m_sigma * m_sigma - q * q ) * ( 1.0 - lambda * Xi ) -
116  ( g_spp * g_spp * Xi ) ) *
117  1.0 / ( 8.0 * EvtConst::pi * f_pi * f_pi ) * q * q );
118 
119  EvtComplex B_over_A;
120  B_over_A = EvtComplex( ReB_over_A, ImB_over_A );
121 
122  // The dGamma/d(M_pipi) spectrum
123  EvtComplex dGdMpp;
124 
125  dGdMpp = abs2( ( q * q * F - B_over_A ) ) * q *
126  sqrt( q * q - 4 * m_pi * m_pi ) * sqrt( EV2 * EV2 - MV2 * MV2 );
127 
128  setProb( real( dGdMpp ) );
129  return;
130 }
void setProb(double prob)
Definition: EvtDecayProb.hh:32
double getArg(unsigned int j)
void decay(EvtParticle *p) override
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
double mass() const
Definition: EvtVector4R.cpp:49
double abs2(const EvtComplex &c)
Definition: EvtComplex.hh:209
EvtId * getDaugs()
Definition: EvtDecayBase.hh:66
void setProbMax(double prbmx)
Definition: EvtId.hh:27
static const double pi
Definition: EvtConst.hh:26
std::string getName() override
double initializePhaseSpace(unsigned int numdaughter, EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
void checkNDaug(int d1, int d2=-1)
void checkSpinParent(EvtSpinType::spintype sp)
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtVector4R & getP4() const
EvtDecayBase * clone() override
double lambda(double q, double m1, double m2)
Definition: EvtFlatQ2.cpp:31
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
int getNDaug() const
Definition: EvtDecayBase.hh:65
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
double real(const EvtComplex &c)
Definition: EvtComplex.hh:230
EvtId getDaug(int i) const
Definition: EvtDecayBase.hh:67