53{
54
56
57 if ( ndaug == 1 )
58 {
59 p4[0].
set(
mass[0], 0.0, 0.0, 0.0 );
60 return 1.0;
61 }
62
63 if ( ndaug == 2 )
64 {
65
66
67
69
71
73
75 p3 = -1.0 * p3;
77
78
79
82
85
86 return 1.0;
87 }
88
89 if ( ndaug != 2 )
90 {
91
92 double wtmax = 0.0;
93 double pm[5][30], to[4], pmin, pmax, psum, rnd[30];
94 double ran, wt, pa, costh, sinth, phi, p[4][30], be[4], bep, temp;
95 int i, il, ilr, i1, il1u, il1, il2r, ilu;
96 int il2 = 0;
97
98 for ( i = 0; i < ndaug; i++ )
99 {
100 pm[4][i] = 0.0;
101 rnd[i] = 0.0;
102 }
103
105 pm[1][0] = 0.0;
106 pm[2][0] = 0.0;
107 pm[3][0] = 0.0;
109
111 to[1] = 0.0;
112 to[2] = 0.0;
113 to[3] = 0.0;
114
115 psum = 0.0;
116 for ( i = 1; i < ndaug + 1; i++ ) { psum = psum +
mass[i - 1]; }
117
118 pm[4][ndaug - 1] =
mass[ndaug - 1];
119
120 switch ( ndaug )
121 {
122
123 case 1: wtmax = 1.0 / 16.0; break;
124 case 2: wtmax = 1.0 / 150.0; break;
125 case 3: wtmax = 1.0 / 2.0; break;
126 case 4: wtmax = 1.0 / 5.0; break;
127 case 5: wtmax = 1.0 / 15.0; break;
128 case 6: wtmax = 1.0 / 15.0; break;
129 case 7: wtmax = 1.0 / 15.0; break;
130 case 8: wtmax = 1.0 / 15.0; break;
131 case 9: wtmax = 1.0 / 15.0; break;
132 case 10: wtmax = 1.0 / 15.0; break;
133 case 11: wtmax = 1.0 / 15.0; break;
134 case 12: wtmax = 1.0 / 15.0; break;
135 case 13: wtmax = 1.0 / 15.0; break;
136 case 14: wtmax = 1.0 / 15.0; break;
137 case 15: wtmax = 1.0 / 15.0; break;
138 default:
139 report(
ERROR,
"EvtGen" ) <<
"too many daughters for phase space..." << ndaug <<
" "
141 ;
142 break;
143 }
144
145 pmax =
mp - psum +
mass[ndaug - 1];
146
147 pmin = 0.0;
148
149 for ( ilr = 2; ilr < ndaug + 1; ilr++ )
150 {
151 il = ndaug + 1 - ilr;
152 pmax = pmax +
mass[il - 1];
153 pmin = pmin +
mass[il + 1 - 1];
154 wtmax = wtmax *
EvtPawt( pmax, pmin,
mass[il - 1] );
155 }
156
157
158
159 do {
160
161 rnd[0] = 1.0;
162 il1u = ndaug - 1;
163
164 for ( il1 = 2; il1 < il1u + 1; il1++ )
165 {
167 for ( il2r = 2; il2r < il1 + 1; il2r++ )
168 {
169 il2 = il1 + 1 - il2r;
170 if ( ran <= rnd[il2 - 1] ) goto two39;
171 rnd[il2 + 1 - 1] = rnd[il2 - 1];
172 }
173 two39:
174 rnd[il2 + 1 - 1] = ran;
175 }
176
177 rnd[ndaug - 1] = 0.0;
178 wt = 1.0;
179 for ( ilr = 2; ilr < ndaug + 1; ilr++ )
180 {
181 il = ndaug + 1 - ilr;
182 pm[4][il - 1] = pm[4][il + 1 - 1] +
mass[il - 1] +
183 ( rnd[il - 1] - rnd[il + 1 - 1] ) * (
mp - psum );
184 wt = wt *
EvtPawt( pm[4][il - 1], pm[4][il + 1 - 1],
mass[il - 1] );
185 }
186 if ( wt > wtmax )
187 {
189 << "wtmax to small in EvtPhaseSpace with " << ndaug << " daughters" << endl;
190 ;
191 }
193
194 ilu = ndaug - 1;
195
196 for ( il = 1; il < ilu + 1; il++ )
197 {
198 pa =
EvtPawt( pm[4][il - 1], pm[4][il + 1 - 1],
mass[il - 1] );
200 sinth = sqrt( 1.0 - costh * costh );
202 p[1][il - 1] = pa * sinth *
cos( phi );
203 p[2][il - 1] = pa * sinth *
sin( phi );
204 p[3][il - 1] = pa * costh;
205 pm[1][il + 1 - 1] = -p[1][il - 1];
206 pm[2][il + 1 - 1] = -p[2][il - 1];
207 pm[3][il + 1 - 1] = -p[3][il - 1];
208 p[0][il - 1] = sqrt( pa * pa +
mass[il - 1] *
mass[il - 1] );
209 pm[0][il + 1 - 1] = sqrt( pa * pa + pm[4][il + 1 - 1] * pm[4][il + 1 - 1] );
210 }
211
212 p[0][ndaug - 1] = pm[0][ndaug - 1];
213 p[1][ndaug - 1] = pm[1][ndaug - 1];
214 p[2][ndaug - 1] = pm[2][ndaug - 1];
215 p[3][ndaug - 1] = pm[3][ndaug - 1];
216
217 for ( ilr = 2; ilr < ndaug + 1; ilr++ )
218 {
219 il = ndaug + 1 - ilr;
220 be[0] = pm[0][il - 1] / pm[4][il - 1];
221 be[1] = pm[1][il - 1] / pm[4][il - 1];
222 be[2] = pm[2][il - 1] / pm[4][il - 1];
223 be[3] = pm[3][il - 1] / pm[4][il - 1];
224
225 for ( i1 = il; i1 < ndaug + 1; i1++ )
226 {
227 bep = be[1] * p[1][i1 - 1] + be[2] * p[2][i1 - 1] + be[3] * p[3][i1 - 1] +
228 be[0] * p[0][i1 - 1];
229 temp = ( p[0][i1 - 1] + bep ) / ( be[0] + 1.0 );
230 p[1][i1 - 1] = p[1][i1 - 1] + temp * be[1];
231 p[2][i1 - 1] = p[2][i1 - 1] + temp * be[2];
232 p[3][i1 - 1] = p[3][i1 - 1] + temp * be[3];
233 p[0][i1 - 1] = bep;
234 }
235 }
236
237 for ( ilr = 0; ilr < ndaug; ilr++ )
238 { p4[ilr].
set( p[0][ilr], p[1][ilr], p[2][ilr], p[3][ilr] ); }
239
240 return 1.0;
241 }
242
243 return 1.0;
244}
double EvtPawt(double a, double b, double c)
ostream & report(Severity severity, const char *facility)
double sin(const BesAngle a)
double cos(const BesAngle a)
************Class m_ypar INTEGER m_KeyWgt INTEGER m_KeyIHVP INTEGER m_KeyGPS INTEGER m_IsBeamPolarized INTEGER m_EvtGenInterface DOUBLE PRECISION m_Emin DOUBLE PRECISION m_sphot DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_q2 DOUBLE PRECISION m_PolBeam2 DOUBLE PRECISION m_xErrPb *COMMON c_KK2f $ !CMS energy average $ !Spin Polarization vector first beam $ !Spin Polarization vector second beam $ !Beam energy spread[GeV] $ !minimum hadronization energy[GeV] $ !input READ never touch them !$ !debug facility $ !maximum weight $ !inverse alfaQED $ !minimum real photon energy
static const double twoPi
void applyRotateEuler(double alpha, double beta, double gamma)
void set(int i, double d)