Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 27 // Author: Ivana Hrivnacova, 22/08/2013 (ivan 28 29 #include "G4BinScheme.hh" 30 #include "G4AnalysisUtilities.hh" 31 32 namespace G4Analysis 33 { 34 35 //____________________________________________ 36 G4BinScheme GetBinScheme(const G4String& binSc 37 { 38 if (binSchemeName == "linear") return G4BinS 39 if (binSchemeName == "log") return G4BinS 40 if (binSchemeName == "user") return G4BinS 41 42 // No other name is supported 43 Warn("\"" + binSchemeName + "\" binning sche 44 "Linear binning will be applied.", kNam 45 46 return G4BinScheme::kLinear; 47 } 48 49 //____________________________________________ 50 void ComputeEdges(G4int nbins, G4double xmin, 51 G4double unit, G4Fcn fcn, G4 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 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 78 auto xumin = xmin/unit; 79 auto xumax = xmax/unit; 80 81 if ( binScheme == G4BinScheme::kLinear ) { 82 auto dx = (fcn(xumax) - fcn(xumin) ) / nbi 83 auto binValue = fcn(xumin); 84 while ( G4int(edges.size()) <= nbins ) { 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::log1 94 auto dx = std::pow(10, dlog); 95 auto binValue = xumin; 96 while ( G4int(edges.size()) <= nbins ) { / 97 edges.push_back(binValue); 98 binValue *= dx; 99 } 100 return; 101 } 102 } 103 104 //____________________________________________ 105 void ComputeEdges(const std::vector<G4double>& 106 G4double unit, G4Fcn fcn, 107 std::vector<G4double>& newBi 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 u 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