Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4QParton.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 // $Id$
28 //
29 // ------------------------------------------------------------
30 // GEANT 4 class implementation file
31 //
32 // ---------------- G4QParton ----------------
33 // by Mikhail Kossov, Oct 2006.
34 // class for Parton (inside a string) used by Parton String Models
35 // For comparison mirror member functions are taken from G4 class:
36 // G4Parton
37 // ------------------------------------------------------------------------
38 // Short description: The Quark-Gluon String consists of the partons, which
39 // are quarks and some times gluons.
40 // ------------------------------------------------------------------------
41 
42 //#define debug
43 
44 #include "G4QParton.hh"
45 
46 G4QParton::G4QParton() // By default creates only quarks (not di-quarks)
47 {
48  // CHIPS is working only with u, d, and s quarks (SU(3)xSU(3)) (no gluons! M.K.)
49  // Random Flavor/Colour/Spin definition for default constructor (with .3 s-suppresion)
50  PGGCode=(G4int)(2.3*G4UniformRand())+1; //@@ Additional parameter of s/u (M.K.)
51  theType=1;
52 #ifdef debug
53  G4cout<<"....G4QParton::DefConstructer: PDG = "<<PGGCode<<", Type="<<theType<<G4endl;
54 #endif
55  // random colour (1,2,3)=(R,G,B) for quarks and (-1,-2,-3)=(aR,aG,aB) for anti-quarks
56  theColour = (G4int)(3*G4UniformRand())+1;
57  if(theColour>3) theColour = 3; // Should never happend
58  theSpinZ = (G4int)(2*G4UniformRand()) - 0.5;
59  QCont = G4QContent(0,0,0,0,0,0);
60  // Default definition (initialization)
61  theX = 0.;
62  thePosition=G4ThreeVector(0.,0.,0.);
63  theMomentum=G4LorentzVector(0.,0.,0.,0.);
64 }
65 
67 {
68  SetPDGCode(PDG);
69  // Default definition (initialization)
70  theX = 0.;
71  thePosition=G4ThreeVector(0.,0.,0.);
72  theMomentum=G4LorentzVector(0.,0.,0.,0.);
73 }
74 
76 {
77  PGGCode = right.PGGCode;
78  QCont = right.QCont;
79  theType = right.theType;
80  theMomentum = right.theMomentum;
81  thePosition = right.thePosition;
82  theX = right.theX;
83  theColour = right.theColour;
84  theSpinZ = right.theSpinZ;
85 #ifdef debug
86  G4cout<<"G4QParton::RCopyConstructer: PDG="<<PGGCode<<", Col="<<theColour<<", Sz="
87  <<theSpinZ<<G4endl;
88 #endif
89 }
90 
92 {
93  PGGCode = right->PGGCode;
94  QCont = right->QCont;
95  theType = right->theType;
96  theMomentum = right->theMomentum;
97  thePosition = right->thePosition;
98  theX = right->theX;
99  theColour = right->theColour;
100  theSpinZ = right->theSpinZ;
101 #ifdef debug
102  G4cout<<"G4QParton::PCopyConstructer: PDG="<<PGGCode<<", Col="<<theColour<<", Sz="
103  <<theSpinZ<<G4endl;
104 #endif
105 }
106 
108 {
109  if(this != &right) // Beware of self assignment
110  {
111  PGGCode = right.GetPDGCode();
112  QCont = right.QCont;
113  theType = right.GetType();
114  theMomentum = right.Get4Momentum();
115  thePosition = right.GetPosition();
116  theX = right.theX;
117  theColour = right.theColour;
118  theSpinZ = right.theSpinZ;
119 #ifdef debug
120  G4cout<<"G4QParton::=Constructer: PDG="<<PGGCode<<", Col="<<theColour<<", Sz="
121  <<theSpinZ<<G4endl;
122 #endif
123  }
124  return *this;
125 }
126 
128 
129 // Redefine the parton nature without changing x, 4Mom, Pos etc.
131 {
132  PGGCode=PDG;
133  G4int aPDG=std::abs(PDG);
134  if(aPDG < 3304 && aPDG > 1100 && aPDG%100 < 4) // di-quark
135  {
136  theType=2;
137  G4int cPDG=aPDG/100;
138  if(PDG>0)
139  {
140  if (cPDG==11) QCont=G4QContent(2,0,0,0,0,0); // dd
141  else if(cPDG==21) QCont=G4QContent(1,1,0,0,0,0); // ud
142  else if(cPDG==22) QCont=G4QContent(0,2,0,0,0,0); // uu
143  else if(cPDG==31) QCont=G4QContent(1,0,1,0,0,0); // sd
144  else if(cPDG==32) QCont=G4QContent(0,1,1,0,0,0); // su
145  else if(cPDG==33) QCont=G4QContent(0,0,2,0,0,0); // ss
146  else
147  {
148  G4cerr<<"***G4QParton::SetPDGCode: bad di-quark PDG="<<PDG<<G4endl;
149  G4Exception("G4QParton::SetPDGCode:","72",FatalException,"Not SU(3) DiQuark");
150  }
151  }
152  else
153  {
154  if (cPDG==11) QCont=G4QContent(0,0,0,2,0,0); // anti-dd
155  else if(cPDG==21) QCont=G4QContent(0,0,0,1,1,0); // anti-ud
156  else if(cPDG==22) QCont=G4QContent(0,0,0,0,2,0); // anti-uu
157  else if(cPDG==31) QCont=G4QContent(0,0,0,1,0,1); // anti-sd
158  else if(cPDG==32) QCont=G4QContent(0,0,0,0,1,1); // anti-su
159  else if(cPDG==33) QCont=G4QContent(0,0,0,0,0,2); // anti-ss
160  else
161  {
162  G4cerr<<"***G4QParton::SetPDGCode: bad anti-di-quark PDG="<<PDG<<G4endl;
163  G4Exception("G4QParton::SetPDGCode:","72",FatalException,"Not SU(3) AntiDiQuark");
164  }
165  }
166  }
167  else if(aPDG && aPDG<4) // quark
168  {
169  theType=1;
170  if(PDG>0)
171  {
172  if (PDG==1) QCont=G4QContent(1,0,0,0,0,0); // d
173  else if(PDG==2) QCont=G4QContent(0,1,0,0,0,0); // u
174  else if(PDG==3) QCont=G4QContent(0,0,1,0,0,0); // s
175  else
176  {
177  G4cerr<<"***G4QParton::SetPDGCode: bad quark PDG="<<PDG<<G4endl;
178  G4Exception("G4QParton::SetPDGCode:","72",FatalException,"Not SU(3) Quark");
179  }
180  }
181  else
182  {
183  if (PDG==-1) QCont=G4QContent(0,0,0,1,0,0); // anti-d
184  else if(PDG==-2) QCont=G4QContent(0,0,0,0,1,0); // anti-u
185  else if(PDG==-3) QCont=G4QContent(0,0,0,0,0,1); // anti-s
186  else
187  {
188  G4cerr<<"***G4QParton::SetPDGCode: bad anti-quark PDG="<<PDG<<G4endl;
189  G4Exception("G4QParton::SetPDGCode:","72",FatalException,"Not SU(3) Anti-Quark");
190  }
191  }
192  }
193  else if(aPDG==9 || aPDG==21) // gluon
194  {
195  theType=0;
196  QCont=G4QContent(0,0,0,0,0,0);
197  }
198  else
199  {
200  G4cerr<<"***G4QParton::SetPDGCode: wrong gluon/quark/diquark PDG="<<PDG<<G4endl;
201  G4Exception("G4QParton::SetPDGCode:","72",FatalException,"WrongPartonPDG");
202  }
203 #ifdef debug
204  G4cout<<"....G4QParton::SetPDGCode: PDG = "<<PDG<<", Type="<<theType<<G4endl;
205 #endif
206  //
207  // colour by random in (1,2,3)=(R,G,B) for quarks and
208  // in (-1,-2,-3)=(Rbar,Gbar,Bbar) for anti-quarks:
209  G4int RGB=(G4int)(3*G4UniformRand())+1;
210  if(theType==1)
211  {
212  if(PDG>0) theColour = RGB;
213  else theColour =-RGB;
214  }
215  // colour by random in (-1,-2,-3)=(Rbar,Gbar,Bbar)=(GB,RB,RG) for di-quarks and
216  // in (1,2,3)=(R,G,B)=(GB,RB,RG) for anti-di-quarks:
217  else if(theType==2)
218  {
219  if(PDG>0) theColour =-RGB;
220  else theColour = RGB;
221  }
222  // ColourByRandom (-11,-12,-13,-21,...,-33)=(RRbar,RGbar,RBbar,...,BBbar) for gluons
223  else theColour = -(RGB*10 + (G4int)(3*G4UniformRand())+1);
224  //
225  // spin-z choosen at random from PDG-encoded spin:
226  //
227  G4double dPDGSpin=1.; // Quark 2S
228  if (theType==0) dPDGSpin=2.; // Gluon 2S
229  else if(theType==2) dPDGSpin=aPDG%10-1; // Di-quark 2S
230  theSpinZ = (G4int)((dPDGSpin+1)*G4UniformRand())-dPDGSpin/2;
231 }
232 
233 // QGS x+/x- logic of the Energy and Pz calculation
234 void G4QParton::DefineMomentumInZ(G4double aLightConeMomentum, G4bool aDirection)
235 {
236  G4LorentzVector a4Momentum = Get4Momentum();
237  aLightConeMomentum*=theX;
238  G4double TransverseMass2 = sqr(a4Momentum.px()) + sqr(a4Momentum.py());
239  a4Momentum.setPz(0.5*(aLightConeMomentum - TransverseMass2/aLightConeMomentum) *
240  (aDirection? 1: -1));
241  a4Momentum.setE( 0.5*(aLightConeMomentum + TransverseMass2/aLightConeMomentum));
242  Set4Momentum(a4Momentum);
243 }
244 
245 // Reduce DiQ-aDiQ to Q-aQ (true if succeeded). General function of the QPartons operations
247 {
248  G4bool result=false;
249  G4int sPDG=d1->GetPDGCode();
250  G4int nPDG=d2->GetPDGCode();
251 #ifdef debug
252  G4cout<<"G4QParton::ReduceDiQADiQ: **Called** LPDG="<<sPDG<<", RPDG="<<nPDG<<G4endl;
253 #endif
254  G4int qPDG=sPDG;
255  if(qPDG<-99) qPDG=(-qPDG)/100;
256  else qPDG/=100;
257  G4int dPDG=nPDG;
258  if(dPDG<-99) dPDG=(-dPDG)/100;
259  else dPDG/=100;
260  G4int L1=qPDG/10;
261  G4int L2=qPDG%10;
262  G4int R1=dPDG/10;
263  G4int R2=dPDG%10;
264  if(L1==R1 || L1==R2 || L2==R1 || L2==R2) // Annihilation condition
265  {
266  if (L1==R1)
267  {
268  if(sPDG>0) sPDG=L2;
269  else sPDG=-L2;
270  if(nPDG>0) nPDG=R2;
271  else nPDG=-R2;
272 #ifdef debug
273  G4cout<<"G4QParton::ReDiQADiQ:L2="<<L2<<",R2="<<R2<<",L="<<sPDG<<",R="<<nPDG<<G4endl;
274 #endif
275  }
276  else if(L1==R2)
277  {
278  if(sPDG>0) sPDG=L2;
279  else sPDG=-L2;
280  if(nPDG>0) nPDG=R1;
281  else nPDG=-R1;
282 #ifdef debug
283  G4cout<<"G4QParton::ReDiQADiQ:L2="<<L2<<",R1="<<R1<<",L="<<sPDG<<",R="<<nPDG<<G4endl;
284 #endif
285  }
286  else if(L2==R1)
287  {
288  if(sPDG>0) sPDG=L1;
289  else sPDG=-L1;
290  if(nPDG>0) nPDG=R2;
291  else nPDG=-R2;
292 #ifdef debug
293  G4cout<<"G4QParton::ReDiQADiQ:L1="<<L1<<",R2="<<R2<<",L="<<sPDG<<",R="<<nPDG<<G4endl;
294 #endif
295  }
296  else //(L2==R2)
297  {
298  if(sPDG>0) sPDG=L1;
299  else sPDG=-L1;
300  if(nPDG>0) nPDG=R1;
301  else nPDG=-R1;
302 #ifdef debug
303  G4cout<<"G4QParton::ReDiQADiQ:L1="<<L1<<",R1="<<R1<<",L="<<sPDG<<",R="<<nPDG<<G4endl;
304 #endif
305  }
306  d1->SetPDGCode(sPDG); // Reset the left quark
307  d2->SetPDGCode(nPDG); // Reset the right quark
308  result=true;
309 #ifdef debug
310  G4cout<<"G4QParton::ReduceDiQADiQ:AfterReduction,L="<<sPDG<<",R="<<nPDG<<G4endl;
311 #endif
312  }
313 #ifdef debug
314  else G4cout<<"-Warning-G4QParton::ReduceDiQADiQ:DQ-aDQ reduction to Q-aQ Failed"<<G4endl;
315 #endif
316  return result;
317 }