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
G4ExcitedString.hh
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//
28
29#ifndef G4ExcitedString_h
30#define G4ExcitedString_h 1
31
32// ------------------------------------------------------------
33// GEANT 4 class header file
34//
35// ---------------- G4ExcitedString ----------------
36// by Gunter Folger, June 1998.
37// class for an excited string used by Parton String Models
38// ------------------------------------------------------------
39
40#include "G4ios.hh"
41#include "globals.hh"
42#include "G4ThreeVector.hh"
43#include "G4LorentzVector.hh"
44#include "G4LorentzRotation.hh"
45#include "G4Parton.hh"
46#include "G4PartonVector.hh"
47#include "G4KineticTrack.hh"
49#include <algorithm>
50
52{
53
54 public:
55
56 enum {
58 TARGET = -1
59 };
60
61 G4ExcitedString(G4Parton* Color, G4Parton* Gluon, G4Parton* AntiColor, G4int Direction=PROJECTILE);
62 G4ExcitedString(G4Parton* Color, G4Parton* AntiColor, G4int Direction=PROJECTILE);
64
65
67
68private:
69 G4ExcitedString(const G4ExcitedString &right);
70 G4ExcitedString& operator= (const G4ExcitedString &right);
71
72public:
73 G4bool operator==(const G4ExcitedString &right) const;
74 G4bool operator!=(const G4ExcitedString &right) const;
75
76public:
78
79 void SetTimeOfCreation(G4double aTime);
80
81 const G4ThreeVector & GetPosition() const;
82
83 void SetPosition(const G4ThreeVector &aPosition);
84
85 const G4PartonVector * GetPartonList() const;
86
88 void LorentzRotate(const G4LorentzRotation & rotation);
89
90 void InsertParton(G4Parton * aParton, const G4Parton * addafter = NULL);
91
94
95
96 void Boost(G4ThreeVector& Velocity);
97
98 G4Parton* GetColorParton(void) const;
99 G4Parton* GetGluon(void) const;
100 G4Parton* GetAntiColorParton(void) const;
101 G4Parton* GetGluon(G4int GluonPos) const;
102
104
105 G4Parton* GetLeftParton(void) const;
106 G4Parton* GetRightParton(void) const;
107
108 G4bool IsItKinkyString(void) const;
109 G4int GetDirection(void) const;
110
111 G4bool IsExcited() const;
112
113
114 private:
115
116 G4int theDirection; // must be 1 or -1 (PROJECTILE or TARGET)
117 G4double theTimeOfCreation;
118 G4ThreeVector thePosition;
119 G4PartonVector thePartons; // would like initial capacity for 3 Partons.
120 G4KineticTrack* theTrack;
121
122};
123
124inline
126{
127 return this == &right;
128}
129
130inline
132{
133 return this != &right;
134}
135
136inline
138{
139 return theTimeOfCreation;
140}
141
142inline
144{
145 theTimeOfCreation=aTime;
146}
147
148inline
150{
151 return thePosition;
152}
153
154inline
156{
157 thePosition= aPosition;
158}
159
160inline
162{
163 G4LorentzVector momentum;
164 if ( IsExcited() )
165 {
166 for ( unsigned int index=0; index < thePartons.size() ; index++ )
167 {
168 // std::cout << "HPW "<<thePartons[index]->Get4Momentum()<<std::endl;
169 momentum += thePartons[index]->Get4Momentum();
170 }
171 }
172 else
173 {
174 momentum=theTrack->Get4Momentum();
175 }
176 return momentum;
177}
178
179inline
181{
182 if ( IsExcited() )
183 {
184 for ( unsigned int index=0; index < thePartons.size() ; index++ )
185 {
186 thePartons[index]->Set4Momentum(rotation*thePartons[index]->Get4Momentum());
187 }
188 }
189 else
190 {
191 theTrack->Set4Momentum(rotation*theTrack->Get4Momentum());
192 }
193}
194
195inline
196void G4ExcitedString::InsertParton(G4Parton *aParton, const G4Parton * addafter)
197{
198
199 G4PartonVector::iterator insert_index;
200
201 if ( addafter != NULL )
202 {
203 insert_index=std::find(thePartons.begin(), thePartons.end(), addafter);
204 if ( insert_index == thePartons.end() ) // No object addafter in thePartons
205 {
206 G4String text = "G4ExcitedString::InsertParton called with invalid second argument";
207 throw G4HadronicException(__FILE__, __LINE__, text);
208 }
209 }
210
211 thePartons.insert(insert_index+1, aParton);
212}
213
214inline
216{
217 G4LorentzVector momentum=Get4Momentum();
218 G4LorentzRotation toCms(-1*momentum.boostVector());
219
220 if ( IsExcited() )
221 {
222 for ( unsigned int index=0; index < thePartons.size() ; index++ )
223 {
224 momentum=toCms * thePartons[index]->Get4Momentum();
225 thePartons[index]->Set4Momentum(momentum);
226 }
227 }
228 else
229 {
230 momentum*=toCms;
231 theTrack->Set4Momentum(momentum);
232 }
233 return toCms;
234}
235
236inline
238{
239 G4LorentzVector momentum=Get4Momentum();
240 G4LorentzRotation toAlignedCms(-1*momentum.boostVector());
241
242 momentum= toAlignedCms* thePartons[0]->Get4Momentum();
243 toAlignedCms.rotateZ(-1*momentum.phi());
244 toAlignedCms.rotateY(-1*momentum.theta());
245
246 for ( unsigned int index=0; index < thePartons.size() ; index++ )
247 {
248 momentum=toAlignedCms * thePartons[index]->Get4Momentum();
249 thePartons[index]->Set4Momentum(momentum);
250 }
251 return toAlignedCms;
252}
253
254
255inline
257{
258 return &thePartons;
259}
260
261inline
263{
264 return theTrack;
265}
266
267inline
269{
270 return theTrack == 0;
271}
272
273
274#endif
std::vector< G4Parton * > G4PartonVector
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
HepLorentzRotation & rotateY(double delta)
HepLorentzRotation & rotateZ(double delta)
double theta() const
Hep3Vector boostVector() const
G4bool operator!=(const G4ExcitedString &right) const
G4LorentzRotation TransformToCenterOfMass()
G4Parton * GetAntiColorParton(void) const
const G4PartonVector * GetPartonList() const
G4KineticTrack * GetKineticTrack() const
void InsertParton(G4Parton *aParton, const G4Parton *addafter=NULL)
G4double GetTimeOfCreation() const
void SetPosition(const G4ThreeVector &aPosition)
const G4ThreeVector & GetPosition() const
G4int GetDirection(void) const
G4LorentzRotation TransformToAlignedCms()
void Boost(G4ThreeVector &Velocity)
G4Parton * GetGluon(void) const
G4bool operator==(const G4ExcitedString &right) const
G4Parton * GetRightParton(void) const
void SetTimeOfCreation(G4double aTime)
G4Parton * GetLeftParton(void) const
G4LorentzVector Get4Momentum() const
G4bool IsExcited() const
G4bool IsItKinkyString(void) const
G4Parton * GetColorParton(void) const
void LorentzRotate(const G4LorentzRotation &rotation)
void Set4Momentum(const G4LorentzVector &a4Momentum)
const G4LorentzVector & Get4Momentum() const