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 // G4MSSteppingAction 27 // 28 // Class description: 29 // 30 // Stepping action for material scanner. 31 32 // Author: M.Asai, 5 May 2006 33 // -------------------------------------------------------------------- 34 #ifndef G4MSSteppingAction_hh 35 #define G4MSSteppingAction_hh 1 36 37 #include "G4UserSteppingAction.hh" 38 #include "globals.hh" 39 #include "G4ThreeVector.hh" 40 41 #include <vector> 42 43 class G4Region; 44 45 46 class G4MSSteppingAction : public G4UserSteppingAction 47 { 48 public: 49 G4MSSteppingAction() = default; 50 ~G4MSSteppingAction() override = default; 51 52 void Initialize(G4bool rSens, G4Region* reg); 53 void UserSteppingAction(const G4Step*) override; 54 55 inline G4double GetTotalStepLength() const { return length; } 56 inline G4double GetX0() const { return x0; } 57 inline G4double GetLambda0() const { return lambda; } 58 59 /// Print material properties verbosely for each step of geantino 60 /// This function is useful for single shot scans. 61 void PrintEachMaterialVerbose(std::ostream & oss); 62 63 /// Print list of {material name, thickness, x0, lambda}, integrated by material name 64 /// This function is useful for global scans. 65 void PrintIntegratedMaterialVerbose(std::ostream & oss); 66 67 private: 68 G4bool regionSensitive = false; 69 G4Region* theRegion = nullptr; 70 G4double length = 0.0; 71 G4double x0 = 0.0; 72 G4double lambda = 0.0; 73 struct shape_mat_info_t 74 { 75 /// Calculated average atomic number 76 G4double aveZ = 0.0; 77 /// Calculated average mass number 78 G4double aveA = 0.0; 79 /// Density of material given by user 80 G4double density = 0.0; 81 /// Material radiation length 82 G4double radiation_length = 0.0; 83 /// Material interaction length 84 G4double interaction_length = 0.0; 85 /// Step of the geantino 86 G4double thickness = 0.0; 87 /// Integrated path of the geantino 88 G4double integrated_thickness = 0.0; 89 /// Calculated x0 = thickness/radiation_length 90 G4double x0 = 0.0; 91 /// Calculated lambda = thickness/interaction_length 92 G4double lambda = 0.0; 93 /// Integrated x0 94 G4double integrated_x0 = 0.0; 95 /// Integrated lambda 96 G4double integrated_lambda = 0.0; 97 /// Entry point of the geantino into the solid 98 G4ThreeVector entry_point = { }; 99 /// Exit point of the geantino out of the solid 100 G4ThreeVector exit_point = { }; 101 /// Material name. Composition is not checked. 102 /// That is, if there are two identical materials 103 /// except for the name, they are treated as different 104 G4String material_name = { }; 105 /// Getter that returns the full material name 106 const G4String& GetName() { return material_name; } 107 /// Getter that returns the material name, splitted in blocks of length 'column_width' 108 G4String GetName(G4int column_width) 109 { 110 auto input_name_length = (G4int)material_name.length(); 111 if( input_name_length < column_width) { return material_name; } 112 113 G4String formatted_name; 114 for (std::size_t i = 0; i < material_name.length(); i += column_width) 115 { 116 // for each block of characters of length 'column_width', append '\n' 117 formatted_name += material_name.substr(i, column_width); 118 if (i + column_width < material_name.length()) 119 { 120 formatted_name += '\n'; 121 } 122 // append spaces for last block of characters so its length corresponds to column_width 123 else 124 { 125 formatted_name+=G4String( column_width-(input_name_length%column_width),' '); 126 } 127 } 128 return formatted_name; 129 } 130 }; 131 std::vector<shape_mat_info_t> shape_mat_info_v; 132 133 }; 134 135 #endif 136