Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4MuonRadiativeDecayChannelWithSpin Class Reference

#include <G4MuonRadiativeDecayChannelWithSpin.hh>

+ Inheritance diagram for G4MuonRadiativeDecayChannelWithSpin:

Public Member Functions

 G4MuonRadiativeDecayChannelWithSpin (const G4String &theParentName, G4double theBR)
 
virtual ~G4MuonRadiativeDecayChannelWithSpin ()
 
virtual G4DecayProductsDecayIt (G4double)
 
void SetPolarization (G4ThreeVector)
 
const G4ThreeVectorGetPolarization () const
 
- Public Member Functions inherited from G4VDecayChannel
 G4VDecayChannel (const G4String &aName, G4int Verbose=1)
 
 G4VDecayChannel (const G4String &aName, const G4String &theParentName, G4double theBR, G4int theNumberOfDaughters, const G4String &theDaughterName1, const G4String &theDaughterName2="", const G4String &theDaughterName3="", const G4String &theDaughterName4="")
 
virtual ~G4VDecayChannel ()
 
G4int operator== (const G4VDecayChannel &right) const
 
G4int operator!= (const G4VDecayChannel &right) const
 
G4int operator< (const G4VDecayChannel &right) const
 
virtual G4DecayProductsDecayIt (G4double parentMass=-1.0)=0
 
const G4StringGetKinematicsName () const
 
G4double GetBR () const
 
G4int GetNumberOfDaughters () const
 
G4ParticleDefinitionGetParent ()
 
G4ParticleDefinitionGetDaughter (G4int anIndex)
 
G4int GetAngularMomentum ()
 
const G4StringGetParentName () const
 
const G4StringGetDaughterName (G4int anIndex) const
 
G4double GetParentMass () const
 
G4double GetDaughterMass (G4int anIndex) const
 
void SetParent (const G4ParticleDefinition *particle_type)
 
void SetParent (const G4String &particle_name)
 
void SetBR (G4double value)
 
void SetNumberOfDaughters (G4int value)
 
void SetDaughter (G4int anIndex, const G4ParticleDefinition *particle_type)
 
void SetDaughter (G4int anIndex, const G4String &particle_name)
 
void SetVerboseLevel (G4int value)
 
G4int GetVerboseLevel () const
 
void DumpInfo ()
 

Protected Member Functions

 G4MuonRadiativeDecayChannelWithSpin (const G4MuonRadiativeDecayChannelWithSpin &)
 
G4MuonRadiativeDecayChannelWithSpinoperator= (const G4MuonRadiativeDecayChannelWithSpin &)
 
- Protected Member Functions inherited from G4VDecayChannel
 G4VDecayChannel ()
 
 G4VDecayChannel (const G4VDecayChannel &)
 
G4VDecayChanneloperator= (const G4VDecayChannel &)
 
void ClearDaughtersName ()
 
void FillDaughters ()
 
void FillParent ()
 

Additional Inherited Members

- Protected Attributes inherited from G4VDecayChannel
G4String kinematics_name
 
G4double rbranch
 
G4int numberOfDaughters
 
G4Stringparent_name
 
G4String ** daughters_name
 
G4ParticleTableparticletable
 
G4ParticleDefinitionparent
 
G4ParticleDefinition ** daughters
 
G4double parent_mass
 
G4doubledaughters_mass
 
G4int verboseLevel
 
- Static Protected Attributes inherited from G4VDecayChannel
static const G4String noName = " "
 

Detailed Description

Definition at line 61 of file G4MuonRadiativeDecayChannelWithSpin.hh.

Constructor & Destructor Documentation

◆ G4MuonRadiativeDecayChannelWithSpin() [1/2]

G4MuonRadiativeDecayChannelWithSpin::G4MuonRadiativeDecayChannelWithSpin ( const G4String theParentName,
G4double  theBR 
)

Definition at line 59 of file G4MuonRadiativeDecayChannelWithSpin.cc.

