1 // BeamShape.cc is a part of the PYTHIA event generator.
2 // Copyright (C) 2008 Torbjorn Sjostrand.
3 // PYTHIA is licenced under the GNU GPL version 2, see COPYING for details.
4 // Please respect the MCnet Guidelines, see GUIDELINES for details.
6 // Function definitions (not found in the header) for the BeamShape class.
12 //**************************************************************************
14 // The BeamShape class.
18 // Initialize beam parameters.
20 void BeamShape::init() {
23 allowMomentumSpread = Settings::flag("Beams:allowMomentumSpread");
24 allowVertexSpread = Settings::flag("Beams:allowVertexSpread");
26 // Parameters for beam A momentum spread.
27 sigmaPxA = Settings::parm("Beams:sigmaPxA");
28 sigmaPyA = Settings::parm("Beams:sigmaPyA");
29 sigmaPzA = Settings::parm("Beams:sigmaPzA");
30 maxDevA = Settings::parm("Beams:maxDevA");
32 // Parameters for beam B momentum spread.
33 sigmaPxB = Settings::parm("Beams:sigmaPxB");
34 sigmaPyB = Settings::parm("Beams:sigmaPyB");
35 sigmaPzB = Settings::parm("Beams:sigmaPzB");
36 maxDevB = Settings::parm("Beams:maxDevB");
38 // Parameters for beam vertex spread.
39 sigmaVertexX = Settings::parm("Beams:sigmaVertexX");
40 sigmaVertexY = Settings::parm("Beams:sigmaVertexY");
41 sigmaVertexZ = Settings::parm("Beams:sigmaVertexZ");
42 maxDevVertex = Settings::parm("Beams:maxDevVertex");
43 sigmaTime = Settings::parm("Beams:sigmaTime");
44 maxDevTime = Settings::parm("Beams:maxDevTime");
46 // Parameters for beam vertex offset.
47 offsetX = Settings::parm("Beams:offsetVertexX");
48 offsetY = Settings::parm("Beams:offsetVertexY");
49 offsetZ = Settings::parm("Beams:offsetVertexZ");
50 offsetT = Settings::parm("Beams:offsetTime");
56 // Set the two beam momentum deviations and the beam vertex.
58 void BeamShape::pick() {
61 deltaPxA = deltaPyA = deltaPzA = deltaPxB = deltaPyB = deltaPzB
62 = vertexX = vertexY = vertexZ = vertexT = 0.;
64 // Set beam A momentum deviation by a three-dimensional Gaussian.
65 if (allowMomentumSpread) {
66 double totalDev, gauss;
70 gauss = Rndm::gauss();
71 deltaPxA = sigmaPxA * gauss;
72 totalDev += gauss * gauss;
75 gauss = Rndm::gauss();
76 deltaPyA = sigmaPyA * gauss;
77 totalDev += gauss * gauss;
80 gauss = Rndm::gauss();
81 deltaPzA = sigmaPzA * gauss;
82 totalDev += gauss * gauss;
84 } while (totalDev > maxDevA * maxDevA);
86 // Set beam B momentum deviation by a three-dimensional Gaussian.
90 gauss = Rndm::gauss();
91 deltaPxB = sigmaPxB * gauss;
92 totalDev += gauss * gauss;
95 gauss = Rndm::gauss();
96 deltaPyB = sigmaPyB * gauss;
97 totalDev += gauss * gauss;
100 gauss = Rndm::gauss();
101 deltaPzB = sigmaPzB * gauss;
102 totalDev += gauss * gauss;
104 } while (totalDev > maxDevB * maxDevB);
107 // Set beam vertex location by a three-dimensional Gaussian.
108 if (allowVertexSpread) {
109 double totalDev, gauss;
112 if (sigmaVertexX > 0.) {
113 gauss = Rndm::gauss();
114 vertexX = sigmaVertexX * gauss;
115 totalDev += gauss * gauss;
117 if (sigmaVertexY > 0.) {
118 gauss = Rndm::gauss();
119 vertexY = sigmaVertexY * gauss;
120 totalDev += gauss * gauss;
122 if (sigmaVertexZ > 0.) {
123 gauss = Rndm::gauss();
124 vertexZ = sigmaVertexZ * gauss;
125 totalDev += gauss * gauss;
127 } while (totalDev > maxDevVertex * maxDevVertex);
129 // Set beam collision time by a Gaussian.
130 if (sigmaTime > 0.) {
131 do gauss = Rndm::gauss();
132 while (abs(gauss) > maxDevTime);
133 vertexT = sigmaTime * gauss;
136 // Add offset to beam vertex.
145 //**************************************************************************
147 } // end namespace Pythia8