source: trunk/source/processes/hadronic/models/parton_string/diffraction/src/G4DiffractiveExcitation.cc @ 1340

Last change on this file since 1340 was 1340, checked in by garnier, 14 years ago

update ti head

File size: 51.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: G4DiffractiveExcitation.cc,v 1.22 2010/09/20 15:50:46 vuzhinsk Exp $
28// ------------------------------------------------------------
29//      GEANT 4 class implemetation file
30//
31//      ---------------- G4DiffractiveExcitation --------------
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//  Other changes by V.Uzhinsky in May 2007 were introduced to fit
40//  meson-nucleon interactions. Additional changes by V. Uzhinsky
41//  were introduced in December 2006. They treat diffraction dissociation
42//  processes more exactly.
43// ---------------------------------------------------------------------
44
45
46#include "globals.hh"
47#include "Randomize.hh"
48
49#include "G4DiffractiveExcitation.hh"
50#include "G4FTFParameters.hh"
51#include "G4ElasticHNScattering.hh"
52
53#include "G4LorentzRotation.hh"
54#include "G4RotationMatrix.hh"
55#include "G4ThreeVector.hh"
56#include "G4ParticleDefinition.hh"
57#include "G4VSplitableHadron.hh"
58#include "G4ExcitedString.hh"
59#include "G4ParticleTable.hh"
60#include "G4Neutron.hh"
61#include "G4ParticleDefinition.hh"
62
63//#include "G4ios.hh"
64//#include "UZHI_diffraction.hh"
65
66G4DiffractiveExcitation::G4DiffractiveExcitation()
67{
68}
69
70// ---------------------------------------------------------------------
71G4bool G4DiffractiveExcitation::
72  ExciteParticipants(G4VSplitableHadron *projectile, 
73                     G4VSplitableHadron *target,
74                     G4FTFParameters    *theParameters,
75                     G4ElasticHNScattering *theElastic) const 
76{
77// -------------------- Projectile parameters -----------------------
78     G4LorentzVector Pprojectile=projectile->Get4Momentum();
79
80     if(Pprojectile.z() < 0.)
81     {
82       target->SetStatus(2);
83       return false;
84     } 
85
86     G4double ProjectileRapidity = Pprojectile.rapidity();
87
88     G4int    ProjectilePDGcode=projectile->GetDefinition()->GetPDGEncoding();
89     G4int    absProjectilePDGcode=std::abs(ProjectilePDGcode);
90
91     G4bool PutOnMassShell(false);
92//   G4double M0projectile=projectile->GetDefinition()->GetPDGMass(); // With de-excitation
93     G4double M0projectile = Pprojectile.mag();                       // Without de-excitation
94
95     if(M0projectile < projectile->GetDefinition()->GetPDGMass())
96     {
97      PutOnMassShell=true;
98      M0projectile=projectile->GetDefinition()->GetPDGMass();
99     }
100
101     G4double M0projectile2 = M0projectile * M0projectile;
102
103     G4double ProjectileDiffStateMinMass=theParameters->GetProjMinDiffMass();
104     G4double ProjectileNonDiffStateMinMass=theParameters->GetProjMinNonDiffMass();
105     G4double ProbProjectileDiffraction=theParameters->GetProbabilityOfProjDiff();
106
107// -------------------- Target parameters -------------------------
108     G4int    TargetPDGcode=target->GetDefinition()->GetPDGEncoding();
109     G4int    absTargetPDGcode=std::abs(TargetPDGcode);
110//G4cout<<"Excit "<<ProjectilePDGcode<<" "<<TargetPDGcode<<G4endl;
111
112     G4LorentzVector Ptarget=target->Get4Momentum();
113
114     G4double M0target = Ptarget.mag();
115
116//   G4double TargetRapidity = Ptarget.rapidity();
117
118     if(M0target < target->GetDefinition()->GetPDGMass())
119     {
120      PutOnMassShell=true;
121      M0target=target->GetDefinition()->GetPDGMass();
122     }
123
124     G4double M0target2 = M0target * M0target; 
125 
126     G4double TargetDiffStateMinMass=theParameters->GetTarMinDiffMass();   
127     G4double TargetNonDiffStateMinMass=theParameters->GetTarMinNonDiffMass();   
128     G4double ProbTargetDiffraction=theParameters->GetProbabilityOfTarDiff();
129
130     G4double AveragePt2=theParameters->GetAveragePt2();
131
132//     G4double ProbOfDiffraction=ProbProjectileDiffraction +
133//                                ProbTargetDiffraction;
134
135     G4double SumMasses=M0projectile+M0target+200.*MeV;
136
137// Kinematical properties of the interactions --------------
138     G4LorentzVector Psum;      // 4-momentum in CMS
139     Psum=Pprojectile+Ptarget;
140     G4double S=Psum.mag2(); 
141
142// Transform momenta to cms and then rotate parallel to z axis;
143     G4LorentzRotation toCms(-1*Psum.boostVector());
144
145     G4LorentzVector Ptmp=toCms*Pprojectile;
146
147     if ( Ptmp.pz() <= 0. )
148     {
149       target->SetStatus(2); 
150   // "String" moving backwards in  CMS, abort collision !!
151       return false;
152     }
153
154     toCms.rotateZ(-1*Ptmp.phi());
155     toCms.rotateY(-1*Ptmp.theta());
156
157     G4LorentzRotation toLab(toCms.inverse());
158
159     Pprojectile.transform(toCms);
160     Ptarget.transform(toCms);
161
162     G4double PZcms2, PZcms;
163
164     G4double SqrtS=std::sqrt(S);
165           
166     if(absProjectilePDGcode > 1000 && (SqrtS < 2300*MeV || SqrtS < SumMasses))
167     {target->SetStatus(2);  return false;}  // The model cannot work for
168                                             // p+p-interactions
169                                             // at Plab < 1.62 GeV/c.
170
171     if(( absProjectilePDGcode == 211 || ProjectilePDGcode ==  111) && 
172        ((SqrtS < 1600*MeV) || (SqrtS < SumMasses)))
173     {target->SetStatus(2);  return false;}  // The model cannot work for
174                                             // Pi+p-interactions
175                                             // at Plab < 1. GeV/c.
176
177     if(( (absProjectilePDGcode == 321) || (ProjectilePDGcode == -311)   ||
178          (absProjectilePDGcode == 311) || (absProjectilePDGcode == 130) ||
179          (absProjectilePDGcode == 310)) && ((SqrtS < 1600*MeV) || (SqrtS < SumMasses))) 
180     {target->SetStatus(2);  return false;}  // The model cannot work for
181                                             // K+p-interactions
182                                             // at Plab < ??? GeV/c.  ???
183
184     PZcms2=(S*S+M0projectile2*M0projectile2+M0target2*M0target2-
185             2*S*M0projectile2 - 2*S*M0target2 - 2*M0projectile2*M0target2)
186             /4./S;
187
188     if(PZcms2 < 0)
189     {target->SetStatus(2);  return false;}   // It can be in an interaction with
190                                              // off-shell nuclear nucleon
191
192     PZcms = std::sqrt(PZcms2);
193
194     if(PutOnMassShell)
195     {
196      if(Pprojectile.z() > 0.)
197      {
198       Pprojectile.setPz( PZcms);
199       Ptarget.setPz(    -PZcms);
200      }
201      else
202      {
203       Pprojectile.setPz(-PZcms);
204       Ptarget.setPz(     PZcms);
205      };
206
207      Pprojectile.setE(std::sqrt(M0projectile2                  +
208                                 Pprojectile.x()*Pprojectile.x()+
209                                 Pprojectile.y()*Pprojectile.y()+
210                                 PZcms2));
211      Ptarget.setE(std::sqrt(M0target2              +
212                             Ptarget.x()*Ptarget.x()+
213                             Ptarget.y()*Ptarget.y()+
214                             PZcms2));
215     }
216
217     G4double maxPtSquare; // = PZcms2;
218/*
219G4cout<<"Start --------------------"<<G4endl;
220G4cout<<"Proj "<<M0projectile<<" "<<ProjectileDiffStateMinMass<<"  "<<ProjectileNonDiffStateMinMass<<G4endl;
221G4cout<<"Targ "<<M0target    <<" "<<TargetDiffStateMinMass    <<" "<<TargetNonDiffStateMinMass<<G4endl;
222G4cout<<"SqrtS "<<SqrtS<<G4endl;
223G4cout<<"Rapid "<<ProjectileRapidity<<" "<<TargetRapidity<<G4endl;
224*/
225// Charge exchange can be possible for baryons -----------------
226
227// Getting the values needed for exchange ----------------------
228     G4double MagQuarkExchange        =theParameters->GetMagQuarkExchange();
229     G4double SlopeQuarkExchange      =theParameters->GetSlopeQuarkExchange();
230     G4double DeltaProbAtQuarkExchange=theParameters->GetDeltaProbAtQuarkExchange();
231
232//G4cout<<"Q exc "<<MagQuarkExchange<<" "<<SlopeQuarkExchange<<" "<<DeltaProbAtQuarkExchange<<G4endl;
233//     G4double NucleonMass=
234//              (G4ParticleTable::GetParticleTable()->FindParticle(2112))->GetPDGMass();     
235     G4double DeltaMass=
236              (G4ParticleTable::GetParticleTable()->FindParticle(2224))->GetPDGMass();
237
238//G4cout<<MagQuarkExchange*std::exp(-SlopeQuarkExchange*(ProjectileRapidity - TargetRapidity))<<G4endl;
239//G4cout<<MagQuarkExchange*std::exp(-SlopeQuarkExchange*(ProjectileRapidity))<<G4endl;
240//G4cout<<MagQuarkExchange*std::exp(-SlopeQuarkExchange*(ProjectileRapidity - 1.36))<<G4endl;
241//G4int Uzhi; G4cin>>Uzhi;
242// Check for possible quark exchange -----------------------------------
243
244     if(G4UniformRand() < MagQuarkExchange*
245        std::exp(-SlopeQuarkExchange*ProjectileRapidity))  //TargetRapidity))) 1.45
246     {   
247//        std::exp(-SlopeQuarkExchange*(ProjectileRapidity - 1.36)))  //TargetRapidity))) 1.45
248//G4cout<<"Q exchange"<<G4endl;
249      G4int NewProjCode(0), NewTargCode(0);
250
251      G4int ProjQ1(0), ProjQ2(0), ProjQ3(0);
252
253//  Projectile unpacking --------------------------
254      if(absProjectilePDGcode < 1000 )
255      {    // projectile is meson -----------------
256       UnpackMeson(ProjectilePDGcode, ProjQ1, ProjQ2); 
257      } else 
258      {    // projectile is baryon ----------------
259       UnpackBaryon(ProjectilePDGcode, ProjQ1, ProjQ2, ProjQ3);
260      } // End of the hadron's unpacking ----------
261
262//  Target unpacking ------------------------------
263      G4int TargQ1(0), TargQ2(0), TargQ3(0);
264      UnpackBaryon(TargetPDGcode, TargQ1, TargQ2, TargQ3); 
265
266//G4cout<<ProjQ1<<" "<<ProjQ2<<" "<<ProjQ3<<G4endl;
267//G4cout<<TargQ1<<" "<<TargQ2<<" "<<TargQ3<<G4endl;
268// Sampling of exchanged quarks -------------------
269      G4int ProjExchangeQ(0);
270      G4int TargExchangeQ(0);
271
272      if(absProjectilePDGcode < 1000 )
273      {    // projectile is meson -----------------
274       if(ProjQ1 > 0 ) // ProjQ1 is quark
275       { 
276        ProjExchangeQ = ProjQ1;
277        if(ProjExchangeQ != TargQ1)
278        {
279         TargExchangeQ = TargQ1; TargQ1=ProjExchangeQ; ProjQ1=TargExchangeQ;
280        } else
281        if(ProjExchangeQ != TargQ2)
282        {
283         TargExchangeQ = TargQ2; TargQ2=ProjExchangeQ; ProjQ1=TargExchangeQ;
284        } else         
285        {
286         TargExchangeQ = TargQ3;  TargQ3=ProjExchangeQ; ProjQ1=TargExchangeQ;
287        }
288       } else          // ProjQ2 is quark
289       { 
290        ProjExchangeQ = ProjQ2;
291        if(ProjExchangeQ != TargQ1)
292        {
293         TargExchangeQ = TargQ1; TargQ1=ProjExchangeQ; ProjQ2=TargExchangeQ;
294        } else
295        if(ProjExchangeQ != TargQ2)
296        {
297         TargExchangeQ = TargQ2; TargQ2=ProjExchangeQ; ProjQ2=TargExchangeQ;
298        } else 
299        {
300         TargExchangeQ = TargQ3;  TargQ3=ProjExchangeQ; ProjQ2=TargExchangeQ;
301        }
302
303       } // End of if(ProjQ1 > 0 ) // ProjQ1 is quark
304
305       G4int aProjQ1=std::abs(ProjQ1);
306       G4int aProjQ2=std::abs(ProjQ2);
307       if(aProjQ1 == aProjQ2)          {NewProjCode = 111;} // Pi0-meson
308       else  // |ProjQ1| # |ProjQ2|
309       {
310        if(aProjQ1 > aProjQ2)          {NewProjCode = aProjQ1*100+aProjQ2*10+1;}
311        else                           {NewProjCode = aProjQ2*100+aProjQ1*10+1;}
312       }
313
314       NewTargCode = NewNucleonId(TargQ1, TargQ2, TargQ3);
315
316       if( (TargQ1 == TargQ2) && (TargQ1 == TargQ3) &&
317           (SqrtS > M0projectile+DeltaMass))           {NewTargCode +=2;} //Create Delta isobar
318
319       else if( target->GetDefinition()->GetPDGiIsospin() == 3 )         //Delta was the target
320       { if(G4UniformRand() > DeltaProbAtQuarkExchange){NewTargCode +=2;} //Save   Delta isobar
321         else                                          {}     // De-excite initial Delta isobar
322       }
323
324       else if((G4UniformRand() < DeltaProbAtQuarkExchange) &&         //Nucleon was the target
325               (SqrtS > M0projectile+DeltaMass))      {NewTargCode +=2;}  //Create Delta isobar
326       else                                           {}                 //Save initial nucleon
327//       target->SetDefinition(                                          // Fix 15.12.09
328//       G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode));// Fix 15.12.09
329      } else 
330      {    // projectile is baryon ----------------
331       G4double Same=0.; //0.3; //0.5;
332       G4bool ProjDeltaHasCreated(false);
333       G4bool TargDeltaHasCreated(false);
334 
335       G4double Ksi=G4UniformRand();
336       if(G4UniformRand() < 0.5)     // Sampling exchange quark from proj. or targ.
337       {   // Sampling exchanged quark from the projectile ---
338        if( Ksi < 0.333333 ) 
339        {ProjExchangeQ = ProjQ1;}
340        else if( (0.333333 <= Ksi) && (Ksi < 0.666667))
341        {ProjExchangeQ = ProjQ2;}
342        else
343        {ProjExchangeQ = ProjQ3;}
344
345//G4cout<<"ProjExchangeQ "<<ProjExchangeQ<<G4endl;
346        if((ProjExchangeQ != TargQ1)||(G4UniformRand()<Same)) 
347        {
348         TargExchangeQ = TargQ1; TargQ1=ProjExchangeQ; ProjExchangeQ=TargExchangeQ;
349        } else
350        if((ProjExchangeQ != TargQ2)||(G4UniformRand()<Same)) 
351        {
352         TargExchangeQ = TargQ2; TargQ2=ProjExchangeQ; ProjExchangeQ=TargExchangeQ;
353        } else 
354        {
355         TargExchangeQ = TargQ3;  TargQ3=ProjExchangeQ; ProjExchangeQ=TargExchangeQ;
356        }
357
358//G4cout<<"ProjExchangeQ "<<ProjExchangeQ<<G4endl;
359//G4cout<<"TargExchangeQ "<<TargExchangeQ<<G4endl;
360        if( Ksi < 0.333333 ) 
361        {ProjQ1=ProjExchangeQ;}
362        else if( (0.333333 <= Ksi) && (Ksi < 0.666667))
363        {ProjQ2=ProjExchangeQ;}
364        else
365        {ProjQ3=ProjExchangeQ;}
366
367       } else
368       {   // Sampling exchanged quark from the target -------
369        if( Ksi < 0.333333 ) 
370        {TargExchangeQ = TargQ1;}
371        else if( (0.333333 <= Ksi) && (Ksi < 0.666667)) 
372        {TargExchangeQ = TargQ2;}
373        else
374        {TargExchangeQ = TargQ3;}
375
376        if((TargExchangeQ != ProjQ1)||(G4UniformRand()<Same)) 
377        {
378         ProjExchangeQ = ProjQ1; ProjQ1=TargExchangeQ; TargExchangeQ=ProjExchangeQ;
379        } else
380        if((TargExchangeQ != ProjQ2)||(G4UniformRand()<Same)) 
381        {
382         ProjExchangeQ = ProjQ2; ProjQ2=TargExchangeQ; TargExchangeQ=ProjExchangeQ;
383        } else 
384        {
385         ProjExchangeQ = ProjQ3;  ProjQ3=TargExchangeQ; TargExchangeQ=ProjExchangeQ;
386        }
387
388        if( Ksi < 0.333333 ) 
389        {TargQ1=TargExchangeQ;}
390        else if( (0.333333 <= Ksi) && (Ksi < 0.666667)) 
391        {TargQ2=TargExchangeQ;}
392        else
393        {TargQ3=TargExchangeQ;}
394
395       } // End of sampling baryon
396
397       NewProjCode = NewNucleonId(ProjQ1, ProjQ2, ProjQ3); // *****************************
398
399//G4cout<<"ProjQ1, ProjQ2, ProjQ3 "<<ProjQ1<<" "<<ProjQ2<<" "<<ProjQ3<<" "<<NewProjCode<<G4endl;
400
401G4int                 TestParticleID=NewProjCode;
402G4ParticleDefinition* TestParticle=0;
403G4double              TestParticleMass=DBL_MAX;
404
405TestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode);
406if(TestParticle) TestParticleMass=TestParticle->GetPDGMass(); 
407
408       if((ProjQ1==ProjQ2) && (ProjQ1==ProjQ3)) {NewProjCode +=2; ProjDeltaHasCreated=true;}
409       else if(projectile->GetDefinition()->GetPDGiIsospin() == 3)// Projectile was Delta
410       { if(G4UniformRand() > DeltaProbAtQuarkExchange)
411                                                {NewProjCode +=2; ProjDeltaHasCreated=true;} 
412         else                                   {NewProjCode +=0; ProjDeltaHasCreated=false;}
413       }
414       else                                                       // Projectile was Nucleon
415       {
416        if((G4UniformRand() < DeltaProbAtQuarkExchange) && (SqrtS > DeltaMass+M0target)) 
417                                                {NewProjCode +=2; ProjDeltaHasCreated=true;}
418        else                                    {NewProjCode +=0; ProjDeltaHasCreated=false;}
419       } 
420
421G4ParticleDefinition* NewTestParticle=
422                      G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode);
423//G4cout<<"TestParticleMass NewTestParticle->GetPDGMass() "<<TestParticleMass<<" "<< NewTestParticle->GetPDGMass()<<G4endl;
424//if(TestParticleMass < NewTestParticle->GetPDGMass()) {NewProjCode=TestParticleID;}
425 
426//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
427
428       NewTargCode = NewNucleonId(TargQ1, TargQ2, TargQ3); // *****************************
429
430//G4cout<<"TargQ1, TargQ2, TargQ3 "<<TargQ1<<" "<<TargQ2<<" "<<TargQ3<<" "<<NewTargCode<<G4endl;
431
432TestParticleID=NewTargCode;
433TestParticleMass=DBL_MAX;
434
435TestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode);
436if(TestParticle) TestParticleMass=TestParticle->GetPDGMass(); 
437
438       if((TargQ1==TargQ2) && (TargQ1==TargQ3)) {NewTargCode +=2; TargDeltaHasCreated=true;} 
439       else if(target->GetDefinition()->GetPDGiIsospin() == 3)    // Target was Delta
440       { if(G4UniformRand() > DeltaProbAtQuarkExchange)
441                                                {NewTargCode +=2; TargDeltaHasCreated=true;} 
442         else                                   {NewTargCode +=0; TargDeltaHasCreated=false;}
443       }
444       else                                                       // Target was Nucleon
445       {
446        if((G4UniformRand() < DeltaProbAtQuarkExchange) && (SqrtS > M0projectile+DeltaMass)) 
447                                                {NewTargCode +=2; TargDeltaHasCreated=true;}
448        else                                    {NewTargCode +=0; TargDeltaHasCreated=false;}
449       }         
450
451NewTestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode);
452//G4cout<<"TestParticleMass NewTestParticle->GetPDGMass() "<<TestParticleMass<<" "<< NewTestParticle->GetPDGMass()<<G4endl;
453//if(TestParticleMass < NewTestParticle->GetPDGMass()) {NewTargCode=TestParticleID;}
454
455//G4cout<<"NewProjCode NewTargCode "<<NewProjCode<<" "<<NewTargCode<<G4endl;
456//G4int Uzhi; G4cin>>Uzhi;
457
458       if((absProjectilePDGcode == NewProjCode) && (absTargetPDGcode == NewTargCode))
459       { // Nothing was changed! It is not right!?
460       }
461// Forming baryons --------------------------------------------------
462if(ProjDeltaHasCreated) {ProbProjectileDiffraction=1.; ProbTargetDiffraction=0.;}
463if(TargDeltaHasCreated) {ProbProjectileDiffraction=0.; ProbTargetDiffraction=1.;}
464       if(ProjDeltaHasCreated) 
465       {
466        M0projectile=
467          (G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode))->GetPDGMass();
468        M0projectile2 = M0projectile * M0projectile;
469
470        ProjectileDiffStateMinMass   =M0projectile+210.*MeV; //210 MeV=m_pi+70 MeV
471        ProjectileNonDiffStateMinMass=M0projectile+210.*MeV; //210 MeV=m_pi+70 MeV
472       }
473
474//      if(M0target <
475//         (G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode))->GetPDGMass())
476       if(TargDeltaHasCreated)
477       {
478        M0target=
479          (G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode))->GetPDGMass();
480        M0target2 = M0target * M0target;
481
482        TargetDiffStateMinMass   =M0target+210.*MeV;         //210 MeV=m_pi+70 MeV;   
483        TargetNonDiffStateMinMass=M0target+210.*MeV;         //210 MeV=m_pi+70 MeV;
484       }
485      } // End of if projectile is baryon ---------------------------
486
487
488// If we assume that final state hadrons after the charge exchange will be
489// in the ground states, we have to put ----------------------------------
490
491/*
492//      if(M0projectile <
493//         (G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode))->GetPDGMass())
494      if(ProjDeltaHasCreated)
495      {
496       M0projectile=
497         (G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode))->GetPDGMass();
498       M0projectile2 = M0projectile * M0projectile;
499
500       ProjectileDiffStateMinMass   =M0projectile+160.*MeV; //160 MeV=m_pi+20 MeV
501       ProjectileNonDiffStateMinMass=M0projectile+160.*MeV; //160 MeV=m_pi+20 MeV
502      }
503
504//      if(M0target <
505//         (G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode))->GetPDGMass())
506      if(TargDeltaHasCreated)
507      {
508       M0target=
509         (G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode))->GetPDGMass();
510       M0target2 = M0target * M0target;
511
512       TargetDiffStateMinMass   =M0target+160.*MeV;         //160 MeV=m_pi+20 MeV;   
513       TargetNonDiffStateMinMass=M0target+160.*MeV;         //160 MeV=m_pi+20 MeV;
514      }
515*/
516      PZcms2=(S*S+M0projectile2*M0projectile2+M0target2*M0target2-
517             2*S*M0projectile2 - 2*S*M0target2 - 2*M0projectile2*M0target2)
518             /4./S;
519//G4cout<<"PZcms2 1 "<<PZcms2<<G4endl;
520      if(PZcms2 < 0) {return false;}  // It can be if energy is not sufficient for Delta
521//----------------------------------------------------------
522      projectile->SetDefinition(
523                  G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode)); 
524
525      target->SetDefinition(
526                  G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode)); 
527//----------------------------------------------------------
528      PZcms = std::sqrt(PZcms2);
529
530      Pprojectile.setPz( PZcms);
531      Pprojectile.setE(std::sqrt(M0projectile2+PZcms2));
532
533      Ptarget.setPz(    -PZcms);
534      Ptarget.setE(std::sqrt(M0target2+PZcms2));
535
536// ----------------------------------------------------------
537
538//      G4double Wexcit=1.-1.97*std::exp(-0.5*ProjectileRapidity);
539      G4double Wexcit=1.-2.256*std::exp(-0.6*ProjectileRapidity);
540
541//G4cout<<ProjectileRapidity<<" "<<1.72*std::exp(-0.4*ProjectileRapidity)<<" "<<std::exp(0.4*ProjectileRapidity)<<G4endl;
542//G4int Uzhi;G4cin>>Uzhi;
543//Wexcit=0.;
544      if(G4UniformRand() > Wexcit)
545      {                             // Make elastic scattering
546//G4cout<<"Make elastic scattering"<<G4endl;
547       Pprojectile.transform(toLab);
548       Ptarget.transform(toLab);
549
550       projectile->SetTimeOfCreation(target->GetTimeOfCreation());
551       projectile->SetPosition(target->GetPosition());
552
553       projectile->Set4Momentum(Pprojectile);
554       target->Set4Momentum(Ptarget);
555
556       G4bool Result= theElastic->ElasticScattering (projectile,target,theParameters);
557       return Result;
558      } // end of if(G4UniformRand() > Wexcit)
559     }  // End of charge exchange part ------------------------------
560
561// ------------------------------------------------------------------
562     G4double ProbOfDiffraction=ProbProjectileDiffraction + ProbTargetDiffraction;
563/*
564G4cout<<"Excite --------------------"<<G4endl;
565G4cout<<"Proj "<<M0projectile<<" "<<ProjectileDiffStateMinMass<<"  "<<ProjectileNonDiffStateMinMass<<G4endl;
566G4cout<<"Targ "<<M0target    <<" "<<TargetDiffStateMinMass    <<" "<<TargetNonDiffStateMinMass<<G4endl;
567G4cout<<"SqrtS "<<SqrtS<<G4endl;
568
569G4cout<<"Prob ProjDiff TargDiff "<<ProbProjectileDiffraction<<" "<<ProbTargetDiffraction<<" "<<ProbOfDiffraction<<G4endl;
570G4cout<<"Pr Y "<<Pprojectile.rapidity()<<" Tr Y "<<Ptarget.rapidity()<<G4endl;
571//G4int Uzhi; G4cin>>Uzhi;
572*/
573/*
574     if(ProjectileNonDiffStateMinMass + TargetNonDiffStateMinMass > SqrtS) // 24.07.10
575     {
576      if(ProbOfDiffraction!=0.)
577      {
578       ProbProjectileDiffraction/=ProbOfDiffraction;
579       ProbOfDiffraction=1.;
580      } else {return false;}     
581     }
582
583*/
584
585     if(ProbOfDiffraction!=0.)
586     {
587      ProbProjectileDiffraction/=ProbOfDiffraction;
588     }
589     else
590     {
591      ProbProjectileDiffraction=0.;
592     }
593
594//G4cout<<"Prob ProjDiff TargDiff "<<ProbProjectileDiffraction<<" "<<ProbTargetDiffraction<<" "<<ProbOfDiffraction<<G4endl;
595
596     G4double ProjectileDiffStateMinMass2    = ProjectileDiffStateMinMass    *
597                                               ProjectileDiffStateMinMass;
598     G4double ProjectileNonDiffStateMinMass2 = ProjectileNonDiffStateMinMass *
599                                               ProjectileNonDiffStateMinMass;
600
601     G4double TargetDiffStateMinMass2        = TargetDiffStateMinMass        *
602                                               TargetDiffStateMinMass;
603     G4double TargetNonDiffStateMinMass2     = TargetNonDiffStateMinMass     *
604                                               TargetNonDiffStateMinMass;
605
606     G4double Pt2;
607     G4double ProjMassT2, ProjMassT;
608     G4double TargMassT2, TargMassT;
609     G4double PMinusMin, PMinusMax;
610//   G4double PPlusMin , PPlusMax;
611     G4double TPlusMin , TPlusMax;
612     G4double PMinusNew, PPlusNew, TPlusNew, TMinusNew;
613
614     G4LorentzVector Qmomentum;
615     G4double Qminus, Qplus;
616
617     G4int whilecount=0;
618
619//   Choose a process ---------------------------
620
621     if(G4UniformRand() < ProbOfDiffraction)
622       {
623        if(G4UniformRand() < ProbProjectileDiffraction)
624        { //-------- projectile diffraction ---------------
625//G4cout<<"projectile diffraction"<<G4endl;
626
627         do {
628//             Generate pt
629//             if (whilecount++ >= 500 && (whilecount%100)==0)
630//               G4cout << "G4DiffractiveExcitation::ExciteParticipants possibly looping"
631//               << ", loop count/ maxPtSquare : "
632//               << whilecount << " / " << maxPtSquare << G4endl;
633
634//             whilecount++;
635             if (whilecount > 1000 )
636             {
637              Qmomentum=G4LorentzVector(0.,0.,0.,0.);
638              target->SetStatus(2);  return false;    //  Ignore this interaction
639             };
640
641// --------------- Check that the interaction is possible -----------
642             ProjMassT2=ProjectileDiffStateMinMass2;
643             ProjMassT =ProjectileDiffStateMinMass;
644
645             TargMassT2=M0target2;
646             TargMassT =M0target;
647//G4cout<<"Masses "<<ProjMassT<<" "<<TargMassT<<" "<<SqrtS<<" "<<ProjMassT+TargMassT<<G4endl;
648             PZcms2=(S*S + ProjMassT2*ProjMassT2 + TargMassT2*TargMassT2-
649                     2.*S*ProjMassT2-2.*S*TargMassT2-2.*ProjMassT2*TargMassT2)
650                    /4./S;
651
652//G4cout<<"PZcms2 PrD"<<PZcms2<<G4endl;
653             if(PZcms2 < 0 ) 
654             {
655               target->SetStatus(2); 
656               return false;
657             }
658             maxPtSquare=PZcms2;
659
660             Qmomentum=G4LorentzVector(GaussianPt(AveragePt2,maxPtSquare),0);
661             Pt2=G4ThreeVector(Qmomentum.vect()).mag2();
662
663             ProjMassT2=ProjectileDiffStateMinMass2+Pt2;
664             ProjMassT =std::sqrt(ProjMassT2);
665
666             TargMassT2=M0target2+Pt2;
667             TargMassT =std::sqrt(TargMassT2);
668
669             PZcms2=(S*S + ProjMassT2*ProjMassT2 + TargMassT2*TargMassT2-
670                     2.*S*ProjMassT2-2.*S*TargMassT2-2.*ProjMassT2*TargMassT2)
671                    /4./S;
672
673             if(PZcms2 < 0 ) continue;
674             PZcms =std::sqrt(PZcms2);
675
676             PMinusMin=std::sqrt(ProjMassT2+PZcms2)-PZcms;
677             PMinusMax=SqrtS-TargMassT;
678
679             PMinusNew=ChooseP(PMinusMin, PMinusMax);
680// PMinusNew=1./sqrt(1./PMinusMin-G4UniformRand()*(1./PMinusMin-1./PMinusMax));
681//PMinusNew=1./sqr(1./std::sqrt(PMinusMin)-G4UniformRand()*(1./std::sqrt(PMinusMin)-1./std::sqrt(PMinusMax)));
682
683             TMinusNew=SqrtS-PMinusNew;
684             Qminus=Ptarget.minus()-TMinusNew;
685             TPlusNew=TargMassT2/TMinusNew;
686             Qplus=Ptarget.plus()-TPlusNew;
687
688             Qmomentum.setPz( (Qplus-Qminus)/2 );
689             Qmomentum.setE(  (Qplus+Qminus)/2 );
690
691          } while ((Pprojectile+Qmomentum).mag2() <  ProjectileDiffStateMinMass2); //|| 
692                  //Repeat the sampling because there was not any excitation
693//((Ptarget    -Qmomentum).mag2() <  M0target2                  )) );
694        }
695        else
696        { // -------------- Target diffraction ----------------
697
698//G4cout<<"Target diffraction"<<G4endl;
699         do {
700//             Generate pt
701//             if (whilecount++ >= 500 && (whilecount%100)==0)
702//               G4cout << "G4DiffractiveExcitation::ExciteParticipants possibly looping"
703//               << ", loop count/ maxPtSquare : "
704//               << whilecount << " / " << maxPtSquare << G4endl;
705
706//             whilecount++;
707             if (whilecount > 1000 )
708             {
709              Qmomentum=G4LorentzVector(0.,0.,0.,0.);
710              target->SetStatus(2);  return false;    //  Ignore this interaction
711             };
712//G4cout<<"Qm while "<<Qmomentum<<" "<<whilecount<<G4endl;
713// --------------- Check that the interaction is possible -----------
714             ProjMassT2=M0projectile2;
715             ProjMassT =M0projectile;
716
717             TargMassT2=TargetDiffStateMinMass2;
718             TargMassT =TargetDiffStateMinMass;
719
720             PZcms2=(S*S + ProjMassT2*ProjMassT2 + TargMassT2*TargMassT2-
721                     2.*S*ProjMassT2-2.*S*TargMassT2-2.*ProjMassT2*TargMassT2)
722                    /4./S;
723
724//G4cout<<"PZcms2 TrD <0 "<<PZcms2<<" return"<<G4endl;
725             if(PZcms2 < 0 ) 
726             {
727               target->SetStatus(2); 
728               return false;
729             }
730             maxPtSquare=PZcms2;
731
732             Qmomentum=G4LorentzVector(GaussianPt(AveragePt2,maxPtSquare),0);
733
734//G4cout<<"Qm while "<<Qmomentum<<" "<<whilecount<<G4endl;
735             Pt2=G4ThreeVector(Qmomentum.vect()).mag2();
736
737             ProjMassT2=M0projectile2+Pt2;
738             ProjMassT =std::sqrt(ProjMassT2);
739
740             TargMassT2=TargetDiffStateMinMass2+Pt2;
741             TargMassT =std::sqrt(TargMassT2);
742
743             PZcms2=(S*S + ProjMassT2*ProjMassT2 + TargMassT2*TargMassT2-
744                     2.*S*ProjMassT2-2.*S*TargMassT2-2.*ProjMassT2*TargMassT2)
745                    /4./S;
746
747//G4cout<<"PZcms2 <0 "<<PZcms2<<" continue"<<G4endl;
748             if(PZcms2 < 0 ) continue;
749             PZcms =std::sqrt(PZcms2);
750
751             TPlusMin=std::sqrt(TargMassT2+PZcms2)-PZcms;
752             TPlusMax=SqrtS-ProjMassT;
753
754             TPlusNew=ChooseP(TPlusMin, TPlusMax);
755//TPlusNew=1./sqr(1./std::sqrt(TPlusMin)-G4UniformRand()*(1./std::sqrt(TPlusMin)-1./std::sqrt(TPlusMax)));
756
757//TPlusNew=TPlusMax;
758
759             PPlusNew=SqrtS-TPlusNew;
760             Qplus=PPlusNew-Pprojectile.plus();
761             PMinusNew=ProjMassT2/PPlusNew;
762             Qminus=PMinusNew-Pprojectile.minus();
763
764             Qmomentum.setPz( (Qplus-Qminus)/2 );
765             Qmomentum.setE(  (Qplus+Qminus)/2 );
766
767/*
768G4cout<<(Pprojectile+Qmomentum).mag()<<" "<<M0projectile<<G4endl;
769G4bool First=(Pprojectile+Qmomentum).mag2() <  M0projectile2;
770G4cout<<First<<G4endl;
771
772G4cout<<(Ptarget    -Qmomentum).mag()<<" "<<TargetDiffStateMinMass<<" "<<TargetDiffStateMinMass2<<G4endl;
773G4bool Seco=(Ptarget    -Qmomentum).mag2() < TargetDiffStateMinMass2;
774G4cout<<Seco<<G4endl;
775*/
776
777         } while ((Ptarget    -Qmomentum).mag2() <  TargetDiffStateMinMass2);
778                 // Repeat the sampling because there was not any excitation
779// (((Pprojectile+Qmomentum).mag2() <  M0projectile2          ) ||  //No without excitation
780//  ((Ptarget    -Qmomentum).mag2() <  TargetDiffStateMinMass2)) );
781//G4cout<<"Go out"<<G4endl;
782         } // End of if(G4UniformRand() < ProbProjectileDiffraction)
783        }
784        else  //----------- Non-diffraction process ------------
785        {
786
787//G4cout<<"Non-diffraction process"<<G4endl;
788         do {
789//             Generate pt
790//             if (whilecount++ >= 500 && (whilecount%100)==0)
791//               G4cout << "G4DiffractiveExcitation::ExciteParticipants possibly looping"
792//               << ", loop count/ maxPtSquare : "
793//               << whilecount << " / " << maxPtSquare << G4endl;
794
795//             whilecount++;
796             if (whilecount > 1000 )
797             {
798              Qmomentum=G4LorentzVector(0.,0.,0.,0.);
799              target->SetStatus(2);  return false;    //  Ignore this interaction
800             };
801// --------------- Check that the interaction is possible -----------
802             ProjMassT2=ProjectileNonDiffStateMinMass2;
803             ProjMassT =ProjectileNonDiffStateMinMass;
804
805             TargMassT2=TargetNonDiffStateMinMass2;
806             TargMassT =TargetNonDiffStateMinMass;
807
808             PZcms2=(S*S + ProjMassT2*ProjMassT2 + TargMassT2*TargMassT2-
809                    2.*S*ProjMassT2-2.*S*TargMassT2-2.*ProjMassT2*TargMassT2)
810                   /4./S;
811
812             if(PZcms2 < 0 ) 
813             {
814               target->SetStatus(2); 
815               return false;
816             }
817             maxPtSquare=PZcms2;
818             Qmomentum=G4LorentzVector(GaussianPt(AveragePt2,maxPtSquare),0);
819             Pt2=G4ThreeVector(Qmomentum.vect()).mag2();
820
821             ProjMassT2=ProjectileNonDiffStateMinMass2+Pt2;
822             ProjMassT =std::sqrt(ProjMassT2);
823
824             TargMassT2=TargetNonDiffStateMinMass2+Pt2;
825             TargMassT =std::sqrt(TargMassT2);
826
827             PZcms2=(S*S + ProjMassT2*ProjMassT2 + TargMassT2*TargMassT2-
828                    2.*S*ProjMassT2-2.*S*TargMassT2-2.*ProjMassT2*TargMassT2)
829                   /4./S;
830//G4cout<<"PZcms2 ND"<<PZcms2<<G4endl;
831
832             if(PZcms2 < 0 ) continue;
833             PZcms =std::sqrt(PZcms2);
834
835             PMinusMin=std::sqrt(ProjMassT2+PZcms2)-PZcms;
836             PMinusMax=SqrtS-TargMassT;
837
838             PMinusNew=ChooseP(PMinusMin, PMinusMax);
839
840             Qminus=PMinusNew-Pprojectile.minus();
841
842             TPlusMin=std::sqrt(TargMassT2+PZcms2)-PZcms;
843//           TPlusMax=SqrtS-PMinusNew;                     
844             TPlusMax=SqrtS-ProjMassT;     
845
846             TPlusNew=ChooseP(TPlusMin, TPlusMax);
847
848             Qplus=-(TPlusNew-Ptarget.plus());
849
850             Qmomentum.setPz( (Qplus-Qminus)/2 );
851             Qmomentum.setE(  (Qplus+Qminus)/2 );
852/*
853G4cout<<(Pprojectile+Qmomentum).mag2()<<" "<<ProjectileNonDiffStateMinMass2<<G4endl;
854G4cout<<(Ptarget    -Qmomentum).mag2()<<" "<<TargetNonDiffStateMinMass2<<G4endl;
855G4int Uzhi; G4cin>>Uzhi;
856*/
857       } while (
858 ((Pprojectile+Qmomentum).mag2() <  ProjectileNonDiffStateMinMass2) || //No double Diffraction
859 ((Ptarget    -Qmomentum).mag2() <  TargetNonDiffStateMinMass2    ));
860     }
861
862     Pprojectile += Qmomentum;
863     Ptarget     -= Qmomentum;
864
865//G4cout<<"Pr Y "<<Pprojectile.rapidity()<<" Tr Y "<<Ptarget.rapidity()<<G4endl;
866
867// Transform back and update SplitableHadron Participant.
868     Pprojectile.transform(toLab);
869     Ptarget.transform(toLab);
870
871// Calculation of the creation time ---------------------
872     projectile->SetTimeOfCreation(target->GetTimeOfCreation());
873     projectile->SetPosition(target->GetPosition());
874// Creation time and position of target nucleon were determined at
875// ReggeonCascade() of G4FTFModel
876// ------------------------------------------------------
877
878//G4cout<<"Mproj "<<Pprojectile.mag()<<G4endl;
879//G4cout<<"Mtarg "<<Ptarget.mag()<<G4endl;
880     projectile->Set4Momentum(Pprojectile);
881     target->Set4Momentum(Ptarget);
882
883     projectile->IncrementCollisionCount(1);
884     target->IncrementCollisionCount(1);
885
886     return true;
887}
888
889// ---------------------------------------------------------------------
890void G4DiffractiveExcitation::CreateStrings(G4VSplitableHadron * hadron, 
891                                            G4bool isProjectile,
892                                            G4ExcitedString * &FirstString, 
893                                            G4ExcitedString * &SecondString,
894                                            G4FTFParameters *theParameters) const
895{
896        hadron->SplitUp();
897        G4Parton *start= hadron->GetNextParton();
898        if ( start==NULL)
899        { G4cout << " G4FTFModel::String() Error:No start parton found"<< G4endl;
900          FirstString=0; SecondString=0;
901          return;
902        }
903        G4Parton *end  = hadron->GetNextParton();
904        if ( end==NULL)
905        { G4cout << " G4FTFModel::String() Error:No end parton found"<< G4endl;
906          FirstString=0; SecondString=0;
907          return;
908        }
909
910        G4LorentzVector Phadron=hadron->Get4Momentum();
911
912        G4LorentzVector Pstart(0.,0.,0.,0.);
913        G4LorentzVector Pend(0.,0.,0.,0.);
914        G4LorentzVector Pkink(0.,0.,0.,0.);
915        G4LorentzVector PkinkQ1(0.,0.,0.,0.);
916        G4LorentzVector PkinkQ2(0.,0.,0.,0.);
917
918        G4int PDGcode_startQ = std::abs(start->GetDefinition()->GetPDGEncoding());
919        G4int PDGcode_endQ   = std::abs(  end->GetDefinition()->GetPDGEncoding());
920
921//--------------------------------------------------------------------------------       
922        G4double Wmin(0.);
923        if(isProjectile)
924        {
925          Wmin=theParameters->GetProjMinDiffMass();
926        } else
927        {
928          Wmin=theParameters->GetTarMinDiffMass();
929        } // end of if(isProjectile)
930
931        G4double W = hadron->Get4Momentum().mag();
932        G4double W2=W*W;
933
934        G4double Pt(0.), x1(0.), x2(0.), x3(0.);
935        G4bool Kink=false;
936
937        if(W > Wmin)
938        {                                        // Kink is possible
939          G4double Pt2kink=theParameters->GetPt2Kink();
940          Pt = std::sqrt(Pt2kink*(std::pow(W2/16./Pt2kink+1.,G4UniformRand()) - 1.));
941
942          if(Pt > 500.*MeV)
943          {
944             G4double Ymax = std::log(W/2./Pt + std::sqrt(W2/4./Pt/Pt - 1.));
945             G4double Y=Ymax*(1.- 2.*G4UniformRand());
946
947             x1=1.-Pt/W*std::exp( Y);
948             x3=1.-Pt/W*std::exp(-Y);
949             x2=2.-x1-x3;
950
951             G4double Mass_startQ = 650.*MeV;
952             if(PDGcode_startQ <  3) Mass_startQ =  325.*MeV;
953             if(PDGcode_startQ == 3) Mass_startQ =  500.*MeV;
954             if(PDGcode_startQ == 4) Mass_startQ = 1600.*MeV;
955
956             G4double Mass_endQ = 650.*MeV;
957             if(PDGcode_endQ <  3) Mass_endQ =  325.*MeV;
958             if(PDGcode_endQ == 3) Mass_endQ =  500.*MeV;
959             if(PDGcode_endQ == 4) Mass_endQ = 1600.*MeV;
960
961             G4double P2_1=W2*x1*x1/4.-Mass_endQ  *Mass_endQ;
962             G4double P2_3=W2*x3*x3/4.-Mass_startQ*Mass_startQ;
963     
964             G4double P2_2=sqr((2.-x1-x3)*W/2.);
965
966             if((P2_1 <= 0.) || (P2_3 <= 0.))
967             { Kink=false;}
968             else
969             {
970               G4double P_1=std::sqrt(P2_1);
971               G4double P_2=std::sqrt(P2_2);
972               G4double P_3=std::sqrt(P2_3);
973
974               G4double CosT12=(P2_3-P2_1-P2_2)/(2.*P_1*P_2);
975               G4double CosT13=(P2_2-P2_1-P2_3)/(2.*P_1*P_3);
976//             Pt=P_2*std::sqrt(1.-CosT12*CosT12);  // because system was rotated 11.12.09
977
978               if((std::abs(CosT12) >1.) || (std::abs(CosT13) > 1.)) 
979               { Kink=false;}
980               else
981               { 
982                 Kink=true; 
983                 Pt=P_2*std::sqrt(1.-CosT12*CosT12);  // because system was rotated 11.12.09
984                 Pstart.setPx(-Pt); Pstart.setPy(0.); Pstart.setPz(P_3*CosT13); 
985                 Pend.setPx(   0.); Pend.setPy(  0.); Pend.setPz(          P_1); 
986                 Pkink.setPx(  Pt); Pkink.setPy( 0.); Pkink.setPz(  P_2*CosT12);
987                 Pstart.setE(x3*W/2.);               
988                 Pkink.setE(Pkink.vect().mag());
989                 Pend.setE(x1*W/2.);
990
991                 G4double XkQ=GetQuarkFractionOfKink(0.,1.);
992                 if(Pkink.getZ() > 0.) 
993                 {
994                   if(XkQ > 0.5) {PkinkQ1=XkQ*Pkink;} else {PkinkQ1=(1.-XkQ)*Pkink;}
995                 } else {
996                   if(XkQ > 0.5) {PkinkQ1=(1.-XkQ)*Pkink;} else {PkinkQ1=XkQ*Pkink;}
997                 }
998
999                 PkinkQ2=Pkink - PkinkQ1;
1000//------------------------- Minimizing Pt1^2+Pt3^2 ------------------------------
1001
1002                 G4double Cos2Psi=(sqr(x1) -sqr(x3)+2.*sqr(x3*CosT13))/
1003                          std::sqrt(sqr(sqr(x1)-sqr(x3)) + sqr(2.*x1*x3*CosT13));
1004                 G4double Psi=std::acos(Cos2Psi);
1005
1006G4LorentzRotation Rotate;
1007if(isProjectile) {Rotate.rotateY(Psi);}
1008else             {Rotate.rotateY(pi-Psi);}                   
1009Rotate.rotateZ(twopi*G4UniformRand());
1010
1011Pstart*=Rotate;
1012Pkink*=Rotate;
1013PkinkQ1*=Rotate;
1014PkinkQ2*=Rotate;
1015Pend*=Rotate;
1016
1017               }
1018             }      // end of if((P2_1 < 0.) || (P2_3 <0.))
1019          }         // end of if(Pt > 500.*MeV)
1020        }           // end of if(W > Wmin) Check for a kink
1021
1022//--------------------------------------------------------------------------------
1023
1024        if(Kink)
1025        {                                        // Kink is possible
1026          std::vector<G4double> QuarkProbabilitiesAtGluonSplitUp =
1027              theParameters->GetQuarkProbabilitiesAtGluonSplitUp();
1028
1029          G4int QuarkInGluon(1); G4double Ksi=G4UniformRand();
1030          for(unsigned int Iq=0; Iq <3; Iq++)
1031          {
1032
1033if(Ksi > QuarkProbabilitiesAtGluonSplitUp[Iq]) QuarkInGluon++;}
1034
1035          G4Parton * Gquark = new G4Parton(QuarkInGluon);
1036          G4Parton * Ganti_quark = new G4Parton(-QuarkInGluon);
1037
1038//-------------------------------------------------------------------------------
1039          G4LorentzRotation toCMS(-1*Phadron.boostVector());
1040
1041          G4LorentzRotation toLab(toCMS.inverse());
1042
1043          Pstart.transform(toLab);  start->Set4Momentum(Pstart);
1044          PkinkQ1.transform(toLab);
1045          PkinkQ2.transform(toLab);
1046          Pend.transform(toLab);    end->Set4Momentum(Pend);
1047
1048          G4int absPDGcode=std::abs(hadron->GetDefinition()->GetPDGEncoding());
1049
1050          if(absPDGcode < 1000)
1051          {                                // meson
1052            if ( isProjectile )
1053            {                              // Projectile
1054              if(end->GetDefinition()->GetPDGEncoding() > 0 )  // A quark on the end
1055              {                            // Quark on the end
1056                FirstString = new G4ExcitedString(end   ,Ganti_quark, +1);
1057                SecondString= new G4ExcitedString(Gquark,start      ,+1);
1058                Ganti_quark->Set4Momentum(PkinkQ1);
1059                Gquark->Set4Momentum(PkinkQ2);
1060
1061              } else
1062              {                            // Anti_Quark on the end
1063                FirstString = new G4ExcitedString(end        ,Gquark, +1);
1064                SecondString= new G4ExcitedString(Ganti_quark,start ,+1);
1065                Gquark->Set4Momentum(PkinkQ1);
1066                Ganti_quark->Set4Momentum(PkinkQ2);
1067
1068              }   // end of if(end->GetPDGcode() > 0)
1069            } else {                      // Target
1070              if(end->GetDefinition()->GetPDGEncoding() > 0 )  // A quark on the end
1071              {                           // Quark on the end
1072                FirstString = new G4ExcitedString(Ganti_quark,end   ,-1);
1073                SecondString= new G4ExcitedString(start      ,Gquark,-1);
1074                Ganti_quark->Set4Momentum(PkinkQ2);
1075                Gquark->Set4Momentum(PkinkQ1);
1076
1077              } else
1078              {                            // Anti_Quark on the end
1079                FirstString = new G4ExcitedString(Gquark,end        ,-1);
1080                SecondString= new G4ExcitedString(start ,Ganti_quark,-1);
1081                Gquark->Set4Momentum(PkinkQ2);
1082                Ganti_quark->Set4Momentum(PkinkQ1);
1083
1084              }   // end of if(end->GetPDGcode() > 0)
1085            }     // end of if ( isProjectile )
1086          } else  // if(absPDGCode < 1000)
1087          {                             // Baryon/AntiBaryon
1088            if ( isProjectile )
1089            {                              // Projectile
1090              if((end->GetDefinition()->GetParticleType() == "diquarks") &&
1091                 (end->GetDefinition()->GetPDGEncoding() > 0           )   ) 
1092              {                            // DiQuark on the end
1093                FirstString = new G4ExcitedString(end        ,Gquark, +1);
1094                SecondString= new G4ExcitedString(Ganti_quark,start ,+1);
1095                Gquark->Set4Momentum(PkinkQ1);
1096                Ganti_quark->Set4Momentum(PkinkQ2);
1097
1098              } else
1099              {                            // Anti_DiQuark on the end or quark
1100                FirstString = new G4ExcitedString(end   ,Ganti_quark, +1);
1101                SecondString= new G4ExcitedString(Gquark,start      ,+1);
1102                Ganti_quark->Set4Momentum(PkinkQ1);
1103                Gquark->Set4Momentum(PkinkQ2);
1104
1105              }   // end of if(end->GetPDGcode() > 0)
1106            } else {                      // Target
1107
1108              if((end->GetDefinition()->GetParticleType() == "diquarks") &&
1109                 (end->GetDefinition()->GetPDGEncoding() > 0           )   ) 
1110              {                            // DiQuark on the end
1111                FirstString = new G4ExcitedString(Gquark,end        ,-1);
1112
1113                SecondString= new G4ExcitedString(start ,Ganti_quark,-1);
1114                Gquark->Set4Momentum(PkinkQ1);
1115                Ganti_quark->Set4Momentum(PkinkQ2);
1116
1117              } else
1118              {                            // Anti_DiQuark on the end or Q
1119                FirstString = new G4ExcitedString(Ganti_quark,end   ,-1);
1120                SecondString= new G4ExcitedString(start      ,Gquark,-1);
1121                Gquark->Set4Momentum(PkinkQ2);
1122                Ganti_quark->Set4Momentum(PkinkQ1);
1123
1124              }   // end of if(end->GetPDGcode() > 0)
1125            }     // end of if ( isProjectile )
1126          }  // end of if(absPDGcode < 1000)
1127
1128          FirstString->SetTimeOfCreation(hadron->GetTimeOfCreation());
1129          FirstString->SetPosition(hadron->GetPosition());
1130
1131          SecondString->SetTimeOfCreation(hadron->GetTimeOfCreation());
1132          SecondString->SetPosition(hadron->GetPosition());
1133
1134// ------------------------------------------------------------------------- 
1135        } else                                   // End of kink is possible
1136        {                                        // Kink is impossible
1137          if ( isProjectile )
1138          {
1139                FirstString= new G4ExcitedString(end,start, +1);
1140          } else {
1141                FirstString= new G4ExcitedString(start,end, -1);
1142          }
1143
1144          SecondString=0;
1145
1146          FirstString->SetTimeOfCreation(hadron->GetTimeOfCreation());
1147          FirstString->SetPosition(hadron->GetPosition());
1148
1149// momenta of string ends
1150//
1151          G4double Momentum=hadron->Get4Momentum().vect().mag();
1152          G4double  Plus=hadron->Get4Momentum().e() + Momentum;
1153          G4double Minus=hadron->Get4Momentum().e() - Momentum;
1154
1155          G4ThreeVector tmp;
1156          if(Momentum > 0.) 
1157          {
1158           tmp.set(hadron->Get4Momentum().px(),
1159                   hadron->Get4Momentum().py(),
1160                   hadron->Get4Momentum().pz());
1161           tmp/=Momentum;
1162          }
1163          else
1164          {
1165           tmp.set(0.,0.,1.);
1166          }
1167
1168          G4LorentzVector Pstart(tmp,0.);
1169          G4LorentzVector   Pend(tmp,0.);
1170
1171          if(isProjectile)
1172          {
1173           Pstart*=(-1.)*Minus/2.;
1174           Pend  *=(+1.)*Plus /2.;
1175          } 
1176          else
1177          {
1178           Pstart*=(+1.)*Plus/2.;
1179           Pend  *=(-1.)*Minus/2.;
1180          }
1181
1182          Momentum=-Pstart.mag();
1183          Pstart.setT(Momentum);  // It is assumed that quark has m=0.
1184
1185          Momentum=-Pend.mag();
1186          Pend.setT(Momentum);    // It is assumed that di-quark has m=0.
1187
1188          start->Set4Momentum(Pstart);
1189          end->Set4Momentum(Pend);
1190          SecondString=0;
1191        }            // End of kink is impossible
1192
1193#ifdef G4_FTFDEBUG
1194          G4cout << " generated string flavors          " 
1195                 << start->GetPDGcode() << " / " 
1196                 << end->GetPDGcode()                    << G4endl;
1197          G4cout << " generated string momenta:   quark " 
1198                 << start->Get4Momentum() << "mass : " 
1199                 <<start->Get4Momentum().mag()           << G4endl;
1200          G4cout << " generated string momenta: Diquark " 
1201                 << end ->Get4Momentum() 
1202                 << "mass : " <<end->Get4Momentum().mag()<< G4endl;
1203          G4cout << " sum of ends                       " << Pstart+Pend << G4endl;
1204          G4cout << " Original                          " << hadron->Get4Momentum() << G4endl;
1205#endif
1206
1207        return;
1208   
1209}
1210
1211
1212// --------- private methods ----------------------
1213
1214// ---------------------------------------------------------------------
1215G4double G4DiffractiveExcitation::ChooseP(G4double Pmin, G4double Pmax) const
1216{
1217// choose an x between Xmin and Xmax with P(x) ~ 1/x
1218//  to be improved...
1219
1220        G4double range=Pmax-Pmin;                   
1221
1222        if ( Pmin <= 0. || range <=0. )
1223        {
1224                G4cout << " Pmin, range : " << Pmin << " , " << range << G4endl;
1225                throw G4HadronicException(__FILE__, __LINE__, "G4DiffractiveExcitation::ChooseP : Invalid arguments ");
1226        }
1227
1228        G4double P=Pmin * std::pow(Pmax/Pmin,G4UniformRand()); 
1229        return P;
1230}
1231
1232// ---------------------------------------------------------------------
1233G4ThreeVector G4DiffractiveExcitation::GaussianPt(G4double AveragePt2, 
1234                                                  G4double maxPtSquare) const
1235{            //  @@ this method is used in FTFModel as well. Should go somewhere common!
1236
1237        G4double Pt2(0.);
1238        if(AveragePt2 <= 0.) {Pt2=0.;}
1239        else
1240        {
1241         Pt2 = -AveragePt2 * std::log(1. + G4UniformRand() * 
1242                            (std::exp(-maxPtSquare/AveragePt2)-1.));
1243        }
1244        G4double Pt=std::sqrt(Pt2);
1245        G4double phi=G4UniformRand() * twopi;
1246        return G4ThreeVector (Pt*std::cos(phi), Pt*std::sin(phi), 0.);
1247}
1248
1249// ---------------------------------------------------------------------
1250G4double G4DiffractiveExcitation::GetQuarkFractionOfKink(G4double zmin, G4double zmax) const
1251    {
1252       G4double z, yf;
1253       do {
1254           z = zmin + G4UniformRand()*(zmax-zmin);
1255           yf = z*z +sqr(1 - z);       
1256           } 
1257       while (G4UniformRand() > yf); 
1258       return z;
1259    }
1260// ---------------------------------------------------------------------
1261void G4DiffractiveExcitation::UnpackMeson(const G4int IdPDG, G4int &Q1, G4int &Q2) const // Uzhi 7.09.09
1262    {
1263       G4int absIdPDG = std::abs(IdPDG);
1264       Q1=  absIdPDG/ 100;
1265       Q2= (absIdPDG %100)/10;
1266           
1267       G4int anti= 1 -2 * ( std::max( Q1, Q2 ) % 2 );
1268
1269       if (IdPDG < 0 ) anti *=-1;
1270       Q1 *= anti;
1271       Q2 *= -1 * anti;
1272       return;
1273    }
1274// ---------------------------------------------------------------------
1275void G4DiffractiveExcitation::UnpackBaryon(G4int IdPDG, 
1276                              G4int &Q1, G4int &Q2, G4int &Q3) const // Uzhi 7.09.09
1277    {
1278       Q1 =  IdPDG           / 1000;
1279       Q2 = (IdPDG % 1000)  / 100;
1280       Q3 = (IdPDG % 100)   / 10;
1281       return;
1282    }
1283// ---------------------------------------------------------------------
1284G4int G4DiffractiveExcitation::NewNucleonId(G4int Q1, G4int Q2, G4int Q3) const // Uzhi 7.09.09
1285    {
1286       G4int TmpQ(0);
1287       if( Q3 > Q2 ) 
1288       {
1289        TmpQ = Q2;
1290        Q2 = Q3;
1291        Q3 = TmpQ;
1292       } else if( Q3 > Q1 )
1293       {
1294        TmpQ = Q1;
1295        Q1 = Q3;
1296        Q3 = TmpQ;
1297       }
1298
1299       if( Q2 > Q1 ) 
1300       {
1301        TmpQ = Q1;
1302        Q1 = Q2;
1303        Q2 = TmpQ;
1304       }
1305
1306       G4int NewCode = Q1*1000 + Q2* 100 + Q3*  10 + 2; 
1307       return NewCode;
1308    }
1309// ---------------------------------------------------------------------
1310G4DiffractiveExcitation::G4DiffractiveExcitation(const G4DiffractiveExcitation &)
1311{
1312        throw G4HadronicException(__FILE__, __LINE__, "G4DiffractiveExcitation copy contructor not meant to be called");
1313}
1314
1315
1316G4DiffractiveExcitation::~G4DiffractiveExcitation()
1317{
1318}
1319
1320
1321const G4DiffractiveExcitation & G4DiffractiveExcitation::operator=(const G4DiffractiveExcitation &)
1322{
1323        throw G4HadronicException(__FILE__, __LINE__, "G4DiffractiveExcitation = operator meant to be called");
1324        return *this;
1325}
1326
1327
1328int G4DiffractiveExcitation::operator==(const G4DiffractiveExcitation &) const
1329{
1330        throw G4HadronicException(__FILE__, __LINE__, "G4DiffractiveExcitation == operator meant to be called");
1331        return false;
1332}
1333
1334int G4DiffractiveExcitation::operator!=(const G4DiffractiveExcitation &) const
1335{
1336        throw G4HadronicException(__FILE__, __LINE__, "G4DiffractiveExcitation != operator meant to be called");
1337        return true;
1338}
Note: See TracBrowser for help on using the repository browser.