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.
EvtResonance2.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/EvtComplex.hh"
24 #include "EvtGenBase/EvtConst.hh"
25 #include "EvtGenBase/EvtPatches.hh"
26 #include "EvtGenBase/EvtReport.hh"
27 
28 #include <cmath>
29 
31 {
32  if ( &n == this )
33  return *this;
34  _p4_p = n._p4_p;
35  _p4_d1 = n._p4_d1;
36  _p4_d2 = n._p4_d2;
37  _ampl = n._ampl;
38  _theta = n._theta;
39  _gamma = n._gamma;
40  _spin = n._spin;
41  _bwm = n._bwm;
43  _barrier1 = n._barrier1;
44  _barrier2 = n._barrier2;
45  return *this;
46 }
47 
49  const EvtVector4R& p4_d2, double ampl,
50  double theta, double gamma, double bwm, int spin,
51  bool invmass_angdenom, double barrier1,
52  double barrier2 ) :
53  _p4_p( p4_p ),
54  _p4_d1( p4_d1 ),
55  _p4_d2( p4_d2 ),
56  _ampl( ampl ),
57  _theta( theta ),
58  _gamma( gamma ),
59  _bwm( bwm ),
60  _barrier1( barrier1 ),
61  _barrier2( barrier2 ),
62  _spin( spin ),
63  _invmass_angdenom( invmass_angdenom )
64 {
65 }
66 
68 {
69  double pi180inv = 1.0 / EvtConst::radToDegrees;
70 
71  EvtComplex ampl;
72  EvtVector4R p4_d3 = _p4_p - _p4_d1 - _p4_d2;
73 
74  //get cos of the angle between the daughters from their 4-momenta
75  //and the 4-momentum of the parent
76 
77  //in general, EvtDecayAngle(parent, part1+part2, part1) gives the angle
78  //the missing particle (not listed in the arguments) makes
79  //with part2 in the rest frame of both
80  //listed particles (12)
81 
82  //angle 3 makes with 2 in rest frame of 12 (CS3)
83  //double cos_phi_0 = EvtDecayAngle(_p4_p, _p4_d1+_p4_d2, _p4_d1);
84  //angle 3 makes with 1 in 12 is, of course, -cos_phi_0
85 
86  //first compute several quantities...follow CLEO preprint 00-23
87 
88  double mAB = ( _p4_d1 + _p4_d2 ).mass();
89  double mBC = ( _p4_d2 + p4_d3 ).mass();
90  double mAC = ( _p4_d1 + p4_d3 ).mass();
91  double mA = _p4_d1.mass();
92  double mB = _p4_d2.mass();
93  double mD = _p4_p.mass();
94  double mC = p4_d3.mass();
95 
96  double mR = _bwm;
97  double gammaR = _gamma;
98  double mdenom = _invmass_angdenom ? mAB : mR;
99  double pAB = sqrt( ( ( ( mAB * mAB - mA * mA - mB * mB ) *
100  ( mAB * mAB - mA * mA - mB * mB ) / 4.0 ) -
101  mA * mA * mB * mB ) /
102  ( mAB * mAB ) );
103  double pR = sqrt( ( ( ( mR * mR - mA * mA - mB * mB ) *
104  ( mR * mR - mA * mA - mB * mB ) / 4.0 ) -
105  mA * mA * mB * mB ) /
106  ( mR * mR ) );
107 
108  double pD = ( ( ( mD * mD - mR * mR - mC * mC ) *
109  ( mD * mD - mR * mR - mC * mC ) / 4.0 ) -
110  mR * mR * mC * mC ) /
111  ( mD * mD );
112  if ( pD > 0 ) {
113  pD = sqrt( pD );
114  } else {
115  pD = 0;
116  }
117  double pDAB = sqrt( ( ( ( mD * mD - mAB * mAB - mC * mC ) *
118  ( mD * mD - mAB * mAB - mC * mC ) / 4.0 ) -
119  mAB * mAB * mC * mC ) /
120  ( mD * mD ) );
121 
122  double fR = 1;
123  double fD = 1;
124  int power = 0;
125  switch ( _spin ) {
126  case 0:
127  fR = 1.0;
128  fD = 1.0;
129  power = 1;
130  break;
131  case 1:
132  fR = sqrt( 1.0 + _barrier1 * _barrier1 * pR * pR ) /
133  sqrt( 1.0 + _barrier1 * _barrier1 * pAB * pAB );
134  fD = sqrt( 1.0 + _barrier2 * _barrier2 * pD * pD ) /
135  sqrt( 1.0 + _barrier2 * _barrier2 * pDAB * pDAB );
136  power = 3;
137  break;
138  case 2:
139  fR = sqrt( ( 9 + 3 * pow( ( _barrier1 * pR ), 2 ) +
140  pow( ( _barrier1 * pR ), 4 ) ) /
141  ( 9 + 3 * pow( ( _barrier1 * pAB ), 2 ) +
142  pow( ( _barrier1 * pAB ), 4 ) ) );
143  fD = sqrt( ( 9 + 3 * pow( ( _barrier2 * pD ), 2 ) +
144  pow( ( _barrier2 * pD ), 4 ) ) /
145  ( 9 + 3 * pow( ( _barrier2 * pDAB ), 2 ) +
146  pow( ( _barrier2 * pDAB ), 4 ) ) );
147  power = 5;
148  break;
149  default:
150  EvtGenReport( EVTGEN_INFO, "EvtGen" )
151  << "Incorrect spin in EvtResonance2.cc\n";
152  }
153 
154  double gammaAB = gammaR * pow( pAB / pR, power ) * ( mR / mAB ) * fR * fR;
155  switch ( _spin ) {
156  case 0:
157  ampl = _ampl *
158  EvtComplex( cos( _theta * pi180inv ),
159  sin( _theta * pi180inv ) ) *
160  fR * fD /
161  ( mR * mR - mAB * mAB - EvtComplex( 0.0, mR * gammaAB ) );
162  break;
163  case 1:
164  ampl = _ampl *
165  EvtComplex( cos( _theta * pi180inv ),
166  sin( _theta * pi180inv ) ) *
167  ( fR * fD *
168  ( mAC * mAC - mBC * mBC +
169  ( ( mD * mD - mC * mC ) * ( mB * mB - mA * mA ) /
170  ( mdenom * mdenom ) ) ) /
171  ( mR * mR - mAB * mAB - EvtComplex( 0.0, mR * gammaAB ) ) );
172  break;
173  case 2:
174  ampl = _ampl *
175  EvtComplex( cos( _theta * pi180inv ),
176  sin( _theta * pi180inv ) ) *
177  fR * fD /
178  ( mR * mR - mAB * mAB - EvtComplex( 0.0, mR * gammaAB ) ) *
179  ( pow( ( mBC * mBC - mAC * mAC +
180  ( mD * mD - mC * mC ) * ( mA * mA - mB * mB ) /
181  ( mdenom * mdenom ) ),
182  2 ) -
183  ( 1.0 / 3.0 ) *
184  ( mAB * mAB - 2 * mD * mD - 2 * mC * mC +
185  pow( ( mD * mD - mC * mC ) / mdenom, 2 ) ) *
186  ( mAB * mAB - 2 * mA * mA - 2 * mB * mB +
187  pow( ( mA * mA - mB * mB ) / mdenom, 2 ) ) );
188  break;
189 
190  default:
191  EvtGenReport( EVTGEN_INFO, "EvtGen" )
192  << "Incorrect spin in EvtResonance2.cc\n";
193  }
194 
195  return ampl;
196 }
EvtResonance2(const EvtVector4R &p4_p, const EvtVector4R &p4_d1, const EvtVector4R &p4_d2, double ampl=1.0, double theta=0.0, double gamma=0.0, double bwm=0.0, int spin=0, bool invmass_angdenom=false, double barrier1=1.5, double barrier2=5.0)
EvtComplex resAmpl() const
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
EvtVector4R _p4_p
double mass() const
Definition: EvtVector4R.cpp:49
bool _invmass_angdenom
EvtVector4R _p4_d2
static const double radToDegrees
Definition: EvtConst.hh:28
EvtResonance2 & operator=(const EvtResonance2 &)
EvtVector4R _p4_d1