62 : G4VDecayChannel("Radiative Muon Decay",1),
63 parent_polarization()
64{
65 // set names for daughter particles
66 if (theParentName == "mu+") {
67 SetBR(theBR);
68 SetParent("mu+");
70 SetDaughter(0, "e+");
71 SetDaughter(1, "gamma");
72 SetDaughter(2, "nu_e");
73 SetDaughter(3, "anti_nu_mu");
74 } else if (theParentName == "mu-") {
75 SetBR(theBR);
76 SetParent("mu-");
78 SetDaughter(0, "e-");
79 SetDaughter(1, "gamma");
80 SetDaughter(2, "anti_nu_e");
81 SetDaughter(3, "nu_mu");
82 } else {
83#ifdef G4VERBOSE
84 if (GetVerboseLevel()>0) {
85 G4cout << "G4RadiativeMuonDecayChannel:: constructor :";
86 G4cout << " parent particle is not muon but ";
87 G4cout << theParentName << G4endl;
88 }
89#endif
90 }
91}
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
void SetBR(G4double value)
G4int GetVerboseLevel() const
void SetNumberOfDaughters(G4int value)
void SetDaughter(G4int anIndex, const G4ParticleDefinition *particle_type)
void SetParent(const G4ParticleDefinition *particle_type)

Referenced by G4MuonRadiativeDecayChannelWithSpin().

◆ ~G4MuonRadiativeDecayChannelWithSpin()

G4MuonRadiativeDecayChannelWithSpin::~G4MuonRadiativeDecayChannelWithSpin ( )
virtual

Definition at line 93 of file G4MuonRadiativeDecayChannelWithSpin.cc.

94{
95}

◆ G4MuonRadiativeDecayChannelWithSpin() [2/2]

G4MuonRadiativeDecayChannelWithSpin::G4MuonRadiativeDecayChannelWithSpin ( const G4MuonRadiativeDecayChannelWithSpin right)
protected

Definition at line 97 of file G4MuonRadiativeDecayChannelWithSpin.cc.

97 :
98 G4VDecayChannel(right)
99{
100 parent_polarization = right.parent_polarization;
101}

Member Function Documentation

◆ DecayIt()

G4DecayProducts * G4MuonRadiativeDecayChannelWithSpin::DecayIt ( G4double  )
virtual

if(i<10000000)goto leap1:

Implements G4VDecayChannel.

Definition at line 132 of file G4MuonRadiativeDecayChannelWithSpin.cc.

