Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/global/HEPNumerics/include/G4StatAnalysis.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 // G4StatAnalysis
 27 //
 28 // Class description:
 29 //
 30 //  Class for statistical analysis of random variable
 31 //
 32 //  Adapted from:
 33 //  Lux, I.
 34 //      Monte Carlo particle transport methods: neutron and photon
 35 //      calculations/authors, Ivan Lux and Laszlo Koblinger.
 36 //      ISBN 0-8493-6074-9
 37 //  1. Neutron transport theory. 2. Photon transport theory.
 38 //  3. Monte Carlo method. I. Koblinger, Laszlo. II. Title.
 39 //     QC793.5.N4628L88 1990 530.1 '38'20
 40 
 41 // Author: J.Madsen, 25.10.2018
 42 // --------------------------------------------------------------------
 43 #ifndef G4StatAnalysis_hh
 44 #define G4StatAnalysis_hh 1
 45 
 46 #include <cmath>
 47 #include <fstream>
 48 #include <iomanip>
 49 #include <iostream>
 50 #include <limits>
 51 #include <optional>
 52 
 53 #include "globals.hh"
 54 #include "tls.hh"
 55 
 56 #include "G4Allocator.hh"
 57 #include "G4Timer.hh"
 58 #include "G4Types.hh"
 59 #include "G4ios.hh"
 60 
 61 class G4StatAnalysis
 62 {
 63  public:
 64   inline G4StatAnalysis();
 65   inline ~G4StatAnalysis() {}
 66 
 67   // Accumulated values
 68   inline G4double GetMean() const;
 69   inline const G4double& GetSum() const;
 70   inline const G4double& GetSumSquared() const;
 71   inline const G4double& GetSum1() const;
 72   inline const G4double& GetSum2() const;
 73   inline const G4int& GetHits() const;
 74   inline G4int GetNumNonZero() const;
 75   inline G4int GetNumZero() const;
 76 
 77   // Some control over accumulated variables
 78   inline void SetSum(const G4double& val);
 79   inline void SetSumSquared(const G4double& val);
 80   inline void SetSum1(const G4double& val);
 81   inline void SetSum2(const G4double& val);
 82   inline void SetHits(const G4int& val);
 83   inline void SetZero(const G4int& val);
 84 
 85   // Computed values
 86   inline G4double GetFOM() const;
 87   inline G4double GetRelativeError() const;
 88   inline G4double GetStdDev() const;
 89   inline G4double GetVariance() const;
 90   inline G4double GetCoeffVariation() const;
 91   inline G4double GetEfficiency() const;
 92   inline G4double GetR2Int() const;
 93   inline G4double GetR2Eff() const;
 94 
 95   // Conversion
 96   inline operator G4double() const;
 97 
 98   // Modifications
 99   inline void Reset();
100   inline void Add(const G4double& _val, const G4double& _weight = 1.0);
101   inline void Rescale(const G4double& factor);
102 
103   // Output
104   inline void PrintInfo(std::ostream& os, const std::string& = "") const;
105 
106   // Operators
107   inline G4StatAnalysis& operator+=(const G4double& _val);
108   inline G4StatAnalysis& operator/=(const G4double& _val);
109   inline G4StatAnalysis& operator+=(const G4StatAnalysis&);
110   inline G4StatAnalysis& operator-=(const G4StatAnalysis&);
111 
112   // Allocators
113   inline void* operator new(std::size_t);
114   inline void operator delete(void*);
115 
116   // Timing (member functions)
117   inline G4double GetCpuTime() const;
118   // Timing (static functions)
119   static tms* GetCpuClock()
120   {
121     G4ThreadLocalStatic std::optional<tms> _instance(std::nullopt);
122     if(_instance == std::nullopt)
123     {
124       _instance = tms();
125       times(&_instance.value());
126     }
127     return &_instance.value();
128   }
129   // Note: this above implementation was implemented in such a way as to
130   // conserve memory by eliminated every instance from requiring their own
131   // timing variables. The ResetCpuClock function below is called at the
132   // beginning of the run (G4Run constructor) to attempt to ensure the
133   // FOM is not skewed by multiple runs -- it may be necessary to
134   // manually invoke in some situations
135   static void ResetCpuClock()
136   {
137     tms* _clock = GetCpuClock();
138     times(_clock);
139   }
140 
141   // friend operator for output
142   friend std::ostream& operator<<(std::ostream& os, const G4StatAnalysis& obj)
143   {
144     obj.PrintInfo(os);
145     return os;
146   }
147   // friend operator for addition
148   friend const G4StatAnalysis operator+(const G4StatAnalysis& lhs,
149                                         const G4StatAnalysis& rhs)
150   {
151     return G4StatAnalysis(lhs) += rhs;
152   }
153   // friend operator for subtraction
154   friend const G4StatAnalysis operator-(const G4StatAnalysis& lhs,
155                                         const G4StatAnalysis& rhs)
156   {
157     return G4StatAnalysis(lhs) -= rhs;
158   }
159 
160  private:
161   G4double fSum1 = 0.0;  // summation of each history^1
162   G4double fSum2 = 0.0;  // summation from each history^2
163   G4int fHits    = 0;    // number of scoring histories
164   G4int fZero    = 0;    // number of histories that were not greater than 0.0
165 };
166 
167 #include "G4StatAnalysis.icc"
168 
169 #endif
170