69 if ( Pprojectile.
z() < 0.0 )
return false;
70 G4bool PutOnMassShell(
false );
72 if ( M0projectile < projectile->GetDefinition()->GetPDGMass() ) {
73 PutOnMassShell =
true;
76 G4double M0projectile2 = M0projectile * M0projectile;
82 if ( M0target < target->GetDefinition()->GetPDGMass() ) {
83 PutOnMassShell =
true;
86 G4double M0target2 = M0target * M0target;
90 Psum = Pprojectile + Ptarget;
93 if ( Ptmp.pz() <= 0.0 )
return false;
97 toCms.
rotateY( -1*Ptmp.theta() );
106 if ( SqrtS < M0projectile + M0target )
return false;
108 PZcms2 = ( S*S +
sqr( M0projectile2 ) +
sqr( M0target2 )
109 - 2*S*M0projectile2 - 2*S*M0target2 - 2*M0projectile2*M0target2 ) / 4.0 / S;
111 if ( PZcms2 < 0.0 ) {
116 M0projectile2 = M0projectile * M0projectile;
117 PZcms2= ( S*S +
sqr( M0projectile2 ) +
sqr( M0target2 )
118 - 2*S*M0projectile2 - 2*S*M0target2 - 2*M0projectile2*M0target2 ) / 4.0 / S;
119 if ( PZcms2 < 0.0 ) {
return false; }
126 PZcms = std::sqrt( PZcms2 );
128 if ( PutOnMassShell ) {
129 if ( Pprojectile.z() > 0.0 ) {
130 Pprojectile.setPz( PZcms );
131 Ptarget.setPz( -PZcms );
133 Pprojectile.setPz( -PZcms );
134 Ptarget.setPz( PZcms );
136 Pprojectile.setE( std::sqrt( M0projectile2 + Pprojectile.x() * Pprojectile.x() +
137 Pprojectile.y() * Pprojectile.y() + PZcms2 ) );
138 Ptarget.setE( std::sqrt( M0target2 + Ptarget.x() * Ptarget.x() + Ptarget.y() * Ptarget.y() +
151 Qmomentum =
G4LorentzVector( GaussianPt( AveragePt2, maxPtSquare ), 0.0 );
153 ProjMassT2 = M0projectile2 + Pt2;
154 ProjMassT = std::sqrt( ProjMassT2 );
155 TargMassT2 = M0target2 + Pt2;
156 TargMassT = std::sqrt( TargMassT2 );
157 }
while ( SqrtS < ProjMassT + TargMassT );
159 PZcms2 = ( S*S +
sqr( ProjMassT2 ) +
sqr( TargMassT2 )
160 - 2.0*S*ProjMassT2 - 2.0*S*TargMassT2 - 2.0*ProjMassT2*TargMassT2 ) / 4.0 / S;
162 if ( PZcms2 < 0.0 ) { PZcms2 = 0.0; };
163 PZcms = std::sqrt( PZcms2 );
164 Pprojectile.setPz( PZcms );
165 Ptarget.setPz( -PZcms );
166 Pprojectile += Qmomentum;
167 Ptarget -= Qmomentum;
196 if ( AveragePt2 <= 0.0 ) {
200 ( std::exp( -maxPtSquare/AveragePt2 ) -1.0 ) );
204 return G4ThreeVector( Pt * std::cos( phi ), Pt * std::sin( phi ), 0.0 );
212 "G4ElasticHNScattering copy contructor not meant to be called" );
225 "G4ElasticHNScattering = operator not meant to be called" );
233 "G4ElasticHNScattering == operator not meant to be called" );
241 "G4ElasticHNScattering != operator not meant to be called" );
virtual G4bool ElasticScattering(G4VSplitableHadron *aPartner, G4VSplitableHadron *bPartner, G4FTFParameters *theParameters) const
Hep3Vector boostVector() const
CLHEP::Hep3Vector G4ThreeVector
void SetTimeOfCreation(G4double aTime)
G4double GetAvaragePt2ofElasticScattering()
HepLorentzVector & rotateZ(double)
G4ParticleDefinition * GetDefinition() const
G4double GetTimeOfCreation()
HepLorentzRotation & transform(const HepBoost &b)
void IncrementCollisionCount(G4int aCount)
const G4LorentzVector & Get4Momentum() const
G4double GetPDGMass() const
void SetPosition(const G4ThreeVector &aPosition)
HepLorentzVector & rotateY(double)
virtual ~G4ElasticHNScattering()
const G4ThreeVector & GetPosition() const
HepLorentzVector & transform(const HepRotation &)
void Set4Momentum(const G4LorentzVector &a4Momentum)
CLHEP::HepLorentzVector G4LorentzVector