// ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // // $Id: G4CrossSectionDataLib.hh,v 1.1 2007/10/12 23:07:10 pia Exp $ // GEANT4 tag $Name: geant4-09-01-ref-00 $ // // Contact Author: Maria Grazia Pia (Maria.Grazia.Pia@cern.ch) // // History: // ----------- // Date Name Modification // 17 Feb 2008 M.G. Pia Created // 26 Feb 2009 // 02 Mar 2009 // ------------------------------------------------------------------- // Class description: // Computation of cross-sections from a formula for energies from 10 keV to 100 GeV // Further documentation available in Geant4 Physics Reference Manual // ------------------------------------------------------------------- #include "G4CsComptonAPC.hh" #include "globals.hh" #include "G4PhysicalConstants.hh" #include "G4SystemOfUnits.hh" #include "G4DataVector.hh" #include #include G4CsComptonAPC::G4CsComptonAPC() : eMin(1.*keV), eMax(100.*GeV) { } G4CsComptonAPC::~G4CsComptonAPC() { // dummy } double G4CsComptonAPC::CrossSection(int Z, double e) { // Cross section value double cross = DBL_MIN; double param1 = 0.150; double param2 = 0.375; double param3 = 0.0556; if (e >= eMin && e <= eMax) { G4double e0 = 15.*keV; if(Z < 2) e0 = 40.*keV; double eReference = std::max(e, e0); double x = eReference / electron_mass_c2; cross = CrossFormula(x,Z); if (e < e0) { G4double de0 = 1.*keV; double x0 = (e0+de0) / electron_mass_c2 ; G4double sigma = CrossFormula(x0,Z); G4double c1 = -e0*(sigma - cross)/(cross * de0); G4double c2 = param1; if (Z >=2 ) c2 = param2 - (param3 * std::log(double(Z))); G4double y = std::log(e/e0); cross *= std::exp(-y*(c1+c2*y)); } } return cross; } double G4CsComptonAPC::CrossFormula(double x, int z) { double Z(z); double d1 = 2.7965e-01*barn; double e1 = 1.9756e-05*barn; double f1 = -3.9178e-07*barn; double d2 = -1.8300e-01*barn; double e2 = -1.0205e-02*barn; double f2 = 6.8241e-05*barn; double d3 = 6.7527*barn; double e3 = -7.3913e-02*barn; double f3 = 6.0480e-05*barn; double d4 = -1.9798e+01*barn; double e4 = 2.7079e-02*barn; double f4 = 3.0274e-04*barn; double a = 20.; double b = 230.; double c = 440.; double Z2 = Z * Z; double p1z = Z*(d1 + (e1*Z) + (f1*Z2)); double p2z = Z*(d2 + (e2*Z) + (f2*Z2)); double p3z = Z*(d3 + (e3*Z) + (f3*Z2)); double p4z = Z*(d4 + (e4*Z) + (f4*Z2)); double xSquare = x * x; double sigma = (p1z * (std::log(1.+(2.*x))/x)) + ((p2z+(p3z*x)+(p4z*xSquare))/(1.+ (a*x)+(b* xSquare) + (c*x*xSquare))); return sigma; } //void G4CsComptonAPC::Print(int id) //{ // // Print cross section for a given identifier (Z) as a function of energy // // std::vector::iterator pos; // for (pos=energies.begin();pos!=energies.end();++pos) // { // double e = *pos; // double cross = CrossSection(id,e); // std::cout << "energy = " << e << ", cross section = " << cross << std::endl; // } //} double G4CsComptonAPC::ApplicableRangeMin() { // Applicability limits return eMin; } double G4CsComptonAPC::ApplicableRangeMax() { // Applicability limits return eMax; }