Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
G4MuonicAtomDecay.cc
이 파일의 문서화 페이지로 가기
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 // $Id: G4MuonicAtomDecay.cc 94351 2015-11-12 15:35:32Z gcosmo $
27 //
28 //---------------------------------------------------------------------
29 //
30 // GEANT4 Class
31 //
32 // File name: G4MuonicAtomDecay
33 //
34 // 20170522 K L Genser first implementation based on code by
35 // V.Ivantchenko & G4HadronicProcess & G4Decay
36 //
37 // Class Description:
38 //
39 // MuonicAtom Process where Muon either decays in orbit or is captured by the nucleus
40 //
41 // Modifications:
42 //
43 //
44 //------------------------------------------------------------------------
45 
46 #include "G4MuonicAtomDecay.hh"
48 #include "G4HadronicProcessType.hh"
49 #include "G4Nucleus.hh"
50 #include "G4ProcessManager.hh"
51 #include "G4HadFinalState.hh"
52 #include "G4HadProjectile.hh"
53 #include "G4HadSecondary.hh"
54 #include "G4ForceCondition.hh"
55 #include "G4MuonicAtom.hh"
56 #include "G4MuonicAtomHelper.hh"
57 #include "G4VDecayChannel.hh"
58 #include "G4DecayTable.hh"
59 #include "G4DecayProducts.hh"
60 #include "G4CascadeInterface.hh"
62 #include "G4RandomDirection.hh"
63 #include "G4PhysicalConstants.hh"
64 #include "G4SystemOfUnits.hh"
65 
66 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
67 
69  const G4String& name)
71  fMuMass(G4MuonMinus::MuonMinus()->GetPDGMass()),
72  cmptr(hiptr),
73  verboseLevel(0)
74 {
75  // This is not a hadronic process; assume it is a kind of decay
76  enableAtRestDoIt = true;
77  enablePostStepDoIt = true; // it is a streach; fixme
78  theProcessSubType = 221; // (see G4DecayProcessType.hh) fixme
79  if (!cmptr) {
80  // cmptr = new G4CascadeInterface(); // Bertini - Pointer owned by InteractionRegistry
81  cmptr = new G4MuMinusCapturePrecompound(); // Precompound
82  }
83 }
84 
85 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
86 
88 //{delete theTotalResult;}
89 {}
90 
91 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
92 
94 {
95  return ( a.GetParticleType() == "MuonicAtom" );
96 }
97 
98 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
99 
100 // void
101 // G4MuonicAtomDecay::PreparePhysicsTable(const G4ParticleDefinition& p)
102 // {
103 // G4HadronicProcessStore::Instance()->RegisterParticleForExtraProcess(this,&p);
104 // }
105 
106 // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
107 
108 // void G4MuonicAtomDecay::BuildPhysicsTable(const G4ParticleDefinition& p)
109 // {
110 // G4HadronicProcessStore::Instance()->PrintInfo(&p);
111 // }
112 
113 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
114 
116  const G4Track& aTrack, G4ForceCondition* condition)
117 {
118  *condition = NotForced;
119  // check if this is the beginning of tracking
122  }
123  return theNumberOfInteractionLengthLeft*GetMeanLifeTime(aTrack, condition);
124 }
125 
126 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
127 
130 {
131  *condition = NotForced;
132  return DBL_MAX; // this will need to be changed in future; fixme
133 }
134 
135 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
136 
139 {
140  const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
141  G4ParticleDefinition* aParticleDef = aParticle->GetDefinition();
142  G4MuonicAtom* muatom = static_cast<G4MuonicAtom*>(aParticleDef);
143  G4double meanlife = muatom->GetPDGLifeTime();
144 #ifdef G4VERBOSE
145  if (GetVerboseLevel()>1) {
146  G4cout << "mean life time: "<< meanlife/ns << "[ns]" << G4endl;
147  }
148 #endif
149  return meanlife;
150 }
151 
152 
154  const G4Step&)
155 {
156 
157  // mainly based on G4HadronStoppingProcess & G4Decay
158  // if primary is not Alive then do nothing
159  theTotalResult.Clear(); // G4ParticleChange*
160  theTotalResult.Initialize(aTrack);
162  if(aTrack.GetTrackStatus() != fAlive &&
163  aTrack.GetTrackStatus() != fStopButAlive) {
164  return &theTotalResult;
165  }
166 
167  const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
168  const G4ParticleDefinition* aParticleDef = aParticle->GetDefinition();
169  G4MuonicAtom const* muatom = static_cast<G4MuonicAtom const*>(aParticleDef);
170  G4Ions const* baseion = muatom->GetBaseIon();
171  G4int Z = baseion->GetAtomicNumber();
172  G4double Zd = Z;
173  G4double KEnergy = G4MuonicAtomHelper::GetKShellEnergy(Zd); // fixme check
174  G4HadProjectile thePro(aTrack); // G4HadProjectile, here the muonic atom
175  thePro.SetBoundEnergy(KEnergy);
176 
177  G4ForceCondition* condition = nullptr; // it is unused in the following call anyway
178  G4double meanlife = GetMeanLifeTime(aTrack, condition);
179 
180  G4HadFinalState* result = nullptr; // result before converting to G4VParticleChange*
181  // G4int nSecondaries = 0;
182  // save track time and start from zero time
183  // G4double time0 = aTrack.GetGlobalTime(); FillResult does it
184  // see G4Decay DecayIt
185  // see time0 down below
186  thePro.SetGlobalTime(0.0);
187 
188  // do we need G4double fRemainderLifeTime; ???
189 
190  G4double maDTime = theNumberOfInteractionLengthLeft*meanlife; //fixme check
191 #ifdef G4VERBOSE
192  if (GetVerboseLevel()>1) {
193  G4cout << "G4MuonicAtomDecay::DecayIt time set to: "<< maDTime/ns << "[ns]" << G4endl;
194  }
195 #endif
196 
197  // decide on DIO or Capture
198 
199  G4double lambdac = 1./muatom->GetDIOLifeTime();
200  G4double lambdad = 1./muatom->GetNCLifeTime();
201  G4double lambda = lambdac + lambdad;
202 
203  if ( G4UniformRand()*lambda < lambdac) {
204  // if ( false ) { // force NC for testing
205 
206  // DIO
207  // result = dmptr->ApplyYourself(thePro, *nucleus); // not quite the reaction;
208  // using G4PhaseSpaceDecayChannel
209 
210 #ifdef G4VERBOSE
211  if (GetVerboseLevel()>0) {
212  G4cout << "G4MuonicAtomDecay::DecayIt: selected DIO mode" << G4endl;
213  }
214 #endif
215 
216  // decay table; we use it only for the DIO which is more of a decay
217  // code mostly copied from G4Decay
218 
219  G4DecayProducts* products = nullptr;
220  G4DecayTable *decaytable = aParticleDef->GetDecayTable();
221  G4VDecayChannel* decaychannel = nullptr;
222  G4double massParent = aParticle->GetMass();
223  decaychannel = decaytable->SelectADecayChannel(massParent);
224  if ( decaychannel ==0) {
225  // decay channel not found
227  ed << "Can not determine decay channel for "
228  << aParticleDef->GetParticleName() << G4endl
229  << " mass of dynamic particle: " << massParent/GeV << " (GEV)" << G4endl
230  << " dacay table has " << decaytable->entries() << " entries" << G4endl;
231  G4double checkedmass=massParent;
232  if (massParent < 0.) {
233  checkedmass=aParticleDef->GetPDGMass();
234  ed << "Using PDG mass ("<<checkedmass/GeV << "(GeV)) in IsOKWithParentMass" << G4endl;
235  }
236  for (G4int ic =0;ic <decaytable->entries();++ic) {
237  G4VDecayChannel * dc= decaytable->GetDecayChannel(ic);
238  ed << ic << ": BR " << dc->GetBR() << ", IsOK? "
239  << dc->IsOKWithParentMass(checkedmass)
240  << ", --> ";
241  G4int ndaughters=dc->GetNumberOfDaughters();
242  for (G4int id=0;id<ndaughters;++id) {
243  if (id>0) ed << " + "; // seperator, except for first
244  ed << dc->GetDaughterName(id);
245  }
246  ed << G4endl;
247  }
248  G4Exception("G4MuonicAtomDecay::DecayIt", "DECAY003", FatalException,ed);
249  } else {
250  // execute DecayIt()
251 #ifdef G4VERBOSE
252  G4int temp = decaychannel->GetVerboseLevel();
253  if (GetVerboseLevel()>1) {
254  G4cout << "G4MuonicAtomDecay::DecayIt : selected decay channel addr:"
255  << decaychannel <<G4endl;
256  decaychannel->SetVerboseLevel(GetVerboseLevel());
257  }
258 #endif
259  products = decaychannel->DecayIt(aParticle->GetMass());
260 #ifdef G4VERBOSE
261  if (GetVerboseLevel()>1) {
262  decaychannel->SetVerboseLevel(temp);
263  }
264 #endif
265 #ifdef G4VERBOSE
266  if (GetVerboseLevel()>2) {
267  if (! products->IsChecked() ) products->DumpInfo();
268  }
269 #endif
270  }
271 
272  // get parent particle information ...................................
273  G4double ParentEnergy = aParticle->GetTotalEnergy();
274  G4double ParentMass = aParticle->GetMass();
275  if (ParentEnergy < ParentMass) {
276  if (GetVerboseLevel()>0) {
277  G4cout << "G4MuonicAtomDecay::DecayIt : Total Energy is less than its mass" << G4endl;
278  G4cout << " Particle: " << aParticle->GetDefinition()->GetParticleName();
279  G4cout << " Energy:" << ParentEnergy/MeV << "[MeV]";
280  G4cout << " Mass:" << ParentMass/MeV << "[MeV]";
281  G4cout << G4endl;
282  }
283  G4Exception( "G4MuonicAtomDecay::DecayIt ",
284  "DECAY102",JustWarning,
285  "Total Energy is less than its mass");
286  ParentEnergy = ParentMass;
287  }
288 
289  G4ThreeVector ParentDirection(aParticle->GetMomentumDirection());
290 
291  //boost all decay products to laboratory frame
292  G4double energyDeposit = 0.0;
293  G4double finalGlobalTime = aTrack.GetGlobalTime();
294  G4double finalLocalTime = aTrack.GetLocalTime();
295  if (aTrack.GetTrackStatus() == fStopButAlive ){
296  // AtRest case
297  finalGlobalTime += maDTime;
298  finalLocalTime += maDTime;
299  energyDeposit += aParticle->GetKineticEnergy();
300  } else {
301  // PostStep case
302  products->Boost( ParentEnergy, ParentDirection);
303  }
304  // G4ParticleChangeForDecay fParticleChangeForDecay; // is it equivalent to G4ParticleChange* theTotalResult;
305 
306  //add products in theTotalResult
307  G4int numberOfSecondaries = products->entries();
308  theTotalResult.SetNumberOfSecondaries(numberOfSecondaries);
309 #ifdef G4VERBOSE
310  if (GetVerboseLevel()>1) {
311  G4cout << "G4MuonicAtomDecay::DecayIt : Decay vertex :";
312  G4cout << " Time: " << finalGlobalTime/ns << "[ns]";
313  G4cout << " X:" << (aTrack.GetPosition()).x() /cm << "[cm]";
314  G4cout << " Y:" << (aTrack.GetPosition()).y() /cm << "[cm]";
315  G4cout << " Z:" << (aTrack.GetPosition()).z() /cm << "[cm]";
316  G4cout << G4endl;
317  G4cout << "G4MuonicAtomDecay::DecayIt : decay products in Lab. Frame" << G4endl;
318  products->DumpInfo();
319  }
320 #endif
321  G4int index;
322  G4ThreeVector currentPosition;
323  const G4TouchableHandle thand = aTrack.GetTouchableHandle();
324  for (index=0; index < numberOfSecondaries; index++)
325  {
326  // get current position of the track
327  currentPosition = aTrack.GetPosition();
328  // create a new track object
329  G4Track* secondary = new G4Track( products->PopProducts(),
330  finalGlobalTime ,
331  currentPosition );
332  // switch on good for tracking flag
333  secondary->SetGoodForTrackingFlag();
334  secondary->SetTouchableHandle(thand);
335  // add the secondary track in the List
336  theTotalResult.AddSecondary(secondary);
337  }
338  delete products;
339 
340  // Kill the parent particle
343  theTotalResult.ProposeLocalTime( finalLocalTime );
344 
345  // Clear NumberOfInteractionLengthLeft
347 
348  return &theTotalResult ;
349 
350  } else { //either or
351 
352  // nuclearCapture
353 
354  // model
355  // need to be able to choose between preco or bertini; no good way to do it?
356  // hardcoded in the constructor for now
357 
358 #ifdef G4VERBOSE
359  if (GetVerboseLevel()>0) {
360  G4cout << "G4MuonicAtomDecay::DecayIt: selected NC mode" << G4endl;
361  }
362 #endif
363 
364  G4int A = baseion->GetAtomicMass();
365  // G4Nucleus* nucleus = GetTargetNucleusPointer(); // from G4HadronicProcess
366  G4Nucleus nucleus;
367  nucleus.SetParameters(A, Z);
368 
369  // we define a local projectile here which will be the orbiting muon
370  // we shall assume it is at rest; fixme
371 
372  // G4HadProjectile, here the muon
374  G4ThreeVector(0.,0.,0.)));
375  theMuPro.SetBoundEnergy(KEnergy);
376  theMuPro.SetGlobalTime(0.0);
377 
378  G4int reentryCount = 0; // this may be in the model already; check fixme <---
379  do {
380  // sample final state
381  // nuclear interaction should keep G4HadFinalState object
382  // model should define time of each secondary particle
383  try {
384  result = cmptr->ApplyYourself(theMuPro, nucleus); // muon and muonic atom nucleus
385  ++reentryCount;
386  }
387  catch(G4HadronicException & aR) {
389  ed << "Call for " << cmptr->GetModelName() << G4endl;
390  ed << " Z= "
391  << nucleus.GetZ_asInt()
392  << " A= " << nucleus.GetA_asInt() << G4endl;
393  DumpState(aTrack,"ApplyYourself",ed);
394  ed << " ApplyYourself failed" << G4endl;
395  G4Exception("G4MuonicAtomDecay::DecayIt", "HAD_MAD_101",
396  FatalException, ed);
397  }
398 
399  // Check the result for catastrophic energy non-conservation
400  // result = CheckResult(theMuPro, nucleus, result);
401 
402  if(reentryCount>100) {
404  ed << "Call for " << cmptr->GetModelName() << G4endl;
405  ed << " Z= "
406  << nucleus.GetZ_asInt()
407  << " A= " << nucleus.GetA_asInt() << G4endl;
408  DumpState(aTrack,"ApplyYourself",ed);
409  ed << " ApplyYourself does not completed after 100 attempts" << G4endl;
410  G4Exception("G4MuonicAtomDecay::DecayIt", "HAD_MAD_102",
411  FatalException, ed);
412  }
413  // Loop checking, 06-Aug-2015, Vladimir Ivanchenko
414  } while(!result);
415 
416  // add delay time of capture (inter + intra)
417  G4int nsec = result->GetNumberOfSecondaries();
418  for(G4int i=0; i<nsec; ++i) {
419  G4HadSecondary* sec = result->GetSecondary(i);
420  G4double ctime = sec->GetTime();
421  sec->SetTime(maDTime + ctime); // we add time0 in the next stage
422 #ifdef G4VERBOSE
423  if (GetVerboseLevel()>1) {
424  G4cout << "G4MuonicAtomDecay::DecayIt time set to: "
425  << (maDTime + ctime)/ns << "[ns]" << G4endl;
426  }
427 #endif
428  }
429 
430  FillResult(result,aTrack);
431 
432  // delete result;// causes bad free check fixme; move to the class members?
433 
435  return &theTotalResult;
436 
437  }
438 
439 
440 }
441 
442 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
443 
444 void G4MuonicAtomDecay::ProcessDescription(std::ostream& outFile) const
445 {
446  outFile << "MuonicAtom process where Muon decays in orbit or is captured by the nucleus." <<G4endl;
447 }
448 
449 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
450 
452 {
453  // based on G4HadronicProcess::FillResult
454 
456 
457  G4double rotation = CLHEP::twopi*G4UniformRand();
458  G4ThreeVector it(0., 0., 1.);
459 
460  G4double efinal = aR->GetEnergyChange();
461  if(efinal < 0.0) { efinal = 0.0; }
462 
463  // check status of primary
464  if(aR->GetStatusChange() == stopAndKill) {
467 
468  // check its final energy
469  } else if(0.0 == efinal) {
472  ->GetAtRestProcessVector()->size() > 0)
474  else { theTotalResult.ProposeTrackStatus(fStopAndKill); } // check fixme
475 
476  // primary is not killed apply rotation and Lorentz transformation
477  } else {
480  G4double newE = efinal + mass;
481  G4double newP = std::sqrt(efinal*(efinal + 2*mass));
482  G4ThreeVector newPV = newP*aR->GetMomentumChange();
483  G4LorentzVector newP4(newE, newPV);
484  newP4.rotate(rotation, it);
485  newP4 *= aR->GetTrafoToLab();
487  newE = newP4.e() - mass;
488 #ifdef G4VERBOSE
489  if (GetVerboseLevel()>1 && newE <= 0.0) {
491  DumpState(aT,"Primary has zero energy after interaction",ed);
492  G4Exception("G4MuonicAtomDecay::FillResults", "HAD_MAD_103", JustWarning, ed);
493  }
494 #endif
495  if(newE < 0.0) { newE = 0.0; }
497  }
498  //G4cout << "FillResult: Efinal= " << efinal << " status= "
499  // << theTotalResult.GetTrackStatus()
500  // << " fKill= " << fStopAndKill << G4endl;
501 
502  // check secondaries: apply rotation and Lorentz transformation
503  G4int nSec = aR->GetNumberOfSecondaries();
505  G4double weight = aT.GetWeight();
506 
507  if (nSec > 0) {
508  G4double time0 = aT.GetGlobalTime();
509  for (G4int i = 0; i < nSec; ++i) {
511  theM.rotate(rotation, it);
512  theM *= aR->GetTrafoToLab();
513  aR->GetSecondary(i)->GetParticle()->Set4Momentum(theM);
514 
515  // time of interaction starts from zero
516  G4double time = aR->GetSecondary(i)->GetTime();
517  if (time < 0.0) { time = 0.0; }
518 
519  // take into account global time
520  time += time0;
521 
522  G4Track* track = new G4Track(aR->GetSecondary(i)->GetParticle(),
523  time, aT.GetPosition());
525  G4double newWeight = weight*aR->GetSecondary(i)->GetWeight();
526  // G4cout << "#### ParticleDebug "
527  // <<GetProcessName()<<" "
528  //<<aR->GetSecondary(i)->GetParticle()->GetDefinition()->GetParticleName()<<" "
529  // <<aScaleFactor<<" "
530  // <<XBiasSurvivalProbability()<<" "
531  // <<XBiasSecondaryWeight()<<" "
532  // <<aT.GetWeight()<<" "
533  // <<aR->GetSecondary(i)->GetWeight()<<" "
534  // <<aR->GetSecondary(i)->GetParticle()->Get4Momentum()<<" "
535  // <<G4endl;
536  track->SetWeight(newWeight);
539 #ifdef G4VERBOSE
540  if (GetVerboseLevel()>1) {
541  G4double e = track->GetKineticEnergy();
542  if (e <= 0.0) {
544  DumpState(aT,"Secondary has zero energy",ed);
545  ed << "Secondary " << track->GetDefinition()->GetParticleName()
546  << G4endl;
547  G4Exception("G4MuonicAtomDecay::FillResults", "HAD_MAD_103",
548  JustWarning,ed);
549  }
550  }
551 #endif
552  }
553  }
554  aR->Clear();
555 }
556 
557 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
558 
560  const G4String& method,
562 {
563  ed << "Unrecoverable error in the method " << method << " of "
564  << GetProcessName() << G4endl;
565  ed << "TrackID= "<< aTrack.GetTrackID() << " ParentID= "
566  << aTrack.GetParentID()
567  << " " << aTrack.GetParticleDefinition()->GetParticleName()
568  << G4endl;
569  ed << "Ekin(GeV)= " << aTrack.GetKineticEnergy()/CLHEP::GeV
570  << "; direction= " << aTrack.GetMomentumDirection() << G4endl;
571  ed << "Position(mm)= " << aTrack.GetPosition()/CLHEP::mm << ";";
572 
573  if (aTrack.GetMaterial()) {
574  ed << " material " << aTrack.GetMaterial()->GetName();
575  }
576  ed << G4endl;
577 
578  if (aTrack.GetVolume()) {
579  ed << "PhysicalVolume <" << aTrack.GetVolume()->GetName()
580  << ">" << G4endl;
581  }
582 }
583 
584 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
585 
587 {
588  // based on G4Decay::GetMeanFreePath check; fixme
589 
590  // get particle
591  const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
592  const G4ParticleDefinition* aParticleDef = aParticle->GetDefinition();
593  G4double aMass = aParticle->GetMass();
594  G4double aLife = aParticleDef->GetPDGLifeTime();
595 
596  // returns the mean free path in GEANT4 internal units
597  G4double pathlength;
598  G4double aCtau = c_light * aLife;
599 
600  // check if the particle is stable?
601  if (aParticleDef->GetPDGStable()) {
602  pathlength = DBL_MAX;
603 
604  //check if the particle has very short life time ?
605  } else if (aCtau < DBL_MIN) {
606  pathlength = DBL_MIN;
607 
608  } else {
609  //calculate the mean free path
610  // by using normalized kinetic energy (= Ekin/mass)
611  G4double rKineticEnergy = aParticle->GetKineticEnergy()/aMass;
612  const G4double HighestValue = 20.0; //
613  if ( rKineticEnergy > HighestValue) {
614  // gamma >> 1
615  pathlength = ( rKineticEnergy + 1.0)* aCtau;
616  } else if ( rKineticEnergy < DBL_MIN ) {
617  // too slow particle
618 #ifdef G4VERBOSE
619  if (GetVerboseLevel()>1) {
620  G4cout << "G4MuonicAtomDecay::GetMeanFreePath() !!particle stops!!";
621  G4cout << aParticleDef->GetParticleName() << G4endl;
622  G4cout << "KineticEnergy:" << aParticle->GetKineticEnergy()/GeV <<"[GeV]";
623  }
624 #endif
625  pathlength = DBL_MIN;
626  } else {
627  // beta <1
628  pathlength = (aParticle->GetTotalMomentum())/aMass*aCtau ;
629  }
630  }
631  return pathlength;
632 }
Float_t x
Definition: compare.C:6
G4double GetLocalTime() const
G4double GetKineticEnergy() const
const XML_Char * name
Definition: expat.h:151
G4double GetBR() const
G4double GetNCLifeTime() const
G4int GetCreatorModelType() const
G4double GetWeight() const
G4ParticleChange theTotalResult
CLHEP::Hep3Vector G4ThreeVector
virtual G4bool IsApplicable(const G4ParticleDefinition &)
G4int GetAtomicNumber() const
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:45
G4DecayTable * GetDecayTable() const
std::vector< ExP01TrackerHit * > a
Definition: ExP01Classes.hh:33
const G4ThreeVector & GetMomentumChange() const
virtual void ResetNumberOfInteractionLengthLeft()
Definition: G4VProcess.cc:96
virtual G4double PostStepGetPhysicalInteractionLength(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
static constexpr double MeV
Definition: G4SIunits.hh:214
G4double GetPDGLifeTime() const
void SetWeight(G4double aValue)
G4HadSecondary * GetSecondary(size_t i)
void ProposeWeight(G4double finalWeight)
void SetVerboseLevel(G4int value)
G4int GetNumberOfDaughters() const
void SetCreatorModelIndex(G4int idx)
#define G4endl
Definition: G4ios.hh:61
Float_t y
Definition: compare.C:6
const G4ThreeVector & GetMomentumDirection() const
Double_t z
void SetGlobalTime(G4double t)
G4HadFinalStateStatus GetStatusChange() const
const G4String & GetParticleName() const
G4int GetTrackID() const
const G4String & GetParticleType() const
static G4double GetKShellEnergy(G4double A)
const G4TouchableHandle & GetTouchableHandle() const
G4int theProcessSubType
Definition: G4VProcess.hh:343
virtual void ProcessDescription(std::ostream &outFile) const
G4bool enablePostStepDoIt
Definition: G4VProcess.hh:352
static G4MuonMinus * MuonMinus()
Definition: G4MuonMinus.cc:100
const G4ParticleDefinition * GetParticleDefinition() const
G4double condition(const G4ErrorSymMatrix &m)
G4bool IsChecked() const
G4ParticleDefinition * GetDefinition() const
G4double GetDIOLifeTime() const
G4DynamicParticle * PopProducts()
virtual G4double GetMeanLifeTime(const G4Track &aTrack, G4ForceCondition *condition)
G4double GetPDGMass() const
void Boost(G4double totalEnergy, const G4ThreeVector &momentumDirection)
void AddSecondary(G4Track *aSecondary)
G4double GetWeight() const
G4int entries() const
const G4String & GetName() const
Definition: G4Material.hh:179
Float_t Z
G4bool enableAtRestDoIt
Definition: G4VProcess.hh:350
G4HadronicInteraction * cmptr
void ProposeLocalTime(G4double t)
Definition: G4Ions.hh:51
G4int GetVerboseLevel() const
double G4double
Definition: G4Types.hh:76
bool G4bool
Definition: G4Types.hh:79
G4double GetTime() const
G4ParticleDefinition * GetDefinition() const
virtual void Initialize(const G4Track &)
virtual G4double GetMeanFreePath(const G4Track &aTrack, G4double previousStepSize, G4ForceCondition *condition)
G4VDecayChannel * GetDecayChannel(G4int index) const
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)=0
void DumpInfo() const
#define G4UniformRand()
Definition: Randomize.hh:53
G4double GetGlobalTime() const
void Set4Momentum(const G4LorentzVector &momentum)
G4LorentzVector Get4Momentum() const
double A(double temperature)
void SetTouchableHandle(const G4TouchableHandle &apValue)
const G4String & GetProcessName() const
Definition: G4VProcess.hh:411
const G4ThreeVector & GetPosition() const
Definition: G4Step.hh:76
void ProposeEnergy(G4double finalEnergy)
G4Material * GetMaterial() const
const G4ThreeVector const G4double const
G4int GetVerboseLevel() const
const G4String & GetDaughterName(G4int anIndex) const
G4int GetNumberOfSecondaries() const
G4bool GetPDGStable() const
Hep3Vector unit() const
G4double G4ParticleHPJENDLHEData::G4double result
void SetGoodForTrackingFlag(G4bool value=true)
static constexpr double twopi
Definition: SystemOfUnits.h:55
G4double GetLocalEnergyDeposit() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.hh:65
double weight
Definition: plottest35.C:25
int G4int
Definition: G4Types.hh:78
static constexpr double c_light
G4int GetA_asInt() const
Definition: G4Nucleus.hh:109
G4ProcessVector * GetAtRestProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
G4ProcessManager * GetProcessManager() const
G4VParticleChange * DecayIt(const G4Track &theTrack, const G4Step &theStep)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
#define DBL_MIN
Definition: templates.hh:75
G4DynamicParticle * GetParticle()
G4int GetAtomicMass() const
static constexpr double mm
Definition: SystemOfUnits.h:95
G4ForceCondition
void FillResult(G4HadFinalState *aR, const G4Track &aT)
G4double GetKineticEnergy() const
G4int size() const
static constexpr double cm
Definition: G4SIunits.hh:119
G4GLOB_DLL std::ostream G4cout
void ClearNumberOfInteractionLengthLeft()
Definition: G4VProcess.hh:450
virtual ~G4MuonicAtomDecay()
virtual G4DecayProducts * DecayIt(G4double parentMass=-1.0)=0
void DumpState(const G4Track &, const G4String &, G4ExceptionDescription &)
virtual G4bool IsOKWithParentMass(G4double parentMass)
Hep3Vector vect() const
G4VDecayChannel * SelectADecayChannel(G4double parentMass=-1.)
Definition: G4DecayTable.cc:85
G4double GetMass() const
G4double GetTotalMomentum() const
void SetTime(G4double aT)
G4double GetTotalEnergy() const
void SetParameters(const G4double A, const G4double Z)
Definition: G4Nucleus.cc:212
G4double theNumberOfInteractionLengthLeft
Definition: G4VProcess.hh:293
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
G4double GetEnergyChange() const
G4TrackStatus GetTrackStatus() const
const G4ThreeVector & GetMomentumDirection() const
G4Ions const * GetBaseIon() const
Definition: G4MuonicAtom.hh:94
#define DBL_MAX
Definition: templates.hh:83
void ProposeTrackStatus(G4TrackStatus status)
const G4LorentzRotation & GetTrafoToLab() const
static constexpr double GeV
void SetBoundEnergy(G4double e)
static constexpr double GeV
Definition: G4SIunits.hh:217
#define ns
Definition: xmlparse.cc:614
const G4DynamicParticle * GetDynamicParticle() const
G4MuonicAtomDecay(G4HadronicInteraction *hiptr=nullptr, const G4String &processName="MuonicAtomDecay")
G4int GetZ_asInt() const
Definition: G4Nucleus.hh:115
const G4String & GetName() const
virtual G4double AtRestGetPhysicalInteractionLength(const G4Track &, G4ForceCondition *)
G4VPhysicalVolume * GetVolume() const
G4int GetParentID() const
const G4String & GetModelName() const
HepLorentzVector & rotate(double, const Hep3Vector &)
void SetNumberOfSecondaries(G4int totSecondaries)
G4int entries() const