133{
134
135#ifdef G4VERBOSE
136 if (GetVerboseLevel()>1)
137 G4cout << "G4MuonRadiativeDecayChannelWithSpin::DecayIt ";
138#endif
139
140 if (parent == 0) FillParent();
141 if (daughters == 0) FillDaughters();
142
143 // parent mass
144 G4double parentmass = parent->GetPDGMass();
145
146 G4double EMMU = parentmass;
147
148 //daughters'mass
149 G4double daughtermass[4];
150 G4double sumofdaughtermass = 0.0;
151 for (G4int index=0; index<4; index++){
152 daughtermass[index] = daughters[index]->GetPDGMass();
153 sumofdaughtermass += daughtermass[index];
154 }
155
156 G4double EMASS = daughtermass[0];
157
158 //create parent G4DynamicParticle at rest
159 G4ThreeVector dummy;
160 G4DynamicParticle * parentparticle =
161 new G4DynamicParticle( parent, dummy, 0.0);
162 //create G4Decayproducts
163 G4DecayProducts *products = new G4DecayProducts(*parentparticle);
164 delete parentparticle;
165
166 G4int i = 0;
167
168 G4double eps = EMASS/EMMU;
169
170 G4double som0, Qsqr, x, y, xx, yy, zz;
171 G4double cthetaE, cthetaG, cthetaGE, phiE, phiG;
172
173 do {
174
175// leap1:
176
177 i++;
178
179// leap2:
180
181 do {
182//
183//--------------------------------------------------------------------------
184// Build two vectors of random length and random direction, for the
185// positron and the photon.
186// x/y is the length of the vector, xx, yy and zz the components,
187// phi is the azimutal angle, theta the polar angle.
188//--------------------------------------------------------------------------
189//
190// For the positron
191//
192 x = G4UniformRand();
193
194 rn3dim(xx,yy,zz,x);
195
196 if(std::fabs((xx*xx)+(yy*yy)+(zz*zz)-(x*x))>0.001){
197 G4cout << "Norm of x not correct" << G4endl;
198 }
199
200 phiE = atan4(xx,yy);
201 cthetaE = zz/x;
202 G4double sthetaE = std::sqrt((xx*xx)+(yy*yy))/x;
203//
204// What you get:
205//
206// x = positron energy
207// phiE = azimutal angle of positron momentum
208// cthetaE = cosine of polar angle of positron momentum
209// sthetaE = sine of polar angle of positron momentum
210//
211//// G4cout << " x, xx, yy, zz " << x << " " << xx << " "
212//// << yy << " " << zz << G4endl;
213//// G4cout << " phiE, cthetaE, sthetaE " << phiE << " "
214//// << cthetaE << " "
215//// << sthetaE << " " << G4endl;
216//
217//-----------------------------------------------------------------------
218//
219// For the photon
220//
221 y = G4UniformRand();
222
223 rn3dim(xx,yy,zz,y);
224
225 if(std::fabs((xx*xx)+(yy*yy)+(zz*zz)-(y*y))>0.001){
226 G4cout << " Norm of y not correct " << G4endl;
227 }
228
229 phiG = atan4(xx,yy);
230 cthetaG = zz/y;
231 G4double sthetaG = std::sqrt((xx*xx)+(yy*yy))/y;
232//
233// What you get:
234//
235// y = photon energy
236// phiG = azimutal angle of photon momentum
237// cthetaG = cosine of polar angle of photon momentum
238// sthetaG = sine of polar angle of photon momentum
239//
240//// G4cout << " y, xx, yy, zz " << y << " " << xx << " "
241//// << yy << " " << zz << G4endl;
242//// G4cout << " phiG, cthetaG, sthetaG " << phiG << " "
243//// << cthetaG << " "
244//// << sthetaG << " " << G4endl;
245//
246//-----------------------------------------------------------------------
247//
248// Maybe certain restrictions on the kinematical variables:
249//
250//// if (cthetaE > 0.01)goto leap2;
251//// if (cthetaG > 0.01)goto leap2;
252//// if (std::fabs(x-0.5) > 0.5 )goto leap2;
253//// if (std::fabs(y-0.5) > 0.5 )goto leap2;
254//
255//-----------------------------------------------------------------------
256//
257// Calculate the angle between positron and photon (cosine)
258//
259 cthetaGE = cthetaE*cthetaG+sthetaE*sthetaG*std::cos(phiE-phiG);
260//
261//// G4cout << x << " " << cthetaE << " " << sthetaE << " "
262//// << y << " " << cthetaG << " " << sthetaG << " "
263//// << cthetaGE
264//
265//-----------------------------------------------------------------------
266//
267 G4double term0 = eps*eps;
268 G4double term1 = x*((1.0-eps)*(1.0-eps))+2.0*eps;
269 G4double beta = std::sqrt( x*((1.0-eps)*(1.0-eps))*
270 (x*((1.0-eps)*(1.0-eps))+4.0*eps))/term1;
271 G4double delta = 1.0-beta*cthetaGE;
272
273 G4double term3 = y*(1.0-(eps*eps));
274 G4double term6 = term1*delta*term3;
275
276 Qsqr = (1.0-term1-term3+term0+0.5*term6)/((1.0-eps)*(1.0-eps));
277//
278//-----------------------------------------------------------------------
279//
280// Check the kinematics.
281//
282 } while ( Qsqr<0.0 || Qsqr>1.0 );
283//
284//// G4cout << x << " " << y << " " << beta << " " << Qsqr << G4endl;
285//
286// Do the calculation for -1 muon polarization (i.e. mu+)
287//
288 G4double Pmu = -1.0;
289 if (GetParentName() == "mu-")Pmu = +1.0;
290//
291// and for Fronsdal
292//
293//-----------------------------------------------------------------------
294//
295 som0 = fron(Pmu,x,y,cthetaE,cthetaG,cthetaGE);
296//
297//// if(som0<0.0){
298//// G4cout << " som0 < 0 in Fronsdal " << som0
299//// << " at event " << i << G4endl;
300//// G4cout << Pmu << " " << x << " " << y << " "
301//// << cthetaE << " " << cthetaG << " "
302//// << cthetaGE << " " << som0 << G4endl;
303//// }
304//
305//-----------------------------------------------------------------------
306//
307//// G4cout << x << " " << y << " " << som0 << G4endl;
308//
309//----------------------------------------------------------------------
310//
311// Sample the decay rate
312//
313
314 } while (G4UniformRand()*177.0 > som0);
315
316/// if(i<10000000)goto leap1:
317//
318//-----------------------------------------------------------------------
319//
320 G4double E = EMMU/2.*(x*((1.-eps)*(1.-eps))+2.*eps);
321 G4double G = EMMU/2.*y*(1.-eps*eps);
322//
323//-----------------------------------------------------------------------
324//
325
326 if(E < EMASS) E = EMASS;
327
328 // calculate daughter momentum
329 G4double daughtermomentum[4];
330
331 daughtermomentum[0] = std::sqrt(E*E - EMASS*EMASS);
332
333 G4double sthetaE = std::sqrt(1.-cthetaE*cthetaE);
334 G4double cphiE = std::cos(phiE);
335 G4double sphiE = std::sin(phiE);
336
337 //Coordinates of the decay positron with respect to the muon spin
338
339 G4double px = sthetaE*cphiE;
340 G4double py = sthetaE*sphiE;
341 G4double pz = cthetaE;
342
343 G4ThreeVector direction0(px,py,pz);
344
345 direction0.rotateUz(parent_polarization);
346
347 G4DynamicParticle * daughterparticle0
348 = new G4DynamicParticle( daughters[0], daughtermomentum[0]*direction0);
349
350 products->PushProducts(daughterparticle0);
351
352 daughtermomentum[1] = G;
353
354 G4double sthetaG = std::sqrt(1.-cthetaG*cthetaG);
355 G4double cphiG = std::cos(phiG);
356 G4double sphiG = std::sin(phiG);
357
358 //Coordinates of the decay gamma with respect to the muon spin
359
360 px = sthetaG*cphiG;
361 py = sthetaG*sphiG;
362 pz = cthetaG;
363
364 G4ThreeVector direction1(px,py,pz);
365
366 direction1.rotateUz(parent_polarization);
367
368 G4DynamicParticle * daughterparticle1
369 = new G4DynamicParticle( daughters[1], daughtermomentum[1]*direction1);
370
371 products->PushProducts(daughterparticle1);
372
373 // daughter 3 ,4 (neutrinos)
374 // create neutrinos in the C.M frame of two neutrinos
375
376 G4double energy2 = parentmass*(1.0 - (x+y)/2.0);
377
378 G4double vmass = std::sqrt((energy2-
379 (daughtermomentum[0]+daughtermomentum[1]))*
380 (energy2+
381 (daughtermomentum[0]+daughtermomentum[1])));
382 G4double beta = (daughtermomentum[0]+daughtermomentum[1])/energy2;
383 beta = -1.0 * std::min(beta,0.99);
384
385 G4double costhetan = 2.*G4UniformRand()-1.0;
386 G4double sinthetan = std::sqrt((1.0-costhetan)*(1.0+costhetan));
387 G4double phin = twopi*G4UniformRand()*rad;
388 G4double sinphin = std::sin(phin);
389 G4double cosphin = std::cos(phin);
390
391 G4ThreeVector direction2(sinthetan*cosphin,sinthetan*sinphin,costhetan);
392
393 G4DynamicParticle * daughterparticle2
394 = new G4DynamicParticle( daughters[2], direction2*(vmass/2.));
395 G4DynamicParticle * daughterparticle3
396 = new G4DynamicParticle( daughters[3], direction2*(-1.0*vmass/2.));
397
398 // boost to the muon rest frame
399
400 G4ThreeVector direction34(direction0.x()+direction1.x(),
401 direction0.y()+direction1.y(),
402 direction0.z()+direction1.z());
403 direction34 = direction34.unit();
404
405 G4LorentzVector p4 = daughterparticle2->Get4Momentum();
406 p4.boost(direction34.x()*beta,direction34.y()*beta,direction34.z()*beta);
407 daughterparticle2->Set4Momentum(p4);
408
409 p4 = daughterparticle3->Get4Momentum();
410 p4.boost(direction34.x()*beta,direction34.y()*beta,direction34.z()*beta);
411 daughterparticle3->Set4Momentum(p4);
412
413 products->PushProducts(daughterparticle2);
414 products->PushProducts(daughterparticle3);
415
416 daughtermomentum[2] = daughterparticle2->GetTotalMomentum();
417 daughtermomentum[3] = daughterparticle3->GetTotalMomentum();
418
419// output message
420#ifdef G4VERBOSE
421 if (GetVerboseLevel()>1) {
422 G4cout << "G4MuonRadiativeDecayChannelWithSpin::DecayIt ";
423 G4cout << " create decay products in rest frame " <<G4endl;
424 products->DumpInfo();
425 }
426#endif
427 return products;
428}
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4UniformRand()
Definition: Randomize.hh:53
HepLorentzVector & boost(double, double, double)
void DumpInfo() const
G4int PushProducts(G4DynamicParticle *aParticle)
G4LorentzVector Get4Momentum() const
void Set4Momentum(const G4LorentzVector &momentum)
G4double GetTotalMomentum() const
const G4String & GetParentName() const
G4ParticleDefinition * parent
G4ParticleDefinition ** daughters

