Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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)