Geant4 Cross Reference |
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 #include "BoundedBrownianAction.hh" 28 29 #include "G4DNABoundingBox.hh" 30 #include "G4Molecule.hh" 31 #include "G4Track.hh" 32 33 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 34 35 BoundedBrownianAction::BoundedBrownianAction() : G4VUserBrownianAction() {} 36 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 37 38 G4double BoundedBrownianAction::GetDistanceToBoundary(const G4Track& track) 39 { 40 if (!fpBoundingBox->contains(track.GetPosition())) { 41 G4ExceptionDescription errMsg; 42 errMsg << "Point is out of box : " << *fpBoundingBox 43 << " of particle : " << GetIT(track)->GetName() << "(" << track.GetTrackID() 44 << ") : " << track.GetPosition(); 45 G4Exception( 46 "BoundedBrownianAction::GetDistanceToBoundary" 47 "BoundedBrownianAction", 48 "BoundedBrownianAction", FatalErrorInArgument, errMsg); 49 } 50 51 auto dx = std::min(track.GetPosition().getX() - fpBoundingBox->Getxlo(), 52 fpBoundingBox->Getxhi() - track.GetPosition().getX()); 53 auto dy = std::min(track.GetPosition().getY() - fpBoundingBox->Getylo(), 54 fpBoundingBox->Getyhi() - track.GetPosition().getY()); 55 auto dz = std::min(track.GetPosition().getZ() - fpBoundingBox->Getzlo(), 56 fpBoundingBox->Getzhi() - track.GetPosition().getZ()); 57 return std::min({dx, dy, dz}); 58 } 59 60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 61 62 void BoundedBrownianAction::Transport(G4ThreeVector& nextposition, G4Track*) 63 { 64 BouncingAction(nextposition); 65 } 66 67 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 68 69 void BoundedBrownianAction::BouncingAction(G4ThreeVector& nextposition) const 70 { 71 // This algorithm is implemented based on Karamitros, Mathieu et al.2020,arXiv:2006.14225 (2020) 72 // https://doi.org/10.48550/arXiv.2006.14225 73 G4double RxM = fpBoundingBox->Getxhi(); 74 G4double RyM = fpBoundingBox->Getyhi(); 75 G4double RzM = fpBoundingBox->Getzhi(); 76 77 G4double Rxm = fpBoundingBox->Getxlo(); 78 G4double Rym = fpBoundingBox->Getylo(); 79 G4double Rzm = fpBoundingBox->Getzlo(); 80 G4double Lx = RxM - Rxm; 81 G4double Ly = RyM - Rym; 82 G4double Lz = RzM - Rzm; 83 G4double trunx = trunc(std::abs(nextposition.getX() - Rxm) / Lx); 84 G4double truny = trunc(std::abs(nextposition.getY() - Rym) / Ly); 85 G4double trunz = trunc(std::abs(nextposition.getZ() - Rzm) / Lz); 86 G4double hx = std::fmod(trunx, 2); 87 G4double hy = std::fmod(truny, 2); 88 G4double hz = std::fmod(trunz, 2); 89 G4double x = Rxm + hx * Lx + (1 - 2 * hx) * std::abs(std::fmod(nextposition.getX() - Rxm, Lx)); 90 G4double y = Rym + hy * Ly + (1 - 2 * hy) * std::abs(std::fmod(nextposition.getY() - Rym, Ly)); 91 G4double z = Rzm + hz * Lz + (1 - 2 * hz) * std::abs(std::fmod(nextposition.getZ() - Rzm, Lz)); 92 nextposition.set(x, y, z); 93 } 94 95 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 96