Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4DNAMolecularDecay.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id: G4DNAMolecularDecay.cc 64057 2012-10-30 15:04:49Z gcosmo $
27//
28// Author: Mathieu Karamitros (kara (AT) cenbg . in2p3 . fr)
29//
30// WARNING : This class is released as a prototype.
31// It might strongly evolve or even disapear in the next releases.
32//
33// History:
34// -----------
35// 10 Oct 2011 M.Karamitros created
36//
37// -------------------------------------------------------------------
38
40#include "G4SystemOfUnits.hh"
41#include "G4Track.hh"
42#include "G4Molecule.hh"
43#include "G4ITManager.hh"
44#include "G4ParticleChange.hh"
45
46using namespace std;
47
49 G4ProcessType type) : G4VITRestProcess(processName, type)
50{
51 // set Process Sub Type
52 SetProcessSubType(59); // DNA sub-type
53 enableAlongStepDoIt = false;
54 enablePostStepDoIt = false;
56
57 fVerbose = 0 ;
58
59#ifdef G4VERBOSE
60 if (verboseLevel>1)
61 {
62 G4cout << "G4MolecularDecayProcess constructor " << " Name:" << processName << G4endl;
63 }
64#endif
65
67
68 fDecayAtFixedTime = true ;
69}
70
72{
73 DecayDisplacementMap::iterator it = fDecayDisplacementMap.begin();
74
75 for( ; it != fDecayDisplacementMap.end() ; it++)
76 {
77 if(it->second)
78 {
79 delete it->second;
80 it->second = 0;
81 }
82 }
83 fDecayDisplacementMap.clear();
84}
85
86G4DNAMolecularDecay::G4DNAMolecularDecay(const G4DNAMolecularDecay &right) :
87 G4VITRestProcess(right)
88{
89 fDecayAtFixedTime = right . fDecayAtFixedTime;
90 fDecayDisplacementMap = right.fDecayDisplacementMap;
91 fVerbose = right.fVerbose ;
92}
93
95{
96 if(aParticleType.GetParticleType()=="Molecule")
97 {
98#ifdef G4VERBOSE
99 if(fVerbose>1)
100 {
101 G4cout<<"G4MolecularDecay::IsApplicable(";
102 G4cout<<aParticleType.GetParticleName()<<",";
103 G4cout<<aParticleType.GetParticleType()<<")"<<G4endl;
104 }
105#endif
106 return(true);
107 }
108 else
109 {
110 return false;
111 }
112}
113
116{
117 G4double output = GetMolecule(track)-> GetDecayTime() - track.GetProperTime() ;
118 return (output > 0 ? output : 0 );
119}
120
122 const G4Track& track,
123 const G4Step& )
124{
125 // DEBUG
126 // G4cout << "Is calling G4MolecularDecayProcess::DecayIt" << G4endl;
127
129 const G4Molecule * theMotherMolecule = GetMolecule(track);
130 const G4MoleculeDefinition* moleculeDefinition = theMotherMolecule->GetDefinition();
131
132 // DEBUG
133 // G4cout <<"Calling G4MolecularDecayProcess::DecayIt"<<G4endl;
134 // G4cout << "The mother molecule state : " << G4endl;
135 // theMotherMolecule -> PrintState();
136
137 if(moleculeDefinition-> GetDecayTable())
138 {
139 const vector<const G4MolecularDecayChannel*>* DecayVector =
140 (theMotherMolecule -> GetDecayChannel());
141
142 if(DecayVector == 0)
143 {
144 G4ExceptionDescription exceptionDescription;
145 theMotherMolecule->GetElectronOccupancy()->DumpInfo();
146 exceptionDescription << "No decay channel was found for the molecule : " << theMotherMolecule-> GetName() << G4endl;
147 G4Exception("G4DNAMolecularDecay::DecayIt", "G4DNAMolecularDecay::NoDecayChannel",FatalException,exceptionDescription);
148 return &aParticleChange;
149 }
150
151 G4int DecayVectorSize = DecayVector-> size();
152 // DEBUG
153 // G4cout<< "Number of decay channels : " << DecayVectorSize<<G4endl;
154 G4double RdmValue = G4UniformRand();
155
156 const G4MolecularDecayChannel* decayChannel(0);
157 G4int i=0;
158 do
159 {
160 decayChannel = (*DecayVector)[i];
161 if(RdmValue < decayChannel->GetProbability()) break;
162 RdmValue -= decayChannel->GetProbability();
163 i++;
164 }
165 while(i< DecayVectorSize);
166
167 // DEBUG
168 // G4cout<< "Selected Decay channel : " << decayChannel->GetName()<<G4endl;
169
170 G4double decayEnergy = decayChannel->GetEnergy();
171 G4int nbProducts = decayChannel->GetNbProducts();
172
173 if(decayEnergy)
174 {
175 // DEBUG
176 // G4cout<<"Deposit energy :" <<decayChannel->GetEnergy()/eV << " eV"<<G4endl;
177
179 }
180
181 if(nbProducts)
182 {
183
184 // DEBUG
185 // G4cout<<"Number of products :" <<nbProducts<<G4endl;
186
187 vector<G4ThreeVector> ProductsDisplacement(nbProducts);
188 G4ThreeVector theMotherMoleculeDisplacement;
189
190 DecayDisplacementMap::iterator it = fDecayDisplacementMap.find(moleculeDefinition);
191
192 if(it!=fDecayDisplacementMap.end())
193 {
194 G4VMolecularDecayDisplacer* displacer = it->second;
195 ProductsDisplacement = displacer->GetProductsDisplacement(decayChannel);
196 theMotherMoleculeDisplacement = displacer-> GetMotherMoleculeDisplacement(decayChannel);
197 }
198 else
199 {
201 errMsg << "No G4MolecularDecayProcess::theDecayDisplacementMap["
202 << theMotherMolecule->GetName() +"]" ;
203 G4Exception("G4MolecularDecayProcess::DecayIt","DNAMolecularDecay001",FatalErrorInArgument, errMsg);
204 }
205
207
208#ifdef G4VERBOSE
209 if(fVerbose)
210 {
211 G4cout<<"Decay Process : "
212 << theMotherMolecule->GetName()
213 << " (trackID :" << track.GetTrackID() << ") "
214 << decayChannel->GetName()
215 << G4endl;
216 }
217#endif
218
219 for (G4int j=0; j<nbProducts ; j++)
220 {
221 G4Molecule* product = new G4Molecule(*decayChannel->GetProduct(j));
222
223 // create a new track object
224 // Be carefull as this processes is dedicated to be used in the DNA module
225 // The molecular decay will happen one picosecond after the start of the simulation.
226 // This may be seen as a bug and will be hopefully improve in the next releases
227 G4Track* secondary = product->BuildTrack(picosecond,track.GetPosition()
228 + theMotherMoleculeDisplacement + ProductsDisplacement[j]);
229
230 secondary-> SetTrackStatus(fAlive);
231#ifdef G4VERBOSE
232 if(fVerbose)
233 {
234 G4cout<<"Product : "<< product->GetName()<<G4endl;
235 }
236#endif
237 // add the secondary track in the List
238 aParticleChange.G4VParticleChange::AddSecondary(secondary);
239 G4ITManager<G4Molecule>::Instance()->Push(secondary);
240 }
241#ifdef G4VERBOSE
242 if(fVerbose)
243 G4cout<<"-------------"<<G4endl;
244#endif
245 }
246 // DEBUG
247 // else if(decayEnergy)
248 // {
249 // G4cout << "No products for this channel" << G4endl ;
250 // G4cout<<"-------------"<<G4endl;
251 // }
252 else if(!decayEnergy && !nbProducts)
253 {
255 errMsg << "There is no products and no energy specified in the molecular decay channel";
256 G4Exception("G4MolecularDecayProcess::DecayIt","DNAMolecularDecay002",FatalErrorInArgument, errMsg);
257 }
258 }
259
261
262 return &aParticleChange;
263}
264
266{
267 fDecayDisplacementMap[molDef] = aDisplacer;
268}
269
271{
272 return fDecayDisplacementMap[molDef] ;
273}
@ FatalException
@ FatalErrorInArgument
G4ForceCondition
G4Molecule * GetMolecule(const G4Track &track)
Definition: G4Molecule.cc:67
G4ProcessType
@ fAlive
@ fStopAndKill
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
virtual G4double GetMeanLifeTime(const G4Track &, G4ForceCondition *)
void SetDecayDisplacer(const G4ParticleDefinition *, G4VMolecularDecayDisplacer *)
G4VMolecularDecayDisplacer * GetDecayDisplacer(const G4ParticleDefinition *)
virtual G4VParticleChange * DecayIt(const G4Track &, const G4Step &)
G4DNAMolecularDecay(const G4String &processName="DNAMolecularDecay", G4ProcessType type=fDecay)
virtual G4bool IsApplicable(const G4ParticleDefinition &)
static G4ITManager< T > * Instance()
const G4String & GetName() const
const G4Molecule * GetProduct(int) const
const G4String & GetName() const
Definition: G4Molecule.cc:259
G4Track * BuildTrack(G4double globalTime, const G4ThreeVector &Position)
Definition: G4Molecule.cc:279
const G4ElectronOccupancy * GetElectronOccupancy() const
Definition: G4Molecule.cc:390
const G4MoleculeDefinition * GetDefinition() const
Definition: G4Molecule.cc:395
virtual void Initialize(const G4Track &)
const G4String & GetParticleType() const
const G4String & GetParticleName() const
Definition: G4Step.hh:78
G4int GetTrackID() const
const G4ThreeVector & GetPosition() const
G4double GetProperTime() const
Identical to G4VRestProcess with dependency from G4VITProcess.
virtual std::vector< G4ThreeVector > GetProductsDisplacement(const G4MolecularDecayChannel *) const =0
void ProposeTrackStatus(G4TrackStatus status)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
void SetNumberOfSecondaries(G4int totSecondaries)
G4ParticleChange aParticleChange
Definition: G4VProcess.hh:289
G4bool enableAtRestDoIt
Definition: G4VProcess.hh:350
G4int verboseLevel
Definition: G4VProcess.hh:368
G4bool enableAlongStepDoIt
Definition: G4VProcess.hh:351
void SetProcessSubType(G4int)
Definition: G4VProcess.hh:403
G4bool enablePostStepDoIt
Definition: G4VProcess.hh:352
G4VParticleChange * pParticleChange
Definition: G4VProcess.hh:283
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76