74 if ( Pprojectile.z() < 0.0 )
return false;
75 G4bool PutOnMassShell(
false );
76 G4double M0projectile = Pprojectile.mag();
81 if ( M0projectile < MminProjectile ) {
82 PutOnMassShell =
true;
85 G4double M0projectile2 = M0projectile * M0projectile;
95 if ( M0target < MminTarget ) {
96 PutOnMassShell =
true;
99 G4double M0target2 = M0target * M0target;
103 Psum = Pprojectile + Ptarget;
106 if ( Ptmp.pz() <= 0.0 )
return false;
109 toCms.rotateZ( -1*Ptmp.phi() );
110 toCms.rotateY( -1*Ptmp.theta() );
112 Pprojectile.transform( toCms );
113 Ptarget.transform( toCms );
119 if ( SqrtS < M0projectile + M0target )
return false;
121 PZcms2 = ( S*S +
sqr( M0projectile2 ) +
sqr( M0target2 )
122 - 2*S*M0projectile2 - 2*S*M0target2 - 2*M0projectile2*M0target2 ) / 4.0 / S;
124 if ( PZcms2 < 0.0 ) {
129 M0projectile2 = M0projectile * M0projectile;
130 PZcms2= ( S*S +
sqr( M0projectile2 ) +
sqr( M0target2 )
131 - 2*S*M0projectile2 - 2*S*M0target2 - 2*M0projectile2*M0target2 ) / 4.0 / S;
132 if ( PZcms2 < 0.0 ) {
return false; }
139 PZcms = std::sqrt( PZcms2 );
141 if ( PutOnMassShell ) {
142 if ( Pprojectile.z() > 0.0 ) {
143 Pprojectile.setPz( PZcms );
144 Ptarget.setPz( -PZcms );
146 Pprojectile.setPz( -PZcms );
147 Ptarget.setPz( PZcms );
149 Pprojectile.setE( std::sqrt( M0projectile2 + Pprojectile.x() * Pprojectile.x() +
150 Pprojectile.y() * Pprojectile.y() + PZcms2 ) );
151 Ptarget.setE( std::sqrt( M0target2 + Ptarget.x() * Ptarget.x() + Ptarget.y() * Ptarget.y() +
163 const G4int maxNumberOfLoops = 1000;
164 G4int loopCounter = 0;
168 ProjMassT2 = M0projectile2 + Pt2;
169 ProjMassT = std::sqrt( ProjMassT2 );
170 TargMassT2 = M0target2 + Pt2;
171 TargMassT = std::sqrt( TargMassT2 );
172 }
while ( ( SqrtS < ProjMassT + TargMassT ) &&
173 ++loopCounter < maxNumberOfLoops );
174 if ( loopCounter >= maxNumberOfLoops ) {
178 PZcms2 = ( S*S +
sqr( ProjMassT2 ) +
sqr( TargMassT2 )
179 - 2.0*S*ProjMassT2 - 2.0*S*TargMassT2 - 2.0*ProjMassT2*TargMassT2 ) / 4.0 / S;
181 if ( PZcms2 < 0.0 ) { PZcms2 = 0.0; };
182 PZcms = std::sqrt( PZcms2 );
183 Pprojectile.setPz( PZcms );
184 Ptarget.setPz( -PZcms );
185 Pprojectile += Qmomentum;
186 Ptarget -= Qmomentum;
189 Pprojectile.transform( toLab );
190 Ptarget.transform( toLab );
215 if ( AveragePt2 <= 0.0 ) {
219 (
G4Exp( -maxPtSquare/AveragePt2 ) -1.0 ) );
223 return G4ThreeVector( Pt * std::cos( phi ), Pt * std::sin( phi ), 0.0 );
231 "G4ElasticHNScattering copy contructor not meant to be called" );
244 "G4ElasticHNScattering = operator not meant to be called" );
252 "G4ElasticHNScattering == operator not meant to be called" );
260 "G4ElasticHNScattering != operator not meant to be called" );
virtual G4bool ElasticScattering(G4VSplitableHadron *aPartner, G4VSplitableHadron *bPartner, G4FTFParameters *theParameters) const
CLHEP::Hep3Vector G4ThreeVector
int operator==(const G4ElasticHNScattering &right) const
CLHEP::HepLorentzRotation G4LorentzRotation
void SetTimeOfCreation(G4double aTime)
G4double GetAvaragePt2ofElasticScattering()
const G4ParticleDefinition * GetDefinition() const
const G4ElasticHNScattering & operator=(const G4ElasticHNScattering &right)
static const double twopi
G4double GetTimeOfCreation()
G4ThreeVector GaussianPt(G4double AveragePt2, G4double maxPtSquare) const
void IncrementCollisionCount(G4int aCount)
const G4LorentzVector & Get4Momentum() const
G4double GetMinimumMass(const G4ParticleDefinition *p) const
G4double G4Log(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double GetPDGMass() const
void SetPosition(const G4ThreeVector &aPosition)
virtual ~G4ElasticHNScattering()
const G4ThreeVector & GetPosition() const
int operator!=(const G4ElasticHNScattering &right) const
void Set4Momentum(const G4LorentzVector &a4Momentum)
CLHEP::HepLorentzVector G4LorentzVector