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 // G4MuonDecayChannel class implementation << 27 // 26 // 28 // Author: H.Kurashige, 30 May 1997 << 27 // $Id$ 29 // Contributions: << 28 // 30 // - 2005 - M.Melissas, J.Brunner CPPM/IN2P3 << 29 // 31 // Added V-A fluxes for neutrinos using a ne << 30 // ------------------------------------------------------------ 32 // ------------------------------------------- << 31 // GEANT 4 class header file 33 << 32 // 34 #include "G4MuonDecayChannel.hh" << 33 // History: first implementation, based on object model of >> 34 // 30 May 1997 H.Kurashige >> 35 // >> 36 // Fix bug in calcuration of electron energy in DecayIt 28 Feb. 01 H.Kurashige >> 37 //2005 >> 38 // M. Melissas ( melissas AT cppm.in2p3.fr) >> 39 // J. Brunner ( brunner AT cppm.in2p3.fr) >> 40 // Adding V-A fluxes for neutrinos using a new algortithm : >> 41 // ------------------------------------------------------------ 35 42 36 #include "G4DecayProducts.hh" << 37 #include "G4LorentzRotation.hh" << 38 #include "G4LorentzVector.hh" << 39 #include "G4ParticleDefinition.hh" 43 #include "G4ParticleDefinition.hh" 40 #include "G4PhysicalConstants.hh" 44 #include "G4PhysicalConstants.hh" 41 #include "G4RotationMatrix.hh" << 42 #include "G4SystemOfUnits.hh" 45 #include "G4SystemOfUnits.hh" >> 46 #include "G4DecayProducts.hh" 43 #include "G4VDecayChannel.hh" 47 #include "G4VDecayChannel.hh" >> 48 #include "G4MuonDecayChannel.hh" 44 #include "Randomize.hh" 49 #include "Randomize.hh" >> 50 #include "G4LorentzVector.hh" >> 51 #include "G4LorentzRotation.hh" >> 52 #include "G4RotationMatrix.hh" >> 53 >> 54 G4MuonDecayChannel::G4MuonDecayChannel() >> 55 :G4VDecayChannel() >> 56 { >> 57 } 45 58 46 G4MuonDecayChannel::G4MuonDecayChannel(const G << 59 G4MuonDecayChannel::G4MuonDecayChannel(const G4String& theParentName, 47 : G4VDecayChannel("Muon Decay", 1) << 60 G4double theBR) >> 61 :G4VDecayChannel("Muon Decay",1) 48 { 62 { 49 // set names for daughter particles 63 // set names for daughter particles 50 if (theParentName == "mu+") { 64 if (theParentName == "mu+") { 51 SetBR(theBR); 65 SetBR(theBR); 52 SetParent("mu+"); 66 SetParent("mu+"); 53 SetNumberOfDaughters(3); 67 SetNumberOfDaughters(3); 54 SetDaughter(0, "e+"); 68 SetDaughter(0, "e+"); 55 SetDaughter(1, "nu_e"); 69 SetDaughter(1, "nu_e"); 56 SetDaughter(2, "anti_nu_mu"); 70 SetDaughter(2, "anti_nu_mu"); 57 } << 71 } else if (theParentName == "mu-") { 58 else if (theParentName == "mu-") { << 59 SetBR(theBR); 72 SetBR(theBR); 60 SetParent("mu-"); 73 SetParent("mu-"); 61 SetNumberOfDaughters(3); 74 SetNumberOfDaughters(3); 62 SetDaughter(0, "e-"); 75 SetDaughter(0, "e-"); 63 SetDaughter(1, "anti_nu_e"); 76 SetDaughter(1, "anti_nu_e"); 64 SetDaughter(2, "nu_mu"); 77 SetDaughter(2, "nu_mu"); 65 } << 78 } else { 66 else { << 67 #ifdef G4VERBOSE 79 #ifdef G4VERBOSE 68 if (GetVerboseLevel() > 0) { << 80 if (GetVerboseLevel()>0) { 69 G4cout << "G4MuonDecayChannel:: construc 81 G4cout << "G4MuonDecayChannel:: constructor :"; 70 G4cout << " parent particle is not muon 82 G4cout << " parent particle is not muon but "; 71 G4cout << theParentName << G4endl; 83 G4cout << theParentName << G4endl; 72 } 84 } 73 #endif 85 #endif 74 } 86 } 75 } 87 } 76 88 77 G4MuonDecayChannel& G4MuonDecayChannel::operat << 89 G4MuonDecayChannel::G4MuonDecayChannel(const G4MuonDecayChannel &right): >> 90 G4VDecayChannel(right) >> 91 { >> 92 } >> 93 >> 94 G4MuonDecayChannel::~G4MuonDecayChannel() >> 95 { >> 96 } >> 97 >> 98 G4MuonDecayChannel & G4MuonDecayChannel::operator=(const G4MuonDecayChannel & right) 78 { 99 { 79 if (this != &right) { << 100 if (this != &right) { 80 kinematics_name = right.kinematics_name; 101 kinematics_name = right.kinematics_name; 81 verboseLevel = right.verboseLevel; 102 verboseLevel = right.verboseLevel; 82 rbranch = right.rbranch; 103 rbranch = right.rbranch; 83 104 84 // copy parent name 105 // copy parent name 85 parent_name = new G4String(*right.parent_n 106 parent_name = new G4String(*right.parent_name); 86 107 87 // clear daughters_name array 108 // clear daughters_name array 88 ClearDaughtersName(); 109 ClearDaughtersName(); 89 110 90 // recreate array 111 // recreate array 91 numberOfDaughters = right.numberOfDaughter 112 numberOfDaughters = right.numberOfDaughters; 92 if (numberOfDaughters > 0) { << 113 if ( numberOfDaughters >0 ) { 93 if (daughters_name != nullptr) ClearDaug << 114 if (daughters_name !=0) ClearDaughtersName(); 94 daughters_name = new G4String*[numberOfD 115 daughters_name = new G4String*[numberOfDaughters]; 95 // copy daughters name << 116 //copy daughters name 96 for (G4int index = 0; index < numberOfDa << 117 for (G4int index=0; index < numberOfDaughters; index++) { 97 daughters_name[index] = new G4String(* << 118 daughters_name[index] = new G4String(*right.daughters_name[index]); 98 } 119 } 99 } 120 } 100 } 121 } 101 return *this; 122 return *this; 102 } 123 } 103 124 104 G4DecayProducts* G4MuonDecayChannel::DecayIt(G << 125 G4DecayProducts *G4MuonDecayChannel::DecayIt(G4double) 105 { 126 { 106 // this version neglects muon polarization,a << 127 // this version neglects muon polarization,and electron mass 107 // assumes the pure V-A couplin 128 // assumes the pure V-A coupling 108 // the Neutrinos are correctly << 129 // the Neutrinos are correctly V-A. 109 << 110 #ifdef G4VERBOSE 130 #ifdef G4VERBOSE 111 if (GetVerboseLevel() > 1) G4cout << "G4Muon << 131 if (GetVerboseLevel()>1) G4cout << "G4MuonDecayChannel::DecayIt "; 112 #endif 132 #endif 113 133 114 CheckAndFillParent(); << 134 if (parent == 0) FillParent(); 115 CheckAndFillDaughters(); << 135 if (daughters == 0) FillDaughters(); 116 << 136 117 // parent mass 137 // parent mass 118 G4double parentmass = G4MT_parent->GetPDGMas << 138 G4double parentmass = parent->GetPDGMass(); 119 const G4int N_DAUGHTER = 3; << 120 139 121 // daughters'mass << 140 //daughters'mass 122 G4double daughtermass[N_DAUGHTER]; << 141 G4double daughtermass[3]; 123 // G4double sumofdaughtermass = 0.0; << 142 G4double sumofdaughtermass = 0.0; 124 for (G4int index = 0; index < N_DAUGHTER; ++ << 143 for (G4int index=0; index<3; index++){ 125 daughtermass[index] = G4MT_daughters[index << 144 daughtermass[index] = daughters[index]->GetPDGMass(); 126 // sumofdaughtermass += daughtermass[index << 145 sumofdaughtermass += daughtermass[index]; 127 } 146 } 128 147 129 // create parent G4DynamicParticle at rest << 148 //create parent G4DynamicParticle at rest 130 G4ThreeVector dummy; 149 G4ThreeVector dummy; 131 auto parentparticle = new G4DynamicParticle( << 150 G4DynamicParticle * parentparticle = new G4DynamicParticle( parent, dummy, 0.0); 132 // create G4Decayproducts << 151 //create G4Decayproducts 133 auto products = new G4DecayProducts(*parentp << 152 G4DecayProducts *products = new G4DecayProducts(*parentparticle); 134 delete parentparticle; 153 delete parentparticle; 135 154 136 // calculate daughter momentum 155 // calculate daughter momentum 137 G4double daughtermomentum[N_DAUGHTER]; << 156 G4double daughtermomentum[3]; 138 // calculate electron energy << 157 // calcurate electron energy 139 G4double xmax = (1.0 + daughtermass[0] * dau << 158 G4double xmax = (1.0+daughtermass[0]*daughtermass[0]/parentmass/parentmass); 140 G4double x; 159 G4double x; 141 << 160 142 G4double Ee, Ene; << 161 G4double Ee,Ene; 143 << 162 144 G4double gam; 163 G4double gam; 145 G4double EMax = parentmass / 2 - daughtermas << 164 G4double EMax=parentmass/2-daughtermass[0]; 146 << 165 147 const std::size_t MAX_LOOP = 1000; << 166 148 // Generating Random Energy << 167 //Generating Random Energy 149 for (std::size_t loop1 = 0; loop1 < MAX_LOOP << 168 do { 150 Ee = G4UniformRand(); << 169 Ee=G4UniformRand(); 151 for (std::size_t loop2 = 0; loop2 < MAX_LO << 170 do{ 152 x = xmax * G4UniformRand(); << 171 x=xmax*G4UniformRand(); 153 gam = G4UniformRand(); << 172 gam=G4UniformRand(); 154 if (gam <= x * (1. - x)) break; << 173 }while (gam >x*(1.-x)); 155 x = xmax; << 174 Ene=x; 156 } << 175 } while ( Ene < (1.-Ee)); 157 Ene = x; << 176 G4double Enm=(2.-Ee-Ene); 158 if (Ene >= (1. - Ee)) break; << 177 159 Ene = 1. - Ee; << 178 160 } << 179 //initialisation of rotation parameters 161 G4double Enm = (2. - Ee - Ene); << 180 162 << 181 G4double costheta,sintheta,rphi,rtheta,rpsi; 163 // initialisation of rotation parameters << 182 costheta= 1.-2./Ee-2./Ene+2./Ene/Ee; 164 << 183 sintheta=std::sqrt(1.-costheta*costheta); 165 G4double costheta, sintheta, rphi, rtheta, r << 184 166 costheta = 1. - 2. / Ee - 2. / Ene + 2. / En << 185 167 sintheta = std::sqrt(1. - costheta * costhet << 186 rphi=twopi*G4UniformRand()*rad; 168 << 187 rtheta=(std::acos(2.*G4UniformRand()-1.)); 169 rphi = twopi * G4UniformRand() * rad; << 188 rpsi=twopi*G4UniformRand()*rad; 170 rtheta = (std::acos(2. * G4UniformRand() - 1 << 171 rpsi = twopi * G4UniformRand() * rad; << 172 189 173 G4RotationMatrix rot; 190 G4RotationMatrix rot; 174 rot.set(rphi, rtheta, rpsi); << 191 rot.set(rphi,rtheta,rpsi); 175 192 176 // electron 0 << 193 //electron 0 177 daughtermomentum[0] = std::sqrt(Ee * Ee * EM << 194 daughtermomentum[0]=std::sqrt(Ee*Ee*EMax*EMax+2.0*Ee*EMax * daughtermass[0]); 178 G4ThreeVector direction0(0.0, 0.0, 1.0); << 195 G4ThreeVector direction0(0.0,0.0,1.0); 179 196 180 direction0 *= rot; 197 direction0 *= rot; 181 198 182 auto daughterparticle = << 199 G4DynamicParticle * daughterparticle = new G4DynamicParticle ( daughters[0], direction0 * daughtermomentum[0]); 183 new G4DynamicParticle(G4MT_daughters[0], d << 184 200 185 products->PushProducts(daughterparticle); 201 products->PushProducts(daughterparticle); >> 202 >> 203 //electronic neutrino 1 186 204 187 // electronic neutrino 1 << 205 daughtermomentum[1]=std::sqrt(Ene*Ene*EMax*EMax+2.0*Ene*EMax * daughtermass[1]); 188 << 206 G4ThreeVector direction1(sintheta,0.0,costheta); 189 daughtermomentum[1] = std::sqrt(Ene * Ene * << 190 G4ThreeVector direction1(sintheta, 0.0, cost << 191 207 192 direction1 *= rot; 208 direction1 *= rot; 193 209 194 auto daughterparticle1 = << 210 G4DynamicParticle * daughterparticle1 = new G4DynamicParticle ( daughters[1], direction1 * daughtermomentum[1]); 195 new G4DynamicParticle(G4MT_daughters[1], d << 196 products->PushProducts(daughterparticle1); 211 products->PushProducts(daughterparticle1); 197 212 198 // muonnic neutrino 2 << 213 //muonnic neutrino 2 199 << 214 200 daughtermomentum[2] = std::sqrt(Enm * Enm * << 215 daughtermomentum[2]=std::sqrt(Enm*Enm*EMax*EMax +2.0*Enm*EMax*daughtermass[2]); 201 G4ThreeVector direction2(-Ene / Enm * sinthe << 216 G4ThreeVector direction2(-Ene/Enm*sintheta,0,-Ee/Enm-Ene/Enm*costheta); 202 217 203 direction2 *= rot; 218 direction2 *= rot; 204 219 205 auto daughterparticle2 = << 220 G4DynamicParticle * daughterparticle2 = new G4DynamicParticle ( daughters[2], 206 new G4DynamicParticle(G4MT_daughters[2], d << 221 direction2 * daughtermomentum[2]); 207 products->PushProducts(daughterparticle2); 222 products->PushProducts(daughterparticle2); 208 223 209 // output message << 224 >> 225 >> 226 >> 227 // output message 210 #ifdef G4VERBOSE 228 #ifdef G4VERBOSE 211 if (GetVerboseLevel() > 1) { << 229 if (GetVerboseLevel()>1) { 212 G4cout << "G4MuonDecayChannel::DecayIt()"; << 230 G4cout << "G4MuonDecayChannel::DecayIt "; 213 G4cout << " create decay products in rest << 231 G4cout << " create decay products in rest frame " <<G4endl; 214 products->DumpInfo(); 232 products->DumpInfo(); 215 } 233 } 216 #endif 234 #endif 217 return products; 235 return products; 218 } 236 } >> 237 >> 238 >> 239 >> 240 >> 241 >> 242 219 243