Geant4-11
Data Structures | Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes
G4QGSParticipants Class Reference

#include <G4QGSParticipants.hh>

Inheritance diagram for G4QGSParticipants:
G4VParticipants G4GammaParticipants

Data Structures

struct  DeleteInteractionContent
 
struct  DeletePartonPair
 
struct  DeleteSplitableHadron
 

Public Member Functions

void BuildInteractions (const G4ReactionProduct &thePrimary)
 
virtual void DoLorentzBoost (G4ThreeVector aBoost)
 
 G4QGSParticipants ()
 
 G4QGSParticipants (const G4QGSParticipants &right)
 
G4PartonPairGetNextPartonPair ()
 
virtual G4V3DNucleusGetWoundedNucleus () const
 
virtual void Init (G4int theZ, G4int theA)
 
virtual void InitProjectileNucleus (G4int theZ, G4int theA, G4int numberOfLambdasOrAntiLambdas=0)
 
G4bool operator!= (const G4QGSParticipants &right) const
 
G4bool operator!= (const G4VParticipants &right) const =delete
 
const G4QGSParticipantsoperator= (const G4QGSParticipants &right)
 
G4bool operator== (const G4QGSParticipants &right) const
 
G4bool operator== (const G4VParticipants &right) const =delete
 
virtual void SetNucleus (G4V3DNucleus *aNucleus)
 
virtual void SetProjectileNucleus (G4V3DNucleus *aNucleus)
 
void StartPartonPairLoop ()
 
virtual ~G4QGSParticipants ()
 

Protected Types

enum  { SOFT , DIFFRACTIVE }
 
enum  { ALL , WITHOUT_R , NON_DIFF }
 
enum  {
  PrD , TrD , DD , NonD ,
  Qexc
}
 

Protected Member Functions

G4bool DeterminePartonMomenta ()
 
void PerformDiffractiveCollisions ()
 
void PerformSoftCollisions ()
 
G4double SampleX (G4double anXmin, G4int nSea, G4int theTotalSea, G4double aBeta)
 
virtual G4VSplitableHadronSelectInteractions (const G4ReactionProduct &thePrimary)
 
void SplitHadrons ()
 

Protected Attributes

G4int ModelMode
 
const G4int nCutMax
 
const G4double QGSMThreshold
 
G4ThreeVector theBoost
 
G4ThreeVector theCurrentVelocity
 
G4QGSDiffractiveExcitation theDiffExcitaton
 
std::vector< G4InteractionContent * > theInteractions
 
const G4double theNucleonRadius
 
G4V3DNucleustheNucleus
 
std::vector< G4PartonPair * > thePartonPairs
 
G4V3DNucleustheProjectileNucleus
 
G4QGSMSplitableHadrontheProjectileSplitable
 
G4QuarkExchange theQuarkExchange
 
G4SingleDiffractiveExcitation theSingleDiffExcitation
 
std::vector< G4VSplitableHadron * > theTargets
 
const G4double ThresholdParameter
 

Private Member Functions

G4bool CheckKinematics (const G4double sValue, const G4double sqrtS, const G4double projectileMass2, const G4double targetMass2, const G4double nucleusY, const G4bool isProjectileNucleus, const G4int numberOfInvolvedNucleons, G4Nucleon *involvedNucleons[], G4double &targetWminus, G4double &projectileWplus, G4bool &success)
 
G4bool ComputeNucleusProperties (G4V3DNucleus *nucleus, G4LorentzVector &nucleusMomentum, G4LorentzVector &residualMomentum, G4double &sumMasses, G4double &residualExcitationEnergy, G4double &residualMass, G4int &residualMassNumber, G4int &residualCharge)
 
void CreateStrings ()
 
G4bool FinalizeKinematics (const G4double w, const G4bool isProjectileNucleus, const G4LorentzRotation &boostFromCmsToLab, const G4double residualMass, const G4int residualMassNumber, const G4int numberOfInvolvedNucleons, G4Nucleon *involvedNucleons[], G4LorentzVector &residual4Momentum)
 
G4ThreeVector GaussianPt (G4double AveragePt2, G4double maxPtSquare) const
 
G4bool GenerateDeltaIsobar (const G4double sqrtS, const G4int numberOfInvolvedNucleons, G4Nucleon *involvedNucleons[], G4double &sumMasses)
 
G4double GetCofNuclearDestruction ()
 
G4double GetDofNuclearDestruction ()
 
G4double GetExcitationEnergyPerWoundedNucleon ()
 
void GetList (const G4ReactionProduct &thePrimary)
 
G4double GetMaxPt2ofNuclearDestruction ()
 
G4V3DNucleusGetProjectileNucleus () const
 
G4double GetPt2ofNuclearDestruction ()
 
G4double GetR2ofNuclearDestruction ()
 
void GetResiduals ()
 
G4V3DNucleusGetTargetNucleus () const
 
void PrepareInitialState (const G4ReactionProduct &thePrimary)
 
G4bool PutOnMassShell ()
 
void ReggeonCascade ()
 
G4bool SamplingNucleonKinematics (G4double averagePt2, const G4double maxPt2, G4double dCor, G4V3DNucleus *nucleus, const G4LorentzVector &pResidual, const G4double residualMass, const G4int residualMassNumber, const G4int numberOfInvolvedNucleons, G4Nucleon *involvedNucleons[], G4double &mass2)
 
void SetCofNuclearDestruction (const G4double aValue)
 
void SetDofNuclearDestruction (const G4double aValue)
 
void SetExcitationEnergyPerWoundedNucleon (const G4double aValue)
 
void SetMaxPt2ofNuclearDestruction (const G4double aValue)
 
void SetPt2ofNuclearDestruction (const G4double aValue)
 
void SetR2ofNuclearDestruction (const G4double aValue)
 
void StoreInvolvedNucleon ()
 

Private Attributes

G4double alpha
 
G4double beta
 
G4double CofNuclearDestruction
 
G4double DofNuclearDestruction
 
G4double ExcitationEnergyPerWoundedNucleon
 
G4int InteractionMode
 
G4double MaxPt2ofNuclearDestruction
 
G4int NumberOfInvolvedNucleonsOfProjectile
 
G4int NumberOfInvolvedNucleonsOfTarget
 
G4LorentzVector ProjectileResidual4Momentum
 
G4int ProjectileResidualCharge
 
G4double ProjectileResidualExcitationEnergy
 
G4int ProjectileResidualMassNumber
 
G4double Pt2ofNuclearDestruction
 
G4double R2ofNuclearDestruction
 
G4ReggeonsRegge
 
G4double sigmaPt
 
G4LorentzVector TargetResidual4Momentum
 
G4int TargetResidualCharge
 
G4double TargetResidualExcitationEnergy
 
G4int TargetResidualMassNumber
 
G4NucleonTheInvolvedNucleonsOfProjectile [250]
 
G4NucleonTheInvolvedNucleonsOfTarget [250]
 
G4ReactionProduct theProjectile
 

Detailed Description

Definition at line 44 of file G4QGSParticipants.hh.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
protected
Enumerator
SOFT 
DIFFRACTIVE 

Definition at line 157 of file G4QGSParticipants.hh.

◆ anonymous enum

anonymous enum
protected
Enumerator
ALL 
WITHOUT_R 
NON_DIFF 

Definition at line 158 of file G4QGSParticipants.hh.

◆ anonymous enum

anonymous enum
protected
Enumerator
PrD 
TrD 
DD 
NonD 
Qexc 

Definition at line 159 of file G4QGSParticipants.hh.

Constructor & Destructor Documentation

◆ G4QGSParticipants() [1/2]

G4QGSParticipants::G4QGSParticipants ( )

Definition at line 49 of file G4QGSParticipants.cc.

53 theProjectileSplitable(nullptr), Regge(nullptr),
54 InteractionMode(ALL), alpha(-0.5), beta(2.5), sigmaPt(0.0),
63{
64 for (size_t i=0; i < 250; ++i) {
65 TheInvolvedNucleonsOfTarget[i] = nullptr;
67 }
68 // Parameters setting
75
76 sigmaPt=0.25*sqr(GeV);
77}
CLHEP::HepLorentzVector G4LorentzVector
static constexpr double fermi
Definition: G4SIunits.hh:83
static constexpr double GeV
Definition: G4SIunits.hh:203
static constexpr double MeV
Definition: G4SIunits.hh:200
CLHEP::Hep3Vector G4ThreeVector
const G4double ThresholdParameter
G4LorentzVector ProjectileResidual4Momentum
G4double ExcitationEnergyPerWoundedNucleon
G4double ProjectileResidualExcitationEnergy
void SetR2ofNuclearDestruction(const G4double aValue)
G4ThreeVector theCurrentVelocity
void SetDofNuclearDestruction(const G4double aValue)
void SetExcitationEnergyPerWoundedNucleon(const G4double aValue)
G4Nucleon * TheInvolvedNucleonsOfTarget[250]
void SetMaxPt2ofNuclearDestruction(const G4double aValue)
void SetPt2ofNuclearDestruction(const G4double aValue)
G4double TargetResidualExcitationEnergy
G4QGSDiffractiveExcitation theDiffExcitaton
G4QGSMSplitableHadron * theProjectileSplitable
G4Nucleon * TheInvolvedNucleonsOfProjectile[250]
void SetCofNuclearDestruction(const G4double aValue)
const G4double QGSMThreshold
G4double MaxPt2ofNuclearDestruction
G4LorentzVector TargetResidual4Momentum
G4int NumberOfInvolvedNucleonsOfProjectile
const G4double theNucleonRadius
G4double Pt2ofNuclearDestruction
G4int NumberOfInvolvedNucleonsOfTarget
T sqr(const T &x)
Definition: templates.hh:128

References fermi, GeV, MeV, SetCofNuclearDestruction(), SetDofNuclearDestruction(), SetExcitationEnergyPerWoundedNucleon(), SetMaxPt2ofNuclearDestruction(), SetPt2ofNuclearDestruction(), SetR2ofNuclearDestruction(), sigmaPt, sqr(), TheInvolvedNucleonsOfProjectile, and TheInvolvedNucleonsOfTarget.

◆ G4QGSParticipants() [2/2]

G4QGSParticipants::G4QGSParticipants ( const G4QGSParticipants right)

Definition at line 79 of file G4QGSParticipants.cc.

87 alpha(right.alpha), beta(right.beta), sigmaPt(right.sigmaPt),
104{
105 for (size_t i=0; i < 250; ++i) {
108 }
109}

References TheInvolvedNucleonsOfProjectile, and TheInvolvedNucleonsOfTarget.

◆ ~G4QGSParticipants()

G4QGSParticipants::~G4QGSParticipants ( )
virtual

Definition at line 111 of file G4QGSParticipants.cc.

111{}

Member Function Documentation

◆ BuildInteractions()

void G4QGSParticipants::BuildInteractions ( const G4ReactionProduct thePrimary)

Definition at line 113 of file G4QGSParticipants.cc.

114{
115 theProjectile = thePrimary;
116
118
120
122 G4LorentzVector tmp( 0.0, 0.0, 0.0, 0.0 );
127
132
134 G4Nucleon* NuclearNucleon;
135 while ( ( NuclearNucleon = theNucleus->GetNextNucleon() ) ) {
136 tmp+=NuclearNucleon->Get4Momentum();
137 }
139
140 if ( std::abs( theProjectile.GetDefinition()->GetBaryonNumber() ) <= 1 ) {
141 // Projectile is a hadron : meson or baryon
147 }
148
149 #ifdef debugQGSParticipants
150 G4cout <<G4endl<< "G4QGSParticipants::BuildInteractions---------" << G4endl
151 << "thePrimary " << thePrimary.GetDefinition()->GetParticleName()<<" "
153 G4cout << "Target A and Z " << theNucleus->GetMassNumber() <<" "<<theNucleus->GetCharge()<<" "
155 #endif
156
157 G4bool Success( true );
158
159 const G4int maxNumberOfLoops = 1000;
160 G4int loopCounter = 0;
161 do
162 {
163 const G4int maxNumberOfInternalLoops = 1000;
164 G4int internalLoopCounter = 0;
165 do
166 {
167 if(std::abs(theProjectile.GetDefinition()->GetPDGEncoding()) < 100.0)
168 {
169 SelectInteractions(theProjectile); // for lepton projectile
170 }
171 else
172 {
173 GetList( theProjectile ); // Get list of participating nucleons for hadron projectile
174 }
175
176 if ( theInteractions.size() == 0 ) return;
177
178 StoreInvolvedNucleon(); // Store participating nucleon
179
180 ReggeonCascade(); // Make reggeon cascading. Involve nucleons in the cascading.
181
182 Success = PutOnMassShell(); // Ascribe momenta to the involved and participating nucleons
183
184 if(!Success) PrepareInitialState( thePrimary );
185
186 } while( (!Success) && ++internalLoopCounter < maxNumberOfInternalLoops );
187
188 if ( internalLoopCounter >= maxNumberOfInternalLoops ) {
189 Success = false;
190 }
191
192 if ( Success ) {
193 #ifdef debugQGSParticipants
194 G4cout<<G4endl<<"PerformDiffractiveCollisions(); if they happend." <<G4endl;
195 #endif
196
198
199 #ifdef debugQGSParticipants
200 G4cout<<G4endl<<"SplitHadrons();" <<G4endl;
201 #endif
202
203 SplitHadrons();
204
206 #ifdef debugQGSParticipants
207 G4cout<<"Perform non-Diffractive Collisions if they happend. Determine Parton Momenta and so on." <<G4endl;
208 #endif
209 Success = DeterminePartonMomenta();
210 }
211
212 if(!Success) PrepareInitialState( thePrimary );
213 }
214 } while( (!Success) && ++loopCounter < maxNumberOfLoops );
215
216 if ( loopCounter >= maxNumberOfLoops ) {
217 Success = false;
218 #ifdef debugQGSParticipants
219 G4cout<<"NOT Successful ======" <<G4endl;
220 #endif
221 }
222
223 if ( Success ) {
224 CreateStrings(); // To create strings
225
226 GetResiduals(); // To calculate residual nucleus properties
227
228 #ifdef debugQGSParticipants
229 G4cout<<"All O.K. ======" <<G4endl;
230 #endif
231 }
232
233 // clean-up, if necessary
234 #ifdef debugQGSParticipants
235 G4cout<<"Clearing "<<G4endl;
236 G4cout<<"theInteractions.size() "<<theInteractions.size()<<G4endl;
237 #endif
238
239 if( Regge ) delete Regge;
240
241 std::for_each( theInteractions.begin(), theInteractions.end(), DeleteInteractionContent() );
242 theInteractions.clear();
243
244 // Erasing of target involved nucleons.
245 #ifdef debugQGSParticipants
246 G4cout<<"Erasing of involved target nucleons "<<NumberOfInvolvedNucleonsOfTarget<<G4endl;
247 #endif
248
250 for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; i++ ) {
252 if ( (aNucleon != 0 ) && (aNucleon->GetStatus() >= 1) ) delete aNucleon;
253 }
254 }
255
256 // Erasing of projectile involved nucleons.
258 for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfProjectile; i++ ) {
260 if ( aNucleon ) delete aNucleon;
261 }
262 }
263
264 #ifdef debugQGSParticipants
265 G4cout<<"Delition of target nucleons from soft interactions "<<theTargets.size()
266 <<G4endl<<G4endl;
267 #endif
268 std::for_each(theTargets.begin(), theTargets.end(), DeleteSplitableHadron());
269 theTargets.clear();
270
274 }
275}
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
void setVect(const Hep3Vector &)
G4VSplitableHadron * GetSplitableHadron() const
Definition: G4Nucleon.hh:97
virtual const G4LorentzVector & Get4Momentum() const
Definition: G4Nucleon.hh:72
G4double GetPDGCharge() const
const G4String & GetParticleName() const
std::vector< G4InteractionContent * > theInteractions
virtual G4VSplitableHadron * SelectInteractions(const G4ReactionProduct &thePrimary)
void GetList(const G4ReactionProduct &thePrimary)
void PrepareInitialState(const G4ReactionProduct &thePrimary)
G4ReactionProduct theProjectile
std::vector< G4VSplitableHadron * > theTargets
const G4ParticleDefinition * GetDefinition() const
G4double GetTotalEnergy() const
G4ThreeVector GetMomentum() const
virtual G4Nucleon * GetNextNucleon()=0
virtual G4int GetCharge()=0
virtual G4bool StartLoop()=0
virtual G4int GetMassNumber()=0
virtual void SetProjectileNucleus(G4V3DNucleus *aNucleus)
G4V3DNucleus * theNucleus

References CreateStrings(), DeterminePartonMomenta(), G4cout, G4endl, G4Nucleon::Get4Momentum(), G4ParticleDefinition::GetBaryonNumber(), G4V3DNucleus::GetCharge(), G4ReactionProduct::GetDefinition(), GetList(), G4V3DNucleus::GetMassNumber(), G4ReactionProduct::GetMomentum(), G4V3DNucleus::GetNextNucleon(), G4ParticleDefinition::GetParticleName(), G4ParticleDefinition::GetPDGCharge(), G4ParticleDefinition::GetPDGEncoding(), GetResiduals(), G4Nucleon::GetSplitableHadron(), G4VSplitableHadron::GetStatus(), G4ReactionProduct::GetTotalEnergy(), NumberOfInvolvedNucleonsOfProjectile, NumberOfInvolvedNucleonsOfTarget, PerformDiffractiveCollisions(), PrepareInitialState(), ProjectileResidual4Momentum, ProjectileResidualCharge, ProjectileResidualExcitationEnergy, ProjectileResidualMassNumber, PutOnMassShell(), Regge, ReggeonCascade(), SelectInteractions(), CLHEP::HepLorentzVector::setE(), G4VParticipants::SetProjectileNucleus(), CLHEP::HepLorentzVector::setVect(), SplitHadrons(), G4V3DNucleus::StartLoop(), StoreInvolvedNucleon(), TargetResidual4Momentum, TargetResidualCharge, TargetResidualExcitationEnergy, TargetResidualMassNumber, theInteractions, TheInvolvedNucleonsOfProjectile, TheInvolvedNucleonsOfTarget, G4VParticipants::theNucleus, theProjectile, theProjectileSplitable, and theTargets.

◆ CheckKinematics()

G4bool G4QGSParticipants::CheckKinematics ( const G4double  sValue,
const G4double  sqrtS,
const G4double  projectileMass2,
const G4double  targetMass2,
const G4double  nucleusY,
const G4bool  isProjectileNucleus,
const G4int  numberOfInvolvedNucleons,
G4Nucleon involvedNucleons[],
G4double targetWminus,
G4double projectileWplus,
G4bool success 
)
private

Definition at line 1304 of file G4QGSParticipants.cc.