◆ GetPolarization()

const G4ThreeVector & G4MuonRadiativeDecayChannelWithSpin::GetPolarization ( ) const
inline

Definition at line 113 of file G4MuonRadiativeDecayChannelWithSpin.hh.

115{
116 return parent_polarization;
117}

◆ operator=()

G4MuonRadiativeDecayChannelWithSpin & G4MuonRadiativeDecayChannelWithSpin::operator= ( const G4MuonRadiativeDecayChannelWithSpin right)
protected

Definition at line 103 of file G4MuonRadiativeDecayChannelWithSpin.cc.

104{
105 if (this != &right) {
108 rbranch = right.rbranch;
109
110 // copy parent name
111 parent_name = new G4String(*right.parent_name);
112
113 // clear daughters_name array
115
116 // recreate array
118 if ( numberOfDaughters >0 ) {
121 //copy daughters name
122 for (G4int index=0; index < numberOfDaughters; index++) {
123 daughters_name[index] = new G4String(*right.daughters_name[index]);
124 }
125 }
126 parent_polarization = right.parent_polarization;
127 }
128 return *this;
129}
G4String * parent_name
G4String ** daughters_name
G4String kinematics_name

◆ SetPolarization()

void G4MuonRadiativeDecayChannelWithSpin::SetPolarization ( G4ThreeVector  polar)
inline

Definition at line 107 of file G4MuonRadiativeDecayChannelWithSpin.hh.

109{
110 parent_polarization = polar;
111}

The documentation for this class was generated from the following files: