Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/coherent_elastic/include/G4hhElastic.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 //
 28 //
 29 // G4 Model: hadron diffraction elastic scattering with 4-momentum balance 
 30 //
 31 // Class Description
 32 // Final state production model for hadron-hadron elastic scattering 
 33 // in the framework of quark-diquark model with springy Pomeron. 
 34 // Projectiles are proton, neutron, pions, kaons. 
 35 // Targets are proton (and neutron). 
 36 // Class Description - End
 37 //
 38 // 02.05.14 V. Grichine - 1-st implementation
 39 // 10.10.14 V. Grichine - change to combine with low mass diffraction
 40 
 41 #ifndef G4hhElastic_h
 42 #define G4hhElastic_h 1
 43  
 44 #include "globals.hh"
 45 #include <complex>
 46 #include "G4Integrator.hh"
 47 
 48 #include "G4HadronElastic.hh"
 49 #include "G4HadProjectile.hh"
 50 #include "G4Nucleus.hh"
 51 #include "G4HadronNucleonXsc.hh"
 52 
 53 #include "G4Exp.hh"
 54 #include "G4Log.hh"
 55 
 56 
 57 class G4ParticleDefinition;
 58 class G4PhysicsTable;
 59 class G4PhysicsLogVector;
 60 
 61 class G4hhElastic  : public G4HadronElastic  
 62 {
 63 public:
 64   // PL constructor
 65   G4hhElastic();
 66   // test constructor
 67   G4hhElastic( G4ParticleDefinition* target, G4ParticleDefinition* projectile, 
 68                     G4double plab );
 69   // constructor used for low mass diffraction
 70   G4hhElastic( G4ParticleDefinition* target, G4ParticleDefinition* projectile);
 71 
 72   virtual ~G4hhElastic();
 73 
 74   virtual G4bool IsApplicable(const G4HadProjectile &/*aTrack*/, 
 75             G4Nucleus & /*targetNucleus*/);
 76 
 77 
 78   void Initialise();
 79 
 80   void BuildTableT( G4ParticleDefinition* target, G4ParticleDefinition* projectile); // , G4double plab );
 81   void BuildTableTest( G4ParticleDefinition* target, G4ParticleDefinition* projectile, 
 82                     G4double plab );
 83 
 84   G4double SampleInvariantT( const G4ParticleDefinition* p,  G4double plab, G4int, G4int);
 85   G4double SampleBisectionalT( const G4ParticleDefinition* p, G4double plab);
 86 
 87   G4double SampleTest(G4double tMin ); // const G4ParticleDefinition* p, );
 88 
 89   G4double GetTransfer( G4int iMomentum, G4int iTransfer, G4double position );
 90  
 91 private:
 92 
 93 
 94   G4ParticleDefinition* fTarget;
 95   G4ParticleDefinition* fProjectile;
 96   G4ParticleDefinition* theProton;
 97   G4ParticleDefinition* theNeutron;
 98   G4ParticleDefinition* thePionPlus;
 99   G4ParticleDefinition* thePionMinus;
100 
101 
102   G4double lowEnergyRecoilLimit;  
103   G4double lowEnergyLimitHE;  
104   G4double lowEnergyLimitQ;  
105   G4double lowestEnergyLimit;  
106   G4double plabLowLimit;
107 
108   G4int fEnergyBin;
109   G4int fBinT;
110 
111   G4PhysicsLogVector*           fEnergyVector;
112   G4PhysicsTable*               fTableT;
113   std::vector<G4PhysicsTable*>  fBankT;
114 
115 
116   // Gauss model parameters
117 
118 
119   G4double fMff2;
120   G4double fMQ;
121   G4double fMq;
122 
123   G4double fMassTarg;  // ~ A
124   G4double fMassProj;  // ~ B
125   G4double fMassSum2;
126   G4double fMassDif2;
127 
128 
129   G4double fRA; // hadron A
130   G4double fRQ;
131   G4double fRq;
132   G4double fAlpha;
133   G4double fBeta;
134 
135   G4double fRB; // hadron B
136   G4double fRG;
137   G4double fRg;
138   G4double fGamma;
139   G4double fDelta;
140 
141   G4double fAlphaP;
142   G4double fLambdaFF;
143   G4double fLambda;
144   G4double fEta;
145   G4double fImCof;
146   G4double fCofF2;
147   G4double fCofF3;
148   G4double fRhoReIm;
149   G4double fExpSlope;
150   G4double fSo;
151 
152   G4double fSigmaTot;
153   G4double fBq;
154   G4double fBQ;
155   G4double fBqQ;
156   G4double fOptRatio;
157   G4double fSpp;
158   G4double fPcms;
159   G4double fQcof;        // q prime when integrate
160 
161 public:  // Gauss model methods
162 
163   void SetParameters();
164   void SetSigmaTot(G4double stot){fSigmaTot = stot;};
165   void SetSpp(G4double spp){fSpp = spp;};
166   G4double GetSpp(){return fSpp;};
167   void SetParametersCMS(G4double plab);
168 
169   G4double GetBq(){ return fBq;};
170   G4double GetBQ(){ return fBQ;};
171   G4double GetBqQ(){ return fBqQ;};
172   void SetBq(G4double b){fBq = b;};
173   void SetBQ(G4double b){fBQ = b;};
174   void SetBqQ(G4double b){fBqQ = b;};
175   G4double GetRhoReIm(){ return fRhoReIm;};
176 
177   void CalculateBQ(G4double b);
178   void CalculateBqQ13(G4double b);
179   void CalculateBqQ12(G4double b);
180   void CalculateBqQ123(G4double b);
181   void SetRA(G4double rn, G4double pq, G4double pQ);
182   void SetRB(G4double rn, G4double pq, G4double pQ);
183 
184   void SetAlphaP(G4double a){fAlphaP = a;};
185   void SetImCof(G4double a){fImCof = a;};
186   G4double GetImCof(){return fImCof;};
187   void SetLambda(G4double L){fLambda = L;};
188   void SetEta(G4double E){fEta = E;};
189   void SetCofF2(G4double f){fCofF2 = f;};
190   void SetCofF3(G4double f){fCofF3 = f;};
191   G4double GetCofF2(){return fCofF2;};
192   G4double GetCofF3(){return fCofF3;};
193 
194   G4double GetRA(){ return fRA;};
195   G4double GetRq(){ return fRq;};
196   G4double GetRQ(){ return fRQ;};
197 
198   G4double GetRB(){ return fRB;};
199   G4double GetRg(){ return fRg;};
200   G4double GetRG(){ return fRG;};
201 
202   // FqQgG stuff
203 
204   G4complex Pomeron();
205 
206   G4complex Phi13();
207   G4complex Phi14();
208   G4complex Phi23();
209   G4complex Phi24();
210 
211   G4complex GetF1qQgG(G4double qp);
212   G4double GetdsdtF1qQgG(G4double s, G4double q);
213   G4complex GetF2qQgG(G4double qp);
214   G4double GetdsdtF12qQgG(G4double s, G4double q);
215   G4complex GetF3qQgG(G4double qp);
216   G4double GetdsdtF123qQgG(G4double q); // sampling ds/dt
217   G4double GetdsdtF13qQG(G4double s, G4double q);
218 
219 
220   // F123 stuff
221 
222   G4complex GetAqq();
223   G4complex GetAQQ();
224   G4complex GetAqQ();
225 
226   G4double GetCofS1();
227   G4double GetCofS2();
228   G4double GetCofS3();
229   G4double GetOpticalRatio();
230 
231   G4complex GetF1(G4double qp);
232   G4double GetdsdtF1(G4double s, G4double q);
233   G4complex GetF2(G4double qp);
234   G4double GetdsdtF12(G4double s, G4double q);
235   G4complex GetF3(G4double qp);
236   G4double GetdsdtF123(G4double q); // sampling ds/dt
237   G4double GetExpRatioF123(G4double s, G4double q);
238 
239   // parameter arrays
240 
241 private:
242 
243   G4int fInTkin;
244   G4double fOldTkin;
245   static const G4double theNuclNuclData[19][6];
246   static const G4double thePiKaNuclData[8][6];
247   G4HadronNucleonXsc* fHadrNuclXsc;
248 };
249 
250 //////////////////////////////////////////////////////////////////////
251 //////////////////////////////////////////////////////////////////////
252 ////////////////////////////////////////////////////////////////////////
253 
254 
255 
256 inline G4bool G4hhElastic::IsApplicable(const G4HadProjectile & projectile, 
257             G4Nucleus & nucleus)
258 {
259   if( ( projectile.GetDefinition() == G4Proton::Proton() ||
260         projectile.GetDefinition() == G4Neutron::Neutron() ||
261         projectile.GetDefinition() == G4PionPlus::PionPlus() ||
262         projectile.GetDefinition() == G4PionMinus::PionMinus() ||
263         projectile.GetDefinition() == G4KaonPlus::KaonPlus() ||
264         projectile.GetDefinition() == G4KaonMinus::KaonMinus() ) &&
265 
266         nucleus.GetZ_asInt() < 2 ) return true;
267   else                              return false;
268 }
269 
270 
271 inline void G4hhElastic::SetParameters()
272 {
273   // masses
274 
275   fMq     = 0.36*CLHEP::GeV; // 0.441*GeV; // 0.36*GeV;
276   fMQ     = 0.441*CLHEP::GeV;
277   fMff2   = 0.26*CLHEP::GeV*CLHEP::GeV; // 0.25*GeV*GeV; // 0.5*GeV*GeV;
278 
279   fAlpha = 1./3.;
280   fBeta  = 1. - fAlpha;
281 
282   fGamma = 1./2.; // 1./3.; // 
283   fDelta = 1. - fGamma; // 1./2.;
284 
285   // radii and exp cof
286 
287   fRA       = 6.5/CLHEP::GeV; // 7.3/GeV;  //  3.25/GeV; // 7./GeV; // 2./GeV; // 1./GeV;
288   fRq       = 0.173*fRA; // 2.4/GeV;
289   fRQ       = 0.316*fRA; // 1./GeV; // 2./GeV; // 1./GeV;
290   fRB       = 6.5/CLHEP::GeV; // 7.3/GeV;  //  3.25/GeV; // 7./GeV; // 2./GeV; // 1./GeV;
291   fRg       = 0.173*fRA; // 2.4/GeV;
292   fRG       = 0.173*fRA; // 1./GeV; // 2./GeV; // 1./GeV;
293 
294   fAlphaP   = 0.15/CLHEP::GeV/CLHEP::GeV; // 0.15/GeV/GeV;
295   fLambda   = 0.25*fRA*fRA; // 0.25
296   fEta      = 0.25*fRB*fRB; // 0.25
297   fImCof    = 6.5;
298   fCofF2 = 1.;
299   fCofF3 = 1.;
300 
301   fBq = 0.02; // 0.21; // 1./3.;
302   fBQ = 1. + fBq - 2*std::sqrt(fBq); // 1 - fBq; // 2./3.;
303   fBqQ = std::sqrt(fBq*fBQ);
304 
305   fLambdaFF = 1.5/CLHEP::GeV/CLHEP::GeV; // 0.15/GeV/GeV;
306   fSo     = 1.*CLHEP::GeV*CLHEP::GeV;
307   fQcof   = 0.009*CLHEP::GeV;
308   fExpSlope = 19.9/CLHEP::GeV/CLHEP::GeV;
309 }
310 
311 
312 ////////////////////////////////////////////////////////////////////////
313 //
314 // Set target and projectile masses and calculate mass sum and difference squared for Pcms
315 
316 inline void G4hhElastic::SetParametersCMS(G4double plab)
317 {
318   G4int i;
319   G4double trMass = 900.*CLHEP::MeV, Tkin;
320   G4double sl, sh, ds, rAl, rAh, drA, rBl, rBh, drB, bql, bqh, dbq, bQl, bQh, dbQ, cIl, cIh, dcI;
321 
322   Tkin = std::sqrt(fMassProj*fMassProj + plab*plab) - fMassProj;
323 
324   G4DynamicParticle*  theDynamicParticle = new G4DynamicParticle(fProjectile,
325                                               G4ParticleMomentum(0.,0.,1.),
326                                               Tkin);
327   fSigmaTot = fHadrNuclXsc->GetHadronNucleonXscNS( theDynamicParticle, fTarget );
328 
329   delete theDynamicParticle;
330 
331   fSpp  = fMassProj*fMassProj + fMassTarg*fMassTarg + 2.*fMassTarg*std::sqrt(plab*plab + fMassProj*fMassProj);
332   fPcms = std::sqrt( (fSpp - fMassSum2)*(fSpp - fMassDif2)/4./fSpp);
333 
334   G4double sCMS = std::sqrt(fSpp);
335 
336   if( fMassProj > trMass ) // p,n,pb on p
337   {
338     this->SetCofF2(1.);
339     this->SetCofF3(1.);
340     fGamma = 1./3.; // 1./3.; // 
341     fDelta = 1. - fGamma; // 1./2.;
342 
343     if( sCMS <= theNuclNuclData[0][0]*CLHEP::GeV ) // low edge, as s=2.76754
344     {
345       this->SetRA(theNuclNuclData[0][1]/CLHEP::GeV,0.173,0.316);
346       this->SetRB(theNuclNuclData[0][2]/CLHEP::GeV,0.173,0.316); 
347 
348       this->SetBq(theNuclNuclData[0][3]);
349       this->SetBQ(theNuclNuclData[0][4]);
350       this->SetImCof(theNuclNuclData[0][5]);
351 
352       this->SetLambda(0.25*this->GetRA()*this->GetRA());
353       this->SetEta(0.25*this->GetRB()*this->GetRB());
354     }
355     else if( sCMS >= theNuclNuclData[17][0]*CLHEP::GeV ) // high edge, as s=7000 ???
356     {
357       this->SetRA(theNuclNuclData[17][1]/CLHEP::GeV,0.173,0.316);
358       this->SetRB(theNuclNuclData[17][2]/CLHEP::GeV,0.173,0.316); 
359 
360       this->SetBq(theNuclNuclData[17][3]);
361       this->SetBQ(theNuclNuclData[17][4]);
362       this->SetImCof(theNuclNuclData[17][5]);
363 
364       this->SetLambda(0.25*this->GetRA()*this->GetRA());
365       this->SetEta(0.25*this->GetRB()*this->GetRB());
366     }
367     else // in approximation between array points
368     {
369       for( i = 0; i < 19; i++ ) if( sCMS <= theNuclNuclData[i][0]*CLHEP::GeV ) break;
370       if( i == 0 ) i++;
371       if( i == 19 ) i--;
372 
373       sl = theNuclNuclData[i-1][0]*CLHEP::GeV;
374       sh = theNuclNuclData[i][0]*CLHEP::GeV;
375       ds = (sCMS - sl)/(sh - sl);
376 
377       rAl = theNuclNuclData[i-1][1]/CLHEP::GeV;
378       rAh = theNuclNuclData[i][1]/CLHEP::GeV;
379       drA = rAh - rAl;
380 
381       rBl = theNuclNuclData[i-1][2]/CLHEP::GeV;
382       rBh = theNuclNuclData[i][2]/CLHEP::GeV;
383       drB = rBh - rBl;
384 
385       bql = theNuclNuclData[i-1][3];
386       bqh = theNuclNuclData[i][3];
387       dbq = bqh - bql;
388 
389       bQl = theNuclNuclData[i-1][4];
390       bQh = theNuclNuclData[i][4];
391       dbQ = bQh - bQl;
392 
393       cIl = theNuclNuclData[i-1][5];
394       cIh = theNuclNuclData[i][5];
395       dcI = cIh - cIl;
396 
397       this->SetRA(rAl+drA*ds,0.173,0.316);
398       this->SetRB(rBl+drB*ds,0.173,0.316); 
399 
400       this->SetBq(bql+dbq*ds);
401       this->SetBQ(bQl+dbQ*ds);
402       this->SetImCof(cIl+dcI*ds);
403 
404       this->SetLambda(0.25*this->GetRA()*this->GetRA());
405       this->SetEta(0.25*this->GetRB()*this->GetRB());
406     }
407   }
408   else // pi, K
409   {
410     this->SetCofF2(1.);
411     this->SetCofF3(-1.);
412     fGamma = 1./2.; // 1./3.; // 
413     fDelta = 1. - fGamma; // 1./2.;
414   
415     if( sCMS <= thePiKaNuclData[0][0]*CLHEP::GeV ) // low edge, as s=2.76754
416     {
417       this->SetRA(thePiKaNuclData[0][1]/CLHEP::GeV,0.173,0.316);
418       this->SetRB(thePiKaNuclData[0][2]/CLHEP::GeV,0.173,0.173); 
419 
420       this->SetBq(thePiKaNuclData[0][3]);
421       this->SetBQ(thePiKaNuclData[0][4]);
422       this->SetImCof(thePiKaNuclData[0][5]);
423 
424       this->SetLambda(0.25*this->GetRA()*this->GetRA());
425       this->SetEta(this->GetRB()*this->GetRB()/6.);
426     }
427     else if( sCMS >= thePiKaNuclData[7][0]*CLHEP::GeV ) // high edge, as s=7000 ???
428     {
429       this->SetRA(thePiKaNuclData[7][1]/CLHEP::GeV,0.173,0.316);
430       this->SetRB(thePiKaNuclData[7][2]/CLHEP::GeV,0.173,0.173); 
431 
432       this->SetBq(thePiKaNuclData[7][3]);
433       this->SetBQ(thePiKaNuclData[7][4]);
434       this->SetImCof(thePiKaNuclData[7][5]);
435 
436       this->SetLambda(0.25*this->GetRA()*this->GetRA());
437       this->SetEta(this->GetRB()*this->GetRB()/6.);
438     }
439     else // in approximation between array points
440     {
441       for( i = 0; i < 8; i++ ) if( sCMS <= thePiKaNuclData[i][0]*CLHEP::GeV ) break;
442       if( i == 0 ) i++;
443       if( i == 8 ) i--;
444 
445       sl = thePiKaNuclData[i-1][0]*CLHEP::GeV;
446       sh = thePiKaNuclData[i][0]*CLHEP::GeV;
447       ds = (sCMS - sl)/(sh - sl);
448 
449       rAl = thePiKaNuclData[i-1][1]/CLHEP::GeV;
450       rAh = thePiKaNuclData[i][1]/CLHEP::GeV;
451       drA = rAh - rAl;
452 
453       rBl = thePiKaNuclData[i-1][2]/CLHEP::GeV;
454       rBh = thePiKaNuclData[i][2]/CLHEP::GeV;
455       drB = rBh - rBl;
456 
457       bql = thePiKaNuclData[i-1][3];
458       bqh = thePiKaNuclData[i][3];
459       dbq = bqh - bql;
460 
461       bQl = thePiKaNuclData[i-1][4];
462       bQh = thePiKaNuclData[i][4];
463       dbQ = bQh - bQl;
464 
465       cIl = thePiKaNuclData[i-1][5];
466       cIh = thePiKaNuclData[i][5];
467       dcI = cIh - cIl;
468 
469       this->SetRA(rAl+drA*ds,0.173,0.316);
470       this->SetRB(rBl+drB*ds,0.173,0.173); 
471 
472       this->SetBq(bql+dbq*ds);
473       this->SetBQ(bQl+dbQ*ds);
474       this->SetImCof(cIl+dcI*ds);
475 
476       this->SetLambda(0.25*this->GetRA()*this->GetRA());
477       this->SetEta(this->GetRB()*this->GetRB()/6.);
478     }
479    }
480   return;
481 }
482 
483 /////////////////////////////////////////////////////
484 //
485 // RA for qQ
486 
487 inline void G4hhElastic::SetRA(G4double rA, G4double pq, G4double pQ)
488 {
489   fRA = rA;
490   fRq = fRA*pq;
491   fRQ = fRA*pQ;
492 }
493 
494 /////////////////////////////////////////////////////
495 //
496 // RB for gG
497 
498 inline void G4hhElastic::SetRB(G4double rB, G4double pg, G4double pG)
499 {
500   fRB = rB;
501   fRg = fRB*pg;
502   fRG = fRB*pG;
503 }
504 
505 ////////////////////////////////////////////////////
506 //
507 // Returns Pomeron parametrization with Im part modified, *= fImCof
508 
509 inline G4complex G4hhElastic::Pomeron()
510 {
511   G4double re, im;
512 
513   re = fAlphaP*G4Log(fSpp/fSo);
514   im = -0.5*fAlphaP*fImCof*CLHEP::pi;
515   return G4complex(re,im);
516 } 
517 
518 //////////////////////////////////////////////////
519 
520 inline G4complex G4hhElastic::Phi13()
521 {
522   G4double re = (fRq*fRq + fRg*fRg)/16.;
523   G4complex result(re,0.);
524   result += Pomeron();
525   return result;
526 }
527 
528 //////////////////////////////////////////////////
529 
530 inline G4complex G4hhElastic::Phi14()
531 {
532   G4double re = (fRq*fRq + fRG*fRG)/16.;
533   G4complex result(re,0.);
534   result += Pomeron();
535   return result;
536 }
537 
538 //////////////////////////////////////////////////
539 
540 inline G4complex G4hhElastic::Phi23()
541 {
542   G4double re = (fRQ*fRQ + fRg*fRg)/16.;
543   G4complex result(re,0.);
544   result += Pomeron();
545   return result;
546 }
547 
548 //////////////////////////////////////////////////
549 
550 inline G4complex G4hhElastic::Phi24()
551 {
552   G4double re = (fRQ*fRQ + fRG*fRG)/16.;
553   G4complex result(re,0.);
554   result += Pomeron();
555   return result;
556 }
557 
558 /////////////////////////////////////////////////////
559 //
560 // F1, case qQ-gG
561 
562 inline G4complex G4hhElastic::GetF1qQgG(G4double t)
563 {
564   G4double p = std::sqrt((fSpp - fMassSum2)*(fSpp - fMassDif2)/4./fSpp);
565   G4double k = p/CLHEP::hbarc;
566 
567   G4complex exp13 = fBq*std::exp(-(Phi13() + fBeta*fBeta*fLambda + fDelta*fDelta*fEta)*t);
568   G4complex exp14 = fBq*std::exp(-(Phi14() + fBeta*fBeta*fLambda + fGamma*fGamma*fEta)*t);
569   G4complex exp23 = fBQ*std::exp(-(Phi23() + fAlpha*fAlpha*fLambda + fDelta*fDelta*fEta)*t);
570   G4complex exp24 = fBQ*std::exp(-(Phi24() + fAlpha*fAlpha*fLambda + fGamma*fGamma*fEta)*t);
571 
572   G4complex res  = exp13 + exp14 + exp23 + exp24;
573 
574   res *=  0.25*k*fSigmaTot/CLHEP::pi;
575   res *= G4complex(0.,1.);
576 
577   return res;
578 }
579 
580 /////////////////////////////////////////////////////
581 //
582 // 
583 
584 inline G4double G4hhElastic::GetdsdtF13qQG(G4double spp, G4double t)
585 {
586   fSpp = spp;
587   G4double p = std::sqrt((fSpp - fMassSum2)*(fSpp - fMassDif2)/4./fSpp);
588   G4double k = p/CLHEP::hbarc;
589 
590   G4complex exp14 = fBqQ*std::exp(-(Phi14() + fBeta*fBeta*fLambda + fGamma*fGamma*fEta)*t);
591   G4complex exp24 = fBQ*std::exp(-(Phi24() + fAlpha*fAlpha*fLambda + fGamma*fGamma*fEta)*t);
592 
593   G4complex F1  = exp14 + exp24;
594 
595   F1 *=  0.25*k*fSigmaTot/CLHEP::pi;
596   F1 *= G4complex(0.,1.);
597 
598   // 1424
599 
600   G4complex z1424  = -(Phi24() + fAlpha*fLambda)*(Phi24() + fAlpha*fLambda);
601             z1424 /= Phi14() + Phi24() + fLambda;
602             z1424 += Phi24() + fAlpha*fAlpha*fLambda + fGamma*fGamma*fEta;
603 
604  
605   G4complex exp1424  = std::exp(-z1424*t);
606             exp1424 /= Phi14() + Phi24() + fLambda;
607 
608   G4complex F3  = fBqQ*fBQ*exp1424;
609 
610 
611   F3 *=  0.25*k/CLHEP::pi;
612   F3 *= G4complex(0.,1.);
613   F3 *= fSigmaTot*fSigmaTot/(8.*CLHEP::pi*CLHEP::hbarc*CLHEP::hbarc);
614 
615   G4complex F13  = F1 - F3;
616 
617   G4double dsdt = CLHEP::pi/p/p;
618   dsdt *= real(F13)*real(F13) + imag(F13)*imag(F13);  
619 
620   return dsdt;
621 }
622 
623 //////////////////////////////////////////////////////////////
624 //
625 // dsigma/dt(s,t) F1qQgG
626 
627 inline  G4double G4hhElastic::GetdsdtF1qQgG(G4double spp, G4double t)
628 {
629   fSpp = spp;
630   G4double p = std::sqrt((fSpp - fMassSum2)*(fSpp - fMassDif2)/4./fSpp);
631 
632   G4complex F1 = GetF1qQgG(t);
633 
634   G4double dsdt = CLHEP::pi/p/p;
635   dsdt *= real(F1)*real(F1) + imag(F1)*imag(F1);  
636   return dsdt;
637 }
638 
639 /////////////////////////////////////////////////////
640 //
641 // 
642 
643 inline G4complex G4hhElastic::GetF2qQgG(G4double t)
644 {
645   G4double p = std::sqrt((fSpp - fMassSum2)*(fSpp - fMassDif2)/4./fSpp);
646   G4double k = p/CLHEP::hbarc;
647 
648   G4complex z1324  = -(Phi24() + fAlpha*fLambda + fGamma*fEta)*(Phi24() + fAlpha*fLambda + fGamma*fEta);
649             z1324 /= Phi13() + Phi24() + fLambda + fEta;
650             z1324 += Phi24() + fAlpha*fAlpha*fLambda + fGamma*fGamma*fEta;
651 
652   G4complex exp1324  = std::exp(-z1324*t);
653             exp1324 /= Phi13() + Phi24() + fLambda + fEta;
654 
655   G4complex z1423 = -(Phi23() + fAlpha*fLambda + fDelta*fEta)*(Phi24() + fAlpha*fLambda + fDelta*fEta);;
656             z1423 /= Phi14() + Phi23() + fLambda + fEta;
657             z1423 += Phi23() + fAlpha*fAlpha*fLambda + fDelta*fDelta*fEta;
658 
659   G4complex exp1423 = std::exp(-z1423*t);
660             exp1423 /= Phi14() + Phi23() + fLambda + fEta; 
661 
662   G4complex res  = exp1324 + exp1423;
663 
664 
665   res *=  0.25*k/CLHEP::pi;
666   res *= G4complex(0.,1.);
667   res *= fBq*fBQ*fSigmaTot*fSigmaTot/(8.*CLHEP::pi*CLHEP::hbarc*CLHEP::hbarc); // or 4. ???
668 
669   return res;
670 }
671 
672 //////////////////////////////////////////////////////////////
673 //
674 // dsigma/dt(s,t) F12
675 
676 inline  G4double G4hhElastic::GetdsdtF12qQgG( G4double spp, G4double t)
677 {
678   fSpp = spp;
679   G4double p = std::sqrt((fSpp - fMassSum2)*(fSpp - fMassDif2)/4./fSpp);
680 
681   G4complex F12 = GetF1qQgG(t) - GetF2qQgG(t);
682 
683   G4double dsdt = CLHEP::pi/p/p;
684   dsdt *= real(F12)*real(F12) + imag(F12)*imag(F12);  
685   return dsdt;
686 }
687 
688 /////////////////////////////////////////////////////
689 //
690 // 
691 
692 inline G4complex G4hhElastic::GetF3qQgG(G4double t)
693 {
694   G4double p = std::sqrt( (fSpp - fMassSum2)*(fSpp - fMassDif2)/4./fSpp);
695   G4double k = p/CLHEP::hbarc;
696 
697             // 1314
698 
699   G4complex z1314  = -(Phi14() + fGamma*fEta)*(Phi14() + fGamma*fEta);
700             z1314 /= Phi13() + Phi14() + fEta;
701             z1314 += Phi14() + fBeta*fBeta*fLambda + fGamma*fGamma*fEta;
702 
703   G4complex exp1314  = std::exp(-z1314*t);
704             exp1314 /= Phi13() + Phi14() + fEta;
705 
706       // 2324
707 
708   G4complex z2324 = -(Phi24() + fGamma*fEta)*(Phi24() + fGamma*fEta);;
709             z2324 /= Phi24() + Phi23() + fEta;
710             z2324 += Phi24() + fAlpha*fAlpha*fLambda + fGamma*fGamma*fEta;
711 
712   G4complex exp2324 = std::exp(-z2324*t);
713             exp2324 /= Phi24() + Phi23() + fEta; 
714 
715       // 1323
716 
717   G4complex z1323  = -(Phi23() + fAlpha*fLambda)*(Phi23() + fAlpha*fLambda);
718             z1323 /= Phi13() + Phi23() + fLambda;
719             z1323 += Phi23() + fAlpha*fAlpha*fLambda + fDelta*fDelta*fEta;
720 
721   G4complex exp1323  = std::exp(-z1323*t);
722             exp1323 /= Phi13() + Phi23() + fLambda;
723 
724       // 1424
725 
726   G4complex z1424  = -(Phi24() + fAlpha*fLambda)*(Phi24() + fAlpha*fLambda);
727             z1424 /= Phi14() + Phi24() + fLambda;
728             z1424 += Phi24() + fAlpha*fAlpha*fLambda + fGamma*fGamma*fEta;
729 
730   G4complex exp1424  = std::exp(-z1424*t);
731             exp1424 /= Phi14() + Phi24() + fLambda;
732 
733       G4complex res  = fBq*fBq*exp1314 + fBQ*fBQ*exp2324 + fBq*fBQ*exp1323 + fBq*fBQ*exp1424;
734 
735   res *=  0.25*k/CLHEP::pi;
736   res *= G4complex(0.,1.);
737   res *= fSigmaTot*fSigmaTot/(8.*CLHEP::pi*CLHEP::hbarc*CLHEP::hbarc);
738 
739   return res;
740 }
741 
742 //////////////////////////////////////////////////////////////
743 //
744 // dsigma/dt(s,t) F123 sampling ds/dt
745 
746 inline  G4double G4hhElastic::GetdsdtF123qQgG(G4double t)
747 {
748   G4double p = std::sqrt( (fSpp - fMassSum2)*(fSpp - fMassDif2)/4./fSpp );
749 
750   G4complex F123  = GetF1qQgG(t); // - fCofF2*GetF2qQgG(t) - fCofF3*GetF3qQgG(t);
751             F123 -= fCofF2*GetF2qQgG(t);
752             F123 -= fCofF3*GetF3qQgG(t);
753 
754   G4double dsdt = CLHEP::pi/p/p;
755   dsdt *= real(F123)*real(F123) + imag(F123)*imag(F123);  
756   return dsdt;
757 }
758 
759 /////////////////////////////////////////////////////
760 //
761 // Set fBqQ at a given fBQ=b2 according to the optical theorem,qQ-G
762 
763 inline void G4hhElastic::CalculateBqQ13(G4double b2)
764 {
765   fBQ = b2;
766 
767   G4complex z1424 = G4complex(1./8./CLHEP::pi,0.);
768             z1424 /= Phi14() + Phi24() + fAlpha;
769       G4double c1424 = real(z1424)/(CLHEP::hbarc*CLHEP::hbarc);
770 
771   fBqQ  = 1. - fBQ;
772   fBQ /= 1. - fSigmaTot*fBQ*c1424; 
773 
774   G4cout<<"fSigmaTot*fBQ*c1424 = "<<fSigmaTot*fBQ*c1424<<G4endl;
775 
776   G4double ratio  = fBqQ + fBQ - fSigmaTot*fBqQ*fBQ*c1424; 
777   G4cout<<"ratio = "<<ratio<<G4endl;
778 
779   return ;
780 }
781 
782 /////////////////////////////////////////////////////
783 //
784 // Set fBQ at a given fBq=b according to the optical theorem, F1-F2
785 
786 inline void G4hhElastic::CalculateBqQ12(G4double b1)
787 {
788   fBq = b1;
789 
790   G4complex z1324 = G4complex(1./8./CLHEP::pi,0.);
791             z1324 /= Phi13() + Phi24() + fLambda + fEta;
792       G4double c1324 = real(z1324)/(CLHEP::hbarc*CLHEP::hbarc);
793 
794   G4complex z1423 = G4complex(1./8./CLHEP::pi,0.);
795             z1423 /= Phi14() + Phi23() + fLambda + fEta;
796       G4double c1423 = real(z1423)/(CLHEP::hbarc*CLHEP::hbarc);
797 
798   fBQ  = 1. - 2.*fBq;
799   fBQ /= 2. - fSigmaTot*fBq*(c1324+1423); 
800 
801   G4double ratio  = 2.*(fBq + fBQ) - fSigmaTot*fBq*fBQ*(c1324 + c1423); 
802   G4cout<<"ratio = "<<ratio<<G4endl;
803 
804   return ;
805 }
806 
807 /////////////////////////////////////////////////////
808 //
809 // Set fBQ at a given fBq=b according to the optical theorem, F1-F2-F3, 
810 // simplified meson-barion case g=G=q
811 
812 inline void G4hhElastic::CalculateBqQ123(G4double b1)
813 {
814   fBq = b1;
815 
816   G4complex z1324 = fCofF2*G4complex(1./8./CLHEP::pi,0.);
817             z1324 /= Phi13() + Phi24() + fLambda + fEta;
818       G4double c1324 = real(z1324)/(CLHEP::hbarc*CLHEP::hbarc);
819 
820   G4complex z1423 = fCofF2*G4complex(1./8./CLHEP::pi,0.);
821             z1423 /= Phi14() + Phi23() + fLambda + fEta;
822       G4double c1423 = real(z1423)/(CLHEP::hbarc*CLHEP::hbarc);
823 
824   G4complex z1314 = fCofF3*G4complex(1./8./CLHEP::pi,0.);
825             z1314 /= Phi13() + Phi14() + fEta;
826       G4double c1314 = real(z1314)/(CLHEP::hbarc*CLHEP::hbarc);
827 
828   G4complex z2324 = fCofF3*G4complex(1./8./CLHEP::pi,0.);
829             z2324 /= Phi23() + Phi24() + fEta;
830       G4double c2324 = real(z2324)/(CLHEP::hbarc*CLHEP::hbarc);
831 
832   G4complex z1323 = fCofF3*G4complex(1./8./CLHEP::pi,0.);
833             z1323 /= Phi13() + Phi23() + fLambda;
834       G4double c1323 = real(z1323)/(CLHEP::hbarc*CLHEP::hbarc);
835 
836   G4complex z1424 = fCofF3*G4complex(1./8./CLHEP::pi,0.);
837             z1424 /= Phi14() + Phi24() + fLambda;
838       G4double c1424 = real(z1424)/(CLHEP::hbarc*CLHEP::hbarc);
839 
840   G4double A = fSigmaTot*c2324;
841   G4double B = fSigmaTot*fBq*(c1324 + c1423 + c1323 + c1424) - 2.;
842   G4double C = 1. + fSigmaTot*fBq*fBq*c1314 - 2*fBq;
843   G4cout<<"A = "<<A<<"; B = "<<B<<"; C = "<<C<<G4endl;
844   G4cout<<"determinant = "<<B*B-4.*A*C<<G4endl;
845 
846   G4double x1 = ( -B - std::sqrt(B*B-4.*A*C) )/2./A;
847   G4double x2 = ( -B + std::sqrt(B*B-4.*A*C) )/2./A;
848   G4cout<<"x1 = "<<x1<<"; x2 = "<<x2<<G4endl;
849 
850   if( B*B-4.*A*C < 1.e-6 ) fBQ = std::abs(-B/2./A);
851   else if ( B < 0.)        fBQ = std::abs( ( -B - std::sqrt(B*B-4.*A*C) )/2./A);
852   else                     fBQ  = std::abs( ( -B + std::sqrt(B*B-4.*A*C) )/2./A);
853  
854   fOptRatio  = 2*(fBq+fBQ) - fSigmaTot*fBq*fBQ*(c1324 + c1423 + c1323 + c1424);
855   fOptRatio -= fSigmaTot*fBq*fBq*c1314 + fSigmaTot*c2324*fBQ*fBQ;
856   G4cout<<"BqQ123, fOptRatio = "<<fOptRatio<<G4endl;
857 
858   return ;
859 }
860 
861 
862 
863 /////////////////////  F123 stuff hh-elastic, qQ-qQ ///////////////////
864 //////////////////////////////////////////////////////////////
865 /////////////////////////////////////////////////////////////////
866 
867 inline G4complex G4hhElastic::GetAqq()
868 {
869   G4double re, im;
870 
871   re = fRq*fRq/8. + fAlphaP*G4Log(fSpp/fSo) + 8.*fLambda/9.;
872   im = -0.5*fAlphaP*fImCof*CLHEP::pi;
873   return G4complex(re,im);
874 }
875 
876 /////////////////////////////////////////////////////
877 //
878 //
879 
880 inline G4complex G4hhElastic::GetAQQ()
881 {
882   G4double re, im;
883 
884   re = fRQ*fRQ/8. + fAlphaP*G4Log(fSpp/fSo) + 2.*fLambda/9.;
885   im = -0.5*fAlphaP*fImCof*CLHEP::pi;
886   return G4complex(re,im);
887 }
888 
889 /////////////////////////////////////////////////////
890 //
891 //
892 
893 inline G4complex G4hhElastic::GetAqQ()
894 {
895   G4complex z = 0.5*( GetAqq() + GetAQQ() );
896   return z;
897 }
898 
899 /////////////////////////////////////////////////////
900 //
901 //
902 
903 inline G4double G4hhElastic::GetCofS1()
904 {
905   G4complex z = 1./( GetAqQ() + 4.*fLambda/9. );
906   G4double result = real(z);
907   result /= 4.*CLHEP::pi*CLHEP::hbarc*CLHEP::hbarc;
908   result *= fSigmaTot*fCofF2;
909   return result;
910 }
911 
912 /////////////////////////////////////////////////////
913 //
914 //
915 
916 inline G4double G4hhElastic::GetCofS2()
917 {
918   G4complex z = 1./( GetAqq() + GetAqQ() - 4.*fLambda/9. );
919   G4double result = real(z);
920   result /= 4.*CLHEP::pi*CLHEP::hbarc*CLHEP::hbarc;
921   result *= fSigmaTot*fCofF3;
922   return result;
923 }
924 
925 /////////////////////////////////////////////////////
926 //
927 //
928 
929 inline G4double G4hhElastic::GetCofS3()
930 {
931   G4complex z = 1./( GetAQQ() + GetAqQ() + 2.*fLambda/9. );
932   G4double result = real(z);
933   result /= 4.*CLHEP::pi*CLHEP::hbarc*CLHEP::hbarc;
934   result *= fSigmaTot*fCofF3;
935   return result;
936 }
937 
938 /////////////////////////////////////////////////////
939 //
940 //
941 
942 inline G4double G4hhElastic::GetOpticalRatio()
943 {
944   return fOptRatio;
945   // G4double sqrtBqBQ = std::sqrt(fBq*fBQ);
946   // G4double result = fBq + fBQ + 2.*sqrtBqBQ - 1.;
947   // result /= sqrtBqBQ*( GetCofS1()*sqrtBqBQ + GetCofS2()*fBq + GetCofS3()*fBQ );
948   // return result;
949 }
950 
951 
952 
953 /////////////////////////////////////////////////////
954 //
955 // Set fBQ at a given fBq=b according to the optical theorem
956 
957 inline void G4hhElastic::CalculateBQ(G4double b1)
958 {
959   fBq = b1;
960   G4double s1 = GetCofS1();
961   G4double s2 = GetCofS2();
962   G4double s3 = GetCofS3();
963   G4double sqrtBq = std::sqrt(fBq);
964 
965   // cofs of the fBQ 3rd equation
966 
967   G4double a = s3*sqrtBq;
968   G4double b = s1*fBq - 1.;
969   G4double c = (s2*fBq - 2.)*sqrtBq;
970   G4double d = 1. - fBq;
971 
972   // cofs of the incomplete 3rd equation
973 
974   G4double p  = c/a;
975            p -= b*b/a/a/3.;
976   G4double q  = d/a;
977            q -= b*c/a/a/3.;
978            q += 2*b*b*b/a/a/a/27.;
979 
980   // cofs for the incomplete colutions
981 
982   G4double D  = p*p*p/3./3./3.;
983            D += q*q/2./2.;
984   G4complex A1 = G4complex(- q/2., std::sqrt(-D) );
985   G4complex A  = std::pow(A1,1./3.);
986 
987   G4complex B1 = G4complex(- q/2., -std::sqrt(-D) );
988   G4complex B  = std::pow(B1,1./3.);
989 
990   // roots of the incomplete 3rd equation
991 
992   G4complex y1 = A + B;
993   G4complex y2 = -0.5*(A + B) + 0.5*std::sqrt(3.)*(A - B)*G4complex(0.,1.);
994   G4complex y3 = -0.5*(A + B) - 0.5*std::sqrt(3.)*(A - B)*G4complex(0.,1.);
995  
996   G4complex x1 = y1 - b/a/3.;
997   G4complex x2 = y2 - b/a/3.;
998   G4complex x3 = y3 - b/a/3.;
999 
1000   G4cout<<"re_x1 = "<<real(x1)<<"; re_x2 = "<<real(x2)<<"; re_x3 = "<<real(x3)<<G4endl;
1001   G4cout<<"im_x1 = "<<imag(x1)<<"; im_x2 = "<<imag(x2)<<"; im_x3 = "<<imag(x3)<<G4endl;
1002 
1003   G4double r1 = real(x1)*real(x1);
1004   G4double r2 = real(x2)*real(x2);
1005   G4double r3 = real(x3)*real(x3);
1006 
1007   if( r1 <= 1. && r1 >= 0. )      fBQ = r1;
1008   else if( r2 <= 1. && r2 >= 0. ) fBQ = r2;
1009   else if( r3 <= 1. && r3 >= 0. )      fBQ = r3;
1010   else fBQ = 1.;
1011   // fBQ = real(x3)*real(x3);
1012   G4double sqrtBqBQ = std::sqrt(fBq*fBQ);
1013   fOptRatio  = fBq + fBQ + 2.*sqrtBqBQ - 1.;
1014   fOptRatio /= sqrtBqBQ*( GetCofS1()*sqrtBqBQ + GetCofS2()*fBq + GetCofS3()*fBQ );
1015   G4cout<<"F123, fOptRatio = "<<fOptRatio<<G4endl;
1016   
1017   return ;
1018 }
1019 
1020 /////////////////////////////////////////////////////
1021 //
1022 //
1023 
1024 inline G4complex G4hhElastic::GetF1(G4double t)
1025 {
1026   G4double p = std::sqrt(0.25*fSpp - CLHEP::proton_mass_c2*CLHEP::proton_mass_c2);
1027   G4double  k    = p/CLHEP::hbarc;
1028   G4complex exp1 = fBq*std::exp(-GetAqq()*t);
1029   G4complex exp2 = fBQ*std::exp(-GetAQQ()*t);
1030   G4complex exp3 = 2.*std::sqrt(fBq*fBQ)*std::exp(-GetAqQ()*t);
1031 
1032   G4complex res  = exp1 + exp2 + exp3;
1033   res *=  0.25*k*fSigmaTot/CLHEP::pi;
1034   res *= G4complex(0.,1.);
1035   return res;
1036 }
1037 
1038 //////////////////////////////////////////////////////////////
1039 //
1040 // dsigma/dt(s,t) F1
1041 
1042 inline  G4double G4hhElastic::GetdsdtF1(G4double spp, G4double t)
1043 {
1044   fSpp = spp;
1045   G4double p = std::sqrt(0.25*spp - CLHEP::proton_mass_c2*CLHEP::proton_mass_c2);
1046   G4complex F1 = GetF1(t);
1047 
1048   G4double dsdt = CLHEP::pi/p/p;
1049   dsdt *= real(F1)*real(F1) + imag(F1)*imag(F1);  
1050   return dsdt;
1051 }
1052 
1053 /////////////////////////////////////////////////////
1054 //
1055 //
1056 
1057 inline G4complex G4hhElastic::GetF2(G4double t)
1058 {
1059   G4double p = std::sqrt(0.25*fSpp - CLHEP::proton_mass_c2*CLHEP::proton_mass_c2);
1060   G4double  k   = p/CLHEP::hbarc;
1061   G4complex z1  = GetAqq()*GetAQQ() - 16.*fLambda*fLambda/81.;
1062             z1 /= 2.*(GetAqQ() + 4.*fLambda/9.);
1063   G4complex exp1 = std::exp(-z1*t);
1064 
1065   G4complex z2 = 0.5*( GetAqQ() - 4.*fLambda/9.);
1066 
1067   G4complex exp2 = std::exp(-z2*t);
1068 
1069   G4complex res  = exp1 + exp2;
1070 
1071   G4complex z3 = GetAqQ() + 4.*fLambda/9.;
1072 
1073   res *=  0.25*k/CLHEP::pi;
1074   res *= G4complex(0.,1.);
1075   res /= z3;
1076   res *= fBq*fBQ*fSigmaTot*fSigmaTot/(8.*CLHEP::pi*CLHEP::hbarc*CLHEP::hbarc);
1077 
1078   return res;
1079 }
1080 
1081 //////////////////////////////////////////////////////////////
1082 //
1083 // dsigma/dt(s,t) F12
1084 
1085 inline  G4double G4hhElastic::GetdsdtF12(G4double spp, G4double t)
1086 {
1087   fSpp = spp;
1088   G4double p = std::sqrt(0.25*spp - CLHEP::proton_mass_c2*CLHEP::proton_mass_c2);
1089   G4complex F1 = GetF1(t) - GetF2(t);
1090 
1091   G4double dsdt = CLHEP::pi/p/p;
1092   dsdt *= real(F1)*real(F1) + imag(F1)*imag(F1);  
1093   return dsdt;
1094 }
1095 
1096 /////////////////////////////////////////////////////
1097 //
1098 //
1099 
1100 inline G4complex G4hhElastic::GetF3(G4double t)
1101 {
1102   G4double p = std::sqrt(0.25*fSpp - CLHEP::proton_mass_c2*CLHEP::proton_mass_c2);
1103   G4double  k   = p/CLHEP::hbarc;
1104   G4complex z1  = GetAqq()*GetAqQ() - 4.*fLambda*fLambda/81.;
1105             z1 /= GetAqq() + GetAqQ() - 4.*fLambda/9.;
1106 
1107   G4complex exp1 = std::exp(-z1*t)*fBq/(GetAqq() + GetAqQ() - 4.*fLambda/9.);
1108 
1109   G4complex z2 = GetAqQ()*GetAQQ() - 1.*fLambda*fLambda/81.;
1110             z2 /= GetAQQ() + GetAqQ() + 2.*fLambda/9.;
1111 
1112   G4complex exp2 = std::exp(-z2*t)*fBQ/(GetAQQ() + GetAqQ() + 2.*fLambda/9.);
1113 
1114   G4complex res  = exp1 + exp2;
1115 
1116 
1117   res *=  0.25*k/CLHEP::pi;
1118   res *= G4complex(0.,1.);
1119   res *= std::sqrt(fBq*fBQ)*fSigmaTot*fSigmaTot/(4.*CLHEP::pi*CLHEP::hbarc*CLHEP::hbarc);
1120 
1121   return res;
1122 }
1123 
1124 //////////////////////////////////////////////////////////////
1125 //
1126 // dsigma/dt(s,t) F123, sampling ds/dt
1127 
1128 inline  G4double G4hhElastic::GetdsdtF123(G4double t)
1129 {
1130   G4double  p   = std::sqrt(0.25*fSpp - CLHEP::proton_mass_c2*CLHEP::proton_mass_c2);
1131   G4complex F1  = GetF1(t);
1132             F1 -= fCofF2*GetF2(t);
1133             F1 -= fCofF3*GetF3(t);
1134   G4double dsdt = CLHEP::pi/p/p;
1135   dsdt         *= real(F1)*real(F1) + imag(F1)*imag(F1);  
1136   return dsdt;
1137 }
1138 
1139 //////////////////////////////////////////////////////////////
1140 //
1141 // dsigma/dt(s,t) F123
1142 
1143 inline  G4double G4hhElastic::GetExpRatioF123(G4double spp, G4double t)
1144 {
1145   fSpp = spp;
1146   G4double p = std::sqrt(0.25*spp - CLHEP::proton_mass_c2*CLHEP::proton_mass_c2);
1147 
1148   // qQ-ds/dt
1149 
1150   G4complex F1 = GetF1(t) - fCofF2*GetF2(t) - fCofF3*GetF3(t);
1151 
1152   G4double dsdt = CLHEP::pi/p/p;
1153   dsdt *= real(F1)*real(F1) + imag(F1)*imag(F1); 
1154 
1155   // exponent ds/dt
1156 
1157   G4complex F10 = GetF1(0.) - fCofF2*GetF2(0.) - fCofF3*GetF3(0.);
1158 
1159   fRhoReIm = real(F10)/imag(F10);
1160 
1161   G4double dsdt0 = CLHEP::pi/p/p;
1162   dsdt0 *= real(F10)*real(F10) + imag(F10)*imag(F10); 
1163 
1164   dsdt0 *= G4Exp(-fExpSlope*t);
1165 
1166   G4double ratio = dsdt/dsdt0;
1167  
1168   return ratio;
1169 }
1170 
1171 
1172 //
1173 //
1174 ////////////////////////////////////////////////////////////////////////
1175 
1176 #endif
1177 
1178 
1179 
1180 
1181 
1182 
1183