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 27 // Author: Ivana Hrivnacova, 22/08/2013 (ivana@ipno.in2p3.fr) 28 29 #include "G4BinScheme.hh" 30 #include "G4AnalysisUtilities.hh" 31 32 namespace G4Analysis 33 { 34 35 //_____________________________________________________________________________ 36 G4BinScheme 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 //_____________________________________________________________________________ 50 void 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 //_____________________________________________________________________________ 105 void 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 } 124