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 // GEANT4 Class file 28 // 29 // 30 // File name: G4OrePowellAtRestModel 31 // 32 // Author: I.Semeniouk & D.Bernard 33 // 34 // Creation date: 04 Juin 2024 35 // 36 // ------------------------------------------- 37 // 38 39 #include "G4OrePowellAtRestModel.hh" 40 #include "G4DynamicParticle.hh" 41 #include "G4Material.hh" 42 #include "Randomize.hh" 43 #include "G4Gamma.hh" 44 #include "G4RandomDirection.hh" 45 #include "G4ThreeVector.hh" 46 #include "G4PhysicalConstants.hh" 47 #include "G4SystemOfUnits.hh" 48 49 //....oooOO0OOooo........oooOO0OOooo........oo 50 51 G4OrePowellAtRestModel::G4OrePowellAtRestModel 52 53 //....oooOO0OOooo........oooOO0OOooo........oo 54 55 void G4OrePowellAtRestModel::SampleSecondaries 56 std::vector<G4DynamicParticle*>& 57 G4double&, const G4Material*) con 58 { 59 static const G4double PositronMass = CLHEP:: 60 const G4double ymax = 8.1; 61 62 CLHEP::HepRandomEngine* rndmEngine = G4Rando 63 64 G4double cos12; 65 G4double cos13; 66 G4double sin12; 67 G4double sin13; 68 G4double r1; 69 G4double r2; 70 G4double r3; 71 G4double pdf; 72 73 G4double rndmv2[2]; 74 G4double rndmv1; 75 76 do { 77 rndmv1 = rndmEngine->flat(); 78 79 do { 80 rndmEngine->flatArray(2, rndmv2); 81 // energies of photon1 and photon2 norma 82 r1 = rndmv2[0]; 83 r2 = rndmv2[1]; 84 // energy conservation, with positronium 85 r3 = 2.0 - (r1+r2); 86 // cosine of angles between photons, fro 87 cos12=(r3*r3 - r1*r1 -r2*r2)/(2*r1*r2); 88 cos13=(r2*r2 - r1*r1 -r3*r3)/(2*r1*r3); 89 // request both cosines < 1. 90 } while ( std::abs(cos12) > 1 || std::abs( 91 92 sin12 = std::sqrt((1 + cos12)*(1 - cos12) 93 sin13 = -std::sqrt((1 + cos13)*(1 - cos13) 94 95 G4double cos23=cos12*cos13+sin12*sin13; 96 97 pdf = (1 - cos12)*(1 - cos12) + (1 - cos13 98 } while ( pdf < ymax * rndmv1 ); 99 // END of Sampling 100 101 // photon directions in the decay plane, pho 102 G4ThreeVector PhotonMomentum1(0., 0., 1.); 103 G4ThreeVector PhotonMomentum2(0.,sin12,cos12 104 G4ThreeVector PhotonMomentum3(0.,sin13,cos13 105 106 // First Gamma direction 107 G4ThreeVector dir1 = G4RandomDirection(); 108 109 PhotonMomentum1.rotateUz(dir1); 110 PhotonMomentum2.rotateUz(dir1); 111 PhotonMomentum3.rotateUz(dir1); 112 113 auto aGamma1 = new G4DynamicParticle(G4Gamma 114 r1 * PositronMass); 115 116 //Random polarization 117 G4double phi1 = CLHEP::twopi * G4UniformRand 118 G4ThreeVector pol1(std::cos(phi1),std::sin(p 119 pol1.rotateUz(PhotonMomentum1); 120 aGamma1->SetPolarization(pol1); 121 secParticles.push_back(aGamma1); 122 123 auto aGamma2 = new G4DynamicParticle(G4Gamma 124 r2 * PositronMass); 125 126 G4double phi2 = CLHEP::twopi * G4UniformRand 127 G4ThreeVector pol2(std::cos(phi2),std::sin(p 128 pol2.rotateUz(PhotonMomentum2); 129 aGamma2->SetPolarization(pol2); 130 secParticles.push_back(aGamma2); 131 132 auto aGamma3 = new G4DynamicParticle(G4Gamma 133 r3 * PositronMass); 134 135 G4double phi3 = CLHEP::twopi * G4UniformRand 136 G4ThreeVector pol3(std::cos(phi3),std::sin(p 137 pol3.rotateUz(PhotonMomentum3); 138 aGamma3->SetPolarization(pol3); 139 secParticles.push_back(aGamma3); 140 141 } 142 143 //....oooOO0OOooo........oooOO0OOooo........oo 144 145 void G4OrePowellAtRestModel::PrintGeneratorInf 146 { 147 G4cout << "Orel Powell AtRest positron 3-gam 148 } 149 150 //....oooOO0OOooo........oooOO0OOooo........oo 151