114 if (
Color.size()!=0)
return;
139 G4double transverseMass2 = HadronMom.plus()*HadronMom.minus();
140 G4double maxAvailMomentum2 =
sqr(std::sqrt(transverseMass2) - std::sqrt(pt2));
147 RightMom.setPx(HadronMom.px() - pt.x());
148 RightMom.setPy(HadronMom.py() - pt.y());
151 G4double Local1 = HadronMom.minus() + (RightMom.perp2() - LeftMom.perp2())/HadronMom.plus();
152 G4double Local2 = std::sqrt(
std::max(0.,
sqr(Local1) - 4.*RightMom.perp2()*HadronMom.minus()/HadronMom.plus()));
155 G4double RightMinus = 0.5*(Local1 + Local2);
156 G4double LeftMinus = HadronMom.minus() - RightMinus;
159 G4double LeftPlus = LeftMom.perp2()/LeftMinus;
160 G4double RightPlus = HadronMom.plus() - LeftPlus;
162 LeftMom.setPz(0.5*(LeftPlus - LeftMinus));
163 LeftMom.setE (0.5*(LeftPlus + LeftMinus));
164 RightMom.setPz(0.5*(RightPlus - RightMinus));
165 RightMom.setE (0.5*(RightPlus + RightMinus));
169 Color.push_back(Left);
188 while(Xmin>=1-(2*nSeaPair+1)*Xmin) Xmin*=0.95;
191 for (aSeaPair = 0; aSeaPair < nSeaPair; aSeaPair++)
218 Color.push_back(aParton);
223 aParton->
SetSpinZ(-firstPartonSpinZ);
251 if (ColorEncoding < 0)
265 Color.push_back(pColorParton);
283 G4int NumberOfUnsampledSeaQuarks = 2*nSeaPair;
284 ColorX =
SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta);
285 Color.back()->SetX(SumX = ColorX);
286 for(
G4int aPair = 0; aPair < nSeaPair; aPair++)
288 NumberOfUnsampledSeaQuarks--;
289 ColorX =
SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta);
290 Color[aPair]->SetX(ColorX);
292 NumberOfUnsampledSeaQuarks--;
293 AntiColorX =
SampleX(Xmin, NumberOfUnsampledSeaQuarks, 2*nSeaPair, aBeta);
296 if (1. - SumX <= Xmin)
break;
299 while (1. - SumX <= Xmin);
304 for(aSeaPair = 0; aSeaPair < nSeaPair+1; aSeaPair++)
381 while((R = -widthSquare*std::log(
G4UniformRand())) > maxPtSquare) {;}
390 if (isAntiQuark) aPDGCode*=-1;
405 for(
G4int ii=1; ii<100; ii++)
408 y *= std::pow( std::pow(1-anXmin-totalSea*anXmin,
alpha+1) - std::pow(anXmin,
alpha+1), nSea);
409 y *= std::pow(1-anXmin-totalSea*anXmin, aBeta+1) - std::pow(anXmin, aBeta+1);
413 G4double xMax=1-(totalSea+1)*anXmin;
416 G4cout <<
"anXmin = "<<anXmin<<
" nSea = "<<nSea<<
" totalSea = "<< totalSea<<
G4endl;
417 throw G4HadronicException(__FILE__, __LINE__,
"G4QGSMSplitableHadron - Fatal: Cannot sample parton densities under these constraints.");
422 y = std::pow(x1,
alpha);
423 y *= std::pow( std::pow(1-x1-totalSea*anXmin,
alpha+1) - std::pow(anXmin,
alpha+1), nSea);
424 y *= std::pow(1-x1-totalSea*anXmin, aBeta+1) - std::pow(anXmin, aBeta+1);
ThreeVector shoot(const G4int Ap, const G4int Af)
static G4KaonPlus * KaonPlusDefinition()
CLHEP::Hep3Vector G4ThreeVector
G4Parton * BuildSeaQuark(G4bool isAntiQuark, G4int aPDGCode, G4int nSeaPair)
virtual ~G4QGSMSplitableHadron()
G4int GetSoftCollisionCount()
static G4KaonMinus * KaonMinusDefinition()
G4ThreeVector GaussianPt(G4double widthSquare, G4double maxPtSquare)
const G4LorentzVector & Get4Momentum() const
void Set4Momentum(const G4LorentzVector &aMomentum)
G4int GetPDGEncoding() const
std::deque< G4Parton * > AntiColor
void GetValenceQuarkFlavors(const G4ParticleDefinition *aPart, G4Parton *&Parton1, G4Parton *&Parton2)
static G4PionZero * PionZeroDefinition()
G4ParticleDefinition * GetDefinition() const
G4MesonSplitter theMesonSplitter
void DefineMomentumInZ(G4double aLightConeMomentum, G4bool aDirection)
G4GLOB_DLL std::ostream G4cout
static G4PionMinus * PionMinusDefinition()
static G4PionPlus * PionPlusDefinition()
void SetColour(G4int aColour)
const G4LorentzVector & Get4Momentum() const
void SetSpinZ(G4double aSpinZ)
G4double SampleX(G4double anXmin, G4int nSea, G4int theTotalSea, G4double aBeta)
G4double GetPDGMass() const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
static G4PionMinus * PionMinus()
G4bool SplitMeson(G4int PDGcode, G4int *aEnd, G4int *bEnd)
const G4ThreeVector & GetPosition() const
G4double GetPDGSpin() const
G4double minTransverseMass
void DiffractiveSplitUp()
G4BaryonSplitter theBaryonSplitter
G4int GetBaryonNumber() const
void SetPosition(const G4ThreeVector &aPosition)
static G4Gamma * GammaDefinition()
CLHEP::HepLorentzVector G4LorentzVector
G4bool SplitBarion(G4int PDGCode, G4int *q_or_qqbar, G4int *qbar_or_qq)