#include <G4ExcitationHandler.hh>
Public Member Functions | |
G4ExcitationHandler () | |
~G4ExcitationHandler () | |
G4ReactionProductVector * | BreakItUp (const G4Fragment &theInitialState) const |
void | SetEvaporation (G4VEvaporation *ptr) |
void | SetMultiFragmentation (G4VMultiFragmentation *ptr) |
void | SetFermiModel (G4VFermiBreakUp *ptr) |
void | SetPhotonEvaporation (G4VEvaporationChannel *ptr) |
void | SetMaxZForFermiBreakUp (G4int aZ) |
void | SetMaxAForFermiBreakUp (G4int anA) |
void | SetMaxAandZForFermiBreakUp (G4int anA, G4int aZ) |
void | SetMinEForMultiFrag (G4double anE) |
G4VEvaporation * | GetEvaporation () |
G4VMultiFragmentation * | GetMultiFragmentation () |
G4VFermiBreakUp * | GetFermiModel () |
G4VEvaporationChannel * | SetPhotonEvaporation () |
void | SetOPTxs (G4int opt) |
void | UseSICB () |
Definition at line 63 of file G4ExcitationHandler.hh.
G4ExcitationHandler::G4ExcitationHandler | ( | ) |
Definition at line 87 of file G4ExcitationHandler.cc.
References G4ParticleTable::GetIonTable(), G4ParticleTable::GetParticleTable(), and G4FermiFragmentsPool::Instance().
00087 : 00088 maxZForFermiBreakUp(9),maxAForFermiBreakUp(17),minEForMultiFrag(4*GeV), 00089 minExcitation(keV),OPTxs(3),useSICB(false),isEvapLocal(true) 00090 { 00091 theTableOfIons = G4ParticleTable::GetParticleTable()->GetIonTable(); 00092 00093 theMultiFragmentation = new G4StatMF; 00094 theFermiModel = new G4FermiBreakUp; 00095 thePhotonEvaporation = new G4PhotonEvaporation; 00096 theEvaporation = new G4Evaporation(thePhotonEvaporation); 00097 thePool = G4FermiFragmentsPool::Instance(); 00098 SetParameters(); 00099 }
G4ExcitationHandler::~G4ExcitationHandler | ( | ) |
Definition at line 101 of file G4ExcitationHandler.cc.
00102 { 00103 if(isEvapLocal) { delete theEvaporation; } 00104 delete theMultiFragmentation; 00105 delete theFermiModel; 00106 }
G4ReactionProductVector * G4ExcitationHandler::BreakItUp | ( | const G4Fragment & | theInitialState | ) | const |
Definition at line 118 of file G4ExcitationHandler.cc.
References G4Alpha::AlphaDefinition(), G4VEvaporation::BreakItUp(), G4VFermiBreakUp::BreakItUp(), G4VMultiFragmentation::BreakItUp(), G4VEvaporationChannel::BreakUpFragment(), G4Deuteron::DeuteronDefinition(), G4Fragment::GetA_asInt(), G4VFermiFragment::GetExcitationEnergy(), G4Fragment::GetExcitationEnergy(), G4FermiFragmentsPool::GetFragment(), G4IonTable::GetIon(), G4NistManager::GetIsotopeAbundance(), G4Fragment::GetZ_asInt(), G4He3::He3Definition(), G4NistManager::Instance(), G4VFermiFragment::IsStable(), G4Neutron::NeutronDefinition(), G4Proton::ProtonDefinition(), G4ReactionProduct::SetFormationTime(), G4ReactionProduct::SetMomentum(), G4ReactionProduct::SetTotalEnergy(), and G4Triton::TritonDefinition().
Referenced by G4WilsonAbrasionModel::ApplyYourself(), G4QMDReaction::ApplyYourself(), G4ParaFissionModel::ApplyYourself(), G4LowEIonFragmentation::ApplyYourself(), G4INCLXXInterface::ApplyYourself(), G4StopTheoDeexcitation::BreakUp(), and G4PreCompoundDeexcitation::deExcite().
00119 { 00120 //G4cout << "@@@@@@@@@@ Start G4Excitation Handler @@@@@@@@@@@@@" << G4endl; 00121 00122 // Variables existing until end of method 00123 G4Fragment * theInitialStatePtr = new G4Fragment(theInitialState); 00124 00125 G4FragmentVector * theTempResult = 0; // pointer which receives temporal results 00126 std::list<G4Fragment*> theEvapList; // list to apply Evaporation or Fermi Break-Up 00127 std::list<G4Fragment*> thePhotoEvapList; // list to apply PhotonEvaporation 00128 std::list<G4Fragment*> theResults; // list to store final result 00129 // 00130 //G4cout << theInitialState << G4endl; 00131 00132 // Variables to describe the excited configuration 00133 G4double exEnergy = theInitialState.GetExcitationEnergy(); 00134 G4int A = theInitialState.GetA_asInt(); 00135 G4int Z = theInitialState.GetZ_asInt(); 00136 00137 G4NistManager* nist = G4NistManager::Instance(); 00138 00139 // In case A <= 1 the fragment will not perform any nucleon emission 00140 if (A <= 1) 00141 { 00142 theResults.push_back( theInitialStatePtr ); 00143 } 00144 // check if a fragment is stable 00145 else if(exEnergy < minExcitation && nist->GetIsotopeAbundance(Z, A) > 0.0) 00146 { 00147 theResults.push_back( theInitialStatePtr ); 00148 } 00149 else 00150 { 00151 // JMQ 150909: first step in de-excitation is treated separately 00152 // Fragments after the first step are stored in theEvapList 00153 // Statistical Multifragmentation will take place only once 00154 // 00155 // move to evaporation loop 00156 if((A<maxAForFermiBreakUp && Z<maxZForFermiBreakUp) 00157 || exEnergy <= minEForMultiFrag*A) 00158 { 00159 theEvapList.push_back(theInitialStatePtr); 00160 } 00161 else 00162 { 00163 theTempResult = theMultiFragmentation->BreakItUp(theInitialState); 00164 if(!theTempResult) { theEvapList.push_back(theInitialStatePtr); } 00165 else { 00166 size_t nsec = theTempResult->size(); 00167 if(0 == nsec) { theEvapList.push_back(theInitialStatePtr); } 00168 else { 00169 // secondary are produced 00170 // Sort out secondary fragments 00171 G4bool deletePrimary = true; 00172 G4FragmentVector::iterator j; 00173 for (j = theTempResult->begin(); j != theTempResult->end(); ++j) { 00174 if((*j) == theInitialStatePtr) { deletePrimary = false; } 00175 A = (*j)->GetA_asInt(); 00176 00177 // gamma, p, n 00178 if(A <= 1) { theResults.push_back(*j); } 00179 00180 // Analyse fragment A > 1 00181 else { 00182 G4double exEnergy1 = (*j)->GetExcitationEnergy(); 00183 00184 // cold fragments 00185 if(exEnergy1 < minExcitation) { 00186 Z = (*j)->GetZ_asInt(); 00187 if(nist->GetIsotopeAbundance(Z, A) > 0.0) { 00188 theResults.push_back(*j); // stable fragment 00189 00190 } else { 00191 00192 // check if the cold fragment is from FBU pool 00193 const G4VFermiFragment* ffrag = thePool->GetFragment(Z, A); 00194 if(ffrag) { 00195 if(ffrag->IsStable()) { theResults.push_back(*j); } 00196 else { theEvapList.push_back(*j); } 00197 00198 // cold fragment may be unstable 00199 } else { 00200 theEvapList.push_back(*j); 00201 } 00202 } 00203 00204 // hot fragments are unstable 00205 } else { theEvapList.push_back(*j); } 00206 } 00207 } 00208 if( deletePrimary ) { delete theInitialStatePtr; } 00209 } 00210 delete theTempResult; 00211 } 00212 } 00213 } 00214 /* 00215 G4cout << "## After first step " << theEvapList.size() << " for evap; " 00216 << thePhotoEvapList.size() << " for photo-evap; " 00217 << theResults.size() << " results. " << G4endl; 00218 */ 00219 // ----------------------------------- 00220 // FermiBreakUp and De-excitation loop 00221 // ----------------------------------- 00222 00223 std::list<G4Fragment*>::iterator iList; 00224 for (iList = theEvapList.begin(); iList != theEvapList.end(); ++iList) 00225 { 00226 //G4cout << "Next evaporate: " << G4endl; 00227 //G4cout << *iList << G4endl; 00228 A = (*iList)->GetA_asInt(); 00229 Z = (*iList)->GetZ_asInt(); 00230 00231 // Fermi Break-Up 00232 G4bool wasFBU = false; 00233 if (A < maxAForFermiBreakUp && Z < maxZForFermiBreakUp) 00234 { 00235 theTempResult = theFermiModel->BreakItUp(*(*iList)); 00236 wasFBU = true; 00237 // if initial fragment returned unchanged try to evaporate it 00238 if(1 == theTempResult->size()) { 00239 delete theTempResult; 00240 theTempResult = theEvaporation->BreakItUp(*(*iList)); 00241 } 00242 } 00243 else // apply Evaporation in another case 00244 { 00245 theTempResult = theEvaporation->BreakItUp(*(*iList)); 00246 } 00247 00248 G4bool deletePrimary = true; 00249 size_t nsec = theTempResult->size(); 00250 //G4cout << "Nproducts= " << nsec << G4endl; 00251 00252 // Sort out secondary fragments 00253 if ( nsec > 0 ) { 00254 G4FragmentVector::iterator j; 00255 for (j = theTempResult->begin(); j != theTempResult->end(); ++j) { 00256 if((*j) == (*iList)) { deletePrimary = false; } 00257 00258 //G4cout << *j << G4endl; 00259 A = (*j)->GetA_asInt(); 00260 exEnergy = (*j)->GetExcitationEnergy(); 00261 00262 if(A <= 1) { theResults.push_back(*j); } // gamma, p, n 00263 00264 // evaporation is not possible 00265 else if(1 == nsec) { 00266 if(exEnergy < minExcitation) { theResults.push_back(*j); } 00267 else { thePhotoEvapList.push_back(*j); } 00268 00269 } else { // Analyse fragment 00270 00271 // cold fragment 00272 if(exEnergy < minExcitation) { 00273 Z = (*j)->GetZ_asInt(); 00274 00275 // natural isotope 00276 if(nist->GetIsotopeAbundance(Z, A) > 0.0) { 00277 theResults.push_back(*j); // stable fragment 00278 00279 } else { 00280 const G4VFermiFragment* ffrag = thePool->GetFragment(Z, A); 00281 00282 // isotope from FBU pool 00283 if(ffrag) { 00284 if(ffrag->IsStable()) { theResults.push_back(*j); } 00285 else { theEvapList.push_back(*j); } 00286 00287 // isotope may be unstable 00288 } else { 00289 theEvapList.push_back(*j); 00290 } 00291 } 00292 00293 // hot fragment 00294 } else if (wasFBU) { 00295 thePhotoEvapList.push_back(*j); // FBU applied only once 00296 } else { 00297 theEvapList.push_back(*j); 00298 } 00299 } 00300 } 00301 } 00302 if( deletePrimary ) { delete (*iList); } 00303 delete theTempResult; 00304 } // end of the loop over theEvapList 00305 00306 //G4cout << "## After 2nd step " << theEvapList.size() << " was evap; " 00307 // << thePhotoEvapList.size() << " for photo-evap; " 00308 // << theResults.size() << " results. " << G4endl; 00309 00310 // ----------------------- 00311 // Photon-Evaporation loop 00312 // ----------------------- 00313 00314 // at this point only photon evaporation is possible 00315 for(iList = thePhotoEvapList.begin(); iList != thePhotoEvapList.end(); ++iList) 00316 { 00317 //G4cout << "Next photon evaporate: " << thePhotonEvaporation << G4endl; 00318 //G4cout << *iList << G4endl; 00319 exEnergy = (*iList)->GetExcitationEnergy(); 00320 00321 // only hot fragments 00322 if(exEnergy >= minExcitation) { 00323 theTempResult = thePhotonEvaporation->BreakUpFragment(*iList); 00324 size_t nsec = theTempResult->size(); 00325 //G4cout << "Nproducts= " << nsec << G4endl; 00326 00327 // if there is a gamma emission then 00328 if (nsec > 0) 00329 { 00330 G4FragmentVector::iterator j; 00331 for (j = theTempResult->begin(); j != theTempResult->end(); ++j) 00332 { 00333 theResults.push_back(*j); 00334 } 00335 } 00336 delete theTempResult; 00337 } 00338 00339 // priamry fragment is kept 00340 theResults.push_back(*iList); 00341 00342 } // end of photon-evaporation loop 00343 00344 //G4cout << "## After 3d step " << theEvapList.size() << " was evap; " 00345 // << thePhotoEvapList.size() << " was photo-evap; " 00346 // << theResults.size() << " results. " << G4endl; 00347 00348 G4ReactionProductVector * theReactionProductVector = new G4ReactionProductVector; 00349 00350 // MAC (24/07/08) 00351 // To optimise the storing speed, we reserve space in memory for the vector 00352 theReactionProductVector->reserve( theResults.size() ); 00353 00354 G4int theFragmentA, theFragmentZ; 00355 00356 std::list<G4Fragment*>::iterator i; 00357 for (i = theResults.begin(); i != theResults.end(); ++i) 00358 { 00359 theFragmentA = (*i)->GetA_asInt(); 00360 theFragmentZ = (*i)->GetZ_asInt(); 00361 G4ParticleDefinition* theKindOfFragment = 0; 00362 if (theFragmentA == 0) { // photon or e- 00363 theKindOfFragment = (*i)->GetParticleDefinition(); 00364 } else if (theFragmentA == 1 && theFragmentZ == 0) { // neutron 00365 theKindOfFragment = G4Neutron::NeutronDefinition(); 00366 } else if (theFragmentA == 1 && theFragmentZ == 1) { // proton 00367 theKindOfFragment = G4Proton::ProtonDefinition(); 00368 } else if (theFragmentA == 2 && theFragmentZ == 1) { // deuteron 00369 theKindOfFragment = G4Deuteron::DeuteronDefinition(); 00370 } else if (theFragmentA == 3 && theFragmentZ == 1) { // triton 00371 theKindOfFragment = G4Triton::TritonDefinition(); 00372 } else if (theFragmentA == 3 && theFragmentZ == 2) { // helium3 00373 theKindOfFragment = G4He3::He3Definition(); 00374 } else if (theFragmentA == 4 && theFragmentZ == 2) { // alpha 00375 theKindOfFragment = G4Alpha::AlphaDefinition();; 00376 } else { 00377 theKindOfFragment = 00378 theTableOfIons->GetIon(theFragmentZ,theFragmentA,0.0); 00379 } 00380 if (theKindOfFragment != 0) 00381 { 00382 G4ReactionProduct * theNew = new G4ReactionProduct(theKindOfFragment); 00383 theNew->SetMomentum((*i)->GetMomentum().vect()); 00384 theNew->SetTotalEnergy((*i)->GetMomentum().e()); 00385 theNew->SetFormationTime((*i)->GetCreationTime()); 00386 theReactionProductVector->push_back(theNew); 00387 } 00388 delete (*i); 00389 } 00390 00391 return theReactionProductVector; 00392 }
G4VEvaporation * G4ExcitationHandler::GetEvaporation | ( | ) | [inline] |
G4VFermiBreakUp * G4ExcitationHandler::GetFermiModel | ( | ) | [inline] |
G4VMultiFragmentation * G4ExcitationHandler::GetMultiFragmentation | ( | ) | [inline] |
void G4ExcitationHandler::SetEvaporation | ( | G4VEvaporation * | ptr | ) |
Definition at line 394 of file G4ExcitationHandler.cc.
References G4VEvaporation::GetPhotonEvaporation().
Referenced by G4EMDissociation::G4EMDissociation(), G4QMDReaction::G4QMDReaction(), G4WilsonAbrasionModel::G4WilsonAbrasionModel(), and G4WilsonAbrasionModel::SetUseAblation().
00395 { 00396 if(ptr && ptr != theEvaporation) { 00397 delete theEvaporation; 00398 theEvaporation = ptr; 00399 thePhotonEvaporation = ptr->GetPhotonEvaporation(); 00400 SetParameters(); 00401 isEvapLocal = false; 00402 } 00403 }
void G4ExcitationHandler::SetFermiModel | ( | G4VFermiBreakUp * | ptr | ) |
Definition at line 414 of file G4ExcitationHandler.cc.
Referenced by G4EMDissociation::G4EMDissociation(), G4WilsonAbrasionModel::G4WilsonAbrasionModel(), and G4WilsonAbrasionModel::SetUseAblation().
00415 { 00416 if(ptr && ptr != theFermiModel) { 00417 delete theFermiModel; 00418 theFermiModel = ptr; 00419 } 00420 }
Definition at line 441 of file G4ExcitationHandler.cc.
References SetMaxAForFermiBreakUp(), and SetMaxZForFermiBreakUp().
Referenced by G4EMDissociation::G4EMDissociation(), G4WilsonAbrasionModel::G4WilsonAbrasionModel(), and G4WilsonAbrasionModel::SetUseAblation().
00442 { 00443 SetMaxAForFermiBreakUp(anA); 00444 SetMaxZForFermiBreakUp(aZ); 00445 }
void G4ExcitationHandler::SetMaxAForFermiBreakUp | ( | G4int | anA | ) |
void G4ExcitationHandler::SetMaxZForFermiBreakUp | ( | G4int | aZ | ) |
void G4ExcitationHandler::SetMinEForMultiFrag | ( | G4double | anE | ) |
Definition at line 447 of file G4ExcitationHandler.cc.
Referenced by G4StopTheoDeexcitation::BreakUp(), G4EMDissociation::G4EMDissociation(), G4WilsonAbrasionModel::G4WilsonAbrasionModel(), and G4WilsonAbrasionModel::SetUseAblation().
void G4ExcitationHandler::SetMultiFragmentation | ( | G4VMultiFragmentation * | ptr | ) |
Definition at line 406 of file G4ExcitationHandler.cc.
Referenced by G4EMDissociation::G4EMDissociation(), G4WilsonAbrasionModel::G4WilsonAbrasionModel(), and G4WilsonAbrasionModel::SetUseAblation().
00407 { 00408 if(ptr && ptr != theMultiFragmentation) { 00409 delete theMultiFragmentation; 00410 theMultiFragmentation = ptr; 00411 } 00412 }
void G4ExcitationHandler::SetOPTxs | ( | G4int | opt | ) | [inline] |
G4VEvaporationChannel * G4ExcitationHandler::SetPhotonEvaporation | ( | ) | [inline] |
void G4ExcitationHandler::SetPhotonEvaporation | ( | G4VEvaporationChannel * | ptr | ) |
Definition at line 423 of file G4ExcitationHandler.cc.
References G4VEvaporation::SetPhotonEvaporation().
00424 { 00425 if(ptr && ptr != thePhotonEvaporation) { 00426 thePhotonEvaporation = ptr; 00427 theEvaporation->SetPhotonEvaporation(ptr); 00428 } 00429 }
void G4ExcitationHandler::UseSICB | ( | ) | [inline] |