source: trunk/source/processes/decay/src/G4UnknownDecay.cc @ 961

Last change on this file since 961 was 961, checked in by garnier, 15 years ago

update processes

File size: 6.6 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// $Id: G4UnknownDecay.cc,v 1.6 2007/12/15 12:29:16 kurasige Exp $
28// GEANT4 tag $Name: geant4-09-02-ref-02 $
29//
30//
31// --------------------------------------------------------------
32//      GEANT 4 class implementation file
33//
34// ------------------------------------------------------------
35//
36
37#include "G4UnknownDecay.hh"
38#include "G4DynamicParticle.hh"
39#include "G4DecayProducts.hh"
40#include "G4PhysicsLogVector.hh"
41#include "G4ParticleChangeForDecay.hh"
42#include "G4DecayProcessType.hh"
43
44
45// constructor
46G4UnknownDecay::G4UnknownDecay(const G4String& processName)
47                               :G4VDiscreteProcess(processName, fDecay),
48                                verboseLevel(1),
49                                HighestValue(20.0)
50{
51  // set Process Sub Type
52  SetProcessSubType(static_cast<int>(DECAY_Unknown));
53
54#ifdef G4VERBOSE
55  if (GetVerboseLevel()>1) {
56    G4cout << "G4UnknownDecay  constructor " << "  Name:" << processName << G4endl;
57  }
58#endif
59  pParticleChange = &fParticleChangeForDecay;
60}
61
62G4UnknownDecay::~G4UnknownDecay()
63{
64}
65
66G4bool G4UnknownDecay::IsApplicable(const G4ParticleDefinition& aParticleType)
67{
68  if(aParticleType.GetParticleName()=="unknown") return true;
69  return false;
70}
71
72G4double G4UnknownDecay::GetMeanFreePath(const G4Track& /*aTrack*/,G4double, G4ForceCondition*)
73{
74   return  DBL_MIN;
75}
76
77void G4UnknownDecay::BuildPhysicsTable(const G4ParticleDefinition&)
78{
79  return;
80}
81
82G4VParticleChange* G4UnknownDecay::DecayIt(const G4Track& aTrack, const G4Step& )
83{
84  // The DecayIt() method returns by pointer a particle-change object.
85  // Units are expressed in GEANT4 internal units.
86
87  //   Initialize ParticleChange
88  //     all members of G4VParticleChange are set to equal to
89  //     corresponding member in G4Track
90  fParticleChangeForDecay.Initialize(aTrack);
91
92  // get particle
93  const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
94
95  //check if thePreAssignedDecayProducts exists
96  const G4DecayProducts* o_products = (aParticle->GetPreAssignedDecayProducts());
97  G4bool isPreAssigned = (o_products != 0);   
98  G4DecayProducts* products = 0;
99
100  if (!isPreAssigned ){
101    fParticleChangeForDecay.SetNumberOfSecondaries(0);
102    // Kill the parent particle
103    fParticleChangeForDecay.ProposeTrackStatus( fStopAndKill ) ;
104    fParticleChangeForDecay.ProposeLocalEnergyDeposit(0.0); 
105   
106    ClearNumberOfInteractionLengthLeft();
107    return &fParticleChangeForDecay ;
108  }
109
110  // copy decay products
111  products = new G4DecayProducts(*o_products); 
112 
113  // get parent particle information ...................................
114  G4double   ParentEnergy  = aParticle->GetTotalEnergy();
115  G4double   ParentMass    = aParticle->GetMass();
116  if (ParentEnergy < ParentMass) {
117    ParentEnergy = ParentMass;
118#ifdef G4VERBOSE
119    if (GetVerboseLevel()>1) {
120      G4cout << "G4UnknownDecay::DoIt  : Total Energy is less than its mass" << G4endl;
121      G4cout << " Particle: " << aParticle->GetDefinition()->GetParticleName();
122      G4cout << " Energy:"    << ParentEnergy/MeV << "[MeV]";
123      G4cout << " Mass:"    << ParentMass/MeV << "[MeV]";
124      G4cout << G4endl;
125    }
126#endif
127  }
128  G4ThreeVector ParentDirection(aParticle->GetMomentumDirection());
129
130  G4double energyDeposit = 0.0;
131  G4double finalGlobalTime = aTrack.GetGlobalTime();
132  //boost all decay products to laboratory frame
133  //if the particle has traveled
134  if(aParticle->GetPreAssignedDecayProperTime()>0.) {
135    products->Boost( ParentEnergy, ParentDirection);
136  }
137
138  //add products in fParticleChangeForDecay
139  G4int numberOfSecondaries = products->entries();
140  fParticleChangeForDecay.SetNumberOfSecondaries(numberOfSecondaries);
141#ifdef G4VERBOSE
142  if (GetVerboseLevel()>1) {
143    G4cout << "G4UnknownDecay::DoIt  : Decay vertex :";
144    G4cout << " Time: " << finalGlobalTime/ns << "[ns]";
145    G4cout << " X:" << (aTrack.GetPosition()).x() /cm << "[cm]";
146    G4cout << " Y:" << (aTrack.GetPosition()).y() /cm << "[cm]";
147    G4cout << " Z:" << (aTrack.GetPosition()).z() /cm << "[cm]";
148    G4cout << G4endl;
149    G4cout << "G4UnknownDecay::DoIt  : decay products in Lab. Frame" << G4endl;
150    products->DumpInfo();
151  }
152#endif
153  G4int index;
154  G4ThreeVector currentPosition;
155  const G4TouchableHandle thand = aTrack.GetTouchableHandle();
156  for (index=0; index < numberOfSecondaries; index++)
157  {
158     // get current position of the track
159     currentPosition = aTrack.GetPosition();
160     // create a new track object
161     G4Track* secondary = new G4Track( products->PopProducts(),
162                                      finalGlobalTime ,
163                                      currentPosition );
164     // switch on good for tracking flag
165     secondary->SetGoodForTrackingFlag();
166     secondary->SetTouchableHandle(thand);
167     // add the secondary track in the List
168     fParticleChangeForDecay.AddSecondary(secondary);
169  }
170  delete products;
171
172  // Kill the parent particle
173  fParticleChangeForDecay.ProposeTrackStatus( fStopAndKill ) ;
174  fParticleChangeForDecay.ProposeLocalEnergyDeposit(energyDeposit); 
175  fParticleChangeForDecay.ProposeGlobalTime( finalGlobalTime );
176  // reset NumberOfInteractionLengthLeft
177  ClearNumberOfInteractionLengthLeft();
178
179  return &fParticleChangeForDecay ;
180} 
181
182
183
184
185
186
Note: See TracBrowser for help on using the repository browser.