2 // ********************************************************************
3 // * License and Disclaimer *
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. *
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. *
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 // ********************************************************************
26 #ifndef G4_CASCADE_FUNCTIONS_ICC
27 #define G4_CASCADE_FUNCTIONS_ICC
28 // $Id: G4CascadeFunctions.icc 67796 2013-03-08 06:18:39Z mkelsey $
30 // 20100512 M. Kelsey -- Pass std::vector<> buffer as argument to
31 // getOutgoingPartTypes().
32 // 20100803 M. Kelsey -- Add printing function for debugging
33 // 20100804 M. Kelsey -- Pretty up printing function
34 // 20110725 M. Kelsey -- Use ctor to register table in lookup factory
35 // 20110728 M. Kelsey -- Fix Coverity #22955, recursive #include; fix
36 // Coverity #20228, test (mult>maxMult), set to max if over
37 // 20110916 M. Kelsey -- Drop self-registration due to platform inconsistencies
38 // Drop "inline" keyword on complex functions
39 // 20110923 M. Kelsey -- Add optional ostream& argument to printTable(),
40 // pass through to SAMP and DATA
42 #include "G4CascadeChannelTables.hh"
46 // Constructor registers table in lookup
48 template <class DATA, class SAMP>
49 G4CascadeFunctions<DATA,SAMP>::G4CascadeFunctions() : SAMP() {}
52 // Compare summed partial cross section with total cross section
53 // Truncate multiplicity at maximum if summed < total
55 template <class DATA, class SAMP>
56 G4int G4CascadeFunctions<DATA,SAMP>::getMultiplicity(G4double ke) const {
57 // Use pointer comparison to see whether tot is just a ref to sum)
58 if (&DATA::data.sum != &DATA::data.tot) {
59 G4double summed = this->findCrossSection(ke, DATA::data.sum);
60 G4double total = this->findCrossSection(ke, DATA::data.tot);
61 if (G4UniformRand() > summed/total) return DATA::data.maxMultiplicity();
64 return this->findMultiplicity(ke, DATA::data.multiplicities);
68 // Generate list of final state particles
70 template <class DATA, class SAMP>
71 void G4CascadeFunctions<DATA,SAMP>::
72 getOutgoingParticleTypes(std::vector<G4int>& kinds,
73 G4int mult, G4double ke) const {
74 const G4int maxMult = DATA::data.maxMultiplicity();
77 G4cerr << " Illegal multiplicity " << mult << " > " << maxMult << G4endl;
84 G4int channel = this->findFinalStateIndex(mult, ke, DATA::data.index,
85 DATA::data.crossSections);
86 #ifdef G4CASCADE_DEBUG_SAMPLER
87 G4cout << " getOutgoingParticleTypes: mult=" << mult << " KE=" << ke
88 << ": channel=" << channel << G4endl;
91 // Identify final-state array to be copied
92 const G4int* chan = 0;
93 if (mult == 2) chan = DATA::data.x2bfs[channel];
94 if (mult == 3) chan = DATA::data.x3bfs[channel];
95 if (mult == 4) chan = DATA::data.x4bfs[channel];
96 if (mult == 5) chan = DATA::data.x5bfs[channel];
97 if (mult == 6) chan = DATA::data.x6bfs[channel];
98 if (mult == 7) chan = DATA::data.x7bfs[channel];
99 if (mult == 8) chan = DATA::data.x8bfs[channel];
100 if (mult == 9) chan = DATA::data.x9bfs[channel];
103 G4cerr << " getOutgoingParticleTypes: invalid multiplicity " << mult
108 kinds.insert(kinds.begin(), chan, chan+mult); // Transfer data into vector
113 // Dump lookup tables, including interpolation bins, to log file
115 template <class DATA, class SAMP>
116 void G4CascadeFunctions<DATA,SAMP>::printTable(std::ostream& os) const {
117 os << " ---------- " << DATA::data.name << " ----------" << G4endl;
119 DATA::data.print(os);
120 os << " ------------------------------" << G4endl;
123 #endif /* G4_CASCADE_FUNCTIONS_ICC */