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 #ifndef G4Fancy3DNucleus_h 27 #define G4Fancy3DNucleus_h 1 28 29 // ------------------------------------------------------------ 30 // GEANT 4 class header file 31 // 32 // ---------------- G4Fancy3DNucleus ---------------- 33 // by Gunter Folger, May 1998. 34 // class for a 3D nucleus, arranging nucleons in space and momentum. 35 // ------------------------------------------------------------ 36 // 20110805 M. Kelsey -- Remove C-style array (pointer) of G4Nucleons, 37 // make vector a container of objects. Move testSums, 38 // places, momentum and fermiM to class data members for 39 // reuse. Remove args from ReduceSum(), use data members. 40 41 #include "globals.hh" 42 #include "G4DynamicParticle.hh" 43 #include "G4Nucleon.hh" 44 #include "G4V3DNucleus.hh" 45 #include "G4VNuclearDensity.hh" 46 #include "G4FermiMomentum.hh" 47 #include <vector> 48 49 class G4Fancy3DNucleusHelper; 50 51 // to test if we can drop old interface for (A,Z), comment next line.. 52 //#define NON_INTEGER_A_Z 1 53 54 class G4Fancy3DNucleus : public G4V3DNucleus 55 { 56 57 public: 58 G4Fancy3DNucleus(); 59 ~G4Fancy3DNucleus(); 60 61 private: 62 G4Fancy3DNucleus(const G4Fancy3DNucleus &right); 63 const G4Fancy3DNucleus & operator=(const G4Fancy3DNucleus &right); 64 G4bool operator==(const G4Fancy3DNucleus &right) const; 65 G4bool operator!=(const G4Fancy3DNucleus &right) const; 66 67 68 // Implementation 69 void ChooseNucleons(); 70 void ChoosePositions(); 71 void ChooseFermiMomenta(); 72 G4double BindingEnergy(); 73 G4bool ReduceSum(); 74 75 public: 76 #if defined(NON_INTEGER_A_Z) 77 void Init(G4double theA, G4double theZ, G4int numberOfLambdas = 0); 78 #endif 79 void Init(G4int theA, G4int theZ, G4int numberOfLambdas = 0); 80 G4bool StartLoop(); 81 G4Nucleon * GetNextNucleon(); 82 const std::vector<G4Nucleon> & GetNucleons(); 83 G4int GetMassNumber(); 84 G4double GetMass(); 85 G4int GetCharge(); 86 G4int GetNumberOfLambdas(); // Non-negative number of Lambdas (for hypernuclei) or anti-Lambdas (for anti-hypernuclei) 87 G4double GetNuclearRadius(); 88 G4double GetNuclearRadius(const G4double maxRelativeDensity); 89 G4double GetOuterRadius(); 90 G4double AddExcitationEnergy(G4double); 91 G4double GetExcitationEnergy(); 92 G4double CoulombBarrier(); 93 void DoLorentzBoost(const G4LorentzVector & theBoost); 94 void DoLorentzBoost(const G4ThreeVector & theBeta); 95 void DoLorentzContraction(const G4LorentzVector & theBoost); 96 void DoLorentzContraction(const G4ThreeVector & theBeta); 97 void CenterNucleons(); 98 void DoTranslation(const G4ThreeVector & theShift); 99 const G4VNuclearDensity * GetNuclearDensity() const; 100 void SortNucleonsIncZ(); 101 void SortNucleonsDecZ(); 102 103 private: 104 105 G4int myA; 106 G4int myZ; 107 G4int myL; // Non-negative number of Lambdas (for hypernuclei) or anti-Lambdas (for anti-hypernuclei) 108 std::vector<G4Nucleon> theNucleons; 109 110 G4int currentNucleon; 111 G4VNuclearDensity * theDensity; 112 G4FermiMomentum theFermi; 113 G4double nucleondistance; 114 G4double excitationEnergy; 115 116 std::vector<G4ThreeVector> places; // For selecting locations 117 std::vector<G4ThreeVector> momentum; // For selecting nucleon motion 118 std::vector<G4double> fermiM; 119 std::vector<G4Fancy3DNucleusHelper> testSums; // For sorting nucleon configs 120 }; 121 122 123 inline G4int G4Fancy3DNucleus::GetCharge() 124 { 125 return myZ; 126 } 127 128 inline G4int G4Fancy3DNucleus::GetMassNumber() 129 { 130 return myA; 131 } 132 133 inline G4int G4Fancy3DNucleus::GetNumberOfLambdas() 134 { 135 return myL; 136 } 137 138 inline G4double G4Fancy3DNucleus::AddExcitationEnergy(G4double anE) 139 { 140 excitationEnergy +=anE; 141 return excitationEnergy; 142 } 143 144 inline G4double G4Fancy3DNucleus::GetExcitationEnergy() 145 { 146 return excitationEnergy; 147 } 148 149 #endif 150