100 if ( Parton[0] != NULL )
return;
104 G4int stringStart, stringEnd;
105 ChooseStringEnds( PDGcode, &stringStart, &stringEnd );
107 Parton[0] =
new G4Parton( stringStart );
108 Parton[1] =
new G4Parton( stringEnd );
128 if ( PartonIndex > 1 || PartonIndex < 0 )
return NULL;
129 G4int PartonInd( PartonIndex );
130 if ( PartonIndex == 1 ) PartonIndex = -1;
131 return Parton[ PartonInd ];
139 if ( PartonIndex > 1 || PartonIndex < 0 )
return NULL;
140 G4int PartonInd( PartonIndex );
141 if ( PartonIndex == 1 ) PartonIndex = -1;
142 return Parton[ PartonInd ];
150 Parton[0] =
new G4Parton( PDGcode );
158 Parton[1] =
new G4Parton( PDGcode );
164 void G4DiffractiveSplitableHadron::ChooseStringEnds(
G4int PDGcode,
G4int* aEnd,
165 G4int* bEnd )
const {
166 G4int absPDGcode = std::abs( PDGcode );
168 if ( absPDGcode < 1000 ) {
169 G4int heavy(0), light(0);
170 if(!((absPDGcode == 111)||(absPDGcode == 221)||(absPDGcode == 331)))
172 heavy = absPDGcode/100;
173 light = (absPDGcode % 100)/10;
176 if (PDGcode < 0 ) anti *= -1;
183 else {heavy = 2; light = -2;}
193 G4int j1000 = PDGcode/1000;
194 G4int j100 = (PDGcode % 1000)/100;
195 G4int j10 = (PDGcode % 100)/10;
198 if((j1000 == j100) && (j1000 == j10)) SuppresUUDDSS=1.;
201 const G4int maxNumberOfLoops = 1000;
202 G4int loopCounter = 0;
209 if(( j100 == j10 ) && (
G4UniformRand() > SuppresUUDDSS ))
continue;
211 if( j100 == j10 ) {*bEnd = Diquark( j100, j10, 1 );}
213 if(
G4UniformRand() > 0.25) {*bEnd = Diquark( j100, j10, 0 );}
214 else {*bEnd = Diquark( j100, j10, 1 );}
217 else if(random < 0.66667)
219 if(( j1000 == j10 ) && (
G4UniformRand() > SuppresUUDDSS ))
continue;
221 if( j1000 == j10 ) {*bEnd = Diquark( j1000, j10, 1 );}
223 if(
G4UniformRand() > 0.25) {*bEnd = Diquark( j1000, j10, 0 );}
224 else {*bEnd = Diquark( j1000, j10, 1 );}
229 if(( j1000 == j100 ) && (
G4UniformRand() > SuppresUUDDSS ))
continue;
231 if( j1000 == j100 ) {*bEnd = Diquark( j1000, j100, 1 );}
233 if(
G4UniformRand() > 0.25) {*bEnd = Diquark( j1000, j100, 0 );}
234 else {*bEnd = Diquark( j1000, j100, 1 );}
238 ++loopCounter < maxNumberOfLoops );
239 if ( loopCounter >= maxNumberOfLoops ) {
240 *aEnd = j10; *bEnd = Diquark( j1000, j100, 1 );
279 G4int diquarkPDG =
std::max( std::abs( aquark ), std::abs( bquark ) ) * 1000 +
280 std::min( std::abs( aquark ), std::abs( bquark ) ) * 100 +
282 return ( aquark > 0 && bquark > 0 ) ? diquarkPDG : -1*diquarkPDG;
G4Parton * GetNextParton()
G4DiffractiveSplitableHadron()
G4int GetPDGEncoding() const
G4Parton * GetNextAntiParton()
void SetFirstParton(G4int PDGcode)
const G4ParticleDefinition * GetDefinition() const
void SetSecondParton(G4int PDGcode)
~G4DiffractiveSplitableHadron()
T max(const T t1, const T t2)
brief Return the largest of the two arguments
T min(const T t1, const T t2)
brief Return the smallest of the two arguments