Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4hhElastic.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//
28// Physics model class G4hhElastic
29//
30//
31// G4 Model: qQ hadron hadron elastic scattering with 4-momentum balance
32//
33// 02.05.2014 V. Grichine 1-st version
34//
35
36#include "G4hhElastic.hh"
37#include "G4ParticleTable.hh"
39#include "G4IonTable.hh"
40#include "G4NucleiProperties.hh"
41
42#include "Randomize.hh"
43#include "G4Integrator.hh"
44#include "globals.hh"
46#include "G4SystemOfUnits.hh"
47
48#include "G4Proton.hh"
49#include "G4Neutron.hh"
50#include "G4PionPlus.hh"
51#include "G4PionMinus.hh"
52
53#include "G4Element.hh"
54#include "G4ElementTable.hh"
55#include "G4PhysicsTable.hh"
56#include "G4PhysicsLogVector.hh"
58
59#include "G4HadronNucleonXsc.hh"
60
61#include "G4Pow.hh"
62
64
65using namespace std;
66
67
68/////////////////////////////////////////////////////////////////////////
69//
70// Tracking constructor. Target is proton
71
72
74 : G4HadronElastic("HadrHadrElastic")
75{
76 SetMinEnergy( 1.*GeV );
78 verboseLevel = 0;
79 lowEnergyRecoilLimit = 100.*keV;
80 lowEnergyLimitQ = 0.0*GeV;
81 lowEnergyLimitHE = 0.0*GeV;
82 lowestEnergyLimit= 0.0*keV;
83 plabLowLimit = 20.0*MeV;
84
85 fRhoReIm=fSigmaTot=fOptRatio=fSpp=fPcms=0.0;
86 fInTkin=0;
87 theProton = G4Proton::Proton();
88 theNeutron = G4Neutron::Neutron();
89 thePionPlus = G4PionPlus::PionPlus();
90 thePionMinus= G4PionMinus::PionMinus();
91
92 fTarget = G4Proton::Proton();
93 fProjectile = 0;
94 fHadrNuclXsc = new G4HadronNucleonXsc();
95
96 fEnergyBin = 200;
97 fBinT = 514; // 514; // 500; // 200;
98
99 fEnergyVector = new G4PhysicsLogVector( theMinEnergy, theMaxEnergy, fEnergyBin );
100
101 fTableT = 0;
102 fOldTkin = 0.;
104
105 Initialise();
106}
107
108
109/////////////////////////////////////////////////////////////////////////
110//
111// test constructor
112
113
115 : G4HadronElastic("HadrHadrElastic")
116{
117 SetMinEnergy( 1.*GeV );
119 verboseLevel = 0;
120 lowEnergyRecoilLimit = 100.*keV;
121 lowEnergyLimitQ = 0.0*GeV;
122 lowEnergyLimitHE = 0.0*GeV;
123 lowestEnergyLimit = 0.0*keV;
124 plabLowLimit = 20.0*MeV;
125
126 fRhoReIm=fSigmaTot=fOptRatio=fSpp=fPcms=0.0;
127 fInTkin=0;
128 theProton = G4Proton::Proton();
129 theNeutron = G4Neutron::Neutron();
130 thePionPlus = G4PionPlus::PionPlus();
131 thePionMinus= G4PionMinus::PionMinus();
132
133 fTarget = target;
134 fProjectile = projectile;
135 fMassTarg = fTarget->GetPDGMass();
136 fMassProj = fProjectile->GetPDGMass();
137 fMassSum2 = (fMassTarg+fMassProj)*(fMassTarg+fMassProj);
138 fMassDif2 = (fMassTarg-fMassProj)*(fMassTarg-fMassProj);
139 fHadrNuclXsc = new G4HadronNucleonXsc();
140
141 fEnergyBin = 200;
142 fBinT = 514; // 200;
143
144 fEnergyVector = new G4PhysicsLogVector( theMinEnergy, theMaxEnergy, fEnergyBin );
145 fTableT = 0;
146 fOldTkin = 0.;
147
148
150 SetParametersCMS( plab);
151}
152
153
154/////////////////////////////////////////////////////////////////////////
155//
156// constructor used for low mass diffraction
157
158
160 : G4HadronElastic("HadrHadrElastic")
161{
162 SetMinEnergy( 1.*GeV );
164 verboseLevel = 0;
165 lowEnergyRecoilLimit = 100.*keV;
166 lowEnergyLimitQ = 0.0*GeV;
167 lowEnergyLimitHE = 0.0*GeV;
168 lowestEnergyLimit= 0.0*keV;
169 plabLowLimit = 20.0*MeV;
170
171 fRhoReIm=fSigmaTot=fOptRatio=fSpp=fPcms=0.0;
172 fInTkin=0;
173
174 fTarget = target; // later vmg
175 fProjectile = projectile;
176 theProton = G4Proton::Proton();
177 theNeutron = G4Neutron::Neutron();
178 thePionPlus = G4PionPlus::PionPlus();
179 thePionMinus= G4PionMinus::PionMinus();
180
181 fTarget = G4Proton::Proton(); // later vmg
182 fMassTarg = fTarget->GetPDGMass();
183 fMassProj = fProjectile->GetPDGMass();
184 fMassSum2 = (fMassTarg+fMassProj)*(fMassTarg+fMassProj);
185 fMassDif2 = (fMassTarg-fMassProj)*(fMassTarg-fMassProj);
186 fHadrNuclXsc = new G4HadronNucleonXsc();
187
188 fEnergyBin = 200;
189 fBinT = 514; // 514; // 500; // 200;
190
191 fEnergyVector = new G4PhysicsLogVector( theMinEnergy, theMaxEnergy, fEnergyBin );
192
193 fTableT = 0;
194 fOldTkin = 0.;
195
197}
198
199
200
201//////////////////////////////////////////////////////////////////////////////
202//
203// Destructor
204
206{
207 if ( fEnergyVector ) {
208 delete fEnergyVector;
209 fEnergyVector = 0;
210 }
211
212 for ( std::vector<G4PhysicsTable*>::iterator it = fBankT.begin();
213 it != fBankT.end(); ++it ) {
214 if ( (*it) ) (*it)->clearAndDestroy();
215 delete *it;
216 *it = 0;
217 }
218 fTableT = 0;
219 if(fHadrNuclXsc) delete fHadrNuclXsc;
220}
221
222/////////////////////////////////////////////////////////////////////////////
223///////////////////// Table preparation and reading ////////////////////////
224
225
226//////////////////////////////////////////////////////////////////////////////
227//
228// Initialisation for given particle on the proton target
229
231{
232 // pp,pn
233
234 fProjectile = G4Proton::Proton();
235 BuildTableT(fTarget, fProjectile);
236 fBankT.push_back(fTableT); // 0
237
238 // pi+-p
239
240 fProjectile = G4PionPlus::PionPlus();
241 BuildTableT(fTarget, fProjectile);
242 fBankT.push_back(fTableT); // 1
243 //K+-p
244 fProjectile = G4KaonPlus::KaonPlus();
245 BuildTableT(fTarget, fProjectile);
246 fBankT.push_back(fTableT); // 2
247
248}
249
250///////////////////////////////////////////////////////////////////////////////
251//
252// Build for given particle and proton table of momentum transfers.
253
254void G4hhElastic::BuildTableT( G4ParticleDefinition* target, G4ParticleDefinition* projectile) // , G4double plab)
255{
256 G4int iTkin, jTransfer;
257 G4double plab, Tkin, tMax;
258 G4double t1, t2, dt, delta = 0., sum = 0.;
259
260 fTarget = target;
261 fProjectile = projectile;
262 fMassTarg = fTarget->GetPDGMass();
263 fMassProj = fProjectile->GetPDGMass();
264 fMassSum2 = (fMassTarg+fMassProj)*(fMassTarg+fMassProj);
265 fMassDif2 = (fMassTarg-fMassProj)*(fMassTarg-fMassProj);
266
268 // G4HadronNucleonXsc* hnXsc = new G4HadronNucleonXsc();
269 fTableT = new G4PhysicsTable(fEnergyBin);
270
271 for( iTkin = 0; iTkin < fEnergyBin; iTkin++)
272 {
273 Tkin = fEnergyVector->GetLowEdgeEnergy(iTkin);
274 plab = std::sqrt( Tkin*( Tkin + 2*fMassProj ) );
275 // G4DynamicParticle* theDynamicParticle = new G4DynamicParticle(projectile,
276 // G4ParticleMomentum(0.,0.,1.),
277 // Tkin);
278 // fSigmaTot = fHadrNuclXsc->GetHadronNucleonXscNS( theDynamicParticle, target );
279
280 SetParametersCMS( plab );
281
282 tMax = 4.*fPcms*fPcms;
283 if( tMax > 15.*GeV*GeV ) tMax = 15.*GeV*GeV; // Check vs. energy ???
284
285 G4PhysicsFreeVector* vectorT = new G4PhysicsFreeVector(fBinT-1);
286 sum = 0.;
287 dt = tMax/fBinT;
288
289 // for(j = 1; j < fBinT; j++)
290
291 for( jTransfer = fBinT-1; jTransfer >= 1; jTransfer--)
292 {
293 t1 = dt*(jTransfer-1);
294 t2 = t1 + dt;
295
296 if( fMassProj > 900.*MeV ) // pp, pn
297 {
298 delta = integral.Legendre10(this, &G4hhElastic::GetdsdtF123, t1, t2);
299 // delta = integral.Legendre96(this, &G4hhElastic::GetdsdtF123, t1, t2);
300 }
301 else // pi+-p, K+-p
302 {
303 delta = integral.Legendre10(this, &G4hhElastic::GetdsdtF123qQgG, t1, t2);
304 // delta = integral.Legendre96(this, &G4hhElastic::GetdsdtF123qQgG, t1, t2);
305 }
306 sum += delta;
307 vectorT->PutValue( jTransfer-1, t1, sum ); // t2
308 }
309 // vectorT->PutValue( fBinT-1, dt*(fBinT-1), 0. ); // t2
310 fTableT->insertAt( iTkin, vectorT );
311 // delete theDynamicParticle;
312 }
313 // delete hnXsc;
314
315 return;
316}
317
318////////////////////////////////////////////////////////////////////////////
319//
320// Return inv momentum transfer -t > 0 from initialisation table
321
323 G4int, G4int )
324{
325 G4int iTkin, iTransfer;
326 G4double t, t2, position, m1 = aParticle->GetPDGMass();
327 G4double Tkin = std::sqrt(m1*m1+p*p) - m1;
328
329 if( aParticle == G4Proton::Proton() || aParticle == G4Neutron::Neutron() )
330 {
331 fTableT = fBankT[0];
332 }
333 if( aParticle == G4PionPlus::PionPlus() || aParticle == G4PionMinus::PionMinus() )
334 {
335 fTableT = fBankT[1];
336 }
337 if( aParticle == G4KaonPlus::KaonPlus() || aParticle == G4KaonMinus::KaonMinus() )
338 {
339 fTableT = fBankT[2];
340 }
341
342 G4double delta = std::abs(Tkin - fOldTkin)/(Tkin + fOldTkin);
343 G4double deltaMax = 1.e-2;
344
345 if ( delta < deltaMax ) iTkin = fInTkin;
346 else
347 {
348 for( iTkin = 0; iTkin < fEnergyBin; iTkin++)
349 {
350 if( Tkin < fEnergyVector->GetLowEdgeEnergy(iTkin) ) break;
351 }
352 }
353 if ( iTkin >= fEnergyBin ) iTkin = fEnergyBin-1; // Tkin is more then theMaxEnergy
354 if ( iTkin < 0 ) iTkin = 0; // against negative index, Tkin < theMinEnergy
355
356 fOldTkin = Tkin;
357 fInTkin = iTkin;
358
359 if (iTkin == fEnergyBin -1 || iTkin == 0 ) // the table edges
360 {
361 position = (*(*fTableT)(iTkin))(0)*G4UniformRand();
362
363 // G4cout<<"position = "<<position<<G4endl;
364
365 for(iTransfer = 0; iTransfer < fBinT-1; iTransfer++)
366 {
367 if( position >= (*(*fTableT)(iTkin))(iTransfer) ) break;
368 }
369 if (iTransfer >= fBinT-1) iTransfer = fBinT-2;
370
371 // G4cout<<"iTransfer = "<<iTransfer<<G4endl;
372
373 t = GetTransfer(iTkin, iTransfer, position);
374
375 // G4cout<<"t = "<<t<<G4endl;
376 }
377 else // Tkin inside between energy table edges
378 {
379 // position = (*(*fTableT)(iTkin))(fBinT-2)*G4UniformRand();
380 position = (*(*fTableT)(iTkin))(0)*G4UniformRand();
381
382 // G4cout<<"position = "<<position<<G4endl;
383
384 for(iTransfer = 0; iTransfer < fBinT-1; iTransfer++)
385 {
386 // if( position < (*(*fTableT)(iTkin))(iTransfer) ) break;
387 if( position >= (*(*fTableT)(iTkin))(iTransfer) ) break;
388 }
389 if (iTransfer >= fBinT-1) iTransfer = fBinT-2;
390
391 // G4cout<<"iTransfer = "<<iTransfer<<G4endl;
392
393 t2 = GetTransfer(iTkin, iTransfer, position);
394 return t2;
395 /*
396 G4double t1, E1, E2, W, W1, W2;
397 // G4cout<<"t2 = "<<t2<<G4endl;
398
399 E2 = fEnergyVector->GetLowEdgeEnergy(iTkin);
400
401 // G4cout<<"E2 = "<<E2<<G4endl;
402
403 iTkin--;
404
405 // position = (*(*fTableT)(iTkin))(fBinT-2)*G4UniformRand();
406
407 // G4cout<<"position = "<<position<<G4endl;
408
409 for(iTransfer = 0; iTransfer < fBinT-1; iTransfer++)
410 {
411 // if( position < (*(*fTableT)(iTkin))(iTransfer) ) break;
412 if( position >= (*(*fTableT)(iTkin))(iTransfer) ) break;
413 }
414 if (iTransfer >= fBinT-1) iTransfer = fBinT-2;
415
416 t1 = GetTransfer(iTkin, iTransfer, position);
417
418 // G4cout<<"t1 = "<<t1<<G4endl;
419
420 E1 = fEnergyVector->GetLowEdgeEnergy(iTkin);
421
422 // G4cout<<"E1 = "<<E1<<G4endl;
423
424 W = 1.0/(E2 - E1);
425 W1 = (E2 - Tkin)*W;
426 W2 = (Tkin - E1)*W;
427
428 t = W1*t1 + W2*t2;
429 */
430 }
431 return t;
432}
433
434
435////////////////////////////////////////////////////////////////////////////
436//
437// Return inv momentum transfer -t > 0 from initialisation table
438
440{
441 G4int iTkin, iTransfer;
442 G4double t, position, m1 = aParticle->GetPDGMass();
443 G4double Tkin = std::sqrt(m1*m1+p*p) - m1;
444
445 if( aParticle == G4Proton::Proton() || aParticle == G4Neutron::Neutron() )
446 {
447 fTableT = fBankT[0];
448 }
449 if( aParticle == G4PionPlus::PionPlus() || aParticle == G4PionMinus::PionMinus() )
450 {
451 fTableT = fBankT[1];
452 }
453 if( aParticle == G4KaonPlus::KaonPlus() || aParticle == G4KaonMinus::KaonMinus() )
454 {
455 fTableT = fBankT[2];
456 }
457 G4double delta = std::abs(Tkin - fOldTkin)/(Tkin + fOldTkin);
458 G4double deltaMax = 1.e-2;
459
460 if ( delta < deltaMax ) iTkin = fInTkin;
461 else
462 {
463 for( iTkin = 0; iTkin < fEnergyBin; iTkin++ )
464 {
465 if( Tkin < fEnergyVector->GetLowEdgeEnergy(iTkin) ) break;
466 }
467 }
468 if ( iTkin >= fEnergyBin ) iTkin = fEnergyBin-1; // Tkin is more then theMaxEnergy
469 if ( iTkin < 0 ) iTkin = 0; // against negative index, Tkin < theMinEnergy
470
471 fOldTkin = Tkin;
472 fInTkin = iTkin;
473
474 if (iTkin == fEnergyBin -1 || iTkin == 0 ) // the table edges
475 {
476 position = (*(*fTableT)(iTkin))(0)*G4UniformRand();
477
478 for(iTransfer = 0; iTransfer < fBinT-1; iTransfer++)
479 {
480 if( position >= (*(*fTableT)(iTkin))(iTransfer) ) break;
481 }
482 if (iTransfer >= fBinT-1) iTransfer = fBinT-2;
483
484 t = GetTransfer(iTkin, iTransfer, position);
485
486
487 }
488 else // Tkin inside between energy table edges
489 {
490 G4double rand = G4UniformRand();
491 position = (*(*fTableT)(iTkin))(0)*rand;
492
493 //
494 // (*fTableT)(iTkin)->GetLowEdgeEnergy(fBinT-2);
495 G4int sTransfer = 0, fTransfer = fBinT - 2, dTransfer = fTransfer - sTransfer;
496 G4double y2;
497
498 for( iTransfer = 0; iTransfer < fBinT - 1; iTransfer++ )
499 {
500 // dTransfer %= 2;
501 dTransfer /= 2;
502 // dTransfer *= 0.5;
503 y2 = (*(*fTableT)(iTkin))( sTransfer + dTransfer );
504
505 if( y2 > position ) sTransfer += dTransfer;
506
507 // if( dTransfer <= 1 ) break;
508 if( dTransfer < 1 ) break;
509 }
510 t = (*fTableT)(iTkin)->GetLowEdgeEnergy(sTransfer); // +(-0.5+rand)*(*fTableT)(iTkin)->GetLowEdgeEnergy(3);
511 }
512 return t;
513}
514
515
516///////////////////////////////////////////////////////////////////////////////
517//
518// Build for given particle and proton table of momentum transfers.
519
521{
522 G4int jTransfer;
523 G4double tMax; // , sQq, sQG;
524 G4double t1, t2, dt, delta = 0., sum = 0. ; // , threshold;
525
526 fTarget = target;
527 fProjectile = projectile;
528 fMassTarg = fTarget->GetPDGMass();
529 fMassProj = fProjectile->GetPDGMass();
530 fMassSum2 = (fMassTarg+fMassProj)*(fMassTarg+fMassProj);
531 fMassDif2 = (fMassTarg-fMassProj)*(fMassTarg-fMassProj);
532 fSpp = fMassProj*fMassProj + fMassTarg*fMassTarg + 2.*fMassTarg*std::sqrt(plab*plab + fMassProj*fMassProj);
533 fPcms = std::sqrt( (fSpp - fMassSum2)*(fSpp - fMassDif2)/4./fSpp);
534
535 G4cout<<"fMassTarg = "<<fMassTarg<<" MeV; fMassProj = "<<fMassProj<<" MeV"<<G4endl;
536 tMax = 4.*fPcms*fPcms;
537 if( tMax > 15.*GeV*GeV ) tMax = 15.*GeV*GeV; // Check vs. energy ???
538
539
541 fTableT = new G4PhysicsTable(1);
542 G4PhysicsFreeVector* vectorT = new G4PhysicsFreeVector(fBinT-1);
543
544 sum = 0.;
545 dt = tMax/G4double(fBinT);
546 G4cout<<"s = "<<std::sqrt(fSpp)/GeV<<" GeV; fPcms = "<<fPcms/GeV
547 <<" GeV; qMax = "<<tMax/GeV/GeV<<" GeV2; dt = "<<dt/GeV/GeV<<" GeV2"<<G4endl;
548
549 // G4cout<<"fRA = "<<fRA*GeV<<"; fRB = "<<fRB*GeV<<G4endl;
550
551 // for(jTransfer = 1; jTransfer < fBinT; jTransfer++)
552 for( jTransfer = fBinT-1; jTransfer >= 1; jTransfer-- )
553 {
554 t1 = dt*(jTransfer-1);
555 t2 = t1 + dt;
556
557 if( fMassProj > 900.*MeV ) // pp, pn
558 {
559 delta = integral.Legendre10(this, &G4hhElastic::GetdsdtF123, t1, t2);
560 // threshold = integral.Legendre96(this, &G4hhElastic::GetdsdtF123, t1, tMax);
561 }
562 else // pi+-p, K+-p
563 {
564 delta = integral.Legendre10(this, &G4hhElastic::GetdsdtF123qQgG, t1, t2);
565 // threshold = integral.Legendre96(this, &G4hhElastic::GetdsdtF123qQgG, t1, tMax);
566 // delta = integral.Legendre96(this, &G4hhElastic::GetdsdtF123, t1, t2);
567 }
568 sum += delta;
569 // G4cout<<delta<<"\t"<<sum<<"\t"<<threshold<<G4endl;
570
571 // sQq = GetdsdtF123(q1);
572 // sQG = GetdsdtF123qQgG(q1);
573 // G4cout<<q1/GeV<<"\t"<<sQG*GeV*GeV/millibarn<<"\t"<<sQq*GeV*GeV/millibarn<<G4endl;
574 // G4cout<<"sum = "<<sum<<", ";
575
576 vectorT->PutValue( jTransfer-1, t1, sum ); // t2
577 }
578 // vectorT->PutValue( fBinT-1, dt*(fBinT-1), 0. ); // t2
579 fTableT->insertAt( 0, vectorT );
580 fBankT.push_back( fTableT ); // 0
581
582 // for(jTransfer = 0; jTransfer < fBinT-1; jTransfer++)
583 // G4cout<<(*(*fTableT)(0))(jTransfer)/sum<<"\t\t"<<G4Pow::GetInstance()->powN(2.,-jTransfer)<<G4endl;
584
585 return;
586}
587
588
589////////////////////////////////////////////////////////////////////////////
590//
591// Return inv momentum transfer -t > 0 from initialisation table
592
593G4double G4hhElastic::SampleTest(G4double tMin ) // const G4ParticleDefinition* aParticle, )
594{
595 G4int iTkin, iTransfer, iTmin;
597 // G4double qMin = std::sqrt(tMin);
598
599 fTableT = fBankT[0];
600 iTkin = 0;
601
602 for(iTransfer = 0; iTransfer < fBinT-1; iTransfer++)
603 {
604 // if( qMin <= (*fTableT)(iTkin)->GetLowEdgeEnergy(iTransfer) ) break;
605 if( tMin <= (*fTableT)(iTkin)->GetLowEdgeEnergy(iTransfer) ) break;
606 }
607 iTmin = iTransfer-1;
608 if(iTmin < 0 ) iTmin = 0;
609
610 position = (*(*fTableT)(iTkin))(iTmin)*G4UniformRand();
611
612 for( iTmin = 0; iTransfer < fBinT-1; iTransfer++)
613 {
614 if( position > (*(*fTableT)(iTkin))(iTransfer) ) break;
615 }
616 if (iTransfer >= fBinT-1) iTransfer = fBinT-2;
617
618 t = GetTransfer(iTkin, iTransfer, position);
619
620 return t;
621}
622
623
624/////////////////////////////////////////////////////////////////////////////////
625//
626// Check with PAI sampling
627
630{
631 G4double x1, x2, y1, y2, randTransfer, delta, mean, epsilon = 1.e-6;
632
633 if( iTransfer == 0 )
634 {
635 randTransfer = (*fTableT)(iTkin)->GetLowEdgeEnergy(iTransfer);
636 // iTransfer++;
637 }
638 else
639 {
640 if ( iTransfer >= G4int((*fTableT)(iTkin)->GetVectorLength()) )
641 {
642 iTransfer = G4int((*fTableT)(iTkin)->GetVectorLength() - 1);
643 }
644 y1 = (*(*fTableT)(iTkin))(iTransfer-1);
645 y2 = (*(*fTableT)(iTkin))(iTransfer);
646
647 x1 = (*fTableT)(iTkin)->GetLowEdgeEnergy(iTransfer-1);
648 x2 = (*fTableT)(iTkin)->GetLowEdgeEnergy(iTransfer);
649
650 delta = y2 - y1;
651 mean = y2 + y1;
652
653 if ( x1 == x2 ) randTransfer = x2;
654 else
655 {
656 // if ( y1 == y2 )
657 if ( delta < epsilon*mean )
658 randTransfer = x1 + ( x2 - x1 )*G4UniformRand();
659 else randTransfer = x1 + ( position - y1 )*( x2 - x1 )/delta; // ( y2 - y1 );
660 }
661 }
662 return randTransfer;
663}
664
665const G4double G4hhElastic::theNuclNuclData[19][6] =
666{
667 // sqrt(fSpp) in GeV, fRA in 1/GeV, fRB in 1/GeV, fBq, fBQ, fImCof
668
669 { 2.76754, 4.8, 4.8, 0.05, 0.742441, 10.5 }, // pp 3GeV/c
670 { 3.07744, 5.4, 5.4, 0.02, 0.83818, 6.5 }, // pp 4GeV/c
671 { 3.36305, 5.2, 5.2, 0.02, 0.838893, 7.5 }, // np 5GeV/c
672 { 4.32941, 6, 6, 0.03, 0.769389, 7.5 }, // np 9 GeV/c
673 { 4.62126, 6, 6, 0.03, 0.770111, 6.5 }, // pp 10.4 GeV/c
674
675 { 5.47416, 4.5, 4.5, 0.03, 0.813185, 7.5 }, // np 15 GeV/c
676 { 6.15088, 6.5, 6.5, 0.02, 0.799539, 6.5 }, // pp 19.2 GeV/c
677 { 6.77474, 5.2, 5.2, 0.03, 0.784901, 7.5 }, // np 23.5 GeV/c
678 { 9.77775, 7, 7, 0.03, 0.742531, 6.5 }, // pp 50 GeV/c
679 // {9.77775, 7, 7, 0.011, 0.84419, 4.5 }, // pp 50 GeV/c
680 { 10.4728, 5.2, 5.2, 0.03, 0.780439, 7.5 }, // np 57.5 GeV/c
681
682 { 13.7631, 7, 7, 0.008, 0.8664, 5.0 }, // pp 100 GeV/c
683 { 19.4184, 6.8, 6.8, 0.009, 0.861337, 2.5 }, // pp 200 GeV/c
684 { 23.5, 6.8, 6.8, 0.007, 0.878112, 1.5 }, // pp 23.5 GeV
685 // {24.1362, 6.4, 6.4, 0.09, 0.576215, 7.5 }, // np 309.5 GeV/c
686 { 24.1362, 7.2, 7.2, 0.008, 0.864745, 5.5 },
687 { 52.8, 6.8, 6.8, 0.008, 0.871929, 1.5 }, // pp 58.2 GeV
688
689 { 546, 7.4, 7.4, 0.013, 0.845877, 5.5 }, // pb-p 546 GeV
690 { 1960, 7.8, 7.8, 0.022, 0.809062, 7.5 }, // pb-p 1960 GeV
691 { 7000, 8, 8, 0.024, 0.820441, 5.5 }, // pp TOTEM 7 TeV
692 { 13000, 8.5, 8.5, 0.03, 0.796721, 10.5 } // pp TOTEM 13 TeV
693
694};
695
696//////////////////////////////////////////////////////////////////////////////////
697
698const G4double G4hhElastic::thePiKaNuclData[8][6] =
699{
700 // sqrt(fSpp) in GeV, fRA in 1/GeV, fRB in 1/GeV, fBq, fBQ, fImCof
701
702 { 2.5627, 3.8, 3.3, 0.22, 0.222, 1.5 }, // pipp 3.017 GeV/c
703 { 2.93928, 4.3, 3.8, 0.2, 0.250601, 1.3 }, // pipp 4.122 GeV/c
704 { 3.22326, 4.8, 4.3, 0.13, 0.32751, 2.5 }, // pipp 5.055 GeV/c
705 { 7.80704, 5.5, 5, 0.13, 0.340631, 2.5 }, // pipp 32 GeV/c
706 { 9.7328, 5, 4.5, 0.05, 0.416319, 5.5 }, // pipp 50 GeV/c
707
708 { 13.7315, 5.3, 4.8, 0.05, 0.418426, 5.5 }, // pipp 100 GeV/c
709 { 16.6359, 6.3, 5.8, 0.05, 0.423817, 5.5 }, // pipp 147 GeV/c
710 { 19.3961, 5, 4.5, 0.05, 0.413477, 3.5 } // pimp 200 GeV/c
711
712};
713
714//
715//
716/////////////////////////////////////////////////////////////////////////////////
G4double epsilon(G4double density, G4double temperature)
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
void SetMinEnergy(G4double anEnergy)
void SetMaxEnergy(const G4double anEnergy)
static G4HadronicParameters * Instance()
static G4KaonMinus * KaonMinus()
Definition: G4KaonMinus.cc:112
static G4KaonPlus * KaonPlus()
Definition: G4KaonPlus.cc:112
static G4Neutron * Neutron()
Definition: G4Neutron.cc:103
void PutValue(const std::size_t index, const G4double e, const G4double value)
G4double GetLowEdgeEnergy(const std::size_t index) const
static G4PionMinus * PionMinus()
Definition: G4PionMinus.cc:97
static G4PionPlus * PionPlus()
Definition: G4PionPlus.cc:97
static G4Proton * Proton()
Definition: G4Proton.cc:92
G4double GetdsdtF123(G4double q)
G4double SampleBisectionalT(const G4ParticleDefinition *p, G4double plab)
Definition: G4hhElastic.cc:439
void BuildTableTest(G4ParticleDefinition *target, G4ParticleDefinition *projectile, G4double plab)
Definition: G4hhElastic.cc:520
G4double SampleInvariantT(const G4ParticleDefinition *p, G4double plab, G4int, G4int)
Definition: G4hhElastic.cc:322
void SetParametersCMS(G4double plab)
Definition: G4hhElastic.hh:316
void Initialise()
Definition: G4hhElastic.cc:230
G4double GetdsdtF123qQgG(G4double q)
Definition: G4hhElastic.hh:746
G4double SampleTest(G4double tMin)
Definition: G4hhElastic.cc:593
virtual ~G4hhElastic()
Definition: G4hhElastic.cc:205
void BuildTableT(G4ParticleDefinition *target, G4ParticleDefinition *projectile)
Definition: G4hhElastic.cc:254
G4double GetTransfer(G4int iMomentum, G4int iTransfer, G4double position)
Definition: G4hhElastic.cc:629
void SetParameters()
Definition: G4hhElastic.hh:271