Geant4 Cross Reference |
1 // ******************************************************************** 2 // * License and Disclaimer * 3 // * * 4 // * The Geant4 software is copyright of the Copyright Holders of * 5 // * the Geant4 Collaboration. It is provided under the terms and * 6 // * conditions of the Geant4 Software License, included in the file * 7 // * LICENSE and available at http://cern.ch/geant4/license . These * 8 // * include a list of copyright holders. * 9 // * * 10 // * Neither the authors of this software system, nor their employing * 11 // * institutes,nor the agencies providing financial support for this * 12 // * work make any representation or warranty, express or implied, * 13 // * regarding this software system or assume any liability for its * 14 // * use. Please see the license in the file LICENSE and URL above * 15 // * for the full disclaimer and the limitation of liability. * 16 // * * 17 // * This code implementation is the result of the scientific and * 18 // * technical work of the GEANT4 collaboration. * 19 // * By using, copying, modifying or distributing the software (or * 20 // * any work based on the software) you agree to acknowledge its * 21 // * use in resulting scientific publications, and indicate your * 22 // * acceptance of all terms of the Geant4 Software license. * 23 // ******************************************************************** 24 // 25 // Helper namespace field_utils 26 // 27 // Description: 28 // 29 // Simple methods to extract vectors from arrays in conventions of 30 // the magnetic field integration. 31 32 // Author: Dmitry Sorokin, Google Summer of Code 2017 33 // Supervision: John Apostolakis, CERN 34 // -------------------------------------------------------------------- 35 #ifndef G4FIELD_UTILS_HH 36 #define G4FIELD_UTILS_HH 37 38 #include "G4FieldTrack.hh" 39 #include "G4Types.hh" 40 #include "G4ThreeVector.hh" 41 42 namespace field_utils 43 { 44 45 using State = G4double[G4FieldTrack::ncompSVEC]; 46 47 template <unsigned int N> 48 using ShortState = G4double[N]; 49 50 enum class Value3D 51 { 52 Position = 0, 53 Momentum = 3, 54 Spin = 9 55 }; 56 57 enum class Value1D 58 { 59 KineticEnergy = 6, 60 LabTime = 7, 61 ProperTime = 8 62 }; 63 64 template <typename ArrayType> 65 G4double getValue(const ArrayType& array, Value1D value); 66 67 template <typename ArrayType> 68 G4double getValue2(const ArrayType& array, Value1D value); 69 70 template <typename ArrayType> 71 G4double getValue(const ArrayType& array, Value3D value); 72 73 template <typename ArrayType> 74 G4double getValue2(const ArrayType& array, Value3D value); 75 76 template <typename ArrayType> 77 G4ThreeVector makeVector(const ArrayType& array, Value3D value); 78 79 G4double absoluteError( 80 const G4double y[], 81 const G4double yerr[], 82 G4double hstep); 83 84 G4double relativeError2( 85 const G4double y[], 86 const G4double yerr[], 87 G4double hstep, 88 G4double errorTolerance); 89 90 G4double relativeError( 91 const G4double y[], 92 const G4double yerr[], 93 G4double hstep, 94 G4double errorTolerance); 95 96 template <typename SourceArray, typename TargetArray> 97 void setValue(const SourceArray& src, Value1D value, TargetArray& trg); 98 99 template <typename SourceArray, typename TargetArray, typename ...TargetArrays> 100 void setValue(const SourceArray& src, Value1D value, 101 TargetArray& trg, TargetArrays&... trgs); 102 103 void copy(G4double dst[], const G4double src[], 104 std::size_t size = G4FieldTrack::ncompSVEC); 105 106 G4double inverseCurvatureRadius(G4double particleCharge, 107 G4double momentum, G4double BField); 108 109 template <typename T> 110 T clamp(T value, T lo, T hi); 111 112 } // field_utils 113 114 #include "G4FieldUtils.icc" 115 116 #endif 117