Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F11222469
EtaPiPiGammaDecayer.cc
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
24 KB
Subscribers
None
EtaPiPiGammaDecayer.cc
View Options
// -*- C++ -*-
//
// EtaPiPiGammaDecayer.cc is a part of Herwig++ - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2011 The Herwig Collaboration
//
// Herwig++ is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
// This is the implementation of the non-inlined, non-templated member
// functions of the EtaPiPiGammaDecayer class.
//
#include
"EtaPiPiGammaDecayer.h"
#include
"ThePEG/Interface/ClassDocumentation.h"
#include
"ThePEG/Interface/Switch.h"
#include
"ThePEG/Interface/Parameter.h"
#include
"ThePEG/Interface/ParVector.h"
#include
"ThePEG/Persistency/PersistentOStream.h"
#include
"ThePEG/Persistency/PersistentIStream.h"
#include
"ThePEG/PDT/DecayMode.h"
#include
"ThePEG/Helicity/WaveFunction/VectorWaveFunction.h"
#include
"ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h"
#include
"ThePEG/Helicity/epsilon.h"
#include
"Herwig++/PDT/ThreeBodyAllOnCalculator.h"
#include
"Herwig++/Utilities/GaussianIntegrator.h"
#include
"ThePEG/Utilities/DescribeClass.h"
using
namespace
Herwig
;
using
namespace
ThePEG
::
Helicity
;
DescribeClass
<
EtaPiPiGammaDecayer
,
DecayIntegrator
>
describeHerwigEtaPiPiGammaDecayer
(
"Herwig::EtaPiPiGammaDecayer"
,
"HwSMDecay.so"
);
HERWIG_INTERPOLATOR_CLASSDESC
(
EtaPiPiGammaDecayer
,
double
,
Energy
)
void
EtaPiPiGammaDecayer
::
doinitrun
()
{
DecayIntegrator
::
doinitrun
();
if
(
initialize
())
{
for
(
unsigned
int
ix
=
0
;
ix
<
_maxweight
.
size
();
++
ix
)
_maxweight
[
ix
]
=
mode
(
ix
)
->
maxWeight
();
}
}
EtaPiPiGammaDecayer
::
EtaPiPiGammaDecayer
()
:
_incoming
(
2
),
_coupling
(
2
),
_maxweight
(
2
),
_option
(
2
)
{
// the pion decay constant
_fpi
=
130.7
*
MeV
;
// the rho mass
_mrho
=
0.7711
*
GeV
;
_rhowidth
=
0.1492
*
GeV
;
// the constants for the omnes function form
_aconst
=
0.5
/
_mrho
/
_mrho
;
_cconst
=
1.0
;
// use local values of the parameters
_localparameters
=
true
;
// the modes
// eta decay
_incoming
[
0
]
=
221
;
_option
[
0
]
=
3
;
_coupling
[
0
]
=
5.060e-3
;
_maxweight
[
0
]
=
3.95072
;
// eta' decay
_incoming
[
1
]
=
331
;
_option
[
1
]
=
3
;
_coupling
[
1
]
=
4.278e-3
;
_maxweight
[
1
]
=
3.53141
;
_rhoconst
=
0.
;
_mpi
=
ZERO
;
// initialization of the experimental function
_initialize
=
false
;
_npoints
=
100
;
Energy
en
[
35
]
=
{
300
*
MeV
,
320
*
MeV
,
340
*
MeV
,
360
*
MeV
,
380
*
MeV
,
400
*
MeV
,
420
*
MeV
,
440
*
MeV
,
460
*
MeV
,
480
*
MeV
,
500
*
MeV
,
520
*
MeV
,
540
*
MeV
,
560
*
MeV
,
580
*
MeV
,
600
*
MeV
,
620
*
MeV
,
640
*
MeV
,
660
*
MeV
,
680
*
MeV
,
700
*
MeV
,
720
*
MeV
,
740
*
MeV
,
760
*
MeV
,
780
*
MeV
,
800
*
MeV
,
820
*
MeV
,
840
*
MeV
,
860
*
MeV
,
880
*
MeV
,
900
*
MeV
,
920
*
MeV
,
940
*
MeV
,
960
*
MeV
,
980
*
MeV
};
_energy
=
vector
<
Energy
>
(
en
,
en
+
35
);
double
phs
[
35
]
=
{
00.1
,
0.4
,
0.7
,
1.0
,
1.5
,
02.0
,
2.5
,
3.2
,
4.0
,
4.9
,
05.9
,
7.1
,
8.5
,
10.1
,
12.1
,
14.4
,
17.3
,
20.9
,
25.4
,
31.2
,
38.7
,
48.4
,
60.6
,
74.9
,
90.0
,
103.8
,
115.3
,
124.3
,
131.3
,
136.7
,
141.0
,
144.5
,
147.3
,
149.7
,
151.8
};
_phase
=
vector
<
double
>
(
phs
,
phs
+
35
);
// experimental omnes function
Energy
omnesen
[
100
]
=
{
282.534
*
MeV
,
289.32
*
MeV
,
296.106
*
MeV
,
302.893
*
MeV
,
309.679
*
MeV
,
316.466
*
MeV
,
323.252
*
MeV
,
330.038
*
MeV
,
336.825
*
MeV
,
343.611
*
MeV
,
350.398
*
MeV
,
357.184
*
MeV
,
363.97
*
MeV
,
370.757
*
MeV
,
377.543
*
MeV
,
384.33
*
MeV
,
391.116
*
MeV
,
397.902
*
MeV
,
404.689
*
MeV
,
411.475
*
MeV
,
418.261
*
MeV
,
425.048
*
MeV
,
431.834
*
MeV
,
438.621
*
MeV
,
445.407
*
MeV
,
452.193
*
MeV
,
458.98
*
MeV
,
465.766
*
MeV
,
472.553
*
MeV
,
479.339
*
MeV
,
486.125
*
MeV
,
492.912
*
MeV
,
499.698
*
MeV
,
506.485
*
MeV
,
513.271
*
MeV
,
520.057
*
MeV
,
526.844
*
MeV
,
533.63
*
MeV
,
540.417
*
MeV
,
547.203
*
MeV
,
553.989
*
MeV
,
560.776
*
MeV
,
567.562
*
MeV
,
574.349
*
MeV
,
581.135
*
MeV
,
587.921
*
MeV
,
594.708
*
MeV
,
601.494
*
MeV
,
608.281
*
MeV
,
615.067
*
MeV
,
621.853
*
MeV
,
628.64
*
MeV
,
635.426
*
MeV
,
642.213
*
MeV
,
648.999
*
MeV
,
655.785
*
MeV
,
662.572
*
MeV
,
669.358
*
MeV
,
676.145
*
MeV
,
682.931
*
MeV
,
689.717
*
MeV
,
696.504
*
MeV
,
703.29
*
MeV
,
710.077
*
MeV
,
716.863
*
MeV
,
723.649
*
MeV
,
730.436
*
MeV
,
737.222
*
MeV
,
744.009
*
MeV
,
750.795
*
MeV
,
757.581
*
MeV
,
764.368
*
MeV
,
771.154
*
MeV
,
777.94
*
MeV
,
784.727
*
MeV
,
791.513
*
MeV
,
798.3
*
MeV
,
805.086
*
MeV
,
811.872
*
MeV
,
818.659
*
MeV
,
825.445
*
MeV
,
832.232
*
MeV
,
839.018
*
MeV
,
845.804
*
MeV
,
852.591
*
MeV
,
859.377
*
MeV
,
866.164
*
MeV
,
872.95
*
MeV
,
879.736
*
MeV
,
886.523
*
MeV
,
893.309
*
MeV
,
900.096
*
MeV
,
906.882
*
MeV
,
913.668
*
MeV
,
920.455
*
MeV
,
927.241
*
MeV
,
934.028
*
MeV
,
940.814
*
MeV
,
947.6
*
MeV
,
954.387
*
MeV
};
_omnesenergy
.
assign
(
omnesen
,
omnesen
+
100
);
double
omnesre
[
100
]
=
{
0.860676
,
0.851786
,
0.843688
,
0.835827
,
0.828031
,
0.820229
,
0.812370
,
0.804424
,
0.796354
,
0.788143
,
0.779698
,
0.770939
,
0.761692
,
0.752707
,
0.743823
,
0.735004
,
0.726091
,
0.717047
,
0.707862
,
0.698439
,
0.688685
,
0.678510
,
0.668518
,
0.658481
,
0.648344
,
0.638219
,
0.627989
,
0.617603
,
0.607222
,
0.596711
,
0.586026
,
0.575280
,
0.564282
,
0.553067
,
0.541923
,
0.530574
,
0.519112
,
0.507690
,
0.496055
,
0.484313
,
0.472496
,
0.460245
,
0.447943
,
0.435766
,
0.423390
,
0.410997
,
0.398510
,
0.385479
,
0.372458
,
0.359520
,
0.346129
,
0.332837
,
0.319623
,
0.305858
,
0.292238
,
0.278690
,
0.264391
,
0.250316
,
0.236400
,
0.221655
,
0.207196
,
0.192956
,
0.177745
,
0.162833
,
0.148209
,
0.132603
,
0.117202
,
0.102090
,
0.0862283
,
0.0703392
,
0.0545317
,
0.0383762
,
0.0219486
,
0.00518648
,
-
0.0113217
,
-
0.0280201
,
-
0.045445
,
-
0.0625479
,
-
0.079748
,
-
0.0978819
,
-
0.11569
,
-
0.133447
,
-
0.152117
,
-
0.170608
,
-
0.189137
,
-
0.208597
,
-
0.227864
,
-
0.247185
,
-
0.267306
,
-
0.287382
,
-
0.307707
,
-
0.328882
,
-
0.350103
,
-
0.37178
,
-
0.394464
,
-
0.417228
,
-
0.440561
,
-
0.464976
,
-
0.490278
,
-
0.517527
};
_omnesfunctionreal
.
assign
(
omnesre
,
omnesre
+
100
);
double
omnesim
[
100
]
=
{
0.00243346
,
0.000894972
,
-
0.000612496
,
-
0.00209178
,
-
0.00354344
,
-
0.00496737
,
-
0.00636316
,
-
0.00773022
,
-
0.00906769
,
-
0.0103569
,
-
0.0116108
,
-
0.0128658
,
-
0.0145424
,
-
0.0165746
,
-
0.0186438
,
-
0.0206363
,
-
0.0225379
,
-
0.0243827
,
-
0.0261488
,
-
0.0278572
,
-
0.0295317
,
-
0.0316349
,
-
0.0339321
,
-
0.0362345
,
-
0.0386555
,
-
0.0410799
,
-
0.0434534
,
-
0.0459509
,
-
0.0484302
,
-
0.0508376
,
-
0.0533398
,
-
0.0557937
,
-
0.0581587
,
-
0.0608612
,
-
0.0635382
,
-
0.0661231
,
-
0.068983
,
-
0.0717604
,
-
0.0744215
,
-
0.0772635
,
-
0.0799845
,
-
0.0825991
,
-
0.0857537
,
-
0.0888139
,
-
0.0917441
,
-
0.0948263
,
-
0.0977055
,
-
0.100462
,
-
0.103773
,
-
0.106912
,
-
0.109931
,
-
0.113413
,
-
0.116647
,
-
0.119722
,
-
0.123282
,
-
0.126521
,
-
0.129593
,
-
0.133324
,
-
0.136691
,
-
0.139854
,
-
0.143729
,
-
0.14718
,
-
0.150356
,
-
0.154353
,
-
0.157926
,
-
0.161133
,
-
0.165174
,
-
0.168899
,
-
0.172212
,
-
0.176116
,
-
0.179892
,
-
0.183445
,
-
0.187134
,
-
0.190947
,
-
0.195144
,
-
0.198771
,
-
0.202443
,
-
0.206906
,
-
0.210561
,
-
0.214207
,
-
0.218943
,
-
0.222806
,
-
0.226551
,
-
0.231273
,
-
0.235267
,
-
0.239178
,
-
0.244082
,
-
0.24836
,
-
0.252492
,
-
0.257394
,
-
0.261812
,
-
0.266156
,
-
0.271161
,
-
0.275849
,
-
0.280675
,
-
0.286275
,
-
0.291716
,
-
0.297353
,
-
0.303621
,
-
0.310452
};
_omnesfunctionimag
.
assign
(
omnesim
,
omnesim
+
100
);
// integration cut parameter
_epscut
=
0.4
*
MeV
;
// size of the arrays
_nsizea
=
_energy
.
size
();
_nsizeb
=
_omnesenergy
.
size
();
// intermediates
generateIntermediates
(
false
);
}
void
EtaPiPiGammaDecayer
::
doinit
()
{
DecayIntegrator
::
doinit
();
// check the consistence of the parameters
unsigned
int
isize
=
_incoming
.
size
();
if
(
isize
!=
_coupling
.
size
()
||
isize
!=
_option
.
size
()
||
isize
!=
_maxweight
.
size
()
||
_energy
.
size
()
!=
_phase
.
size
()
||
_omnesenergy
.
size
()
!=
_omnesfunctionreal
.
size
()
||
_omnesenergy
.
size
()
!=
_omnesfunctionimag
.
size
())
throw
InitException
()
<<
"Inconsistent parameters in "
<<
"EtaPiPiGammaDecayer::doinit()"
<<
Exception
::
abortnow
;
// set the parameters
tPDPtr
rho
(
getParticleData
(
ParticleID
::
rho0
));
if
(
!
_localparameters
)
{
_mrho
=
rho
->
mass
();
_rhowidth
=
rho
->
width
();
}
_mpi
=
getParticleData
(
ParticleID
::
piplus
)
->
mass
();
Energy
pcm
(
Kinematics
::
pstarTwoBodyDecay
(
_mrho
,
_mpi
,
_mpi
));
_rhoconst
=
sqr
(
_mrho
)
*
_rhowidth
/
pow
<
3
,
1
>
(
pcm
);
// set up the experimental omnes function if needed
if
(
_initialize
)
{
// convert the phase shift into radians
vector
<
double
>
radphase
;
for
(
unsigned
int
ix
=
0
;
ix
<
_phase
.
size
();
++
ix
)
{
radphase
.
push_back
(
_phase
[
ix
]
/
180.
*
Constants
::
pi
);
}
// set up an interpolator for this
Interpolator
<
double
,
Energy
>::
Ptr
intphase
=
make_InterpolatorPtr
(
radphase
,
_energy
,
3
);
// limits and step sizes
Energy
moff
(
2.
*
_mpi
),
meta
(
getParticleData
(
ParticleID
::
etaprime
)
->
mass
()),
upp
(
meta
),
step
((
meta
-
moff
)
/
_npoints
);
// intergrator
GaussianIntegrator
integrator
;
// integrand
OmnesIntegrand
D1
(
intphase
,
sqr
(
_epscut
));
// loop for integrals
double
D1real
,
D1imag
;
Complex
ii
(
0.
,
1.
),
answer
;
moff
+=
0.5
*
step
;
_omnesfunctionreal
.
clear
();
_omnesfunctionimag
.
clear
();
_omnesenergy
.
clear
();
for
(
;
moff
<
upp
;
moff
+=
step
)
{
D1
.
setScale
(
moff
*
moff
);
// piece between 0 and 1 GeV
using
Constants
::
pi
;
Energy2
moff2
(
sqr
(
moff
)),
eps2
(
sqr
(
_epscut
));
D1real
=-
moff2
*
(
integrator
.
value
(
D1
,
4.
*
_mpi
*
_mpi
,
moff2
-
eps2
)
+
integrator
.
value
(
D1
,
moff2
+
eps2
,
upp
*
upp
))
/
pi
;
D1imag
=-
(
*
intphase
)(
moff
);
// piece above 1 GeV
D1real
+=-
(
*
intphase
)(
upp
)
/
pi
*
log
(
upp
*
upp
/
(
upp
*
upp
-
moff
*
moff
));
// calculate the answer
answer
=
exp
(
D1real
+
ii
*
D1imag
);
// put into the arrays
_omnesfunctionreal
.
push_back
(
answer
.
real
());
_omnesfunctionimag
.
push_back
(
answer
.
imag
());
_omnesenergy
.
push_back
(
moff
);
}
}
// set up the modes
tPDVector
extpart
;
extpart
.
resize
(
4
);
extpart
[
1
]
=
getParticleData
(
ParticleID
::
piplus
);
extpart
[
2
]
=
getParticleData
(
ParticleID
::
piminus
);
extpart
[
3
]
=
getParticleData
(
ParticleID
::
gamma
);
vector
<
double
>
dummyweights
(
1
,
1.
);
DecayPhaseSpaceChannelPtr
newchannel
;
DecayPhaseSpaceModePtr
mode
;
for
(
unsigned
int
ix
=
0
;
ix
<
_coupling
.
size
();
++
ix
)
{
extpart
[
0
]
=
getParticleData
(
_incoming
[
ix
]);
mode
=
new_ptr
(
DecayPhaseSpaceMode
(
extpart
,
this
));
newchannel
=
new_ptr
(
DecayPhaseSpaceChannel
(
mode
));
newchannel
->
addIntermediate
(
extpart
[
0
],
0
,
0.0
,
-
1
,
3
);
newchannel
->
addIntermediate
(
rho
,
0
,
0.0
,
1
,
2
);
mode
->
addChannel
(
newchannel
);
addMode
(
mode
,
_maxweight
[
ix
],
dummyweights
);
}
}
int
EtaPiPiGammaDecayer
::
modeNumber
(
bool
&
cc
,
tcPDPtr
parent
,
const
tPDVector
&
children
)
const
{
int
imode
(
-
1
);
// check number of external particles
if
(
children
.
size
()
!=
3
){
return
imode
;}
// check the outgoing particles
unsigned
int
npip
(
0
),
npim
(
0
),
ngamma
(
0
);
tPDVector
::
const_iterator
pit
=
children
.
begin
();
int
id
;
for
(;
pit
!=
children
.
end
();
++
pit
)
{
id
=
(
**
pit
).
id
();
if
(
id
==
ParticleID
::
piplus
)
++
npip
;
else
if
(
id
==
ParticleID
::
piminus
)
++
npim
;
else
if
(
id
==
ParticleID
::
gamma
)
++
ngamma
;
}
if
(
!
(
npip
==
1
&&
npim
==
1
&&
ngamma
==
1
))
return
imode
;
unsigned
int
ix
(
0
);
id
=
parent
->
id
();
do
{
if
(
id
==
_incoming
[
ix
]){
imode
=
ix
;}
++
ix
;}
while
(
imode
<
0
&&
ix
<
_incoming
.
size
());
cc
=
false
;
return
imode
;
}
void
EtaPiPiGammaDecayer
::
persistentOutput
(
PersistentOStream
&
os
)
const
{
os
<<
ounit
(
_fpi
,
MeV
)
<<
_incoming
<<
_coupling
<<
_maxweight
<<
_option
<<
ounit
(
_aconst
,
1
/
MeV2
)
<<
_cconst
<<
ounit
(
_mrho
,
MeV
)
<<
ounit
(
_rhowidth
,
MeV
)
<<
_rhoconst
<<
ounit
(
_mpi
,
MeV
)
<<
_localparameters
<<
ounit
(
_energy
,
MeV
)
<<
ounit
(
_omnesenergy
,
MeV
)
<<
_phase
<<
_omnesfunctionreal
<<
_omnesfunctionimag
<<
_initialize
<<
_npoints
<<
ounit
(
_epscut
,
MeV
);
}
void
EtaPiPiGammaDecayer
::
persistentInput
(
PersistentIStream
&
is
,
int
)
{
is
>>
iunit
(
_fpi
,
MeV
)
>>
_incoming
>>
_coupling
>>
_maxweight
>>
_option
>>
iunit
(
_aconst
,
1
/
MeV2
)
>>
_cconst
>>
iunit
(
_mrho
,
MeV
)
>>
iunit
(
_rhowidth
,
MeV
)
>>
_rhoconst
>>
iunit
(
_mpi
,
MeV
)
>>
_localparameters
>>
iunit
(
_energy
,
MeV
)
>>
iunit
(
_omnesenergy
,
MeV
)
>>
_phase
>>
_omnesfunctionreal
>>
_omnesfunctionimag
>>
_initialize
>>
_npoints
>>
iunit
(
_epscut
,
MeV
);
}
void
EtaPiPiGammaDecayer
::
Init
()
{
static
ClassDocumentation
<
EtaPiPiGammaDecayer
>
documentation
(
"The EtaPiPiGammaDecayer class is design for the decay of"
" the eta and eta prime to pi+pi-gamma"
,
"The decays of $
\\
eta,
\\
eta'
\\
to
\\
pi^+
\\
pi^-
\\
gamma$ were simulated"
" using the matrix elements from
\\
cite{Venugopal:1998fq,Holstein:2001bt}"
,
"
\\
bibitem{Venugopal:1998fq} E.~P.~Venugopal and B.~R.~Holstein,
\n
"
"Phys.
\\
Rev.
\\
D {
\\
bf 57} (1998) 4397 [arXiv:hep-ph/9710382].
\n
"
"%%CITATION = PHRVA,D57,4397;%%
\n
"
"
\\
bibitem{Holstein:2001bt} B.~R.~Holstein,
\n
"
" Phys.
\\
Scripta {
\\
bf T99} (2002) 55 [arXiv:hep-ph/0112150].
\n
"
"%%CITATION = PHSTB,T99,55;%%
\n
"
);
static
Parameter
<
EtaPiPiGammaDecayer
,
Energy
>
interfacefpi
(
"fpi"
,
"The pion decay constant"
,
&
EtaPiPiGammaDecayer
::
_fpi
,
MeV
,
130.7
*
MeV
,
ZERO
,
200.
*
MeV
,
false
,
false
,
false
);
static
ParVector
<
EtaPiPiGammaDecayer
,
int
>
interfaceIncoming
(
"Incoming"
,
"The PDG code for the incoming particle"
,
&
EtaPiPiGammaDecayer
::
_incoming
,
0
,
0
,
0
,
-
10000000
,
10000000
,
false
,
false
,
true
);
static
ParVector
<
EtaPiPiGammaDecayer
,
double
>
interfaceCoupling
(
"Coupling"
,
"The coupling for the decay mode"
,
&
EtaPiPiGammaDecayer
::
_coupling
,
0
,
0
,
0
,
0.
,
100.
,
false
,
false
,
true
);
static
ParVector
<
EtaPiPiGammaDecayer
,
double
>
interfaceMaxWeight
(
"MaxWeight"
,
"The maximum weight for the decay mode"
,
&
EtaPiPiGammaDecayer
::
_maxweight
,
0
,
0
,
0
,
0.
,
100.
,
false
,
false
,
true
);
static
Parameter
<
EtaPiPiGammaDecayer
,
Energy
>
interfaceRhoMass
(
"RhoMass"
,
"The mass of the rho"
,
&
EtaPiPiGammaDecayer
::
_mrho
,
MeV
,
771.1
*
MeV
,
400.
*
MeV
,
1000.
*
MeV
,
false
,
false
,
false
);
static
Parameter
<
EtaPiPiGammaDecayer
,
Energy
>
interfaceRhoWidth
(
"RhoWidth"
,
"The width of the rho"
,
&
EtaPiPiGammaDecayer
::
_rhowidth
,
MeV
,
149.2
*
MeV
,
100.
*
MeV
,
300.
*
MeV
,
false
,
false
,
false
);
static
Switch
<
EtaPiPiGammaDecayer
,
bool
>
interfaceLocalParameters
(
"LocalParameters"
,
"Use local values of the rho mass and width"
,
&
EtaPiPiGammaDecayer
::
_localparameters
,
true
,
false
,
false
);
static
SwitchOption
interfaceLocalParametersLocal
(
interfaceLocalParameters
,
"Local"
,
"Use local parameters"
,
true
);
static
SwitchOption
interfaceLocalParametersParticleData
(
interfaceLocalParameters
,
"ParticleData"
,
"Use values from the particle data objects"
,
false
);
static
Parameter
<
EtaPiPiGammaDecayer
,
double
>
interfaceOmnesC
(
"OmnesC"
,
"The constant c for the Omnes form of the prefactor"
,
&
EtaPiPiGammaDecayer
::
_cconst
,
1.0
,
-
10.
,
10.
,
false
,
false
,
false
);
static
Parameter
<
EtaPiPiGammaDecayer
,
InvEnergy2
>
interfaceOmnesA
(
"OmnesA"
,
"The constant a for the Omnes form of the prefactor"
,
&
EtaPiPiGammaDecayer
::
_aconst
,
1.
/
GeV2
,
0.8409082
/
GeV2
,
ZERO
,
10.
/
GeV2
,
false
,
false
,
false
);
static
ParVector
<
EtaPiPiGammaDecayer
,
int
>
interfaceOption
(
"Option"
,
"The form of the prefactor 0 is a VMD model using M Gamma for the width term,"
"1 is a VMD model using q Gamma for the width term,"
"2. analytic form of the Omnes function,"
"3. experimental form of the Omnes function."
,
&
EtaPiPiGammaDecayer
::
_option
,
0
,
0
,
0
,
0
,
4
,
false
,
false
,
true
);
static
ParVector
<
EtaPiPiGammaDecayer
,
Energy
>
interfacePhase_Energy
(
"Phase_Energy"
,
"The energy values for the phase shift for the experimental version of the"
" Omnes function"
,
&
EtaPiPiGammaDecayer
::
_energy
,
MeV
,
-
1
,
1.0
*
MeV
,
300.0
*
MeV
,
2000.0
*
MeV
,
false
,
false
,
true
);
static
ParVector
<
EtaPiPiGammaDecayer
,
double
>
interfacePhase_Shift
(
"Phase_Shift"
,
"The experimental values of the phase shift for the experimental version"
" of the Omnes function"
,
&
EtaPiPiGammaDecayer
::
_phase
,
1.0
,
-
1
,
0.0
,
0.0
,
1000.0
,
false
,
false
,
true
);
static
ParVector
<
EtaPiPiGammaDecayer
,
Energy
>
interfaceOmnesEnergy
(
"OmnesEnergy"
,
"The energy values for the interpolation of the experimental Omnes function"
,
&
EtaPiPiGammaDecayer
::
_omnesenergy
,
MeV
,
-
1
,
1.
*
MeV
,
250.0
*
MeV
,
2000.
*
MeV
,
false
,
false
,
true
);
static
ParVector
<
EtaPiPiGammaDecayer
,
double
>
interfaceOmnesReal
(
"OmnesReal"
,
"The real part of the experimental Omnes function for the interpolation."
,
&
EtaPiPiGammaDecayer
::
_omnesfunctionreal
,
1.
,
-
1
,
1.
,
-
100.
,
100.
,
false
,
false
,
true
);
static
ParVector
<
EtaPiPiGammaDecayer
,
double
>
interfaceOmnesImag
(
"OmnesImag"
,
"The imaginary part of the experimental Omnes function for the interpolation."
,
&
EtaPiPiGammaDecayer
::
_omnesfunctionimag
,
1.
,
-
1
,
1.
,
-
100.
,
100.
,
false
,
false
,
true
);
static
Switch
<
EtaPiPiGammaDecayer
,
bool
>
interfaceInitializeOmnes
(
"InitializeOmnes"
,
"Initialize the experimental version of the Omnes function."
,
&
EtaPiPiGammaDecayer
::
_initialize
,
false
,
false
,
false
);
static
SwitchOption
interfaceInitializeOmnesInitialize
(
interfaceInitializeOmnes
,
"Yes"
,
"Perform the initialization"
,
true
);
static
SwitchOption
interfaceInitializeOmnesNoInitialization
(
interfaceInitializeOmnes
,
"No"
,
"No initialization"
,
false
);
static
Parameter
<
EtaPiPiGammaDecayer
,
unsigned
int
>
interfaceOmnesPoints
(
"OmnesPoints"
,
"The number of points for the interpolation table for the experimental"
" Omnes function."
,
&
EtaPiPiGammaDecayer
::
_npoints
,
100
,
50
,
200
,
false
,
false
,
true
);
static
Parameter
<
EtaPiPiGammaDecayer
,
Energy
>
interfaceOmnesCut
(
"OmnesCut"
,
"The cut parameter for the integral in the experimental Omnes function."
,
&
EtaPiPiGammaDecayer
::
_epscut
,
MeV
,
0.1
*
MeV
,
0.001
*
MeV
,
1.0
*
MeV
,
false
,
false
,
true
);
}
double
EtaPiPiGammaDecayer
::
me2
(
const
int
,
const
Particle
&
inpart
,
const
ParticleVector
&
decay
,
MEOption
meopt
)
const
{
useMe
();
if
(
meopt
==
Initialize
)
{
ScalarWaveFunction
::
calculateWaveFunctions
(
_rho
,
const_ptr_cast
<
tPPtr
>
(
&
inpart
),
incoming
);
ME
(
DecayMatrixElement
(
PDT
::
Spin0
,
PDT
::
Spin0
,
PDT
::
Spin0
,
PDT
::
Spin1
));
}
if
(
meopt
==
Terminate
)
{
// set up the spin information for the decay products
ScalarWaveFunction
::
constructSpinInfo
(
const_ptr_cast
<
tPPtr
>
(
&
inpart
),
incoming
,
true
);
for
(
unsigned
int
ix
=
0
;
ix
<
2
;
++
ix
)
ScalarWaveFunction
::
constructSpinInfo
(
decay
[
ix
],
outgoing
,
true
);
VectorWaveFunction
::
constructSpinInfo
(
_vectors
,
decay
[
2
],
outgoing
,
true
,
true
);
return
0.
;
}
VectorWaveFunction
::
calculateWaveFunctions
(
_vectors
,
decay
[
2
],
outgoing
,
true
);
// prefactor for the matrix element
complex
<
InvEnergy3
>
pre
(
_coupling
[
imode
()]
*
2.
*
sqrt
(
2.
)
/
(
_fpi
*
_fpi
*
_fpi
));
Lorentz5Momentum
ppipi
(
decay
[
0
]
->
momentum
()
+
decay
[
1
]
->
momentum
());
ppipi
.
rescaleMass
();
Energy
q
(
ppipi
.
mass
());
Energy2
q2
(
q
*
q
);
Complex
ii
(
0.
,
1.
);
// first VMD option
Complex
fact
;
if
(
_option
[
imode
()]
==
0
)
{
Energy
pcm
(
Kinematics
::
pstarTwoBodyDecay
(
q
,
_mpi
,
_mpi
));
Complex
resfact
(
q2
/
(
_mrho
*
_mrho
-
q2
-
ii
*
_mrho
*
pcm
*
pcm
*
pcm
*
_rhoconst
/
q2
));
fact
=
(
1.
+
1.5
*
resfact
);
}
// second VMD option
else
if
(
_option
[
imode
()]
==
1
)
{
Energy
pcm
(
Kinematics
::
pstarTwoBodyDecay
(
q
,
_mpi
,
_mpi
));
Complex
resfact
(
q2
/
(
_mrho
*
_mrho
-
q2
-
ii
*
pcm
*
pcm
*
pcm
*
_rhoconst
/
q
));
fact
=
(
1.
+
1.5
*
resfact
);
}
// analytic omne function
else
if
(
_option
[
imode
()]
==
2
)
{
fact
=
(
1.
-
_cconst
+
_cconst
*
(
1.
+
_aconst
*
q2
)
/
analyticOmnes
(
q2
));
}
// experimental omnes function
else
if
(
_option
[
imode
()]
==
3
)
{
fact
=
(
1.
-
_cconst
+
_cconst
*
(
1.
+
_aconst
*
q2
)
/
experimentalOmnes
(
q2
));
}
pre
=
pre
*
fact
;
LorentzPolarizationVector
epstemp
(
pre
*
Helicity
::
epsilon
(
decay
[
0
]
->
momentum
(),
decay
[
1
]
->
momentum
(),
decay
[
2
]
->
momentum
()));
// compute the matrix element
vector
<
unsigned
int
>
ispin
(
4
,
0
);
for
(
ispin
[
3
]
=
0
;
ispin
[
3
]
<
3
;
++
ispin
[
3
])
{
if
(
ispin
[
3
]
==
1
)
ME
()(
ispin
)
=
0.
;
else
ME
()(
ispin
)
=
epstemp
.
dot
(
_vectors
[
ispin
[
3
]]);
}
// contract the whole thing
return
ME
().
contract
(
_rho
).
real
();
}
double
EtaPiPiGammaDecayer
::
threeBodyMatrixElement
(
const
int
imodeb
,
const
Energy2
,
const
Energy2
s3
,
const
Energy2
s2
,
const
Energy2
s1
,
const
Energy
,
const
Energy
,
const
Energy
)
const
{
complex
<
InvEnergy3
>
pre
(
_coupling
[
imodeb
]
*
2.
*
sqrt
(
2.
)
/
pow
<
3
,
1
>
(
_fpi
));
Energy
q
(
sqrt
(
s3
));
Complex
ii
(
0.
,
1.
);
// first VMD option
Complex
fact
;
if
(
_option
[
imodeb
]
==
0
)
{
Energy
pcm
(
Kinematics
::
pstarTwoBodyDecay
(
q
,
_mpi
,
_mpi
));
Complex
resfact
(
s3
/
(
_mrho
*
_mrho
-
s3
-
ii
*
_mrho
*
pcm
*
pcm
*
pcm
*
_rhoconst
/
s3
));
fact
=
(
1.
+
1.5
*
resfact
);
}
// second VMD option
else
if
(
_option
[
imodeb
]
==
1
)
{
Energy
pcm
(
Kinematics
::
pstarTwoBodyDecay
(
q
,
_mpi
,
_mpi
));
Complex
resfact
(
s3
/
(
_mrho
*
_mrho
-
s3
-
ii
*
pcm
*
pcm
*
pcm
*
_rhoconst
/
q
));
fact
=
(
1.
+
1.5
*
resfact
);
}
// analytic omne function
else
if
(
_option
[
imodeb
]
==
2
)
{
fact
=
(
1.
-
_cconst
+
_cconst
*
(
1.
+
_aconst
*
s3
)
/
analyticOmnes
(
s3
));
}
// experimental omnes function
else
if
(
_option
[
imodeb
]
==
3
)
{
fact
=
(
1.
-
_cconst
+
_cconst
*
(
1.
+
_aconst
*
s3
)
/
experimentalOmnes
(
s3
));
}
pre
=
pre
*
fact
;
InvEnergy6
factor
((
pre
*
conj
(
pre
)).
real
());
Energy2
mpi2
(
_mpi
*
_mpi
);
return
factor
*
((
-
mpi2
*
(
-
2
*
mpi2
+
s1
+
s2
)
*
(
-
2
*
mpi2
+
s1
+
s2
)
+
(
mpi2
-
s1
)
*
(
mpi2
-
s2
)
*
s3
)
/
4.
);
}
WidthCalculatorBasePtr
EtaPiPiGammaDecayer
::
threeBodyMEIntegrator
(
const
DecayMode
&
dm
)
const
{
// workout which mode we are doing
int
id
(
dm
.
parent
()
->
id
()),
imode
(
1
);
if
(
id
==
ParticleID
::
eta
){
imode
=
0
;}
// construct the integrator
vector
<
double
>
inweights
(
1
,
1.
);
vector
<
Energy
>
inmass
(
1
,
getParticleData
(
ParticleID
::
rho0
)
->
mass
());
vector
<
Energy
>
inwidth
(
1
,
getParticleData
(
ParticleID
::
rho0
)
->
width
());
vector
<
int
>
intype
(
1
,
1
);
vector
<
double
>
inpow
(
1
,
0.0
);
WidthCalculatorBasePtr
output
(
new_ptr
(
ThreeBodyAllOnCalculator
<
EtaPiPiGammaDecayer
>
(
inweights
,
intype
,
inmass
,
inwidth
,
inpow
,
*
this
,
imode
,
_mpi
,
_mpi
,
ZERO
)));
return
output
;
}
void
EtaPiPiGammaDecayer
::
dataBaseOutput
(
ofstream
&
output
,
bool
header
)
const
{
if
(
header
)
output
<<
"update decayers set parameters=
\"
"
;
// parameters for the DecayIntegrator base class
DecayIntegrator
::
dataBaseOutput
(
output
,
false
);
output
<<
"newdef "
<<
name
()
<<
":fpi "
<<
_fpi
/
MeV
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":RhoMass "
<<
_mrho
/
MeV
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":RhoWidth "
<<
_rhowidth
/
MeV
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":LocalParameters "
<<
_localparameters
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":OmnesC "
<<
_cconst
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":OmnesA "
<<
_aconst
*
GeV2
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":InitializeOmnes "
<<
_initialize
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":OmnesPoints "
<<
_npoints
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":OmnesCut "
<<
_epscut
/
MeV
<<
"
\n
"
;
for
(
unsigned
int
ix
=
0
;
ix
<
2
;
++
ix
)
{
output
<<
"newdef "
<<
name
()
<<
":Incoming "
<<
ix
<<
" "
<<
_incoming
[
ix
]
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":Coupling "
<<
ix
<<
" "
<<
_coupling
[
ix
]
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":MaxWeight "
<<
ix
<<
" "
<<
_maxweight
[
ix
]
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":Option "
<<
ix
<<
" "
<<
_option
[
ix
]
<<
"
\n
"
;
}
for
(
unsigned
int
ix
=
0
;
ix
<
_energy
.
size
();
++
ix
)
{
if
(
ix
<
_nsizea
)
{
output
<<
"newdef "
<<
name
()
<<
":Phase_Energy "
<<
ix
<<
" "
<<
_energy
[
ix
]
/
MeV
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":Phase_Shift "
<<
ix
<<
" "
<<
_phase
[
ix
]
<<
"
\n
"
;
}
else
{
output
<<
"insert "
<<
name
()
<<
":Phase_Energy "
<<
ix
<<
" "
<<
_energy
[
ix
]
/
MeV
<<
"
\n
"
;
output
<<
"insert "
<<
name
()
<<
":Phase_Shift "
<<
ix
<<
" "
<<
_phase
[
ix
]
<<
"
\n
"
;
}
}
for
(
unsigned
int
ix
=
0
;
ix
<
_omnesenergy
.
size
();
++
ix
)
{
if
(
ix
<
_nsizeb
)
{
output
<<
"newdef "
<<
name
()
<<
":OmnesEnergy "
<<
ix
<<
" "
<<
_omnesenergy
[
ix
]
/
MeV
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":OmnesReal "
<<
ix
<<
" "
<<
_omnesfunctionreal
[
ix
]
<<
"
\n
"
;
output
<<
"newdef "
<<
name
()
<<
":OmnesImag "
<<
ix
<<
" "
<<
_omnesfunctionimag
[
ix
]
<<
"
\n
"
;
}
else
{
output
<<
"insert "
<<
name
()
<<
":OmnesEnergy "
<<
ix
<<
" "
<<
_omnesenergy
[
ix
]
/
MeV
<<
"
\n
"
;
output
<<
"insert "
<<
name
()
<<
":OmnesReal "
<<
ix
<<
" "
<<
_omnesfunctionreal
[
ix
]
<<
"
\n
"
;
output
<<
"insert "
<<
name
()
<<
":OmnesImag "
<<
ix
<<
" "
<<
_omnesfunctionimag
[
ix
]
<<
"
\n
"
;
}
}
if
(
header
)
output
<<
"
\n\"
where BINARY ThePEGName=
\"
"
<<
fullName
()
<<
"
\"
;"
<<
endl
;
}
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Wed, May 14, 11:56 AM (1 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5111568
Default Alt Text
EtaPiPiGammaDecayer.cc (24 KB)
Attached To
R563 testingHerwigHG
Event Timeline
Log In to Comment