89 {
90
91 #ifdef debugFTFannih
92 G4cout <<
"---------------------------- Annihilation----------------" <<
G4endl;
93 #endif
94
95 CommonVariables common;
96
97
98 common.Pprojectile = projectile->Get4Momentum();
99 G4int ProjectilePDGcode = projectile->GetDefinition()->GetPDGEncoding();
100 if ( ProjectilePDGcode > 0 ) {
101 target->SetStatus( 3 );
102 return false;
103 }
104 G4double M0projectile2 = common.Pprojectile.mag2();
105
106
107 G4int TargetPDGcode = target->GetDefinition()->GetPDGEncoding();
108 common.Ptarget = target->Get4Momentum();
109 G4double M0target2 = common.Ptarget.mag2();
110
111 #ifdef debugFTFannih
112 G4cout <<
"PDG codes " << ProjectilePDGcode <<
" " << TargetPDGcode <<
G4endl
113 <<
"Pprojec " << common.Pprojectile <<
" " << common.Pprojectile.mag() <<
G4endl
114 <<
"Ptarget " << common.Ptarget <<
" " << common.Ptarget.mag() <<
G4endl
115 << "M0 proj target " << std::sqrt( M0projectile2 )
116 <<
" " << std::sqrt( M0target2 ) <<
G4endl;
117 #endif
118
119
121 common.S = Psum.
mag2();
122 common.SqrtS = std::sqrt( common.S );
123 #ifdef debugFTFannih
124 G4cout <<
"Psum SqrtS S " << Psum <<
" " << common.SqrtS <<
" " << common.S <<
G4endl;
125 #endif
126
127
130 toCms.rotateZ( -1*Ptmp.phi() );
131 toCms.rotateY( -1*Ptmp.theta() );
132 common.toLab = toCms.inverse();
133
135 common.RotateStrings = true;
137 common.RandomRotation.rotateY( std::acos( 2.0*
G4UniformRand() - 1.0 ) );
139 }
140
141 G4double MesonProdThreshold = projectile->GetDefinition()->GetPDGMass() +
142 target->GetDefinition()->GetPDGMass() +
143 ( 2.0*140.0 + 16.0 )*MeV;
145 - 2.0*( common.S*(M0projectile2 + M0target2) + M0projectile2*M0target2 );
146 Prel2 /= common.S;
147 G4double X_a = 0.0, X_b = 0.0, X_c = 0.0, X_d = 0.0;
148 if ( Prel2 <= 0.0 ) {
149
150 X_a = 625.1;
151 X_b = 0.0;
152 X_c = 49.989;
153 X_d = 6.614;
154 #ifdef debugFTFannih
155 G4cout <<
"Annih at Rest X a b c d " << X_a <<
" " << X_b <<
" " << X_c <<
" " << X_d
157 #endif
158 } else {
159 G4double FlowF = 1.0 / std::sqrt( Prel2 )*GeV;
160
161 X_a = 25.0*FlowF;
162 if ( common.SqrtS < MesonProdThreshold ) {
164 } else {
165 X_b = 6.8*GeV / common.SqrtS;
166 }
167 if ( projectile->GetDefinition()->GetPDGMass() + target->GetDefinition()->GetPDGMass()
168 > common.SqrtS ) {
169 X_b = 0.0;
170 }
171
172 X_c = 2.0 * FlowF *
sqr( projectile->GetDefinition()->GetPDGMass() +
173 target->GetDefinition()->GetPDGMass() ) / common.S;
174
175 X_d = 23.3*GeV*GeV / common.S;
176 #ifdef debugFTFannih
177 G4cout <<
"Annih in Flight X a b c d " << X_a <<
" " << X_b <<
" " << X_c <<
" " << X_d
178 <<
G4endl <<
"SqrtS MesonProdThreshold " << common.SqrtS <<
" " << MesonProdThreshold
180 #endif
181 }
182
184 if ( TargetPDGcode == 2212 || TargetPDGcode == 2214 ) {
185 if ( ProjectilePDGcode == -2212 || ProjectilePDGcode == -2214 ) {
186 X_b *= 5.0; X_c *= 5.0; X_d *= 6.0;
187 } else if ( ProjectilePDGcode == -2112 || ProjectilePDGcode == -2114 ) {
188 X_b *= 4.0; X_c *= 4.0; X_d *= 4.0;
189 } else if ( ProjectilePDGcode == -3122 ) {
190 X_b *= 3.0; X_c *= 3.0; X_d *= 2.0;
191 } else if ( ProjectilePDGcode == -3112 ) {
192 X_b *= 2.0; X_c *= 2.0; X_d *= 0.0;
193 } else if ( ProjectilePDGcode == -3212 ) {
194 X_b *= 3.0; X_c *= 3.0; X_d *= 2.0;
195 } else if ( ProjectilePDGcode == -3222 ) {
196 X_b *= 4.0; X_c *= 4.0; X_d *= 2.0;
197 } else if ( ProjectilePDGcode == -3312 ) {
198 X_b *= 1.0; X_c *= 1.0; X_d *= 0.0;
199 } else if ( ProjectilePDGcode == -3322 ) {
200 X_b *= 2.0; X_c *= 2.0; X_d *= 0.0;
201 } else if ( ProjectilePDGcode == -3334 ) {
202 X_b *= 0.0; X_c *= 0.0; X_d *= 0.0;
203 } else {
204 isUnknown = true;
205 }
206 } else if ( TargetPDGcode == 2112 || TargetPDGcode == 2114 ) {
207 if ( ProjectilePDGcode == -2212 || ProjectilePDGcode == -2214 ) {
208 X_b *= 4.0; X_c *= 4.0; X_d *= 4.0;
209 } else if ( ProjectilePDGcode == -2112 || ProjectilePDGcode == -2114 ) {
210 X_b *= 5.0; X_c *= 5.0; X_d *= 6.0;
211 } else if ( ProjectilePDGcode == -3122 ) {
212 X_b *= 3.0; X_c *= 3.0; X_d *= 2.0;
213 } else if ( ProjectilePDGcode == -3112 ) {
214 X_b *= 4.0; X_c *= 4.0; X_d *= 2.0;
215 } else if ( ProjectilePDGcode == -3212 ) {
216 X_b *= 3.0; X_c *= 3.0; X_d *= 2.0;
217 } else if ( ProjectilePDGcode == -3222 ) {
218 X_b *= 2.0; X_c *= 2.0; X_d *= 0.0;
219 } else if ( ProjectilePDGcode == -3312 ) {
220 X_b *= 2.0; X_c *= 2.0; X_d *= 0.0;
221 } else if ( ProjectilePDGcode == -3322 ) {
222 X_b *= 1.0; X_c *= 1.0; X_d *= 0.0;
223 } else if ( ProjectilePDGcode == -3334 ) {
224 X_b *= 0.0; X_c *= 0.0; X_d *= 0.0;
225 } else {
226 isUnknown = true;
227 }
228 } else {
229 isUnknown = true;
230 }
231 if ( isUnknown ) {
232 G4cout <<
"Unknown anti-baryon for FTF annihilation: PDGcodes - "
233 << ProjectilePDGcode <<
" " << TargetPDGcode <<
G4endl;
234 }
235 #ifdef debugFTFannih
236 G4cout <<
"Annih Actual X a b c d " << X_a <<
" " << X_b <<
" " << X_c <<
" " << X_d <<
G4endl;
237 #endif
238
239 G4double Xannihilation = X_a + X_b + X_c + X_d;
240
241
242 UnpackBaryon( ProjectilePDGcode, common.AQ[0], common.AQ[1], common.AQ[2] );
243
244
245 UnpackBaryon( TargetPDGcode, common.Q[0], common.Q[1], common.Q[2] );
246
248
249 if ( Ksi < X_a / Xannihilation ) {
250 return Create3QuarkAntiQuarkStrings( projectile, target, AdditionalString, theParameters, common );
251 }
252
253 G4int resultCode = 99;
254 if ( Ksi < (X_a + X_b) / Xannihilation ) {
255 resultCode = Create1DiquarkAntiDiquarkString( projectile, target, common );
256 if ( resultCode == 0 ) {
257 return true;
258 } else if ( resultCode == 99 ) {
259 return false;
260 }
261 }
262
263 if ( Ksi < ( X_a + X_b + X_c ) / Xannihilation ) {
264 resultCode = Create2QuarkAntiQuarkStrings( projectile, target, theParameters, common );
265 if ( resultCode == 0 ) {
266 return true;
267 } else if ( resultCode == 99 ) {
268 return false;
269 }
270 }
271
272 if ( Ksi < ( X_a + X_b + X_c + X_d ) / Xannihilation ) {
273 return Create1QuarkAntiQuarkString( projectile, target, theParameters, common );
274 }
275
276 return true;
277}
G4GLOB_DLL std::ostream G4cout
Hep3Vector boostVector() const
static G4Pow * GetInstance()
G4double powA(G4double A, G4double y) const