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