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 // HadrontherapyRBEAccumulable.hh; 27 // 28 #ifndef HADRONTHERAPYRBEACCUMULABLE_HH 29 #define HADRONTHERAPYRBEACCUMULABLE_HH 30 31 #include <G4VAccumulable.hh> 32 33 #include <valarray> 34 35 /** 36 * @brief Accumulable of RBE-related data (that must be thread-local). 37 * 38 * It keeps the sum of alpha and beta numerators/denominator, as well as energy deposits. 39 * The class is closely tied with the singleton HadrontherapyRBE that is used both 40 * to calculate alphas and betas, and also to store results. 41 * 42 * This is implemented as a customized G4VAccumulable with non-scalar data. 43 * 44 * @note There are two levels of merging (accumulation): 45 * 1) From more threads in one run (G4VAccumulable merging is applied) 46 * 2) (Optional) inter-run merging of data (implemented in HadrontherapyRBE). 47 * 48 * @note std::valarray is used (instead of C arrays or std::vectors) 49 * to accumulate data for its logical simplicity. 50 */ 51 class HadrontherapyRBEAccumulable : public G4VAccumulable 52 { 53 public: 54 HadrontherapyRBEAccumulable(); 55 HadrontherapyRBEAccumulable(const HadrontherapyRBEAccumulable& other) = default; 56 57 // G4VAccumulable virtual methods 58 void Merge(const G4VAccumulable &rhs) override; 59 void Reset() override; 60 61 // Store information from a single step 62 void Accumulate(G4double E, G4double energyDeposit, G4double dX, G4int Z, G4int i, G4int j, G4int k); 63 64 // Type alias for numerical arrays 65 using array_type = std::valarray<G4double>; 66 67 // Access to stored data (to be called on the merged data) 68 const array_type GetEnergyDeposit() const; 69 const array_type GetAlphaNumerator() const { return fAlphaNumerator; } 70 const array_type GetBetaNumerator() const { return fBetaNumerator; } 71 const array_type GetDenominator() const { return fDenominator; } 72 73 // Verbosity, shared with HadrontherapyRBE 74 G4int GetVerboseLevel() const; 75 76 private: 77 /** @brief Helper function to get the 1D index in the 3D array */ 78 inline G4int GetIndex(G4int i, G4int j, G4int k) const {return (i * fVoxelsAlongY + j) * fVoxelsAlongZ + k; } 79 80 // Apply configuration from the HadrontherapyRBE class and prepare matrices 81 void Initialize(); 82 G4bool fInitialized { false }; 83 84 array_type fAlphaNumerator; 85 array_type fBetaNumerator; 86 array_type fDenominator; 87 array_type fEnergyDeposit; 88 89 // How many voxels do we have? 90 // ...along each axis 91 G4int fVoxelsAlongX; 92 G4int fVoxelsAlongY; 93 G4int fVoxelsAlongZ; 94 95 // ...and in total 96 size_t fVoxels; 97 98 99 100 101 }; 102 103 #endif // HADRONTHERAPYRBEACCUMULABLE_HH 104