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 // Multibody "phase space" generator, which pr 28 // for sampling. Momentum vectors are generat 29 // frame of the decay, and returned in a user- 30 // algorithm is specified via constructor argu 31 // 32 // Author: Michael Kelsey (SLAC) <kelsey@slac 33 34 #include "G4HadDecayGenerator.hh" 35 #include "G4VHadDecayAlgorithm.hh" 36 #include "G4HadPhaseSpaceKopylov.hh" 37 #include "G4HadPhaseSpaceGenbod.hh" 38 #include "G4HadPhaseSpaceNBodyAsai.hh" 39 #include "G4HadronicException.hh" 40 #include "G4LorentzVector.hh" 41 #include "G4ParticleDefinition.hh" 42 #include "G4PhysicalConstants.hh" 43 #include "G4SystemOfUnits.hh" 44 #include "G4ThreeVector.hh" 45 #include "Randomize.hh" 46 #include <vector> 47 #include <algorithm> 48 #include <numeric> 49 #include <iterator> 50 #include <iostream> 51 52 53 // Constructors and destructor 54 55 G4HadDecayGenerator::G4HadDecayGenerator(Algor 56 : verboseLevel(verbose), theAlgorithm(0) { 57 switch (alg) { 58 case Kopylov: theAlgorithm = new G4HadPhaseS 59 case GENBOD: theAlgorithm = new G4HadPhaseSp 60 case NBody: theAlgorithm = new G4HadPhaseSpa 61 case NONE: theAlgorithm = 0; break; // User 62 default: ReportInvalidAlgorithm(alg); 63 } 64 65 if (verboseLevel) { 66 G4cout << " >>> G4HadDecayGenerator"; 67 if (theAlgorithm) G4cout << " using " << t 68 G4cout << G4endl; 69 } 70 } 71 72 G4HadDecayGenerator::G4HadDecayGenerator(G4VHa 73 G4int verbose) 74 : verboseLevel(verbose), theAlgorithm(alg) { 75 if (verboseLevel) { 76 G4cout << " >>> G4HadDecayGenerator"; 77 if (theAlgorithm) G4cout << " using " << t 78 G4cout << G4endl; 79 } 80 } 81 82 G4HadDecayGenerator::~G4HadDecayGenerator() { 83 delete theAlgorithm; 84 theAlgorithm = 0; 85 } 86 87 88 // Sanity checks -- throws exception if no alg 89 90 void G4HadDecayGenerator::ReportInvalidAlgorit 91 if (verboseLevel) 92 G4cerr << "G4HadDecayGenerator: bad algori 93 94 throw G4HadronicException(__FILE__, __LINE__ 95 } 96 97 void G4HadDecayGenerator::ReportMissingAlgorit 98 if (verboseLevel) 99 G4cerr << "G4HadDecayGenerator: no algorit 100 101 throw G4HadronicException(__FILE__, __LINE__ 102 } 103 104 105 // Enable (or disable if 0) diagnostic message 106 void G4HadDecayGenerator::SetVerboseLevel(G4in 107 verboseLevel = verbose; 108 if (theAlgorithm) theAlgorithm->SetVerboseLe 109 } 110 111 const G4String& G4HadDecayGenerator::GetAlgori 112 static const G4String& none = "NONE"; 113 return (theAlgorithm ? theAlgorithm->GetName 114 } 115 116 117 // Initial state (rest mass) and list of final 118 119 G4bool 120 G4HadDecayGenerator::Generate(G4double initial 121 const std::vector<G4double>& masses 122 std::vector<G4LorentzVector>& final 123 if (verboseLevel) 124 G4cout << " >>> G4HadDecayGenerator::Gener 125 126 if (!theAlgorithm) ReportMissingAlgorithm(); 127 128 if (masses.size() == 1U) 129 return GenerateOneBody(initialMass, masses 130 131 theAlgorithm->Generate(initialMass, masses, 132 return !finalState.empty(); // Generator f 133 } 134 135 // Initial state particle and list of final ma 136 137 G4bool 138 G4HadDecayGenerator::Generate(const G4Particle 139 const std::vector<G4double>& masses 140 std::vector<G4LorentzVector>& final 141 if (verboseLevel) 142 G4cout << " >>> G4HadDecayGenerator::Gener 143 144 return (initialPD && Generate(initialPD->Get 145 } 146 147 // Final state particles will be boosted to in 148 149 G4bool 150 G4HadDecayGenerator::Generate(const G4LorentzV 151 const std::vector<G4double>& masses 152 std::vector<G4LorentzVector>& fina 153 if (verboseLevel) 154 G4cout << " >>> G4HadDecayGenerator::Gener 155 156 G4bool good = Generate(initialState.m(), mas 157 if (good) { 158 G4ThreeVector bv = initialState.boostVecto 159 for (size_t i=0; i<finalState.size(); i++) 160 finalState[i].boost(bv); 161 } 162 } 163 164 return good; 165 } 166 167 168 // Handle special case of "one body decay" (us 169 170 G4bool G4HadDecayGenerator:: 171 GenerateOneBody(G4double initialMass, 172 const std::vector<G4double>& masses, 173 std::vector<G4LorentzVector>& finalState) 174 if (verboseLevel>1) 175 G4cout << " >>> G4HadDecayGenerator::Gener 176 177 // Initialization and sanity checks 178 finalState.clear(); 179 180 if (masses.size() != 1U) return false; // S 181 if (std::fabs(initialMass-masses[0]) > eV) r 182 183 if (verboseLevel>2) G4cout << " finalState m 184 185 finalState.push_back(G4LorentzVector(0.,0.,0 186 return true; 187 } 188