Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4QMDNucleus.cc
Go to the documentation of this file.
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 // 081024 G4NucleiPropertiesTable:: to G4NucleiProperties::
27 //
28 #include <numeric>
29 
30 #include "G4QMDNucleus.hh"
31 #include "G4SystemOfUnits.hh"
32 #include "G4Proton.hh"
33 #include "G4Neutron.hh"
34 #include "G4NucleiProperties.hh"
35 
37 {
39  hbc = parameters->Get_hbc();
40 }
41 
42 
43 
45 {
46  ;
47 }
48 
49 
51 {
52  G4LorentzVector p( 0 );
53  std::vector< G4QMDParticipant* >::iterator it;
54  for ( it = participants.begin() ; it != participants.end() ; it++ )
55  p += (*it)->Get4Momentum();
56 
57  return p;
58 }
59 
60 
61 
63 {
64 
65  G4int A = 0;
66  std::vector< G4QMDParticipant* >::iterator it;
67  for ( it = participants.begin() ; it != participants.end() ; it++ )
68  {
69  if ( (*it)->GetDefinition() == G4Proton::Proton()
70  || (*it)->GetDefinition() == G4Neutron::Neutron() )
71  A++;
72  }
73 
74  return A;
75 }
76 
77 
78 
80 {
81  G4int Z = 0;
82  std::vector< G4QMDParticipant* >::iterator it;
83  for ( it = participants.begin() ; it != participants.end() ; it++ )
84  {
85  if ( (*it)->GetDefinition() == G4Proton::Proton() )
86  Z++;
87  }
88  return Z;
89 }
90 
91 
92 
94 {
95 
97 
98  if ( mass == 0.0 )
99  {
100 
101  G4int Z = GetAtomicNumber();
102  G4int A = GetMassNumber();
103  G4int N = A - Z;
104 
105 // Weizsacker-Bethe
106 
107  G4double Av = 16*MeV;
108  G4double As = 17*MeV;
109  G4double Ac = 0.7*MeV;
110  G4double Asym = 23*MeV;
111 
112  G4double BE = Av * A
113  - As * std::pow ( G4double ( A ) , 2.0/3.0 )
114  - Ac * Z*Z/std::pow ( G4double ( A ) , 1.0/3.0 )
115  - Asym * ( N - Z )* ( N - Z ) / A;
116 
117  mass = Z * G4Proton::Proton()->GetPDGMass()
118  + N * G4Neutron::Neutron()->GetPDGMass()
119  - BE;
120 
121  }
122 
123  return mass;
124 }
125 
126 
127 
129 {
130 
131  //G4cout << "CalEnergyAndAngularMomentumInCM " << this->GetAtomicNumber() << " " << GetMassNumber() << G4endl;
132 
133  G4double gamma = Get4Momentum().gamma();
134  G4ThreeVector beta = Get4Momentum().v()/ Get4Momentum().e();
135 
136  G4ThreeVector pcm0( 0.0 ) ;
137 
139  pcm.resize( n );
140 
141  for ( G4int i= 0; i < n ; i++ )
142  {
144 
145  G4double trans = gamma / ( gamma + 1.0 ) * p_i * beta;
146  pcm[i] = p_i - trans*beta;
147 
148  pcm0 += pcm[i];
149  }
150 
151  pcm0 = pcm0 / double ( n );
152 
153  //G4cout << "pcm0 " << pcm0 << G4endl;
154 
155  for ( G4int i= 0; i < n ; i++ )
156  {
157  pcm[i] += -pcm0;
158  //G4cout << "pcm " << i << " " << pcm[i] << G4endl;
159  }
160 
161 
162  G4double tmass = 0;
163  G4ThreeVector rcm0( 0.0 ) ;
164  rcm.resize( n );
165  es.resize( n );
166 
167  for ( G4int i= 0; i < n ; i++ )
168  {
170  G4double trans = gamma / ( gamma + 1.0 ) * ri * beta;
171 
172  es[i] = std::sqrt ( std::pow ( GetParticipant( i )->GetMass() , 2 ) + pcm[i]*pcm[i] );
173 
174  rcm[i] = ri + trans*beta;
175 
176  rcm0 += rcm[i]*es[i];
177 
178  tmass += es[i];
179  }
180 
181  rcm0 = rcm0/tmass;
182 
183  for ( G4int i= 0; i < n ; i++ )
184  {
185  rcm[i] += -rcm0;
186  //G4cout << "rcm " << i << " " << rcm[i] << G4endl;
187  }
188 
189 // Angluar momentum
190 
191  G4ThreeVector rl ( 0.0 );
192  for ( G4int i= 0; i < n ; i++ )
193  {
194  rl += rcm[i].cross ( pcm[i] );
195  }
196 
197  jj = int ( std::sqrt ( rl*rl / hbc ) + 0.5 );
198 
199 
200 // kinetic energy per nucleon in CM
201 
202  G4double totalMass = 0.0;
203  for ( G4int i= 0; i < n ; i++ )
204  {
205  // following two lines are equivalent
206  //totalMass += GetParticipant( i )->GetDefinition()->GetPDGMass()/GeV;
207  totalMass += GetParticipant( i )->GetMass();
208  }
209 
210  kineticEnergyPerNucleon = ( std::accumulate ( es.begin() , es.end() , 0.0 ) - totalMass )/n;
211 
212 // Total (not per nucleion ) Binding Energy
213  bindingEnergy = ( std::accumulate ( es.begin() , es.end() , 0.0 ) -totalMass ) + potentialEnergy;
214 
215  //G4cout << "KineticEnergyPerNucleon in GeV " << kineticEnergyPerNucleon << G4endl;
216  //G4cout << "KineticEnergySum in GeV " << std::accumulate ( es.begin() , es.end() , 0.0 ) - totalMass << G4endl;
217  //G4cout << "PotentialEnergy in GeV " << potentialEnergy << G4endl;
218  //G4cout << "BindingEnergy in GeV " << bindingEnergy << G4endl;
219  //G4cout << "G4BindingEnergy in GeV " << G4NucleiProperties::GetBindingEnergy( GetAtomicNumber() , GetMassNumber() )/GeV << G4endl;
220 
221  excitationEnergy = bindingEnergy + G4NucleiProperties::GetBindingEnergy( GetMassNumber() , GetAtomicNumber() )/GeV;
222  //G4cout << "excitationEnergy in GeV " << excitationEnergy << G4endl;
223  if ( excitationEnergy < 0 ) excitationEnergy = 0.0;
224 
225 }