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 // $Id:$ 26 27 27 // Author: Ivana Hrivnacova, 22/08/2013 (ivan 28 // Author: Ivana Hrivnacova, 22/08/2013 (ivana@ipno.in2p3.fr) 28 29 29 #include "G4BinScheme.hh" 30 #include "G4BinScheme.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 G4ExceptionDescription description; 45 << 45 description 46 return G4BinScheme::kLinear; << 46 << " \"" << binSchemeName << "\" binning scheme is not supported." << G4endl >> 47 << " " << "Linear binning will be applied."; >> 48 G4Exception("G4Analysis::GetBinScheme", >> 49 "Analysis_W013", JustWarning, description); >> 50 } >> 51 } >> 52 return binScheme; 47 } 53 } 48 54 49 //____________________________________________ 55 //_____________________________________________________________________________ 50 void ComputeEdges(G4int nbins, G4double xmin, << 56 void ComputeEdges(G4int nbins, G4double xmin, G4double xmax, 51 G4double unit, G4Fcn fcn, G4 57 G4double unit, G4Fcn fcn, G4BinScheme binScheme, 52 std::vector<G4double>& edges 58 std::vector<G4double>& edges) 53 { 59 { 54 // Compute edges from parameters 60 // Compute edges from parameters 55 61 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 62 // Apply units 78 auto xumin = xmin/unit; 63 auto xumin = xmin/unit; 79 auto xumax = xmax/unit; 64 auto xumax = xmax/unit; 80 65 81 if ( binScheme == G4BinScheme::kLinear ) { 66 if ( binScheme == G4BinScheme::kLinear ) { 82 auto dx = (fcn(xumax) - fcn(xumin) ) / nbi 67 auto dx = (fcn(xumax) - fcn(xumin) ) / nbins; 83 auto binValue = fcn(xumin); 68 auto binValue = fcn(xumin); 84 while ( G4int(edges.size()) <= nbins ) { 69 while ( G4int(edges.size()) <= nbins ) { // Loop checking, 23.06.2015, I. Hrivnacova 85 edges.push_back(binValue); 70 edges.push_back(binValue); 86 binValue += dx; 71 binValue += dx; 87 } 72 } 88 return; << 73 } 89 } << 74 else if ( binScheme == G4BinScheme::kLog ) { 90 << 75 // do not apply fcn 91 if ( binScheme == G4BinScheme::kLog ) { << 76 auto dlog 92 // do not apply fcn << 77 = (std::log10(xumax) - std::log10(xumin))/ nbins; 93 auto dlog = (std::log10(xumax) - std::log1 << 94 auto dx = std::pow(10, dlog); 78 auto dx = std::pow(10, dlog); 95 auto binValue = xumin; 79 auto binValue = xumin; 96 while ( G4int(edges.size()) <= nbins ) { / 80 while ( G4int(edges.size()) <= nbins ) { // Loop checking, 23.06.2015, I. Hrivnacova 97 edges.push_back(binValue); 81 edges.push_back(binValue); 98 binValue *= dx; 82 binValue *= dx; 99 } 83 } 100 return; << 101 } 84 } 102 } << 85 else if ( binScheme == G4BinScheme::kUser ) { >> 86 // This should never happen, but let's make sure about it >> 87 // by issuing a warning >> 88 G4ExceptionDescription description; >> 89 description >> 90 << " User binning scheme setting was ignored." << G4endl >> 91 << " Linear binning will be applied with given (nbins, xmin, xmax) values"; >> 92 G4Exception("G4Analysis::ComputeEdges", >> 93 "Analysis_W013", JustWarning, description); >> 94 } >> 95 } 103 96 104 //____________________________________________ 97 //_____________________________________________________________________________ 105 void ComputeEdges(const std::vector<G4double>& << 98 void ComputeEdges(const std::vector<G4double>& edges, 106 G4double unit, G4Fcn fcn, << 99 G4double unit, G4Fcn fcn, 107 std::vector<G4double>& newBi 100 std::vector<G4double>& newBins) 108 { 101 { 109 // Apply function & unit to defined edges << 102 // 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 103 118 for (auto element : edges) { 104 for (auto element : edges) { 119 newBins.push_back(fcn(element/unit)); 105 newBins.push_back(fcn(element/unit)); 120 } 106 } 121 } 107 } 122 << 108 123 } 109 } 124 110