Geant4 11.1.1
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)
 
- 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="", const G4String &theDaughterName5="")
 
virtual ~G4VDecayChannel ()
 
G4bool operator== (const G4VDecayChannel &r) const
 
G4bool operator!= (const G4VDecayChannel &r) const
 
G4bool 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 ()
 
G4double GetRangeMass () const
 
void SetRangeMass (G4double val)
 
virtual G4bool IsOKWithParentMass (G4double parentMass)
 
void SetPolarization (const G4ThreeVector &)
 
const G4ThreeVectorGetPolarization () const
 

Protected Member Functions

 G4MuonRadiativeDecayChannelWithSpin (const G4MuonRadiativeDecayChannelWithSpin &)
 
G4MuonRadiativeDecayChannelWithSpinoperator= (const G4MuonRadiativeDecayChannelWithSpin &)
 
- Protected Member Functions inherited from G4VDecayChannel
void ClearDaughtersName ()
 
void CheckAndFillDaughters ()
 
void CheckAndFillParent ()
 
G4double DynamicalMass (G4double massPDG, G4double width, G4double maxDev=1.0) const
 
 G4VDecayChannel ()
 
 G4VDecayChannel (const G4VDecayChannel &)
 
G4VDecayChanneloperator= (const G4VDecayChannel &)
 

Additional Inherited Members

- Protected Attributes inherited from G4VDecayChannel
G4String kinematics_name = ""
 
G4double rbranch = 0.0
 
G4Stringparent_name = nullptr
 
G4String ** daughters_name = nullptr
 
G4double rangeMass = 2.5
 
G4ThreeVector parent_polarization
 
G4ParticleTableparticletable = nullptr
 
G4ParticleDefinitionG4MT_parent = nullptr
 
G4ParticleDefinition ** G4MT_daughters = nullptr
 
G4double G4MT_parent_mass = 0.0
 
G4doubleG4MT_daughters_mass = nullptr
 
G4doubleG4MT_daughters_width = nullptr
 
G4Mutex daughtersMutex
 
G4Mutex parentMutex
 
G4int numberOfDaughters = 0
 
G4int verboseLevel = 1
 
- Static Protected Attributes inherited from G4VDecayChannel
static const G4String noName = " "
 

Detailed Description

Definition at line 53 of file G4MuonRadiativeDecayChannelWithSpin.hh.

Constructor & Destructor Documentation

◆ G4MuonRadiativeDecayChannelWithSpin() [1/2]

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

Definition at line 52 of file G4MuonRadiativeDecayChannelWithSpin.cc.

55 : G4VDecayChannel("Radiative Muon Decay",1)
56{
57 // set names for daughter particles
58 if (theParentName == "mu+")
59 {
60 SetBR(theBR);
61 SetParent("mu+");
63 SetDaughter(0, "e+");
64 SetDaughter(1, "gamma");
65 SetDaughter(2, "nu_e");
66 SetDaughter(3, "anti_nu_mu");
67 }
68 else if (theParentName == "mu-")
69 {
70 SetBR(theBR);
71 SetParent("mu-");
73 SetDaughter(0, "e-");
74 SetDaughter(1, "gamma");
75 SetDaughter(2, "anti_nu_e");
76 SetDaughter(3, "nu_mu");
77 }
78 else
79 {
80#ifdef G4VERBOSE
81 if (GetVerboseLevel()>0)
82 {
83 G4cout << "G4RadiativeMuonDecayChannel::G4RadiativeMuonDecayChannel():";
84 G4cout << " parent particle is not muon but ";
85 G4cout << theParentName << G4endl;
86 }
87#endif
88 }
89}
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL 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)

◆ ~G4MuonRadiativeDecayChannelWithSpin()

G4MuonRadiativeDecayChannelWithSpin::~G4MuonRadiativeDecayChannelWithSpin ( )
virtual

Definition at line 91 of file G4MuonRadiativeDecayChannelWithSpin.cc.

92{
93}

◆ G4MuonRadiativeDecayChannelWithSpin() [2/2]

G4MuonRadiativeDecayChannelWithSpin::G4MuonRadiativeDecayChannelWithSpin ( const G4MuonRadiativeDecayChannelWithSpin r)
protected

Definition at line 95 of file G4MuonRadiativeDecayChannelWithSpin.cc.

98{
99}

Member Function Documentation

◆ DecayIt()

G4DecayProducts * G4MuonRadiativeDecayChannelWithSpin::DecayIt ( G4double  )
virtual

Implements G4VDecayChannel.

Definition at line 134 of file G4MuonRadiativeDecayChannelWithSpin.cc.

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

◆ operator=()

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

Definition at line 101 of file G4MuonRadiativeDecayChannelWithSpin.cc.

103{
104 if (this != &right)
105 {
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 )
119 {
120 if (daughters_name != nullptr) ClearDaughtersName();
122 // copy daughters name
123 for (G4int index=0; index<numberOfDaughters; ++index)
124 {
125 daughters_name[index] = new G4String(*right.daughters_name[index]);
126 }
127 }
129 }
130 return *this;
131}
G4String * parent_name
G4String ** daughters_name
G4String kinematics_name

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