Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // 27 // 28 // ------------------------------------------- 28 // ------------------------------------------------------------ 29 // GEANT 4 class implementation file 29 // GEANT 4 class implementation file 30 // 30 // 31 // ---------------- G4Parton ------------ 31 // ---------------- G4Parton ---------------- 32 // by Gunter Folger, June 1998. 32 // by Gunter Folger, June 1998. 33 // class for Parton (inside a string) us 33 // class for Parton (inside a string) used by Parton String Models 34 // ------------------------------------------- 34 // ------------------------------------------------------------ 35 35 36 #include "G4Parton.hh" 36 #include "G4Parton.hh" 37 #include "G4HadronicException.hh" 37 #include "G4HadronicException.hh" 38 38 39 G4Parton::G4Parton(G4int PDGcode) 39 G4Parton::G4Parton(G4int PDGcode) 40 { 40 { 41 PDGencoding=PDGcode; 41 PDGencoding=PDGcode; 42 theX = 0; 42 theX = 0; 43 theDefinition=G4ParticleTable::GetParticleTa 43 theDefinition=G4ParticleTable::GetParticleTable()->FindParticle(PDGencoding); 44 if (theDefinition == NULL) 44 if (theDefinition == NULL) 45 { 45 { 46 G4cout << "Encoding = "<<PDGencoding<<G4en 46 G4cout << "Encoding = "<<PDGencoding<<G4endl; 47 const G4String& text = "G4Parton::GetDefin << 47 G4String text = "G4Parton::GetDefinition(): Encoding not in particle table"; 48 throw G4HadronicException(__FILE__, __LINE 48 throw G4HadronicException(__FILE__, __LINE__, text); 49 } 49 } 50 // 50 // 51 // colour by random in (1,2,3)=(R,G,B) for q 51 // colour by random in (1,2,3)=(R,G,B) for quarks and 52 // in (-1,-2,-3)=(Rbar,Gbar 52 // in (-1,-2,-3)=(Rbar,Gbar,Bbar) for anti-quarks: 53 // 53 // 54 if (theDefinition->GetParticleType() == "qua 54 if (theDefinition->GetParticleType() == "quarks") { 55 theColour = ((G4int)(3.*G4UniformRand())+1 55 theColour = ((G4int)(3.*G4UniformRand())+1)*(std::abs(PDGencoding)/PDGencoding) ; 56 } 56 } 57 // 57 // 58 // colour by random in (-1,-2,-3)=(Rbar,Gbar 58 // colour by random in (-1,-2,-3)=(Rbar,Gbar,Bbar)=(GB,RB,RG) for di-quarks and 59 // in (1,2,3)=(R,G,B)=(GB,R 59 // in (1,2,3)=(R,G,B)=(GB,RB,RG) for anti-di-quarks: 60 // 60 // 61 else if (theDefinition->GetParticleType() == 61 else if (theDefinition->GetParticleType() == "diquarks") { 62 theColour = -((G4int)(3.*G4UniformRand())+ 62 theColour = -((G4int)(3.*G4UniformRand())+1)*(std::abs(PDGencoding)/PDGencoding); 63 } 63 } 64 // 64 // 65 // colour by random in (-11,-12,...,-33)=(RR 65 // colour by random in (-11,-12,...,-33)=(RRbar,RGbar,RBbar,...,BBbar) for gluons: 66 // 66 // 67 else if (theDefinition->GetParticleType() == 67 else if (theDefinition->GetParticleType() == "gluons") { 68 theColour = -(((G4int)(3.*G4UniformRand()) 68 theColour = -(((G4int)(3.*G4UniformRand())+1)*10 + ((G4int)(3.*G4UniformRand())+1)); 69 } 69 } 70 else { 70 else { 71 G4cout << "Encoding = "<<PDGencoding<<G4en 71 G4cout << "Encoding = "<<PDGencoding<<G4endl; 72 const G4String& text = "G4Parton::GetDefin << 72 G4String text = "G4Parton::GetDefinition(): Particle is not a parton"; 73 throw G4HadronicException(__FILE__, __LINE 73 throw G4HadronicException(__FILE__, __LINE__, text); 74 } 74 } 75 // 75 // 76 // isospin-z from PDG-encoded isospin-z for 76 // isospin-z from PDG-encoded isospin-z for 77 // quarks, anti-quarks, di-quarks, and anti- 77 // quarks, anti-quarks, di-quarks, and anti-di-quarks: 78 // 78 // 79 if ((theDefinition->GetParticleType() == "qu 79 if ((theDefinition->GetParticleType() == "quarks") || (theDefinition->GetParticleType() == "diquarks")){ 80 theIsoSpinZ = theDefinition->GetPDGIsospin 80 theIsoSpinZ = theDefinition->GetPDGIsospin3(); 81 } 81 } 82 // 82 // 83 // isospin-z choosen at random from PDG-enco 83 // isospin-z choosen at random from PDG-encoded isospin for gluons (should be zero): 84 // 84 // 85 else { 85 else { 86 G4int thisPDGiIsospin=theDefinition->GetPD 86 G4int thisPDGiIsospin=theDefinition->GetPDGiIsospin(); 87 if (thisPDGiIsospin == 0) { 87 if (thisPDGiIsospin == 0) { 88 theIsoSpinZ = 0; 88 theIsoSpinZ = 0; 89 } 89 } 90 else { 90 else { 91 theIsoSpinZ = ((G4int)((thisPDGiIsospin+ 91 theIsoSpinZ = ((G4int)((thisPDGiIsospin+1)*G4UniformRand()))-thisPDGiIsospin*0.5; 92 } 92 } 93 } 93 } 94 // 94 // 95 // spin-z choosen at random from PDG-encoded 95 // spin-z choosen at random from PDG-encoded spin: 96 // 96 // 97 G4int thisPDGiSpin=theDefinition->GetPDGiSpi 97 G4int thisPDGiSpin=theDefinition->GetPDGiSpin(); 98 if (thisPDGiSpin == 0) { 98 if (thisPDGiSpin == 0) { 99 theSpinZ = 0; 99 theSpinZ = 0; 100 } 100 } 101 else { 101 else { 102 G4int rand=((G4int)((thisPDGiSpin+1)*G4Uni 102 G4int rand=((G4int)((thisPDGiSpin+1)*G4UniformRand())); 103 theSpinZ = rand-thisPDGiSpin*0.5;; 103 theSpinZ = rand-thisPDGiSpin*0.5;; 104 } 104 } 105 } 105 } 106 106 107 G4Parton::G4Parton(const G4Parton &right) 107 G4Parton::G4Parton(const G4Parton &right) 108 { 108 { 109 PDGencoding = right.PDGencoding; 109 PDGencoding = right.PDGencoding; 110 theMomentum = right.theMomentum; 110 theMomentum = right.theMomentum; 111 thePosition = right.thePosition; 111 thePosition = right.thePosition; 112 theX = right.theX; 112 theX = right.theX; 113 theDefinition = right.theDefinition; 113 theDefinition = right.theDefinition; 114 theColour = right.theColour; 114 theColour = right.theColour; 115 theIsoSpinZ = right.theIsoSpinZ; 115 theIsoSpinZ = right.theIsoSpinZ; 116 theSpinZ = right.theSpinZ; 116 theSpinZ = right.theSpinZ; 117 } 117 } 118 118 119 G4Parton & G4Parton::operator=(const G4Parton 119 G4Parton & G4Parton::operator=(const G4Parton &right) 120 { 120 { 121 if (this != &right) 121 if (this != &right) 122 { 122 { 123 PDGencoding=right.GetPDGcode(); 123 PDGencoding=right.GetPDGcode(); 124 theMomentum=right.Get4Momentum(); 124 theMomentum=right.Get4Momentum(); 125 thePosition=right.GetPosition(); 125 thePosition=right.GetPosition(); 126 theX = right.theX; 126 theX = right.theX; 127 theDefinition = right.theDefinition; 127 theDefinition = right.theDefinition; 128 theColour = right.theColour; 128 theColour = right.theColour; 129 theIsoSpinZ = right.theIsoSpinZ; 129 theIsoSpinZ = right.theIsoSpinZ; 130 theSpinZ = right.theSpinZ; 130 theSpinZ = right.theSpinZ; 131 } 131 } 132 132 133 return *this; 133 return *this; 134 } 134 } 135 135 136 G4Parton::~G4Parton() 136 G4Parton::~G4Parton() 137 { 137 { 138 // cout << "G4Parton::~G4Parton(): this = "<< 138 // cout << "G4Parton::~G4Parton(): this = "<<this <<endl; 139 // cout << "break here"<<this <<endl; 139 // cout << "break here"<<this <<endl; 140 } 140 } 141 141 142 void G4Parton::DefineMomentumInZ(G4double aLig 142 void G4Parton::DefineMomentumInZ(G4double aLightConeMomentum, G4bool aDirection) 143 { 143 { 144 G4double Mass = GetMass(); 144 G4double Mass = GetMass(); 145 G4LorentzVector a4Momentum = Get4Momentum(); 145 G4LorentzVector a4Momentum = Get4Momentum(); 146 aLightConeMomentum*=theX; 146 aLightConeMomentum*=theX; 147 G4double TransverseMass2 = sqr(a4Momentum.px 147 G4double TransverseMass2 = sqr(a4Momentum.px()) + sqr(a4Momentum.py()) + sqr(Mass); 148 a4Momentum.setPz(0.5*(aLightConeMomentum - T 148 a4Momentum.setPz(0.5*(aLightConeMomentum - TransverseMass2/aLightConeMomentum)*(aDirection? 1: -1)); 149 a4Momentum.setE( 0.5*(aLightConeMomentum + T 149 a4Momentum.setE( 0.5*(aLightConeMomentum + TransverseMass2/aLightConeMomentum)); 150 Set4Momentum(a4Momentum); 150 Set4Momentum(a4Momentum); 151 } 151 } 152 152 153 void G4Parton::DefineMomentumInZ(G4double aLig 153 void G4Parton::DefineMomentumInZ(G4double aLightConeMomentum,G4double aLightConeE, G4bool aDirection) 154 { 154 { 155 G4double Mass = GetMass(); 155 G4double Mass = GetMass(); 156 G4LorentzVector a4Momentum = Get4Momentum(); 156 G4LorentzVector a4Momentum = Get4Momentum(); 157 aLightConeMomentum*=theX; 157 aLightConeMomentum*=theX; 158 aLightConeE*=theX; 158 aLightConeE*=theX; 159 G4double TransverseMass2 = sqr(a4Momentum.px 159 G4double TransverseMass2 = sqr(a4Momentum.px()) + sqr(a4Momentum.py()) + sqr(Mass); 160 a4Momentum.setPz(0.5*(aLightConeMomentum - a 160 a4Momentum.setPz(0.5*(aLightConeMomentum - aLightConeE - TransverseMass2/aLightConeMomentum)*(aDirection? 1: -1)); 161 a4Momentum.setE( 0.5*(aLightConeMomentum + a 161 a4Momentum.setE( 0.5*(aLightConeMomentum + aLightConeE + TransverseMass2/aLightConeMomentum)); 162 Set4Momentum(a4Momentum); 162 Set4Momentum(a4Momentum); 163 } 163 } 164 164