98 G4cout <<
"The user track information is a molecule" <<
G4endl;
107 fpMolecularConfiguration = right.fpMolecularConfiguration;
114 if (&right ==
this)
return *
this;
115 fpMolecularConfiguration = right.fpMolecularConfiguration;
123 return fpMolecularConfiguration == right.fpMolecularConfiguration;
130 return !(*
this == right);
141 return fpMolecularConfiguration < right.fpMolecularConfiguration;
149 fpMolecularConfiguration =
nullptr;
160 switch (
fpTrack->GetTrackStatus())
178 fpMolecularConfiguration =
nullptr;
211 G4ElectronOccupancy dynElectronOccupancy(*pMoleculeDefinition->GetGroundStateElectronOccupancy());
213 if (OrbitalToFill != 0)
215 dynElectronOccupancy.RemoveElectron(OrbitalToFree - 1, 1);
216 dynElectronOccupancy.AddElectron(OrbitalToFill - 1, 1);
220 if (OrbitalToFill == 0)
222 dynElectronOccupancy.RemoveElectron(OrbitalToFree - 1, 1);
226 fpMolecularConfiguration =
228 pMoleculeDefinition, dynElectronOccupancy);
232 fpMolecularConfiguration =
nullptr;
234 "G4Molecule::G4Molecule(G4MoleculeDefinition* pMoleculeDefinition, "
235 "G4int OrbitalToFree, G4int OrbitalToFill)",
236 "G4Molecule_wrong_usage_of_constructor",
238 "If you want to use this constructor, the molecule definition has to be "
239 "first defined with electron occupancies");
255 G4ElectronOccupancy dynElectronOccupancy(*pMoleculeDefinition->GetGroundStateElectronOccupancy());
259 dynElectronOccupancy.RemoveElectron(level, 1);
260 dynElectronOccupancy.AddElectron(5, 1);
265 dynElectronOccupancy.RemoveElectron(level, 1);
270 dynElectronOccupancy);
274 fpMolecularConfiguration =
nullptr;
276 "G4Molecule::G4Molecule(G4MoleculeDefinition* pMoleculeDefinition, "
277 "G4int OrbitalToFree, G4int OrbitalToFill)",
278 "G4Molecule_wrong_usage_of_constructor",
280 "If you want to use this constructor, the molecule definition has to be "
281 "first defined with electron occupancies");
289 fpMolecularConfiguration = pMolecularConfiguration;
296 fpMolecularConfiguration =
305 fpMolecularConfiguration = fpMolecularConfiguration->ExciteMolecule(excitationLevel);
312 fpMolecularConfiguration = fpMolecularConfiguration->IonizeMolecule(ionizationLevel);
319 fpMolecularConfiguration = fpMolecularConfiguration->AddElectron(orbit, number);
326 fpMolecularConfiguration =
327 fpMolecularConfiguration->RemoveElectron(orbit, number);
334 fpMolecularConfiguration =
335 fpMolecularConfiguration->MoveOneElectron(orbitToFree, orbitToFill);
342 return fpMolecularConfiguration->GetName();
349 return fpMolecularConfiguration->GetFormatedName();
356 return fpMolecularConfiguration->GetAtomsNumber();
363 return fpMolecularConfiguration->GetNbElectrons();
370 fpMolecularConfiguration->PrintState();
382 "A track was already assigned to this molecule");
391 G4double xMomentum = cos(phi) * sin(theta);
392 G4double yMomentum = sin(theta) * sin(phi);
395 G4ThreeVector MomentumDirection(xMomentum, yMomentum, zMomentum);
399 fpMolecularConfiguration->GetDefinition(), MomentumDirection,
404 fpTrack->SetUserInformation(
this);
407 if (parentTrack ==
nullptr || parentTrack->
GetTouchable() ==
nullptr ||
441 double E = (fpMolecularConfiguration->GetMass() / (c_squared)) * (v * v) / 2.;
450 double moleculeMass = fpMolecularConfiguration->GetMass() / (c_squared);
460 return sqrt(3 * k_Boltzmann *
472const vector<const G4MolecularDissociationChannel*>*
475 return fpMolecularConfiguration->GetDissociationChannels();
482 return fpMolecularConfiguration->GetFakeParticleID();
489 return fpMolecularConfiguration->GetMoleculeID();
496 return fpMolecularConfiguration->GetDecayTime();
503 return fpMolecularConfiguration->GetVanDerVaalsRadius();
510 return fpMolecularConfiguration->GetCharge();
517 return fpMolecularConfiguration->GetMass();
524 return fpMolecularConfiguration->GetElectronOccupancy();
531 return fpMolecularConfiguration->GetDefinition();
538 return fpMolecularConfiguration->GetDiffusionCoefficient();
544 double temperature)
const
546 return fpMolecularConfiguration->GetDiffusionCoefficient(pMaterial,
554 return fpMolecularConfiguration;
561 return fpMolecularConfiguration->GetLabel();
572 fpMolecularConfiguration->GetDefinition(), label);
574 assert(fpMolecularConfiguration !=
nullptr);
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4IT * GetIT(const G4Track *track)
G4Molecule * GetMolecule(const G4Track &track)
G4Allocator< G4Molecule > *& aMoleculeAllocator()
CLHEP::Hep3Vector G4ThreeVector
@ fKillTrackAndSecondaries
G4GLOB_DLL std::ostream G4cout
void Print() const override
static G4MolecularConfiguration * GetOrCreateMolecularConfiguration(const G4MoleculeDefinition *)
static G4MolecularConfiguration * GetMolecularConfiguration(const G4MoleculeDefinition *, const G4String &label)
static G4double GetGlobalTemperature()
void AddMolecule(const G4Track *, G4double, G4int=1)
static G4MoleculeCounterManager * Instance()
void RemoveMolecule(const G4Track *, G4double, G4int=1)
const G4ElectronOccupancy * GetGroundStateElectronOccupancy() const
void LocateMoleculeSetStateAndTouchable(G4Track *)
static G4MoleculeLocator * Instance()
void IonizeMolecule(G4int)
G4Track * BuildTrack(G4double globalTime, const G4ThreeVector &Position, const G4Track *=nullptr)
void RemoveElectron(G4int, G4int number=1)
void AddElectron(G4int orbit, G4int n=1)
static G4Molecule * GetMolecule(const G4Track *)
G4bool operator<(const G4Molecule &right) const
G4double GetVanDerVaalsRadius() const
const G4MolecularConfiguration * GetMolecularConfiguration() const
void SetElectronOccupancy(const G4ElectronOccupancy *)
void MoveOneElectron(G4int, G4int)
const G4String & GetName() const override
const G4String & GetLabel() const
void ChangeConfigurationToLabel(const G4String &label)
G4int GetMoleculeID() const
G4double GetKineticEnergy() const
G4Molecule(const G4Molecule &)
const G4String & GetFormatedName() const
G4int GetAtomsNumber() const
G4bool operator==(const G4Molecule &right) const
G4int GetFakeParticleID() const
G4double GetDiffusionVelocity() const
void ExciteMolecule(G4int)
G4bool operator!=(const G4Molecule &right) const
const G4ElectronOccupancy * GetElectronOccupancy() const
G4Molecule & operator=(const G4Molecule &right)
const G4MoleculeDefinition * GetDefinition() const
G4double GetDiffusionCoefficient() const
G4double GetDecayTime() const
const std::vector< const G4MolecularDissociationChannel * > * GetDissociationChannels() const
G4double GetNbElectrons() const
const G4ThreeVector & GetPosition() const
const G4TouchableHandle & GetTouchableHandle() const
const G4VTouchable * GetTouchable() const
#define G4ThreadLocalStatic