G4PomeronCrossSection.cc

Go to the documentation of this file.
00001 //
00002 // ********************************************************************
00003 // * License and Disclaimer                                           *
00004 // *                                                                  *
00005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
00006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
00007 // * conditions of the Geant4 Software License,  included in the file *
00008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
00009 // * include a list of copyright holders.                             *
00010 // *                                                                  *
00011 // * Neither the authors of this software system, nor their employing *
00012 // * institutes,nor the agencies providing financial support for this *
00013 // * work  make  any representation or  warranty, express or implied, *
00014 // * regarding  this  software system or assume any liability for its *
00015 // * use.  Please see the license in the file  LICENSE  and URL above *
00016 // * for the full disclaimer and the limitation of liability.         *
00017 // *                                                                  *
00018 // * This  code  implementation is the result of  the  scientific and *
00019 // * technical work of the GEANT4 collaboration.                      *
00020 // * By using,  copying,  modifying or  distributing the software (or *
00021 // * any work based  on the software)  you  agree  to acknowledge its *
00022 // * use  in  resulting  scientific  publications,  and indicate your *
00023 // * acceptance of all terms of the Geant4 Software license.          *
00024 // ********************************************************************
00025 //
00026 //
00027 // $Id$
00028 //
00029 
00030 #include "G4PomeronCrossSection.hh"
00031 #include "G4PhysicalConstants.hh"
00032 #include "G4SystemOfUnits.hh"
00033 #include "G4Pow.hh"                                      // factorial()
00034 
00035 G4PomeronCrossSection::G4PomeronCrossSection() :
00036    pomeron_Alpha(0), pomeron_Alpha_Hard(0), pomeron_Alphaprime(0),
00037    pomeron_C(0), pomeron_Gamma(0), pomeron_Gamma_Hard(0),
00038    pomeron_Rsquare(0), pomeron_S(0)
00039 {}
00040 
00041 
00042 G4PomeronCrossSection::~G4PomeronCrossSection()
00043 {;}
00044 //**********************************************************************************************
00045 
00046 G4PomeronCrossSection::G4PomeronCrossSection(const G4ParticleDefinition * particle)
00047     {
00048     G4int Encoding = std::abs(particle->GetPDGEncoding());
00049 
00050     if (std::abs(particle->GetBaryonNumber())!=0)
00051         InitForNucleon();
00052     else if (Encoding/100== 3 || Encoding/10 == 3)
00053         InitForKaon();
00054     else
00055         InitForPion();
00056     }
00057 
00058 //**********************************************************************************************
00059 
00060 G4PomeronCrossSection::G4PomeronCrossSection(const G4Proton * )
00061 {
00062         InitForNucleon();
00063 }
00064 G4PomeronCrossSection::G4PomeronCrossSection(const G4Neutron * )
00065 {
00066         InitForNucleon();
00067 }
00068 
00069 G4PomeronCrossSection::G4PomeronCrossSection(const G4PionPlus * )
00070 {
00071         InitForPion();
00072 }
00073 G4PomeronCrossSection::G4PomeronCrossSection(const G4PionMinus * )
00074 {
00075         InitForPion();
00076 }
00077 G4PomeronCrossSection::G4PomeronCrossSection(const G4PionZero * )
00078 {
00079         InitForPion();
00080 }
00081 
00082 G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonPlus * )
00083 {
00084         InitForKaon();
00085 }
00086 G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonMinus * )
00087 {
00088         InitForKaon();
00089 }
00090 G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonZero * )
00091 {
00092         InitForKaon();
00093 }
00094 G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonZeroLong * )
00095 {
00096         InitForKaon();
00097 }
00098 G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonZeroShort * )
00099 {
00100         InitForKaon();
00101 }
00102 G4PomeronCrossSection::G4PomeronCrossSection(const G4Gamma * )
00103 {
00104         InitForGamma();
00105 }
00106 
00107 G4double G4PomeronCrossSection::GetTotalCrossSection(const G4double S)
00108 {
00109         G4double FZ2= Expand(Z(S)/2);
00110         return SigP(S) * FZ2;
00111 }
00112 
00113 
00114 G4double G4PomeronCrossSection::GetElasticCrossSection(const G4double S)
00115 {
00116         return SigP(S)/pomeron_C *(Expand(Z(S)/2) - Expand(Z(S)));
00117 }
00118 
00119 G4double G4PomeronCrossSection::GetDiffractiveCrossSection(const G4double S)
00120 {
00121         return ( pomeron_C -1) * GetElasticCrossSection(S);
00122 }
00123 
00124 G4double G4PomeronCrossSection::GetInelasticCrossSection(const G4double S)
00125 {
00126         return GetTotalCrossSection(S) - GetElasticCrossSection(S);
00127 }
00128 
00129 //-------------------------Probabilities ----------------------------
00130 
00131 G4double G4PomeronCrossSection::GetTotalProbability(const G4double S,
00132                                   const G4double impactsquare)
00133 {
00134         return 2/pomeron_C*(1-std::exp(-1*Eikonal(S,impactsquare)));
00135 }
00136 
00137 G4double G4PomeronCrossSection::GetDiffractiveProbability(const G4double S,
00138                                   const G4double impactsquare)
00139 {
00140         return (pomeron_C-1)/pomeron_C * 
00141                              (GetTotalProbability(S,impactsquare) -
00142                               GetNondiffractiveProbability(S,impactsquare));
00143 }
00144 
00145 G4double G4PomeronCrossSection::GetNondiffractiveProbability(const G4double S,
00146                                   const G4double impactsquare)
00147 {
00148         return (1-std::exp(-2*Eikonal(S,impactsquare)))/pomeron_C;
00149 }
00150 
00151 G4double G4PomeronCrossSection::GetElasticProbability(const G4double S,
00152                                   const G4double impactsquare)
00153 {
00154         return (GetTotalProbability(S,impactsquare) -
00155                 GetInelasticProbability(S,impactsquare));
00156 }
00157 
00158 G4double G4PomeronCrossSection::GetInelasticProbability(const G4double S,
00159                                   const G4double impactsquare)
00160 {
00161         return GetNondiffractiveProbability(S,impactsquare) +
00162                 GetDiffractiveProbability(S,impactsquare);
00163 }
00164 
00165 G4double G4PomeronCrossSection::GetCutPomeronProbability(const G4double S,
00166                             const G4double impactsquare, const G4int nPomerons)
00167 {
00168         G4double factorial=G4Pow::GetInstance()->factorial(nPomerons);
00169          
00170         return std::exp(-2*Eikonal(S,impactsquare))/pomeron_C*
00171                 std::pow(2*Eikonal(S,impactsquare),nPomerons)/factorial;
00172 }
00173 
00174 // ---------------Temporary --- GF
00175 void G4PomeronCrossSection::Setgamma(const G4double agam)
00176 {
00177         pomeron_Gamma=agam/GeV/GeV;
00178 }
00179 
00180 
00181 //-----------------  private/Implementation methods
00182 
00183 void G4PomeronCrossSection::InitForNucleon()
00184 {
00185 //      pomeron_S=              3.0*GeV*GeV;
00186         pomeron_S=              2.7*GeV*GeV;
00187 //      pomeron_Gamma=          2.16/GeV/GeV;
00188 //      pomeron_Gamma=          3.96/GeV/GeV;
00189         pomeron_Gamma=          (2.6+3.96)/GeV/GeV;
00190         pomeron_C=              1.4;
00191         pomeron_Rsquare=        3.56/GeV/GeV;
00192 //      pomeron_Alpha=          1.0808;
00193         pomeron_Alpha=          0.9808;
00194         pomeron_Alphaprime=     0.25/GeV/GeV;     
00195         pomeron_Gamma_Hard =    0.0002/GeV/GeV;  // Note! if pomeron_Gamma_Hard != 0 to fit total pp-crosscection
00196                                                  // pomeron_Gamma_Soft shold be 2.35/GeV/GeV
00197         pomeron_Alpha_Hard =    1.47;            
00198 }
00199 
00200 void G4PomeronCrossSection::InitForPion()
00201 {
00202         pomeron_S=              1.5*GeV*GeV;
00203 //      pomeron_Gamma=          1.46/GeV/GeV;
00204         pomeron_Gamma=          2.17/GeV/GeV;
00205         pomeron_C=              1.6;
00206         pomeron_Rsquare=        2.36/GeV/GeV;
00207         pomeron_Alpha=          1.0808;
00208         pomeron_Alphaprime=     0.25/GeV/GeV;
00209         pomeron_Gamma_Hard =    0.0002/GeV/GeV;
00210         pomeron_Alpha_Hard =    1.47;
00211 }
00212 
00213 void G4PomeronCrossSection::InitForKaon()
00214 {
00215         pomeron_S=              2.3*GeV*GeV;
00216 //      pomeron_Gamma=          1.31/GeV/GeV;
00217         pomeron_Gamma=          1.92/GeV/GeV;
00218         pomeron_C=              1.8;
00219         pomeron_Rsquare=        1.96/GeV/GeV;
00220         pomeron_Alpha=          1.0808;
00221         pomeron_Alphaprime=     0.25/GeV/GeV;
00222         pomeron_Gamma_Hard =    0.0002/GeV/GeV;
00223         pomeron_Alpha_Hard =    1.47;
00224 }
00225 
00226 void G4PomeronCrossSection::InitForGamma()
00227 {
00228         pomeron_S=              1.7*GeV*GeV;
00229 //      pomeron_Gamma=          1.42/GeV/GeV;
00230         pomeron_Gamma=          2.07/GeV/GeV;
00231         pomeron_C=              1.7;
00232         pomeron_Rsquare=        2.16/GeV/GeV;
00233         pomeron_Alpha=          1.0808;
00234         pomeron_Alphaprime=     0.25/GeV/GeV;
00235         pomeron_Gamma_Hard =    0.0002/GeV/GeV;
00236         pomeron_Alpha_Hard =    1.47;
00237 }
00238 
00239 G4double G4PomeronCrossSection::Expand(G4double z)
00240 {
00241 
00242         G4double sum=1.;
00243         G4double current=1.;
00244         for (G4int j=2; j<21; j++ )
00245         {
00246                 current *= -z *(j-1)/sqr(j);
00247                 sum+=current;
00248         }
00249         return sum;
00250 }
00251 
00252 inline G4double G4PomeronCrossSection::Power(const G4double S)
00253 {
00254         return pomeron_Gamma *std::pow(S/pomeron_S, pomeron_Alpha -1);
00255 }
00256 
00257 inline G4double G4PomeronCrossSection::Z(const G4double S)
00258 {
00259         return 2*pomeron_C * Power(S) / Lambda(S);
00260 }
00261 
00262 inline G4double G4PomeronCrossSection::Lambda(const G4double S)
00263 {
00264         return pomeron_Rsquare+pomeron_Alphaprime*std::log(S/pomeron_S);
00265 }
00266 
00267 inline G4double G4PomeronCrossSection::SigP(const G4double S)
00268 {
00269         return 8 * pi * hbarc_squared * Power(S);
00270 }
00271 
00272 inline G4double G4PomeronCrossSection::Eikonal(const G4double S,
00273                                                const G4double impactsquare)
00274 {
00275         return Z(S)/2 * std::exp(-impactsquare/(4*Lambda(S)*hbarc_squared));
00276 }
00277 //*************************************************************************************************
00278 inline G4double G4PomeronCrossSection::PowerSoft(const G4double S)
00279     {
00280     return pomeron_Gamma *std::pow(S/pomeron_S, pomeron_Alpha -1);
00281     }
00282 
00283 inline G4double G4PomeronCrossSection::PowerHard(const G4double S)
00284     {
00285     return pomeron_Gamma_Hard*std::pow(S/pomeron_S, pomeron_Alpha_Hard -1);
00286     }
00287 
00288 inline G4double G4PomeronCrossSection::LambdaSoft(const G4double S)
00289     {
00290     return pomeron_Rsquare+pomeron_Alphaprime*std::log(S/pomeron_S);
00291     }
00292     
00293 inline G4double G4PomeronCrossSection::LambdaHard(const G4double /*S*/)
00294     {
00295     return pomeron_Rsquare; //+pomeron_Alphaprime*std::log(s/pomeron_S);
00296     }
00297 
00298 inline G4double G4PomeronCrossSection::Zsoft(const G4double S)
00299    {
00300    return 2*pomeron_C*PowerHard(S) / LambdaSoft(S);
00301    }
00302 
00303 inline G4double G4PomeronCrossSection::Zhard(const G4double S)
00304    {
00305    return 2*pomeron_C*PowerHard(S)/LambdaHard(S);
00306    }
00307 
00308 G4double G4PomeronCrossSection::SoftEikonal(G4double S, G4double impactsquare)
00309     {
00310     return Zsoft(S)/2*std::exp(-impactsquare/LambdaSoft(S)/hbarc_squared/4);
00311     }
00312      
00313 G4double G4PomeronCrossSection::HardEikonal(G4double S, G4double impactsquare)
00314     {
00315     return Zhard(S)/2*std::exp(-impactsquare/LambdaHard(S)/hbarc_squared/4);
00316     }
00317     
00318 //*************************************************************************************************

Generated on Mon May 27 17:49:24 2013 for Geant4 by  doxygen 1.4.7