source: trunk/source/processes/hadronic/models/parton_string/qgsm/src/G4QGSDiffractiveExcitation.cc @ 1198

Last change on this file since 1198 was 819, checked in by garnier, 16 years ago

import all except CVS

File size: 19.5 KB
Line 
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: G4QGSDiffractiveExcitation.cc,v 1.1 2007/05/25 07:30:47 gunter Exp $
28// ------------------------------------------------------------
29//      GEANT 4 class implemetation file
30//
31//      ---------------- G4QGSDiffractiveExcitation --------------
32//             by Gunter Folger, October 1998.
33//         diffractive Excitation used by strings models
34//         Take a projectile and a target
35//         excite the projectile and target
36//  Essential changed by V. Uzhinsky in November - December 2006
37//  in order to put it in a correspondence with original FRITIOF
38//  model. Variant of FRITIOF with nucleon de-excitation is implemented. 
39// ---------------------------------------------------------------------
40
41// Modified:
42//  25-05-07 : G.Folger
43//       move from management/G4DiffractiveExcitation to to qgsm/G4QGSDiffractiveExcitation
44//                 
45
46#include "globals.hh"
47#include "Randomize.hh"
48
49#include "G4QGSDiffractiveExcitation.hh"
50#include "G4LorentzRotation.hh"
51#include "G4ThreeVector.hh"
52#include "G4ParticleDefinition.hh"
53#include "G4VSplitableHadron.hh"
54#include "G4ExcitedString.hh"
55//#include "G4ios.hh"
56
57G4QGSDiffractiveExcitation::G4QGSDiffractiveExcitation()                                     // Uzhi
58{
59}
60
61G4bool G4QGSDiffractiveExcitation::
62  ExciteParticipants(G4VSplitableHadron *projectile, G4VSplitableHadron *target) const
63{
64
65           G4LorentzVector Pprojectile=projectile->Get4Momentum();
66
67// -------------------- Projectile parameters -----------------------------------
68           G4bool PutOnMassShell=0;
69
70//         G4double M0projectile=projectile->GetDefinition()->GetPDGMass();  // With de-excitation
71           G4double M0projectile = Pprojectile.mag();                        // Without de-excitation
72
73           if(M0projectile < projectile->GetDefinition()->GetPDGMass()) 
74             {
75              PutOnMassShell=1;
76              M0projectile=projectile->GetDefinition()->GetPDGMass();
77             }
78
79           G4double Mprojectile2 = M0projectile * M0projectile;
80
81           G4int    PDGcode=projectile->GetDefinition()->GetPDGEncoding();
82           G4int    absPDGcode=std::abs(PDGcode);
83           G4double ProjectileDiffCut;
84           G4double AveragePt2;
85
86           if( absPDGcode > 1000 )                        //------Projectile is baryon --------
87             {
88              ProjectileDiffCut = 1.1;                    // GeV
89              AveragePt2 = 0.3;                           // GeV^2
90             }
91           else if( absPDGcode == 211 || PDGcode ==  111) //------Projectile is Pion -----------
92             {
93              ProjectileDiffCut = 1.0;                   // GeV
94              AveragePt2 = 0.3;                          // GeV^2
95             }
96           else if( absPDGcode == 321 || PDGcode == -311) //------Projectile is Kaon -----------
97             {
98              ProjectileDiffCut = 1.1;                    // GeV
99              AveragePt2 = 0.3;                           // GeV^2
100             }
101           else                                           //------Projectile is undefined, Nucleon assumed
102             {
103              ProjectileDiffCut = 1.1;                    // GeV
104              AveragePt2 = 0.3;                           // GeV^2
105             };
106
107           ProjectileDiffCut = ProjectileDiffCut * GeV;
108           AveragePt2 = AveragePt2 * GeV*GeV;
109
110// -------------------- Target parameters ----------------------------------------------
111           G4LorentzVector Ptarget=target->Get4Momentum();
112
113           G4double M0target = Ptarget.mag();
114
115           if(M0target < target->GetDefinition()->GetPDGMass()) 
116             {
117              PutOnMassShell=1;
118              M0target=target->GetDefinition()->GetPDGMass();
119             }
120     
121           G4double Mtarget2 = M0target * M0target;                      //Ptarget.mag2(); // for AA-inter.
122
123           G4double NuclearNucleonDiffCut = 1.1*GeV;       
124
125           G4double ProjectileDiffCut2 = ProjectileDiffCut * ProjectileDiffCut;
126           G4double NuclearNucleonDiffCut2 = NuclearNucleonDiffCut * NuclearNucleonDiffCut;
127
128// Transform momenta to cms and then rotate parallel to z axis;
129
130           G4LorentzVector Psum;
131           Psum=Pprojectile+Ptarget;
132
133           G4LorentzRotation toCms(-1*Psum.boostVector());
134
135           G4LorentzVector Ptmp=toCms*Pprojectile;
136
137           if ( Ptmp.pz() <= 0. )
138           {
139           // "String" moving backwards in  CMS, abort collision !!
140           //G4cout << " abort Collision!! " << G4endl;
141                   return false; 
142           }
143                           
144           toCms.rotateZ(-1*Ptmp.phi());
145           toCms.rotateY(-1*Ptmp.theta());
146       
147           G4LorentzRotation toLab(toCms.inverse());
148
149           Pprojectile.transform(toCms);
150           Ptarget.transform(toCms);
151
152           G4double Pt2;                                                   
153           G4double ProjMassT2, ProjMassT;                                 
154           G4double TargMassT2, TargMassT;                                 
155           G4double PZcms2, PZcms;                                         
156           G4double PMinusNew, TPlusNew;                                   
157
158           G4double S=Psum.mag2();                                         
159           G4double SqrtS=std::sqrt(S);                                     
160
161           if(SqrtS < 2200*MeV) {return false;}   // The model cannot work for pp-interactions
162                                                  // at Plab < 1.3 GeV/c. Uzhi   
163
164           PZcms2=(S*S+Mprojectile2*Mprojectile2+Mtarget2*Mtarget2-
165                                 2*S*Mprojectile2-2*S*Mtarget2-2*Mprojectile2*Mtarget2)/4./S;
166           if(PZcms2 < 0) 
167             {return false;}   // It can be in an interaction with off-shell nuclear nucleon
168
169           PZcms = std::sqrt(PZcms2);
170
171           if(PutOnMassShell)
172             {
173              if(Pprojectile.z() > 0.)
174                {
175                 Pprojectile.setPz( PZcms);
176                 Ptarget.setPz(    -PZcms);
177                }
178              else
179                 {
180                 Pprojectile.setPz(-PZcms);
181                 Ptarget.setPz(     PZcms);
182                };
183
184               Pprojectile.setE(std::sqrt(Mprojectile2+
185                                                       Pprojectile.x()*Pprojectile.x()+
186                                                       Pprojectile.y()*Pprojectile.y()+
187                                                       PZcms2));
188               Ptarget.setE(std::sqrt(    Mtarget2    +
189                                                       Ptarget.x()*Ptarget.x()+
190                                                       Ptarget.y()*Ptarget.y()+
191                                                       PZcms2));
192             }
193
194           G4double maxPtSquare = PZcms2;
195
196//G4cout << "Pprojectile aft boost : " << Pprojectile << G4endl;
197//G4cout << "Ptarget aft boost : " << Ptarget << G4endl;
198//         G4cout << "cms aft boost : " << (Pprojectile+ Ptarget) << G4endl;
199
200//         G4cout << " Projectile Xplus / Xminus : " <<
201//              Pprojectile.plus() << " / " << Pprojectile.minus() << G4endl;
202//         G4cout << " Target Xplus / Xminus : " <<
203//              Ptarget.plus() << " / " << Ptarget.minus() << G4endl;
204
205           G4LorentzVector Qmomentum;
206           G4double Qminus, Qplus;                                         
207
208// /* Vova
209           G4int whilecount=0;
210           do {
211//  Generate pt         
212
213               if (whilecount++ >= 500 && (whilecount%100)==0) 
214//               G4cout << "G4QGSDiffractiveExcitation::ExciteParticipants possibly looping"
215//               << ", loop count/ maxPtSquare : "
216//               << whilecount << " / " << maxPtSquare << G4endl;
217               if (whilecount > 1000 ) 
218               {
219                 Qmomentum=G4LorentzVector(0.,0.,0.,0.);
220                 return false;    //  Ignore this interaction
221               }
222
223               Qmomentum=G4LorentzVector(GaussianPt(AveragePt2,maxPtSquare),0);
224
225//G4cout << "generated Pt " << Qmomentum << G4endl;
226//G4cout << "Pprojectile with pt : " << Pprojectile+Qmomentum << G4endl;
227//G4cout << "Ptarget with pt : " << Ptarget-Qmomentum << G4endl;
228
229//  Momentum transfer
230/*                                                                          // Uzhi
231               G4double Xmin = minmass / ( Pprojectile.e() + Ptarget.e() );
232               G4double Xmax=1.;
233               G4double Xplus =ChooseX(Xmin,Xmax);
234               G4double Xminus=ChooseX(Xmin,Xmax);
235
236//             G4cout << " X-plus  " << Xplus << G4endl;
237//             G4cout << " X-minus " << Xminus << G4endl;
238               
239               G4double pt2=G4ThreeVector(Qmomentum.vect()).mag2();
240               G4double Qplus =-1 * pt2 / Xminus/Ptarget.minus();
241               G4double Qminus=     pt2 / Xplus /Pprojectile.plus();
242*/                                                                          // Uzhi    *
243
244               Pt2=G4ThreeVector(Qmomentum.vect()).mag2();                 
245               ProjMassT2=Mprojectile2+Pt2;                           
246               ProjMassT =std::sqrt(ProjMassT2);                           
247
248               TargMassT2=Mtarget2+Pt2;                               
249               TargMassT =std::sqrt(TargMassT2);                           
250
251               PZcms2=(S*S+ProjMassT2*ProjMassT2+                           
252                           TargMassT2*TargMassT2-                           
253                           2.*S*ProjMassT2-2.*S*TargMassT2-                 
254                           2.*ProjMassT2*TargMassT2)/4./S;                 
255               if(PZcms2 < 0 ) {PZcms2=0;};                                 
256               PZcms =std::sqrt(PZcms2);                                   
257
258               G4double PMinusMin=std::sqrt(ProjMassT2+PZcms2)-PZcms;       
259               G4double PMinusMax=SqrtS-TargMassT;                         
260
261               PMinusNew=ChooseP(PMinusMin,PMinusMax);                     
262               Qminus=PMinusNew-Pprojectile.minus();                       
263
264               G4double TPlusMin=std::sqrt(TargMassT2+PZcms2)-PZcms;       
265               G4double TPlusMax=SqrtS-ProjMassT;                           
266
267               TPlusNew=ChooseP(TPlusMin, TPlusMax);                       
268               Qplus=-(TPlusNew-Ptarget.plus());                           
269
270               Qmomentum.setPz( (Qplus-Qminus)/2 );
271               Qmomentum.setE(  (Qplus+Qminus)/2 );
272
273//G4cout << "Qplus / Qminus " << Qplus << " / " << Qminus<<G4endl;
274//           G4cout << "pt2" << pt2 << G4endl;
275//           G4cout << "Qmomentum " << Qmomentum << G4endl;
276//           G4cout << " Masses (P/T) : " << (Pprojectile+Qmomentum).mag() <<
277//                             " / " << (Ptarget-Qmomentum).mag() << G4endl;
278/*                                                                                 // Uzhi
279           } while ( (Pprojectile+Qmomentum).mag2() <= Mprojectile2 ||
280                     (Ptarget-Qmomentum).mag2()     <= Mtarget2 );
281*/                                                                                 // Uzhi     *
282
283
284           } while (( (Pprojectile+Qmomentum).mag2() <  Mprojectile2       ||      // Uzhi No without excitation
285                      (Ptarget    -Qmomentum).mag2() <  Mtarget2             ) ||  // Uzhi   
286                    ( (Pprojectile+Qmomentum).mag2()  <  ProjectileDiffCut2 &&     // Uzhi No double Diffraction
287                      (Ptarget    -Qmomentum).mag2()  <  NuclearNucleonDiffCut2) );// Uzhi
288
289           if((Ptarget-Qmomentum).mag2() < NuclearNucleonDiffCut2)                 // Uzhi Projectile diffraction
290             {
291              G4double TMinusNew=SqrtS-PMinusNew;
292              Qminus=Ptarget.minus()-TMinusNew;
293              TPlusNew=TargMassT2/TMinusNew;
294              Qplus=Ptarget.plus()-TPlusNew;
295
296              Qmomentum.setPz( (Qplus-Qminus)/2 );                         
297              Qmomentum.setE(  (Qplus+Qminus)/2 );                         
298             }
299           else if((Pprojectile+Qmomentum).mag2() <  ProjectileDiffCut2)    // Uzhi Target diffraction
300             {
301              G4double PPlusNew=SqrtS-TPlusNew;
302              Qplus=PPlusNew-Pprojectile.plus();
303              PMinusNew=ProjMassT2/PPlusNew;
304              Qminus=PMinusNew-Pprojectile.minus();
305
306              Qmomentum.setPz( (Qplus-Qminus)/2 );                         
307              Qmomentum.setE(  (Qplus+Qminus)/2 );                         
308             };
309
310           Pprojectile += Qmomentum;
311           Ptarget     -= Qmomentum;
312
313   // Vova
314
315/*
316Pprojectile.setPz(0.);
317Pprojectile.setE(SqrtS-M0target);
318
319Ptarget.setPz(0.);
320Ptarget.setE(M0target);
321*/
322
323//G4cout << "Pprojectile with Q : " << Pprojectile << G4endl;
324//G4cout << "Ptarget with Q : " << Ptarget << G4endl;
325       
326//         G4cout << "Projectile back: " << toLab * Pprojectile << G4endl;
327//         G4cout << "Target back: " << toLab * Ptarget << G4endl;
328
329// Transform back and update SplitableHadron Participant.
330           Pprojectile.transform(toLab);
331           Ptarget.transform(toLab);
332
333//G4cout << "Pprojectile with Q M: " << Pprojectile<<" "<<  Pprojectile.mag() << G4endl;
334//G4cout << "Ptarget     with Q M: " << Ptarget    <<" "<<  Ptarget.mag()     << G4endl;
335
336//G4cout << "Target      mass  " <<  Ptarget.mag() << G4endl;     
337                           
338           target->Set4Momentum(Ptarget);
339
340//G4cout << "Projectile mass  " <<  Pprojectile.mag() << G4endl;
341
342           projectile->Set4Momentum(Pprojectile);
343
344           return true;
345}
346
347
348G4ExcitedString * G4QGSDiffractiveExcitation::
349           String(G4VSplitableHadron * hadron, G4bool isProjectile) const
350{
351        hadron->SplitUp();
352        G4Parton *start= hadron->GetNextParton();
353        if ( start==NULL) 
354        { G4cout << " G4FTFModel::String() Error:No start parton found"<< G4endl;
355          return NULL;
356        }
357        G4Parton *end  = hadron->GetNextParton();
358        if ( end==NULL) 
359        { G4cout << " G4FTFModel::String() Error:No end parton found"<< G4endl;
360          return NULL;
361        }
362       
363        G4ExcitedString * string;
364        if ( isProjectile ) 
365        {
366                string= new G4ExcitedString(end,start, +1);
367        } else {
368                string= new G4ExcitedString(start,end, -1);
369        }
370       
371        string->SetPosition(hadron->GetPosition());
372
373// momenta of string ends
374        G4double ptSquared= hadron->Get4Momentum().perp2();
375        G4double transverseMassSquared= hadron->Get4Momentum().plus()
376                                    *   hadron->Get4Momentum().minus();
377
378
379        G4double maxAvailMomentumSquared=
380                 sqr( std::sqrt(transverseMassSquared) - std::sqrt(ptSquared) );
381
382        G4double widthOfPtSquare = 0.25;          // Uzhi <Pt^2>=0.25 ??????????????????
383        G4ThreeVector pt=GaussianPt(widthOfPtSquare,maxAvailMomentumSquared);
384
385        G4LorentzVector Pstart(G4LorentzVector(pt,0.));
386        G4LorentzVector Pend;
387        Pend.setPx(hadron->Get4Momentum().px() - pt.x());
388        Pend.setPy(hadron->Get4Momentum().py() - pt.y());
389
390        G4double tm1=hadron->Get4Momentum().minus() +
391          ( Pend.perp2()-Pstart.perp2() ) / hadron->Get4Momentum().plus();
392
393        G4double tm2= std::sqrt( std::max(0., sqr(tm1) -
394             4. * Pend.perp2() * hadron->Get4Momentum().minus()
395              /  hadron->Get4Momentum().plus() ));
396
397        G4int Sign= isProjectile ? -1 : 1;
398       
399        G4double endMinus  = 0.5 * (tm1 + Sign*tm2);
400        G4double startMinus= hadron->Get4Momentum().minus() - endMinus;
401
402        G4double startPlus= Pstart.perp2() /  startMinus;
403        G4double endPlus  = hadron->Get4Momentum().plus() - startPlus;
404
405        Pstart.setPz(0.5*(startPlus - startMinus));
406        Pstart.setE(0.5*(startPlus + startMinus));
407
408        Pend.setPz(0.5*(endPlus - endMinus));
409        Pend.setE(0.5*(endPlus + endMinus));
410
411        start->Set4Momentum(Pstart);
412        end->Set4Momentum(Pend);
413       
414#ifdef G4_FTFDEBUG
415        G4cout << " generated string flavors          " << start->GetPDGcode() << " / " << end->GetPDGcode() << G4endl;
416        G4cout << " generated string momenta:   quark " << start->Get4Momentum() << "mass : " <<start->Get4Momentum().mag()<< G4endl;
417        G4cout << " generated string momenta: Diquark " << end ->Get4Momentum() << "mass : " <<end->Get4Momentum().mag()<< G4endl;
418        G4cout << " sum of ends                       " << Pstart+Pend << G4endl;
419        G4cout << " Original                          " << hadron->Get4Momentum() << G4endl;
420#endif
421       
422        return string; 
423}
424
425
426// --------- private methods ----------------------
427
428G4double G4QGSDiffractiveExcitation::ChooseP(G4double Pmin, G4double Pmax) const // Uzhi
429{
430// choose an x between Xmin and Xmax with P(x) ~ 1/x
431
432//  to be improved...
433
434        G4double range=Pmax-Pmin;                                         // Uzhi
435       
436        if ( Pmin <= 0. || range <=0. ) 
437        {
438                G4cout << " Pmin, range : " << Pmin << " , " << range << G4endl;
439                throw G4HadronicException(__FILE__, __LINE__, "G4QGSDiffractiveExcitation::ChooseP : Invalid arguments ");
440        }
441
442        G4double P;
443/*                                                                          // Uzhi
444        do {
445            x=Xmin + G4UniformRand() * range;
446        }  while ( Xmin/x < G4UniformRand() );
447*/                                                                          // Uzhi
448
449        P=Pmin * std::pow(Pmax/Pmin,G4UniformRand());                       // Uzhi
450
451//debug-hpw     cout << "DiffractiveX "<<x<<G4endl;
452        return P;
453}
454
455G4ThreeVector G4QGSDiffractiveExcitation::GaussianPt(G4double AveragePt2, G4double maxPtSquare) const // Uzhi
456{            //  @@ this method is used in FTFModel as well. Should go somewhere common!
457       
458        G4double Pt2;
459/*                                                                          // Uzhi
460        do {
461            pt2=widthSquare * std::log( G4UniformRand() );
462        } while ( pt2 > maxPtSquare);
463*/                                                                          // Uzhi
464
465        Pt2 = -AveragePt2 * std::log(1. + G4UniformRand() * (std::exp(-maxPtSquare/AveragePt2)-1.));// Uzhi
466       
467        G4double Pt=std::sqrt(Pt2);
468
469        G4double phi=G4UniformRand() * twopi;
470       
471        return G4ThreeVector (Pt*std::cos(phi), Pt*std::sin(phi), 0.);   
472}
473
474G4QGSDiffractiveExcitation::G4QGSDiffractiveExcitation(const G4QGSDiffractiveExcitation &)
475{
476        throw G4HadronicException(__FILE__, __LINE__, "G4QGSDiffractiveExcitation copy contructor not meant to be called");
477}
478
479
480G4QGSDiffractiveExcitation::~G4QGSDiffractiveExcitation()
481{
482}
483
484
485const G4QGSDiffractiveExcitation & G4QGSDiffractiveExcitation::operator=(const G4QGSDiffractiveExcitation &)
486{
487        throw G4HadronicException(__FILE__, __LINE__, "G4QGSDiffractiveExcitation = operator meant to be called");
488        return *this;
489}
490
491
492int G4QGSDiffractiveExcitation::operator==(const G4QGSDiffractiveExcitation &) const
493{
494        throw G4HadronicException(__FILE__, __LINE__, "G4QGSDiffractiveExcitation == operator meant to be called");
495        return false;
496}
497
498int G4QGSDiffractiveExcitation::operator!=(const G4QGSDiffractiveExcitation &) const
499{
500        throw G4HadronicException(__FILE__, __LINE__, "G4QGSDiffractiveExcitation != operator meant to be called");
501        return true;
502}
Note: See TracBrowser for help on using the repository browser.