Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // ------------------------------------------- 26 // ------------------------------------------------------------ 27 // 27 // 28 // This class is for adjoint process equivalen 28 // This class is for adjoint process equivalent to direct process 29 // 29 // 30 // ------------------------------------------- 30 // ------------------------------------------------------------ 31 // Created by L.Desorgher 25 Sept. 31 // Created by L.Desorgher 25 Sept. 2009 32 // ------------------------------------------- 32 // ------------------------------------------------------------ 33 33 34 #include "G4AdjointProcessEquivalentToDirectPr 34 #include "G4AdjointProcessEquivalentToDirectProcess.hh" 35 35 36 #include "G4DynamicParticle.hh" 36 #include "G4DynamicParticle.hh" 37 #include "G4ParticleDefinition.hh" 37 #include "G4ParticleDefinition.hh" 38 #include "G4VProcess.hh" 38 #include "G4VProcess.hh" 39 39 40 G4AdjointProcessEquivalentToDirectProcess:: 40 G4AdjointProcessEquivalentToDirectProcess:: 41 G4AdjointProcessEquivalentToDirectProcess( 41 G4AdjointProcessEquivalentToDirectProcess( 42 const G4String& aName, G4VProcess* aProces 42 const G4String& aName, G4VProcess* aProcess, 43 G4ParticleDefinition* fwd_particle_def) 43 G4ParticleDefinition* fwd_particle_def) 44 : G4VProcess(aName) 44 : G4VProcess(aName) 45 { 45 { 46 fDirectProcess = aProcess; 46 fDirectProcess = aProcess; 47 theProcessType = fDirectProcess->GetProcess 47 theProcessType = fDirectProcess->GetProcessType(); 48 fFwdParticleDef = fwd_particle_def; 48 fFwdParticleDef = fwd_particle_def; 49 } 49 } 50 50 51 G4AdjointProcessEquivalentToDirectProcess:: 51 G4AdjointProcessEquivalentToDirectProcess:: 52 ~G4AdjointProcessEquivalentToDirectProcess() 52 ~G4AdjointProcessEquivalentToDirectProcess() 53 { 53 { 54 if(fDirectProcess != nullptr) 54 if(fDirectProcess != nullptr) 55 delete fDirectProcess; 55 delete fDirectProcess; 56 } 56 } 57 57 58 void G4AdjointProcessEquivalentToDirectProcess 58 void G4AdjointProcessEquivalentToDirectProcess:: 59 ResetNumberOfInteractionLengthLeft() 59 ResetNumberOfInteractionLengthLeft() 60 { 60 { 61 fDirectProcess->ResetNumberOfInteractionLeng 61 fDirectProcess->ResetNumberOfInteractionLengthLeft(); 62 } 62 } 63 63 64 G4double G4AdjointProcessEquivalentToDirectPro 64 G4double G4AdjointProcessEquivalentToDirectProcess:: 65 AlongStepGetPhysicalInteractionLength(const 65 AlongStepGetPhysicalInteractionLength(const G4Track& track, 66 G4doub 66 G4double previousStepSize, 67 G4doub 67 G4double currentMinimumStep, 68 G4doub 68 G4double& proposedSafety, 69 G4GPIL 69 G4GPILSelection* selection) 70 { 70 { 71 // Change the particle definition to the dir 71 // Change the particle definition to the direct one 72 G4DynamicParticle* theDynPart = 72 G4DynamicParticle* theDynPart = 73 const_cast<G4DynamicParticle*>(track.GetDy 73 const_cast<G4DynamicParticle*>(track.GetDynamicParticle()); 74 G4ParticleDefinition* adjPartDef = theDynPar 74 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition(); 75 75 76 G4DecayProducts* decayProducts = 76 G4DecayProducts* decayProducts = 77 const_cast<G4DecayProducts*>(theDynPart->G 77 const_cast<G4DecayProducts*>(theDynPart->GetPreAssignedDecayProducts()); 78 theDynPart->SetPreAssignedDecayProducts((G4D 78 theDynPart->SetPreAssignedDecayProducts((G4DecayProducts*) (0)); 79 theDynPart->SetDefinition(fFwdParticleDef); 79 theDynPart->SetDefinition(fFwdParticleDef); 80 80 81 // Call the direct process 81 // Call the direct process 82 G4double GPIL = fDirectProcess->AlongStepGet 82 G4double GPIL = fDirectProcess->AlongStepGetPhysicalInteractionLength( 83 track, previousStepSize, currentMinimumSte 83 track, previousStepSize, currentMinimumStep, proposedSafety, selection); 84 84 85 // Restore the adjoint particle definition t 85 // Restore the adjoint particle definition to the direct one 86 theDynPart->SetDefinition(adjPartDef); 86 theDynPart->SetDefinition(adjPartDef); 87 theDynPart->SetPreAssignedDecayProducts(deca 87 theDynPart->SetPreAssignedDecayProducts(decayProducts); 88 88 89 return GPIL; 89 return GPIL; 90 } 90 } 91 91 92 G4double 92 G4double 93 G4AdjointProcessEquivalentToDirectProcess::AtR 93 G4AdjointProcessEquivalentToDirectProcess::AtRestGetPhysicalInteractionLength( 94 const G4Track& track, G4ForceCondition* cond 94 const G4Track& track, G4ForceCondition* condition) 95 { 95 { 96 // Change the particle definition to the dir 96 // Change the particle definition to the direct one 97 G4DynamicParticle* theDynPart = 97 G4DynamicParticle* theDynPart = 98 const_cast<G4DynamicParticle*>(track.GetDy 98 const_cast<G4DynamicParticle*>(track.GetDynamicParticle()); 99 G4ParticleDefinition* adjPartDef = theDynPar 99 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition(); 100 100 101 G4DecayProducts* decayProducts = 101 G4DecayProducts* decayProducts = 102 const_cast<G4DecayProducts*>(theDynPart->G 102 const_cast<G4DecayProducts*>(theDynPart->GetPreAssignedDecayProducts()); 103 theDynPart->SetPreAssignedDecayProducts((G4D 103 theDynPart->SetPreAssignedDecayProducts((G4DecayProducts*) (0)); 104 theDynPart->SetDefinition(fFwdParticleDef); 104 theDynPart->SetDefinition(fFwdParticleDef); 105 105 106 // Call the direct process 106 // Call the direct process 107 G4double GPIL = 107 G4double GPIL = 108 fDirectProcess->AtRestGetPhysicalInteracti 108 fDirectProcess->AtRestGetPhysicalInteractionLength(track, condition); 109 109 110 // Restore the adjoint particle definition t 110 // Restore the adjoint particle definition to the direct one 111 theDynPart->SetDefinition(adjPartDef); 111 theDynPart->SetDefinition(adjPartDef); 112 theDynPart->SetPreAssignedDecayProducts(deca 112 theDynPart->SetPreAssignedDecayProducts(decayProducts); 113 113 114 return GPIL; 114 return GPIL; 115 } 115 } 116 116 117 G4double 117 G4double 118 G4AdjointProcessEquivalentToDirectProcess::Pos 118 G4AdjointProcessEquivalentToDirectProcess::PostStepGetPhysicalInteractionLength( 119 const G4Track& track, G4double previousStepS 119 const G4Track& track, G4double previousStepSize, G4ForceCondition* condition) 120 { 120 { 121 // Change the particle definition to the dir 121 // Change the particle definition to the direct one 122 G4DynamicParticle* theDynPart = 122 G4DynamicParticle* theDynPart = 123 const_cast<G4DynamicParticle*>(track.GetDy 123 const_cast<G4DynamicParticle*>(track.GetDynamicParticle()); 124 G4ParticleDefinition* adjPartDef = theDynPar 124 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition(); 125 125 126 G4DecayProducts* decayProducts = 126 G4DecayProducts* decayProducts = 127 const_cast<G4DecayProducts*>(theDynPart->G 127 const_cast<G4DecayProducts*>(theDynPart->GetPreAssignedDecayProducts()); 128 128 129 theDynPart->SetPreAssignedDecayProducts((G4D 129 theDynPart->SetPreAssignedDecayProducts((G4DecayProducts*) (0)); 130 theDynPart->SetDefinition(fFwdParticleDef); 130 theDynPart->SetDefinition(fFwdParticleDef); 131 131 132 // Call the direct process 132 // Call the direct process 133 G4double GPIL = fDirectProcess->PostStepGetP 133 G4double GPIL = fDirectProcess->PostStepGetPhysicalInteractionLength( 134 track, previousStepSize, condition); 134 track, previousStepSize, condition); 135 135 136 // Restore the adjoint particle definition t 136 // Restore the adjoint particle definition to the direct one 137 theDynPart->SetDefinition(adjPartDef); 137 theDynPart->SetDefinition(adjPartDef); 138 theDynPart->SetPreAssignedDecayProducts(deca 138 theDynPart->SetPreAssignedDecayProducts(decayProducts); 139 139 140 return GPIL; 140 return GPIL; 141 } 141 } 142 142 143 G4VParticleChange* G4AdjointProcessEquivalentT 143 G4VParticleChange* G4AdjointProcessEquivalentToDirectProcess::PostStepDoIt( 144 const G4Track& track, const G4Step& stepData 144 const G4Track& track, const G4Step& stepData) 145 { 145 { 146 // Change the particle definition to the dir 146 // Change the particle definition to the direct one 147 G4DynamicParticle* theDynPart = 147 G4DynamicParticle* theDynPart = 148 const_cast<G4DynamicParticle*>(track.GetDy 148 const_cast<G4DynamicParticle*>(track.GetDynamicParticle()); 149 G4ParticleDefinition* adjPartDef = theDynPar 149 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition(); 150 150 151 G4DecayProducts* decayProducts = 151 G4DecayProducts* decayProducts = 152 const_cast<G4DecayProducts*>(theDynPart->G 152 const_cast<G4DecayProducts*>(theDynPart->GetPreAssignedDecayProducts()); 153 153 154 theDynPart->SetPreAssignedDecayProducts((G4D 154 theDynPart->SetPreAssignedDecayProducts((G4DecayProducts*) (0)); 155 theDynPart->SetDefinition(fFwdParticleDef); 155 theDynPart->SetDefinition(fFwdParticleDef); 156 156 157 // Call the direct process 157 // Call the direct process 158 G4VParticleChange* partChange = fDirectProce 158 G4VParticleChange* partChange = fDirectProcess->PostStepDoIt(track, stepData); 159 159 160 // Restore the adjoint particle definition t 160 // Restore the adjoint particle definition to the direct one 161 theDynPart->SetDefinition(adjPartDef); 161 theDynPart->SetDefinition(adjPartDef); 162 theDynPart->SetPreAssignedDecayProducts(deca 162 theDynPart->SetPreAssignedDecayProducts(decayProducts); 163 163 164 return partChange; 164 return partChange; 165 } 165 } 166 166 167 G4VParticleChange* G4AdjointProcessEquivalentT 167 G4VParticleChange* G4AdjointProcessEquivalentToDirectProcess::AlongStepDoIt( 168 const G4Track& track, const G4Step& stepData 168 const G4Track& track, const G4Step& stepData) 169 { 169 { 170 // Change the particle definition to the dir 170 // Change the particle definition to the direct one 171 G4DynamicParticle* theDynPart = 171 G4DynamicParticle* theDynPart = 172 const_cast<G4DynamicParticle*>(track.GetDy 172 const_cast<G4DynamicParticle*>(track.GetDynamicParticle()); 173 G4ParticleDefinition* adjPartDef = theDynPar 173 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition(); 174 174 175 G4DecayProducts* decayProducts = 175 G4DecayProducts* decayProducts = 176 const_cast<G4DecayProducts*>(theDynPart->G 176 const_cast<G4DecayProducts*>(theDynPart->GetPreAssignedDecayProducts()); 177 177 178 theDynPart->SetPreAssignedDecayProducts((G4D 178 theDynPart->SetPreAssignedDecayProducts((G4DecayProducts*) (0)); 179 theDynPart->SetDefinition(fFwdParticleDef); 179 theDynPart->SetDefinition(fFwdParticleDef); 180 180 181 // Call the direct process 181 // Call the direct process 182 G4VParticleChange* partChange = 182 G4VParticleChange* partChange = 183 fDirectProcess->AlongStepDoIt(track, stepD 183 fDirectProcess->AlongStepDoIt(track, stepData); 184 184 185 // Restore the adjoint particle definition t 185 // Restore the adjoint particle definition to the direct one 186 theDynPart->SetDefinition(adjPartDef); 186 theDynPart->SetDefinition(adjPartDef); 187 theDynPart->SetPreAssignedDecayProducts(deca 187 theDynPart->SetPreAssignedDecayProducts(decayProducts); 188 188 189 return partChange; 189 return partChange; 190 } 190 } 191 191 192 G4VParticleChange* G4AdjointProcessEquivalentT 192 G4VParticleChange* G4AdjointProcessEquivalentToDirectProcess::AtRestDoIt( 193 const G4Track& track, const G4Step& stepData 193 const G4Track& track, const G4Step& stepData) 194 { 194 { 195 // Change the particle definition to the dir 195 // Change the particle definition to the direct one 196 G4DynamicParticle* theDynPart = 196 G4DynamicParticle* theDynPart = 197 const_cast<G4DynamicParticle*>(track.GetDy 197 const_cast<G4DynamicParticle*>(track.GetDynamicParticle()); 198 G4ParticleDefinition* adjPartDef = theDynPar 198 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition(); 199 199 200 G4DecayProducts* decayProducts = 200 G4DecayProducts* decayProducts = 201 const_cast<G4DecayProducts*>(theDynPart->G 201 const_cast<G4DecayProducts*>(theDynPart->GetPreAssignedDecayProducts()); 202 202 203 theDynPart->SetPreAssignedDecayProducts((G4D 203 theDynPart->SetPreAssignedDecayProducts((G4DecayProducts*) (0)); 204 theDynPart->SetDefinition(fFwdParticleDef); 204 theDynPart->SetDefinition(fFwdParticleDef); 205 205 206 // Call the direct process 206 // Call the direct process 207 G4VParticleChange* partChange = fDirectProce 207 G4VParticleChange* partChange = fDirectProcess->AtRestDoIt(track, stepData); 208 208 209 // Restore the adjoint particle definition t 209 // Restore the adjoint particle definition to the direct one 210 theDynPart->SetDefinition(adjPartDef); 210 theDynPart->SetDefinition(adjPartDef); 211 theDynPart->SetPreAssignedDecayProducts(deca 211 theDynPart->SetPreAssignedDecayProducts(decayProducts); 212 212 213 return partChange; 213 return partChange; 214 } 214 } 215 215 216 G4bool G4AdjointProcessEquivalentToDirectProce 216 G4bool G4AdjointProcessEquivalentToDirectProcess::IsApplicable( 217 const G4ParticleDefinition&) 217 const G4ParticleDefinition&) 218 { 218 { 219 return fDirectProcess->IsApplicable(*fFwdPar 219 return fDirectProcess->IsApplicable(*fFwdParticleDef); 220 } 220 } 221 221 222 void G4AdjointProcessEquivalentToDirectProcess 222 void G4AdjointProcessEquivalentToDirectProcess::BuildPhysicsTable( 223 const G4ParticleDefinition&) 223 const G4ParticleDefinition&) 224 { 224 { 225 return fDirectProcess->BuildPhysicsTable(*fF 225 return fDirectProcess->BuildPhysicsTable(*fFwdParticleDef); 226 } 226 } 227 227 228 void G4AdjointProcessEquivalentToDirectProcess 228 void G4AdjointProcessEquivalentToDirectProcess::PreparePhysicsTable( 229 const G4ParticleDefinition&) 229 const G4ParticleDefinition&) 230 { 230 { 231 return fDirectProcess->PreparePhysicsTable(* 231 return fDirectProcess->PreparePhysicsTable(*fFwdParticleDef); 232 } 232 } 233 233 234 G4bool G4AdjointProcessEquivalentToDirectProce 234 G4bool G4AdjointProcessEquivalentToDirectProcess::StorePhysicsTable( 235 const G4ParticleDefinition*, const G4String& 235 const G4ParticleDefinition*, const G4String& directory, G4bool ascii) 236 { 236 { 237 return fDirectProcess->StorePhysicsTable(fFw 237 return fDirectProcess->StorePhysicsTable(fFwdParticleDef, directory, ascii); 238 } 238 } 239 239 240 G4bool G4AdjointProcessEquivalentToDirectProce 240 G4bool G4AdjointProcessEquivalentToDirectProcess::RetrievePhysicsTable( 241 const G4ParticleDefinition*, const G4String& 241 const G4ParticleDefinition*, const G4String& directory, G4bool ascii) 242 { 242 { 243 return fDirectProcess->RetrievePhysicsTable( 243 return fDirectProcess->RetrievePhysicsTable(fFwdParticleDef, directory, 244 244 ascii); 245 } 245 } 246 246 247 void G4AdjointProcessEquivalentToDirectProcess 247 void G4AdjointProcessEquivalentToDirectProcess::StartTracking(G4Track* track) 248 { 248 { 249 // Change the particle definition to the dir 249 // Change the particle definition to the direct one 250 G4DynamicParticle* theDynPart = 250 G4DynamicParticle* theDynPart = 251 const_cast<G4DynamicParticle*>(track->GetD 251 const_cast<G4DynamicParticle*>(track->GetDynamicParticle()); 252 G4ParticleDefinition* adjPartDef = theDynPar 252 G4ParticleDefinition* adjPartDef = theDynPart->GetDefinition(); 253 253 254 G4DecayProducts* decayProducts = 254 G4DecayProducts* decayProducts = 255 const_cast<G4DecayProducts*>(theDynPart->G 255 const_cast<G4DecayProducts*>(theDynPart->GetPreAssignedDecayProducts()); 256 theDynPart->SetPreAssignedDecayProducts((G4D 256 theDynPart->SetPreAssignedDecayProducts((G4DecayProducts*) (0)); 257 theDynPart->SetDefinition(fFwdParticleDef); 257 theDynPart->SetDefinition(fFwdParticleDef); 258 258 259 fDirectProcess->StartTracking(track); 259 fDirectProcess->StartTracking(track); 260 260 261 // Restore the adjoint particle definition t 261 // Restore the adjoint particle definition to the direct one 262 theDynPart->SetDefinition(adjPartDef); 262 theDynPart->SetDefinition(adjPartDef); 263 theDynPart->SetPreAssignedDecayProducts(deca 263 theDynPart->SetPreAssignedDecayProducts(decayProducts); 264 264 265 return; 265 return; 266 } 266 } 267 267 268 void G4AdjointProcessEquivalentToDirectProcess 268 void G4AdjointProcessEquivalentToDirectProcess::EndTracking() 269 { 269 { 270 fDirectProcess->EndTracking(); 270 fDirectProcess->EndTracking(); 271 } 271 } 272 272