source: trunk/source/particles/management/src/G4MuonDecayChannelWithSpin.cc @ 1276

Last change on this file since 1276 was 824, checked in by garnier, 16 years ago

import all except CVS

File size: 8.5 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26// ------------------------------------------------------------
27//      GEANT 4 class header file
28//
29//      History:
30//               17 August 2004 P.Gumplinger and T.MacPhail
31//               samples Michel spectrum including 1st order
32//               radiative corrections
33//               Reference: Florian Scheck "Muon Physics", in Physics Reports
34//                          (Review Section of Physics Letters) 44, No. 4 (1978)
35//                          187-248. North-Holland Publishing Company, Amsterdam
36//                          at page 210 cc.
37//
38//                          W.E. Fisher and F. Scheck, Nucl. Phys. B83 (1974) 25.
39//
40// ------------------------------------------------------------
41//
42#include "G4MuonDecayChannelWithSpin.hh"
43
44#include "Randomize.hh"
45#include "G4DecayProducts.hh"
46#include "G4LorentzVector.hh"
47
48G4MuonDecayChannelWithSpin::G4MuonDecayChannelWithSpin(const G4String& theParentName, 
49                                                       G4double        theBR)
50                           : G4MuonDecayChannel(theParentName,theBR)
51{
52}
53
54G4MuonDecayChannelWithSpin::~G4MuonDecayChannelWithSpin()
55{
56}
57
58G4DecayProducts *G4MuonDecayChannelWithSpin::DecayIt(G4double) 
59{
60  // This version assumes V-A coupling with 1st order radiative correctons,
61  //              the standard model Michel parameter values, but
62  //              gives incorrect energy spectrum for neutrinos
63
64#ifdef G4VERBOSE
65  if (GetVerboseLevel()>1) G4cout << "G4MuonDecayChannelWithSpin::DecayIt ";
66#endif
67
68  if (parent == 0) FillParent(); 
69  if (daughters == 0) FillDaughters();
70
71  // parent mass
72  G4double parentmass = parent->GetPDGMass();
73
74  EMMU = parentmass;
75
76  //daughters'mass
77  G4double daughtermass[3]; 
78  G4double sumofdaughtermass = 0.0;
79  for (G4int index=0; index<3; index++){
80    daughtermass[index] = daughters[index]->GetPDGMass();
81    sumofdaughtermass += daughtermass[index];
82  }
83
84  EMASS = daughtermass[0];
85
86  //create parent G4DynamicParticle at rest
87  G4ThreeVector dummy;
88  G4DynamicParticle * parentparticle = new G4DynamicParticle( parent, dummy, 0.0);
89  //create G4Decayproducts
90  G4DecayProducts *products = new G4DecayProducts(*parentparticle);
91  delete parentparticle;
92
93  // calcurate electron energy
94
95  G4double michel_rho   = 0.75; //Standard Model Michel rho
96  G4double michel_delta = 0.75; //Standard Model Michel delta
97  G4double michel_xsi   = 1.00; //Standard Model Michel xsi
98  G4double michel_eta   = 0.00; //Standard Model eta
99
100  G4double rndm, x, ctheta;
101
102  G4double FG; 
103  G4double FG_max = 2.00;
104
105  G4double W_mue  = (EMMU*EMMU+EMASS*EMASS)/(2.*EMMU);
106  G4double x0     =           EMASS/W_mue;
107
108  G4double x0_squared = x0*x0;
109
110  // ***************************************************
111  //     x0 <= x <= 1.   and   -1 <= y <= 1
112  //
113  //     F(x,y) = f(x)*g(x,y);   g(x,y) = 1.+g(x)*y
114  // ***************************************************
115
116  // ***** sampling F(x,y) directly (brute force) *****
117
118  do{
119
120    // Sample the positron energy by sampling from F
121
122    rndm = G4UniformRand();
123
124    x = x0 + rndm*(1.-x0);
125
126    G4double x_squared = x*x;
127
128    G4double F_IS, F_AS, G_IS, G_AS;
129
130    F_IS = 1./6.*(-2.*x_squared+3.*x-x0_squared);
131    F_AS = 1./6.*std::sqrt(x_squared-x0_squared)*(2.*x-2.+std::sqrt(1.-x0_squared));
132
133    G_IS = 2./9.*(michel_rho-0.75)*(4.*x_squared-3.*x-x0_squared);
134    G_IS = G_IS + michel_eta*(1.-x)*x0;
135
136    G_AS = 3.*(michel_xsi-1.)*(1.-x);
137    G_AS = G_AS+2.*(michel_xsi*michel_delta-0.75)*(4.*x-4.+std::sqrt(1.-x0_squared));
138    G_AS = 1./9.*std::sqrt(x_squared-x0_squared)*G_AS;
139
140    F_IS = F_IS + G_IS;
141    F_AS = F_AS + G_AS;
142
143    // *** Radiative Corrections ***
144
145    G4double R_IS = F_c(x,x0);
146
147    G4double F = 6.*F_IS + R_IS/std::sqrt(x_squared-x0_squared);
148
149    // *** Radiative Corrections ***
150
151    G4double R_AS = F_theta(x,x0);
152
153    rndm = G4UniformRand();
154
155    ctheta = 2.*rndm-1.;
156
157    G4double G = 6.*F_AS - R_AS/std::sqrt(x_squared-x0_squared);
158
159    FG = std::sqrt(x_squared-x0_squared)*F*(1.+(G/F)*ctheta);
160
161    if(FG>FG_max){
162      G4cout<<"***Problem in Muon Decay *** : FG > FG_max"<<G4endl;
163      FG_max = FG;
164    }
165
166    rndm = G4UniformRand();
167
168  }while(FG<rndm*FG_max);
169
170  G4double energy = x * W_mue;
171
172  rndm = G4UniformRand();
173
174  G4double phi = twopi * rndm;
175
176  if(energy < EMASS) energy = EMASS;
177
178  // calculate daughter momentum
179  G4double daughtermomentum[3];
180
181  daughtermomentum[0] = std::sqrt(energy*energy - EMASS*EMASS);
182
183  G4double stheta = std::sqrt(1.-ctheta*ctheta);
184  G4double cphi = std::cos(phi);
185  G4double sphi = std::sin(phi);
186
187  //Coordinates of the decay positron with respect to the muon spin
188
189  G4double px = stheta*cphi;
190  G4double py = stheta*sphi;
191  G4double pz = ctheta;
192
193  G4ThreeVector direction0(px,py,pz);
194
195  direction0.rotateUz(parent_polarization);
196
197  G4DynamicParticle * daughterparticle0
198    = new G4DynamicParticle( daughters[0], daughtermomentum[0]*direction0);
199
200  products->PushProducts(daughterparticle0);
201
202
203  // daughter 1 ,2 (neutrinos)
204  // create neutrinos in the C.M frame of two neutrinos
205  G4double energy2 = parentmass*(1.0 - x/2.0); 
206  G4double vmass   = std::sqrt((energy2-daughtermomentum[0])*(energy2+daughtermomentum[0]));
207  G4double beta = -1.0*daughtermomentum[0]/energy2;
208  G4double costhetan = 2.*G4UniformRand()-1.0;
209  G4double sinthetan = std::sqrt((1.0-costhetan)*(1.0+costhetan));
210  G4double phin  = twopi*G4UniformRand()*rad;
211  G4double sinphin = std::sin(phin);
212  G4double cosphin = std::cos(phin);
213
214  G4ThreeVector direction1(sinthetan*cosphin,sinthetan*sinphin,costhetan);
215  G4DynamicParticle * daughterparticle1
216    = new G4DynamicParticle( daughters[1], direction1*(vmass/2.));
217  G4DynamicParticle * daughterparticle2
218    = new G4DynamicParticle( daughters[2], direction1*(-1.0*vmass/2.));
219
220  // boost to the muon rest frame
221  G4LorentzVector p4;
222  p4 = daughterparticle1->Get4Momentum();
223  p4.boost( direction0.x()*beta, direction0.y()*beta, direction0.z()*beta);
224  daughterparticle1->Set4Momentum(p4);
225  p4 = daughterparticle2->Get4Momentum();
226  p4.boost( direction0.x()*beta, direction0.y()*beta, direction0.z()*beta);
227  daughterparticle2->Set4Momentum(p4);
228  products->PushProducts(daughterparticle1);
229  products->PushProducts(daughterparticle2);
230  daughtermomentum[1] = daughterparticle1->GetTotalMomentum();
231  daughtermomentum[2] = daughterparticle2->GetTotalMomentum();
232
233  // output message
234#ifdef G4VERBOSE
235  if (GetVerboseLevel()>1) {
236    G4cout << "G4MuonDecayChannelWithSpin::DecayIt ";
237    G4cout << "  create decay products in rest frame " <<G4endl;
238    products->DumpInfo();
239  }
240#endif
241  return products;
242}
243
244G4double G4MuonDecayChannelWithSpin::R_c(G4double x){
245
246  G4int n_max = (int)(100.*x);
247
248  if(n_max<10)n_max=10;
249
250  G4double L2 = 0.0;
251
252  for(G4int n=1; n<=n_max; n++){
253    L2 += std::pow(x,n)/(n*n);
254  }
255
256  G4double omega = std::log(EMMU/EMASS);
257
258  G4double r_c;
259
260  r_c = 2.*L2-(pi*pi/3.)-2.;
261  r_c = r_c + omega * (1.5+2.*std::log((1.-x)/x));
262  r_c = r_c - std::log(x)*(2.*std::log(x)-1.);
263  r_c = r_c + (3.*std::log(x)-1.-1./x)*std::log(1.-x);
264
265  return r_c;
266}
Note: See TracBrowser for help on using the repository browser.