00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef G4QGSMSplitableHadron_h
00027 #define G4QGSMSplitableHadron_h 1
00028
00029 #include "G4VSplitableHadron.hh"
00030 #include "G4PartonVector.hh"
00031 #include "G4MesonSplitter.hh"
00032 #include "G4BaryonSplitter.hh"
00033 #include "Randomize.hh"
00034 #include <deque>
00035
00036
00037
00038
00039
00040
00041 class G4QGSMSplitableHadron : public G4VSplitableHadron
00042 {
00043
00044 public:
00045 G4QGSMSplitableHadron();
00046 G4QGSMSplitableHadron(const G4ReactionProduct & aPrimary);
00047 G4QGSMSplitableHadron(const G4ReactionProduct & aPrimary, G4bool Direction);
00048 G4QGSMSplitableHadron(const G4Nucleon & aNucleon);
00049 G4QGSMSplitableHadron(const G4Nucleon & aNucleon, G4bool Direction);
00050
00051 virtual ~G4QGSMSplitableHadron();
00052
00053 private:
00054 const G4QGSMSplitableHadron & operator=(const G4QGSMSplitableHadron &right);
00055
00056 public:
00057 virtual void SplitUp();
00058 virtual void SetFirstParton(G4int PDGcode);
00059 virtual void SetSecondParton(G4int PDGcode);
00060 virtual G4Parton * GetNextParton();
00061 virtual G4Parton * GetNextAntiParton();
00062
00063 private:
00064 void InitParameters();
00065 void DiffractiveSplitUp();
00066 void SoftSplitUp();
00067 G4ThreeVector GaussianPt(G4double widthSquare, G4double maxPtSquare);
00068 void GetValenceQuarkFlavors(const G4ParticleDefinition * aPart,
00069 G4Parton *& Parton1, G4Parton *& Parton2);
00070 G4Parton * BuildSeaQuark(G4bool isAntiQuark, G4int aPDGCode, G4int nSeaPair);
00071 G4double SampleX(G4double anXmin, G4int nSea, G4int theTotalSea, G4double aBeta);
00072
00073 private:
00074
00075 G4bool Direction;
00076
00077 std::deque<G4Parton *> Color;
00078 std::deque<G4Parton *> AntiColor;
00079 private:
00080
00081 G4MesonSplitter theMesonSplitter;
00082 G4BaryonSplitter theBaryonSplitter;
00083
00084 private:
00085
00086 G4double alpha;
00087 G4double beta;
00088 G4double theMinPz;
00089 G4double StrangeSuppress;
00090 G4double sigmaPt;
00091 G4double widthOfPtSquare;
00092 G4double minTransverseMass;
00093 };
00094
00095 inline G4Parton* G4QGSMSplitableHadron::GetNextParton()
00096 {
00097 if(Color.size()==0) return 0;
00098 G4Parton * result = Color.back();
00099 Color.pop_back();
00100 return result;
00101 }
00102
00103 inline G4Parton* G4QGSMSplitableHadron::GetNextAntiParton()
00104 {
00105 if(AntiColor.size() == 0) return 0;
00106 G4Parton * result = AntiColor.front();
00107 AntiColor.pop_front();
00108 return result;
00109 }
00110
00111 inline void G4QGSMSplitableHadron::SetFirstParton(G4int PDGcode)
00112 {PDGcode++;}
00113 inline void G4QGSMSplitableHadron::SetSecondParton(G4int PDGcode)
00114 {PDGcode++;}
00115 #endif
00116
00117