#include <G4VGammaDeexcitation.hh>
Inheritance diagram for G4VGammaDeexcitation:
Public Member Functions | |
G4VGammaDeexcitation () | |
virtual | ~G4VGammaDeexcitation () |
virtual G4VGammaTransition * | CreateTransition ()=0 |
virtual G4bool | CanDoTransition ()=0 |
G4FragmentVector * | DoTransition () |
G4FragmentVector * | DoChain () |
G4Fragment * | GenerateGamma () |
G4Fragment * | GetNucleus () |
void | SetNucleus (G4Fragment *nucleus) |
void | SetVerboseLevel (G4int verbose) |
void | Initialize () |
void | SetEO (G4ElectronOccupancy eo) |
void | SetVaccantSN (G4int val) |
G4ElectronOccupancy | GetEO () |
G4int | GetVacantSN () |
void | SetTimeLimit (G4double value) |
Protected Member Functions | |
void | Update () |
Protected Attributes | |
G4VGammaTransition * | _transition |
G4int | _verbose |
Definition at line 72 of file G4VGammaDeexcitation.hh.
G4VGammaDeexcitation::G4VGammaDeexcitation | ( | ) |
Definition at line 76 of file G4VGammaDeexcitation.cc.
References DBL_MAX.
00076 : _transition(0), _verbose(0), 00077 _electronO (0), _vSN(-1) 00078 { 00079 _nucleus = 0; 00080 fTimeLimit = DBL_MAX; 00081 }
G4VGammaDeexcitation::~G4VGammaDeexcitation | ( | ) | [virtual] |
Definition at line 83 of file G4VGammaDeexcitation.cc.
References _transition.
00084 { 00085 if (_transition != 0) { delete _transition; } 00086 }
virtual G4bool G4VGammaDeexcitation::CanDoTransition | ( | ) | [pure virtual] |
Implemented in G4ContinuumGammaDeexcitation, and G4DiscreteGammaDeexcitation.
Referenced by DoChain(), DoTransition(), and G4PhotonEvaporation::EmittedFragment().
virtual G4VGammaTransition* G4VGammaDeexcitation::CreateTransition | ( | ) | [pure virtual] |
Implemented in G4ContinuumGammaDeexcitation, and G4DiscreteGammaDeexcitation.
Referenced by Initialize(), and Update().
G4FragmentVector * G4VGammaDeexcitation::DoChain | ( | ) |
Definition at line 106 of file G4VGammaDeexcitation.cc.
References _transition, _verbose, CanDoTransition(), G4cout, G4endl, GenerateGamma(), G4Fragment::GetExcitationEnergy(), Initialize(), G4VGammaTransition::SetEnergyFrom(), and Update().
Referenced by G4PhotonEvaporation::BreakItUp(), and G4PhotonEvaporation::BreakUpFragment().
00107 { 00108 if (_verbose > 1) { G4cout << "G4VGammaDeexcitation::DoChain" << G4endl; } 00109 const G4double tolerance = CLHEP::keV; 00110 00111 Initialize(); 00112 G4FragmentVector* products = new G4FragmentVector(); 00113 00114 while (CanDoTransition()) 00115 { 00116 _transition->SetEnergyFrom(_nucleus->GetExcitationEnergy()); 00117 G4Fragment* gamma = GenerateGamma(); 00118 if (gamma != 0) 00119 { 00120 products->push_back(gamma); 00121 //G4cout << "Eex(keV)= " << _nucleus->GetExcitationEnergy()/keV << G4endl; 00122 if(_nucleus->GetExcitationEnergy() <= tolerance) { break; } 00123 Update(); 00124 } 00125 } 00126 00127 if (_verbose > 1) { 00128 G4cout << "G4VGammaDeexcitation::DoChain - Transition deleted, end of chain " << G4endl; 00129 } 00130 00131 return products; 00132 }
G4FragmentVector * G4VGammaDeexcitation::DoTransition | ( | ) |
Definition at line 88 of file G4VGammaDeexcitation.cc.
References _verbose, CanDoTransition(), G4cout, G4endl, GenerateGamma(), and Initialize().
Referenced by G4PhotonEvaporation::BreakUp().
00089 { 00090 Initialize(); 00091 G4FragmentVector* products = new G4FragmentVector(); 00092 00093 if (CanDoTransition()) 00094 { 00095 G4Fragment* gamma = GenerateGamma(); 00096 if (gamma != 0) { products->push_back(gamma); } 00097 } 00098 00099 if (_verbose > 1) { 00100 G4cout << "G4VGammaDeexcitation::DoTransition - Transition deleted " << G4endl; 00101 } 00102 00103 return products; 00104 }
G4Fragment * G4VGammaDeexcitation::GenerateGamma | ( | ) |
Definition at line 134 of file G4VGammaDeexcitation.cc.
References _transition, _verbose, G4Electron::Electron(), G4cout, G4endl, G4UniformRand, G4Gamma::Gamma(), G4DiscreteGammaTransition::GetBondEnergy(), G4Fragment::GetCreationTime(), G4Fragment::GetExcitationEnergy(), G4VGammaTransition::GetGammaCreationTime(), G4VGammaTransition::GetGammaEnergy(), G4Fragment::GetGroundStateMass(), G4DiscreteGammaTransition::GetICM(), G4Fragment::GetMomentum(), G4DiscreteGammaTransition::GetOrbitNumber(), G4ParticleDefinition::GetPDGMass(), G4DiscreteGammaTransition::IsAGamma(), G4ElectronOccupancy::RemoveElectron(), G4VGammaTransition::SelectGamma(), G4Fragment::SetCreationTime(), and G4Fragment::SetMomentum().
Referenced by DoChain(), DoTransition(), and G4PhotonEvaporation::EmittedFragment().
00135 { 00136 // 23/04/10 V.Ivanchenko rewrite complitely 00137 G4double eGamma = 0.; 00138 00139 if (_transition) { 00140 _transition->SelectGamma(); // it can be conversion electron too 00141 eGamma = _transition->GetGammaEnergy(); 00142 //G4cout << "G4VGammaDeexcitation::GenerateGamma - Egam(MeV)= " 00143 // << eGamma << G4endl; 00144 if(eGamma <= 0.0) { return 0; } 00145 } else { return 0; } 00146 00147 G4double excitation = _nucleus->GetExcitationEnergy() - eGamma; 00148 if(excitation < 0.0) { excitation = 0.0; } 00149 if (_verbose > 1) 00150 { 00151 G4cout << "G4VGammaDeexcitation::GenerateGamma - Edeexc(MeV)= " << eGamma 00152 << " ** left Eexc(MeV)= " << excitation 00153 << G4endl; 00154 } 00155 00156 G4double gammaTime = _transition->GetGammaCreationTime(); 00157 00158 // Do complete Lorentz computation 00159 G4LorentzVector lv = _nucleus->GetMomentum(); 00160 G4double Mass = _nucleus->GetGroundStateMass() + excitation; 00161 00162 // select secondary 00163 G4ParticleDefinition* gamma = G4Gamma::Gamma(); 00164 00165 G4DiscreteGammaTransition* dtransition = 00166 dynamic_cast <G4DiscreteGammaTransition*> (_transition); 00167 00168 G4bool eTransition = false; 00169 if (dtransition && !( dtransition->IsAGamma()) ) { 00170 eTransition = true; 00171 gamma = G4Electron::Electron(); 00172 _vSN = dtransition->GetOrbitNumber(); 00173 _electronO.RemoveElectron(_vSN); 00174 lv += G4LorentzVector(0.0,0.0,0.0,CLHEP::electron_mass_c2 - dtransition->GetBondEnergy()); 00175 } 00176 00177 G4double cosTheta = 1. - 2. * G4UniformRand(); 00178 G4double sinTheta = std::sqrt(1. - cosTheta * cosTheta); 00179 G4double phi = twopi * G4UniformRand(); 00180 00181 G4double eMass = gamma->GetPDGMass(); 00182 G4LorentzVector Gamma4P; 00183 00184 //G4cout << "Egamma= " << eGamma << " Mass= " << eMass << " t= " << gammaTime 00185 // << " tlim= " << fTimeLimit << G4endl; 00186 00187 if(gammaTime > fTimeLimit) { 00188 // shortcut for long lived levels 00189 // not correct position of stopping ion gamma emission 00190 // 4-momentum balance is breaked 00191 G4double e = eGamma + eMass; 00192 G4double mom = std::sqrt(eGamma*(eGamma + 2*eMass)); 00193 Gamma4P.set(mom * sinTheta * std::cos(phi), 00194 mom * sinTheta * std::sin(phi), 00195 mom * cosTheta, e); 00196 lv -= Gamma4P; 00197 e = lv.e(); 00198 if(e < Mass) { e = Mass; } 00199 mom = std::sqrt((e - Mass)*(e + Mass)); 00200 G4ThreeVector v = lv.vect().unit(); 00201 lv.set(mom*v.x(), mom*v.y(), mom*v.z(), e); 00202 00203 } else { 00204 // 2-body decay in rest frame 00205 G4double Ecm = lv.mag(); 00206 G4ThreeVector bst = lv.boostVector(); 00207 00208 G4double GammaEnergy = 0.5*((Ecm - Mass)*(Ecm + Mass) + eMass*eMass)/Ecm; 00209 if(GammaEnergy <= eMass) { return 0; } 00210 00211 G4double mom = std::sqrt((GammaEnergy - eMass)*(GammaEnergy + eMass)); 00212 Gamma4P.set(mom * sinTheta * std::cos(phi), 00213 mom * sinTheta * std::sin(phi), 00214 mom * cosTheta, 00215 GammaEnergy); 00216 00217 Gamma4P.boost(bst); 00218 lv -= Gamma4P; 00219 } 00220 00221 // modified primary fragment 00222 gammaTime += _nucleus->GetCreationTime(); 00223 00224 _nucleus->SetMomentum(lv); 00225 _nucleus->SetCreationTime(gammaTime); 00226 00227 // e- is not produced 00228 if(eTransition && !dtransition->GetICM()) { return 0; } 00229 00230 // gamma or e- are produced 00231 G4Fragment * thePhoton = new G4Fragment(Gamma4P,gamma); 00232 thePhoton->SetCreationTime(gammaTime); 00233 00234 //G4cout << "G4VGammaDeexcitation::GenerateGamma : " << thePhoton << G4endl; 00235 //G4cout << " Left nucleus: " << _nucleus << G4endl; 00236 return thePhoton; 00237 }
G4ElectronOccupancy G4VGammaDeexcitation::GetEO | ( | ) | [inline] |
Definition at line 102 of file G4VGammaDeexcitation.hh.
Referenced by G4PhotonEvaporation::BreakItUp(), G4PhotonEvaporation::BreakUp(), and G4PhotonEvaporation::BreakUpFragment().
G4Fragment * G4VGammaDeexcitation::GetNucleus | ( | ) | [inline] |
Definition at line 128 of file G4VGammaDeexcitation.hh.
Referenced by G4DiscreteGammaDeexcitation::CanDoTransition(), G4ContinuumGammaDeexcitation::CanDoTransition(), G4DiscreteGammaDeexcitation::CreateTransition(), and G4ContinuumGammaDeexcitation::CreateTransition().
G4int G4VGammaDeexcitation::GetVacantSN | ( | ) | [inline] |
Definition at line 103 of file G4VGammaDeexcitation.hh.
Referenced by G4PhotonEvaporation::BreakItUp(), G4PhotonEvaporation::BreakUp(), and G4PhotonEvaporation::BreakUpFragment().
void G4VGammaDeexcitation::Initialize | ( | ) | [inline] |
Definition at line 143 of file G4VGammaDeexcitation.hh.
References _transition, CreateTransition(), G4Fragment::GetExcitationEnergy(), and G4VGammaTransition::SetEnergyFrom().
Referenced by DoChain(), DoTransition(), and G4PhotonEvaporation::EmittedFragment().
00144 { 00145 if (_transition != 0) { delete _transition; } 00146 _transition = CreateTransition(); 00147 if (_transition != 0) { 00148 _transition->SetEnergyFrom(_nucleus->GetExcitationEnergy()); 00149 } 00150 }
void G4VGammaDeexcitation::SetEO | ( | G4ElectronOccupancy | eo | ) | [inline] |
Definition at line 99 of file G4VGammaDeexcitation.hh.
Referenced by G4PhotonEvaporation::SetEOccupancy().
void G4VGammaDeexcitation::SetNucleus | ( | G4Fragment * | nucleus | ) | [inline] |
Definition at line 133 of file G4VGammaDeexcitation.hh.
Referenced by G4PhotonEvaporation::BreakItUp(), G4PhotonEvaporation::BreakUp(), G4PhotonEvaporation::BreakUpFragment(), and G4PhotonEvaporation::EmittedFragment().
void G4VGammaDeexcitation::SetTimeLimit | ( | G4double | value | ) | [inline] |
Definition at line 105 of file G4VGammaDeexcitation.hh.
Referenced by G4PhotonEvaporation::G4PhotonEvaporation(), and G4PhotonEvaporation::SetTimeLimit().
void G4VGammaDeexcitation::SetVaccantSN | ( | G4int | val | ) | [inline] |
Definition at line 100 of file G4VGammaDeexcitation.hh.
Referenced by G4PhotonEvaporation::BreakItUp(), G4PhotonEvaporation::BreakUp(), and G4PhotonEvaporation::BreakUpFragment().
void G4VGammaDeexcitation::SetVerboseLevel | ( | G4int | verbose | ) | [inline] |
Definition at line 138 of file G4VGammaDeexcitation.hh.
References _verbose.
Referenced by G4PhotonEvaporation::SetVerboseLevel().
00139 { 00140 _verbose = verbose; 00141 }
void G4VGammaDeexcitation::Update | ( | ) | [protected] |
Definition at line 239 of file G4VGammaDeexcitation.cc.
References _transition, _verbose, CreateTransition(), G4cout, G4endl, G4Fragment::GetExcitationEnergy(), and G4VGammaTransition::SetEnergyFrom().
Referenced by DoChain().
00240 { 00241 if (_transition != 0) 00242 { 00243 delete _transition; 00244 _transition = 0; 00245 if (_verbose > 1) { 00246 G4cout << "G4VGammaDeexcitation::Update - Transition deleted " << G4endl; 00247 } 00248 } 00249 00250 _transition = CreateTransition(); 00251 if (_transition != 0) 00252 { 00253 _transition->SetEnergyFrom(_nucleus->GetExcitationEnergy()); 00254 // if ( _vSN != -1) (dynamic_cast <G4DiscreteGammaTransition*> (_transition))->SetICM(false); 00255 // the above line is commented out for bug fix #952. It was intruduced for reason that 00256 // the k-shell electron is most likely one to be kicked out and there is no time for 00257 // the atom to deexcite before the next IC. But this limitation is causing other problems as 00258 // reported in #952 00259 } 00260 00261 return; 00262 }
G4VGammaTransition* G4VGammaDeexcitation::_transition [protected] |
Definition at line 111 of file G4VGammaDeexcitation.hh.
Referenced by G4DiscreteGammaDeexcitation::CanDoTransition(), G4ContinuumGammaDeexcitation::CanDoTransition(), DoChain(), GenerateGamma(), Initialize(), Update(), and ~G4VGammaDeexcitation().
G4int G4VGammaDeexcitation::_verbose [protected] |
Definition at line 112 of file G4VGammaDeexcitation.hh.
Referenced by G4DiscreteGammaDeexcitation::CanDoTransition(), G4ContinuumGammaDeexcitation::CanDoTransition(), G4DiscreteGammaDeexcitation::CreateTransition(), G4ContinuumGammaDeexcitation::CreateTransition(), DoChain(), DoTransition(), GenerateGamma(), SetVerboseLevel(), and Update().