Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4LorentzConvertor.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//
27// 20100108 Michael Kelsey -- Use G4LorentzVector internally
28// 20100112 M. Kelsey -- Remove G4CascadeMomentum, use G4LorentzVector directly
29// 20100308 M. Kelsey -- Bug fix in toTheTargetRestFrame: scm_momentum should
30// be data member, not local.
31// 20100409 M. Kelsey -- Protect std::sqrt(ga) against round-off negatives
32// 20100519 M. Kelsey -- Add interfaces to pass G4InuclParticles directly
33// 20100617 M. Kelsey -- Add more diagnostic messages with multiple levels
34// 20100713 M. Kelsey -- All diagnostic messages should be verbose > 1
35// 20110525 M. Kelsey -- Add some diagnostic messages in both ::rotate()
36// 20110602 M. Kelsey -- Simplify some kinematics, dropping intermediate calcs
37
38#include "G4LorentzConvertor.hh"
39#include "G4ThreeVector.hh"
41#include "G4InuclParticle.hh"
42
43
44const G4double G4LorentzConvertor::small = 1.0e-10;
45
47 : verboseLevel(0), v2(0.), ecm_tot(0.), valong(0.), degenerated(false) {}
48
51 const G4LorentzVector& tmom, G4double tmass)
52 : verboseLevel(0), v2(0.), ecm_tot(0.), valong(0.), degenerated(false) {
53 setBullet(bmom, bmass);
54 setTarget(tmom, tmass);
55}
56
59 const G4InuclParticle* target)
60 : verboseLevel(0), v2(0.), ecm_tot(0.), valong(0.), degenerated(false) {
61 setBullet(bullet);
62 setTarget(target);
63}
64
65// Extract four-vectors from input particles
67 setBullet(bullet->getMomentum());
68}
69
71 setTarget(target->getMomentum());
72}
73
74
75// Boost bullet and target four-vectors into desired frame
76
78 if (verboseLevel > 2)
79 G4cout << " >>> G4LorentzConvertor::toTheCenterOfMass" << G4endl;
80
81 velocity = (target_mom+bullet_mom).boostVector();
82 if (verboseLevel > 3) G4cout << " boost " << velocity << G4endl;
83
84 // "SCM" is reverse target momentum in the CM frame
85 scm_momentum = target_mom;
86 scm_momentum.boost(-velocity);
87 scm_momentum.setVect(-scm_momentum.vect());
88
89 if (verboseLevel > 3) G4cout << " pscm " << scm_momentum.vect() << G4endl;
90
92}
93
95 if (verboseLevel > 2)
96 G4cout << " >>> G4LorentzConvertor::toTheTargetRestFrame" << G4endl;
97
98 velocity = target_mom.boostVector();
99 if (verboseLevel > 3) G4cout << " boost " << velocity << G4endl;
100
101 // "SCM" is bullet momentum in the target's frame
102 scm_momentum = bullet_mom;
103 scm_momentum.boost(-velocity);
104
105 if (verboseLevel > 3) G4cout << " pseudo-pscm " << scm_momentum.vect() << G4endl;
106
108}
109
110// Compute kinematic quantities for rotate() functions
111
113 ecm_tot = (target_mom+bullet_mom).m();
114
115 scm_direction = scm_momentum.vect().unit();
116 valong = velocity.dot(scm_direction);
117
118 v2 = velocity.mag2();
119
120 G4double pvsq = v2 - valong*valong; // velocity perp to scm_momentum
121 if (verboseLevel > 3) G4cout << " pvsq " << pvsq << G4endl;
122
123 degenerated = (pvsq < small);
124 if (degenerated && verboseLevel > 2)
125 G4cout << " degenerated case (already along Z) " << G4endl;
126
127 if (verboseLevel > 3) {
128 G4cout << " v2 " << v2 << " valong " << valong
129 << " valong*valong " << valong*valong << G4endl;
130 }
131}
132
135 if (verboseLevel > 2)
136 G4cout << " >>> G4LorentzConvertor::backToTheLab" << G4endl;
137
138 if (verboseLevel > 3)
139 G4cout << " at rest: px " << mom.x() << " py " << mom.y() << " pz "
140 << mom.z() << " e " << mom.e() << G4endl
141 << " v2 " << v2 << G4endl;
142
143 G4LorentzVector mom1 = mom;
144 if (v2 > small) mom1.boost(velocity);
145
146 if (verboseLevel > 3)
147 G4cout << " at lab: px " << mom1.x() << " py " << mom1.y() << " pz "
148 << mom1.z() << G4endl;
149
150 return mom1;
151}
152
153
154// Bullet kinematics in target rest frame (LAB frame, usually)
155
157 if (verboseLevel > 2)
158 G4cout << " >>> G4LorentzConvertor::getKinEnergyInTheTRS" << G4endl;
159
160 G4LorentzVector bmom = bullet_mom;
161 bmom.boost(-target_mom.boostVector());
162 return bmom.e()-bmom.m();
163}
164
166 if (verboseLevel > 2)
167 G4cout << " >>> G4LorentzConvertor::getTRSMomentum" << G4endl;
168
169 G4LorentzVector bmom = bullet_mom;
170 bmom.boost(-target_mom.boostVector());
171 return bmom.rho();
172}
173
175 if (verboseLevel > 2)
176 G4cout << " >>> G4LorentzConvertor::rotate(G4LorentzVector)" << G4endl;
177
178 if (verboseLevel > 3) {
179 G4cout << " valong " << valong << " degenerated " << degenerated << G4endl
180 << " before rotation: px " << mom.x() << " py " << mom.y()
181 << " pz " << mom.z() << G4endl;
182 }
183
184 G4LorentzVector mom_rot = mom;
185 if (!degenerated) {
186 if (verboseLevel > 2)
187 G4cout << " rotating to align with reference z axis " << G4endl;
188
189 G4ThreeVector vscm = velocity - valong*scm_direction;
190 G4ThreeVector vxcm = scm_direction.cross(velocity);
191
192 if (vscm.mag() > small && vxcm.mag() > small) { // Double check
193 if (verboseLevel > 3) {
194 G4cout << " reference z axis " << scm_direction
195 << " vscm " << vscm << " vxcm " << vxcm << G4endl;
196 }
197
198 mom_rot.setVect(mom.x()*vscm.unit() + mom.y()*vxcm.unit() +
199 mom.z()*scm_direction);
200 } else {
201 if (verboseLevel)
202 G4cerr << ">>> G4LorentzVector::rotate zero with !degenerated" << G4endl;
203 }
204 }
205
206 if (verboseLevel > 3) {
207 G4cout << " after rotation: px " << mom_rot.x() << " py " << mom_rot.y()
208 << " pz " << mom_rot.z() << G4endl;
209 }
210
211 return mom_rot;
212}
213
215 const G4LorentzVector& mom) const {
216 if (verboseLevel > 2)
217 G4cout << " >>> G4LorentzConvertor::rotate(G4LorentzVector,G4LorentzVector)"
218 << G4endl;
219
220 if (verboseLevel > 3) {
221 G4cout << " before rotation: px " << mom.x() << " py " << mom.y()
222 << " pz " << mom.z() << G4endl;
223 }
224
225 G4ThreeVector mom1_dir = mom1.vect().unit();
226 G4double pv = velocity.dot(mom1_dir);
227
228 G4double vperp = v2 - pv*pv; // velocity perpendicular to mom1
229 if (verboseLevel > 3) {
230 G4cout << " vperp " << vperp << " small? " << (vperp <= small) << G4endl;
231 }
232
233 G4LorentzVector mom_rot = mom;
234
235 if (vperp > small) {
236 if (verboseLevel > 2)
237 G4cout << " rotating to align with first z axis " << G4endl;
238
239 G4ThreeVector vmom1 = velocity - pv*mom1_dir;
240 G4ThreeVector vxm1 = mom1_dir.cross(velocity);
241
242 if (vmom1.mag() > small && vxm1.mag() > small) { // Double check
243 if (verboseLevel > 3) {
244 G4cout << " first z axis " << mom1_dir << G4endl
245 << " vmom1 " << vmom1 << " vxm1 " << vxm1 << G4endl;
246 }
247
248 mom_rot.setVect(mom.x()*vmom1.unit() + mom.y()*vxm1.unit() +
249 mom.z()*mom1_dir );
250 } else {
251 if (verboseLevel)
252 G4cerr << ">>> G4LorentzVector::rotate zero with !degenerated" << G4endl;
253 }
254 }
255
256 if (verboseLevel > 3) {
257 G4cout << " after rotation: px " << mom_rot.x() << " py " << mom_rot.y()
258 << " pz " << mom_rot.z() << G4endl;
259 }
260
261 return mom_rot;
262}
263
265 if (verboseLevel > 2)
266 G4cout << " >>> G4LorentzConvertor::reflectionNeeded (query)" << G4endl;
267
268 if (verboseLevel > 3) {
269 G4cout << " v2 = " << v2 << " SCM z = " << scm_momentum.z()
270 << " degenerated? " << degenerated << G4endl;
271 }
272
273 if (v2 < small && !degenerated)
274 throw G4HadronicException(__FILE__, __LINE__, "G4LorentzConvertor::reflectionNeeded - return value undefined");
275
276 if (verboseLevel > 2) {
277 G4cout << " reflection across XY is"
278 << ((v2>=small && (!degenerated || scm_momentum.z()<0.0))?"":" NOT")
279 << " needed" << G4endl;
280 }
281
282 return (v2>=small && (!degenerated || scm_momentum.z()<0.0));
283}
284
285
286// Reporting functions for diagnostics
287
289 G4cout << " G4LC bullet: px " << bullet_mom.px() << " py " << bullet_mom.py()
290 << " pz " << bullet_mom.pz() << " e " << bullet_mom.e()
291 << " mass " << bullet_mom.m() << G4endl;
292 }
293
295 G4cout << " G4LC target: px " << target_mom.px() << " py " << target_mom.py()
296 << " pz " << target_mom.pz() << " e " << target_mom.e()
297 << " mass " << target_mom.m() << G4endl;
298}
299
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
Hep3Vector unit() const
double mag2() const
Hep3Vector cross(const Hep3Vector &) const
double dot(const Hep3Vector &) const
double mag() const
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
Hep3Vector vect() const
void setVect(const Hep3Vector &)
G4LorentzVector getMomentum() const
G4double getTRSMomentum() const
G4bool reflectionNeeded() const
void setBullet(const G4InuclParticle *bullet)
G4LorentzVector backToTheLab(const G4LorentzVector &mom) const
G4LorentzVector rotate(const G4LorentzVector &mom) const
G4double getKinEnergyInTheTRS() const
void setTarget(const G4InuclParticle *target)