File indexing completed on 2025-11-03 09:47:45
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 
0010 
0011 
0012 
0013 
0014 
0015 
0016 
0017 
0018 
0019 
0020 
0021 
0022 
0023 
0024 
0025 
0026 
0027 
0028 
0029 
0030 
0031 
0032 
0033 #ifndef G4DNAIonElasticModel_h
0034 #define G4DNAIonElasticModel_h 1
0035 
0036 #include <map>
0037 #include "G4DNACrossSectionDataSet.hh"
0038 #include "G4VEmModel.hh"
0039 #include "G4Proton.hh"
0040 #include "G4DNAGenericIonsManager.hh"
0041 #include "G4ParticleChangeForGamma.hh"
0042 #include "G4LogLogInterpolation.hh"
0043 #include "G4ProductionCutsTable.hh"
0044 #include "G4NistManager.hh"
0045 
0046 class G4DNAIonElasticModel : public G4VEmModel
0047 {
0048 
0049 public:
0050 
0051   G4DNAIonElasticModel (const G4ParticleDefinition* p = nullptr,
0052                         const G4String& nam ="DNAIonElasticModel");
0053 
0054   
0055   ~G4DNAIonElasticModel () override;
0056 
0057   G4DNAIonElasticModel &
0058   operator= (const G4DNAIonElasticModel &right) = delete;
0059   G4DNAIonElasticModel (const G4DNAIonElasticModel&) = delete;
0060 
0061   void
0062   Initialise (const G4ParticleDefinition* particuleDefinition,
0063               const G4DataVector&) override;
0064 
0065   G4double
0066   CrossSectionPerVolume (const G4Material* material,
0067                          const G4ParticleDefinition* p, G4double ekin,
0068                          G4double emin, G4double emax) override;
0069 
0070   void
0071   SampleSecondaries (std::vector<G4DynamicParticle*>*,
0072                      const G4MaterialCutsCouple*, const G4DynamicParticle*,
0073                      G4double tmin, G4double maxEnergy) override;
0074 
0075   void
0076   SetKillBelowThreshold (G4double threshold);
0077 
0078   G4double
0079   GetKillBelowThreshold ()
0080   {
0081     return killBelowEnergy;
0082   }
0083 
0084   inline void SelectStationary(G4bool input); 
0085 
0086 protected:
0087 
0088   G4ParticleChangeForGamma* fParticleChangeForGamma;
0089 
0090 private:
0091 
0092   G4bool statCode;
0093 
0094   
0095   const std::vector<G4double>* fpMolWaterDensity;
0096 
0097   G4double killBelowEnergy;
0098   G4double lowEnergyLimit;
0099   G4double highEnergyLimit;
0100   G4bool isInitialised{false};
0101   G4int verboseLevel;
0102 
0103   G4double fParticle_Mass;
0104 
0105   
0106   G4DNACrossSectionDataSet* fpTableData;
0107 
0108   
0109 
0110   G4double
0111   Theta (G4ParticleDefinition * aParticleDefinition, G4double k,
0112          G4double integrDiff);
0113 
0114   G4double
0115   LinLogInterpolate (G4double e1, G4double e2, G4double e, G4double xs1,
0116                      G4double xs2);
0117 
0118   G4double
0119   LogLogInterpolate (G4double e1, G4double e2, G4double e, G4double xs1,
0120                      G4double xs2);
0121 
0122   G4double
0123   QuadInterpolator (G4double e11, G4double e12, G4double e21, G4double e22,
0124                     G4double x11, G4double x12, G4double x21, G4double x22,
0125                     G4double t1, G4double t2, G4double t, G4double e);
0126 
0127   G4double
0128   LinLinInterpolate (G4double e1, G4double e2, G4double e, G4double xs1,
0129                      G4double xs2);
0130 
0131   using TriDimensionMap = std::map<G4double, std::map<G4double, G4double>>;
0132   TriDimensionMap fDiffCrossSectionData;
0133 
0134   std::vector<G4double> eTdummyVec;
0135 
0136   using VecMap = std::map<G4double, std::vector<G4double>>;
0137   VecMap eVecm;
0138 
0139   G4double
0140   RandomizeThetaCM (G4double k, G4ParticleDefinition * aParticleDefinition);
0141 
0142 };
0143 
0144 
0145 
0146 inline void G4DNAIonElasticModel::SelectStationary (G4bool input)
0147 { 
0148     statCode = input; 
0149 }        
0150 
0151 #endif
0152