Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 26 27 // Author: Ivana Hrivnacova, 22/08/2013 (ivan 27 // Author: Ivana Hrivnacova, 22/08/2013 (ivana@ipno.in2p3.fr) 28 28 29 #include "G4BinScheme.hh" 29 #include "G4BinScheme.hh" 30 #include "G4AnalysisUtilities.hh" 30 #include "G4AnalysisUtilities.hh" 31 31 32 namespace G4Analysis 32 namespace G4Analysis 33 { 33 { 34 34 35 //____________________________________________ 35 //_____________________________________________________________________________ 36 G4BinScheme GetBinScheme(const G4String& binSc 36 G4BinScheme GetBinScheme(const G4String& binSchemeName) 37 { 37 { 38 if (binSchemeName == "linear") return G4BinS << 38 G4BinScheme binScheme = G4BinScheme::kLinear; 39 if (binSchemeName == "log") return G4BinS << 39 if ( binSchemeName != "linear" ) { 40 if (binSchemeName == "user") return G4BinS << 40 if ( binSchemeName == "log" ) 41 << 41 binScheme = G4BinScheme::kLog; 42 // No other name is supported << 42 else { 43 Warn("\"" + binSchemeName + "\" binning sche << 43 // There is no name associated with G4BinScheme::kUser 44 "Linear binning will be applied.", kNam << 44 Warn("\"" + binSchemeName + "\" binning scheme is not supported.\n" 45 << 45 "Linear binning will be applied.", 46 return G4BinScheme::kLinear; << 46 kNamespaceName, "GetBinScheme"); >> 47 } >> 48 } >> 49 return binScheme; 47 } 50 } 48 51 49 //____________________________________________ 52 //_____________________________________________________________________________ 50 void ComputeEdges(G4int nbins, G4double xmin, 53 void ComputeEdges(G4int nbins, G4double xmin, G4double xmax, 51 G4double unit, G4Fcn fcn, G4 54 G4double unit, G4Fcn fcn, G4BinScheme binScheme, 52 std::vector<G4double>& edges 55 std::vector<G4double>& edges) 53 { 56 { 54 // Compute edges from parameters 57 // Compute edges from parameters 55 58 56 if ( binScheme == G4BinScheme::kUser ) { << 57 // This call should never happen for user << 58 Warn("There is no need to compute edges fo << 59 "Call is ignored.", kNamespaceName, " << 60 return; << 61 } << 62 << 63 if (unit == 0.) { << 64 // Should never happen << 65 Warn("Illegal unit value (0), 1. will be u << 66 kNamespaceName, "ComputeEdges"); << 67 unit = 1.; << 68 } << 69 << 70 if (nbins == 0) { << 71 // Should never happen << 72 Warn("Illegal number of nbins value (0), c << 73 kNamespaceName, "ComputeEdges"); << 74 return; << 75 } << 76 << 77 // Apply units 59 // Apply units 78 auto xumin = xmin/unit; 60 auto xumin = xmin/unit; 79 auto xumax = xmax/unit; 61 auto xumax = xmax/unit; 80 62 81 if ( binScheme == G4BinScheme::kLinear ) { 63 if ( binScheme == G4BinScheme::kLinear ) { 82 auto dx = (fcn(xumax) - fcn(xumin) ) / nbi 64 auto dx = (fcn(xumax) - fcn(xumin) ) / nbins; 83 auto binValue = fcn(xumin); 65 auto binValue = fcn(xumin); 84 while ( G4int(edges.size()) <= nbins ) { 66 while ( G4int(edges.size()) <= nbins ) { // Loop checking, 23.06.2015, I. Hrivnacova 85 edges.push_back(binValue); 67 edges.push_back(binValue); 86 binValue += dx; 68 binValue += dx; 87 } 69 } 88 return; << 89 } 70 } 90 << 71 else if ( binScheme == G4BinScheme::kLog ) { 91 if ( binScheme == G4BinScheme::kLog ) { << 92 // do not apply fcn 72 // do not apply fcn 93 auto dlog = (std::log10(xumax) - std::log1 << 73 auto dlog >> 74 = (std::log10(xumax) - std::log10(xumin))/ nbins; 94 auto dx = std::pow(10, dlog); 75 auto dx = std::pow(10, dlog); 95 auto binValue = xumin; 76 auto binValue = xumin; 96 while ( G4int(edges.size()) <= nbins ) { / 77 while ( G4int(edges.size()) <= nbins ) { // Loop checking, 23.06.2015, I. Hrivnacova 97 edges.push_back(binValue); 78 edges.push_back(binValue); 98 binValue *= dx; 79 binValue *= dx; 99 } 80 } 100 return; << 81 } >> 82 else if ( binScheme == G4BinScheme::kUser ) { >> 83 // This should never happen, but let's make sure about it >> 84 // by issuing a warning >> 85 Warn("User binning scheme setting was ignored.\n" >> 86 "Linear binning will be applied with given (nbins, xmin, xmax) values", >> 87 kNamespaceName, "GetBinScheme"); 101 } 88 } 102 } 89 } 103 90 104 //____________________________________________ 91 //_____________________________________________________________________________ 105 void ComputeEdges(const std::vector<G4double>& 92 void ComputeEdges(const std::vector<G4double>& edges, 106 G4double unit, G4Fcn fcn, 93 G4double unit, G4Fcn fcn, 107 std::vector<G4double>& newBi 94 std::vector<G4double>& newBins) 108 { 95 { 109 // Apply function & unit to defined edges << 96 // Apply function to defined edges 110 << 111 if (unit == 0.) { << 112 // Should never happen << 113 Warn("Illegal unit value (0), 1. will be u << 114 kNamespaceName, "ComputeEdges"); << 115 unit = 1.; << 116 } << 117 97 118 for (auto element : edges) { 98 for (auto element : edges) { 119 newBins.push_back(fcn(element/unit)); 99 newBins.push_back(fcn(element/unit)); 120 } 100 } 121 } 101 } 122 102 123 } 103 } 124 104