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
G4AdjointProcessEquivalentToDirectProcess.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//
27// $Id$
28//
29//
30// ------------------------------------------------------------
31// GEANT 4 class implementation file
32//
33// Class Description
34//
35// This class is for adjoint process equivalent to direct process
36
37// ------------------------------------------------------------
38// Created by L.Desorgher 25 Sept. 2009 Inspired from G4WrapperProcess
39// ------------------------------------------------------------
40
42#include "G4DynamicParticle.hh"
44 G4VProcess* aProcess,
45 G4ParticleDefinition* fwd_particle_def)
46:G4VProcess(aName)
47{
48 theDirectProcess =aProcess;
49 theProcessType = theDirectProcess->GetProcessType();
50 theFwdParticleDef = fwd_particle_def;
51}
52
53
55{
56 if (theDirectProcess!=0) delete theDirectProcess;
57}
58
60{
61 theDirectProcess->ResetNumberOfInteractionLengthLeft();
62}
63
66 G4double previousStepSize,
67 G4double currentMinimumStep,
68 G4double& proposedSafety,
69 G4GPILSelection* selection )
70{
71
72
73 //Change the particle definition to the direct one
74 //------------------------------------------------
75 G4DynamicParticle* theDynPart = const_cast<G4DynamicParticle*> (track.GetDynamicParticle());
76 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition();
77
78 G4DecayProducts* decayProducts = const_cast<G4DecayProducts*> (theDynPart->GetPreAssignedDecayProducts());
80 theDynPart->SetDefinition(theFwdParticleDef);
81
82
83 //Call the direct process
84 //----------------------
85 G4double GPIL = theDirectProcess->
87 previousStepSize,
88 currentMinimumStep,
89 proposedSafety,
90 selection );
91
92
93 //Restore the adjoint particle definition to the direct one
94 //------------------------------------------------
95 theDynPart->SetDefinition(adjPartDef);
96 theDynPart->SetPreAssignedDecayProducts(decayProducts);
97
98
99 return GPIL;
100
101}
102
106{ //Change the particle definition to the direct one
107 //------------------------------------------------
108 G4DynamicParticle* theDynPart = const_cast<G4DynamicParticle*> (track.GetDynamicParticle());
109 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition();
110
111 G4DecayProducts* decayProducts = const_cast<G4DecayProducts*> (theDynPart->GetPreAssignedDecayProducts());
113 theDynPart->SetDefinition(theFwdParticleDef);
114
115
116 //Call the direct process
117 //----------------------
118
119
120 G4double GPIL = theDirectProcess->AtRestGetPhysicalInteractionLength( track, condition );
121
122 //Restore the adjoint particle definition to the direct one
123 //------------------------------------------------
124 theDynPart->SetDefinition(adjPartDef);
125 theDynPart->SetPreAssignedDecayProducts(decayProducts);
126
127 return GPIL;
128
129
130}
131
134 G4double previousStepSize,
136{
137 //Change the particle definition to the direct one
138 //------------------------------------------------
139 G4DynamicParticle* theDynPart = const_cast<G4DynamicParticle*> (track.GetDynamicParticle());
140 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition();
141
142 G4DecayProducts* decayProducts = const_cast<G4DecayProducts*> (theDynPart->GetPreAssignedDecayProducts());
143
145 theDynPart->SetDefinition(theFwdParticleDef);
146
147
148 //Call the direct process
149 //----------------------
150
151
152 G4double GPIL = theDirectProcess->PostStepGetPhysicalInteractionLength( track,
153 previousStepSize,
154 condition );
155
156 //Restore the adjoint particle definition to the direct one
157 //------------------------------------------------
158 theDynPart->SetDefinition(adjPartDef);
159 theDynPart->SetPreAssignedDecayProducts(decayProducts);
160
161 return GPIL;
162
163
164}
165/*
166
167void G4AdjointProcessEquivalentToDirectProcess::SetProcessManager(const G4ProcessManager* procMan)
168{
169 theDirectProcess->SetProcessManager(procMan);
170}
171
172const G4ProcessManager* G4AdjointProcessEquivalentToDirectProcess::GetProcessManager()
173{
174 return theDirectProcess->GetProcessManager();
175}
176*/
178 const G4Step& stepData )
179{
180 //Change the particle definition to the direct one
181 //------------------------------------------------
182 G4DynamicParticle* theDynPart = const_cast<G4DynamicParticle*> (track.GetDynamicParticle());
183 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition();
184
185 G4DecayProducts* decayProducts = const_cast<G4DecayProducts*> (theDynPart->GetPreAssignedDecayProducts());
186
188 theDynPart->SetDefinition(theFwdParticleDef);
189
190
191 //Call the direct process
192 //----------------------
193
194 G4VParticleChange* partChange = theDirectProcess->PostStepDoIt( track, stepData );
195
196
197 //Restore the adjoint particle definition to the direct one
198 //------------------------------------------------
199 theDynPart->SetDefinition(adjPartDef);
200 theDynPart->SetPreAssignedDecayProducts(decayProducts);
201
202 return partChange;
203
204
205
206}
207
209 const G4Step& stepData )
210{
211 //Change the particle definition to the direct one
212 //------------------------------------------------
213 G4DynamicParticle* theDynPart = const_cast<G4DynamicParticle*> (track.GetDynamicParticle());
214 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition();
215
216 G4DecayProducts* decayProducts = const_cast<G4DecayProducts*> (theDynPart->GetPreAssignedDecayProducts());
217
219 theDynPart->SetDefinition(theFwdParticleDef);
220
221
222 //Call the direct process
223 //----------------------
224 G4VParticleChange* partChange =theDirectProcess->AlongStepDoIt( track, stepData );
225
226 //Restore the adjoint particle definition to the direct one
227 //------------------------------------------------
228 theDynPart->SetDefinition(adjPartDef);
229 theDynPart->SetPreAssignedDecayProducts(decayProducts);
230
231 return partChange;
232}
233
235 const G4Step& stepData )
236{
237 //Change the particle definition to the direct one
238 //------------------------------------------------
239 G4DynamicParticle* theDynPart = const_cast<G4DynamicParticle*> (track.GetDynamicParticle());
240 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition();
241
242 G4DecayProducts* decayProducts = const_cast<G4DecayProducts*> (theDynPart->GetPreAssignedDecayProducts());
243
245 theDynPart->SetDefinition(theFwdParticleDef);
246
247
248 //Call the direct process
249 //----------------------
250 G4VParticleChange* partChange =theDirectProcess->AtRestDoIt( track, stepData );
251
252 //Restore the adjoint particle definition to the direct one
253 //------------------------------------------------
254 theDynPart->SetDefinition(adjPartDef);
255 theDynPart->SetPreAssignedDecayProducts(decayProducts);
256
257 return partChange;
258
259
260}
261
263{
264 return theDirectProcess->IsApplicable(*theFwdParticleDef);
265}
266
268{
269 return theDirectProcess->BuildPhysicsTable(*theFwdParticleDef);
270}
271
273{
274 return theDirectProcess->PreparePhysicsTable(*theFwdParticleDef);
275}
276
279 const G4String& directory,
280 G4bool ascii)
281{
282 return theDirectProcess->StorePhysicsTable(theFwdParticleDef, directory, ascii);
283}
284
287 const G4String& directory,
288 G4bool ascii)
289{
290 return theDirectProcess->RetrievePhysicsTable(theFwdParticleDef, directory, ascii);
291}
292
294{
295 //Change the particle definition to the direct one
296 //------------------------------------------------
297 G4DynamicParticle* theDynPart = const_cast<G4DynamicParticle*> (track->GetDynamicParticle());
298 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition();
299
300 G4DecayProducts* decayProducts = const_cast<G4DecayProducts*> (theDynPart->GetPreAssignedDecayProducts());
302 theDynPart->SetDefinition(theFwdParticleDef);
303
304 theDirectProcess->StartTracking(track);
305
306 //Restore the adjoint particle definition to the direct one
307 //------------------------------------------------
308 theDynPart->SetDefinition(adjPartDef);
309 theDynPart->SetPreAssignedDecayProducts(decayProducts);
310
311
312 return;
313
314}
315
317{
318 theDirectProcess->EndTracking();
319}
320
G4double condition(const G4ErrorSymMatrix &m)
G4ForceCondition
G4GPILSelection
double G4double
Definition: G4Types.hh:64
bool G4bool
Definition: G4Types.hh:67
virtual G4VParticleChange * AlongStepDoIt(const G4Track &track, const G4Step &stepData)
virtual G4bool StorePhysicsTable(const G4ParticleDefinition *, const G4String &directory, G4bool ascii=false)
virtual G4VParticleChange * PostStepDoIt(const G4Track &track, const G4Step &stepData)
virtual G4double AlongStepGetPhysicalInteractionLength(const G4Track &track, G4double previousStepSize, G4double currentMinimumStep, G4double &proposedSafety, G4GPILSelection *selection)
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
virtual G4bool RetrievePhysicsTable(const G4ParticleDefinition *, const G4String &directory, G4bool ascii=false)
G4AdjointProcessEquivalentToDirectProcess(const G4String &aName, G4VProcess *aProcess, G4ParticleDefinition *fwd_particle_def)
virtual G4double PostStepGetPhysicalInteractionLength(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
virtual G4double AtRestGetPhysicalInteractionLength(const G4Track &track, G4ForceCondition *condition)
virtual G4bool IsApplicable(const G4ParticleDefinition &)
virtual G4VParticleChange * AtRestDoIt(const G4Track &track, const G4Step &stepData)
virtual void PreparePhysicsTable(const G4ParticleDefinition &)
void SetPreAssignedDecayProducts(G4DecayProducts *aDecayProducts)
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
const G4DecayProducts * GetPreAssignedDecayProducts() const
G4ParticleDefinition * GetDefinition() const
Definition: G4Step.hh:78
const G4DynamicParticle * GetDynamicParticle() const
G4ProcessType theProcessType
Definition: G4VProcess.hh:340
virtual G4double PostStepGetPhysicalInteractionLength(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)=0
virtual void ResetNumberOfInteractionLengthLeft()
Definition: G4VProcess.cc:92
virtual G4VParticleChange * AtRestDoIt(const G4Track &track, const G4Step &stepData)=0
virtual G4bool RetrievePhysicsTable(const G4ParticleDefinition *, const G4String &, G4bool)
Definition: G4VProcess.hh:236
G4ProcessType GetProcessType() const
Definition: G4VProcess.hh:385
virtual G4VParticleChange * PostStepDoIt(const G4Track &track, const G4Step &stepData)=0
virtual G4bool IsApplicable(const G4ParticleDefinition &)
Definition: G4VProcess.hh:205
virtual G4VParticleChange * AlongStepDoIt(const G4Track &track, const G4Step &stepData)=0
virtual void StartTracking(G4Track *)
Definition: G4VProcess.cc:125
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
Definition: G4VProcess.hh:210
virtual G4bool StorePhysicsTable(const G4ParticleDefinition *, const G4String &, G4bool)
Definition: G4VProcess.hh:231
virtual void PreparePhysicsTable(const G4ParticleDefinition &)
Definition: G4VProcess.hh:217
virtual G4double AtRestGetPhysicalInteractionLength(const G4Track &track, G4ForceCondition *condition)=0
virtual void EndTracking()
Definition: G4VProcess.cc:137