1315 { // input & output parameter
1316
1317 // This method, which is called only by PutOnMassShell, checks whether the
1318 // kinematics is acceptable or not.
1319 // This method assumes that all the parameters have been initialized by the caller;
1320 // notice that the input boolean parameter isProjectileNucleus is meant to be true
1321 // only in the case of nucleus or antinucleus projectile.
1322 // The action of this method consists in computing targetWminus and projectileWplus
1323 // and setting the parameter success to false in the case that the kinematics should
1324 // be rejeted.
1325
1326 G4double decayMomentum2 = sqr( sValue ) + sqr( projectileMass2 ) + sqr( targetMass2 )
1327 - 2.0*sValue*projectileMass2 - 2.0*sValue*targetMass2
1328 - 2.0*projectileMass2*targetMass2;
1329 targetWminus = ( sValue - projectileMass2 + targetMass2 + std::sqrt( decayMomentum2 ) )
1330 / 2.0 / sqrtS;
1331 projectileWplus = sqrtS - targetMass2/targetWminus;
1332 G4double projectilePz = projectileWplus/2.0 - projectileMass2/2.0/projectileWplus;
1333 G4double projectileE = projectileWplus/2.0 + projectileMass2/2.0/projectileWplus;
1334 G4double projectileY(1.0e5);
1335 if (projectileE - projectilePz > 0.) {
1336 projectileY = 0.5 * G4Log( (projectileE + projectilePz)/
1337 (projectileE - projectilePz) );
1338 }
1339 G4double targetPz = -targetWminus/2.0 + targetMass2/2.0/targetWminus;
1340 G4double targetE = targetWminus/2.0 + targetMass2/2.0/targetWminus;
1341 G4double targetY = 0.5 * G4Log( (targetE + targetPz)/(targetE - targetPz) );
1342
1343 #ifdef debugPutOnMassShell
1344 G4cout << "decayMomentum2 " << decayMomentum2 << G4endl
1345 << "\t targetWminus projectileWplus " << targetWminus << " " << projectileWplus << G4endl
1346 << "\t projectileY targetY " << projectileY << " " << targetY << G4endl;
1347 #endif
1348
1349 for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1350 G4Nucleon* aNucleon = involvedNucleons[i];
1351 if ( ! aNucleon ) continue;
1352 G4LorentzVector tmp = aNucleon->Get4Momentum();
1353 G4double mt2 = sqr( tmp.x() ) + sqr( tmp.y() ) +
1354 sqr( aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass() );
1355 G4double x = tmp.z();
1356 G4double pz = -targetWminus*x/2.0 + mt2/(2.0*targetWminus*x);
1357 G4double e = targetWminus*x/2.0 + mt2/(2.0*targetWminus*x);
1358 if ( isProjectileNucleus ) {
1359 pz = projectileWplus*x/2.0 - mt2/(2.0*projectileWplus*x);
1360 e = projectileWplus*x/2.0 + mt2/(2.0*projectileWplus*x);
1361 }
1362 G4double nucleonY = 0.5 * G4Log( (e + pz)/(e - pz) );
1363
1364 #ifdef debugPutOnMassShell
1365 G4cout << "i nY pY nY-AY AY " << i << " " << nucleonY << " " << projectileY <<G4endl;
1366 #endif
1367
1368 if ( std::abs( nucleonY - nucleusY ) > 2 ||
1369 ( isProjectileNucleus && targetY > nucleonY ) ||
1370 ( ! isProjectileNucleus && projectileY < nucleonY ) ) {
1371 success = false;
1372 break;
1373 }
1374 }
1375 return true;
1376}
G4double G4Log(G4double x)
Definition: G4Log.hh:226
double G4double
Definition: G4Types.hh:83
const G4ParticleDefinition * GetDefinition() const

References G4cout, G4endl, G4Log(), G4Nucleon::Get4Momentum(), G4VSplitableHadron::GetDefinition(), G4ParticleDefinition::GetPDGMass(), G4Nucleon::GetSplitableHadron(), sqr(), CLHEP::HepLorentzVector::x(), CLHEP::HepLorentzVector::y(), and CLHEP::HepLorentzVector::z().

Referenced by PutOnMassShell().

◆ ComputeNucleusProperties()

G4bool G4QGSParticipants::ComputeNucleusProperties ( G4V3DNucleus nucleus,
G4LorentzVector nucleusMomentum,
G4LorentzVector residualMomentum,
G4double sumMasses,
G4double residualExcitationEnergy,
G4double residualMass,
G4int residualMassNumber,
G4int residualCharge 
)
private

Definition at line 1033 of file G4QGSParticipants.cc.

1041 { // input & output parameter
1042
1043 // This method, which is called only by PutOnMassShell, computes some nucleus properties for:
1044 // - either the target nucleus (which is never an antinucleus): this for any kind
1045 // of hadronic interaction (hadron-nucleus, nucleus-nucleus, antinucleus-nucleus);
1046 // - or the projectile nucleus or antinucleus: this only in the case of nucleus-nucleus
1047 // or antinucleus-nucleus interaction.
1048 // This method assumes that the all the parameters have been initialized by the caller;
1049 // the action of this method consists in modifying all these parameters, except the
1050 // first one. The return value is "false" only in the case the pointer to the nucleus
1051 // is null.
1052
1053 if ( ! nucleus ) return false;
1054
1055 G4double ExcitationEPerWoundedNucleon = GetExcitationEnergyPerWoundedNucleon();
1056
1057 // Loop over the nucleons of the nucleus.
1058 // The nucleons that have been involved in the interaction (either from Glauber or
1059 // Reggeon Cascading) will be candidate to be emitted.
1060 // All the remaining nucleons will be the nucleons of the candidate residual nucleus.
1061 // The variable sumMasses is the amount of energy corresponding to:
1062 // 1. transverse mass of each involved nucleon
1063 // 2. 20.0*MeV separation energy for each involved nucleon
1064 // 3. transverse mass of the residual nucleus
1065 // In this first evaluation of sumMasses, the excitation energy of the residual nucleus
1066 // (residualExcitationEnergy, estimated by adding a constant value to each involved
1067 // nucleon) is not taken into account.
1068 G4Nucleon* aNucleon = 0;
1069 nucleus->StartLoop();
1070 while ( ( aNucleon = nucleus->GetNextNucleon() ) ) { /* Loop checking, 07.08.2015, A.Ribon */
1071 nucleusMomentum += aNucleon->Get4Momentum();
1072 if ( aNucleon->AreYouHit() ) { // Involved nucleons
1073 // Consider in sumMasses the nominal, i.e. on-shell, masses of the nucleons
1074 // (not the current masses, which could be different because the nucleons are off-shell).
1075
1076 sumMasses += std::sqrt( sqr( aNucleon->GetDefinition()->GetPDGMass() )
1077 + aNucleon->Get4Momentum().perp2() );
1078 sumMasses += 20.0*MeV; // Separation energy for a nucleon
1079
1080 //residualExcitationEnergy += ExcitationEPerWoundedNucleon;
1081 residualExcitationEnergy += -ExcitationEPerWoundedNucleon*G4Log( G4UniformRand());
1082 residualMassNumber--;
1083 // The absolute value below is needed only in the case of anti-nucleus.
1084 residualCharge -= std::abs( G4int( aNucleon->GetDefinition()->GetPDGCharge() ) );
1085 } else { // Spectator nucleons
1086 residualMomentum += aNucleon->Get4Momentum();
1087 }
1088 }
1089 #ifdef debugPutOnMassShell
1090 G4cout << "ExcitationEnergyPerWoundedNucleon " << ExcitationEPerWoundedNucleon <<" MeV"<<G4endl
1091 << "\t Residual Charge, MassNumber " << residualCharge << " " << residualMassNumber
1092 << G4endl << "\t Initial Momentum " << nucleusMomentum/GeV<<" GeV"
1093 << G4endl << "\t Residual Momentum " << residualMomentum/GeV<<" GeV"<<G4endl;
1094 #endif
1095
1096 residualMomentum.setPz( 0.0 );
1097 residualMomentum.setE( 0.0 );
1098 if ( residualMassNumber == 0 ) {
1099 residualMass = 0.0;
1100 residualExcitationEnergy = 0.0;
1101 } else {
1103 GetIonMass( residualCharge, residualMassNumber );
1104 if ( residualMassNumber == 1 ) {
1105 residualExcitationEnergy = 0.0;
1106 }
1107 }
1108 sumMasses += std::sqrt( sqr( residualMass ) + residualMomentum.perp2() );
1109 return true;
1110}
#define G4UniformRand()
Definition: Randomize.hh:52
double perp2() const
G4bool AreYouHit() const
Definition: G4Nucleon.hh:98
virtual const G4ParticleDefinition * GetDefinition() const
Definition: G4Nucleon.hh:86
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
G4double GetExcitationEnergyPerWoundedNucleon()

References G4Nucleon::AreYouHit(), G4cout, G4endl, G4Log(), G4UniformRand, G4Nucleon::Get4Momentum(), G4Nucleon::GetDefinition(), GetExcitationEnergyPerWoundedNucleon(), G4ParticleTable::GetIonTable(), G4V3DNucleus::GetNextNucleon(), G4ParticleTable::GetParticleTable(), G4ParticleDefinition::GetPDGCharge(), G4ParticleDefinition::GetPDGMass(), GeV, MeV, CLHEP::HepLorentzVector::perp2(), CLHEP::HepLorentzVector::setE(), CLHEP::HepLorentzVector::setPz(), sqr(), and G4V3DNucleus::StartLoop().

Referenced by PutOnMassShell().

◆ CreateStrings()

void G4QGSParticipants::CreateStrings ( )
private

Definition at line 2063 of file G4QGSParticipants.cc.

