Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4QFreeScattering.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// $Id$
28//
29//
30// G4 Physics class: G4QFreeScattering for quasi-free scattering
31// Created: M.V. Kossov, CERN/ITEP(Moscow), 26-OCT-11
32// The last update: M.V. Kossov, CERN/ITEP (Moscow) 29-Oct-11
33//
34// ----------------------------------------------------------------------
35// Short description: Provides quasi-free scattering on nuclear nucleons.
36// ----------------------------------------------------------------------
37
38//#define debug
39//#define pdebug
40//#define ppdebug
41//#define nandebug
42
43#include "G4QFreeScattering.hh"
44#include "G4SystemOfUnits.hh"
45
46// initialisation of statics
47std::vector<std::pair<G4double,G4double>*> G4QFreeScattering::vX; // ETPointers to LogTable
48
50{
51#ifdef pdebug
52 G4cout<<"***^^^*** G4QFreeScattering singletone is created ***^^^***"<<G4endl;
53#endif
54}
55
57{
58 std::vector<std::pair<G4double,G4double>*>::iterator pos2;
59 for(pos2=vX.begin(); pos2<vX.end(); pos2++) delete [] * pos2;
60 vX.clear();
61}
62
63// Returns Pointer to the G4VQCrossSection class
65{
66 static G4QFreeScattering theQFS; // *** Static body of the Quasi-Free Scattering ***
67 return &theQFS;
68}
69
70// Calculatio pair(hN_el,hN_tot) (mb): p in GeV/c, index(PDG,F) (see FetchElTot)
71std::pair<G4double,G4double> G4QFreeScattering::CalcElTot(G4double p, G4int I)
72{
73 // ---------> Each parameter set can have not more than nPoints=128 parameters
74 static const G4double lmi=3.5; // min of (lnP-lmi)^2 parabola
75 static const G4double pbe=.0557; // elastic (lnP-lmi)^2 parabola coefficient
76 static const G4double pbt=.3; // total (lnP-lmi)^2 parabola coefficient
77 static const G4double pmi=.1; // Below that fast LE calculation is made
78 static const G4double pma=1000.; // Above that fast HE calculation is made
79 G4double El=0.; // prototype of the elastic hN cross-section
80 G4double To=0.; // prototype of the total hN cross-section
81 if(p<=0.)
82 {
83 //G4cout<<"-Warning-G4QFreeScattering::CalcElTot: p="<<p<<" is 0 or negative"<<G4endl;
84 return std::make_pair(El,To);
85 }
86 if (!I) // pp/nn
87 {
88#ifdef debug
89 G4cout<<"G4QFreeScatter::CalcElTot:I=0, p="<<p<<", pmi="<<pmi<<", pma="<<pma<<G4endl;
90#endif
91 if(p<pmi)
92 {
93 G4double p2=p*p;
94 El=1./(.00012+p2*.2);
95 To=El;
96#ifdef debug
97 G4cout<<"G4QFreeScatter::CalcElTot:I=0i, El="<<El<<", To="<<To<<", p2="<<p2<<G4endl;
98#endif
99 }
100 else if(p>pma)
101 {
102 G4double lp=std::log(p)-lmi;
103 G4double lp2=lp*lp;
104 El=pbe*lp2+6.72;
105 To=pbt*lp2+38.2;
106#ifdef debug
107 G4cout<<"G4QFreeScat::CalcElTot:I=0a, El="<<El<<", To="<<To<<", lp2="<<lp2<<G4endl;
108#endif
109 }
110 else
111 {
112 G4double p2=p*p;
113 G4double LE=1./(.00012+p2*.2);
114 G4double lp=std::log(p)-lmi;
115 G4double lp2=lp*lp;
116 G4double rp2=1./p2;
117 El=LE+(pbe*lp2+6.72+32.6/p)/(1.+rp2/p);
118 To=LE+(pbt*lp2+38.2+52.7*rp2)/(1.+2.72*rp2*rp2);
119#ifdef debug
120 G4cout<<"G4QFreeScat::CalcElTot:0,E="<<El<<",T="<<To<<",s="<<p2<<",l="<<lp2<<G4endl;
121#endif
122 }
123 }
124 else if(I==1) // np/pn
125 {
126 if(p<pmi)
127 {
128 G4double p2=p*p;
129 El=1./(.00012+p2*(.051+.1*p2));
130 To=El;
131 }
132 else if(p>pma)
133 {
134 G4double lp=std::log(p)-lmi;
135 G4double lp2=lp*lp;
136 El=pbe*lp2+6.72;
137 To=pbt*lp2+38.2;
138 }
139 else
140 {
141 G4double p2=p*p;
142 G4double LE=1./(.00012+p2*(.051+.1*p2));
143 G4double lp=std::log(p)-lmi;
144 G4double lp2=lp*lp;
145 G4double rp2=1./p2;
146 El=LE+(pbe*lp2+6.72+30./p)/(1.+.49*rp2/p);
147 To=LE+(pbt*lp2+38.2)/(1.+.54*rp2*rp2);
148 }
149 }
150 else if(I==2) // pimp/pipn
151 {
152 G4double lp=std::log(p);
153 if(p<pmi)
154 {
155 G4double lr=lp+1.27;
156 El=1.53/(lr*lr+.0676);
157 To=El*3;
158 }
159 else if(p>pma)
160 {
161 G4double ld=lp-lmi;
162 G4double ld2=ld*ld;
163 G4double sp=std::sqrt(p);
164 El=pbe*ld2+2.4+7./sp;
165 To=pbt*ld2+22.3+12./sp;
166 }
167 else
168 {
169 G4double lr=lp+1.27; // p1
170 G4double LE=1.53/(lr*lr+.0676); // p2, p3
171 G4double ld=lp-lmi; // p4 (lmi=3.5)
172 G4double ld2=ld*ld;
173 G4double p2=p*p;
174 G4double p4=p2*p2;
175 G4double sp=std::sqrt(p);
176 G4double lm=lp+.36; // p5
177 G4double md=lm*lm+.04; // p6
178 G4double lh=lp-.017; // p7
179 G4double hd=lh*lh+.0025; // p8
180 El=LE+(pbe*ld2+2.4+7./sp)/(1.+.7/p4)+.6/md+.05/hd;//p9(pbe=.0557),p10,p11,p12,p13,p14
181 To=LE*3+(pbt*ld2+22.3+12./sp)/(1.+.4/p4)+1./md+.06/hd;
182 }
183 }
184 else if(I==3) // pipp/pimn
185 {
186 G4double lp=std::log(p);
187 if(p<pmi)
188 {
189 G4double lr=lp+1.27;
190 G4double lr2=lr*lr;
191 El=13./(lr2+lr2*lr2+.0676);
192 To=El;
193 }
194 else if(p>pma)
195 {
196 G4double ld=lp-lmi;
197 G4double ld2=ld*ld;
198 G4double sp=std::sqrt(p);
199 El=pbe*ld2+2.4+6./sp;
200 To=pbt*ld2+22.3+5./sp;
201 }
202 else
203 {
204 G4double lr=lp+1.27; // p1
205 G4double lr2=lr*lr;
206 G4double LE=13./(lr2+lr2*lr2+.0676); // p2, p3
207 G4double ld=lp-lmi; // p4 (lmi=3.5)
208 G4double ld2=ld*ld;
209 G4double p2=p*p;
210 G4double p4=p2*p2;
211 G4double sp=std::sqrt(p);
212 G4double lm=lp-.32; // p5
213 G4double md=lm*lm+.0576; // p6
214 El=LE+(pbe*ld2+2.4+6./sp)/(1.+3./p4)+.7/md; // p7(pbe=.0557), p8, p9, p10, p11
215 To=LE+(pbt*ld2+22.3+5./sp)/(1.+1./p4)+.8/md;
216 }
217 }
218 else if(I==4) // Kmp/Kmn/K0p/K0n
219 {
220
221 if(p<pmi)
222 {
223 G4double psp=p*std::sqrt(p);
224 El=5.2/psp;
225 To=14./psp;
226 }
227 else if(p>pma)
228 {
229 G4double ld=std::log(p)-lmi;
230 G4double ld2=ld*ld;
231 El=pbe*ld2+2.23;
232 To=pbt*ld2+19.5;
233 }
234 else
235 {
236 G4double ld=std::log(p)-lmi;
237 G4double ld2=ld*ld;
238 G4double sp=std::sqrt(p);
239 G4double psp=p*sp;
240 G4double p2=p*p;
241 G4double p4=p2*p2;
242 G4double lm=p-.39;
243 G4double md=lm*lm+.000156;
244 G4double lh=p-1.;
245 G4double hd=lh*lh+.0156;
246 El=5.2/psp+(pbe*ld2+2.23)/(1.-.7/sp+.075/p4)+.004/md+.15/hd;
247 To=14./psp+(pbt*ld2+19.5)/(1.-.21/sp+.52/p4)+.006/md+.30/hd;
248 }
249 }
250 else if(I==5) // Kpp/Kpn/aKp/aKn
251 {
252 if(p<pmi)
253 {
254 G4double lr=p-.38;
255 G4double lm=p-1.;
256 G4double md=lm*lm+.372;
257 El=.7/(lr*lr+.0676)+2./md;
258 To=El+.6/md;
259 }
260 else if(p>pma)
261 {
262 G4double ld=std::log(p)-lmi;
263 G4double ld2=ld*ld;
264 El=pbe*ld2+2.23;
265 To=pbt*ld2+19.5;
266 }
267 else
268 {
269 G4double ld=std::log(p)-lmi;
270 G4double ld2=ld*ld;
271 G4double lr=p-.38;
272 G4double LE=.7/(lr*lr+.0676);
273 G4double sp=std::sqrt(p);
274 G4double p2=p*p;
275 G4double p4=p2*p2;
276 G4double lm=p-1.;
277 G4double md=lm*lm+.372;
278 El=LE+(pbe*ld2+2.23)/(1.-.7/sp+.1/p4)+2./md;
279 To=LE+(pbt*ld2+19.5)/(1.+.46/sp+1.6/p4)+2.6/md;
280 }
281 }
282 else if(I==6) // hyperon-N
283 {
284 if(p<pmi)
285 {
286 G4double p2=p*p;
287 El=1./(.002+p2*(.12+p2));
288 To=El;
289 }
290 else if(p>pma)
291 {
292 G4double lp=std::log(p)-lmi;
293 G4double lp2=lp*lp;
294 G4double sp=std::sqrt(p);
295 El=(pbe*lp2+6.72)/(1.+2./sp);
296 To=(pbt*lp2+38.2+900./sp)/(1.+27./sp);
297 }
298 else
299 {
300 G4double p2=p*p;
301 G4double LE=1./(.002+p2*(.12+p2));
302 G4double lp=std::log(p)-lmi;
303 G4double lp2=lp*lp;
304 G4double p4=p2*p2;
305 G4double sp=std::sqrt(p);
306 El=LE+(pbe*lp2+6.72+99./p2)/(1.+2./sp+2./p4);
307 To=LE+(pbt*lp2+38.2+900./sp)/(1.+27./sp+3./p4);
308 }
309 }
310 else if(I==7) // antibaryon-N
311 {
312 if(p>pma)
313 {
314 G4double lp=std::log(p)-lmi;
315 G4double lp2=lp*lp;
316 El=pbe*lp2+6.72;
317 To=pbt*lp2+38.2;
318 }
319 else
320 {
321 G4double ye=std::pow(p,1.25);
322 G4double yt=std::pow(p,.35);
323 G4double lp=std::log(p)-lmi;
324 G4double lp2=lp*lp;
325 El=80./(ye+1.)+pbe*lp2+6.72;
326 To=(80./yt+.3)/yt+pbt*lp2+38.2;
327 }
328 }
329 else
330 {
331 G4cout<<"*Error*G4QFreeScattering::CalcElTot:ind="<<I<<" is not defined (0-7)"<<G4endl;
332 G4Exception("G4QFreeScattering::CalcElTot:","23",FatalException,"CHIPScrash");
333 }
334 if(El>To) El=To;
335 return std::make_pair(El,To);
336} // End of CalcElTot
337
338// For hadron PDG with momentum Mom (GeV/c) on N (p/n) calculate <sig_el,sig_tot> pair (mb)
339// *** Only for external use. For simulation it is better to use GetElTot(...) [AMDB] ***
340std::pair<G4double,G4double> G4QFreeScattering::GetElTotXS(G4double p, G4int PDG, G4bool F)
341{
342 G4int ind=0; // Prototype of the reaction index
343 G4bool kfl=true; // Flag of K0/aK0 oscillation
344 G4bool kf=false;
345 if(PDG==90001000) PDG=2212;
346 if(PDG==90000001) PDG=2112;
347 if(PDG==91000000) PDG=3122;
348 if(PDG==130 || PDG==310)
349 {
350 kf=true;
351 if(G4UniformRand()>.5) kfl=false;
352 }
353 if ( (PDG == 2212 && F) || (PDG == 2112 && !F) ) ind=0; // pp/nn
354 else if ( (PDG == 2112 && F) || (PDG == 2212 && !F) ) ind=1; // np/pn
355 else if ( (PDG == -211 && F) || (PDG == 211 && !F) ) ind=2; // pimp/pipn
356 else if ( (PDG == 211 && F) || (PDG == -211 && !F) ) ind=3; // pipp/pimn
357 else if ( PDG == -321 || PDG == -311 || (kf && !kfl) ) ind=4; // KmN/K0N
358 else if ( PDG == 321 || PDG == 311 || (kf && kfl) ) ind=5; // KpN/aK0N
359 else if ( PDG > 3000 && PDG < 3335) ind=6; // @@ for all hyperons - take Lambda
360 else if ( PDG > -3335 && PDG < -2000) ind=7; // @@ for all anti-baryons (anti-p/anti-n)
361 else {
362 // VI changed Fatal to Warning, because this method cannot do better
363 // source of problem in classes which make this call
364 ind = 0;
365 G4cout<<"*Error*G4QFreeScattering::CalcElTotXS: PDG="<<PDG
366 <<", while it is defined only for p,n,hyperons,anti-baryons,pi,K/antiK"<<G4endl;
367 G4Exception("G4QFreeScattering::CalcElTotXS:","22",JustWarning,"CHIPS_crash");
368 }
369 return CalcElTot(p,ind); // This is a slow direct method, better use FetchElTot
370}
371
372// Calculatio pair(hN_el,hN_tot)(mb): p in GeV/c, F=true -> N=proton, F=false -> N=neutron
373std::pair<G4double,G4double> G4QFreeScattering::FetchElTot(G4double p, G4int PDG, G4bool F)
374{
375 static const G4int nlp=300; // Number of steps in the S(lnp) logTable(5% step)
376 static const G4int mlp=nlp+1; // Number of elements in the S(lnp) logTable
377 static const G4double lpi=-5.; // The min ln(p) logTabEl(p=6.7 MeV/c - 22. TeV/c)
378 static const G4double lpa=10.; // The max ln(p) logTabEl(p=6.7 MeV/c - 22. TeV/c)
379 static const G4double mi=std::exp(lpi);// The min p of logTabEl(~ 6.7 MeV/c)
380 static const G4double ma=std::exp(lpa);// The max p of logTabEl(~ 22. TeV)
381 static const G4double dl=(lpa-lpi)/nlp;// Step of the logarithmic Table
382 static const G4double edl=std::exp(dl);// Multiplication step of the logarithmic Table
383 //static const G4double toler=.001; // Relative Tolarence defining "theSameMomentum"
384 static G4double lastP=0.; // The last momentum for which XS was calculated
385 static G4int lastH=0; // The last projPDG for which XS was calculated
386 static G4bool lastF=true; // The last nucleon for which XS was calculated
387 static std::pair<G4double,G4double> lastR(0.,0.); // The last result
388 // Local Associative Data Base:
389 static std::vector<G4int> vI; // Vector of index for which XS was calculated
390 static std::vector<G4double> vM; // Vector of rel max ln(p) initialized in LogTable
391 static std::vector<G4int> vK; // Vector of topBin number initialized in LogTable
392 // Last values of the Associative Data Base:
393 static G4int lastI=0; // The Last index for which XS was calculated
394 static G4double lastM=0.; // The Last rel max ln(p) initialized in LogTable
395 static G4int lastK=0; // The Last topBin number initialized in LogTable
396 static std::pair<G4double,G4double>* lastX=0; // The Last ETPointers to LogTable in heap
397 // LogTable is created only if necessary. The ratio R(s>8100 mb) = 0 for any nuclei
398 G4int nDB=vI.size(); // A number of hadrons already initialized in AMDB
399 if(PDG==90001000) PDG=2212;
400 if(PDG==90000001) PDG=2112;
401 if(PDG==91000000) PDG=3122;
402#ifdef pdebug
403 G4cout<<"G4QFreeScatter::FetchElTot:p="<<p<<",PDG="<<PDG<<",F="<<F<<",nDB="<<nDB<<G4endl;
404#endif
405 if(nDB && lastH==PDG && lastF==F && p>0. && p==lastP) return lastR;// VI don't use toler.
406 // if(nDB && lastH==PDG && lastF==F && p>0. && std::fabs(p-lastP)/p<toler) return lastR;
407 lastH=PDG;
408 lastF=F;
409 G4int ind=-1; // Prototipe of the index of the PDG/F combination
410 // i=0: pp(nn), i=1: np(pn), i=2: pimp(pipn), i=3: pipp(pimn), i=4: Kmp(Kmn,K0n,K0p),
411 // i=5: Kpp(Kpn,aK0n,aK0p), i=6: Hp(Hn), i=7: app(apn,ann,anp)
412 G4bool kfl=true; // Flag of K0/aK0 oscillation
413 G4bool kf=false;
414 if(PDG==130 || PDG==310)
415 {
416 kf=true;
417 if(G4UniformRand()>.5) kfl=false;
418 }
419 if ( (PDG == 2212 && F) || (PDG == 2112 && !F) ) ind=0; // pp/nn
420 else if ( (PDG == 2112 && F) || (PDG == 2212 && !F) ) ind=1; // np/pn
421 else if ( (PDG == -211 && F) || (PDG == 211 && !F) ) ind=2; // pimp/pipn
422 else if ( (PDG == 211 && F) || (PDG == -211 && !F) ) ind=3; // pipp/pimn
423 else if ( PDG == -321 || PDG == -311 || (kf && !kfl) ) ind=4; // KmN/K0N
424 else if ( PDG == 321 || PDG == 311 || (kf && kfl) ) ind=5; // KpN/aK0N
425 else if ( PDG > 3000 && PDG < 3335) ind=6; // @@ for all hyperons - take Lambda
426 else if ( PDG > -3335 && PDG < -2000) ind=7; // @@ for all anti-baryons (anti-p/anti-n)
427 else
428 {
429 // VI changed Fatal to Warning, because this method cannot do better
430 // source of problem in classes which make this call
431 ind = 0;
432 G4cout<<"*Error*G4QFreeScattering::FetchElTot: PDG="<<PDG
433 <<", while it is defined only for p,n,hyperons,anti-baryons,pi,K/antiK"<<G4endl;
434 G4Exception("G4QFreeScattering::FetchElTot:","22",JustWarning,"CHIPS problem");
435 }
436 if(nDB && lastI==ind && p>0. && p==lastP) return lastR; // VI do not use toler
437 // if(nDB && lastI==ind && p>0. && std::fabs(p-lastP)/p<toler) return lastR;
438 if(p<=mi || p>=ma) return CalcElTot(p,ind); // @@ Slow calculation ! (Warning?)
439 G4bool found=false;
440 G4int i=-1;
441 if(nDB) for (i=0; i<nDB; ++i) if(ind==vI[i]) // Sirch for this index in AMDB
442 {
443 found=true; // The index is found
444 break;
445 }
446 G4double lp=std::log(p);
447#ifdef pdebug
448 G4cout<<"G4QFreeScat::FetchElTot: I="<<ind<<", i="<<i<<",fd="<<found<<",lp="<<lp<<G4endl;
449#endif
450 if(!nDB || !found) // Create new line in the AMDB
451 {
452#ifdef pdebug
453 G4cout<<"G4QFreeScattering::FetchElTot: NewX, ind="<<ind<<", nDB="<<nDB<<G4endl;
454#endif
455 lastX = new std::pair<G4double,G4double>[mlp]; // Create logarithmic Table for ElTot
456 lastI = ind; // Remember the initialized inex
457 lastK = static_cast<int>((lp-lpi)/dl)+1; // MaxBin to be initialized in LogTaB
458 if(lastK>nlp)
459 {
460 lastK=nlp;
461 lastM=lpa-lpi;
462 }
463 else lastM = lastK*dl; // Calculate max initialized ln(p)-lpi for LogTab
464 G4double pv=mi;
465 for(G4int j=0; j<=lastK; ++j) // Calculate LogTab values
466 {
467 lastX[j]=CalcElTot(pv,ind);
468#ifdef pdebug
469 G4cout<<"G4QFreeScat::FetchElTot:I,j="<<j<<",pv="<<pv<<",E="<<lastX[j].first<<",T="
470 <<lastX[j].second<<G4endl;
471#endif
472 if(j!=lastK) pv*=edl;
473 }
474 i++; // Make a new record to AMDB and position on it
475 vI.push_back(lastI);
476 vM.push_back(lastM);
477 vK.push_back(lastK);
478 vX.push_back(lastX);
479 }
480 else // The A value was found in AMDB
481 {
482 lastI=vI[i];
483 lastM=vM[i];
484 lastK=vK[i];
485 lastX=vX[i];
486 G4int nextK=lastK+1;
487 G4double lpM=lastM+lpi;
488#ifdef pdebug
489 G4cout<<"G4QFreeScatt::FetchElTo:M="<<lpM<<",l="<<lp<<",K="<<lastK<<",n="<<nlp<<G4endl;
490#endif
491 if(lp>lpM && lastK<nlp) // LogTab must be updated
492 {
493 lastK = static_cast<int>((lp-lpi)/dl)+1; // MaxBin to be initialized in LogTab
494#ifdef pdebug
495 G4cout<<"G4QFreeScat::FetET: K="<<lastK<<",lp="<<lp<<",li="<<lpi<<",dl="<<dl<<G4endl;
496#endif
497 if(lastK>nlp)
498 {
499 lastK=nlp;
500 lastM=lpa-lpi;
501 }
502 else lastM = lastK*dl; // Calculate max initialized ln(p)-lpi for LogTab
503 G4double pv=std::exp(lpM); // momentum of the last calculated beam
504 for(G4int j=nextK; j<=lastK; ++j) // Calculate LogTab values
505 {
506 pv*=edl;
507 lastX[j]=CalcElTot(pv,ind);
508#ifdef pdebug
509 G4cout<<"G4QFreeScat::FetchElTot: U:j="<<j<<",p="<<pv<<",E="<<lastX[j].first<<",T="
510 <<lastX[j].second<<G4endl;
511#endif
512 }
513 } // End of LogTab update
514 if(lastK >= nextK) // The AMDB was apdated
515 {
516 vM[i]=lastM;
517 vK[i]=lastK;
518 }
519 }
520 // Now one can use tabeles to calculate the value
521 G4double dlp=lp-lpi; // Shifted log(p) value
522 G4int n=static_cast<int>(dlp/dl); // Low edge number of the bin
523 G4double d=dlp-n*dl; // Log shift
524 G4double e=lastX[n].first; // E-Base
525 lastR.first=e+d*(lastX[n+1].first-e)/dl; // E-Result
526 if(lastR.first<0.) lastR.first = 0.;
527 G4double t=lastX[n].second; // T-Base
528 lastR.second=t+d*(lastX[n+1].second-t)/dl; // T-Result
529 if(lastR.second<0.) lastR.second= 0.;
530#ifdef pdebug
531 G4cout<<"=O=>G4QFreeScat::FetchElTot:1st="<<lastR.first<<", 2nd="<<lastR.second<<G4endl;
532#endif
533 if(lastR.first>lastR.second) lastR.first = lastR.second;
534 return lastR;
535} // End of FetchElTot
536
537// (Mean Elastic and Mean Total over (Z,N)) Cross-Sections (mb) for PDG+(Z,N) at P=p[GeV/c]
538std::pair<G4double,G4double> G4QFreeScattering::GetElTotMean(G4double pIU, G4int hPDG,
539 G4int Z, G4int N)
540{
541 G4double pGeV=pIU/gigaelectronvolt;
542 if(hPDG==90001000) hPDG=2212;
543 if(hPDG==90000001) hPDG=2112;
544 if(hPDG==91000000) hPDG=3122;
545#ifdef pdebug
546 G4cout<<"->G4QFreeSc::GetElTotMean: P="<<pIU<<",pPDG="<<hPDG<<",Z="<<Z<<",N="<<N<<G4endl;
547#endif
548 if(Z<1 && N<1)
549 {
550 G4cout<<"-Warning-G4QFreeScat::GetElTotMean: Z="<<Z<<",N="<<N<<", return zero"<<G4endl;
551 return std::make_pair(0.,0.);
552 }
553 std::pair<G4double,G4double> hp=FetchElTot(pGeV, hPDG, true);
554 std::pair<G4double,G4double> hn=FetchElTot(pGeV, hPDG, false);
555#ifdef pdebug
556 G4cout<<"-OUT->G4QFreeScat::GetElTotMean: hp("<<hp.first<<","<<hp.second<<"), hn("
557 <<hn.first<<","<<hn.second<<")"<<G4endl;
558#endif
559 G4double A=(Z+N)/millibarn; // To make the result in independent units(IU)
560 return std::make_pair((Z*hp.first+N*hn.first)/A,(Z*hp.second+N*hn.second)/A);
561} // End of GetElTotMean
562
563// scatter (pPDG,p4M) on a virtual nucleon (NPDG,N4M), result: final pair(newN4M,newp4M)
564// if(newN4M.e()==0.) - below threshold, XS=0, no scattering of the progectile happened
565std::pair<G4LorentzVector,G4LorentzVector> G4QFreeScattering::Scatter(G4int NPDG,
567{
568 static const G4double mNeut= G4QPDGCode(2112).GetMass();
569 static const G4double mProt= G4QPDGCode(2212).GetMass();
570 p4M/=megaelectronvolt; // Convert 4-momenta in MeV (CHIPS units)
571 N4M/=megaelectronvolt;
572 G4LorentzVector tot4M=N4M+p4M;
573 if(pPDG==90001000) pPDG=2212;
574 if(pPDG==90000001) pPDG=2112;
575 if(pPDG==91000000) pPDG=3122;
576#ifdef ppdebug
577 G4cout<<"->G4QFR::Scat:p4M="<<p4M<<",N4M="<<N4M<<",t4M="<<tot4M<<",NPDG="<<NPDG<<G4endl;
578#endif
579 G4double mT=mNeut;
580#ifdef ppdebug
581 G4int Z=0;
582 G4int N=1;
583#endif
584 if(NPDG==2212 || NPDG==90001000)
585 {
586 mT=mProt;
587#ifdef ppdebug
588 Z=1;
589 N=0;
590#endif
591 }
592 else if(NPDG!=2112 && NPDG!=90000001)
593 {
594 G4cout<<"Error:G4QFreeScattering::Scatter:NPDG="<<NPDG<<" is not 2212 or 2112"<<G4endl;
595 G4Exception("G4QFreeScattering::Scatter:","21",FatalException,"CHIPScomplain");
596 //return std::make_pair(G4LorentzVector(0.,0.,0.,0.),p4M); // Use this if not exception
597 }
598 G4double mT2=mT*mT; // a squared mass of the free scattered nuclead cluster (FSNC)
599 G4double mP2=p4M.m2(); // a projectile squared mass
600 G4double E=(tot4M.m2()-mT2-mP2)/(mT+mT); // a projectile energy in the CMS of FSNC
601#ifdef pdebug
602 G4cout<<"G4QFS::Scat:qM="<<mT<<",qM2="<<mT2<<",pM2="<<mP2<<",totM2="<<tot4M.m2()<<G4endl;
603#endif
604 G4double E2=E*E;
605 if( E < 0. || E2 < mP2)
606 {
607#ifdef ppdebug
608 G4cout<<"-Warning-G4QFS::Scat:*Negative Energy*E="<<E<<",E2="<<E2<<"<M2="<<mP2<<G4endl;
609#endif
610 return std::make_pair(G4LorentzVector(0.,0.,0.,0.),p4M); // Do Nothing Action
611 }
612 G4double pP2=E2-mP2; // Squared Momentum in pseudo laboratory system (final particles)
613 G4double P=std::sqrt(pP2); // Momentum in pseudo laboratory system (final particles) ?
614#ifdef ppdebug
615 G4cout<<"G4QFreeS::Scatter: Before XS, P="<<P<<",Z="<<Z<<",N="<<N<<",PDG="<<pPDG<<G4endl;
616#endif
617 // @@ Temporary NN t-dependence for all hadrons
618 if(pPDG>3400 || pPDG<-3400) G4cout<<"-Warning-G4QFreeScat::Scatter: pPDG="<<pPDG<<G4endl;
619 // @@ check a possibility to separate p, n, or alpha (!)
620 G4double dmT=mT+mT;
621 G4double s_value=dmT*E2+mP2+mT2; // Mondelstam s (?)
622 G4double maxt=dmT*dmT*pP2/s_value; // max possible |t|
623 G4double mint=0.; // Prototype of functional rand -t (MeV^2)
624 if(P < 14.) mint=maxt*G4UniformRand(); // S-wave
625 else // Calculate slopes (no cash !)
626 {
627 G4double p4=pP2*pP2/1000000.; // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
628 G4double theB1=(7.2+4.32/p4/(p4+12./P))/(1.+2.5/p4); // p4 in GeV, P in MeV
629 mint=-std::log(G4UniformRand())/theB1; // t-chan only
630 }
631#ifdef ppdebug
632 G4cout<<"G4QFS::Scat:PDG="<<pPDG<<",P="<<P<<",-t="<<mint<<"<"<<maxt<<", Z="<<Z<<",N="<<N
633 <<G4endl;
634#endif
635#ifdef nandebug
636 if(mint>-.0000001);
637 else G4cout<<"*Warning*G4QFreeScattering::Scatter: -t="<<mint<<G4endl;
638#endif
639 G4double cost=1.-(mint+mint)/maxt; // cos(theta) in CMS
640#ifdef ppdebug
641 G4cout<<"G4QFS::Scat:-t="<<mint<<"<"<<maxt<<", cost="<<cost<<", Z="<<Z<<",N="<<N<<G4endl;
642#endif
643 if(cost>1. || cost<-1. || !(cost>-1. || cost<=1.))
644 {
645 if (cost > 1.) cost = 1.;
646 else if(cost <-1.) cost =-1.;
647 else
648 {
649 G4cerr<<"G4QFreeScatter::Scat:*NAN* cost="<<cost<<",-t="<<mint<<",tm="<<maxt<<G4endl;
650 return std::make_pair(G4LorentzVector(0.,0.,0.,0.), p4M); // Do Nothing Action
651 }
652 }
653 G4LorentzVector reco4M=G4LorentzVector(0.,0.,0.,mT); // 4mom of the recoil nucleon
654 G4LorentzVector dir4M=tot4M-G4LorentzVector(0.,0.,0.,(tot4M.e()-mT)*.01);
655 if(!G4QHadron(tot4M).RelDecayIn2(p4M, reco4M, dir4M, cost, cost))
656 {
657 G4cerr<<"G4QFS::Scat:t="<<tot4M<<tot4M.m()<<",mT="<<mT<<",mP="<<std::sqrt(mP2)<<G4endl;
658 //G4Exception("G4QFS::Scat:","009",FatalException,"Decay of ElasticComp");
659 return std::make_pair(G4LorentzVector(0.,0.,0.,0.),p4M); // Do Nothing Action
660 }
661#ifdef ppdebug
662 G4cout<<"G4QFS::Scat:p4M="<<p4M<<"+r4M="<<reco4M<<",dr="<<dir4M<<",t4M="<<tot4M<<G4endl;
663#endif
664 return std::make_pair( reco4M*megaelectronvolt, p4M*megaelectronvolt ); // The Result
665} // End of Scatter
666
668 G4int pPDG, G4LorentzVector p4M)
669{
670 static const G4double mPi0 = G4QPDGCode(111).GetMass();
671 static const G4double mPi = G4QPDGCode(211).GetMass(); // Pi+ (Pi-: -211)
672 static const G4double mK = G4QPDGCode(321).GetMass(); // K+ (K- : -321)
673 static const G4double mK0 = G4QPDGCode(311).GetMass(); // aK0 (K0 : -311)
674 static const G4double mNeut= G4QPDGCode(2112).GetMass();
675 static const G4double mProt= G4QPDGCode(2212).GetMass();
676 static const G4double mLamb= G4QPDGCode(3122).GetMass();
677 //static const G4double mSigZ= G4QPDGCode(3212).GetMass();
678 static const G4double mSigM= G4QPDGCode(3112).GetMass();
679 static const G4double mSigP= G4QPDGCode(3222).GetMass();
680 static const G4double mXiM = G4QPDGCode(3312).GetMass();
681 static const G4double mXiZ = G4QPDGCode(3322).GetMass();
682 //static const G4double mOmM = G4QPDGCode(3334).GetMass();
683 static const G4double third =1./3.;
684 static const G4double twothd =2./3.;
685
686 p4M/=megaelectronvolt; // Convert 4-momenta in MeV (CHIPS units)
687 N4M/=megaelectronvolt;
688 G4LorentzVector c4M=N4M+p4M;
689 if(pPDG==90001000) pPDG=2212;
690 if(pPDG==90000001) pPDG=2112;
691 if(pPDG==91000000) pPDG=3122;
692#ifdef ppdebug
693 G4cout<<"->G4QFR::InElF: p4M="<<p4M<<",N4M="<<N4M<<", c4M="<<c4M<<",NPDG="<<NPDG<<G4endl;
694#endif
695 G4double mT=mNeut;
696 G4int Z=0;
697 //G4int N=1;
698 if(NPDG==2212 || NPDG==90001000)
699 {
700 NPDG=2212;
701 mT=mProt;
702 Z=1;
703 //N=0;
704 }
705 else if(NPDG!=2112 && NPDG!=90000001)
706 {
707 G4cout<<"Error:G4QFreeScattering::InElF:NPDG="<<NPDG<<" is not 2212 or 2112"<<G4endl;
708 G4Exception("G4QFreeScattering::InElF:","21",FatalException,"CHIPS complain");
709 }
710 else NPDG=2112;
711 G4double mC2=c4M.m2();
712 G4double mC=0.;
713 if( mC2 < -0.0000001 )
714 {
715#ifdef ppdebug
716 G4cout<<"-Warning-G4QFS::InElF: Negative compoundMass ="<<mC2<<", c4M="<<c4M<<G4endl;
717#endif
718 return 0; // Do Nothing Action
719 }
720 else if ( mC2 > 0.0000001) mC=std::sqrt(mC2);
721#ifdef ppdebug
722 G4cout<<"G4QFS::InElF: mC ="<<mC<<G4endl;
723#endif
724 G4double mP=0.;
725 G4double mP2=p4M.m2(); // a projectile squared mass
726 if( mP2 < -0.0000001 )
727 {
728#ifdef ppdebug
729 G4cout<<"-Warning-G4QFS::InElF: Negative projectileMass ="<<mC2<<", c4M="<<c4M<<G4endl;
730#endif
731 return 0; // Do Nothing Action
732 }
733 else if ( mP2 > 0.0000001) mP=std::sqrt(mP2);
734#ifdef pdebug
735 G4cout<<"G4QFS::InElF:mT("<<mT<<")+mP("<<mP<<")+mPi0="<<mP+mT+mPi0<<"<? mC="<<mC<<G4endl;
736#endif
737 if(pPDG > 3334 || pPDG < -321) // Annihilation/Inelastic of anti-barions not implemented
738 {
739 G4cout<<"-Warning-G4QFreeScat::InElF: pPDG="<<pPDG<<G4endl;
740 return 0; // Do Nothing Action
741 }
742 if(pPDG==130 || pPDG==310)
743 {
744 if(G4UniformRand()>.5) pPDG = 311; // K0
745 else pPDG =-311; // aK0
746 }
747 G4int mPDG=111; // Additional newtral pion by default
748 G4double mM=mPi0; // Default Pi0 mass
749 G4double r=G4UniformRand(); // A random number to split pi0/pi
750 if (pPDG == 2212) // p-N
751 {
752 if(Z) // p-p
753 {
754 if(r<twothd) // -> n + Pi+ + p
755 {
756 pPDG=2112; // n
757 mP=mNeut;
758 mPDG= 211; // Pi+
759 mM=mPi;
760 }
761 }
762 else // p-n
763 {
764 if(r<third) // -> n + Pi+ + n
765 {
766 pPDG=2112; // n
767 mP=mNeut;
768 mPDG= 211; // Pi+
769 mM=mPi;
770 }
771 else if(r<twothd) // -> p + Pi- + p
772 {
773 mPDG=-211; // Pi-
774 mM=mPi;
775 NPDG=2212; // p
776 mT=mProt;
777 }
778 }
779 }
780 else if (pPDG == 2112) // n-N
781 {
782 if(Z) // n-p
783 {
784 if(r<third) // -> n + Pi+ + n
785 {
786 mPDG= 211; // Pi+
787 mM=mPi;
788 NPDG=2112; // n
789 mT=mNeut;
790 }
791 else if(r<twothd) // -> p + Pi- + p
792 {
793 pPDG=2212; // p
794 mP=mProt;
795 mPDG=-211; // Pi-
796 mM=mPi;
797 }
798 }
799 else // n-n
800 {
801 if(r<twothd) // -> p + Pi- + n
802 {
803 pPDG=2212; // p
804 mP=mProt;
805 mPDG= -211; // Pi-
806 mM=mPi;
807 }
808 }
809 }
810 else if (pPDG == 211) // pip-N
811 {
812 if(Z) // pip-p
813 {
814 if(r<0.5) // -> Pi+ + Pi+ + n
815 {
816 mPDG= 211; // Pi+
817 mM=mPi;
818 NPDG=2112; // n
819 mT=mNeut;
820 }
821 }
822 else // pip-n
823 {
824 if(r<third) // -> Pi0 + Pi0 + p
825 {
826 pPDG= 111; // Pi0
827 mP=mPi0;
828 NPDG=2212; // p
829 mT=mProt;
830 }
831 else if(r<twothd) // -> Pi+ + Pi- + p
832 {
833 mPDG=-211; // Pi-
834 mM=mPi;
835 NPDG=2212; // p
836 mT=mProt;
837 }
838 }
839 }
840 else if (pPDG == -211) // pim-N
841 {
842 if(Z) // pim-p
843 {
844 if(r<third) // -> Pi0 + Pi0 + n
845 {
846 pPDG= 111; // Pi0
847 mP=mPi0;
848 NPDG=2112; // n
849 mT=mNeut;
850 }
851 else if(r<twothd) // -> Pi- + Pi+ + n
852 {
853 mPDG= 211; // Pi+
854 mM=mPi;
855 NPDG=2112; // n
856 mT=mNeut;
857 }
858 }
859 else // pim-n
860 {
861 if(r<0.5) // -> Pi- + Pi- + p
862 {
863 mPDG=-211; // Pi-
864 mM=mPi;
865 NPDG=2212; // p
866 mT=mProt;
867 }
868 }
869 }
870 else if (pPDG == -321) // Km-N
871 {
872 if(Z) // Km-p
873 {
874 if(r<0.25) // K0 + Pi0 + n
875 {
876 pPDG=-311; // K0
877 mP=mK0;
878 NPDG=2112; // n
879 mT=mNeut;
880 }
881 else if(r<0.5) // -> K- + Pi+ + n
882 {
883 mPDG= 211; // Pi+
884 mM=mPi;
885 NPDG=2112; // n
886 mT=mNeut;
887 }
888 else if(r<0.75) // -> K0 + Pi- + p
889 {
890 pPDG=-311; // K0
891 mP=mK0;
892 mPDG=-211; // Pi-
893 mM=mPi;
894 }
895 }
896 else // Km-n
897 {
898 if(r<third) // -> K- + Pi- + p
899 {
900 mPDG=-211; // Pi-
901 mM=mPi;
902 NPDG=2212; // p
903 mT=mProt;
904 }
905 else if(r<twothd) // -> K0 + Pi- + n
906 {
907 pPDG=-311; // K0
908 mP=mK0;
909 mPDG=-211; // Pi-
910 mM=mPi;
911 }
912 }
913 }
914 else if (pPDG == -311) // K0-N
915 {
916 if(Z) // K0-p
917 {
918 if(r<third) // K- + Pi+ + p
919 {
920 pPDG=-321; // K-
921 mP=mK;
922 NPDG=2212; // p
923 mT=mProt;
924 }
925 else if(r<twothd) // -> K0 + Pi+ + n
926 {
927 mPDG= 211; // Pi+
928 mM=mPi;
929 NPDG=2112; // n
930 mT=mNeut;
931 }
932 }
933 else // K0-n
934 {
935 if(r<0.25) // -> K- + Pi+ + n
936 {
937 pPDG=-321; // K-
938 mP=mK;
939 mPDG= 211; // Pi+
940 mM=mPi;
941 }
942 else if(r<0.5) // -> K- + Pi0 + p
943 {
944 pPDG=-321; // K-
945 mP=mK;
946 NPDG=2212; // p
947 mT=mProt;
948 }
949 else if(r<0.75) // -> K0 + Pi- + p
950 {
951 mPDG=-211; // Pi-
952 mM=mPi;
953 NPDG=2212; // p
954 mT=mProt;
955 }
956 }
957 }
958 else if (pPDG == 321) // Kp-N
959 {
960 if(Z) // Kp-p
961 {
962 if(r<third) // -> K+ + Pi+ + n
963 {
964 mPDG= 211; // Pi+
965 mM=mPi;
966 NPDG=2112; // n
967 mT=mNeut;
968 }
969 else if(r<twothd) // -> aK0 + Pi+ + p
970 {
971 pPDG= 311; // aK0
972 mP=mK0;
973 mPDG= 211; // Pi+
974 mM=mPi;
975 }
976 }
977 else // Kp-n
978 {
979 if(r<0.25) // -> aK0 + Pi+ + n
980 {
981 pPDG= 311; // aK0
982 mP=mK0;
983 mPDG= 211; // Pi+
984 mM=mPi;
985 }
986 else if(r<0.5) // -> Kp + Pi- + p
987 {
988 mPDG=-211; // Pi-
989 mM=mPi;
990 NPDG=2212; // p
991 mT=mProt;
992 }
993 else if(r<0.75) // -> aK0 + Pi0 + p
994 {
995 pPDG= 311; // aK0
996 mP=mK0;
997 NPDG=2212; // p
998 mT=mProt;
999 }
1000 }
1001 }
1002 else if (pPDG == 311) // aK0-N
1003 {
1004 if(Z) // aK0-p
1005 {
1006 if(r<0.25) // -> K+ + Pi- + p
1007 {
1008 pPDG= 321; // K+
1009 mP=mK;
1010 mPDG=-211; // Pi-
1011 mM=mPi;
1012 }
1013 else if(r<0.5) // -> aK0 + Pi+ + n
1014 {
1015 mPDG= 211; // Pi+
1016 mM=mPi;
1017 NPDG=2112; // n
1018 mT=mNeut;
1019 }
1020 else if(r<0.75) // -> K+ + Pi0 + n
1021 {
1022 pPDG= 321; // K+
1023 mP=mK;
1024 NPDG=2112; // n
1025 mT=mNeut;
1026 }
1027 }
1028 else // aK0-n
1029 {
1030 if(r<third) // -> aK0 + Pi- + p
1031 {
1032 mPDG=-211; // Pi-
1033 mM=mPi;
1034 NPDG=2212; // p
1035 mT=mProt;
1036 }
1037 else if(r<twothd) // -> K+ + Pi- + n
1038 {
1039 pPDG= 321; // K+
1040 mP=mK;
1041 mPDG=-211; // Pi-
1042 mM=mPi;
1043 }
1044 }
1045 }
1046 else if (pPDG == 3122 || pPDG== 3212) // Lambda/Sigma0-N
1047 {
1048 if(pPDG == 3212)
1049 {
1050 pPDG=3122;
1051 mP=mLamb;
1052 }
1053 if(Z) // L/S0-p
1054 {
1055 if(r<0.2) // -> SigP + Pi0 + n
1056 {
1057 pPDG=3222; // SigP
1058 mP=mSigP;
1059 NPDG=2112; // n
1060 mT=mNeut;
1061 }
1062 else if(r<0.4) // -> SigP + Pi- + p
1063 {
1064 pPDG=3222; // SigP
1065 mP=mSigP;
1066 mPDG=-211; // Pi-
1067 mM=mPi;
1068 }
1069 else if(r<0.6) // -> SigM + Pi+ + p
1070 {
1071 pPDG=3112; // SigM
1072 mP=mSigM;
1073 mPDG= 211; // Pi+
1074 mM=mPi;
1075 }
1076 else if(r<0.8) // -> Lamb + Pi+ + n
1077 {
1078 mPDG= 211; // Pi+
1079 mM=mPi;
1080 NPDG=2112; // n
1081 mT=mNeut;
1082 }
1083 }
1084 else // L/S0-n
1085 {
1086 if(r<0.2) // -> SigM + Pi0 + p
1087 {
1088 pPDG=3112; // SigM
1089 mP=mSigM;
1090 NPDG=2212; // p
1091 mT=mProt;
1092 }
1093 else if(r<0.4) // -> SigP + Pi- + n
1094 {
1095 pPDG=3222; // SigP
1096 mP=mSigP;
1097 mPDG=-211; // Pi-
1098 mM=mPi;
1099 }
1100 else if(r<0.6) // -> SigM + Pi+ + n
1101 {
1102 pPDG=3112; // SigM
1103 mP=mSigM;
1104 mPDG= 211; // Pi+
1105 mM=mPi;
1106 }
1107 else if(r<0.8) // -> Lamb + Pi- + p
1108 {
1109 mPDG=-211; // Pi-
1110 mM=mPi;
1111 NPDG=2212; // p
1112 mT=mProt;
1113 }
1114 }
1115 }
1116 else if (pPDG == 3112) // Sigma- -N
1117 {
1118 if(Z) // SigM-p
1119 {
1120 if(r<0.25) // -> Lamb + Pi0 + n
1121 {
1122 pPDG=3122; // Lamb
1123 mP=mLamb;
1124 NPDG=2112; // n
1125 mT=mNeut;
1126 }
1127 else if(r<0.5) // -> Lamb + Pi- + p
1128 {
1129 pPDG=3122; // Lamb
1130 mP=mLamb;
1131 mPDG=-211; // Pi-
1132 mM=mPi;
1133 }
1134 else if(r<0.75) // -> SigM + Pi+ + n
1135 {
1136 mPDG= 211; // Pi+
1137 mM=mPi;
1138 NPDG=2112; // n
1139 mT=mNeut;
1140 }
1141 }
1142 else // SigM-n
1143 {
1144 if(r<third) // -> Lamb + Pi- + n
1145 {
1146 pPDG=3122; // Lamb
1147 mP=mLamb;
1148 mPDG=-211; // Pi-
1149 mM=mPi;
1150 }
1151 else if(r<twothd) // -> SigM + Pi- + p
1152 {
1153 mPDG=-211; // Pi-
1154 mM=mPi;
1155 NPDG=2212; // p
1156 mT=mProt;
1157 }
1158 }
1159 }
1160 else if (pPDG == 3222) // Sigma+ -N
1161 {
1162 if(Z) // SigP-p
1163 {
1164 if(r<third) // -> Lamb + Pi+ + p
1165 {
1166 pPDG=3122; // Lamb
1167 mP=mLamb;
1168 mPDG= 211; // Pi+
1169 mM=mPi;
1170 }
1171 else if(r<twothd) // -> SigP + Pi+ + n
1172 {
1173 mPDG= 211; // Pi+
1174 mM=mPi;
1175 NPDG=2112; // n
1176 mT=mNeut;
1177 }
1178 }
1179 else // SigP-n
1180 {
1181 if(r<0.25) // -> Lamb + Pi0 + p
1182 {
1183 pPDG=3122; // Lamb
1184 mP=mLamb;
1185 NPDG=2212; // p
1186 mT=mProt;
1187 }
1188 else if(r<0.5) // -> Lamb + Pi+ + n
1189 {
1190 pPDG=3122; // Lamb
1191 mP=mLamb;
1192 mPDG= 211; // Pi+
1193 mM=mPi;
1194 }
1195 else if(r<0.75) // -> SigP + Pi- + p
1196 {
1197 mPDG=-211; // Pi-
1198 mM=mPi;
1199 NPDG=2212; // p
1200 mT=mProt;
1201 }
1202 }
1203 }
1204 else if (pPDG == 3312) // Xi- -N
1205 {
1206 if(Z) // XiM-p
1207 {
1208 if(r<0.25) // -> Xi0 + Pi0 + n
1209 {
1210 pPDG=3322; // Xi0
1211 mP=mXiZ;
1212 NPDG=2112; // n
1213 mT=mNeut;
1214 }
1215 else if(r<0.5) // -> Xi0 + Pi- + p
1216 {
1217 pPDG=3322; // Xi0
1218 mP=mXiZ;
1219 mPDG=-211; // Pi-
1220 mM=mPi;
1221 }
1222 else if(r<0.75) // -> XiM + Pi+ + n
1223 {
1224 mPDG= 211; // Pi+
1225 mM=mPi;
1226 NPDG=2112; // n
1227 mT=mNeut;
1228 }
1229 }
1230 else // XiM-n
1231 {
1232 if(r<third) // -> Xi0 + Pi- + n
1233 {
1234 pPDG=3322; // Xi0
1235 mP=mXiZ;
1236 mPDG=-211; // Pi-
1237 mM=mPi;
1238 }
1239 else if(r<twothd) // -> XiM + Pi- + p
1240 {
1241 mPDG=-211; // Pi-
1242 mM=mPi;
1243 NPDG=2212; // p
1244 mT=mProt;
1245 }
1246 }
1247 }
1248 else if (pPDG == 3322) // Xi0 -N
1249 {
1250 if(Z) // Xi0-p
1251 {
1252 if(r<third) // -> Xi- + Pi+ + p
1253 {
1254 pPDG=3312; // Xi-
1255 mP=mXiM;
1256 mPDG= 211; // Pi+
1257 mM=mPi;
1258 }
1259 else if(r<twothd) // -> Xi0 + Pi+ + n
1260 {
1261 mPDG= 211; // Pi+
1262 mM=mPi;
1263 NPDG=2112; // n
1264 mT=mNeut;
1265 }
1266 }
1267 else // Xi0-n
1268 {
1269 if(r<0.25) // -> Xi- + Pi0 + p
1270 {
1271 pPDG=3312; // Xi-
1272 mP=mXiM;
1273 NPDG=2212; // p
1274 mT=mProt;
1275 }
1276 else if(r<0.5) // -> Xi- + Pi+ + n
1277 {
1278 pPDG=3312; // Xi-
1279 mP=mXiM;
1280 mPDG= 211; // Pi+
1281 mM=mPi;
1282 }
1283 else if(r<0.75) // -> Xi0 + Pi- + p
1284 {
1285 mPDG=-211; // Pi-
1286 mM=mPi;
1287 NPDG=2212; // p
1288 mT=mProt;
1289 }
1290 }
1291 }
1292 else if (pPDG == 3334) // Om- -N
1293 {
1294 if(Z) // OmM-p
1295 {
1296 if(r<0.5) // -> Om- + Pi+ + n
1297 {
1298 mPDG= 211; // Pi+
1299 mM=mPi;
1300 NPDG=2112; // n
1301 mT=mNeut;
1302 }
1303 }
1304 else // OmM-n
1305 {
1306 if(r<0.5) // -> Om- + Pi- + p
1307 {
1308 mPDG=-211; // Pi-
1309 mM=mPi;
1310 NPDG=2212; // p
1311 mT=mProt;
1312 }
1313 }
1314 }
1315 else
1316 {
1317 G4cout<<"*Error*G4QFreeScattering::InElF: PDG="<<pPDG
1318 <<", while it is defined only for p,n,hyperons(not Omega),pi,K/antiK"<<G4endl;
1319 G4Exception("G4QFreeScattering::InElF:","22",FatalException,"CHIPS_crash");
1320 }
1321 if (mC-mP-mM-mT <-0.000001) return 0;
1322 G4QHadronVector* TripQH = new G4QHadronVector; // Proto of the Result
1323 G4LorentzVector m4M(0.,0.,0.,mM);
1324 if(mC-mP-mM-mT < 0.000001) // Equal share
1325 {
1326 p4M=(mP/mC)*c4M;
1327 m4M=(mM/mC)*c4M;
1328 N4M=(mT/mC)*c4M;
1329 }
1330 else
1331 {
1332 p4M=G4LorentzVector(0.,0.,0.,mP);
1333 N4M=G4LorentzVector(0.,0.,0.,mT);
1334 if(!G4QHadron(c4M).DecayIn3(p4M,m4M,N4M))
1335 {
1337 ed << "DecayIn3, TotM=" << mC /* << " <? " << mT + mP + mM */ << G4endl;
1338 G4Exception("G4QFreeScattering::InElF()","HAD_CHPS_0027", FatalException, ed);
1339 }
1340 G4QHadron* h1 = new G4QHadron(pPDG, p4M);
1341 TripQH->push_back(h1); // (delete equivalent, responsibility of users)
1342#ifdef debug
1343 G4cout << "G4QFreeScat::InElF: H1=" << pPDG << p4M << G4endl;
1344#endif
1345 G4QHadron* h2 = new G4QHadron(mPDG, m4M);
1346 TripQH->push_back(h2); // (delete equivalent, responsibility of users)
1347#ifdef debug
1348 G4cout << "G4QFreeScat::InElF: H2=" << mPDG << m4M << G4endl;
1349#endif
1350 G4QHadron* h3 = new G4QHadron(NPDG, N4M);
1351 TripQH->push_back(h3); // (delete equivalent, responsibility of users)
1352#ifdef debug
1353 G4cout << "G4QFreeScat::InElF: H3=" << NPDG << N4M << G4endl;
1354#endif
1355 }
1356 return TripQH; // The Result
1357} // End of Scatter
@ LE
Definition: Evaluator.cc:66
@ JustWarning
@ FatalException
CLHEP::HepLorentzVector G4LorentzVector
std::vector< G4QHadron * > G4QHadronVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
std::pair< G4double, G4double > FetchElTot(G4double pGeV, G4int PDG, G4bool F)
std::pair< G4double, G4double > CalcElTot(G4double pGeV, G4int Index)
std::pair< G4double, G4double > GetElTotXS(G4double Mom, G4int PDG, G4bool F)
static G4QFreeScattering * GetPointer()
std::pair< G4double, G4double > GetElTotMean(G4double pIU, G4int hPDG, G4int Z, G4int N)
G4QHadronVector * InElF(G4int NPDG, G4LorentzVector N4M, G4int pPDG, G4LorentzVector p4M)
std::pair< G4LorentzVector, G4LorentzVector > Scatter(G4int NPDG, G4LorentzVector N4M, G4int pPDG, G4LorentzVector p4M)
G4double GetMass()
Definition: G4QPDGCode.cc:693
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76