85{
97 std::vector< G4DynamicParticle * > secondaryParticleVector;
99
100
105
106
108 * nucleusMomentumVector );
109
110 if ( verboseLevel >= 10 )
111 G4cout <<
" G4BertiniEvaporation : initial kinematics : boostToLab vector = " << boostToLab <<
G4endl
112 <<
" excitation energy : " << excE<<
G4endl;
113
114 if ( nucleusA == 8 && nucleusZ == 4 )
115 {
116 splitBe8( excE, boostToLab, secondaryParticleVector );
117 fillResult( secondaryParticleVector, result);
118 return result;
119 }
120
121
122
123 std::vector< G4BertiniEvaporationChannel * >::iterator iChannel = channelVector.begin();
124 totalProbability = 0;
125 for ( ; iChannel != channelVector.end() ; *iChannel++ )
126 {
127 ( *iChannel )->setNucleusA( nucleusA );
128 ( *iChannel )->setNucleusZ( nucleusZ );
129 ( *iChannel )->setExcitationEnergy( excE );
130 ( *iChannel )->setPairingCorrection( 1 );
131 ( *iChannel )->calculateProbability();
132 totalProbability += ( *iChannel )->getProbability();
133 }
134
135
136 if ( totalProbability == 0 )
137 {
138 if ( verboseLevel >= 4 )
139 G4cout <<
"G4BertiniEvaporation : no emission possible with pairing correction, trying without it" <<
G4endl;
140 for ( iChannel = channelVector.begin() ; iChannel != channelVector.end() ; *iChannel++ )
141 {
142 ( *iChannel )->setPairingCorrection(0);
143 ( *iChannel )->calculateProbability();
144 totalProbability += ( *iChannel )->getProbability();
145 }
146 if ( verboseLevel >= 4 )
147 G4cout <<
" probability without correction " << totalProbability <<
G4endl;
148
149 }
150
151
152
153 while ( totalProbability > 0 )
154 {
156
157
159 if ( verboseLevel >= 10 )
G4cout <<
" RandomProb : " << sampledProbability <<
G4endl;
160 for ( iChannel = channelVector.begin() ; iChannel != channelVector.end() ; *iChannel++ )
161 {
162 sampledProbability -= ( *iChannel )->getProbability();
163 if ( sampledProbability < 0 ) break;
164 }
165 pSelectedChannel = ( *iChannel );
166 if ( iChannel == channelVector.end() )
167 throw G4HadronicException(__FILE__, __LINE__,
"G4BertiniEvaporation : Error while sampling evaporation particle" );
168
169 if ( verboseLevel >= 4 )
170 G4cout <<
"G4BertiniEvaporation : particle " << pSelectedChannel->
getName() <<
" selected " <<
G4endl;
171
172
173
174 i = 0;
175
176 do
177 {
178 pEmittedParticle = pSelectedChannel->
emit();
179
180
181
182
185
187
188
189
190
191
192
194 nucleusKineticEnergy = std::pow( nucleusTotalMomentum, 2 ) / ( 2 * mRes );
195 newExcitation = excE - pEmittedParticle->
GetKineticEnergy() - nucleusKineticEnergy - pSelectedChannel->
getQ();
196
197 if ( verboseLevel >= 10)
198 G4cout <<
"G4BertiniEvaporation : Kinematics " <<
G4endl
199 << " part kinetic E in CMS = "
201 << " new excitation E = "
202 << newExcitation <<
G4endl;
203
204 i++;
205 if ( !( newExcitation > 0 ) && i < 10) delete pEmittedParticle;
206 } while ( !( newExcitation > 0 ) && i < 10 );
207
208 if ( i >= 10 )
209 {
210
211
212
213
214 delete pEmittedParticle;
215
216 if ( verboseLevel >= 4 )
217 G4cout <<
"G4BertiniEvaporation : No appropriate energy for particle "
219
221
222 totalProbability = 0;
223 for ( ; iChannel != channelVector.end() ; *iChannel++ )
224 totalProbability += ( *iChannel )->getProbability();
225 }
226 else
227 {
228
229
230
233 nucleusKineticEnergy + mRes );
234 particleFourVector.
boost( boostToLab );
235 nucleusFourVector.
boost( boostToLab );
237 particleFourVector.
e(),
238 particleFourVector.
vect() );
239 secondaryParticleVector.push_back( pPartLab );
240
241
244 excE = newExcitation;
245 boostToLab =
G4ThreeVector ( ( 1/mRes ) * nucleusFourVector.vect() );
246
247 if ( verboseLevel >= 10 )
252 <<
" particle mass " << pEmittedParticle->
GetMass() <<
G4endl
253 <<
" boost vect " << boostToLab <<
G4endl
254 <<
" boosted 4v " << particleFourVector <<
G4endl
255 <<
" nucleus 4v " << nucleusFourVector <<
G4endl
256 <<
" nucl cm mom " << nucleusTotalMomentum <<
G4endl
258 <<
" new boost vector " << boostToLab <<
G4endl;
259
260 delete pEmittedParticle;
261
262
263 if ( nucleusA == 8 && nucleusZ == 4 )
264 {
265 splitBe8( excE, boostToLab, secondaryParticleVector );
266 fillResult( secondaryParticleVector, result);
267 return result;
268 }
269
270
271
272 totalProbability = 0;
273 for ( iChannel = channelVector.begin() ; iChannel != channelVector.end() ; *iChannel++ )
274 {
275 ( *iChannel )->setNucleusA( nucleusA );
276 ( *iChannel )->setNucleusZ( nucleusZ );
277 ( *iChannel )->setExcitationEnergy( excE );
278 ( *iChannel )->calculateProbability();
279 totalProbability += ( *iChannel )->getProbability();
280 }
281 }
282 }
283
284
290
291
292
293
296
297 while ( excE > 0 )
298 {
299 pEmittedParticle = pGammaChannel->
emit();
301
302 if ( ( totalDeExcEnergy + gammaEnergy ) > excE )
303 {
304
305 gammaEnergy = excE - totalDeExcEnergy;
306 excE = 0;
307 }
308
309 totalDeExcEnergy += gammaEnergy;
310
311 if ( verboseLevel >= 10 )
312 G4cout <<
" G4BertiniEvaporation : gamma de-excitation, g of " << gammaEnergy <<
" MeV " <<
G4endl;
313
316 gammaFourVector.boost( boostToLab );
319
320 secondaryParticleVector.push_back( pEmittedParticle );
321
322 }
323
324 delete pGammaChannel;
325
326
327
328 fillResult( secondaryParticleVector, result);
329
330 return result;
331}
std::vector< G4Fragment * > G4FragmentVector
CLHEP::Hep3Vector G4ThreeVector
HepLorentzVector & boost(double, double, double)
G4DynamicParticle * emit()
void setNucleusZ(G4int inputZ)
void setNucleusA(G4int inputA)
void setExcitationEnergy(G4double inputE)
void setVerboseLevel(G4int verbose)
virtual void setProbability(G4double newProb)
virtual G4DynamicParticle * emit()=0
void SetMomentumDirection(const G4ThreeVector &aDirection)
G4ParticleDefinition * GetDefinition() const
G4LorentzVector Get4Momentum() const
G4double GetKineticEnergy() const
G4double GetTotalEnergy() const
G4ThreeVector GetMomentum() const
G4double GetTotalMomentum() const
void SetKineticEnergy(G4double aEnergy)
G4ThreeVector GetMomentum()
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4double GetEnergyDeposit()