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