Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4QHadron.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 // $Id$
28 //
29 // ---------------- G4QHadron ----------------
30 // by Mikhail Kossov, Sept 1999.
31 // class header for Hadrons generated by the CHIPS Model
32 // ------------------------------------------------------
33 // Short description: In CHIPS all particles are G4QHadrons, while they
34 // can be leptons, gammas or nuclei. The G4QPDGCode makes the difference.
35 // In addition the 4-momentum is a basic value, so the mass can be
36 // different from the GS mass (e.g. for the virtual gamma).
37 // -------------------------------------------------------------------
38 
39 #ifndef G4QHadron_h
40 #define G4QHadron_h 1
41 
42 #include "globals.hh"
43 #include "G4ThreeVector.hh"
44 #include "G4LorentzVector.hh"
45 #include "Randomize.hh"
46 #include "G4QParticle.hh"
47 #include "G4QPartonVector.hh"
48 #include "G4QPartonPair.hh"
49 #include "G4LorentzRotation.hh"
50 #include <list>
51 
52 class G4QHadron
53 {
54 public:
55  // Constructors
56  G4QHadron(); // Default Constructor
57  G4QHadron(G4LorentzVector p); // Kinematical Constructor
58  G4QHadron(G4int PDGcode, G4LorentzVector p=G4LorentzVector(0.,0.,0.,0.));//CHIPS-W Hadron
59  G4QHadron(G4QPDGCode QPDG, G4LorentzVector p=G4LorentzVector(0.,0.,0.,0.));//CHIPS-W Had.
60  G4QHadron(G4QContent QC, G4LorentzVector p=G4LorentzVector(0.,0.,0.,0.));//QC C-W Hadron
61  G4QHadron(G4int PDG, G4double m, G4QContent QC); // Constructor for Chipolino or Quasmon
62  G4QHadron(G4QPDGCode QPDG, G4double m, G4QContent QC);// Constr. for Chipolino or Quasmon
63  G4QHadron(G4int PDG, G4LorentzVector p, G4QContent QC);// Constr for Chipolino or Quasmon
64  G4QHadron(G4QPDGCode QPDG, G4LorentzVector p, G4QContent QC);// Con. for Chipo or Quasmon
65  G4QHadron(G4QParticle* pPart, G4double maxM); // Constructor for Res with RANDOM mass
66  G4QHadron(const G4QHadron& right); // Copy constructor by object
67  G4QHadron(const G4QHadron* right); // Copy constructor by pointer
68  G4QHadron(const G4QHadron* right, G4int ColC, G4ThreeVector Pos, G4LorentzVector Mom);
69  virtual ~G4QHadron(); // Destructor
70  // Operators
71  const G4QHadron& operator=(const G4QHadron& right);
72  G4bool operator==(const G4QHadron& right) const;
73  G4bool operator!=(const G4QHadron& right) const;
74  // Selectors
75  G4int GetPDGCode() const; // Get PDG code of the Hadron
76  G4int GetQCode() const; // Get Q code of the Hadron
77  G4QPDGCode GetQPDG() const; // Get QPDG of the Hadron
78  G4double GetSpin() const{return .5*(GetPDGCode()%10-1);}
79  G4LorentzVector Get4Momentum() const{return theMomentum;} // Get 4-mom of Hadron
80  G4ThreeVector Get3Momentum() const{return theMomentum.vect();}// Get 3-mom ofH
81  G4double GetEnergy() const{return theMomentum.e();} // Get E of Hadron
82  G4QContent GetQC() const; // Get private quark content
83  G4double GetMass() const; // Get a mass of the Hadron
84  G4double GetMass2() const; // Get an m^2 value for the Hadron
85  G4double GetWidth() const; // Get Width of Hadron
86  G4int GetNFragments() const; // Get a#of Fragments of this Hadron
87  G4int GetCharge() const; // Get Charge of the Hadron
88  G4int GetStrangeness() const; // Get Strangeness of the Hadron
89  G4int GetBaryonNumber() const; // Get Baryon Number of the Hadron
90  const G4ThreeVector& GetPosition() const; // Get hadron coordinates
91  G4double GetBindingEnergy() {return bindE;}// Returns binding E in NucMatter
92  G4double GetFormationTime() {return formTime;} // Returns formation time
93  std::list<G4QParton*> GetColor() {return Color;} // pointer to quarks/anti-diquarks
94  std::list<G4QParton*> GetAntiColor() {return AntiColor;}//pointer to anti-quarks/diquarks
95  // Modifiers
96  void SetQPDG(const G4QPDGCode& QPDG); // Set QPDG of the Hadron
97  void SetPDGCode(const G4QPDGCode& PDG){SetQPDG(G4QPDGCode(PDG));}// Set PDGCode of Hadron
98  void Set4Momentum(const G4LorentzVector& aMom); // Set 4-mom of the Hadron
99  void SetQC(const G4QContent& newQC); // Set new private quark content
100  void SetNFragments(const G4int& nf); // Set a#of Fragments of this Hadron
101  void NegPDGCode(); // Change a sign of the PDG code
102  void MakeAntiHadron(); // Make AntiHadron of this Hadron
103  void SetPosition(const G4ThreeVector& aPosition); // Set coordinates of hadron position
104  void IncrementCollisionCount(G4int aCount) {theCollisionCount+=aCount;}// IncrTheCCounter
105  void SplitUp(); // Make QGSM String Splitting of Hadron
106  G4QPartonPair* SplitInTwoPartons(); // RandomSplit ofTheHadron in 2 partons
107  G4QParton* GetNextParton(); // Next Parton in a string
108  G4QParton* GetNextAntiParton(); // Next Anti-Parton in a string
109  void SetBindingEnergy(G4double aBindE){bindE=aBindE;}// Set Binding E in Nuclear Matter
110  void Boost(const G4LorentzVector& theBoost); // Boosts hadron's 4-Momentum using 4M
111  void Boost(const G4ThreeVector& B){theMomentum.boost(B);} // Boosts 4-Momentum using v/c
112  void LorentzRotate(const G4LorentzRotation& rotation){theMomentum=rotation*theMomentum;}
113  void SetFormationTime(G4double fT){formTime=fT;} // Defines formationTime for the Hadron
114 
115  // General
116  G4double RandomizeMass(G4QParticle* pPart, G4double maxM); // Randomize a mass value
119  G4bool CorMDecayIn2(G4double corM, G4LorentzVector& fr4Mom);// This(newMass corM)+fr4Mom
120  G4bool CorEDecayIn2(G4double corE, G4LorentzVector& fr4Mom);// This(E+=cE,P)+f(fE-=cE,fP)
122  G4double maxCost = 1., G4double minCost = -1.);
124  G4double cop);
127  G4LorentzVector& dir, G4double maxCost = 1., G4double minCost = -1.);
129  G4LorentzVector& dir, G4double cosp);
130  void Init3D(); // Initializes 3D nucleus with (Pos,4M)nucleons
131 private:
132  // Private methods
133  void DefineQC(G4int PDGCode);
134  G4QParton* BuildSeaQuark(G4bool isAntiQuark, G4int aPDGCode);
135  G4double SampleCHIPSX(G4double anXtot, G4int nSea);
136  G4double* RandomX(G4int nPart);
137  void GetValenceQuarkFlavors(G4QParton* &Part1,G4QParton* &Part2);
138  G4ThreeVector GaussianPt(G4double widthSquare, G4double maxPtSquare);
139  G4bool SplitMeson(G4int PDGcode, G4int* aEnd, G4int* bEnd);
140  G4bool SplitBaryon(G4int PDGcode, G4int* aEnd, G4int* bEnd);
141 
142 protected:
143  G4LorentzVector theMomentum; // The 4-mom of Hadron
144 
145 private:
146  // Static Parameters of QGSM Splitting
147  static G4double StrangeSuppress; // ? M.K.
148  static G4double sigmaPt; // Can be 0 ?
149  static G4double widthOfPtSquare; // ? M.K.
150  // Body
151  G4QPDGCode theQPDG; // Instance of QPDG for the Hadron
152  G4QContent valQ; // QC (@@ for Quasmon and Chipolino?)
153  G4int nFragm; // 0 - stable, N - decayed in N part's
154  // Body of Splitable Hadron and Nuclear Nucleon
155  G4ThreeVector thePosition; // Coordinates of Hadron position
156  G4int theCollisionCount; // ?
157  G4bool isSplit; // Flag, that splitting was done
158  G4bool Direction; // FALSE=target, TRUE=projectile
159  std::list<G4QParton*> Color; // container for quarks & anti-diquarks
160  std::list<G4QParton*> AntiColor; // container for anti-quarks & diquarks
161  G4double bindE; // Binding energy in nuclear matter
162  G4double formTime; // Formation time for the hadron
163 };
164 
165 typedef std::pair<G4QHadron*, G4QHadron*> G4QHadronPair;
166 
167 inline G4bool G4QHadron::operator==(const G4QHadron &rhs) const {return this==&rhs;}
168 inline G4bool G4QHadron::operator!=(const G4QHadron &rhs) const {return this!=&rhs;}
169 
170 inline G4int G4QHadron::GetPDGCode() const {return theQPDG.GetPDGCode();}
171 inline G4int G4QHadron::GetQCode() const {return theQPDG.GetQCode();}
172 inline G4QPDGCode G4QHadron::GetQPDG() const {return theQPDG;}
173 inline G4QContent G4QHadron::GetQC() const {return valQ;}
174 inline G4int G4QHadron::GetNFragments() const {return nFragm;}
175 //@@ This is an example how to make other inline selectors for the 4-Momentum of the Hadron
176 inline G4double G4QHadron::GetMass() const {return theMomentum.m();}
177 inline G4double G4QHadron::GetMass2() const {return theMomentum.m2();}
178 //@@ This is an example how to make other inline selectors for the Hadron
179 inline G4int G4QHadron::GetCharge() const {return valQ.GetCharge();}
180 inline G4int G4QHadron::GetStrangeness() const {return valQ.GetStrangeness();}
181 inline G4int G4QHadron::GetBaryonNumber() const {return valQ.GetBaryonNumber();}
182 inline const G4ThreeVector& G4QHadron::GetPosition() const {return thePosition;}
183 //inline G4int G4QHadron::GetSoftCollisionCount() {return theCollisionCount;}
184 
186 inline void G4QHadron::SetQC(const G4QContent& newQC) {valQ=newQC;}
187 inline void G4QHadron::Set4Momentum(const G4LorentzVector& aMom) {theMomentum=aMom;}
188 inline void G4QHadron::SetNFragments(const G4int& nf) {nFragm=nf;}
189 inline void G4QHadron::SetPosition(const G4ThreeVector& position) {thePosition=position;}
190 
191 inline void G4QHadron::NegPDGCode() {theQPDG.NegPDGCode(); valQ.Anti();}
192 inline G4bool G4QHadron::TestRealNeutral() { return theQPDG.TestRealNeutral();}
193 
194 #endif