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 // G4MuonRadiativeDecayChannelWithSpin class i << 26 // ------------------------------------------------------------ >> 27 // GEANT 4 class header file >> 28 // >> 29 // History: >> 30 // 01 August 2007 P.Gumplinger >> 31 // Reference: TRIUMF TWIST Technotes TN-55: >> 32 // Pierre Depommier - "Radiative MuonDecay" >> 33 // >> 34 // ------------------------------------------------------------ >> 35 // >> 36 // 27 // 37 // 28 // References: << 29 // - TRIUMF/TWIST Technote TN-55: << 30 // "Radiative muon decay" by P. Depommier an << 31 // - Yoshitaka Kuno and Yasuhiro Okada << 32 // "Muon Decays and Physics Beyond the Stand << 33 // Rev. Mod. Phys. 73, 151 (2001) << 34 // << 35 // Author: P.Gumplinger - Triumf, 25 July 2007 << 36 // Revision: D.Mingming - Center for HEP, Tsin << 37 // ------------------------------------------- << 38 38 39 #include "G4MuonRadiativeDecayChannelWithSpin. 39 #include "G4MuonRadiativeDecayChannelWithSpin.hh" 40 40 >> 41 #include "Randomize.hh" 41 #include "G4DecayProducts.hh" 42 #include "G4DecayProducts.hh" 42 #include "G4LorentzVector.hh" 43 #include "G4LorentzVector.hh" 43 #include "G4PhysicalConstants.hh" << 44 #include "G4SystemOfUnits.hh" << 45 #include "Randomize.hh" << 46 44 47 G4MuonRadiativeDecayChannelWithSpin::G4MuonRad << 45 G4MuonRadiativeDecayChannelWithSpin:: 48 const G4String& theParentName, G4double theB << 46 G4MuonRadiativeDecayChannelWithSpin(const G4String& theParentName, 49 : G4VDecayChannel("Radiative Muon Decay", 1) << 47 G4double theBR) >> 48 : G4VDecayChannel("Radiative Muon Decay",1) 50 { 49 { 51 // set names for daughter particles 50 // set names for daughter particles 52 if (theParentName == "mu+") { 51 if (theParentName == "mu+") { 53 SetBR(theBR); 52 SetBR(theBR); 54 SetParent("mu+"); 53 SetParent("mu+"); 55 SetNumberOfDaughters(4); 54 SetNumberOfDaughters(4); 56 SetDaughter(0, "e+"); 55 SetDaughter(0, "e+"); 57 SetDaughter(1, "gamma"); 56 SetDaughter(1, "gamma"); 58 SetDaughter(2, "nu_e"); 57 SetDaughter(2, "nu_e"); 59 SetDaughter(3, "anti_nu_mu"); 58 SetDaughter(3, "anti_nu_mu"); 60 } << 59 } else if (theParentName == "mu-") { 61 else if (theParentName == "mu-") { << 62 SetBR(theBR); 60 SetBR(theBR); 63 SetParent("mu-"); 61 SetParent("mu-"); 64 SetNumberOfDaughters(4); 62 SetNumberOfDaughters(4); 65 SetDaughter(0, "e-"); 63 SetDaughter(0, "e-"); 66 SetDaughter(1, "gamma"); 64 SetDaughter(1, "gamma"); 67 SetDaughter(2, "anti_nu_e"); 65 SetDaughter(2, "anti_nu_e"); 68 SetDaughter(3, "nu_mu"); 66 SetDaughter(3, "nu_mu"); 69 } << 67 } else { 70 else { << 71 #ifdef G4VERBOSE 68 #ifdef G4VERBOSE 72 if (GetVerboseLevel() > 0) { << 69 if (GetVerboseLevel()>0) { 73 G4cout << "G4RadiativeMuonDecayChannel:: << 70 G4cout << "G4RadiativeMuonDecayChannel:: constructor :"; 74 G4cout << " parent particle is not muon 71 G4cout << " parent particle is not muon but "; 75 G4cout << theParentName << G4endl; 72 G4cout << theParentName << G4endl; 76 } 73 } 77 #endif 74 #endif 78 } 75 } >> 76 EMMU = 0.*MeV; >> 77 EMASS = 0.*MeV; 79 } 78 } 80 79 81 G4MuonRadiativeDecayChannelWithSpin& << 80 G4MuonRadiativeDecayChannelWithSpin::~G4MuonRadiativeDecayChannelWithSpin() 82 G4MuonRadiativeDecayChannelWithSpin::operator= << 83 { 81 { 84 if (this != &right) { << 85 kinematics_name = right.kinematics_name; << 86 verboseLevel = right.verboseLevel; << 87 rbranch = right.rbranch; << 88 << 89 // copy parent name << 90 parent_name = new G4String(*right.parent_n << 91 << 92 // clear daughters_name array << 93 ClearDaughtersName(); << 94 << 95 // recreate array << 96 numberOfDaughters = right.numberOfDaughter << 97 if (numberOfDaughters > 0) { << 98 if (daughters_name != nullptr) ClearDaug << 99 daughters_name = new G4String*[numberOfD << 100 // copy daughters name << 101 for (G4int index = 0; index < numberOfDa << 102 daughters_name[index] = new G4String(* << 103 } << 104 } << 105 parent_polarization = right.parent_polariz << 106 } << 107 return *this; << 108 } 82 } 109 83 110 G4DecayProducts* G4MuonRadiativeDecayChannelWi << 84 G4DecayProducts *G4MuonRadiativeDecayChannelWithSpin::DecayIt(G4double) 111 { 85 { >> 86 112 #ifdef G4VERBOSE 87 #ifdef G4VERBOSE 113 if (GetVerboseLevel() > 1) G4cout << "G4Muon << 88 if (GetVerboseLevel()>1) >> 89 G4cout << "G4MuonRadiativeDecayChannelWithSpin::DecayIt "; 114 #endif 90 #endif 115 91 116 CheckAndFillParent(); << 92 if (parent == 0) FillParent(); 117 CheckAndFillDaughters(); << 93 if (daughters == 0) FillDaughters(); 118 94 119 // parent mass 95 // parent mass 120 G4double parentmass = G4MT_parent->GetPDGMas << 96 G4double parentmass = parent->GetPDGMass(); 121 97 122 G4double EMMU = parentmass; << 98 EMMU = parentmass; 123 99 124 // daughters'mass << 100 //daughters'mass 125 G4double daughtermass[4]; << 101 G4double daughtermass[4]; 126 // G4double sumofdaughtermass = 0.0; << 102 G4double sumofdaughtermass = 0.0; 127 for (G4int index = 0; index < 4; ++index) { << 103 for (G4int index=0; index<4; index++){ 128 daughtermass[index] = G4MT_daughters[index << 104 daughtermass[index] = daughters[index]->GetPDGMass(); 129 // sumofdaughtermass += daughtermass[index << 105 sumofdaughtermass += daughtermass[index]; 130 } 106 } 131 107 132 G4double EMASS = daughtermass[0]; << 108 EMASS = daughtermass[0]; 133 109 134 // create parent G4DynamicParticle at rest << 110 //create parent G4DynamicParticle at rest 135 G4ThreeVector dummy; 111 G4ThreeVector dummy; 136 auto parentparticle = new G4DynamicParticle( << 112 G4DynamicParticle * parentparticle = 137 << 113 new G4DynamicParticle( parent, dummy, 0.0); 138 // create G4Decayproducts << 114 //create G4Decayproducts 139 auto products = new G4DecayProducts(*parentp << 115 G4DecayProducts *products = new G4DecayProducts(*parentparticle); 140 delete parentparticle; 116 delete parentparticle; 141 117 142 G4double eps = EMASS / EMMU; << 118 G4int i = 0; 143 119 144 G4double som0, x, y, xx, yy, zz; << 120 G4double eps = EMASS/EMMU; >> 121 >> 122 G4double som0, Qsqr, x, y, xx, yy, zz; 145 G4double cthetaE, cthetaG, cthetaGE, phiE, p 123 G4double cthetaE, cthetaG, cthetaGE, phiE, phiG; 146 const std::size_t MAX_LOOP = 10000; << 147 124 148 for (std::size_t loop_counter1 = 0; loop_cou << 125 do { 149 for (std::size_t loop_counter2 = 0; loop_c << 150 // ------------------------------------- << 151 // Build two vectors of random length an << 152 // positron and the photon. << 153 // x/y is the length of the vector, xx, << 154 // phi is the azimutal angle, theta the << 155 // ------------------------------------- << 156 << 157 // For the positron << 158 // << 159 x = G4UniformRand(); << 160 << 161 rn3dim(xx, yy, zz, x); << 162 << 163 if (std::fabs((xx * xx) + (yy * yy) + (z << 164 G4cout << "Norm of x not correct" << G << 165 } << 166 << 167 phiE = atan4(xx, yy); << 168 cthetaE = zz / x; << 169 G4double sthetaE = std::sqrt((xx * xx) + << 170 << 171 // What you get: << 172 // << 173 // x = positron energy << 174 // phiE = azimutal angle of positron << 175 // cthetaE = cosine of polar angle of po << 176 // sthetaE = sine of polar angle of posi << 177 // << 178 //// G4cout << " x, xx, yy, zz " << x < << 179 //// << yy < << 180 //// G4cout << " phiE, cthetaE, sthetaE << 181 //// << 182 //// << 183 << 184 // For the photon << 185 // << 186 y = G4UniformRand(); << 187 << 188 rn3dim(xx, yy, zz, y); << 189 << 190 if (std::fabs((xx * xx) + (yy * yy) + (z << 191 G4cout << " Norm of y not correct " << << 192 } << 193 << 194 phiG = atan4(xx, yy); << 195 cthetaG = zz / y; << 196 G4double sthetaG = std::sqrt((xx * xx) + << 197 << 198 // What you get: << 199 // << 200 // y = photon energy << 201 // phiG = azimutal angle of photon mo << 202 // cthetaG = cosine of polar angle of ph << 203 // sthetaG = sine of polar angle of phot << 204 // << 205 //// G4cout << " y, xx, yy, zz " << y < << 206 //// << yy < << 207 //// G4cout << " phiG, cthetaG, sthetaG << 208 //// << 209 //// << 210 << 211 // Calculate the angle between posi << 212 // << 213 cthetaGE = cthetaE * cthetaG + sthetaE * << 214 << 215 //// G4cout << x << " " << cthetaE << " << 216 //// << y << " " << cthetaG << " << 217 //// << cthetaGE << 218 << 219 G4double term0 = eps * eps; << 220 G4double term1 = x * ((1.0 - eps) * (1.0 << 221 G4double beta = << 222 std::sqrt(x * ((1.0 - eps) * (1.0 - ep << 223 / term1; << 224 G4double delta = 1.0 - beta * cthetaGE; << 225 << 226 G4double term3 = y * (1.0 - (eps * eps)) << 227 G4double term6 = term1 * delta * term3; << 228 << 229 G4double Qsqr = (1.0 - term1 - term3 + t << 230 << 231 // Check the kinematics. << 232 // << 233 if (Qsqr >= 0.0 && Qsqr <= 1.0) break; << 234 << 235 } // end loop count << 236 << 237 // Do the calculation for -1 muon polariza << 238 // << 239 G4double Pmu = -1.0; << 240 if (GetParentName() == "mu-") { << 241 Pmu = +1.0; << 242 } << 243 126 244 som0 = fron(Pmu, x, y, cthetaE, cthetaG, c << 127 // leap1: 245 128 246 // Sample the decay rate << 129 i++; 247 // << 248 if (G4UniformRand() * 177.0 <= som0) break << 249 } << 250 130 251 G4double E = EMMU / 2. * (x * ((1. - eps) * << 131 // leap2: 252 G4double G = EMMU / 2. * y * (1. - eps * eps << 253 132 254 if (E < EMASS) E = EMASS; << 133 do { >> 134 // >> 135 //-------------------------------------------------------------------------- >> 136 // Build two vectors of random length and random direction, for the >> 137 // positron and the photon. >> 138 // x/y is the length of the vector, xx, yy and zz the components, >> 139 // phi is the azimutal angle, theta the polar angle. >> 140 //-------------------------------------------------------------------------- >> 141 // >> 142 // For the positron >> 143 // >> 144 x = G4UniformRand(); >> 145 >> 146 rn3dim(xx,yy,zz,x); >> 147 >> 148 if(std::fabs((xx*xx)+(yy*yy)+(zz*zz)-(x*x))>0.001){ >> 149 G4cout << "Norm of x not correct" << G4endl; >> 150 } >> 151 >> 152 phiE = atan4(xx,yy); >> 153 cthetaE = zz/x; >> 154 G4double sthetaE = std::sqrt((xx*xx)+(yy*yy))/x; >> 155 // >> 156 // What you get: >> 157 // >> 158 // x = positron energy >> 159 // phiE = azimutal angle of positron momentum >> 160 // cthetaE = cosine of polar angle of positron momentum >> 161 // sthetaE = sine of polar angle of positron momentum >> 162 // >> 163 //// G4cout << " x, xx, yy, zz " << x << " " << xx << " " >> 164 //// << yy << " " << zz << G4endl; >> 165 //// G4cout << " phiE, cthetaE, sthetaE " << phiE << " " >> 166 //// << cthetaE << " " >> 167 //// << sthetaE << " " << G4endl; >> 168 // >> 169 //----------------------------------------------------------------------- >> 170 // >> 171 // For the photon >> 172 // >> 173 y = G4UniformRand(); >> 174 >> 175 rn3dim(xx,yy,zz,y); >> 176 >> 177 if(std::fabs((xx*xx)+(yy*yy)+(zz*zz)-(y*y))>0.001){ >> 178 G4cout << " Norm of y not correct " << G4endl; >> 179 } >> 180 >> 181 phiG = atan4(xx,yy); >> 182 cthetaG = zz/y; >> 183 G4double sthetaG = std::sqrt((xx*xx)+(yy*yy))/y; >> 184 // >> 185 // What you get: >> 186 // >> 187 // y = photon energy >> 188 // phiG = azimutal angle of photon momentum >> 189 // cthetaG = cosine of polar angle of photon momentum >> 190 // sthetaG = sine of polar angle of photon momentum >> 191 // >> 192 //// G4cout << " y, xx, yy, zz " << y << " " << xx << " " >> 193 //// << yy << " " << zz << G4endl; >> 194 //// G4cout << " phiG, cthetaG, sthetaG " << phiG << " " >> 195 //// << cthetaG << " " >> 196 //// << sthetaG << " " << G4endl; >> 197 // >> 198 //----------------------------------------------------------------------- >> 199 // >> 200 // Maybe certain restrictions on the kinematical variables: >> 201 // >> 202 //// if (cthetaE > 0.01)goto leap2; >> 203 //// if (cthetaG > 0.01)goto leap2; >> 204 //// if (std::fabs(x-0.5) > 0.5 )goto leap2; >> 205 //// if (std::fabs(y-0.5) > 0.5 )goto leap2; >> 206 // >> 207 //----------------------------------------------------------------------- >> 208 // >> 209 // Calculate the angle between positron and photon (cosine) >> 210 // >> 211 cthetaGE = cthetaE*cthetaG+sthetaE*sthetaG*std::cos(phiE-phiG); >> 212 // >> 213 //// G4cout << x << " " << cthetaE << " " << sthetaE << " " >> 214 //// << y << " " << cthetaG << " " << sthetaG << " " >> 215 //// << cthetaGE >> 216 // >> 217 //----------------------------------------------------------------------- >> 218 // >> 219 G4double term0 = eps*eps; >> 220 G4double term1 = x*((1.0-eps)*(1.0-eps))+2.0*eps; >> 221 G4double beta = std::sqrt( x*((1.0-eps)*(1.0-eps))* >> 222 (x*((1.0-eps)*(1.0-eps))+4.0*eps))/term1; >> 223 G4double delta = 1.0-beta*cthetaGE; >> 224 >> 225 G4double term3 = y*(1.0-(eps*eps)); >> 226 G4double term6 = term1*delta*term3; >> 227 >> 228 Qsqr = (1.0-term1-term3+term0+0.5*term6)/((1.0-eps)*(1.0-eps)); >> 229 // >> 230 //----------------------------------------------------------------------- >> 231 // >> 232 // Check the kinematics. >> 233 // >> 234 } while ( Qsqr<0.0 || Qsqr>1.0 ); >> 235 // >> 236 //// G4cout << x << " " << y << " " << beta << " " << Qsqr << G4endl; >> 237 // >> 238 // Do the calculation for -1 muon polarization (i.e. mu+) >> 239 // >> 240 G4double Pmu = -1.0; >> 241 if (GetParentName() == "mu-")Pmu = +1.0; >> 242 // >> 243 // and for Fronsdal >> 244 // >> 245 //----------------------------------------------------------------------- >> 246 // >> 247 som0 = fron(Pmu,x,y,cthetaE,cthetaG,cthetaGE); >> 248 // >> 249 //// if(som0<0.0){ >> 250 //// G4cout << " som0 < 0 in Fronsdal " << som0 >> 251 //// << " at event " << i << G4endl; >> 252 //// G4cout << Pmu << " " << x << " " << y << " " >> 253 //// << cthetaE << " " << cthetaG << " " >> 254 //// << cthetaGE << " " << som0 << G4endl; >> 255 //// } >> 256 // >> 257 //----------------------------------------------------------------------- >> 258 // >> 259 //// G4cout << x << " " << y << " " << som0 << G4endl; >> 260 // >> 261 //---------------------------------------------------------------------- >> 262 // >> 263 // Sample the decay rate >> 264 // >> 265 >> 266 } while (G4UniformRand()*250000.0 > som0); >> 267 >> 268 /// if(i<10000000)goto leap1: >> 269 // >> 270 //----------------------------------------------------------------------- >> 271 // >> 272 G4double E = EMMU/2.*(x*((1.-eps)*(1.-eps))+2.*eps); >> 273 G4double G = EMMU/2.*y*(1.-eps*eps); >> 274 // >> 275 //----------------------------------------------------------------------- >> 276 // >> 277 >> 278 if(E < EMASS) E = EMASS; 255 279 256 // calculate daughter momentum 280 // calculate daughter momentum 257 G4double daughtermomentum[4]; 281 G4double daughtermomentum[4]; 258 282 259 daughtermomentum[0] = std::sqrt(E * E - EMAS << 283 daughtermomentum[0] = std::sqrt(E*E - EMASS*EMASS); 260 284 261 G4double sthetaE = std::sqrt(1. - cthetaE * << 285 G4double sthetaE = std::sqrt(1.-cthetaE*cthetaE); 262 G4double cphiE = std::cos(phiE); 286 G4double cphiE = std::cos(phiE); 263 G4double sphiE = std::sin(phiE); 287 G4double sphiE = std::sin(phiE); 264 288 265 // Coordinates of the decay positron with re << 289 //Coordinates of the decay positron with respect to the muon spin 266 290 267 G4double px = sthetaE * cphiE; << 291 G4double px = sthetaE*cphiE; 268 G4double py = sthetaE * sphiE; << 292 G4double py = sthetaE*sphiE; 269 G4double pz = cthetaE; 293 G4double pz = cthetaE; 270 294 271 G4ThreeVector direction0(px, py, pz); << 295 G4ThreeVector direction0(px,py,pz); 272 296 273 direction0.rotateUz(parent_polarization); 297 direction0.rotateUz(parent_polarization); 274 298 275 auto daughterparticle0 = << 299 G4DynamicParticle * daughterparticle0 276 new G4DynamicParticle(G4MT_daughters[0], d << 300 = new G4DynamicParticle( daughters[0], daughtermomentum[0]*direction0); 277 301 278 products->PushProducts(daughterparticle0); 302 products->PushProducts(daughterparticle0); 279 303 280 daughtermomentum[1] = G; 304 daughtermomentum[1] = G; 281 305 282 G4double sthetaG = std::sqrt(1. - cthetaG * << 306 G4double sthetaG = std::sqrt(1.-cthetaG*cthetaG); 283 G4double cphiG = std::cos(phiG); 307 G4double cphiG = std::cos(phiG); 284 G4double sphiG = std::sin(phiG); 308 G4double sphiG = std::sin(phiG); 285 309 286 // Coordinates of the decay gamma with respe << 310 //Coordinates of the decay gamma with respect to the muon spin 287 311 288 px = sthetaG * cphiG; << 312 px = sthetaG*cphiG; 289 py = sthetaG * sphiG; << 313 py = sthetaG*sphiG; 290 pz = cthetaG; 314 pz = cthetaG; 291 315 292 G4ThreeVector direction1(px, py, pz); << 316 G4ThreeVector direction1(px,py,pz); 293 317 294 direction1.rotateUz(parent_polarization); 318 direction1.rotateUz(parent_polarization); 295 319 296 auto daughterparticle1 = << 320 G4DynamicParticle * daughterparticle1 297 new G4DynamicParticle(G4MT_daughters[1], d << 321 = new G4DynamicParticle( daughters[1], daughtermomentum[1]*direction1); 298 322 299 products->PushProducts(daughterparticle1); 323 products->PushProducts(daughterparticle1); 300 324 301 // daughter 3 ,4 (neutrinos) 325 // daughter 3 ,4 (neutrinos) 302 // create neutrinos in the C.M frame of two 326 // create neutrinos in the C.M frame of two neutrinos 303 327 304 G4double energy2 = parentmass - E - G; << 328 G4double energy2 = parentmass*(1.0 - (x+y)/2.0); 305 329 306 G4ThreeVector P34 = -1. * (daughtermomentum[ << 330 G4double vmass = std::sqrt((energy2- 307 G4double vmass2 = energy2 * energy2 - P34.ma << 331 (daughtermomentum[0]+daughtermomentum[1]))* 308 G4double vmass = std::sqrt(vmass2); << 332 (energy2+ 309 << 333 (daughtermomentum[0]+daughtermomentum[1]))); 310 G4double costhetan = 2. * G4UniformRand() - << 334 G4double beta = (daughtermomentum[0]+daughtermomentum[1])/energy2; 311 G4double sinthetan = std::sqrt((1.0 - costhe << 335 beta = -1.0 * std::min(beta,0.99); 312 G4double phin = twopi * G4UniformRand() * ra << 336 >> 337 G4double costhetan = 2.*G4UniformRand()-1.0; >> 338 G4double sinthetan = std::sqrt((1.0-costhetan)*(1.0+costhetan)); >> 339 G4double phin = twopi*G4UniformRand()*rad; 313 G4double sinphin = std::sin(phin); 340 G4double sinphin = std::sin(phin); 314 G4double cosphin = std::cos(phin); 341 G4double cosphin = std::cos(phin); 315 342 316 G4ThreeVector direction2(sinthetan * cosphin << 343 G4ThreeVector direction2(sinthetan*cosphin,sinthetan*sinphin,costhetan); 317 344 318 auto daughterparticle2 = new G4DynamicPartic << 345 G4DynamicParticle * daughterparticle2 319 auto daughterparticle3 = << 346 = new G4DynamicParticle( daughters[2], direction2*(vmass/2.)); 320 new G4DynamicParticle(G4MT_daughters[3], d << 347 G4DynamicParticle * daughterparticle3 >> 348 = new G4DynamicParticle( daughters[3], direction2*(-1.0*vmass/2.)); 321 349 322 // boost to the muon rest frame 350 // boost to the muon rest frame 323 G4double beta = P34.mag() / energy2; << 351 324 G4ThreeVector direction34 = P34.unit(); << 352 G4ThreeVector direction34(direction0.x()+direction1.x(), >> 353 direction0.y()+direction1.y(), >> 354 direction0.z()+direction1.z()); >> 355 direction34 = direction34.unit(); 325 356 326 G4LorentzVector p4 = daughterparticle2->Get4 357 G4LorentzVector p4 = daughterparticle2->Get4Momentum(); 327 p4.boost(direction34.x() * beta, direction34 << 358 p4.boost(direction34.x()*beta,direction34.y()*beta,direction34.z()*beta); 328 daughterparticle2->Set4Momentum(p4); 359 daughterparticle2->Set4Momentum(p4); 329 360 330 p4 = daughterparticle3->Get4Momentum(); 361 p4 = daughterparticle3->Get4Momentum(); 331 p4.boost(direction34.x() * beta, direction34 << 362 p4.boost(direction34.x()*beta,direction34.y()*beta,direction34.z()*beta); 332 daughterparticle3->Set4Momentum(p4); 363 daughterparticle3->Set4Momentum(p4); 333 364 334 products->PushProducts(daughterparticle2); 365 products->PushProducts(daughterparticle2); 335 products->PushProducts(daughterparticle3); 366 products->PushProducts(daughterparticle3); 336 367 337 daughtermomentum[2] = daughterparticle2->Get 368 daughtermomentum[2] = daughterparticle2->GetTotalMomentum(); 338 daughtermomentum[3] = daughterparticle3->Get 369 daughtermomentum[3] = daughterparticle3->GetTotalMomentum(); 339 370 340 // output message << 371 // output message 341 #ifdef G4VERBOSE 372 #ifdef G4VERBOSE 342 if (GetVerboseLevel() > 1) { << 373 if (GetVerboseLevel()>1) { 343 G4cout << "G4MuonRadiativeDecayChannelWith << 374 G4cout << "G4MuonRadiativeDecayChannelWithSpin::DecayIt "; 344 G4cout << " create decay products in rest << 375 G4cout << " create decay products in rest frame " <<G4endl; 345 G4double TT = daughterparticle0->GetTotalE << 376 products->DumpInfo(); 346 + daughterparticle2->GetTota << 347 G4cout << "e :" << daughterparticle0->G << 348 G4cout << "gamma:" << daughterparticle1->G << 349 G4cout << "nu2 :" << daughterparticle2->G << 350 G4cout << "nu2 :" << daughterparticle3->G << 351 G4cout << "total:" << (TT - parentmass) / << 352 if (GetVerboseLevel() > 1) { << 353 products->DumpInfo(); << 354 } << 355 } 377 } 356 #endif 378 #endif 357 << 358 return products; 379 return products; 359 } 380 } 360 381 361 G4double G4MuonRadiativeDecayChannelWithSpin:: << 382 G4double G4MuonRadiativeDecayChannelWithSpin::fron(G4double Pmu, 362 << 383 G4double x, >> 384 G4double y, >> 385 G4double cthetaE, >> 386 G4double cthetaG, 363 387 G4double cthetaGE) 364 { 388 { 365 G4double mu = 105.65; << 389 G4double mu = 105.65; 366 G4double me = 0.511; << 390 G4double me = 0.511; 367 G4double rho = 0.75; << 391 G4double rho = 0.75; 368 G4double del = 0.75; << 392 G4double del = 0.75; 369 G4double eps = 0.0; << 393 G4double eps = 0.0; 370 G4double kap = 0.0; << 394 G4double kap = 0.0; 371 G4double ksi = 1.0; << 395 G4double ksi = 1.0; 372 << 396 373 G4double delta = 1 - cthetaGE; << 397 G4double delta = 1-cthetaGE; 374 << 398 375 // Calculation of the functions f(x,y) << 399 // Calculation of the functions f(x,y) 376 << 400 377 G4double f_1s = 12.0 << 401 G4double f_1s = 12.0*((y*y)*(1.0-y)+x*y*(2.0-3.0*y) 378 * ((y * y) * (1.0 - y) + x * << 402 +2.0*(x*x)*(1.0-2.0*y)-2.0*(x*x*x)); 379 - 2.0 * (x * x * x)); << 403 G4double f0s = 6.0*(-x*y*(2.0-3.0*(y*y)) 380 G4double f0s = 6.0 << 404 -2.0*(x*x)*(1.0-y-3.0*(y*y))+2.0*(x*x*x)*(1.0+2.0*y)); 381 * (-x * y * (2.0 - 3.0 * (y * << 405 G4double f1s = 3.0*((x*x)*y*(2.0-3.0*y-3.0*(y*y)) 382 + 2.0 * (x * x * x) * (1.0 << 406 -(x*x*x)*y*(4.0+3.0*y)); 383 G4double f1s = << 407 G4double f2s = 1.5*((x*x*x)*(y*y)*(2.0+y)); 384 3.0 * ((x * x) * y * (2.0 - 3.0 * y - 3.0 << 408 385 G4double f2s = 1.5 * ((x * x * x) * (y * y) << 409 G4double f_1se = 12.0*(x*y*(1.0-x)+(x*x)*(2.0-3.0*y) 386 << 410 -2.0*(x*x*x)); 387 G4double f_1se = 12.0 * (x * y * (1.0 - y) + << 411 G4double f0se = 6.0*(-(x*x)*(2.0-y-2.0*(y*y)) 388 G4double f0se = 6.0 * (-(x * x) * (2.0 - y - << 412 +(x*x*x)*(2.0+3.0*y)); 389 G4double f1se = -3.0 * (x * x * x) * y * (2. << 413 G4double f1se = -3.0*(x*x*x)*y*(2.0+y); 390 G4double f2se = 0.0; << 414 G4double f2se = 0.0; 391 << 415 392 G4double f_1sg = 12.0 * ((y * y) * (1.0 - y) << 416 G4double f_1sg = 12.0*((y*y)*(1.0-y)+x*y*(1.0-2.0*y) 393 G4double f0sg = << 417 -(x*x)*y); 394 6.0 * (-x * (y * y) * (2.0 - 3.0 * y) - (x << 418 G4double f0sg = 6.0*(-x*(y*y)*(2.0-3.0*y)-(x*x)*y*(1.0-4.0*y) 395 G4double f1sg = 3.0 * ((x * x) * (y * y) * ( << 419 +(x*x*x)*y); 396 G4double f2sg = 1.5 * (x * x * x) * (y * y * << 420 G4double f1sg = 3.0*((x*x)*(y*y)*(1.0-3.0*y) 397 << 421 -2.0*(x*x*x)*(y*y)); 398 G4double f_1v = 8.0 << 422 G4double f2sg = 1.5*(x*x*x)*(y*y*y); 399 * ((y * y) * (3.0 - 2.0 * y) << 423 400 + 2.0 * (x * x) * (3.0 - << 424 G4double f_1v = 8.0*((y*y)*(3.0-2.0*y)+6.0*x*y*(1.0-y) 401 G4double f0v = 8.0 << 425 +2.0*(x*x)*(3.0-4.0*y)-4.0*(x*x*x)); 402 * (-x * y * (3.0 - y - (y * y << 426 G4double f0v = 8.0*(-x*y*(3.0-y-(y*y))-(x*x)*(3.0-y-4.0*(y*y)) 403 + 2.0 * (x * x * x) * (1.0 << 427 +2.0*(x*x*x)*(1.0+2.0*y)); 404 G4double f1v = << 428 G4double f1v = 2.0*((x*x)*y*(6.0-5.0*y-2.0*(y*y)) 405 2.0 * ((x * x) * y * (6.0 - 5.0 * y - 2.0 << 429 -2.0*(x*x*x)*y*(4.0+3.0*y)); 406 G4double f2v = 2.0 * (x * x * x) * (y * y) * << 430 G4double f2v = 2.0*(x*x*x)*(y*y)*(2.0+y); 407 << 431 408 G4double f_1ve = << 432 G4double f_1ve = 8.0*(x*y*(1.0-2.0*y) 409 8.0 * (x * y * (1.0 - 2.0 * y) + 2.0 * (x << 433 +2.0*(x*x)*(1.0-3.0*y)-4.0*(x*x*x)); 410 G4double f0ve = << 434 G4double f0ve = 4.0*(-(x*x)*(2.0-3.0*y-4.0*(y*y)) 411 4.0 * (-(x * x) * (2.0 - 3.0 * y - 4.0 * ( << 435 +2.0*(x*x*x)*(2.0+3.0*y)); 412 G4double f1ve = -4.0 * (x * x * x) * y * (2. << 436 G4double f1ve = -4.0*(x*x*x)*y*(2.0+y); 413 G4double f2ve = 0.0; << 437 G4double f2ve = 0.0; 414 << 438 415 G4double f_1vg = 8.0 * ((y * y) * (1.0 - 2.0 << 439 G4double f_1vg = 8.0*((y*y)*(1.0-2.0*y)+x*y*(1.0-4.0*y) 416 G4double f0vg = << 440 -2.0*(x*x)*y); 417 4.0 * (2.0 * x * (y * y) * (1.0 + y) - (x << 441 G4double f0vg = 4.0*(2.0*x*(y*y)*(1.0+y)-(x*x)*y*(1.0-4.0*y) 418 G4double f1vg = 2.0 * ((x * x) * (y * y) * ( << 442 +2.0*(x*x*x)*y); 419 G4double f2vg = 2.0 * (x * x * x) * (y * y * << 443 G4double f1vg = 2.0*((x*x)*(y*y)*(1.0-2.0*y) 420 << 444 -4.0*(x*x*x)*(y*y)); 421 G4double f_1t = 8.0 << 445 G4double f2vg = 2.0*(x*x*x)*(y*y*y); 422 * ((y * y) * (3.0 - y) + 3.0 << 446 423 - 2.0 * (x * x * x)); << 447 G4double f_1t = 8.0*((y*y)*(3.0-y)+3.0*x*y*(2.0-y) 424 G4double f0t = 4.0 << 448 +2.0*(x*x)*(3.0-2.0*y)-2.0*(x*x*x)); 425 * (-x * y * (6.0 + (y * y)) - << 449 G4double f0t = 4.0*(-x*y*(6.0+(y*y)) 426 + 2.0 * (x * x * x) * (1.0 << 450 -2.0*(x*x)*(3.0+y-3.0*(y*y))+2.0*(x*x*x)*(1.0+2.0*y)); 427 G4double f1t = << 451 G4double f1t = 2.0*((x*x)*y*(6.0-5.0*y+(y*y)) 428 2.0 * ((x * x) * y * (6.0 - 5.0 * y + (y * << 452 -(x*x*x)*y*(4.0+3.0*y)); 429 G4double f2t = (x * x * x) * (y * y) * (2.0 << 453 G4double f2t = (x*x*x)*(y*y)*(2.0+y); 430 << 454 431 G4double f_1te = -8.0 * (x * y * (1.0 + 3.0 << 455 G4double f_1te = -8.0*(x*y*(1.0+3.0*y)+(x*x)*(2.0+3.0*y) 432 G4double f0te = 4.0 * ((x * x) * (2.0 + 3.0 << 456 +2.0*(x*x*x)); 433 G4double f1te = -2.0 * (x * x * x) * y * (2. << 457 G4double f0te = 4.0*((x*x)*(2.0+3.0*y+4.0*(y*y)) 434 G4double f2te = 0.0; << 458 +(x*x*x)*(2.0+3.0*y)); 435 << 459 G4double f1te = -2.0*(x*x*x)*y*(2.0+y); 436 G4double f_1tg = -8.0 * ((y * y) * (1.0 + y) << 460 G4double f2te = 0.0; 437 G4double f0tg = 4.0 * (x * (y * y) * (2.0 - << 461 438 G4double f1tg = -2.0 * ((x * x) * (y * y) * << 462 G4double f_1tg = -8.0*((y*y)*(1.0+y)+x*y+(x*x)*y); 439 G4double f2tg = (x * x * x) * (y * y * y); << 463 G4double f0tg = 4.0*(x*(y*y)*(2.0-y)+(x*x)*y*(1.0+2.0*y) 440 << 464 +(x*x*x)*y); 441 G4double term = delta + 2.0 * (me * me) / (( << 465 G4double f1tg = -2.0*((x*x)*(y*y)*(1.0-y)+2.0*(x*x*x)*y); 442 term = 1.0 / term; << 466 G4double f2tg = (x*x*x)*(y*y*y); 443 << 467 444 G4double nss = term * f_1s + f0s + delta * f << 468 G4double term = delta+2.0*(me*me)/((mu*mu)*(x*x)); 445 G4double nv = term * f_1v + f0v + delta * f1 << 469 term = 1.0/term; 446 G4double nt = term * f_1t + f0t + delta * f1 << 470 447 << 471 G4double ns = term*f_1s+f0s+delta*f1s+(delta*delta)*f2s; 448 G4double nse = term * f_1se + f0se + delta * << 472 G4double nv = term*f_1v+f0v+delta*f1v+(delta*delta)*f2v; 449 G4double nve = term * f_1ve + f0ve + delta * << 473 G4double nt = term*f_1t+f0t+delta*f1t+(delta*delta)*f2t; 450 G4double nte = term * f_1te + f0te + delta * << 474 451 << 475 G4double nse = term*f_1se+f0se+delta*f1se+(delta*delta)*f2se; 452 G4double nsg = term * f_1sg + f0sg + delta * << 476 G4double nve = term*f_1ve+f0ve+delta*f1ve+(delta*delta)*f2ve; 453 G4double nvg = term * f_1vg + f0vg + delta * << 477 G4double nte = term*f_1te+f0te+delta*f1te+(delta*delta)*f2te; 454 G4double ntg = term * f_1tg + f0tg + delta * << 478 455 << 479 G4double nsg = term*f_1sg+f0sg+delta*f1sg+(delta*delta)*f2sg; 456 G4double term1 = nv; << 480 G4double nvg = term*f_1vg+f0vg+delta*f1vg+(delta*delta)*f2vg; 457 G4double term2 = 2.0 * nss + nv - nt; << 481 G4double ntg = term*f_1tg+f0tg+delta*f1tg+(delta*delta)*f2tg; 458 G4double term3 = 2.0 * nss - 2.0 * nv + nt; << 482 459 << 483 G4double term1 = nv; 460 G4double term1e = 1.0 / 3.0 * (1.0 - 4.0 / 3 << 484 G4double term2 = 2.0*ns-nv-nt; 461 G4double term2e = 2.0 * nse + 5.0 * nve - nt << 485 G4double term3 = 2.0*ns-2.0*nv+nt; 462 G4double term3e = 2.0 * nse - 2.0 * nve + nt << 486 463 << 487 G4double term1e = 1.0/3.0*(1.0-4.0/3.0*del); 464 G4double term1g = 1.0 / 3.0 * (1.0 - 4.0 / 3 << 488 G4double term2e = 2.0*nse+5.0*nve-nte; 465 G4double term2g = 2.0 * nsg + 5.0 * nvg - nt << 489 G4double term3e = 2.0*nse-2.0*nve+nte; 466 G4double term3g = 2.0 * nsg - 2.0 * nvg + nt << 490 467 << 491 G4double term1g = 1.0/3.0*(1.0-4.0/3.0*del); 468 G4double som00 = term1 + (1.0 - 4.0 / 3.0 * << 492 G4double term2g = 2.0*nsg+5.0*nvg-ntg; 469 G4double som01 = Pmu * ksi << 493 G4double term3g = 2.0*nsg-2.0*nvg+ntg; 470 * (cthetaE * (nve - term1e << 494 471 + cthetaG * (nvg - term1 << 495 G4double som00 = term1+(1.0-4.0/3.0*rho)*term2+eps*term3; >> 496 G4double som01 = Pmu*ksi*(cthetaE*(nve-term1e*term2e+kap*term3e) >> 497 +cthetaG*(nvg-term1g*term2g+kap*term3g)); >> 498 G4double som0 = som00+som01; 472 499 473 G4double som0 = (som00 + som01) / y; << 500 // G4cout << x << " " << y << " " << som00 << " " 474 som0 = fine_structure_const / 8. / (twopi * << 501 // << som01 << " " << som0 << G4endl; 475 502 476 return som0; << 503 return som0; 477 } 504 } 478 505