2064{
2065
2066 #ifdef debugQGSParticipants
2067 G4cout<<"CreateStrings() ..................."<<G4endl;
2068 #endif
2069
2070 if ( ! theProjectileSplitable ) {
2071 #ifdef debugQGSParticipants
2072 G4cout<<"BAD situation: theProjectileSplitable is NULL ! Returning immediately"<<G4endl;
2073 #endif
2074 return;
2075 }
2076
2077 #ifdef debugQGSParticipants
2078 G4cout<<"theProjectileSplitable->GetStatus() "<<theProjectileSplitable->GetStatus()<<G4endl;
2079 G4LorentzVector str4Mom;
2080 #endif
2081
2082 if( theProjectileSplitable->GetStatus() == 1 ) // The projectile has participated only in diffr. inter.
2083 {
2085
2089 #ifdef debugQGSParticipants
2090 G4cout << "Pr. Diffr. String: Qs 4mom X " <<G4endl;
2091 G4cout << " " << aPair->GetParton1()->GetPDGcode() << " "
2092 << aPair->GetParton1()->Get4Momentum() << " "
2093 << aPair->GetParton1()->GetX() << " " << G4endl;
2094 G4cout << " " << aPair->GetParton2()->GetPDGcode() << " "
2095 << aPair->GetParton2()->Get4Momentum() << " "
2096 << aPair->GetParton2()->GetX() << " " << G4endl;
2097 str4Mom += aPair->GetParton1()->Get4Momentum();
2098 str4Mom += aPair->GetParton2()->Get4Momentum();
2099 #endif
2100
2101 thePartonPairs.push_back(aPair);
2102 }
2103
2105
2106 for ( G4int i = 0; i < N_EnvTarg; i++ ) {
2107 G4Nucleon* aTargetNucleon = TheInvolvedNucleonsOfTarget[ i ];
2108
2109 G4VSplitableHadron* HitTargetNucleon = aTargetNucleon->GetSplitableHadron();
2110
2111 #ifdef debugQGSParticipants
2112 G4cout<<"Involved Nucleon # and its status "<<i<<" "<<HitTargetNucleon->GetStatus()<<G4endl;
2113 #endif
2114 if( HitTargetNucleon->GetStatus() >= 1) // Create diffractive string
2115 {
2116 G4ThreeVector Position = HitTargetNucleon->GetPosition();
2117
2118 G4PartonPair * aPair = new G4PartonPair(HitTargetNucleon->GetNextParton(),
2119 HitTargetNucleon->GetNextAntiParton(),
2121 #ifdef debugQGSParticipants
2122 G4cout << "Tr. Diffr. String: Qs 4mom X " <<G4endl;
2123 G4cout << "Diffr. String " << aPair->GetParton1()->GetPDGcode() << " "
2124 << aPair->GetParton1()->Get4Momentum() << " "
2125 << aPair->GetParton1()->GetX() << " " << G4endl;
2126 G4cout << " " << aPair->GetParton2()->GetPDGcode() << " "
2127 << aPair->GetParton2()->Get4Momentum() << " "
2128 << aPair->GetParton2()->GetX() << " " << G4endl;
2129
2130 str4Mom += aPair->GetParton1()->Get4Momentum();
2131 str4Mom += aPair->GetParton2()->Get4Momentum();
2132 #endif
2133
2134 thePartonPairs.push_back(aPair);
2135 }
2136 }
2137
2138 //-----------------------------------------
2139 #ifdef debugQGSParticipants
2140 G4cout<<"Strings created in soft interactions"<<G4endl;
2141 #endif
2142 std::vector<G4InteractionContent*>::iterator i;
2143 G4int IntNo=0;
2144 i = theInteractions.begin();
2145 while ( i != theInteractions.end() ) /* Loop checking, 07.08.2015, A.Ribon */
2146 {
2147 G4InteractionContent* anIniteraction = *i;
2148 G4PartonPair * aPair = NULL;
2149
2150 #ifdef debugQGSParticipants
2151 G4cout<<"An interaction # and soft coll. # "<<IntNo<<" "
2152 <<anIniteraction->GetNumberOfSoftCollisions()<<G4endl;
2153 #endif
2154 IntNo++;
2155 if (anIniteraction->GetNumberOfSoftCollisions())
2156 {
2157 G4VSplitableHadron* pProjectile = anIniteraction->GetProjectile();
2158 G4VSplitableHadron* pTarget = anIniteraction->GetTarget();
2159
2160 for (G4int j = 0; j < anIniteraction->GetNumberOfSoftCollisions(); j++)
2161 {
2162 aPair = new G4PartonPair(pTarget->GetNextParton(), pProjectile->GetNextAntiParton(),
2164 #ifdef debugQGSParticipants
2165 G4cout << "SoftPair " << aPair->GetParton1()->GetPDGcode() << " "
2166 << aPair->GetParton1()->Get4Momentum() << " "
2167 << aPair->GetParton1()->Get4Momentum().mag()<<G4endl;
2168 G4cout << " " << aPair->GetParton2()->GetPDGcode() << " "
2169 << aPair->GetParton2()->Get4Momentum() << " "
2170 <<aPair->GetParton2()->Get4Momentum().mag()<<G4endl;
2171 str4Mom += aPair->GetParton1()->Get4Momentum();
2172 str4Mom += aPair->GetParton2()->Get4Momentum();
2173 #endif
2174
2175 thePartonPairs.push_back(aPair);
2176
2177 aPair = new G4PartonPair(pProjectile->GetNextParton(), pTarget->GetNextAntiParton(),
2179 #ifdef debugQGSParticipants
2180 G4cout << "SoftPair " << aPair->GetParton1()->GetPDGcode() << " "
2181 << aPair->GetParton1()->Get4Momentum() << " "
2182 << aPair->GetParton1()->Get4Momentum().mag()<<G4endl;
2183 G4cout << " " << aPair->GetParton2()->GetPDGcode() << " "
2184 << aPair->GetParton2()->Get4Momentum() << " "
2185 << aPair->GetParton2()->Get4Momentum().mag()<<G4endl;
2186 #endif
2187 #ifdef debugQGSParticipants
2188 str4Mom += aPair->GetParton1()->Get4Momentum();
2189 str4Mom += aPair->GetParton2()->Get4Momentum();
2190 #endif
2191
2192 thePartonPairs.push_back(aPair);
2193 }
2194
2195 delete *i;
2196 i=theInteractions.erase(i); // i now points to the next interaction
2197 }
2198 else
2199 {
2200 i++;
2201 }
2202 } // End of while ( i != theInteractions.end() )
2203 #ifdef debugQGSParticipants
2204 G4cout << "Sum of strings 4 momenta " << str4Mom << G4endl<<G4endl;
2205 #endif
2206}
G4VSplitableHadron * GetProjectile() const
G4VSplitableHadron * GetTarget() const
G4Parton * GetParton2(void)
Definition: G4PartonPair.hh:76
G4Parton * GetParton1(void)
Definition: G4PartonPair.hh:71
G4double GetX()
Definition: G4Parton.hh:87
G4int GetPDGcode() const
Definition: G4Parton.hh:127
const G4LorentzVector & Get4Momentum() const
Definition: G4Parton.hh:143
virtual G4Parton * GetNextParton()
virtual G4Parton * GetNextAntiParton()
std::vector< G4PartonPair * > thePartonPairs
virtual G4Parton * GetNextParton()=0
virtual G4Parton * GetNextAntiParton()=0
const G4ThreeVector & GetPosition() const

References G4PartonPair::DIFFRACTIVE, G4cout, G4endl, G4Parton::Get4Momentum(), G4QGSMSplitableHadron::GetNextAntiParton(), G4VSplitableHadron::GetNextAntiParton(), G4QGSMSplitableHadron::GetNextParton(), G4VSplitableHadron::GetNextParton(), G4InteractionContent::GetNumberOfSoftCollisions(), G4PartonPair::GetParton1(), G4PartonPair::GetParton2(), G4Parton::GetPDGcode(), G4VSplitableHadron::GetPosition(), G4InteractionContent::GetProjectile(), G4Nucleon::GetSplitableHadron(), G4VSplitableHadron::GetStatus(), G4InteractionContent::GetTarget(), G4Parton::GetX(), CLHEP::HepLorentzVector::mag(), NumberOfInvolvedNucleonsOfTarget, G4PartonPair::PROJECTILE, G4PartonPair::SOFT, G4PartonPair::TARGET, theInteractions, TheInvolvedNucleonsOfTarget, thePartonPairs, and theProjectileSplitable.

Referenced by BuildInteractions().

◆ DeterminePartonMomenta()

G4bool G4QGSParticipants::DeterminePartonMomenta ( )
protected

Definition at line 1533 of file G4QGSParticipants.cc.

1534{
1535 if ( ! theProjectileSplitable ) return false;
1536
1537 const G4double aHugeValue = 1.0e+10;
1538
1539 #ifdef debugQGSParticipants
1540 G4cout<<G4endl<<"DeterminePartonMomenta()......"<<G4endl;
1541 G4cout<<"theProjectile status (0 -nondiffr, #0 diffr./reggeon): "<<theProjectileSplitable->GetStatus()<<G4endl;
1542 #endif
1543
1544 if (theProjectileSplitable->GetStatus() != 0) {return false;} // There were only diffractive interactions.
1545
1546 G4LorentzVector Projectile4Momentum = theProjectileSplitable->Get4Momentum();
1547 G4LorentzVector Psum = Projectile4Momentum;
1548
1549 G4double VqM_pr(0.), VaqM_pr(0.), VqM_tr(350.), VqqM_tr(700);
1550 if (std::abs(theProjectile.GetDefinition()->GetBaryonNumber()) != 0) {VqM_pr=350*MeV; VaqM_pr=700*MeV;}
1551
1552 #ifdef debugQGSParticipants
1553 G4cout<<"Projectile 4 momentum "<<Psum<<G4endl
1554 <<"Target nucleon momenta at start"<<G4endl;
1555 #endif
1556
1557 std::vector<G4VSplitableHadron*>::iterator i;
1558 G4int NuclNo=0;
1559
1560 for (i = theTargets.begin(); i != theTargets.end(); i++ )
1561 {
1562 Psum += (*i)->Get4Momentum();
1563 #ifdef debugQGSParticipants
1564 G4cout<<"Nusleus nucleon # and its 4Mom. "<<NuclNo<<" "<<(*i)->Get4Momentum()<<G4endl;
1565 #endif
1566 NuclNo++;
1567 }
1568
1569 G4LorentzRotation toCms( -1*Psum.boostVector() );
1570
1571 G4LorentzVector Ptmp = toCms*Projectile4Momentum;
1572
1573 toCms.rotateZ( -1*Ptmp.phi() );
1574 toCms.rotateY( -1*Ptmp.theta() );
1575 G4LorentzRotation toLab(toCms.inverse());
1576 Projectile4Momentum.transform( toCms );
1577 // Ptarget.transform( toCms );
1578
1579 #ifdef debugQGSParticipants
1580 G4cout<<G4endl<<"In CMS---------------"<<G4endl;
1581 G4cout<<"Projectile 4 Mom "<<Projectile4Momentum<<G4endl;
1582 #endif
1583
1584 NuclNo=0;
1585 G4LorentzVector Target4Momentum(0.,0.,0.,0.);
1586 for(i = theTargets.begin(); i != theTargets.end(); i++ )
1587 {
1588 G4LorentzVector tmp= (*i)->Get4Momentum(); tmp.transform( toCms );
1589 (*i)->Set4Momentum( tmp );
1590 #ifdef debugQGSParticipants
1591 G4cout<<"Target nucleon # and 4Mom "<<" "<<NuclNo<<" "<<(*i)->Get4Momentum()<<G4endl;
1592 #endif
1593 Target4Momentum += tmp;
1594 NuclNo++;
1595 }
1596
1597 G4double S = Psum.mag2();
1598 G4double SqrtS = std::sqrt(S);
1599
1600 #ifdef debugQGSParticipants
1601 G4cout<<"Sum of target nucleons 4 momentum "<<Target4Momentum<<G4endl<<G4endl;
1602 G4cout<<"Target nucleons mom: px, py, z_1, m_i"<<G4endl;
1603 #endif
1604
1605 //G4double PplusProjectile = Projectile4Momentum.plus();
1606 G4double PminusTarget = Target4Momentum.minus();
1607 NuclNo=0;
1608
1609 for(i = theTargets.begin(); i != theTargets.end(); i++ )
1610 {
1611 G4LorentzVector tmp = (*i)->Get4Momentum(); // tmp.boost(bstToCM);
1612
1613 //AR-19Jan2017 : the following line is causing a strange crash when Geant4
1614 // is built in optimized mode.
1615 // To fix it, I get the mass square instead of directly the
1616 // mass from the Lorentz vector, and then I take care of the
1617 // square root. If the mass square is negative, a JustWarning
1618 // exception is thrown, and the mass is set to 0.
1619 //G4double Mass = tmp.mag();
1620 G4double Mass2 = tmp.mag2();
1621 G4double Mass = 0.0;
1622 if ( Mass2 < 0.0 ) {
1624 ed << "Projectile " << theProjectile.GetDefinition()->GetParticleName()
1625 << "  4-momentum " << Psum << G4endl;
1626 ed << "LorentzVector tmp " << tmp << " with Mass2 " << Mass2 << G4endl;
1627 G4Exception( "G4QGSParticipants::DeterminePartonMomenta(): 4-momentum with negative mass!",
1628 "HAD_QGSPARTICIPANTS_001", JustWarning, ed );
1629 } else {
1630 Mass = std::sqrt( Mass2 );
1631 }
1632
1633 tmp.setPz(tmp.minus()/PminusTarget); tmp.setE(Mass);
1634 (*i)->Set4Momentum(tmp);
1635 #ifdef debugQGSParticipants
1636 G4cout<<"Target nucleons # and mom: "<<NuclNo<<" "<<(*i)->Get4Momentum()<<G4endl;
1637 #endif
1638 NuclNo++;
1639 }
1640
1641 //+++++++++++++++++++++++++++++++++++++++++++
1642
1643 G4double SigPt = sigmaPt;
1644 G4Parton* aParton(0);
1645 G4ThreeVector aPtVector(0.,0.,0.);
1646 G4LorentzVector tmp(0.,0.,0.,0.);
1647
1648 G4double Mt(0.);
1649 G4double ProjSumMt(0.), ProjSumMt2perX(0.);
1650 G4double TargSumMt(0.), TargSumMt2perX(0.);
1651
1652
1653 G4double aBeta = beta; // Member of the class
1654
1655 const G4ParticleDefinition* theProjectileDefinition = theProjectileSplitable->GetDefinition();
1656 if (theProjectileDefinition == G4PionMinus::PionMinusDefinition()) aBeta = 1.;
1657 if (theProjectileDefinition == G4Gamma::GammaDefinition()) aBeta = 1.;
1658 if (theProjectileDefinition == G4PionPlus::PionPlusDefinition()) aBeta = 1.;
1659 if (theProjectileDefinition == G4PionZero::PionZeroDefinition()) aBeta = 1.;
1660 if (theProjectileDefinition == G4KaonPlus::KaonPlusDefinition()) aBeta = 0.;
1661 if (theProjectileDefinition == G4KaonMinus::KaonMinusDefinition()) aBeta = 0.;
1662
1663 G4double Xmin = 0.;
1664
1665 G4bool Success = true; G4int attempt = 0;
1666 const G4int maxNumberOfAttempts = 1000;
1667 do
1668 {
1669 attempt++; if( attempt == 100*(attempt/100) ) {SigPt/=2.;}
1670
1671 ProjSumMt=0.; ProjSumMt2perX=0.;
1672 TargSumMt=0.; TargSumMt2perX=0.;
1673
1674 Success = true;
1676 #ifdef debugQGSParticipants
1677 G4cout<<"attempt ------------------------ "<<attempt<<G4endl;
1678 G4cout<<"nSeaPair of proj "<<nSeaPair<<G4endl;
1679 #endif
1680
1681 G4double SumPx = 0.;
1682 G4double SumPy = 0.;
1683 G4double SumZ = 0.;
1684 G4int NumberOfUnsampledSeaQuarks = 2*nSeaPair;
1685
1686 G4double Qmass=0.;
1687 for (G4int aSeaPair = 0; aSeaPair < nSeaPair; aSeaPair++)
1688 {
1689 aParton = theProjectileSplitable->GetNextParton(); // for quarks
1690 #ifdef debugQGSParticipants
1691 G4cout<<"Sea quarks: "<<aSeaPair<<" "<<aParton->GetDefinition()->GetParticleName();
1692 #endif
1693 aPtVector = GaussianPt(SigPt, aHugeValue);
1694 tmp.setPx(aPtVector.x()); tmp.setPy(aPtVector.y());
1695 SumPx += aPtVector.x(); SumPy += aPtVector.y();
1696 Mt = std::sqrt(aPtVector.mag2()+sqr(Qmass));
1697 ProjSumMt += Mt;
1698
1699 // Sampling of Z fraction
1700 tmp.setPz(SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1701 SumZ += tmp.z();
1702
1703 NumberOfUnsampledSeaQuarks--;
1704 ProjSumMt2perX +=sqr(Mt)/tmp.pz();
1705 tmp.setE(sqr(Mt));
1706 aParton->Set4Momentum(tmp);
1707
1708 aParton = theProjectileSplitable->GetNextAntiParton(); // for anti-quarks
1709 #ifdef debugQGSParticipants
1710 G4cout<<" "<<aParton->GetDefinition()->GetParticleName()<<G4endl;
1711 G4cout<<" "<<tmp<<" "<<SumZ<<G4endl;
1712 #endif
1713 aPtVector = GaussianPt(SigPt, aHugeValue);
1714 tmp.setPx(aPtVector.x()); tmp.setPy(aPtVector.y());
1715 SumPx += aPtVector.x(); SumPy += aPtVector.y();
1716 Mt = std::sqrt(aPtVector.mag2()+sqr(Qmass));
1717 ProjSumMt += Mt;
1718
1719 // Sampling of Z fraction
1720 tmp.setPz(SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1721 SumZ += tmp.z();
1722
1723 NumberOfUnsampledSeaQuarks--;
1724 ProjSumMt2perX +=sqr(Mt)/tmp.pz();
1725 tmp.setE(sqr(Mt));
1726 aParton->Set4Momentum(tmp);
1727 #ifdef debugQGSParticipants
1728 G4cout<<" "<<tmp<<" "<<SumZ<<G4endl;
1729 #endif
1730 }
1731
1732 // For valence quark
1733 aParton = theProjectileSplitable->GetNextParton(); // for quarks
1734 #ifdef debugQGSParticipants
1735 G4cout<<"Val quark of Pr"<<" "<<aParton->GetDefinition()->GetParticleName();
1736 #endif
1737 aPtVector = GaussianPt(SigPt, aHugeValue);
1738 tmp.setPx(aPtVector.x()); tmp.setPy(aPtVector.y());
1739 SumPx += aPtVector.x(); SumPy += aPtVector.y();
1740 Mt = std::sqrt(aPtVector.mag2()+sqr(VqM_pr));
1741 ProjSumMt += Mt;
1742
1743 // Sampling of Z fraction
1744 tmp.setPz(SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1745 SumZ += tmp.z();
1746
1747 ProjSumMt2perX +=sqr(Mt)/tmp.pz();
1748 tmp.setE(sqr(Mt));
1749 aParton->Set4Momentum(tmp);
1750
1751 // For valence di-quark
1753 #ifdef debugQGSParticipants
1754 G4cout<<" "<<aParton->GetDefinition()->GetParticleName()<<G4endl;
1755 G4cout<<" "<<tmp<<" "<<SumZ<<" (z-fraction)"<<G4endl;
1756 #endif
1757 tmp.setPx(-SumPx); tmp.setPy(-SumPy);
1758 //Uzhi 2019 Mt = std::sqrt(aPtVector.mag2()+sqr(VaqM_pr));
1759 Mt = std::sqrt( sqr(SumPx) + sqr(SumPy) + sqr(VaqM_pr) ); //Uzhi 2019
1760 ProjSumMt += Mt;
1761 tmp.setPz(1.-SumZ);
1762
1763 ProjSumMt2perX +=sqr(Mt)/tmp.pz(); // QQmass=750 MeV
1764 tmp.setE(sqr(Mt));
1765 aParton->Set4Momentum(tmp);
1766 #ifdef debugQGSParticipants
1767 G4cout<<" "<<tmp<<" "<<SumZ+(1.-SumZ)<<" (z-fraction)"<<G4endl;
1768 #endif
1769
1770 // End of work with the projectile
1771
1772 // Work with target nucleons
1773
1774 NuclNo=0;
1775 for(i = theTargets.begin(); i != theTargets.end(); i++ )
1776 {
1777 nSeaPair = (*i)->GetSoftCollisionCount()-1;
1778 #ifdef debugQGSParticipants
1779 G4cout<<"nSeaPair of target N "<<nSeaPair<<G4endl
1780 <<"Target nucleon 4Mom "<<(*i)->Get4Momentum()<<G4endl;
1781 #endif
1782
1783 SumPx = (*i)->Get4Momentum().px() * (-1.);
1784 SumPy = (*i)->Get4Momentum().py() * (-1.);
1785 SumZ = 0.;
1786
1787 NumberOfUnsampledSeaQuarks = 2*nSeaPair;
1788
1789 Qmass=0;
1790 for (G4int aSeaPair = 0; aSeaPair < nSeaPair; aSeaPair++)
1791 {
1792 aParton = (*i)->GetNextParton(); // for quarks
1793 #ifdef debugQGSParticipants
1794 G4cout<<"Sea quarks: "<<aSeaPair<<" "<<aParton->GetDefinition()->GetParticleName();
1795 #endif
1796 aPtVector = GaussianPt(SigPt, aHugeValue);
1797 tmp.setPx(aPtVector.x()); tmp.setPy(aPtVector.y());
1798 SumPx += aPtVector.x(); SumPy += aPtVector.y();
1799 Mt=std::sqrt(aPtVector.mag2()+sqr(Qmass));
1800 TargSumMt += Mt;
1801
1802 // Sampling of Z fraction
1803 tmp.setPz(SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1804 SumZ += tmp.z();
1805 tmp.setPz((*i)->Get4Momentum().pz()*tmp.pz());
1806 NumberOfUnsampledSeaQuarks--;
1807 TargSumMt2perX +=sqr(Mt)/tmp.pz();
1808 tmp.setE(sqr(Mt));
1809 aParton->Set4Momentum(tmp);
1810
1811 aParton = (*i)->GetNextAntiParton(); // for anti-quarks
1812 #ifdef debugQGSParticipants
1813 G4cout<<" "<<aParton->GetDefinition()->GetParticleName()<<G4endl;
1814 G4cout<<" "<<tmp<<" "<<SumZ<<G4endl;
1815 #endif
1816 aPtVector = GaussianPt(SigPt, aHugeValue);
1817 tmp.setPx(aPtVector.x()); tmp.setPy(aPtVector.y());
1818 SumPx += aPtVector.x(); SumPy += aPtVector.y();
1819 Mt=std::sqrt(aPtVector.mag2()+sqr(Qmass));
1820 TargSumMt += Mt;
1821
1822 // Sampling of Z fraction
1823 tmp.setPz(SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1824 SumZ += tmp.z();
1825 tmp.setPz((*i)->Get4Momentum().pz()*tmp.pz());
1826 NumberOfUnsampledSeaQuarks--;
1827 TargSumMt2perX +=sqr(Mt)/tmp.pz();
1828 tmp.setE(sqr(Mt));
1829 aParton->Set4Momentum(tmp);
1830 #ifdef debugQGSParticipants
1831 G4cout<<" "<<tmp<<" "<<" "<<SumZ<<G4endl;
1832 #endif
1833 }
1834
1835 // Valence quark
1836 aParton = (*i)->GetNextParton(); // for quarks
1837 #ifdef debugQGSParticipants
1838 G4cout<<"Val quark of Tr"<<" "<<aParton->GetDefinition()->GetParticleName();
1839 #endif
1840 aPtVector = GaussianPt(SigPt, aHugeValue);
1841 tmp.setPx(aPtVector.x()); tmp.setPy(aPtVector.y());
1842 SumPx += aPtVector.x(); SumPy += aPtVector.y();
1843 Mt=std::sqrt(aPtVector.mag2()+sqr(VqM_tr));
1844 TargSumMt += Mt;
1845
1846 // Sampling of Z fraction
1847 tmp.setPz(SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta)*(1.0-SumZ));
1848 SumZ += tmp.z();
1849 tmp.setPz((*i)->Get4Momentum().pz()*tmp.pz());
1850 TargSumMt2perX +=sqr(Mt)/tmp.pz();
1851 tmp.setE(sqr(Mt));
1852 aParton->Set4Momentum(tmp);
1853
1854 // Valence di-quark
1855 aParton = (*i)->GetNextAntiParton(); // for quarks
1856 #ifdef debugQGSParticipants
1857 G4cout<<" "<<aParton->GetDefinition()->GetParticleName()<<G4endl;
1858 G4cout<<" "<<tmp<<" "<<SumZ<<" (total z-sum) "<<G4endl;
1859 #endif
1860 tmp.setPx(-SumPx); tmp.setPy(-SumPy);
1861 //Uzhi 2019 Mt=std::sqrt(aPtVector.mag2()+sqr(VqqM_tr));
1862 Mt=std::sqrt( sqr(SumPx) + sqr(SumPy) + sqr(VqqM_tr) ); //Uzhi 2019
1863 TargSumMt += Mt;
1864
1865 tmp.setPz((*i)->Get4Momentum().pz()*(1.0 - SumZ));
1866 TargSumMt2perX +=sqr(Mt)/tmp.pz();
1867 tmp.setE(sqr(Mt));
1868 aParton->Set4Momentum(tmp);
1869 #ifdef debugQGSParticipants
1870 G4cout<<" "<<tmp<<" "<<1.0<<" "<<(*i)->Get4Momentum().pz()<<G4endl;
1871 #endif
1872
1873 } // End of for(i = theTargets.begin(); i != theTargets.end(); i++ )
1874
1875 if( ProjSumMt + TargSumMt > SqrtS ) {
1876 Success = false; continue;}
1877 if( std::sqrt(ProjSumMt2perX) + std::sqrt(TargSumMt2perX) > SqrtS ) {
1878 Success = false; continue;}
1879
1880 } while( (!Success) &&
1881 attempt < maxNumberOfAttempts ); /* Loop checking, 07.08.2015, A.Ribon */
1882
1883 if ( attempt >= maxNumberOfAttempts ) {
1884 return false;
1885 }
1886
1887 //+++++++++++++++++++++++++++++++++++++++++++
1888
1889 G4double DecayMomentum2 = sqr(S) + sqr(ProjSumMt2perX) + sqr(TargSumMt2perX)
1890 - 2.0*S*ProjSumMt2perX - 2.0*S*TargSumMt2perX - 2.0*ProjSumMt2perX*TargSumMt2perX;
1891
1892 G4double targetWminus=( S - ProjSumMt2perX + TargSumMt2perX + std::sqrt( DecayMomentum2 ))/2.0/SqrtS;
1893 G4double projectileWplus = SqrtS - TargSumMt2perX/targetWminus;
1894
1895 G4LorentzVector Tmp(0.,0.,0.,0.);
1896 G4double z(0.);
1897
1899 #ifdef debugQGSParticipants
1900 G4cout<<"Backward transformation ===================="<<G4endl;
1901 G4cout<<"nSeaPair of proj "<<nSeaPair<<G4endl;
1902 #endif
1903
1904 for (G4int aSeaPair = 0; aSeaPair < nSeaPair; aSeaPair++)
1905 {
1906 aParton = theProjectileSplitable->GetNextParton(); // for quarks
1907 #ifdef debugQGSParticipants
1908 G4cout<<"Sea quarks: "<<aSeaPair<<" "<<aParton->GetDefinition()->GetParticleName();
1909 #endif
1910 Tmp =aParton->Get4Momentum(); z=Tmp.z();
1911
1912 Tmp.setPz(projectileWplus*z/2.0 - Tmp.e()/(2.0*z*projectileWplus));
1913 Tmp.setE( projectileWplus*z/2.0 + Tmp.e()/(2.0*z*projectileWplus));
1914 Tmp.transform( toLab );
1915
1916 aParton->Set4Momentum(Tmp);
1917
1918 aParton = theProjectileSplitable->GetNextAntiParton(); // for anti-quarks
1919 #ifdef debugQGSParticipants
1920 G4cout<<" "<<aParton->GetDefinition()->GetParticleName()<<G4endl;
1921 G4cout<<" "<<Tmp<<" "<<Tmp.mag()<<G4endl;
1922 #endif
1923 Tmp =aParton->Get4Momentum(); z=Tmp.z();
1924 Tmp.setPz(projectileWplus*z/2.0 - Tmp.e()/(2.0*z*projectileWplus));
1925 Tmp.setE( projectileWplus*z/2.0 + Tmp.e()/(2.0*z*projectileWplus));
1926 Tmp.transform( toLab );
1927
1928 aParton->Set4Momentum(Tmp);
1929 #ifdef debugQGSParticipants
1930 G4cout<<" "<<Tmp<<" "<<Tmp.mag()<<G4endl;
1931 #endif
1932 }
1933
1934 // For valence quark
1935 aParton = theProjectileSplitable->GetNextParton(); // for quarks
1936 #ifdef debugQGSParticipants
1937 G4cout<<"Val quark of Pr"<<" "<<aParton->GetDefinition()->GetParticleName();
1938 #endif
1939 Tmp =aParton->Get4Momentum(); z=Tmp.z();
1940 Tmp.setPz(projectileWplus*z/2.0 - Tmp.e()/(2.0*z*projectileWplus));
1941 Tmp.setE( projectileWplus*z/2.0 + Tmp.e()/(2.0*z*projectileWplus));
1942 Tmp.transform( toLab );
1943
1944 aParton->Set4Momentum(Tmp);
1945
1946 // For valence di-quark
1948 #ifdef debugQGSParticipants
1949 G4cout<<" "<<aParton->GetDefinition()->GetParticleName()<<G4endl;
1950 G4cout<<" "<<Tmp<<" "<<Tmp.mag()<<" (mass)"<<G4endl;
1951 #endif
1952 Tmp =aParton->Get4Momentum(); z=Tmp.z();
1953 Tmp.setPz(projectileWplus*z/2.0 - Tmp.e()/(2.0*z*projectileWplus));
1954 Tmp.setE( projectileWplus*z/2.0 + Tmp.e()/(2.0*z*projectileWplus));
1955 Tmp.transform( toLab );
1956
1957 aParton->Set4Momentum(Tmp);
1958
1959 #ifdef debugQGSParticipants
1960 G4cout<<" "<<Tmp<<" "<<Tmp.mag()<<" (mass)"<<G4endl;
1961 #endif
1962
1963 // End of work with the projectile
1964
1965 // Work with target nucleons
1966 NuclNo=0;
1967 for(i = theTargets.begin(); i != theTargets.end(); i++ )
1968 {
1969 nSeaPair = (*i)->GetSoftCollisionCount()-1;
1970 #ifdef debugQGSParticipants
1971 G4cout<<"nSeaPair of target and N# "<<nSeaPair<<" "<<NuclNo<<G4endl;
1972 #endif
1973 NuclNo++;
1974 for (G4int aSeaPair = 0; aSeaPair < nSeaPair; aSeaPair++)
1975 {
1976 aParton = (*i)->GetNextParton(); // for quarks
1977 #ifdef debugQGSParticipants
1978 G4cout<<"Sea quarks: "<<aSeaPair<<" "<<aParton->GetDefinition()->GetParticleName();
1979 #endif
1980 Tmp =aParton->Get4Momentum(); z=Tmp.z();
1981 Tmp.setPz(-targetWminus*z/2.0 + Tmp.e()/(2.0*z*targetWminus));
1982 Tmp.setE( targetWminus*z/2.0 + Tmp.e()/(2.0*z*targetWminus));
1983 Tmp.transform( toLab );
1984
1985 aParton->Set4Momentum(Tmp);
1986
1987 aParton = (*i)->GetNextAntiParton(); // for quarks
1988 #ifdef debugQGSParticipants
1989 G4cout<<" "<<aParton->GetDefinition()->GetParticleName()<<G4endl;
1990 G4cout<<" "<<Tmp<<" "<<Tmp.mag()<<G4endl;
1991 #endif
1992 Tmp =aParton->Get4Momentum(); z=Tmp.z();
1993 Tmp.setPz(-targetWminus*z/2.0 + Tmp.e()/(2.0*z*targetWminus));
1994 Tmp.setE( targetWminus*z/2.0 + Tmp.e()/(2.0*z*targetWminus));
1995 Tmp.transform( toLab );
1996
1997 aParton->Set4Momentum(Tmp);
1998 #ifdef debugQGSParticipants
1999 G4cout<<" "<<Tmp<<" "<<Tmp.mag()<<G4endl;
2000 #endif
2001 }
2002
2003 // Valence quark
2004
2005 aParton = (*i)->GetNextParton(); // for quarks
2006 #ifdef debugQGSParticipants
2007 G4cout<<"Val quark of Tr"<<" "<<aParton->GetDefinition()->GetParticleName();
2008 #endif
2009 Tmp =aParton->Get4Momentum(); z=Tmp.z();
2010 Tmp.setPz(-targetWminus*z/2.0 + Tmp.e()/(2.0*z*targetWminus));
2011 Tmp.setE( targetWminus*z/2.0 + Tmp.e()/(2.0*z*targetWminus));
2012 Tmp.transform( toLab );
2013
2014 aParton->Set4Momentum(Tmp);
2015
2016 // Valence di-quark
2017 aParton = (*i)->GetNextAntiParton(); // for quarks
2018 #ifdef debugQGSParticipants
2019 G4cout<<" "<<aParton->GetDefinition()->GetParticleName()<<G4endl;
2020 G4cout<<" "<<Tmp<<" "<<Tmp.mag()<<" (mass)"<<G4endl;
2021 #endif
2022 Tmp =aParton->Get4Momentum(); z=Tmp.z();
2023 Tmp.setPz(-targetWminus*z/2.0 + Tmp.e()/(2.0*z*targetWminus));
2024 Tmp.setE( targetWminus*z/2.0 + Tmp.e()/(2.0*z*targetWminus));
2025 Tmp.transform( toLab );
2026
2027 aParton->Set4Momentum(Tmp);
2028 #ifdef debugQGSParticipants
2029 G4cout<<" "<<Tmp<<" "<<Tmp.mag()<<" (mass)"<<G4endl;
2030 #endif
2031 NuclNo++;
2032 } // End of for(i = theTargets.begin(); i != theTargets.end(); i++ )
2033
2034 return true;
2035}
G4double S(G4double temp)
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
double theta() const
Hep3Vector boostVector() const
double minus() const
HepLorentzVector & rotateZ(double)
HepLorentzVector & rotateY(double)
HepLorentzVector & transform(const HepRotation &)
static G4Gamma * GammaDefinition()
Definition: G4Gamma.cc:80
static G4KaonMinus * KaonMinusDefinition()
Definition: G4KaonMinus.cc:107
static G4KaonPlus * KaonPlusDefinition()
Definition: G4KaonPlus.cc:107
static G4PionMinus * PionMinusDefinition()
Definition: G4PionMinus.cc:92
static G4PionPlus * PionPlusDefinition()
Definition: G4PionPlus.cc:92
static G4PionZero * PionZeroDefinition()
Definition: G4PionZero.cc:102
G4double SampleX(G4double anXmin, G4int nSea, G4int theTotalSea, G4double aBeta)
G4ThreeVector GaussianPt(G4double AveragePt2, G4double maxPtSquare) const
const G4LorentzVector & Get4Momentum() const

References beta, CLHEP::HepLorentzVector::boostVector(), CLHEP::HepLorentzVector::e(), G4cout, G4endl, G4Exception(), G4Gamma::GammaDefinition(), GaussianPt(), G4VSplitableHadron::Get4Momentum(), G4Parton::Get4Momentum(), G4ParticleDefinition::GetBaryonNumber(), G4Parton::GetDefinition(), G4VSplitableHadron::GetDefinition(), G4ReactionProduct::GetDefinition(), G4QGSMSplitableHadron::GetNextAntiParton(), G4QGSMSplitableHadron::GetNextParton(), G4ParticleDefinition::GetParticleName(), G4VSplitableHadron::GetSoftCollisionCount(), G4VSplitableHadron::GetStatus(), CLHEP::HepLorentzRotation::inverse(), JustWarning, G4KaonMinus::KaonMinusDefinition(), G4KaonPlus::KaonPlusDefinition(), CLHEP::HepLorentzVector::mag(), CLHEP::HepLorentzVector::mag2(), CLHEP::Hep3Vector::mag2(), MeV, CLHEP::HepLorentzVector::minus(), CLHEP::HepLorentzVector::phi(), G4PionMinus::PionMinusDefinition(), G4PionPlus::PionPlusDefinition(), G4PionZero::PionZeroDefinition(), CLHEP::HepLorentzVector::pz(), CLHEP::HepLorentzRotation::rotateY(), CLHEP::HepLorentzRotation::rotateZ(), S(), SampleX(), G4Parton::Set4Momentum(), CLHEP::HepLorentzVector::setE(), CLHEP::HepLorentzVector::setPx(), CLHEP::HepLorentzVector::setPy(), CLHEP::HepLorentzVector::setPz(), sigmaPt, sqr(), theProjectile, theProjectileSplitable, CLHEP::HepLorentzVector::theta(), theTargets, CLHEP::HepLorentzVector::transform(), CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), and CLHEP::HepLorentzVector::z().

Referenced by BuildInteractions().

◆ DoLorentzBoost()

virtual void G4QGSParticipants::DoLorentzBoost ( G4ThreeVector  aBoost)
inlinevirtual

Definition at line 55 of file G4QGSParticipants.hh.

56 {
57 theCurrentVelocity = -aBoost;
59 theBoost = aBoost;
60 }
G4ThreeVector theBoost
virtual void DoLorentzBoost(const G4LorentzVector &theBoost)=0

References G4V3DNucleus::DoLorentzBoost(), theBoost, theCurrentVelocity, and G4VParticipants::theNucleus.

Referenced by PrepareInitialState().

◆ FinalizeKinematics()

G4bool G4QGSParticipants::FinalizeKinematics ( const G4double  w,
const G4bool  isProjectileNucleus,
const G4LorentzRotation boostFromCmsToLab,
const G4double  residualMass,
const G4int  residualMassNumber,
const G4int  numberOfInvolvedNucleons,
G4Nucleon involvedNucleons[],
G4LorentzVector residual4Momentum 
)
private

Definition at line 1381 of file G4QGSParticipants.cc.

1389 { // output parameter
1390
1391 // This method, which is called only by PutOnMassShell, finalizes the kinematics:
1392 // this method is called when we are sure that the sampling of the kinematics is
1393 // acceptable.
1394 // This method assumes that all the parameters have been initialized by the caller;
1395 // notice that the input boolean parameter isProjectileNucleus is meant to be true
1396 // only in the case of nucleus or antinucleus projectile: this information is needed
1397 // because the sign of pz (in the center-of-mass frame) in this case is opposite
1398 // with respect to the case of a normal hadron projectile.
1399 // The action of this method consists in modifying the momenta of the nucleons
1400 // (in the lab frame) and computing the residual 4-momentum (in the center-of-mass
1401 // frame).
1402
1403 G4ThreeVector residual3Momentum( 0.0, 0.0, 1.0 );
1404
1405 for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1406 G4Nucleon* aNucleon = involvedNucleons[i];
1407 if ( ! aNucleon ) continue;
1408 G4LorentzVector tmp = aNucleon->Get4Momentum();
1409 residual3Momentum -= tmp.vect();
1410 G4double mt2 = sqr( tmp.x() ) + sqr( tmp.y() ) +
1411 sqr( aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass() );
1412 G4double x = tmp.z();
1413 G4double pz = -w * x / 2.0 + mt2 / ( 2.0 * w * x );
1414 G4double e = w * x / 2.0 + mt2 / ( 2.0 * w * x );
1415 // Reverse the sign of pz in the case of nucleus or antinucleus projectile
1416 if ( isProjectileNucleus ) pz *= -1.0;
1417 tmp.setPz( pz );
1418 tmp.setE( e );
1419 tmp.transform( boostFromCmsToLab );
1420 aNucleon->SetMomentum( tmp );
1421 G4VSplitableHadron* splitableHadron = aNucleon->GetSplitableHadron();
1422 splitableHadron->Set4Momentum( tmp );
1423 #ifdef debugPutOnMassShell
1424 G4cout << "Target involved nucleon No, name, 4Mom "
1425 << i<<" "<<aNucleon->GetDefinition()->GetParticleName()<<" "<<tmp<< G4endl;
1426 #endif
1427 }
1428
1429 G4double residualMt2 = sqr( residualMass ) + sqr( residual3Momentum.x() )
1430 + sqr( residual3Momentum.y() );
1431
1432 #ifdef debugPutOnMassShell
1433 G4cout <<G4endl<< "w residual3Momentum.z() " << w << " " << residual3Momentum.z() << G4endl;
1434 #endif
1435
1436 G4double residualPz = 0.0;
1437 G4double residualE = 0.0;
1438 if ( residualMassNumber != 0 ) {
1439 residualPz = -w * residual3Momentum.z() / 2.0 +
1440 residualMt2 / ( 2.0 * w * residual3Momentum.z() );
1441 residualE = w * residual3Momentum.z() / 2.0 +
1442 residualMt2 / ( 2.0 * w * residual3Momentum.z() );
1443 // Reverse the sign of residualPz in the case of nucleus or antinucleus projectile
1444 if ( isProjectileNucleus ) residualPz *= -1.0;
1445 }
1446
1447 residual4Momentum.setPx( residual3Momentum.x() );
1448 residual4Momentum.setPy( residual3Momentum.y() );
1449 residual4Momentum.setPz( residualPz );
1450 residual4Momentum.setE( residualE );
1451
1452 return true;
1453}
Hep3Vector vect() const
void SetMomentum(G4LorentzVector &aMomentum)
Definition: G4Nucleon.hh:70
void Set4Momentum(const G4LorentzVector &a4Momentum)

References G4cout, G4endl, G4Nucleon::Get4Momentum(), G4VSplitableHadron::GetDefinition(), G4Nucleon::GetDefinition(), G4ParticleDefinition::GetParticleName(), G4ParticleDefinition::GetPDGMass(), G4Nucleon::GetSplitableHadron(), G4VSplitableHadron::Set4Momentum(), CLHEP::HepLorentzVector::setE(), G4Nucleon::SetMomentum(), CLHEP::HepLorentzVector::setPx(), CLHEP::HepLorentzVector::setPy(), CLHEP::HepLorentzVector::setPz(), sqr(), CLHEP::HepLorentzVector::transform(), CLHEP::HepLorentzVector::vect(), CLHEP::HepLorentzVector::x(), CLHEP::Hep3Vector::x(), CLHEP::HepLorentzVector::y(), CLHEP::Hep3Vector::y(), CLHEP::HepLorentzVector::z(), and CLHEP::Hep3Vector::z().

Referenced by PutOnMassShell().

◆ GaussianPt()

G4ThreeVector G4QGSParticipants::GaussianPt ( G4double  AveragePt2,
G4double  maxPtSquare 
) const
private

Definition at line 1016 of file G4QGSParticipants.cc.

1016 {
1017 // @@ this method is used in FTFModel as well. Should go somewhere common!
1018
1019 G4double Pt2( 0.0 ), Pt(0.0);
1020 if ( AveragePt2 > 0.0 ) {
1021 G4double x = maxPtSquare/AveragePt2;
1022 Pt2 = (x < 200) ?
1023 -AveragePt2 * G4Log( 1.0 + G4UniformRand() * ( G4Exp( -x ) -1.0 ) )
1024 : -AveragePt2 * G4Log( 1.0 - G4UniformRand() );
1025 Pt = std::sqrt( Pt2 );
1026 }
1027 G4double phi = G4UniformRand() * twopi;
1028
1029 return G4ThreeVector( Pt*std::cos(phi), Pt*std::sin(phi), 0.0 );
1030}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:179
static constexpr double twopi
Definition: G4SIunits.hh:56

References G4Exp(), G4Log(), G4UniformRand, and twopi.

Referenced by DeterminePartonMomenta(), and SamplingNucleonKinematics().

◆ GenerateDeltaIsobar()

G4bool G4QGSParticipants::GenerateDeltaIsobar ( const G4double  sqrtS,
const G4int  numberOfInvolvedNucleons,
G4Nucleon involvedNucleons[],
G4double sumMasses 
)
private

Definition at line 1115 of file G4QGSParticipants.cc.

1119 { // input & output parameter
1120
1121 // This method, which is called only by PutOnMassShell, check whether is possible to
1122 // re-interpret some of the involved nucleons as delta-isobars:
1123 // - either by replacing a proton (2212) with a Delta+ (2214),
1124 // - or by replacing a neutron (2112) with a Delta0 (2114).
1125 // The on-shell mass of these delta-isobars is ~1232 MeV, so ~292-294 MeV heavier than
1126 // the corresponding nucleon on-shell mass. However 400.0*MeV is considered to estimate
1127 // the max number of deltas compatible with the available energy.
1128 // The delta-isobars are considered with the same transverse momentum as their
1129 // corresponding nucleons.
1130 // This method assumes that all the parameters have been initialized by the caller;
1131 // the action of this method consists in modifying (eventually) involveNucleons and
1132 // sumMasses. The return value is "false" only in the case that the input parameters
1133 // have unphysical values.
1134
1135 if ( sqrtS < 0.0 || numberOfInvolvedNucleons <= 0 || sumMasses < 0.0 ) return false;
1136
1137 //const G4double ProbDeltaIsobar = 0.05; // Uzhi 6.07.2012
1138 //const G4double ProbDeltaIsobar = 0.25; // Uzhi 13.06.2013
1139 const G4double probDeltaIsobar = 0.10; // A.R. 07.08.2013
1140
1141 G4int maxNumberOfDeltas = G4int( (sqrtS - sumMasses)/(400.0*MeV) );
1142 G4int numberOfDeltas = 0;
1143
1144 for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1145 //G4cout << "i maxNumberOfDeltas probDeltaIsobar " << i << " " << maxNumberOfDeltas
1146 // << " " << probDeltaIsobar << G4endl;
1147 if ( G4UniformRand() < probDeltaIsobar && numberOfDeltas < maxNumberOfDeltas ) {
1148 numberOfDeltas++;
1149 if ( ! involvedNucleons[i] ) continue;
1150 G4VSplitableHadron* splitableHadron = involvedNucleons[i]->GetSplitableHadron();
1151 G4double massNuc = std::sqrt( sqr( splitableHadron->GetDefinition()->GetPDGMass() )
1152 + splitableHadron->Get4Momentum().perp2() );
1153 //AR The absolute value below is needed in the case of an antinucleus.
1154 G4int pdgCode = std::abs( splitableHadron->GetDefinition()->GetPDGEncoding() );
1155 const G4ParticleDefinition* old_def = splitableHadron->GetDefinition();
1156 G4int newPdgCode = pdgCode/10; newPdgCode = newPdgCode*10 + 4; // Delta
1157 if ( splitableHadron->GetDefinition()->GetPDGEncoding() < 0 ) newPdgCode *= -1;
1158 const G4ParticleDefinition* ptr =
1160 splitableHadron->SetDefinition( ptr );
1161 G4double massDelta = std::sqrt( sqr( splitableHadron->GetDefinition()->GetPDGMass() )
1162 + splitableHadron->Get4Momentum().perp2() );
1163 //G4cout << i << " " << sqrtS/GeV << " " << sumMasses/GeV << " " << massDelta/GeV
1164 // << " " << massNuc << G4endl;
1165 if ( sqrtS < sumMasses + massDelta - massNuc ) { // Change cannot be accepted!
1166 splitableHadron->SetDefinition( old_def );
1167 break;
1168 } else { // Change is accepted
1169 sumMasses += ( massDelta - massNuc );
1170 }
1171 }
1172 }
1173 //G4cout << "maxNumberOfDeltas numberOfDeltas " << maxNumberOfDeltas << " "
1174 // << numberOfDeltas << G4endl;
1175 return true;
1176}
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
void SetDefinition(const G4ParticleDefinition *aDefinition)

References G4ParticleTable::FindParticle(), G4UniformRand, G4VSplitableHadron::Get4Momentum(), G4VSplitableHadron::GetDefinition(), G4ParticleTable::GetParticleTable(), G4ParticleDefinition::GetPDGEncoding(), G4ParticleDefinition::GetPDGMass(), G4Nucleon::GetSplitableHadron(), MeV, CLHEP::HepLorentzVector::perp2(), G4VSplitableHadron::SetDefinition(), and sqr().

Referenced by PutOnMassShell().

◆ GetCofNuclearDestruction()

G4double G4QGSParticipants::GetCofNuclearDestruction ( )
inlineprivate

Definition at line 265 of file G4QGSParticipants.hh.

265 {
267}

References CofNuclearDestruction.

Referenced by ReggeonCascade().

◆ GetDofNuclearDestruction()

G4double G4QGSParticipants::GetDofNuclearDestruction ( )
inlineprivate

Definition at line 277 of file G4QGSParticipants.hh.

277 {
279}

References DofNuclearDestruction.

Referenced by PutOnMassShell().

◆ GetExcitationEnergyPerWoundedNucleon()

G4double G4QGSParticipants::GetExcitationEnergyPerWoundedNucleon ( )
inlineprivate

Definition at line 273 of file G4QGSParticipants.hh.

273 {
275}

References ExcitationEnergyPerWoundedNucleon.

Referenced by ComputeNucleusProperties().

◆ GetList()

void G4QGSParticipants::GetList ( const G4ReactionProduct thePrimary)
private

Definition at line 335 of file G4QGSParticipants.cc.

335 {
336 #ifdef debugQGSParticipants
337 G4cout<<G4endl<<"G4QGSParticipants::GetList +++++++++++++"<<G4endl;
338 #endif
339
340 // Direction: True - Proj, False - Target
343
344 G4LorentzVector aPrimaryMomentum(thePrimary.GetMomentum(), thePrimary.GetTotalEnergy());
345 G4LorentzVector aNucleonMomentum(0.,0.,0., 938.0*MeV);
346
347 G4double SS=(aPrimaryMomentum + aNucleonMomentum).mag2();
348
349 Regge->SetS(SS);
350
351 //--------------------------------------
353 G4Nucleon * tNucleon = theNucleus->GetNextNucleon();
354
355 if ( ! tNucleon ) {
356 #ifdef debugQGSParticipants
357 G4cout << "QGSM - BAD situation: pNucleon is NULL ! Leaving immediately!" << G4endl;
358 #endif
359 return;
360 }
361
362 G4double theNucleusOuterR = theNucleus->GetOuterRadius();
363
364 if (theNucleus->GetMassNumber() == 1)
365 {
366 G4ThreeVector aPos = G4ThreeVector(0.,0.,0.);
367 tNucleon->SetPosition(aPos);
368 theNucleusOuterR = 0.;
369 }
370
371 // Determination of participating nucleons of nucleus ------------------------------------
372
373 std::for_each(theInteractions.begin(), theInteractions.end(), DeleteInteractionContent());
374 theInteractions.clear();
375
376 G4int MaxPower=thePrimary.GetMomentum().mag()/(3.3*GeV); if(MaxPower < 1) MaxPower=1;
377
378 const G4int maxNumberOfLoops = 1000;
379
380 G4int NumberOfTries = 0;
381 G4double Scale = 1.0;
382
383 G4int loopCounter = -1;
384 while( (theInteractions.size() == 0) && ++loopCounter < maxNumberOfLoops )
385 {
386 InteractionMode = ALL; // Mode = ALL, WITHOUT_R, NON_DIFF
387
388 // choose random impact parameter of a collision
389 std::pair<G4double, G4double> theImpactParameter;
390
391 NumberOfTries++;
392 if( NumberOfTries == 100*(NumberOfTries/100) ) Scale /=2.0;
393
394 theImpactParameter = theNucleus->ChooseImpactXandY(theNucleusOuterR/Scale + theNucleonRadius);
395 G4double impactX = theImpactParameter.first;
396 G4double impactY = theImpactParameter.second;
397
398 #ifdef debugQGSParticipants
399 G4cout<<"InteractionMode "<<InteractionMode<<G4endl;
400 G4cout<<"Impact parameter (fm ) "<<std::sqrt(sqr(impactX)+sqr(impactY))/fermi<<" "<<G4endl;
401 #endif
402
403 // loop over nucleons to find collisions
405 G4int nucleonCount = -1;
407
408 G4double Power=MaxPower;
409
410 while( (tNucleon = theNucleus->GetNextNucleon()) )
411 {
412 if(Power <= 0.) break;
413 nucleonCount++;
414
415 G4LorentzVector nucleonMomentum=tNucleon->Get4Momentum();
416
417 G4double Distance2 = sqr(impactX - tNucleon->GetPosition().x()) +
418 sqr(impactY - tNucleon->GetPosition().y());
419
420 G4double Pint(0.); // A probability of interaction at given impact parameter
421 G4double Pprd(0.), Ptrd(0.), Pdd(0.); // Probabilities of Proj. diffr., Target diffr., Double diffr.
422 G4double Pnd (0.), Pnvr(0.); // Probabilities of non-diffr. and quark exchange
423 G4int NcutPomerons(0); // Number of cutted pomerons
424
425 Regge->GetProbabilities(std::sqrt(Distance2), InteractionMode,
426 Pint, Pprd, Ptrd, Pdd, Pnd, Pnvr);
427 #ifdef debugQGSParticipants
428 G4cout<<"Nucleon & its impact parameter: "<<nucleonCount<<" "<<std::sqrt(Distance2)/fermi<<" (fm)"<<G4endl;
429 G4cout<<"Probability of interaction: "<<Pint<<G4endl;
430 G4cout<<"Probability of PrD, TrD, DD: "<<Pprd<<" "<<Ptrd<<" "<<Pdd<<G4endl;
431 G4cout<<"Probability of NonDiff, QuarkExc.: "<<Pnd<<" "<<Pnvr<<" in inel. inter."<<G4endl;
432 #endif
433
434 if (Pint > G4UniformRand())
435 { // An interaction is happend.
436
437 G4double rndNumber = G4UniformRand();
438 G4int InteractionType(0);
439
440 if((InteractionMode==ALL)||(InteractionMode==WITHOUT_R)) // Mode = ALL, WITHOUT_R, NON_DIFF
441 {
442 if( rndNumber < Pprd ) {InteractionType = PrD; InteractionMode = WITHOUT_R;}
443 else if( rndNumber < Pprd+Ptrd) {InteractionType = TrD; InteractionMode = WITHOUT_R;}
444 else if( rndNumber < Pprd+Ptrd+Pdd) {InteractionType = DD; InteractionMode = WITHOUT_R;}
445 else if( rndNumber < Pprd+Ptrd+Pdd+Pnd ) {InteractionType = NonD; InteractionMode = NON_DIFF;
446 NcutPomerons = Regge->ncPomerons(); }
447 else {InteractionType = Qexc; InteractionMode = ALL; }
448 }
449 else // InteractionMode == NON_DIFF
450 {
452 if( rndNumber < Ptrd ) {InteractionType = TrD; }
453 else if( rndNumber < Ptrd + Pnd) {InteractionType = NonD; NcutPomerons = Regge->ncPomerons();}
454 }
455
456 if( (InteractionType == NonD) && (NcutPomerons == 0)) continue;
457
459 G4QGSMSplitableHadron* aTargetSPB = new G4QGSMSplitableHadron(*tNucleon);
460 tNucleon->Hit(aTargetSPB);
461
462 #ifdef debugQGSParticipants
463 G4cout<<"An interaction is happend."<<G4endl;
464 G4cout<<"Target nucleon - "<<nucleonCount<<" "
465 <<tNucleon->GetDefinition()->GetParticleName()<<G4endl;
466 G4cout<<"Interaction type:"<<InteractionType
467 <<" (0 -PrD, 1 - TrD, 2 - DD, 3 - NonD, 4 - Qexc)"<<G4endl;
468 G4cout<<"New Inter. mode:"<<InteractionMode
469 <<" (0 -ALL, 1 - WITHOUT_R, 2 - NON_DIFF)"<<G4endl;
470 if( InteractionType == NonD )
471 G4cout<<"Number of cutted pomerons: "<<NcutPomerons<<G4endl;
472 #endif
473
474 if((InteractionType == PrD) || (InteractionType == TrD) || (InteractionType == DD) ||
475 (InteractionType == Qexc))
476 { // diffractive-like interaction occurs
477 #ifdef debugQGSParticipants
478 G4cout<<"Diffractive-like interaction occurs"<<G4endl;
479 #endif
480
483
484 aInteraction->SetTarget(aTargetSPB);
485 aInteraction->SetTargetNucleon(tNucleon);
486 aTargetSPB->SetCollisionCount(0);
487 aTargetSPB->SetStatus(1);
488
489 aInteraction->SetNumberOfDiffractiveCollisions(1);
490 aInteraction->SetNumberOfSoftCollisions(0);
491 aInteraction->SetStatus(InteractionType);
492 theInteractions.push_back(aInteraction);
493 }
494 else
495 { // nondiffractive interaction occurs
496 #ifdef debugQGSParticipants
497 G4cout<<"Non-diffractive interaction occurs, max NcutPomerons "<<NcutPomerons<<G4endl;
498 #endif
499
500 G4int nCuts;
501
502 G4int Vncut=0;
503 for(nCuts = 0; nCuts < NcutPomerons; nCuts++)
504 {
505 if( G4UniformRand() < Power/MaxPower ){Vncut++; Power--; if(Power <= 0.) break;}
506 }
507 nCuts=Vncut;
508
509 if( nCuts == 0 ) {delete aTargetSPB; tNucleon->Hit(nullptr); continue;}
510
511 #ifdef debugQGSParticipants
512 G4cout<<"Number of cuts in the interaction "<<nCuts<<G4endl;
513 #endif
514
515 aTargetSPB->IncrementCollisionCount(nCuts);
516 aTargetSPB->SetStatus(0);
517 theTargets.push_back(aTargetSPB);
518
521
523 aInteraction->SetTarget(aTargetSPB);
524 aInteraction->SetTargetNucleon(tNucleon);
525 aInteraction->SetNumberOfSoftCollisions(nCuts);
526 aInteraction->SetStatus(InteractionType);
527 theInteractions.push_back(aInteraction);
528 }
529 } // End of if (Pint > G4UniformRand())
530 } // End of while( (tNucleon = theNucleus->GetNextNucleon()) )
531
532 #ifdef debugQGSParticipants
533 G4cout << G4endl<<"Number of wounded nucleons "<<G4QGSParticipants_NPart<<G4endl;
534 #endif
535
536 } // End of while( (theInteractions.size() == 0) && ++loopCounter < maxNumberOfLoops )
537
538 if ( loopCounter >= maxNumberOfLoops ) {
539 #ifdef debugQGSParticipants
540 G4cout <<"BAD situation: forced loop exit!" << G4endl;
541 #endif
542 // Perhaps there is something to set here...
543 // Decrease impact parameter ??
544 // Select collisions with only diffraction ??
545 // Selecy only non-diffractive interactions ??
546 }
547 //------------------------------------------------------------
548 std::vector<G4InteractionContent*>::iterator i;
549
550 if( theInteractions.size() != 0)
551 {
552 if( InteractionMode == ALL ) // It can be if all interactions were quark-exchange.
553 { // Only the first one will be saved, all other will be erased.
554 i = theInteractions.end()-1;
555
556 while ( theInteractions.size() != 1 )
557 {
558 G4InteractionContent* anInteraction = *i;
559 G4Nucleon * pNucleon = anInteraction->GetTargetNucleon(); pNucleon->Hit(nullptr);
560 delete anInteraction->GetTarget();
561 delete *i;
562 i=theInteractions.erase(i);
563 i--;
564 }
565 }
566 else
567 { // All quark exchanges will be erased
568 i = theInteractions.begin();
569 while ( i != theInteractions.end() )
570 {
571 G4InteractionContent* anInteraction = *i;
572
573 if( anInteraction->GetStatus() == Qexc )
574 {
575 G4Nucleon* aTargetNucleon = anInteraction->GetTargetNucleon();
576 aTargetNucleon->Hit(nullptr);
577
578 delete anInteraction->GetTarget();
579 delete *i;
580 i=theInteractions.erase(i);
581 }
582 else
583 {
584 i++;
585 }
586 }
587 }
588 }
589}
G4ThreadLocal G4int G4QGSParticipants_NPart
#define TRUE
Definition: Globals.hh:27
double x() const
double y() const
double mag() const
void SetNumberOfDiffractiveCollisions(int)
void SetTargetNucleon(G4Nucleon *aNucleon)
G4Nucleon * GetTargetNucleon() const
void SetTarget(G4VSplitableHadron *aTarget)
void SetStatus(G4int aValue)
const G4ThreeVector & GetPosition() const
Definition: G4Nucleon.hh:140
void SetPosition(const G4ThreeVector aPosition)
Definition: G4Nucleon.hh:135
void Hit(G4VSplitableHadron *aHit)
Definition: G4Nucleon.hh:91
G4int ncPomerons()
Definition: G4Reggeons.cc:525
void SetS(G4double S)
Definition: G4Reggeons.cc:341
void GetProbabilities(G4double B, G4int Mode, G4double &Pint, G4double &Pprd, G4double &Ptrd, G4double &Pdd, G4double &Pnd, G4double &Pnvr)
Definition: G4Reggeons.cc:448
virtual G4double GetOuterRadius()=0
std::pair< G4double, G4double > ChooseImpactXandY(G4double maxImpact)
Definition: G4V3DNucleus.hh:87
void SetStatus(const G4int aStatus)
void SetCollisionCount(G4int aCount)
void IncrementCollisionCount(G4int aCount)

References ALL, G4V3DNucleus::ChooseImpactXandY(), DD, fermi, G4cout, G4endl, G4QGSParticipants_NPart, G4UniformRand, G4Nucleon::Get4Momentum(), G4Nucleon::GetDefinition(), G4V3DNucleus::GetMassNumber(), G4ReactionProduct::GetMomentum(), G4V3DNucleus::GetNextNucleon(), G4V3DNucleus::GetOuterRadius(), G4ParticleDefinition::GetParticleName(), G4Nucleon::GetPosition(), G4Reggeons::GetProbabilities(), G4VSplitableHadron::GetStatus(), G4InteractionContent::GetStatus(), G4InteractionContent::GetTarget(), G4InteractionContent::GetTargetNucleon(), G4ReactionProduct::GetTotalEnergy(), GeV, G4Nucleon::Hit(), G4VSplitableHadron::IncrementCollisionCount(), InteractionMode, CLHEP::Hep3Vector::mag(), MeV, G4Reggeons::ncPomerons(), NON_DIFF, NonD, PrD, Qexc, Regge, G4VSplitableHadron::SetCollisionCount(), G4InteractionContent::SetNumberOfDiffractiveCollisions(), G4InteractionContent::SetNumberOfSoftCollisions(), G4Nucleon::SetPosition(), G4Reggeons::SetS(), G4VSplitableHadron::SetStatus(), G4InteractionContent::SetStatus(), G4InteractionContent::SetTarget(), G4InteractionContent::SetTargetNucleon(), sqr(), G4V3DNucleus::StartLoop(), theInteractions, theNucleonRadius, G4VParticipants::theNucleus, theProjectileSplitable, theTargets, TrD, TRUE, WITHOUT_R, CLHEP::Hep3Vector::x(), and CLHEP::Hep3Vector::y().

Referenced by BuildInteractions().

◆ GetMaxPt2ofNuclearDestruction()

G4double G4QGSParticipants::GetMaxPt2ofNuclearDestruction ( )
inlineprivate

Definition at line 285 of file G4QGSParticipants.hh.

285 {
287}

References MaxPt2ofNuclearDestruction.

Referenced by PutOnMassShell().

◆ GetNextPartonPair()

G4PartonPair * G4QGSParticipants::GetNextPartonPair ( )
inline

Definition at line 212 of file G4QGSParticipants.hh.

213{
214 if (thePartonPairs.empty()) return 0;
215 G4PartonPair * result = thePartonPairs.back();
216 thePartonPairs.pop_back();
217 return result;
218}

References thePartonPairs.

◆ GetProjectileNucleus()

G4V3DNucleus * G4QGSParticipants::GetProjectileNucleus ( ) const
inlineprivatevirtual

Reimplemented from G4VParticipants.

Definition at line 233 of file G4QGSParticipants.hh.

233 {
234 return 0;
235}

Referenced by GetResiduals(), and PutOnMassShell().

◆ GetPt2ofNuclearDestruction()

G4double G4QGSParticipants::GetPt2ofNuclearDestruction ( )
inlineprivate

Definition at line 281 of file G4QGSParticipants.hh.

281 {
283}

References Pt2ofNuclearDestruction.

Referenced by PutOnMassShell().

◆ GetR2ofNuclearDestruction()

G4double G4QGSParticipants::GetR2ofNuclearDestruction ( )
inlineprivate

Definition at line 269 of file G4QGSParticipants.hh.

269 {
271}

References R2ofNuclearDestruction.

Referenced by ReggeonCascade().

◆ GetResiduals()

void G4QGSParticipants::GetResiduals ( )
private

Definition at line 2210 of file G4QGSParticipants.cc.

2210 {
2211 // This method is needed for the correct application of G4PrecompoundModelInterface
2212
2213 #ifdef debugQGSParticipants
2214 G4cout << "GetResiduals(): GetProjectileNucleus()? " << GetProjectileNucleus() << G4endl;
2215 #endif
2216
2217 #ifdef debugQGSParticipants
2218 G4cout << "NumberOfInvolvedNucleonsOfTarget "<< NumberOfInvolvedNucleonsOfTarget << G4endl;
2219 #endif
2220
2222 G4LorentzVector DeltaPResidualNucleus = TargetResidual4Momentum /
2224
2225 for ( G4int i = 0; i < NumberOfInvolvedNucleonsOfTarget; i++ ) {
2227
2228 #ifdef debugQGSParticipants
2229 G4VSplitableHadron* targetSplitable = aNucleon->GetSplitableHadron();
2230 G4cout << i << " Hit? " << aNucleon->AreYouHit() << " " << targetSplitable << G4endl;
2231 if ( targetSplitable ) G4cout << i << "Status " << targetSplitable->GetStatus() << G4endl;
2232 #endif
2233
2234 G4LorentzVector tmp = -DeltaPResidualNucleus;
2235 aNucleon->SetMomentum( tmp );
2236 aNucleon->SetBindingEnergy( DeltaExcitationE );
2237 }
2238
2239 //-------------------------------------
2240 if( TargetResidualMassNumber != 0 )
2241 {
2243
2244 G4V3DNucleus* theTargetNucleus = GetTargetNucleus();
2245 G4LorentzVector residualMomentum(0.,0.,0.,0.);
2246 G4Nucleon* aNucleon = 0;
2247 theTargetNucleus->StartLoop();
2248 while ( ( aNucleon = theTargetNucleus->GetNextNucleon() ) ) { /* Loop checking, 07.08.2015, A.Ribon */
2249 if ( !aNucleon->AreYouHit() ) {
2250 G4LorentzVector tmp=aNucleon->Get4Momentum(); tmp.boost(bstToCM);
2251 aNucleon->SetMomentum(tmp);
2252 residualMomentum +=tmp;
2253 }
2254 }
2255
2256 residualMomentum/=TargetResidualMassNumber;
2257
2259 G4double SumMasses=0.;
2260
2261 aNucleon = 0;
2262 theTargetNucleus->StartLoop();
2263 while ( ( aNucleon = theTargetNucleus->GetNextNucleon() ) ) { /* Loop checking, 07.08.2015, A.Ribon */
2264 if ( !aNucleon->AreYouHit() ) {
2265 G4LorentzVector tmp=aNucleon->Get4Momentum() - residualMomentum;
2266 G4double E=std::sqrt(tmp.vect().mag2()+
2267 sqr(aNucleon->GetDefinition()->GetPDGMass()-aNucleon->GetBindingEnergy()));
2268 tmp.setE(E); aNucleon->SetMomentum(tmp);
2269 SumMasses+=E;
2270 }
2271 }
2272
2273 G4double Chigh=Mass/SumMasses; G4double Clow=0; G4double C;
2274 const G4int maxNumberOfLoops = 1000;
2275 G4int loopCounter = 0;
2276 do
2277 {
2278 C=(Chigh+Clow)/2.;
2279
2280 SumMasses=0.;
2281 aNucleon = 0;
2282 theTargetNucleus->StartLoop();
2283 while ( ( aNucleon = theTargetNucleus->GetNextNucleon() ) ) { /* Loop checking, 07.08.2015, A.Ribon */
2284 if ( !aNucleon->AreYouHit() ) {
2285 G4LorentzVector tmp=aNucleon->Get4Momentum();
2286 G4double E=std::sqrt(tmp.vect().mag2()*sqr(C)+
2287 sqr(aNucleon->GetDefinition()->GetPDGMass()-aNucleon->GetBindingEnergy()));
2288 SumMasses+=E;
2289 }
2290 }
2291
2292 if(SumMasses > Mass) {Chigh=C;}
2293 else {Clow =C;}
2294
2295 } while( (Chigh-Clow > 0.01) &&
2296 ++loopCounter < maxNumberOfLoops ); /* Loop checking, 07.08.2015, A.Ribon */
2297 if ( loopCounter >= maxNumberOfLoops ) {
2298 #ifdef debugQGSParticipants
2299 G4cout <<"BAD situation: forced loop exit!" << G4endl;
2300 #endif
2301 // Perhaps there is something to set here...
2302 } else {
2303 aNucleon = 0;
2304 theTargetNucleus->StartLoop();
2305 while ( ( aNucleon = theTargetNucleus->GetNextNucleon() ) ) { /* Loop checking, 07.08.2015, A.Ribon */
2306 if ( !aNucleon->AreYouHit() ) {
2307 G4LorentzVector tmp=aNucleon->Get4Momentum()*C;
2308 G4double E=std::sqrt(tmp.vect().mag2()+
2309 sqr(aNucleon->GetDefinition()->GetPDGMass()-aNucleon->GetBindingEnergy()));
2310 tmp.setE(E); tmp.boost(-bstToCM);
2311 aNucleon->SetMomentum(tmp);
2312 }
2313 }
2314 }
2315
2316 } // End of if( TargetResidualMassNumber != 0 )
2317 //-------------------------------------
2318
2319 #ifdef debugQGSParticipants
2320 G4cout << "End GetResiduals -----------------" << G4endl;
2321 #endif
2322
2323}
G4double C(G4double temp)
double mag2() const
HepLorentzVector & boost(double, double, double)
Hep3Vector findBoostToCM() const
G4double GetBindingEnergy() const
Definition: G4Nucleon.hh:75
void SetBindingEnergy(G4double anEnergy)
Definition: G4Nucleon.hh:74
G4V3DNucleus * GetTargetNucleus() const
G4V3DNucleus * GetProjectileNucleus() const

References G4Nucleon::AreYouHit(), CLHEP::HepLorentzVector::boost(), C(), CLHEP::HepLorentzVector::findBoostToCM(), G4cout, G4endl, G4Nucleon::Get4Momentum(), G4Nucleon::GetBindingEnergy(), G4Nucleon::GetDefinition(), G4V3DNucleus::GetNextNucleon(), G4ParticleDefinition::GetPDGMass(), GetProjectileNucleus(), G4Nucleon::GetSplitableHadron(), G4VSplitableHadron::GetStatus(), GetTargetNucleus(), CLHEP::HepLorentzVector::mag(), CLHEP::Hep3Vector::mag2(), NumberOfInvolvedNucleonsOfTarget, G4Nucleon::SetBindingEnergy(), CLHEP::HepLorentzVector::setE(), G4Nucleon::SetMomentum(), sqr(), G4V3DNucleus::StartLoop(), TargetResidual4Momentum, TargetResidualExcitationEnergy, TargetResidualMassNumber, TheInvolvedNucleonsOfTarget, and CLHEP::HepLorentzVector::vect().

Referenced by BuildInteractions().

◆ GetTargetNucleus()

G4V3DNucleus * G4QGSParticipants::GetTargetNucleus ( ) const
inlineprivate

Definition at line 229 of file G4QGSParticipants.hh.

229 {
230 return theNucleus;
231}

References G4VParticipants::theNucleus.

Referenced by GetResiduals(), and PutOnMassShell().

◆ GetWoundedNucleus()

G4V3DNucleus * G4VParticipants::GetWoundedNucleus ( ) const
inlinevirtualinherited

Definition at line 73 of file G4VParticipants.hh.

74{
75 return theNucleus;
76}

References G4VParticipants::theNucleus.

Referenced by G4FTFModel::GetTargetNucleus(), and G4FTFModel::GetWoundedNucleus().

◆ Init()

void G4VParticipants::Init ( G4int  theZ,
G4int  theA 
)
virtualinherited

Definition at line 54 of file G4VParticipants.cc.

55{
56 if ( theNucleus == nullptr ) theNucleus = new G4Fancy3DNucleus();
57 theNucleus->Init(theA, theZ);
59}
virtual void SortNucleonsIncZ()=0
virtual void Init(G4int theA, G4int theZ, G4int numberOfLambdas=0)=0

References G4V3DNucleus::Init(), G4V3DNucleus::SortNucleonsIncZ(), and G4VParticipants::theNucleus.

Referenced by G4FTFModel::Init().

◆ InitProjectileNucleus()

void G4VParticipants::InitProjectileNucleus ( G4int  theZ,
G4int  theA,
G4int  numberOfLambdasOrAntiLambdas = 0 
)
virtualinherited

Definition at line 67 of file G4VParticipants.cc.

69{
70 if ( theProjectileNucleus == nullptr )
72
73 theProjectileNucleus->Init(theA, theZ, numberOfLambdasOrAntiLambdas);
75}
virtual void SortNucleonsDecZ()=0
G4V3DNucleus * theProjectileNucleus

References G4V3DNucleus::Init(), G4V3DNucleus::SortNucleonsDecZ(), and G4VParticipants::theProjectileNucleus.

Referenced by G4FTFModel::Init().

◆ operator!=() [1/2]

G4bool G4QGSParticipants::operator!= ( const G4QGSParticipants right) const

◆ operator!=() [2/2]

G4bool G4VParticipants::operator!= ( const G4VParticipants right) const
deleteinherited

◆ operator=()

const G4QGSParticipants & G4QGSParticipants::operator= ( const G4QGSParticipants right)

◆ operator==() [1/2]

G4bool G4QGSParticipants::operator== ( const G4QGSParticipants right) const

◆ operator==() [2/2]

G4bool G4VParticipants::operator== ( const G4VParticipants right) const
deleteinherited

◆ PerformDiffractiveCollisions()

void G4QGSParticipants::PerformDiffractiveCollisions ( )
protected

Definition at line 1456 of file G4QGSParticipants.cc.

1457{
1458 #ifdef debugQGSParticipants
1459 G4cout<<G4endl<<"PerformDiffractiveCollisions()......"<<G4endl
1460 <<"theInteractions.size() "<<theInteractions.size()<<G4endl;
1461 #endif
1462
1463 unsigned int i;
1464 for (i = 0; i < theInteractions.size(); i++)
1465 {
1466 G4InteractionContent* anIniteraction = theInteractions[i];
1467 #ifdef debugQGSParticipants
1468 G4cout<<"Interaction # and its status "
1469 <<i<<" "<<theInteractions[i]->GetStatus()<<G4endl;
1470 #endif
1471
1472 G4int InterStatus = theInteractions[i]->GetStatus();
1473 if ( (InterStatus == PrD) || (InterStatus == TrD) || (InterStatus == DD))
1474 { // Selection of diffractive interactions
1475 #ifdef debugQGSParticipants
1476 G4cout<<"Simulation of diffractive interaction. "<<InterStatus <<" PrD/TrD/DD/ND/Qech - 0,1,2,3,4"<<G4endl;
1477 #endif
1478
1479 G4VSplitableHadron* aTarget = anIniteraction->GetTarget();
1480
1481 #ifdef debugQGSParticipants
1482 G4cout<<"The proj. before inter "
1485 G4cout<<"The targ. before inter " <<aTarget->Get4Momentum()<<" "
1486 <<aTarget->Get4Momentum().mag()<<G4endl;
1487 #endif
1488
1489 if ( InterStatus == PrD )
1491
1492 if ( InterStatus == TrD )
1494
1495 if ( InterStatus == DD )
1497
1498 #ifdef debugQGSParticipants
1499 G4cout<<"The proj. after inter " <<theProjectileSplitable->Get4Momentum()<<" "
1501 G4cout<<"The targ. after inter " <<aTarget->Get4Momentum()<<" "
1502 <<aTarget->Get4Momentum().mag()<<G4endl;
1503 #endif
1504 }
1505
1506 if ( InterStatus == Qexc )
1507 { // Quark exchange process
1508 #ifdef debugQGSParticipants
1509 G4cout<<"Simulation of interaction with quark exchange."<<G4endl;
1510 #endif
1511 G4VSplitableHadron* aTarget = anIniteraction->GetTarget();
1512
1513 #ifdef debugQGSParticipants
1514 G4cout<<"The proj. before inter " <<theProjectileSplitable->Get4Momentum()<<" "
1516 G4cout<<"The targ. before inter "<<aTarget->Get4Momentum()<<" "
1517 <<aTarget->Get4Momentum().mag()<<G4endl;
1518 #endif
1519
1521
1522 #ifdef debugQGSParticipants
1523 G4cout<<"The proj. after inter " <<theProjectileSplitable->Get4Momentum()<<" "
1525 G4cout<<"The targ. after inter " <<aTarget->Get4Momentum()<<" "
1526 <<aTarget->Get4Momentum().mag()<<G4endl;
1527 #endif
1528 }
1529 }
1530}
#define FALSE
Definition: Globals.hh:23
virtual G4bool ExciteParticipants(G4VSplitableHadron *aPartner, G4VSplitableHadron *bPartner, G4bool ProjectileDiffraction=TRUE) const
G4QuarkExchange theQuarkExchange
G4SingleDiffractiveExcitation theSingleDiffExcitation
G4bool ExciteParticipants(G4VSplitableHadron *aPartner, G4VSplitableHadron *bPartner) const
G4bool ExciteParticipants(G4VSplitableHadron *aPartner, G4VSplitableHadron *bPartner, G4bool ProjectileDiffraction) const

References DD, G4QuarkExchange::ExciteParticipants(), G4SingleDiffractiveExcitation::ExciteParticipants(), G4QGSDiffractiveExcitation::ExciteParticipants(), FALSE, G4cout, G4endl, G4VSplitableHadron::Get4Momentum(), G4InteractionContent::GetTarget(), CLHEP::HepLorentzVector::mag(), PrD, Qexc, theDiffExcitaton, theInteractions, theProjectileSplitable, theQuarkExchange, theSingleDiffExcitation, TrD, and TRUE.

Referenced by BuildInteractions().

◆ PerformSoftCollisions()

void G4QGSParticipants::PerformSoftCollisions ( )
protected

Definition at line 2327 of file G4QGSParticipants.cc.

2328{
2329 std::vector<G4InteractionContent*>::iterator i;
2330 G4LorentzVector str4Mom;
2331 i = theInteractions.begin();
2332 while ( i != theInteractions.end() ) /* Loop checking, 07.08.2015, A.Ribon */
2333 {
2334 G4InteractionContent* anIniteraction = *i;
2335 G4PartonPair * aPair = NULL;
2336 if (anIniteraction->GetNumberOfSoftCollisions())
2337 {
2338 G4VSplitableHadron* pProjectile = anIniteraction->GetProjectile();
2339 G4VSplitableHadron* pTarget = anIniteraction->GetTarget();
2340 for (G4int j = 0; j < anIniteraction->GetNumberOfSoftCollisions(); j++)
2341 {
2342 aPair = new G4PartonPair(pTarget->GetNextParton(), pProjectile->GetNextAntiParton(),
2344 #ifdef debugQGSParticipants
2345 G4cout << "SoftPair " << aPair->GetParton1()->GetPDGcode() << " "
2346 << aPair->GetParton1()->Get4Momentum() << " "
2347 << aPair->GetParton1()->GetX() << " " << G4endl;
2348 G4cout << " " << aPair->GetParton2()->GetPDGcode() << " "
2349 << aPair->GetParton2()->Get4Momentum() << " "
2350 << aPair->GetParton2()->GetX() << " " << G4endl;
2351 #endif
2352 #ifdef debugQGSParticipants
2353 str4Mom += aPair->GetParton1()->Get4Momentum();
2354 str4Mom += aPair->GetParton2()->Get4Momentum();
2355 #endif
2356 thePartonPairs.push_back(aPair);
2357 aPair = new G4PartonPair(pProjectile->GetNextParton(), pTarget->GetNextAntiParton(),
2359 #ifdef debugQGSParticipants
2360 G4cout << "SoftPair " << aPair->GetParton1()->GetPDGcode() << " "
2361 << aPair->GetParton1()->Get4Momentum() << " "
2362 << aPair->GetParton1()->GetX() << " " << G4endl;
2363 G4cout << " " << aPair->GetParton2()->GetPDGcode() << " "
2364 << aPair->GetParton2()->Get4Momentum() << " "
2365 << aPair->GetParton2()->GetX() << " " << G4endl;
2366 #endif
2367 #ifdef debugQGSParticipants
2368 str4Mom += aPair->GetParton1()->Get4Momentum();
2369 str4Mom += aPair->GetParton2()->Get4Momentum();
2370 #endif
2371 thePartonPairs.push_back(aPair);
2372 }
2373 delete *i;
2374 i=theInteractions.erase(i); // i now points to the next interaction
2375 } else {
2376 i++;
2377 }
2378 }
2379 #ifdef debugQGSParticipants
2380 G4cout << " string 4 mom " << str4Mom << G4endl;
2381 #endif
2382}

References G4cout, G4endl, G4Parton::Get4Momentum(), G4VSplitableHadron::GetNextAntiParton(), G4VSplitableHadron::GetNextParton(), G4InteractionContent::GetNumberOfSoftCollisions(), G4PartonPair::GetParton1(), G4PartonPair::GetParton2(), G4Parton::GetPDGcode(), G4InteractionContent::GetProjectile(), G4InteractionContent::GetTarget(), G4Parton::GetX(), G4PartonPair::PROJECTILE, G4PartonPair::SOFT, G4PartonPair::TARGET, theInteractions, and thePartonPairs.

◆ PrepareInitialState()

void G4QGSParticipants::PrepareInitialState ( const G4ReactionProduct thePrimary)
private

Definition at line 278 of file G4QGSParticipants.cc.

279{
280 // Clearing of the arrays
281 // Erasing of the projectile
282 G4InteractionContent* anIniteraction = theInteractions[0];
283 G4VSplitableHadron* pProjectile = anIniteraction->GetProjectile();
284 if( pProjectile ) delete pProjectile;
285
286 std::for_each(theInteractions.begin(), theInteractions.end(), DeleteInteractionContent());
287 theInteractions.clear();
288
289 // Erasing of the envolved nucleons and target nucleons from diffraction dissociations
291 G4Nucleon* aNucleon;
292 while ( ( aNucleon = theNucleus->GetNextNucleon() ) )
293 {
294 if ( aNucleon->AreYouHit() ) {
295 G4VSplitableHadron* splaNucleon = aNucleon->GetSplitableHadron();
296 if ( (splaNucleon != 0) && (splaNucleon->GetStatus() >=1) ) delete splaNucleon;
297 aNucleon->Hit(nullptr);
299 }
300 }
301
302 // Erasing of nuclear nucleons participated in soft interactions
303 std::for_each(theTargets.begin(), theTargets.end(), DeleteSplitableHadron());
304 theTargets.clear();
305
306 // Preparation to a new attempt
307 theProjectile = thePrimary;
308
311 DoLorentzBoost(-theCurrentVelocity); // Lorentz boost of the target nucleus
312
313 if (theNucleus->GetMassNumber() == 1)
314 {
315 G4ThreeVector aPos = G4ThreeVector(0.,0.,0.);
318 tNucleon->SetPosition(aPos);
319 }
320
321 G4LorentzVector Tmp( 0.0, 0.0, 0.0, 0.0 );
326
327 G4Nucleon* NuclearNucleon;
328 while ( ( NuclearNucleon = theNucleus->GetNextNucleon() ) )
329 {Tmp+=NuclearNucleon->Get4Momentum();}
330
332}
virtual void DoLorentzBoost(G4ThreeVector aBoost)

References G4Nucleon::AreYouHit(), DoLorentzBoost(), G4Nucleon::Get4Momentum(), G4V3DNucleus::GetCharge(), G4V3DNucleus::GetMassNumber(), G4V3DNucleus::GetNextNucleon(), G4InteractionContent::GetProjectile(), G4Nucleon::GetSplitableHadron(), G4VSplitableHadron::GetStatus(), G4Nucleon::Hit(), G4V3DNucleus::Init(), NumberOfInvolvedNucleonsOfTarget, G4Nucleon::SetPosition(), G4V3DNucleus::SortNucleonsIncZ(), G4V3DNucleus::StartLoop(), TargetResidual4Momentum, TargetResidualCharge, TargetResidualExcitationEnergy, TargetResidualMassNumber, theCurrentVelocity, theInteractions, G4VParticipants::theNucleus, theProjectile, and theTargets.

Referenced by BuildInteractions().

◆ PutOnMassShell()

G4bool G4QGSParticipants::PutOnMassShell ( )
private

Definition at line 686 of file G4QGSParticipants.cc.

686 {
687
688 G4bool isProjectileNucleus = false;
689 if ( GetProjectileNucleus() ) {
690 isProjectileNucleus = true;
691 }
692
693 #ifdef debugPutOnMassShell
694 G4cout <<G4endl<< "PutOnMassShell start ..............." << G4endl;
695 if ( isProjectileNucleus ) {G4cout << "PutOnMassShell for Nucleus_Nucleus " << G4endl;}
696 #endif
697
699 if ( Pprojectile.z() < 0.0 ) {
700 return false;
701 }
702
703 G4bool isOk = true;
704
705 G4LorentzVector Ptarget( 0.0, 0.0, 0.0, 0.0 );
706 G4LorentzVector PtargetResidual( 0.0, 0.0, 0.0, 0.0 );
707 G4double SumMasses = 0.0;
708 G4V3DNucleus* theTargetNucleus = GetTargetNucleus();
709 G4double TargetResidualMass = 0.0;
710
711 #ifdef debugPutOnMassShell
712 G4cout << "Target : ";
713 #endif
714
715 isOk = ComputeNucleusProperties( theTargetNucleus, Ptarget, PtargetResidual, SumMasses,
716 TargetResidualExcitationEnergy, TargetResidualMass,
718
719 if ( ! isOk ) return false;
720
721 G4double Mprojectile = 0.0;
722 G4double M2projectile = 0.0;
723 G4LorentzVector Pproj( 0.0, 0.0, 0.0, 0.0 );
724 G4LorentzVector PprojResidual( 0.0, 0.0, 0.0, 0.0 );
725 G4V3DNucleus* thePrNucleus = GetProjectileNucleus();
726 G4double PrResidualMass = 0.0;
727
728 if ( ! isProjectileNucleus ) { // hadron-nucleus collision
729 Mprojectile = Pprojectile.mag();
730 M2projectile = Pprojectile.mag2();
731 SumMasses += Mprojectile + 20.0*MeV; // Maybe DM must be larger?
732 } else { // nucleus-nucleus or antinucleus-nucleus collision
733
734 #ifdef debugPutOnMassShell
735 G4cout << "Projectile : ";
736 #endif
737
738 isOk = ComputeNucleusProperties( thePrNucleus, Pproj, PprojResidual, SumMasses,
741 if ( ! isOk ) return false;
742 }
743
744 G4LorentzVector Psum = Pprojectile + Ptarget;
745 G4double SqrtS = Psum.mag();
746 G4double S = Psum.mag2();
747
748 #ifdef debugPutOnMassShell
749 G4cout << "Pproj "<<Pprojectile<<G4endl;
750 G4cout << "Ptarg "<<Ptarget<<G4endl;
751 G4cout << "Psum " << Psum/GeV << " GeV" << G4endl << "SqrtS " << SqrtS/GeV << " GeV" << G4endl
752 << "SumMasses, PrResidualMass and TargetResidualMass " << SumMasses/GeV << " "
753 << PrResidualMass/GeV << " " << TargetResidualMass/GeV << " GeV" << G4endl;
754 G4cout << "Ptar res. "<<PtargetResidual<<G4endl;
755 #endif
756
757 if ( SqrtS < SumMasses ) {
758 return false; // It is impossible to simulate after putting nuclear nucleons on mass-shell.
759 }
760
761 // Try to consider also the excitation energy of the residual nucleus, if this is
762 // possible, with the available energy; otherwise, set the excitation energy to zero.
763
764 G4double savedSumMasses = SumMasses;
765 if ( isProjectileNucleus ) {
766 SumMasses -= std::sqrt( sqr( PrResidualMass ) + PprojResidual.perp2() );
767 SumMasses += std::sqrt( sqr( PrResidualMass + ProjectileResidualExcitationEnergy )
768 + PprojResidual.perp2() );
769 }
770 SumMasses -= std::sqrt( sqr( TargetResidualMass ) + PtargetResidual.perp2() );
771 SumMasses += std::sqrt( sqr( TargetResidualMass + TargetResidualExcitationEnergy )
772 + PtargetResidual.perp2() );
773
774 if ( SqrtS < SumMasses ) {
775 SumMasses = savedSumMasses;
776 if ( isProjectileNucleus ) {
778 }
780 }
781
782 TargetResidualMass += TargetResidualExcitationEnergy;
783 if ( isProjectileNucleus ) {
784 PrResidualMass += ProjectileResidualExcitationEnergy;
785 }
786
787 #ifdef debugPutOnMassShell
788 if ( isProjectileNucleus ) {
789 G4cout << "PrResidualMass ProjResidualExcitationEnergy " << PrResidualMass/GeV << " "
791 }
792 G4cout << "TargetResidualMass TargetResidualExcitationEnergy " << TargetResidualMass/GeV << " GeV "
794 << "Sum masses " << SumMasses/GeV << G4endl;
795 #endif
796
797 // Sampling of nucleons what can transfer to delta-isobars
798 if ( isProjectileNucleus && thePrNucleus->GetMassNumber() != 1 ) {
801 }
802 if ( theTargetNucleus->GetMassNumber() != 1 ) {
803 isOk = isOk &&
805 TheInvolvedNucleonsOfTarget, SumMasses );
806 }
807 if ( ! isOk ) return false;
808
809 // Now we know that it is kinematically possible to produce a final state made
810 // of the involved nucleons (or corresponding delta-isobars) and a residual nucleus.
811 // We have to sample the kinematical variables which will allow to define the 4-momenta
812 // of the final state. The sampled kinematical variables refer to the center-of-mass frame.
813 // Notice that the sampling of the transverse momentum corresponds to take into account
814 // Fermi motion.
815
816 // If target is nucleon - return ?
817
818 G4LorentzRotation toCms( -1*Psum.boostVector() );
819 G4LorentzVector Ptmp = toCms*Pprojectile;
820 if ( Ptmp.pz() <= 0.0 ) { // "String" moving backwards in c.m.s., abort collision!
821 return false;
822 }
823
824 G4LorentzRotation toLab( toCms.inverse() );
825
826 G4double YprojectileNucleus = 0.0;
827 if ( isProjectileNucleus ) {
828 Ptmp = toCms*Pproj;
829 YprojectileNucleus = Ptmp.rapidity();
830 }
831 Ptmp = toCms*Ptarget;
832 G4double YtargetNucleus = Ptmp.rapidity();
833
834 // Ascribing of the involved nucleons Pt and Xminus
835 G4double DcorP = 0.0;
836 if ( isProjectileNucleus ) {
837 DcorP = GetDofNuclearDestruction() / thePrNucleus->GetMassNumber();
838 }
839 G4double DcorT = GetDofNuclearDestruction() / theTargetNucleus->GetMassNumber();
842
843 #ifdef debugPutOnMassShell
844 if ( isProjectileNucleus ) {
845 G4cout << "Y projectileNucleus " << YprojectileNucleus << G4endl;
846 }
847 G4cout << "Y targetNucleus " << YtargetNucleus << G4endl
848 << "Dcor " << GetDofNuclearDestruction()
849 << " DcorP DcorT " << DcorP << " " << DcorT << " AveragePt2 " << AveragePt2 << G4endl;
850 #endif
851
852 G4double M2proj = M2projectile; // Initialization needed only for hadron-nucleus collisions
853 G4double WplusProjectile = 0.0;
854 G4double M2target = 0.0;
855 G4double WminusTarget = 0.0;
856 G4int NumberOfTries = 0;
857 G4double ScaleFactor = 1.0;
858 G4bool OuterSuccess = true;
859
860 const G4int maxNumberOfLoops = 1000;
861 G4int loopCounter = 0;
862 do {
863 G4double sqrtM2proj = 0.0, sqrtM2target = 0.0;
864 OuterSuccess = true;
865 const G4int maxNumberOfTries = 1000;
866 do {
867 NumberOfTries++;
868 if ( NumberOfTries == 100*(NumberOfTries/100) ) {
869 // After many tries, it is convenient to reduce the values of DcorP, DcorT and
870 // AveragePt2, so that the sampled momenta (respectively, pz, and pt) of the
871 // involved nucleons (or corresponding delta-isomers) are smaller, and therefore
872 // it is more likely to satisfy the momentum conservation.
873 ScaleFactor /= 2.0;
874 DcorP *= ScaleFactor;
875 DcorT *= ScaleFactor;
876 AveragePt2 *= ScaleFactor;
877 }
878 if ( isProjectileNucleus ) {
879 // Sampling of kinematical properties of projectile nucleons
880 isOk = SamplingNucleonKinematics( AveragePt2, maxPtSquare, DcorP,
881 thePrNucleus, PprojResidual,
882 PrResidualMass, ProjectileResidualMassNumber,
885 }
886 // Sampling of kinematical properties of target nucleons
887 isOk = isOk &&
888 SamplingNucleonKinematics( AveragePt2, maxPtSquare, DcorT,
889 theTargetNucleus, PtargetResidual,
890 TargetResidualMass, TargetResidualMassNumber,
892 TheInvolvedNucleonsOfTarget, M2target );
893
894 if ( M2proj < 0.0 ) {
895 if( M2proj < -0.000001 ) {
897 ed << "Projectile " << theProjectile.GetDefinition()->GetParticleName()
898 << " Target (Z,A)=(" << theTargetNucleus->GetCharge() << "," << theTargetNucleus->GetMassNumber()
899 << ") M2proj=" << M2proj << " -> sets it to 0.0 !" << G4endl;
900 G4Exception( "G4QGSParticipants::PutOnMassShell(): negative projectile squared mass!",
901 "HAD_QGSPARTICIPANTS_002", JustWarning, ed );
902 }
903 M2proj = 0.0;
904 }
905 sqrtM2proj = std::sqrt( M2proj );
906 if ( M2target < 0.0 ) {
908 ed << "Projectile " << theProjectile.GetDefinition()->GetParticleName()
909 << " Target (Z,A)=(" << theTargetNucleus->GetCharge() << "," << theTargetNucleus->GetMassNumber()
910 << ") M2target=" << M2target << " -> sets it to 0.0 !" << G4endl;
911 G4Exception( "G4QGSParticipants::PutOnMassShell(): negative target squared mass!",
912 "HAD_QGSPARTICIPANTS_003", JustWarning, ed );
913 M2target = 0.0;
914 };
915 sqrtM2target = std::sqrt( M2target );
916
917 #ifdef debugPutOnMassShell
918 G4cout << "SqrtS, Mp+Mt, Mp, Mt " << SqrtS/GeV << " "
919 << ( sqrtM2proj + sqrtM2target )/GeV << " "
920 << sqrtM2proj/GeV << " " << sqrtM2target/GeV << G4endl;
921 #endif
922
923 if ( ! isOk ) return false;
924 } while ( ( SqrtS < ( sqrtM2proj + sqrtM2target ) ) &&
925 ++NumberOfTries < maxNumberOfTries ); /* Loop checking, 07.08.2015, A.Ribon */
926 if ( NumberOfTries >= maxNumberOfTries ) {
927 return false;
928 }
929 if ( isProjectileNucleus ) {
930 isOk = CheckKinematics( S, SqrtS, M2proj, M2target, YprojectileNucleus, true,
933 WminusTarget, WplusProjectile, OuterSuccess );
934 }
935 isOk = isOk &&
936 CheckKinematics( S, SqrtS, M2proj, M2target, YtargetNucleus, false,
938 WminusTarget, WplusProjectile, OuterSuccess );
939 if ( ! isOk ) return false;
940 } while ( ( ! OuterSuccess ) &&
941 ++loopCounter < maxNumberOfLoops ); /* Loop checking, 07.08.2015, A.Ribon */
942 if ( loopCounter >= maxNumberOfLoops ) {
943 return false;
944 }
945
946 // Now the sampling is completed, and we can determine the kinematics of the
947 // whole system. This is done first in the center-of-mass frame, and then it is boosted
948 // to the lab frame. The transverse momentum of the residual nucleus is determined as
949 // the recoil of each hadron (nucleon or delta) which is emitted, i.e. in such a way
950 // to conserve (by construction) the transverse momentum.
951
952 if ( ! isProjectileNucleus ) { // hadron-nucleus collision
953
954 G4double Pzprojectile = WplusProjectile/2.0 - M2projectile/2.0/WplusProjectile;
955 G4double Eprojectile = WplusProjectile/2.0 + M2projectile/2.0/WplusProjectile;
956 Pprojectile.setPz( Pzprojectile );
957 Pprojectile.setE( Eprojectile );
958
959 #ifdef debugPutOnMassShell
960 G4cout << "Proj after in CMS " << Pprojectile/GeV <<" GeV"<< G4endl;
961 #endif
962
963 Pprojectile.transform( toLab );
964 theProjectile.SetMomentum( Pprojectile.vect() );
965 theProjectile.SetTotalEnergy( Pprojectile.e() );
966
968
969 #ifdef debugPutOnMassShell
970 G4cout << "Final proj. mom in Lab. " <<theProjectile.GetMomentum()/GeV<<" "
972 #endif
973
974 } else { // nucleus-nucleus or antinucleus-nucleus collision
975
976 isOk = FinalizeKinematics( WplusProjectile, true, toLab, PrResidualMass,
979
980 #ifdef debugPutOnMassShell
981 G4cout << "Projectile Residual4Momentum in CMS " << ProjectileResidual4Momentum/GeV <<" GeV"<< G4endl;
982 #endif
983
984 if ( ! isOk ) return false;
985
987
988 #ifdef debugPutOnMassShell
989 G4cout << "Projectile Residual4Momentum in Lab " << ProjectileResidual4Momentum/GeV <<" GeV"<< G4endl;
990 #endif
991
992 }
993
994 isOk = FinalizeKinematics( WminusTarget, false, toLab, TargetResidualMass,
997
998 #ifdef debugPutOnMassShell
999 G4cout << "Target Residual4Momentum in CMS " << TargetResidual4Momentum/GeV << " GeV "<< G4endl;
1000 #endif
1001
1002 if ( ! isOk ) return false;
1003
1005
1006 #ifdef debugPutOnMassShell
1007 G4cout << "Target Residual4Momentum in Lab " << TargetResidual4Momentum/GeV << " GeV "<< G4endl;
1008 #endif
1009
1010 return true;
1011
1012}
G4double GetMaxPt2ofNuclearDestruction()
G4bool SamplingNucleonKinematics(G4double averagePt2, const G4double maxPt2, G4double dCor, G4V3DNucleus *nucleus, const G4LorentzVector &pResidual, const G4double residualMass, const G4int residualMassNumber, const G4int numberOfInvolvedNucleons, G4Nucleon *involvedNucleons[], G4double &mass2)
G4double GetDofNuclearDestruction()
G4bool CheckKinematics(const G4double sValue, const G4double sqrtS, const G4double projectileMass2, const G4double targetMass2, const G4double nucleusY, const G4bool isProjectileNucleus, const G4int numberOfInvolvedNucleons, G4Nucleon *involvedNucleons[], G4double &targetWminus, G4double &projectileWplus, G4bool &success)
G4bool FinalizeKinematics(const G4double w, const G4bool isProjectileNucleus, const G4LorentzRotation &boostFromCmsToLab, const G4double residualMass, const G4int residualMassNumber, const G4int numberOfInvolvedNucleons, G4Nucleon *involvedNucleons[], G4LorentzVector &residual4Momentum)
G4bool GenerateDeltaIsobar(const G4double sqrtS, const G4int numberOfInvolvedNucleons, G4Nucleon *involvedNucleons[], G4double &sumMasses)
G4bool ComputeNucleusProperties(G4V3DNucleus *nucleus, G4LorentzVector &nucleusMomentum, G4LorentzVector &residualMomentum, G4double &sumMasses, G4double &residualExcitationEnergy, G4double &residualMass, G4int &residualMassNumber, G4int &residualCharge)
G4double GetPt2ofNuclearDestruction()
void SetMomentum(const G4double x, const G4double y, const G4double z)
void SetTotalEnergy(const G4double en)

References CLHEP::HepLorentzVector::boostVector(), CheckKinematics(), ComputeNucleusProperties(), CLHEP::HepLorentzVector::e(), FinalizeKinematics(), G4cout, G4endl, G4Exception(), GenerateDeltaIsobar(), G4V3DNucleus::GetCharge(), G4ReactionProduct::GetDefinition(), GetDofNuclearDestruction(), G4V3DNucleus::GetMassNumber(), GetMaxPt2ofNuclearDestruction(), G4ReactionProduct::GetMomentum(), G4ParticleDefinition::GetParticleName(), GetProjectileNucleus(), GetPt2ofNuclearDestruction(), GetTargetNucleus(), G4ReactionProduct::GetTotalEnergy(), GeV, CLHEP::HepLorentzRotation::inverse(), JustWarning, CLHEP::HepLorentzVector::mag(), CLHEP::HepLorentzVector::mag2(), MeV, NumberOfInvolvedNucleonsOfProjectile, NumberOfInvolvedNucleonsOfTarget, CLHEP::HepLorentzVector::perp2(), ProjectileResidual4Momentum, ProjectileResidualCharge, ProjectileResidualExcitationEnergy, ProjectileResidualMassNumber, CLHEP::HepLorentzVector::pz(), CLHEP::HepLorentzVector::rapidity(), S(), SamplingNucleonKinematics(), G4VSplitableHadron::Set4Momentum(), CLHEP::HepLorentzVector::setE(), G4ReactionProduct::SetMomentum(), CLHEP::HepLorentzVector::setPz(), G4ReactionProduct::SetTotalEnergy(), sqr(), TargetResidual4Momentum, TargetResidualCharge, TargetResidualExcitationEnergy, TargetResidualMassNumber, TheInvolvedNucleonsOfProjectile, TheInvolvedNucleonsOfTarget, theProjectile, theProjectileSplitable, CLHEP::HepLorentzVector::transform(), CLHEP::HepLorentzVector::vect(), and CLHEP::HepLorentzVector::z().

Referenced by BuildInteractions().

◆ ReggeonCascade()

void G4QGSParticipants::ReggeonCascade ( )
private

Definition at line 617 of file G4QGSParticipants.cc.

618{ // Implementation of the reggeon theory inspired model of nuclear destruction
619 #ifdef debugQGSParticipants
620 G4cout << G4endl<<"Reggeon cascading ........."<<G4endl;
621 G4cout<<"C of nucl. desctruction "<<GetCofNuclearDestruction()
622 <<" R2 "<<GetR2ofNuclearDestruction()/fermi/fermi<<" fermi^2"<<G4endl;
623 #endif
624
626
627 // Reggeon cascading in target nucleus
628 for ( G4int InvTN = 0; InvTN < InitNINt; InvTN++ ) {
629 G4Nucleon* aTargetNucleon = TheInvolvedNucleonsOfTarget[ InvTN ];
630
631 G4double CreationTime = aTargetNucleon->GetSplitableHadron()->GetTimeOfCreation();
632
633 G4double XofWoundedNucleon = aTargetNucleon->GetPosition().x();
634 G4double YofWoundedNucleon = aTargetNucleon->GetPosition().y();
635
636 G4V3DNucleus* theTargetNucleus = theNucleus;
637 theTargetNucleus->StartLoop();
638
639 G4int TrgNuc=0;
640 G4Nucleon* Neighbour(0);
641 while ( ( Neighbour = theTargetNucleus->GetNextNucleon() ) ) {
642 TrgNuc++;
643 if ( ! Neighbour->AreYouHit() ) {
644 G4double impact2 = sqr( XofWoundedNucleon - Neighbour->GetPosition().x() ) +
645 sqr( YofWoundedNucleon - Neighbour->GetPosition().y() );
646
648 G4Exp( -impact2 / GetR2ofNuclearDestruction() )
649 ) {
650 // The neighbour nucleon is involved in the reggeon cascade
651 #ifdef debugQGSParticipants
652 G4cout<<"Target nucleon involved in reggeon cascading No "<<TrgNuc<<" "
653 <<Neighbour->GetDefinition()->GetParticleName()<<G4endl;
654 #endif
657
658 G4QGSMSplitableHadron* targetSplitable = new G4QGSMSplitableHadron( *Neighbour );
659
660 Neighbour->Hit( targetSplitable );
661 targetSplitable->SetTimeOfCreation( CreationTime );
662 targetSplitable->SetStatus( 2 );
663 targetSplitable->SetCollisionCount(0);
664
666 anInteraction->SetTarget(targetSplitable);
667 anInteraction->SetTargetNucleon(Neighbour);
668
669 anInteraction->SetNumberOfDiffractiveCollisions(1);
670 anInteraction->SetNumberOfSoftCollisions(0);
671 anInteraction->SetStatus(3);
672 theInteractions.push_back(anInteraction);
673 }
674 }
675 }
676 }
677
678 #ifdef debugQGSParticipants
679 G4cout <<"Number of new involved nucleons "<<NumberOfInvolvedNucleonsOfTarget - InitNINt<<G4endl;
680 #endif
681 return;
682}
G4double GetR2ofNuclearDestruction()
G4double GetCofNuclearDestruction()
void SetTimeOfCreation(G4double aTime)

References G4Nucleon::AreYouHit(), fermi, G4cout, G4endl, G4Exp(), G4UniformRand, GetCofNuclearDestruction(), G4Nucleon::GetDefinition(), G4V3DNucleus::GetNextNucleon(), G4ParticleDefinition::GetParticleName(), G4Nucleon::GetPosition(), GetR2ofNuclearDestruction(), G4Nucleon::GetSplitableHadron(), G4VSplitableHadron::GetTimeOfCreation(), G4Nucleon::Hit(), NumberOfInvolvedNucleonsOfTarget, G4VSplitableHadron::SetCollisionCount(), G4InteractionContent::SetNumberOfDiffractiveCollisions(), G4InteractionContent::SetNumberOfSoftCollisions(), G4VSplitableHadron::SetStatus(), G4InteractionContent::SetStatus(), G4InteractionContent::SetTarget(), G4InteractionContent::SetTargetNucleon(), G4VSplitableHadron::SetTimeOfCreation(), sqr(), G4V3DNucleus::StartLoop(), theInteractions, TheInvolvedNucleonsOfTarget, G4VParticipants::theNucleus, theProjectileSplitable, CLHEP::Hep3Vector::x(), and CLHEP::Hep3Vector::y().

Referenced by BuildInteractions().

◆ SampleX()

G4double G4QGSParticipants::SampleX ( G4double  anXmin,
G4int  nSea,
G4int  theTotalSea,
G4double  aBeta 
)
protected

Definition at line 2038 of file G4QGSParticipants.cc.

2040{
2041 G4double Oalfa = 1./(alpha + 1.);
2042 G4double Obeta = 1./(aBeta + (alpha + 1.)*nSea + 1.); // ?
2043
2044 G4double Ksi1, Ksi2, r1, r2, r12;
2045 const G4int maxNumberOfLoops = 1000;
2046 G4int loopCounter = 0;
2047 do
2048 {
2049 Ksi1 = G4UniformRand(); r1 = G4Pow::GetInstance()->powA(Ksi1,Oalfa);
2050 Ksi2 = G4UniformRand(); r2 = G4Pow::GetInstance()->powA(Ksi2,Obeta);
2051 r12=r1+r2;
2052 } while( ( r12 > 1.) &&
2053 ++loopCounter < maxNumberOfLoops ); /* Loop checking, 07.08.2015, A.Ribon */
2054 if ( loopCounter >= maxNumberOfLoops ) {
2055 return 0.5; // Just an acceptable value, without any physics consideration.
2056 }
2057
2058 G4double result = r1/r12;
2059 return result;
2060}
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double powA(G4double A, G4double y) const
Definition: G4Pow.hh:230

References alpha, G4UniformRand, G4Pow::GetInstance(), and G4Pow::powA().

Referenced by DeterminePartonMomenta().

◆ SamplingNucleonKinematics()

G4bool G4QGSParticipants::SamplingNucleonKinematics ( G4double  averagePt2,
const G4double  maxPt2,
G4double  dCor,
G4V3DNucleus nucleus,
const G4LorentzVector pResidual,
const G4double  residualMass,
const G4int  residualMassNumber,
const G4int  numberOfInvolvedNucleons,
G4Nucleon involvedNucleons[],
G4double mass2 
)
private

Definition at line 1181 of file G4QGSParticipants.cc.

1191 { // output parameter
1192
1193 // This method, which is called only by PutOnMassShell, does the sampling of:
1194 // - either the target nucleons: this for any kind of hadronic interactions
1195 // (hadron-nucleus, nucleus-nucleus, antinucleus-nucleus);
1196 // - or the projectile nucleons or antinucleons: this only in the case of
1197 // nucleus-nucleus or antinucleus-nucleus interactions, respectively.
1198 // This method assumes that all the parameters have been initialized by the caller;
1199 // the action of this method consists in changing the properties of the nucleons
1200 // whose pointers are in the vector involvedNucleons, as well as changing the
1201 // variable mass2.
1202
1203 if ( ! nucleus ) return false;
1204
1205 if ( residualMassNumber == 0 && numberOfInvolvedNucleons == 1 ) {
1206 dCor = 0.0;
1207 averagePt2 = 0.0;
1208 }
1209
1210 G4bool success = true;
1211
1212 G4double SumMasses = residualMass;
1213 for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1214 G4Nucleon* aNucleon = involvedNucleons[i];
1215 if ( ! aNucleon ) continue;
1216 SumMasses += aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass();
1217 }
1218
1219 const G4int maxNumberOfLoops = 1000;
1220 G4int loopCounter = 0;
1221 do {
1222
1223 success = true;
1224 G4ThreeVector ptSum( 0.0, 0.0, 0.0 );
1225 G4double xSum = 0.0;
1226
1227 for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1228 G4Nucleon* aNucleon = involvedNucleons[i];
1229 if ( ! aNucleon ) continue;
1230 G4ThreeVector tmpPt = GaussianPt( averagePt2, maxPt2 );
1231 ptSum += tmpPt;
1232 G4ThreeVector tmpX = GaussianPt( dCor*dCor, 1.0 );
1233 G4double x = tmpX.x() +
1234 aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass()/SumMasses;
1235 if ( x < 0.0 || x > 1.0 ) {
1236 success = false;
1237 break;
1238 }
1239 xSum += x;
1240 //AR The energy is in the lab (instead of cms) frame but it will not be used.
1241 G4LorentzVector tmp( tmpPt.x(), tmpPt.y(), x, aNucleon->Get4Momentum().e() );
1242 aNucleon->SetMomentum( tmp );
1243 }
1244
1245 if ( xSum < 0.0 || xSum > 1.0 ) success = false;
1246
1247 if ( ! success ) continue;
1248
1249 G4double deltaPx = ( ptSum.x() - pResidual.x() ) / numberOfInvolvedNucleons;
1250 G4double deltaPy = ( ptSum.y() - pResidual.y() ) / numberOfInvolvedNucleons;
1251 G4double delta = 0.0;
1252 if ( residualMassNumber == 0 ) {
1253 delta = ( xSum - 1.0 ) / numberOfInvolvedNucleons;
1254 } else {
1255 delta = 0.0;
1256 }
1257
1258 xSum = 1.0;
1259 mass2 = 0.0;
1260 for ( G4int i = 0; i < numberOfInvolvedNucleons; i++ ) {
1261 G4Nucleon* aNucleon = involvedNucleons[i];
1262 if ( ! aNucleon ) continue;
1263 G4double x = aNucleon->Get4Momentum().pz() - delta;
1264 xSum -= x;
1265 if ( residualMassNumber == 0 ) {
1266 if ( x <= 0.0 || x > 1.0 ) {
1267 success = false;
1268 break;
1269 }
1270 } else {
1271 if ( x <= 0.0 || x > 1.0 || xSum <= 0.0 || xSum > 1.0 ) {
1272 success = false;
1273 break;
1274 }
1275 }
1276 G4double px = aNucleon->Get4Momentum().px() - deltaPx;
1277 G4double py = aNucleon->Get4Momentum().py() - deltaPy;
1278 mass2 += ( sqr( aNucleon->GetSplitableHadron()->GetDefinition()->GetPDGMass() )
1279 + sqr( px ) + sqr( py ) ) / x;
1280 G4LorentzVector tmp( px, py, x, aNucleon->Get4Momentum().e() );
1281 aNucleon->SetMomentum( tmp );
1282 }
1283
1284 if ( success && residualMassNumber != 0 ) {
1285 mass2 += ( sqr( residualMass ) + pResidual.perp2() ) / xSum;
1286 }
1287
1288 #ifdef debugPutOnMassShell
1289 G4cout << "success " << success << G4endl << " Mt " << std::sqrt( mass2 )/GeV << G4endl;
1290 #endif
1291
1292 } while ( ( ! success ) &&
1293 ++loopCounter < maxNumberOfLoops ); /* Loop checking, 07.08.2015, A.Ribon */
1294 if ( loopCounter >= maxNumberOfLoops ) {
1295 success = false;
1296 }
1297
1298 return success;
1299}

References CLHEP::HepLorentzVector::e(), G4cout, G4endl, GaussianPt(), G4Nucleon::Get4Momentum(), G4VSplitableHadron::GetDefinition(), G4ParticleDefinition::GetPDGMass(), G4Nucleon::GetSplitableHadron(), GeV, CLHEP::HepLorentzVector::perp2(), CLHEP::HepLorentzVector::px(), CLHEP::HepLorentzVector::py(), CLHEP::HepLorentzVector::pz(), G4Nucleon::SetMomentum(), sqr(), CLHEP::HepLorentzVector::x(), CLHEP::Hep3Vector::x(), CLHEP::HepLorentzVector::y(), and CLHEP::Hep3Vector::y().

Referenced by PutOnMassShell().

◆ SelectInteractions()

G4VSplitableHadron * G4QGSParticipants::SelectInteractions ( const G4ReactionProduct thePrimary)
protectedvirtual

Reimplemented in G4GammaParticipants.

Definition at line 2386 of file G4QGSParticipants.cc.

2387{
2388 // Check reaction threshold - goes to CheckThreshold
2389
2392
2393 G4LorentzVector aPrimaryMomentum(thePrimary.GetMomentum(), thePrimary.GetTotalEnergy());
2394 G4LorentzVector aTargetNMomentum(0.,0.,0.,938.);
2395
2396 if ((!(aPrimaryMomentum.e()>-1)) && (!(aPrimaryMomentum.e()<1)) )
2397 {
2398 throw G4HadronicException(__FILE__, __LINE__,
2399 "G4GammaParticipants::SelectInteractions: primary nan energy.");
2400 }
2401 G4double S = (aPrimaryMomentum + aTargetNMomentum).mag2();
2402 G4double ThresholdMass = thePrimary.GetMass() + 938.;
2403 ModelMode = SOFT;
2404
2405 #ifdef debugQGSParticipants
2406 G4cout << "Gamma projectile - SelectInteractions " << G4endl;
2407 G4cout<<"Energy and Nucleus "<<thePrimary.GetTotalEnergy()<<" "<<theNucleus->GetMassNumber()<<G4endl;
2408 G4cout << "SqrtS ThresholdMass ModelMode " <<std::sqrt(S)<<" "<<ThresholdMass<<" "<<ModelMode<< G4endl;
2409 #endif
2410
2411 if (sqr(ThresholdMass + ThresholdParameter) > S)
2412 {
2414 }
2415 if (sqr(ThresholdMass + QGSMThreshold) > S) // thus only diffractive in cascade!
2416 {
2418 }
2419
2420 // first find the collisions HPW
2421 std::for_each(theInteractions.begin(), theInteractions.end(), DeleteInteractionContent());
2422 theInteractions.clear();
2423
2425 G4int NucleonNo=0;
2426
2428 G4Nucleon * pNucleon = 0;
2429
2430 while( (pNucleon = theNucleus->GetNextNucleon()) ) /* Loop checking, 07.08.2015, A.Ribon */
2431 { if(NucleonNo == theCurrent) break; NucleonNo++; }
2432
2433 if ( pNucleon ) {
2434 G4QGSMSplitableHadron* aTarget = new G4QGSMSplitableHadron(*pNucleon);
2435
2436 pNucleon->Hit(aTarget);
2437
2438 if ( (0.06 > G4UniformRand() &&(ModelMode==SOFT)) || (ModelMode==DIFFRACTIVE ) )
2439 {
2442
2443 aInteraction->SetTarget(aTarget);
2444 aInteraction->SetTargetNucleon(pNucleon);
2445 aTarget->SetCollisionCount(0);
2446 aTarget->SetStatus(1);
2447
2448 aInteraction->SetNumberOfDiffractiveCollisions(1);
2449 aInteraction->SetNumberOfSoftCollisions(0);
2450 aInteraction->SetStatus(1);
2451
2452 theInteractions.push_back(aInteraction);
2453 }
2454 else
2455 {
2456 // nondiffractive soft interaction occurs
2457 aTarget->IncrementCollisionCount(1);
2458 aTarget->SetStatus(0);
2459 theTargets.push_back(aTarget);
2460
2463
2465 aInteraction->SetTarget(aTarget);
2466 aInteraction->SetTargetNucleon(pNucleon);
2467 aInteraction->SetNumberOfSoftCollisions(1);
2468 aInteraction->SetStatus(3);
2469 theInteractions.push_back(aInteraction);
2470 }
2471 }
2473}
G4double GetMass() const

References DIFFRACTIVE, CLHEP::HepLorentzVector::e(), G4cout, G4endl, G4UniformRand, G4ReactionProduct::GetMass(), G4V3DNucleus::GetMassNumber(), G4ReactionProduct::GetMomentum(), G4V3DNucleus::GetNextNucleon(), G4VSplitableHadron::GetStatus(), G4ReactionProduct::GetTotalEnergy(), G4Nucleon::Hit(), G4VSplitableHadron::IncrementCollisionCount(), ModelMode, QGSMThreshold, S(), G4VSplitableHadron::SetCollisionCount(), G4InteractionContent::SetNumberOfDiffractiveCollisions(), G4InteractionContent::SetNumberOfSoftCollisions(), G4VSplitableHadron::SetStatus(), G4InteractionContent::SetStatus(), G4InteractionContent::SetTarget(), G4InteractionContent::SetTargetNucleon(), SOFT, sqr(), G4V3DNucleus::StartLoop(), theInteractions, G4VParticipants::theNucleus, theProjectileSplitable, theTargets, ThresholdParameter, and TRUE.

Referenced by BuildInteractions().

◆ SetCofNuclearDestruction()

void G4QGSParticipants::SetCofNuclearDestruction ( const G4double  aValue)
inlineprivate

Definition at line 240 of file G4QGSParticipants.hh.

240 {
241 CofNuclearDestruction = aValue;
242}

References CofNuclearDestruction.

Referenced by G4QGSParticipants().

◆ SetDofNuclearDestruction()

void G4QGSParticipants::SetDofNuclearDestruction ( const G4double  aValue)
inlineprivate

Definition at line 252 of file G4QGSParticipants.hh.

252 {
253 DofNuclearDestruction = aValue;
254}

References DofNuclearDestruction.

Referenced by G4QGSParticipants().

◆ SetExcitationEnergyPerWoundedNucleon()

void G4QGSParticipants::SetExcitationEnergyPerWoundedNucleon ( const G4double  aValue)
inlineprivate

Definition at line 248 of file G4QGSParticipants.hh.

248 {
250}

References ExcitationEnergyPerWoundedNucleon.

Referenced by G4QGSParticipants().

◆ SetMaxPt2ofNuclearDestruction()

void G4QGSParticipants::SetMaxPt2ofNuclearDestruction ( const G4double  aValue)
inlineprivate

Definition at line 260 of file G4QGSParticipants.hh.

260 {
262}

References MaxPt2ofNuclearDestruction.

Referenced by G4QGSParticipants().

◆ SetNucleus()

void G4VParticipants::SetNucleus ( G4V3DNucleus aNucleus)
virtualinherited

Definition at line 61 of file G4VParticipants.cc.

62{
63 if (theNucleus != nullptr) delete theNucleus;
64 theNucleus = aNucleus;
65}

References G4VParticipants::theNucleus.

◆ SetProjectileNucleus()

void G4VParticipants::SetProjectileNucleus ( G4V3DNucleus aNucleus)
virtualinherited

Definition at line 77 of file G4VParticipants.cc.

78{
79 if (theProjectileNucleus != nullptr) delete theProjectileNucleus;
80 theProjectileNucleus = aNucleus;
81}

References G4VParticipants::theProjectileNucleus.

Referenced by BuildInteractions(), and G4FTFModel::Init().

◆ SetPt2ofNuclearDestruction()

void G4QGSParticipants::SetPt2ofNuclearDestruction ( const G4double  aValue)
inlineprivate

Definition at line 256 of file G4QGSParticipants.hh.

256 {
258}

References Pt2ofNuclearDestruction.

Referenced by G4QGSParticipants().

◆ SetR2ofNuclearDestruction()

void G4QGSParticipants::SetR2ofNuclearDestruction ( const G4double  aValue)
inlineprivate

Definition at line 244 of file G4QGSParticipants.hh.

244 {
245 R2ofNuclearDestruction = aValue;
246}

References R2ofNuclearDestruction.

Referenced by G4QGSParticipants().

◆ SplitHadrons()

void G4QGSParticipants::SplitHadrons ( )
inlineprotected

Definition at line 220 of file G4QGSParticipants.hh.

221{
222 unsigned int i;
223 for(i = 0; i < theInteractions.size(); i++)
224 {
225 theInteractions[i]->SplitHadrons();
226 }
227}

References theInteractions.

Referenced by BuildInteractions().

◆ StartPartonPairLoop()

void G4QGSParticipants::StartPartonPairLoop ( )
inline

Definition at line 208 of file G4QGSParticipants.hh.

209{
210}

◆ StoreInvolvedNucleon()

void G4QGSParticipants::StoreInvolvedNucleon ( )
private

Definition at line 592 of file G4QGSParticipants.cc.

593{ //To store nucleons involved in the interaction
594
596
598
599 G4Nucleon* aNucleon;
600 while ( ( aNucleon = theNucleus->GetNextNucleon() ) ) {
601 if ( aNucleon->AreYouHit() ) {
604 }
605 }
606
607 #ifdef debugQGSParticipants
608 G4cout << G4endl<<"G4QGSParticipants::StoreInvolvedNucleon() if they were "<<G4endl
609 <<"Stored # of wounded nucleons of target "
611 #endif
612 return;
613}

References G4Nucleon::AreYouHit(), G4cout, G4endl, G4V3DNucleus::GetNextNucleon(), NumberOfInvolvedNucleonsOfTarget, G4V3DNucleus::StartLoop(), TheInvolvedNucleonsOfTarget, and G4VParticipants::theNucleus.

Referenced by BuildInteractions().

Field Documentation

◆ alpha

G4double G4QGSParticipants::alpha
private

Definition at line 175 of file G4QGSParticipants.hh.

Referenced by SampleX().

◆ beta

G4double G4QGSParticipants::beta
private

Definition at line 176 of file G4QGSParticipants.hh.

Referenced by DeterminePartonMomenta().

◆ CofNuclearDestruction

G4double G4QGSParticipants::CofNuclearDestruction
private

Definition at line 198 of file G4QGSParticipants.hh.

Referenced by GetCofNuclearDestruction(), and SetCofNuclearDestruction().

◆ DofNuclearDestruction

G4double G4QGSParticipants::DofNuclearDestruction
private

Definition at line 203 of file G4QGSParticipants.hh.

Referenced by GetDofNuclearDestruction(), and SetDofNuclearDestruction().

◆ ExcitationEnergyPerWoundedNucleon

G4double G4QGSParticipants::ExcitationEnergyPerWoundedNucleon
private

◆ InteractionMode

G4int G4QGSParticipants::InteractionMode
private

Definition at line 173 of file G4QGSParticipants.hh.

Referenced by GetList().

◆ MaxPt2ofNuclearDestruction

G4double G4QGSParticipants::MaxPt2ofNuclearDestruction
private

◆ ModelMode

G4int G4QGSParticipants::ModelMode
protected

◆ nCutMax

const G4int G4QGSParticipants::nCutMax
protected

Definition at line 161 of file G4QGSParticipants.hh.

◆ NumberOfInvolvedNucleonsOfProjectile

G4int G4QGSParticipants::NumberOfInvolvedNucleonsOfProjectile
private

Definition at line 184 of file G4QGSParticipants.hh.

Referenced by BuildInteractions(), and PutOnMassShell().

◆ NumberOfInvolvedNucleonsOfTarget

G4int G4QGSParticipants::NumberOfInvolvedNucleonsOfTarget
private

◆ ProjectileResidual4Momentum

G4LorentzVector G4QGSParticipants::ProjectileResidual4Momentum
private

Definition at line 186 of file G4QGSParticipants.hh.

Referenced by BuildInteractions(), and PutOnMassShell().

◆ ProjectileResidualCharge

G4int G4QGSParticipants::ProjectileResidualCharge
private

Definition at line 188 of file G4QGSParticipants.hh.

Referenced by BuildInteractions(), and PutOnMassShell().

◆ ProjectileResidualExcitationEnergy

G4double G4QGSParticipants::ProjectileResidualExcitationEnergy
private

Definition at line 189 of file G4QGSParticipants.hh.

Referenced by BuildInteractions(), and PutOnMassShell().

◆ ProjectileResidualMassNumber

G4int G4QGSParticipants::ProjectileResidualMassNumber
private

Definition at line 187 of file G4QGSParticipants.hh.

Referenced by BuildInteractions(), and PutOnMassShell().

◆ Pt2ofNuclearDestruction

G4double G4QGSParticipants::Pt2ofNuclearDestruction
private

Definition at line 204 of file G4QGSParticipants.hh.

Referenced by GetPt2ofNuclearDestruction(), and SetPt2ofNuclearDestruction().

◆ QGSMThreshold

const G4double G4QGSParticipants::QGSMThreshold
protected

◆ R2ofNuclearDestruction

G4double G4QGSParticipants::R2ofNuclearDestruction
private

Definition at line 199 of file G4QGSParticipants.hh.

Referenced by GetR2ofNuclearDestruction(), and SetR2ofNuclearDestruction().

◆ Regge

G4Reggeons* G4QGSParticipants::Regge
private

Definition at line 172 of file G4QGSParticipants.hh.

Referenced by BuildInteractions(), and GetList().

◆ sigmaPt

G4double G4QGSParticipants::sigmaPt
private

Definition at line 178 of file G4QGSParticipants.hh.

Referenced by DeterminePartonMomenta(), and G4QGSParticipants().

◆ TargetResidual4Momentum

G4LorentzVector G4QGSParticipants::TargetResidual4Momentum
private

◆ TargetResidualCharge

G4int G4QGSParticipants::TargetResidualCharge
private

Definition at line 193 of file G4QGSParticipants.hh.

Referenced by BuildInteractions(), PrepareInitialState(), and PutOnMassShell().

◆ TargetResidualExcitationEnergy

G4double G4QGSParticipants::TargetResidualExcitationEnergy
private

◆ TargetResidualMassNumber

G4int G4QGSParticipants::TargetResidualMassNumber
private

◆ theBoost

G4ThreeVector G4QGSParticipants::theBoost
protected

Definition at line 152 of file G4QGSParticipants.hh.

Referenced by DoLorentzBoost().

◆ theCurrentVelocity

G4ThreeVector G4QGSParticipants::theCurrentVelocity
protected

Definition at line 166 of file G4QGSParticipants.hh.

Referenced by DoLorentzBoost(), and PrepareInitialState().

◆ theDiffExcitaton

G4QGSDiffractiveExcitation G4QGSParticipants::theDiffExcitaton
protected

Definition at line 149 of file G4QGSParticipants.hh.

Referenced by PerformDiffractiveCollisions().

◆ theInteractions

std::vector<G4InteractionContent*> G4QGSParticipants::theInteractions
protected

◆ TheInvolvedNucleonsOfProjectile

G4Nucleon* G4QGSParticipants::TheInvolvedNucleonsOfProjectile[250]
private

Definition at line 183 of file G4QGSParticipants.hh.

Referenced by BuildInteractions(), G4QGSParticipants(), and PutOnMassShell().

◆ TheInvolvedNucleonsOfTarget

G4Nucleon* G4QGSParticipants::TheInvolvedNucleonsOfTarget[250]
private

◆ theNucleonRadius

const G4double G4QGSParticipants::theNucleonRadius
protected

Definition at line 164 of file G4QGSParticipants.hh.

Referenced by GetList().

◆ theNucleus

G4V3DNucleus* G4VParticipants::theNucleus
protectedinherited

◆ thePartonPairs

std::vector<G4PartonPair*> G4QGSParticipants::thePartonPairs
protected

Definition at line 145 of file G4QGSParticipants.hh.

Referenced by CreateStrings(), GetNextPartonPair(), and PerformSoftCollisions().

◆ theProjectile

G4ReactionProduct G4QGSParticipants::theProjectile
private

◆ theProjectileNucleus

G4V3DNucleus* G4VParticipants::theProjectileNucleus
protectedinherited

◆ theProjectileSplitable

G4QGSMSplitableHadron* G4QGSParticipants::theProjectileSplitable
protected

◆ theQuarkExchange

G4QuarkExchange G4QGSParticipants::theQuarkExchange
protected

Definition at line 147 of file G4QGSParticipants.hh.

Referenced by PerformDiffractiveCollisions().

◆ theSingleDiffExcitation

G4SingleDiffractiveExcitation G4QGSParticipants::theSingleDiffExcitation
protected

Definition at line 148 of file G4QGSParticipants.hh.

Referenced by PerformDiffractiveCollisions().

◆ theTargets

std::vector<G4VSplitableHadron*> G4QGSParticipants::theTargets
protected

◆ ThresholdParameter

const G4double G4QGSParticipants::ThresholdParameter
protected

The documentation for this class was generated from the following files: