Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4BinScheme.cc
Go to the documentation of this file.
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
27// Author: Ivana Hrivnacova, 22/08/2013 (ivana@ipno.in2p3.fr)
28
29#include "G4BinScheme.hh"
31
32namespace G4Analysis
33{
34
35//_____________________________________________________________________________
36G4BinScheme GetBinScheme(const G4String& binSchemeName)
37{
38 if (binSchemeName == "linear") return G4BinScheme::kLinear;
39 if (binSchemeName == "log") return G4BinScheme::kLog;
40 if (binSchemeName == "user") return G4BinScheme::kUser;
41
42 // No other name is supported
43 Warn("\"" + binSchemeName + "\" binning scheme is not supported.\n"
44 "Linear binning will be applied.", kNamespaceName, "GetBinScheme");
45
46 return G4BinScheme::kLinear;
47}
48
49//_____________________________________________________________________________
50void ComputeEdges(G4int nbins, G4double xmin, G4double xmax,
51 G4double unit, G4Fcn fcn, G4BinScheme binScheme,
52 std::vector<G4double>& edges)
53{
54// Compute edges from parameters
55
56 if ( binScheme == G4BinScheme::kUser ) {
57 // This call should never happen for user bin scheme
58 Warn("There is no need to compute edges for G4BinScheme::kUser\n"
59 "Call is ignored.", kNamespaceName, "GetBinScheme");
60 return;
61 }
62
63 if (unit == 0.) {
64 // Should never happen
65 Warn("Illegal unit value (0), 1. will be used instead",
66 kNamespaceName, "ComputeEdges");
67 unit = 1.;
68 }
69
70 if (nbins == 0) {
71 // Should never happen
72 Warn("Illegal number of nbins value (0), call will be ignored",
73 kNamespaceName, "ComputeEdges");
74 return;
75 }
76
77 // Apply units
78 auto xumin = xmin/unit;
79 auto xumax = xmax/unit;
80
81 if ( binScheme == G4BinScheme::kLinear ) {
82 auto dx = (fcn(xumax) - fcn(xumin) ) / nbins;
83 auto binValue = fcn(xumin);
84 while ( G4int(edges.size()) <= nbins ) { // Loop checking, 23.06.2015, I. Hrivnacova
85 edges.push_back(binValue);
86 binValue += dx;
87 }
88 return;
89 }
90
91 if ( binScheme == G4BinScheme::kLog ) {
92 // do not apply fcn
93 auto dlog = (std::log10(xumax) - std::log10(xumin))/ nbins;
94 auto dx = std::pow(10, dlog);
95 auto binValue = xumin;
96 while ( G4int(edges.size()) <= nbins ) { // Loop checking, 23.06.2015, I. Hrivnacova
97 edges.push_back(binValue);
98 binValue *= dx;
99 }
100 return;
101 }
102}
103
104//_____________________________________________________________________________
105void ComputeEdges(const std::vector<G4double>& edges,
106 G4double unit, G4Fcn fcn,
107 std::vector<G4double>& newBins)
108{
109// Apply function & unit to defined edges
110
111 if (unit == 0.) {
112 // Should never happen
113 Warn("Illegal unit value (0), 1. will be used instead",
114 kNamespaceName, "ComputeEdges");
115 unit = 1.;
116 }
117
118 for (auto element : edges) {
119 newBins.push_back(fcn(element/unit));
120 }
121}
122
123}
G4BinScheme
Definition: G4BinScheme.hh:39
G4double(*)(G4double) G4Fcn
Definition: G4Fcn.hh:35
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
G4BinScheme GetBinScheme(const G4String &binSchemeName)
Definition: G4BinScheme.cc:36
constexpr std::string_view kNamespaceName
void ComputeEdges(G4int nbins, G4double xmin, G4double xmax, G4double unit, G4Fcn fcn, G4BinScheme, std::vector< G4double > &edges)
Definition: G4BinScheme.cc:50
void Warn(const G4String &message, const std::string_view inClass, const std::string_view inFunction)