Import Geant4 11.0.0 source tree
This commit is contained in:
committed by
Ben Morgan
parent
6399a014b6
commit
80e2389dd8
@@ -0,0 +1,117 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// History:
|
||||
// -----------
|
||||
// 10 Nov 2021 S. Guatelli & S. Bakr, Wollongong University - 1st implementation
|
||||
//
|
||||
// Class description
|
||||
// ----------------
|
||||
// Computation of K, L & M shell ECPSSR ionisation cross sections for protons and alphas
|
||||
// Based on the work of
|
||||
// - S. Bakr et al. (2021) NIM B, 507:11–19.
|
||||
// - S. Bakr et al (2018), NIMB B, 436: 285-291.
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
|
||||
#include "G4ANSTOecpssrKxsModel.hh"
|
||||
|
||||
#include "globals.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4ios.hh"
|
||||
|
||||
#include "G4EMDataSet.hh"
|
||||
#include "G4LogLogInterpolation.hh"
|
||||
#include "G4Proton.hh"
|
||||
#include "G4Alpha.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4ANSTOecpssrKxsModel::G4ANSTOecpssrKxsModel()
|
||||
{
|
||||
|
||||
G4cout << "Using ANSTO K Cross Sections! "<< G4endl;
|
||||
|
||||
interpolation = new G4LogLogInterpolation();
|
||||
for (G4int i=6; i<93; i++)
|
||||
{
|
||||
protonDataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
protonDataSetMap[i]->LoadData("pixe_ANSTO/proton/k-");
|
||||
}
|
||||
|
||||
for (G4int i=6; i<93; i++)
|
||||
{
|
||||
alphaDataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
alphaDataSetMap[i]->LoadData("pixe_ANSTO/alpha/k-");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4ANSTOecpssrKxsModel::~G4ANSTOecpssrKxsModel()
|
||||
{
|
||||
protonDataSetMap.clear();
|
||||
alphaDataSetMap.clear();
|
||||
delete interpolation;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double G4ANSTOecpssrKxsModel::CalculateCrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
|
||||
{
|
||||
G4Proton* aProton = G4Proton::Proton();
|
||||
G4Alpha* aAlpha = G4Alpha::Alpha();
|
||||
G4double sigma = 0;
|
||||
|
||||
if (massIncident == aProton->GetPDGMass())
|
||||
{
|
||||
if (energyIncident > 0.2*MeV && energyIncident < 5.*MeV && zTarget < 93 && zTarget > 5) {
|
||||
|
||||
sigma = protonDataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > protonDataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
}
|
||||
|
||||
else if (massIncident == aAlpha->GetPDGMass())
|
||||
{
|
||||
if (energyIncident > 0.2*MeV && energyIncident < 40.*MeV && zTarget < 93 && zTarget > 5) {
|
||||
|
||||
sigma = alphaDataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > alphaDataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
sigma = 0.;
|
||||
}
|
||||
|
||||
// sigma is in internal units: it has been converted from
|
||||
// the input file in barns bt the EmDataset
|
||||
return sigma;
|
||||
}
|
||||
@@ -0,0 +1,207 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// History:
|
||||
// -----------
|
||||
// 10 Nov 2021 S. Guatelli & S. Bakr, Wollongong University - 1st implementation
|
||||
//
|
||||
// Class description
|
||||
// ----------------
|
||||
// Computation of K, L & M shell ECPSSR ionisation cross sections for protons and alphas
|
||||
// Based on the work of
|
||||
// - S. Bakr et al. (2021) NIM B, 507:11–19.
|
||||
// - S. Bakr et al (2018), NIMB B, 436: 285-291.
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
|
||||
#include "G4ANSTOecpssrLixsModel.hh"
|
||||
|
||||
#include "globals.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4ios.hh"
|
||||
|
||||
#include "G4EMDataSet.hh"
|
||||
#include "G4LinInterpolation.hh"
|
||||
#include "G4Proton.hh"
|
||||
#include "G4Alpha.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4ANSTOecpssrLixsModel::G4ANSTOecpssrLixsModel()
|
||||
{
|
||||
G4cout << "Using ANSTO L Cross Sections! "<< G4endl;
|
||||
|
||||
interpolation = new G4LinInterpolation();
|
||||
|
||||
for (G4int i=26; i<93; i++)
|
||||
{
|
||||
protonL1DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
protonL1DataSetMap[i]->LoadData("pixe_ANSTO/proton/l1-");
|
||||
|
||||
protonL2DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
protonL2DataSetMap[i]->LoadData("pixe_ANSTO/proton/l2-");
|
||||
|
||||
protonL3DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
protonL3DataSetMap[i]->LoadData("pixe_ANSTO/proton/l3-");
|
||||
}
|
||||
|
||||
for (G4int i=26; i<93; i++)
|
||||
{
|
||||
alphaL1DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
alphaL1DataSetMap[i]->LoadData("pixe_ANSTO/alpha/l1-");
|
||||
|
||||
alphaL2DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
alphaL2DataSetMap[i]->LoadData("pixe_ANSTO/alpha/l2-");
|
||||
|
||||
alphaL3DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
alphaL3DataSetMap[i]->LoadData("pixe_ANSTO/alpha/l3-");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4ANSTOecpssrLixsModel::~G4ANSTOecpssrLixsModel()
|
||||
{
|
||||
protonL1DataSetMap.clear();
|
||||
alphaL1DataSetMap.clear();
|
||||
|
||||
protonL2DataSetMap.clear();
|
||||
alphaL2DataSetMap.clear();
|
||||
|
||||
protonL3DataSetMap.clear();
|
||||
alphaL3DataSetMap.clear();
|
||||
|
||||
delete interpolation;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double G4ANSTOecpssrLixsModel::CalculateL1CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
|
||||
{
|
||||
G4Proton* aProton = G4Proton::Proton();
|
||||
G4Alpha* aAlpha = G4Alpha::Alpha();
|
||||
G4double sigma = 0;
|
||||
|
||||
if (massIncident == aProton->GetPDGMass())
|
||||
{
|
||||
|
||||
if (energyIncident > 0.2*MeV && energyIncident < 5.*MeV && zTarget < 93 && zTarget > 25) {
|
||||
|
||||
sigma = protonL1DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > protonL1DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
|
||||
else if (massIncident == aAlpha->GetPDGMass())
|
||||
{
|
||||
|
||||
if (energyIncident > 0.2*MeV && energyIncident < 40.*MeV && zTarget < 93 && zTarget > 25) {
|
||||
|
||||
sigma = alphaL1DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > alphaL1DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
else
|
||||
{
|
||||
sigma = 0.;
|
||||
}
|
||||
}
|
||||
}
|
||||
// sigma is in internal units: it has been converted from
|
||||
// the input file in barns bt the EmDataset
|
||||
return sigma;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double G4ANSTOecpssrLixsModel::CalculateL2CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
|
||||
{
|
||||
G4Proton* aProton = G4Proton::Proton();
|
||||
G4Alpha* aAlpha = G4Alpha::Alpha();
|
||||
G4double sigma = 0;
|
||||
|
||||
if (massIncident == aProton->GetPDGMass())
|
||||
{
|
||||
if (energyIncident > 0.2*MeV && energyIncident < 5.*MeV && zTarget < 93 && zTarget > 25) {
|
||||
|
||||
sigma = protonL2DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > protonL2DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
|
||||
else if (massIncident == aAlpha->GetPDGMass())
|
||||
{
|
||||
if (energyIncident > 0.2*MeV && energyIncident < 40.*MeV && zTarget < 93 && zTarget > 25) {
|
||||
|
||||
sigma = alphaL2DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > alphaL2DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
else
|
||||
{
|
||||
sigma = 0.;
|
||||
}
|
||||
}
|
||||
}
|
||||
// sigma is in internal units: it has been converted from
|
||||
// the input file in barns bt the EmDataset
|
||||
return sigma;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double G4ANSTOecpssrLixsModel::CalculateL3CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
|
||||
{
|
||||
G4Proton* aProton = G4Proton::Proton();
|
||||
G4Alpha* aAlpha = G4Alpha::Alpha();
|
||||
G4double sigma = 0;
|
||||
|
||||
if (massIncident == aProton->GetPDGMass())
|
||||
{
|
||||
if (energyIncident > 0.2*MeV && energyIncident < 5.*MeV && zTarget < 93 && zTarget > 25) {
|
||||
|
||||
sigma = protonL3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > protonL3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
}
|
||||
|
||||
else if (massIncident == aAlpha->GetPDGMass())
|
||||
{
|
||||
if (energyIncident > 0.2*MeV && energyIncident < 40.*MeV && zTarget < 93 && zTarget > 25) {
|
||||
|
||||
sigma = alphaL3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > alphaL3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
sigma = 0.;
|
||||
}
|
||||
|
||||
|
||||
// sigma is in internal units: it has been converted from
|
||||
// the input file in barns bt the EmDataset
|
||||
return sigma;
|
||||
}
|
||||
@@ -0,0 +1,323 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// History:
|
||||
// -----------
|
||||
// 10 Nov 2021 S. Guatelli & S. Bakr, Wollongong University - 1st implementation
|
||||
//
|
||||
// Class description
|
||||
// ----------------
|
||||
// Computation of K, L & M shell ECPSSR ionisation cross sections for protons and alphas
|
||||
// Based on the work of
|
||||
// - S. Bakr et al. (2021) NIM B, 507:11–19.
|
||||
// - S. Bakr et al (2018), NIMB B, 436: 285-291.
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
|
||||
#include "globals.hh"
|
||||
#include "G4ios.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
|
||||
#include "G4EMDataSet.hh"
|
||||
#include "G4LinInterpolation.hh"
|
||||
#include "G4Proton.hh"
|
||||
#include "G4Alpha.hh"
|
||||
|
||||
#include "G4ANSTOecpssrMixsModel.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4ANSTOecpssrMixsModel::G4ANSTOecpssrMixsModel()
|
||||
{
|
||||
G4cout << "Using ANSTO M Cross Sections! "<< G4endl;
|
||||
|
||||
interpolation = new G4LinInterpolation();
|
||||
|
||||
for (G4int i=67; i<93; i++)
|
||||
{
|
||||
protonM1DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
protonM1DataSetMap[i]->LoadData("pixe_ANSTO/proton/m1-");
|
||||
|
||||
protonM2DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
protonM2DataSetMap[i]->LoadData("pixe_ANSTO/proton/m2-");
|
||||
|
||||
protonM3DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
protonM3DataSetMap[i]->LoadData("pixe_ANSTO/proton/m3-");
|
||||
|
||||
protonM4DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
protonM4DataSetMap[i]->LoadData("pixe_ANSTO/proton/m4-");
|
||||
|
||||
protonM5DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
protonM5DataSetMap[i]->LoadData("pixe_ANSTO/proton/m5-");
|
||||
}
|
||||
|
||||
protonMiXsVector.push_back(protonM1DataSetMap);
|
||||
protonMiXsVector.push_back(protonM2DataSetMap);
|
||||
protonMiXsVector.push_back(protonM3DataSetMap);
|
||||
protonMiXsVector.push_back(protonM4DataSetMap);
|
||||
protonMiXsVector.push_back(protonM5DataSetMap);
|
||||
|
||||
|
||||
for (G4int i=67; i<93; i++)
|
||||
{
|
||||
alphaM1DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
alphaM1DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m1-");
|
||||
|
||||
alphaM2DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
alphaM2DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m2-");
|
||||
|
||||
alphaM3DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
alphaM3DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m3-");
|
||||
|
||||
alphaM4DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
alphaM4DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m4-");
|
||||
|
||||
alphaM5DataSetMap[i] = new G4EMDataSet(i,interpolation);
|
||||
alphaM5DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m5-");
|
||||
}
|
||||
|
||||
alphaMiXsVector.push_back(alphaM1DataSetMap);
|
||||
alphaMiXsVector.push_back(alphaM2DataSetMap);
|
||||
alphaMiXsVector.push_back(alphaM3DataSetMap);
|
||||
alphaMiXsVector.push_back(alphaM4DataSetMap);
|
||||
alphaMiXsVector.push_back(alphaM5DataSetMap);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4ANSTOecpssrMixsModel::~G4ANSTOecpssrMixsModel()
|
||||
{
|
||||
protonM1DataSetMap.clear();
|
||||
alphaM1DataSetMap.clear();
|
||||
|
||||
protonM2DataSetMap.clear();
|
||||
alphaM2DataSetMap.clear();
|
||||
|
||||
protonM3DataSetMap.clear();
|
||||
alphaM3DataSetMap.clear();
|
||||
|
||||
protonM4DataSetMap.clear();
|
||||
alphaM4DataSetMap.clear();
|
||||
|
||||
protonM5DataSetMap.clear();
|
||||
alphaM5DataSetMap.clear();
|
||||
|
||||
delete interpolation;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double G4ANSTOecpssrMixsModel::CalculateMiCrossSection(G4int zTarget,G4double massIncident, G4double energyIncident, G4int mShellId)
|
||||
{
|
||||
G4Proton* aProton = G4Proton::Proton();
|
||||
G4Alpha* aAlpha = G4Alpha::Alpha();
|
||||
G4double sigma = 0;
|
||||
G4int mShellIndex = mShellId -1;
|
||||
|
||||
if (massIncident == aProton->GetPDGMass())
|
||||
{
|
||||
if (energyIncident > 0.2*MeV && energyIncident < 5.*MeV && zTarget < 93 && zTarget > 66) {
|
||||
|
||||
sigma = protonMiXsVector[mShellIndex][zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > protonMiXsVector[mShellIndex][zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
}
|
||||
|
||||
else if (massIncident == aAlpha->GetPDGMass())
|
||||
{
|
||||
if (energyIncident > 0.2*MeV && energyIncident < 10.*MeV && zTarget < 93 && zTarget > 66) {
|
||||
|
||||
sigma = alphaMiXsVector[mShellIndex][zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > alphaMiXsVector[mShellIndex][zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
sigma = 0.;
|
||||
}
|
||||
|
||||
|
||||
// sigma is in internal units: it has been converted from
|
||||
// the input file in barns bt the EmDataset
|
||||
return sigma;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double G4ANSTOecpssrMixsModel::CalculateM1CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
|
||||
{
|
||||
|
||||
// mShellId
|
||||
return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 1);
|
||||
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double G4ANSTOecpssrMixsModel::CalculateM2CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
|
||||
{
|
||||
|
||||
// mShellId
|
||||
return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 2);
|
||||
|
||||
/*
|
||||
|
||||
G4Proton* aProton = G4Proton::Proton();
|
||||
G4Alpha* aAlpha = G4Alpha::Alpha();
|
||||
G4double sigma = 0;
|
||||
|
||||
if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) {
|
||||
|
||||
if (massIncident == aProton->GetPDGMass())
|
||||
{
|
||||
sigma = protonM2DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > protonM2DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
else if (massIncident == aAlpha->GetPDGMass())
|
||||
{
|
||||
sigma = alphaM2DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > alphaM2DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
else
|
||||
{
|
||||
sigma = 0.;
|
||||
}
|
||||
}
|
||||
|
||||
// sigma is in internal units: it has been converted from
|
||||
// the input file in barns bt the EmDataset
|
||||
return sigma;
|
||||
*/
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double G4ANSTOecpssrMixsModel::CalculateM3CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
|
||||
{
|
||||
|
||||
return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 3);
|
||||
/*
|
||||
|
||||
|
||||
G4Proton* aProton = G4Proton::Proton();
|
||||
G4Alpha* aAlpha = G4Alpha::Alpha();
|
||||
G4double sigma = 0;
|
||||
|
||||
if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) {
|
||||
|
||||
if (massIncident == aProton->GetPDGMass())
|
||||
{
|
||||
sigma = protonM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > protonM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
else if (massIncident == aAlpha->GetPDGMass())
|
||||
{
|
||||
sigma = alphaM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > alphaM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
else
|
||||
{
|
||||
sigma = 0.;
|
||||
}
|
||||
}
|
||||
|
||||
// sigma is in internal units: it has been converted from
|
||||
// the input file in barns bt the EmDataset
|
||||
return sigma;
|
||||
*/
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double G4ANSTOecpssrMixsModel::CalculateM4CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
|
||||
{
|
||||
|
||||
return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 4);
|
||||
/*
|
||||
G4Proton* aProton = G4Proton::Proton();
|
||||
G4Alpha* aAlpha = G4Alpha::Alpha();
|
||||
G4double sigma = 0;
|
||||
|
||||
if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) {
|
||||
|
||||
if (massIncident == aProton->GetPDGMass())
|
||||
{
|
||||
sigma = protonM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > protonM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
else if (massIncident == aAlpha->GetPDGMass())
|
||||
{
|
||||
sigma = alphaM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > alphaM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
else
|
||||
{
|
||||
sigma = 0.;
|
||||
}
|
||||
}
|
||||
|
||||
// sigma is in internal units: it has been converted from
|
||||
// the input file in barns bt the EmDataset
|
||||
return sigma;
|
||||
*/
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double G4ANSTOecpssrMixsModel::CalculateM5CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
|
||||
{
|
||||
|
||||
return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 5);
|
||||
/*
|
||||
G4Proton* aProton = G4Proton::Proton();
|
||||
G4Alpha* aAlpha = G4Alpha::Alpha();
|
||||
G4double sigma = 0;
|
||||
|
||||
if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) {
|
||||
|
||||
if (massIncident == aProton->GetPDGMass())
|
||||
{
|
||||
sigma = protonM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > protonM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
else if (massIncident == aAlpha->GetPDGMass())
|
||||
{
|
||||
sigma = alphaM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
|
||||
if (sigma !=0 && energyIncident > alphaM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
|
||||
}
|
||||
else
|
||||
{
|
||||
sigma = 0.;
|
||||
}
|
||||
}
|
||||
|
||||
// sigma is in internal units: it has been converted from
|
||||
// the input file in barns bt the EmDataset
|
||||
return sigma;
|
||||
*/
|
||||
}
|
||||
@@ -283,8 +283,12 @@ void G4AtomicTransitionManager::Initialise()
|
||||
isInitialized = true;
|
||||
|
||||
// Selection of fluorescence files
|
||||
G4String fluoDirectory = (G4EmParameters::Instance()->BeardenFluoDir()?
|
||||
|
||||
G4String fluoDirectory = "/fluor";
|
||||
|
||||
fluoDirectory = (G4EmParameters::Instance()->BeardenFluoDir()?
|
||||
"/fluor_Bearden":"/fluor");
|
||||
|
||||
// infTableLimit is initialized to 6 because EADL lacks data for Z<=5
|
||||
G4ShellData* shellManager = new G4ShellData;
|
||||
shellManager->LoadData(fluoDirectory+"/binding");
|
||||
@@ -292,15 +296,23 @@ void G4AtomicTransitionManager::Initialise()
|
||||
// initialization of the data for auger effect
|
||||
augerData = new G4AugerData;
|
||||
|
||||
if (G4EmParameters::Instance()->ANSTOFluoDir())
|
||||
{
|
||||
fluoDirectory = "/fluor_ANSTO";
|
||||
G4cout << "The ANSTO fluorescence radiation yields substitute the EADL data libraries" << G4endl;
|
||||
}
|
||||
// Fills shellTable with the data from EADL, identities and binding
|
||||
// energies of shells
|
||||
for (G4int Z = zMin; Z<= zMax; ++Z)
|
||||
{
|
||||
|
||||
if ((Z > 92) && (G4EmParameters::Instance()->ANSTOFluoDir())) fluoDirectory ="/fluor";
|
||||
|
||||
std::vector<G4AtomicShell*> vectorOfShells;
|
||||
size_t shellIndex = 0;
|
||||
|
||||
size_t numberOfShells = shellManager->NumberOfShells(Z);
|
||||
// G4cout << "For Z= " << Z << " " << numberOfShells << " shells" << G4endl;
|
||||
// G4cout << fluoDirectory <<" For Z= " << Z << " " << numberOfShells << " shells" << G4endl;
|
||||
for (shellIndex = 0; shellIndex<numberOfShells; ++shellIndex)
|
||||
{
|
||||
G4int shellId = shellManager->ShellId(Z,shellIndex);
|
||||
@@ -315,8 +327,12 @@ void G4AtomicTransitionManager::Initialise()
|
||||
|
||||
// Fills transitionTable with the data from EADL, identities, transition
|
||||
// energies and transition probabilities
|
||||
if (G4EmParameters::Instance()->ANSTOFluoDir()) fluoDirectory = "/fluor_ANSTO";
|
||||
|
||||
|
||||
for (G4int Znum= infTableLimit; Znum<=supTableLimit; ++Znum)
|
||||
{
|
||||
if ((Znum > 92) && (G4EmParameters::Instance()->ANSTOFluoDir())) fluoDirectory ="/fluor";
|
||||
G4FluoData* fluoManager = new G4FluoData(fluoDirectory);
|
||||
std::vector<G4FluoTransition*> vectorOfTransitions;
|
||||
fluoManager->LoadData(Znum);
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
//
|
||||
//
|
||||
//
|
||||
// Author: Alfonso Mmantero (Alfonso.Mantero@ge.infn.it)
|
||||
// Author: Alfonso Mantero (Alfonso.Mantero@ge.infn.it)
|
||||
//
|
||||
// History:
|
||||
// -----------
|
||||
@@ -407,27 +407,7 @@ std::vector<G4AugerTransition> G4AugerData::LoadData(G4int Z)
|
||||
|
||||
void G4AugerData::BuildAugerTransitionTable()
|
||||
{
|
||||
const G4MaterialTable* materialTable = G4Material::GetMaterialTable();
|
||||
|
||||
G4int nMaterials = G4Material::GetNumberOfMaterials();
|
||||
|
||||
G4DataVector activeZ;
|
||||
activeZ.clear();
|
||||
|
||||
for (G4int mLocal=0; mLocal<nMaterials; mLocal++) {
|
||||
const G4Material* material= (*materialTable)[mLocal];
|
||||
const G4ElementVector* elementVector = material->GetElementVector();
|
||||
const size_t nElements = material->GetNumberOfElements();
|
||||
|
||||
for (size_t iEl=0; iEl<nElements; iEl++) {
|
||||
G4Element* element = (*elementVector)[iEl];
|
||||
G4double Z = element->GetZ();
|
||||
if (!(activeZ.contains(Z))) {
|
||||
activeZ.push_back(Z);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (G4int element = 6; element < 100; element++)
|
||||
for (G4int element = 6; element < 100; ++element)
|
||||
{
|
||||
augerTransitionTable.insert(trans_Table::value_type(element,LoadData(element)));
|
||||
}
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4DataVector.hh"
|
||||
#include "G4FluoTransition.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
G4FluoData::G4FluoData(const G4String& dir)
|
||||
{
|
||||
@@ -213,6 +212,7 @@ void G4FluoData::LoadData(G4int Z)
|
||||
ost << "/fl-tr-pr-"<<".dat";
|
||||
}
|
||||
G4String name(ost.str());
|
||||
|
||||
|
||||
char* path = std::getenv("G4LEDATA");
|
||||
if (!path)
|
||||
@@ -223,7 +223,12 @@ void G4FluoData::LoadData(G4int Z)
|
||||
}
|
||||
|
||||
G4String pathString(path);
|
||||
|
||||
G4String dirFile = pathString + fluoDirectory + name;
|
||||
|
||||
//G4cout << "G4FluoData:: LoadData() name: " << dirFile << G4endl;
|
||||
|
||||
|
||||
std::ifstream file(dirFile);
|
||||
std::filebuf* lsdp = file.rdbuf();
|
||||
|
||||
|
||||
@@ -217,7 +217,7 @@ void G4JAEAElasticScatteringModel::ReadData(size_t Z, const char* path)
|
||||
dataCS[Z] = new G4PhysicsFreeVector(300,0.01,3.,/*spine=*/true);
|
||||
//Note that the total cross section and energy are converted to the internal units.
|
||||
for (G4int i=0;i<300;++i)
|
||||
dataCS[Z]->PutValue(i,10.*i*1e-3,ES_Data[Z]->at(i)*1e-22);
|
||||
dataCS[Z]->PutValues(i,10.*i*1e-3,ES_Data[Z]->at(i)*1e-22);
|
||||
|
||||
// Activation of spline interpolation
|
||||
dataCS[Z] ->FillSecondDerivatives();
|
||||
|
||||
+1
-1
@@ -201,7 +201,7 @@ void G4JAEAPolarizedElasticScatteringModel::ReadData(size_t Z, const char* path)
|
||||
dataCS[Z] = new G4PhysicsFreeVector(300,0.01,3.,/*spline=*/true);
|
||||
|
||||
for (G4int i=0;i<300;++i)
|
||||
dataCS[Z]->PutValue(i,10.*i*1e-3,Polarized_ES_Data[Z]->at(i)*1e-22);
|
||||
dataCS[Z]->PutValues(i,10.*i*1e-3,Polarized_ES_Data[Z]->at(i)*1e-22);
|
||||
|
||||
// Activation of spline interpolation
|
||||
dataCS[Z] ->FillSecondDerivatives();
|
||||
|
||||
@@ -67,7 +67,7 @@ static const G4double ln10 = G4Log(10.);
|
||||
|
||||
G4LivermoreComptonModel::G4LivermoreComptonModel(const G4ParticleDefinition*,
|
||||
const G4String& nam)
|
||||
: G4VEmModel(nam),isInitialised(false)
|
||||
: G4VEmModel(nam),maxZ(100),isInitialised(false)
|
||||
{
|
||||
verboseLevel=1 ;
|
||||
// Verbosity scale:
|
||||
@@ -91,16 +91,19 @@ G4LivermoreComptonModel::G4LivermoreComptonModel(const G4ParticleDefinition*,
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4LivermoreComptonModel::~G4LivermoreComptonModel()
|
||||
{
|
||||
if(IsMaster()) {
|
||||
{
|
||||
if(IsMaster())
|
||||
{
|
||||
delete shellData;
|
||||
shellData = nullptr;
|
||||
delete profileData;
|
||||
profileData = nullptr;
|
||||
for(G4int i=0; i<maxZ; ++i) {
|
||||
if(data[i]) {
|
||||
delete data[i];
|
||||
data[i] = nullptr;
|
||||
for(G4int i = 0; i <= maxZ; ++i)
|
||||
{
|
||||
if(data[i])
|
||||
{
|
||||
delete data[i];
|
||||
data[i] = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -120,33 +123,27 @@ void G4LivermoreComptonModel::Initialise(const G4ParticleDefinition* particle,
|
||||
// Access to elements
|
||||
char* path = std::getenv("G4LEDATA");
|
||||
|
||||
G4ProductionCutsTable* theCoupleTable =
|
||||
G4ProductionCutsTable::GetProductionCutsTable();
|
||||
G4int numOfCouples = theCoupleTable->GetTableSize();
|
||||
|
||||
for(G4int i=0; i<numOfCouples; ++i) {
|
||||
const G4Material* material =
|
||||
theCoupleTable->GetMaterialCutsCouple(i)->GetMaterial();
|
||||
const G4ElementVector* theElementVector = material->GetElementVector();
|
||||
G4int nelm = material->GetNumberOfElements();
|
||||
|
||||
for (G4int j=0; j<nelm; ++j) {
|
||||
G4int Z = G4lrint((*theElementVector)[j]->GetZ());
|
||||
if(Z < 1) { Z = 1; }
|
||||
else if(Z > maxZ){ Z = maxZ; }
|
||||
const G4ElementTable* elemTable = G4Element::GetElementTable();
|
||||
size_t numElems = (*elemTable).size();
|
||||
for(size_t ie = 0; ie < numElems; ++ie)
|
||||
{
|
||||
const G4Element* elem = (*elemTable)[ie];
|
||||
const G4int Z = std::min(maxZ, elem->GetZasInt());
|
||||
|
||||
if( (!data[Z]) ) { ReadData(Z, path); }
|
||||
if(data[Z] == nullptr)
|
||||
{
|
||||
ReadData(Z, path);
|
||||
}
|
||||
}
|
||||
|
||||
// For Doppler broadening
|
||||
if(!shellData) {
|
||||
if(shellData == nullptr) {
|
||||
shellData = new G4ShellData();
|
||||
shellData->SetOccupancyData();
|
||||
G4String file = "/doppler/shell-doppler";
|
||||
shellData->LoadData(file);
|
||||
}
|
||||
if(!profileData) { profileData = new G4DopplerProfile(); }
|
||||
if(profileData == nullptr) { profileData = new G4DopplerProfile(); }
|
||||
|
||||
InitialiseElementSelectors(particle, cuts);
|
||||
}
|
||||
@@ -187,12 +184,12 @@ void G4LivermoreComptonModel::ReadData(size_t Z, const char* path)
|
||||
G4cout << "G4LivermoreComptonModel::ReadData()"
|
||||
<< G4endl;
|
||||
}
|
||||
if(data[Z]) { return; }
|
||||
if(data[Z] != nullptr) { return; }
|
||||
const char* datadir = path;
|
||||
if(!datadir)
|
||||
if(datadir == nullptr)
|
||||
{
|
||||
datadir = std::getenv("G4LEDATA");
|
||||
if(!datadir)
|
||||
if(datadir == nullptr)
|
||||
{
|
||||
G4Exception("G4LivermoreComptonModel::ReadData()",
|
||||
"em0006",FatalException,
|
||||
@@ -204,7 +201,12 @@ void G4LivermoreComptonModel::ReadData(size_t Z, const char* path)
|
||||
data[Z] = new G4PhysicsFreeVector();
|
||||
|
||||
std::ostringstream ost;
|
||||
ost << datadir << "/livermore/comp/ce-cs-" << Z <<".dat";
|
||||
if(G4EmParameters::Instance()->LivermoreDataDir() == "livermore"){
|
||||
ost << datadir << "/livermore/comp/ce-cs-" << Z <<".dat";
|
||||
}else{
|
||||
ost << datadir << "/epics2017/comp/ce-cs-" << Z <<".dat";
|
||||
}
|
||||
|
||||
std::ifstream fin(ost.str().c_str());
|
||||
|
||||
if( !fin.is_open())
|
||||
@@ -250,11 +252,11 @@ G4LivermoreComptonModel::ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
|
||||
|
||||
// if element was not initialised
|
||||
// do initialisation safely for MT mode
|
||||
if(!pv)
|
||||
if(pv == nullptr)
|
||||
{
|
||||
InitialiseForElement(0, intZ);
|
||||
pv = data[intZ];
|
||||
if(!pv) { return cs; }
|
||||
if(pv == nullptr) { return cs; }
|
||||
}
|
||||
|
||||
G4int n = pv->GetVectorLength() - 1;
|
||||
@@ -514,31 +516,45 @@ void G4LivermoreComptonModel::SampleSecondaries(
|
||||
}
|
||||
//This should never happen
|
||||
if(bindingE < 0.0)
|
||||
G4Exception("G4LivermoreComptonModel::SampleSecondaries()",
|
||||
"em2050",FatalException,"Negative local energy deposit");
|
||||
G4Exception("G4LivermoreComptonModel::SampleSecondaries()", "em2050",
|
||||
FatalException, "Negative local energy deposit");
|
||||
|
||||
fParticleChange->ProposeLocalEnergyDeposit(bindingE);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double
|
||||
G4double
|
||||
G4LivermoreComptonModel::ComputeScatteringFunction(G4double x, G4int Z)
|
||||
{
|
||||
G4double value = Z;
|
||||
if (x <= ScatFuncFitParam[Z][2]) {
|
||||
if(x <= ScatFuncFitParam[Z][3])
|
||||
{
|
||||
G4double lgq = G4Log(x) / ln10;
|
||||
|
||||
G4double lgq = G4Log(x)/ln10;
|
||||
|
||||
if (lgq < ScatFuncFitParam[Z][1]) {
|
||||
value = ScatFuncFitParam[Z][3] + lgq*ScatFuncFitParam[Z][4];
|
||||
} else {
|
||||
value = ScatFuncFitParam[Z][5] + lgq*ScatFuncFitParam[Z][6] +
|
||||
lgq*lgq*ScatFuncFitParam[Z][7] + lgq*lgq*lgq*ScatFuncFitParam[Z][8];
|
||||
if(lgq < ScatFuncFitParam[Z][1])
|
||||
{
|
||||
value = ScatFuncFitParam[Z][4] + lgq * ScatFuncFitParam[Z][5];
|
||||
}
|
||||
value = G4Exp(value*ln10);
|
||||
else if(lgq >= ScatFuncFitParam[Z][1] && lgq < ScatFuncFitParam[Z][2])
|
||||
{
|
||||
value = ScatFuncFitParam[Z][6] +
|
||||
lgq * (ScatFuncFitParam[Z][7] +
|
||||
lgq * (ScatFuncFitParam[Z][8] +
|
||||
lgq * (ScatFuncFitParam[Z][9] +
|
||||
lgq * ScatFuncFitParam[Z][10])));
|
||||
}
|
||||
else
|
||||
{
|
||||
value = ScatFuncFitParam[Z][11] +
|
||||
lgq * (ScatFuncFitParam[Z][12] +
|
||||
lgq * (ScatFuncFitParam[Z][13] +
|
||||
lgq * (ScatFuncFitParam[Z][14] +
|
||||
lgq * ScatFuncFitParam[Z][15])));
|
||||
}
|
||||
value = G4Exp(value * ln10);
|
||||
}
|
||||
//G4cout << " value= " << value << G4endl;
|
||||
// G4cout << " value= " << value << G4endl;
|
||||
return value;
|
||||
}
|
||||
|
||||
@@ -549,113 +565,114 @@ G4LivermoreComptonModel::InitialiseForElement(const G4ParticleDefinition*,
|
||||
G4int Z)
|
||||
{
|
||||
G4AutoLock l(&LivermoreComptonModelMutex);
|
||||
if(!data[Z]) { ReadData(Z); }
|
||||
if(data[Z] == nullptr) { ReadData(Z); }
|
||||
l.unlock();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
//Fitting data to compute scattering function
|
||||
const G4double G4LivermoreComptonModel::ScatFuncFitParam[101][9] = {
|
||||
{ 0, 0., 0., 0., 0., 0., 0., 0., 0.},
|
||||
{ 1, 6.673, 1.49968E+08, -14.352, 1.999, -143.374, 50.787, -5.951, 0.2304418},
|
||||
{ 2, 6.500, 2.50035E+08, -14.215, 1.970, -53.649, 13.892, -0.948, 0.006996759},
|
||||
{ 3, 6.551, 3.99945E+08, -13.555, 1.993, -62.090, 21.462, -2.453, 0.093416},
|
||||
{ 4, 6.500, 5.00035E+08, -13.746, 1.998, -127.906, 46.491, -5.614, 0.2262103},
|
||||
{ 5, 6.500, 5.99791E+08, -13.800, 1.998, -131.153, 47.132, -5.619, 0.2233819},
|
||||
{ 6, 6.708, 6.99842E+08, -13.885, 1.999, -128.143, 45.379, -5.325, 0.2083009},
|
||||
{ 7, 6.685, 7.99834E+08, -13.885, 2.000, -131.048, 46.314, -5.421, 0.2114925},
|
||||
{ 8, 6.669, 7.99834E+08, -13.962, 2.001, -128.225, 44.818, -5.183, 0.1997155},
|
||||
{ 9, 6.711, 7.99834E+08, -13.999, 2.000, -122.112, 42.103, -4.796, 0.1819099},
|
||||
{ 10, 6.702, 7.99834E+08, -14.044, 1.999, -110.143, 37.225, -4.143, 0.1532094},
|
||||
{ 11, 6.425, 1.00000E+09, -13.423, 1.993, -41.137, 12.313, -1.152, 0.03384553},
|
||||
{ 12, 6.542, 1.00000E+09, -13.389, 1.997, -53.549, 17.420, -1.840, 0.06431849},
|
||||
{ 13, 6.570, 1.49968E+09, -13.401, 1.997, -66.243, 22.297, -2.460, 0.09045854},
|
||||
{ 14, 6.364, 1.49968E+09, -13.452, 1.999, -78.271, 26.757, -3.008, 0.1128195},
|
||||
{ 15, 6.500, 1.49968E+09, -13.488, 1.998, -85.069, 29.164, -3.291, 0.1239113},
|
||||
{ 16, 6.500, 1.49968E+09, -13.532, 1.998, -93.640, 32.274, -3.665, 0.1388633},
|
||||
{ 17, 6.500, 1.49968E+09, -13.584, 2.000, -98.534, 33.958, -3.857, 0.1461557},
|
||||
{ 18, 6.500, 1.49968E+09, -13.618, 1.999, -100.077, 34.379, -3.891, 0.1468902},
|
||||
{ 19, 6.500, 1.99986E+09, -13.185, 1.992, -53.819, 17.528, -1.851, 0.0648722},
|
||||
{ 20, 6.490, 1.99986E+09, -13.123, 1.993, -52.221, 17.169, -1.832, 0.06502094},
|
||||
{ 21, 6.498, 1.99986E+09, -13.157, 1.994, -55.365, 18.276, -1.961, 0.07002778},
|
||||
{ 22, 6.495, 1.99986E+09, -13.183, 1.994, -57.412, 18.957, -2.036, 0.07278856},
|
||||
{ 23, 6.487, 1.99986E+09, -13.216, 1.995, -58.478, 19.270, -2.065, 0.07362722},
|
||||
{ 24, 6.500, 1.99986E+09, -13.330, 1.997, -62.192, 20.358, -2.167, 0.07666583},
|
||||
{ 25, 6.488, 1.99986E+09, -13.277, 1.997, -58.007, 18.924, -2.003, 0.0704305},
|
||||
{ 26, 6.500, 5.00035E+09, -13.292, 1.997, -61.176, 20.067, -2.141, 0.0760269},
|
||||
{ 27, 6.500, 5.00035E+09, -13.321, 1.998, -61.909, 20.271, -2.159, 0.07653559},
|
||||
{ 28, 6.500, 5.00035E+09, -13.340, 1.998, -62.402, 20.391, -2.167, 0.07664243},
|
||||
{ 29, 6.500, 5.00035E+09, -13.439, 1.998, -67.305, 21.954, -2.331, 0.0823267},
|
||||
{ 30, 6.500, 5.00035E+09, -13.383, 1.999, -62.064, 20.136, -2.122, 0.07437589},
|
||||
{ 31, 6.500, 5.00035E+09, -13.349, 1.997, -61.068, 19.808, -2.086, 0.07307488},
|
||||
{ 32, 6.500, 5.00035E+09, -13.373, 1.999, -63.126, 20.553, -2.175, 0.07660222},
|
||||
{ 33, 6.500, 5.00035E+09, -13.395, 1.999, -65.674, 21.445, -2.278, 0.08054694},
|
||||
{ 34, 6.500, 5.00035E+09, -13.417, 1.999, -69.457, 22.811, -2.442, 0.08709536},
|
||||
{ 35, 6.500, 5.00035E+09, -13.442, 2.000, -72.283, 23.808, -2.558, 0.09156808},
|
||||
{ 36, 6.500, 5.00035E+09, -13.451, 1.998, -74.696, 24.641, -2.653, 0.09516597},
|
||||
{ 37, 6.500, 5.00035E+09, -13.082, 1.991, -46.235, 14.519, -1.458, 0.04837659},
|
||||
{ 38, 6.465, 5.00035E+09, -13.022, 1.993, -41.784, 13.065, -1.300, 0.04267703},
|
||||
{ 39, 6.492, 5.00035E+09, -13.043, 1.994, -44.609, 14.114, -1.429, 0.0479348},
|
||||
{ 40, 6.499, 5.00035E+09, -13.064, 1.994, -47.142, 15.019, -1.536, 0.0521347},
|
||||
{ 41, 6.384, 5.00035E+09, -13.156, 1.996, -53.114, 17.052, -1.766, 0.06079426},
|
||||
{ 42, 6.500, 5.00035E+09, -13.176, 1.996, -54.590, 17.550, -1.822, 0.06290335},
|
||||
{ 43, 6.500, 5.00035E+09, -13.133, 1.997, -51.272, 16.423, -1.694, 0.05806108},
|
||||
{ 44, 6.500, 5.00035E+09, -13.220, 1.996, -58.314, 18.839, -1.969, 0.0684608},
|
||||
{ 45, 6.500, 5.00035E+09, -13.246, 1.998, -59.674, 19.295, -2.020, 0.07037294},
|
||||
{ 46, 6.500, 5.00035E+09, -13.407, 1.999, -72.228, 23.693, -2.532, 0.09017969},
|
||||
{ 47, 6.500, 5.00035E+09, -13.277, 1.998, -60.890, 19.647, -2.053, 0.07138694},
|
||||
{ 48, 6.500, 5.00035E+09, -13.222, 1.998, -56.152, 18.002, -1.863, 0.06410123},
|
||||
{ 49, 6.500, 5.00035E+09, -13.199, 1.997, -56.208, 18.052, -1.872, 0.06456884},
|
||||
{ 50, 6.500, 5.00035E+09, -13.215, 1.998, -58.478, 18.887, -1.973, 0.06860356},
|
||||
{ 51, 6.500, 5.00035E+09, -13.230, 1.998, -60.708, 19.676, -2.066, 0.07225841},
|
||||
{ 52, 6.500, 7.99834E+09, -13.246, 1.998, -63.341, 20.632, -2.180, 0.0767412},
|
||||
{ 53, 6.500, 5.00035E+09, -13.262, 1.998, -66.339, 21.716, -2.310, 0.08191981},
|
||||
{ 54, 6.500, 7.99834E+09, -13.279, 1.998, -67.649, 22.151, -2.357, 0.08357825},
|
||||
{ 55, 6.500, 5.00035E+09, -12.951, 1.990, -45.302, 14.219, -1.423, 0.04712317},
|
||||
{ 56, 6.425, 5.00035E+09, -12.882, 1.992, -39.825, 12.363, -1.214, 0.03931009},
|
||||
{ 57, 6.466, 2.82488E+09, -12.903, 1.992, -38.952, 11.982, -1.160, 0.03681554},
|
||||
{ 58, 6.451, 5.00035E+09, -12.915, 1.993, -41.959, 13.118, -1.302, 0.04271291},
|
||||
{ 59, 6.434, 5.00035E+09, -12.914, 1.993, -40.528, 12.555, -1.230, 0.03971407},
|
||||
{ 60, 6.444, 5.00035E+09, -12.922, 1.992, -39.986, 12.329, -1.200, 0.03843737},
|
||||
{ 61, 6.414, 7.99834E+09, -12.930, 1.993, -42.756, 13.362, -1.327, 0.0436124},
|
||||
{ 62, 6.420, 7.99834E+09, -12.938, 1.992, -42.682, 13.314, -1.319, 0.04322509},
|
||||
{ 63, 6.416, 7.99834E+09, -12.946, 1.993, -42.399, 13.185, -1.301, 0.04243861},
|
||||
{ 64, 6.443, 7.99834E+09, -12.963, 1.993, -43.226, 13.475, -1.335, 0.04377341},
|
||||
{ 65, 6.449, 7.99834E+09, -12.973, 1.993, -43.232, 13.456, -1.330, 0.04347536},
|
||||
{ 66, 6.419, 7.99834E+09, -12.966, 1.993, -42.047, 12.990, -1.270, 0.04095499},
|
||||
{ 67, 6.406, 7.99834E+09, -12.976, 1.993, -42.405, 13.106, -1.283, 0.04146024},
|
||||
{ 68, 6.424, 7.99834E+09, -12.986, 1.993, -41.974, 12.926, -1.259, 0.040435},
|
||||
{ 69, 6.417, 7.99834E+09, -12.989, 1.993, -42.132, 12.967, -1.262, 0.04048908},
|
||||
{ 70, 6.405, 7.99834E+09, -13.000, 1.994, -42.582, 13.122, -1.280, 0.04119599},
|
||||
{ 71, 6.449, 7.99834E+09, -13.015, 1.994, -42.586, 13.115, -1.278, 0.04107587},
|
||||
{ 72, 6.465, 7.99834E+09, -13.030, 1.994, -43.708, 13.509, -1.324, 0.04286491},
|
||||
{ 73, 6.447, 7.99834E+09, -13.048, 1.996, -44.838, 13.902, -1.369, 0.04457132},
|
||||
{ 74, 6.452, 7.99834E+09, -13.073, 1.997, -45.545, 14.137, -1.395, 0.04553459},
|
||||
{ 75, 6.432, 7.99834E+09, -13.082, 1.997, -46.426, 14.431, -1.428, 0.04678218},
|
||||
{ 76, 6.439, 7.99834E+09, -13.100, 1.997, -47.513, 14.806, -1.471, 0.04842566},
|
||||
{ 77, 6.432, 7.99834E+09, -13.110, 1.997, -48.225, 15.042, -1.497, 0.04938364},
|
||||
{ 78, 6.500, 7.99834E+09, -13.185, 1.997, -53.256, 16.739, -1.687, 0.05645173},
|
||||
{ 79, 6.500, 7.99834E+09, -13.200, 1.997, -53.900, 16.946, -1.709, 0.05723134},
|
||||
{ 80, 6.500, 7.99834E+09, -13.156, 1.998, -49.801, 15.536, -1.547, 0.05103522},
|
||||
{ 81, 6.500, 7.99834E+09, -13.128, 1.997, -49.651, 15.512, -1.548, 0.05123203},
|
||||
{ 82, 6.500, 7.99834E+09, -13.134, 1.997, -51.021, 16.018, -1.609, 0.05364831},
|
||||
{ 83, 6.500, 7.99834E+09, -13.148, 1.998, -52.693, 16.612, -1.679, 0.05638698},
|
||||
{ 84, 6.500, 7.99834E+09, -13.161, 1.998, -54.415, 17.238, -1.754, 0.05935566},
|
||||
{ 85, 6.500, 7.99834E+09, -13.175, 1.998, -56.083, 17.834, -1.824, 0.06206068},
|
||||
{ 86, 6.500, 7.99834E+09, -13.189, 1.998, -57.860, 18.463, -1.898, 0.0649633},
|
||||
{ 87, 6.500, 7.99834E+09, -12.885, 1.990, -39.973, 12.164, -1.162, 0.0364598},
|
||||
{ 88, 6.417, 7.99834E+09, -12.816, 1.991, -34.591, 10.338, -0.956, 0.0287409},
|
||||
{ 89, 6.442, 7.99834E+09, -12.831, 1.992, -36.002, 10.867, -1.021, 0.03136835},
|
||||
{ 90, 6.463, 7.99834E+09, -12.850, 1.993, -37.660, 11.475, -1.095, 0.03435334},
|
||||
{ 91, 6.447, 7.99834E+09, -12.852, 1.993, -37.268, 11.301, -1.071, 0.0330539},
|
||||
{ 92, 6.439, 7.99834E+09, -12.858, 1.993, -37.695, 11.438, -1.085, 0.03376669},
|
||||
{ 93, 6.437, 1.00000E+10, -12.866, 1.993, -39.010, 11.927, -1.146, 0.03630848},
|
||||
{ 94, 6.432, 7.99834E+09, -12.862, 1.993, -37.192, 11.229, -1.057, 0.0325621},
|
||||
{ 95, 6.435, 7.99834E+09, -12.869, 1.993, -37.589, 11.363, -1.072, 0.03312393},
|
||||
{ 96, 6.449, 1.00000E+10, -12.886, 1.993, -39.573, 12.095, -1.162, 0.03680527},
|
||||
{ 97, 6.446, 1.00000E+10, -12.892, 1.993, -40.007, 12.242, -1.178, 0.03737377},
|
||||
{ 98, 6.421, 1.00000E+10, -12.887, 1.993, -39.509, 12.041, -1.152, 0.03629023},
|
||||
{ 99, 6.414, 1.00000E+10, -12.894, 1.993, -39.939, 12.183, -1.168, 0.03690464},
|
||||
{100, 6.412, 1.00000E+10, -12.900, 1.993, -39.973, 12.180, -1.166, 0.036773}
|
||||
};
|
||||
//Fitting data to compute scattering function based on EPICS2017
|
||||
const G4double G4LivermoreComptonModel::ScatFuncFitParam[101][16] = {
|
||||
{0, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.},
|
||||
{1, 6.000000000e+00, 7.087999300e+00, 1.499680000e+08, -1.435559123e+01, 2.000000043e+00, -3.925518125e+02, 2.434944521e+02, -5.784393623e+01, 6.160181204e+00, -2.461326602e-01, -1.649463594e+03, 8.121933215e+02, -1.498313316e+02, 1.227279742e+01, -3.765996345e-01},
|
||||
{2, 6.000000000e+00, 7.199000403e+00, 2.500350000e+08, -1.430103027e+01, 2.000000041e+00, 3.574019365e+02, -1.978574937e+02, 3.971327838e+01, -3.443224867e+00, 1.091825227e-01, -4.009960832e+02, 1.575831469e+02, -2.174763446e+01, 1.185163045e+00, -1.814503741e-02},
|
||||
{3, 6.000000000e+00, 7.301000136e+00, 3.999450000e+08, -1.357675458e+01, 2.000000074e+00, 7.051635443e+02, -4.223841786e+02, 9.318729225e+01, -9.002642767e+00, 3.220625771e-01, 1.524679907e+03, -7.851479582e+02, 1.509941052e+02, -1.285477984e+01, 4.089348830e-01},
|
||||
{4, 6.000000000e+00, 7.349500202e+00, 5.000350000e+08, -1.375202671e+01, 1.999999994e+00, -1.832909604e+02, 1.193997722e+02, -3.034328318e+01, 3.471545044e+00, -1.484222463e-01, 1.397476657e+03, -7.026416933e+02, 1.320720559e+02, -1.099824430e+01, 3.424610532e-01},
|
||||
{5, 6.000000000e+00, 7.388999972e+00, 5.997910000e+08, -1.380548571e+01, 2.000000004e+00, -2.334197545e+02, 1.467013466e+02, -3.574851109e+01, 3.925047955e+00, -1.616186492e-01, 6.784713308e+02, -3.419562074e+02, 6.433945831e+01, -5.354244209e+00, 1.663784966e-01},
|
||||
{6, 6.000000000e+00, 7.422500001e+00, 6.998420000e+08, -1.388639003e+01, 1.999999863e+00, -2.460254935e+02, 1.516613633e+02, -3.622024219e+01, 3.900099543e+00, -1.576557530e-01, -1.610185428e+02, 7.010907070e+01, -1.142375397e+01, 8.303365180e-01, -2.273786010e-02},
|
||||
{7, 6.000000000e+00, 7.451499931e+00, 7.998340000e+08, -1.388605429e+01, 1.999999612e+00, -3.054540719e+02, 1.877740247e+02, -4.440273010e+01, 4.718886370e+00, -1.881615004e-01, -2.263864349e+02, 1.017885461e+02, -1.716982752e+01, 1.292954622e+00, -3.668301946e-02},
|
||||
{8, 6.000000000e+00, 7.451499931e+00, 7.998340000e+08, -1.395860675e+01, 1.999999906e+00, -3.877174895e+02, 2.345831969e+02, -5.431822300e+01, 5.643262324e+00, -2.200840540e-01, -7.949384302e+02, 3.757293602e+02, -6.661741851e+01, 5.256265086e+00, -1.556986777e-01},
|
||||
{9, 6.000000000e+00, 7.451499931e+00, 7.998340000e+08, -1.400000063e+01, 2.000000106e+00, -2.939854827e+02, 1.784214589e+02, -4.168473845e+01, 4.377669850e+00, -1.724300716e-01, -1.169326170e+03, 5.545642014e+02, -9.863024948e+01, 7.801721240e+00, -2.315522357e-01},
|
||||
{10, 6.000000000e+00, 7.451499931e+00, 7.998340000e+08, -1.404575854e+01, 2.000000178e+00, -2.615701853e+02, 1.582596311e+02, -3.698114811e+01, 3.889093901e+00, -1.533613504e-01, -1.275287356e+03, 6.022076554e+02, -1.066410301e+02, 8.398773148e+00, -2.481899800e-01},
|
||||
{11, 6.000000000e+00, 7.500000000e+00, 1.000000000e+09, -1.344369665e+01, 1.999999860e+00, 1.112662501e+03, -6.807056448e+02, 1.545837472e+02, -1.548462180e+01, 5.785425068e-01, -1.007702307e+03, 4.699937040e+02, -8.220352105e+01, 6.396099420e+00, -1.867816054e-01},
|
||||
{12, 6.000000000e+00, 7.500000000e+00, 1.000000000e+09, -1.339794047e+01, 2.000000080e+00, 9.895649717e+02, -5.983228286e+02, 1.340681576e+02, -1.323046651e+01, 4.863434994e-01, -5.790532602e+02, 2.626052403e+02, -4.463548055e+01, 3.376239891e+00, -9.588786915e-02},
|
||||
{13, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.340893585e+01, 2.000000078e+00, 7.335256091e+02, -4.405291562e+02, 9.770954287e+01, -9.519317788e+00, 3.448067237e-01, -5.328832253e+02, 2.398514938e+02, -4.044557740e+01, 3.034597500e+00, -8.547410419e-02},
|
||||
{14, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.345593195e+01, 2.000000000e+00, 3.978691889e+02, -2.370975001e+02, 5.158692183e+01, -4.884868277e+00, 1.707270518e-01, -2.340256277e+02, 9.813362251e+01, -1.527892110e+01, 1.051070768e+00, -2.692716945e-02},
|
||||
{15, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.349485049e+01, 2.000000083e+00, 2.569833671e+02, -1.513623448e+02, 3.210087153e+01, -2.925756803e+00, 9.724379436e-02, -1.345727293e+01, -6.291081167e+00, 3.235960888e+00, -4.059236666e-01, 1.601245178e-02},
|
||||
{16, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.353760159e+01, 1.999999937e+00, 1.015293074e+02, -5.721639224e+01, 1.078607152e+01, -7.890593144e-01, 1.726056327e-02, 1.854818165e+02, -1.000803879e+02, 1.979815884e+01, -1.704221744e+00, 5.413372375e-02},
|
||||
{17, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.358502705e+01, 2.000000066e+00, -4.294163461e+01, 2.862162412e+01, -8.285972104e+00, 1.087745268e+00, -5.172153610e-02, 1.676674074e+02, -8.976414784e+01, 1.763329621e+01, -1.507161653e+00, 4.753277254e-02},
|
||||
{18, 6.000000000e+00, 7.587999300e+00, 1.499680000e+09, -1.361978902e+01, 2.000000042e+00, -3.573422746e+01, 2.403066369e+01, -7.173617800e+00, 9.657608431e-01, -4.662317662e-02, 1.811925229e+02, -9.574636323e+01, 1.861940167e+01, -1.578810247e+00, 4.946799877e-02},
|
||||
{19, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.320760816e+01, 1.999999979e+00, 1.263152069e+02, -8.738932892e+01, 2.109042182e+01, -2.166733566e+00, 8.146018979e-02, 9.183312428e+01, -5.232836676e+01, 1.072450810e+01, -9.419512971e-01, 3.023884410e-02},
|
||||
{20, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.314266674e+01, 1.999999876e+00, 6.620218058e+02, -4.057504297e+02, 9.180787767e+01, -9.124184449e+00, 3.372518137e-01, 7.034138711e+01, -4.198325416e+01, 8.861351614e+00, -7.930506530e-01, 2.578454342e-02},
|
||||
{21, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.317392498e+01, 1.999999966e+00, 6.766093786e+02, -4.129087029e+02, 9.305090790e+01, -9.212128925e+00, 3.392408033e-01, 1.916559096e+01, -1.807294109e+01, 4.677205921e+00, -4.679350245e-01, 1.632115420e-02},
|
||||
{22, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.320065945e+01, 1.999999999e+00, 6.969823082e+02, -4.236620289e+02, 9.513714106e+01, -9.388294642e+00, 3.446942719e-01, -6.501317146e+01, 2.138553133e+01, -2.250998891e+00, 7.219326079e-02, 5.467529893e-04},
|
||||
{23, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.322914744e+01, 1.999999909e+00, 6.889749928e+02, -4.181421624e+02, 9.373529727e+01, -9.233142268e+00, 3.383772151e-01, -1.382770534e+02, 5.540647456e+01, -8.170017489e+00, 5.295569200e-01, -1.269556386e-02},
|
||||
{24, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.333724128e+01, 1.999999854e+00, 4.365566411e+02, -2.672774427e+02, 6.001631369e+01, -5.895458454e+00, 2.149710735e-01, -2.393534124e+02, 1.020845165e+02, -1.624744211e+01, 1.150387566e+00, -3.057723021e-02},
|
||||
{25, 6.000000000e+00, 7.650499797e+00, 1.999860000e+09, -1.328399669e+01, 2.000000008e+00, 6.461381990e+02, -3.918546518e+02, 8.769548644e+01, -8.618784385e+00, 3.150660827e-01, -2.597409979e+02, 1.113332866e+02, -1.782124571e+01, 1.269519197e+00, -3.396126698e-02},
|
||||
{26, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.330103000e+01, 1.999999998e+00, 4.261007401e+02, -2.588846763e+02, 5.764613910e+01, -5.609660122e+00, 2.024165636e-01, -1.982896712e+02, 8.274273985e+01, -1.284074215e+01, 8.845687432e-01, -2.282143299e-02},
|
||||
{27, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.332790165e+01, 1.999999922e+00, 4.006816638e+02, -2.439311564e+02, 5.435031497e+01, -5.287693457e+00, 1.906696163e-01, -2.205075564e+02, 9.262919772e+01, -1.448909443e+01, 1.006686819e+00, -2.621294059e-02},
|
||||
{28, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.334678710e+01, 1.999999939e+00, 3.967750019e+02, -2.411866801e+02, 5.364872608e+01, -5.210295834e+00, 1.875525119e-01, -2.516823030e+02, 1.065117131e+02, -1.680533335e+01, 1.178363534e+00, -3.098194406e-02},
|
||||
{29, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.344369664e+01, 1.999999853e+00, 2.437671888e+02, -1.499592208e+02, 3.332221026e+01, -3.206587185e+00, 1.138639692e-01, -2.874130637e+02, 1.223381969e+02, -1.943178054e+01, 1.371979484e+00, -3.633119448e-02},
|
||||
{30, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.338721562e+01, 1.999999911e+00, 3.914867984e+02, -2.378147085e+02, 5.284517777e+01, -5.126420186e+00, 1.843322562e-01, -3.235063319e+02, 1.384252948e+02, -2.211844479e+01, 1.571300198e+00, -4.187323186e-02},
|
||||
{31, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.335654643e+01, 1.999999847e+00, 4.325820127e+02, -2.614587597e+02, 5.793273998e+01, -5.611190206e+00, 2.015836827e-01, -3.359152840e+02, 1.437507638e+02, -2.297457475e+01, 1.632470701e+00, -4.351215346e-02},
|
||||
{32, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.337675047e+01, 1.999999960e+00, 4.388195965e+02, -2.642662297e+02, 5.834159168e+01, -5.629419790e+00, 2.014339673e-01, -3.430730654e+02, 1.467102631e+02, -2.343160019e+01, 1.663765504e+00, -4.431369286e-02},
|
||||
{33, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.339794046e+01, 2.000000074e+00, 3.931399547e+02, -2.363700718e+02, 5.197696913e+01, -4.987097655e+00, 1.772567576e-01, -3.501570134e+02, 1.497141578e+02, -2.390888062e+01, 1.697503580e+00, -4.520887478e-02},
|
||||
{34, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.342021680e+01, 2.000000064e+00, 3.772588127e+02, -2.256347960e+02, 4.929790851e+01, -4.694628847e+00, 1.654667382e-01, -3.481053019e+02, 1.486490112e+02, -2.370745096e+01, 1.680991482e+00, -4.471064364e-02},
|
||||
{35, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.344369666e+01, 1.999999864e+00, 3.344685842e+02, -1.994816236e+02, 4.332267376e+01, -4.090542180e+00, 1.426839031e-01, -3.227660675e+02, 1.370301996e+02, -2.171543883e+01, 1.529681552e+00, -4.041331983e-02},
|
||||
{36, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.345593194e+01, 1.999999999e+00, 3.004054446e+02, -1.781334135e+02, 3.834850324e+01, -3.580074471e+00, 1.232168921e-01, -2.980827664e+02, 1.257508661e+02, -1.978792154e+01, 1.383723149e+00, -3.628014907e-02},
|
||||
{37, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.310790583e+01, 2.000000075e+00, -3.687188343e+01, 1.054409719e+01, -8.516586814e-01, 9.339751003e-03, 8.809383936e-04, -2.699384784e+02, 1.129635316e+02, -1.761447452e+01, 1.219971043e+00, -3.166503704e-02},
|
||||
{38, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.304095795e+01, 1.999999892e+00, 1.969969064e+02, -1.286503864e+02, 3.008431767e+01, -3.031946980e+00, 1.124456346e-01, -2.331258613e+02, 9.627987243e+01, -1.478515961e+01, 1.007215642e+00, -2.567873120e-02},
|
||||
{39, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.306048023e+01, 1.999999916e+00, 2.891710763e+02, -1.819536752e+02, 4.158265841e+01, -4.128940218e+00, 1.515168697e-01, -1.997404800e+02, 8.119476676e+01, -1.223426670e+01, 8.159269666e-01, -2.031079820e-02},
|
||||
{40, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.308092198e+01, 2.000000013e+00, 3.393782172e+02, -2.103908454e+02, 4.758278737e+01, -4.688308235e+00, 1.709723418e-01, -1.549247582e+02, 6.091403935e+01, -8.799307373e+00, 5.578963961e-01, -1.305663921e-02},
|
||||
{41, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.316749062e+01, 1.999999920e+00, 2.748604341e+02, -1.706429616e+02, 3.843757441e+01, -3.759045290e+00, 1.358263430e-01, -1.163607425e+02, 4.350905533e+01, -5.859305970e+00, 3.376426246e-01, -6.881281652e-03},
|
||||
{42, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.318708720e+01, 2.000000093e+00, 3.203285955e+02, -1.966282865e+02, 4.398204769e+01, -4.283031482e+00, 1.543480828e-01, -9.364181222e+01, 3.329814493e+01, -4.141689265e+00, 2.095170962e-01, -3.304665813e-03},
|
||||
{43, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.314266674e+01, 1.999999876e+00, 4.184977165e+02, -2.552902161e+02, 5.707764818e+01, -5.576436872e+00, 2.020184726e-01, -8.395646154e+01, 2.898228589e+01, -3.422356654e+00, 1.564059753e-01, -1.838508896e-03},
|
||||
{44, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.322914744e+01, 1.999999909e+00, 3.243555305e+02, -1.978255470e+02, 4.397580841e+01, -4.256142657e+00, 1.524431452e-01, -5.506292375e+01, 1.599310639e+01, -1.237152904e+00, -6.611574411e-03, 2.712232383e-03},
|
||||
{45, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.325181249e+01, 2.000000089e+00, 3.037823599e+02, -1.856628295e+02, 4.128167884e+01, -3.991656133e+00, 1.427469878e-01, -5.014186072e+01, 1.386962969e+01, -8.950806420e-01, -3.095321225e-02, 3.357984426e-03},
|
||||
{46, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.340893584e+01, 2.000000073e+00, 3.529797051e+02, -2.101512262e+02, 4.563946029e+01, -4.315279704e+00, 1.509248358e-01, -4.815922691e+01, 1.301508788e+01, -7.580854951e-01, -4.059091985e-02, 3.608993811e-03},
|
||||
{47, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.328399669e+01, 2.000000008e+00, 3.074953924e+02, -1.872462583e+02, 4.149827252e+01, -4.000811852e+00, 1.426973118e-01, -4.897188379e+01, 1.335300002e+01, -8.110051997e-01, -3.684788190e-02, 3.508156457e-03},
|
||||
{48, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.322914743e+01, 1.999999904e+00, 4.059717166e+02, -2.462737702e+02, 5.472040126e+01, -5.311320062e+00, 1.911670149e-01, -5.901534554e+01, 1.791385249e+01, -1.587065943e+00, 2.182673278e-02, 1.845559896e-03},
|
||||
{49, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.320760815e+01, 1.999999973e+00, 4.369774251e+02, -2.639721687e+02, 5.849617557e+01, -5.667842049e+00, 2.037342202e-01, -7.399698219e+01, 2.469785523e+01, -2.737881327e+00, 1.085351830e-01, -6.022720695e-04},
|
||||
{50, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.322184869e+01, 1.999999993e+00, 4.289361021e+02, -2.585593024e+02, 5.714058683e+01, -5.518600115e+00, 1.976499817e-01, -9.269047286e+01, 3.314422349e+01, -4.167341855e+00, 2.159629039e-01, -3.626802503e-03},
|
||||
{51, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.323657166e+01, 1.999999946e+00, 3.866985836e+02, -2.328379698e+02, 5.128884878e+01, -4.929614910e+00, 1.755331333e-01, -1.067869310e+02, 3.950715983e+01, -5.243321447e+00, 2.967791238e-01, -5.901223876e-03},
|
||||
{52, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.325181248e+01, 2.000000083e+00, 3.947511198e+02, -2.363799049e+02, 5.179393756e+01, -4.951603918e+00, 1.753404387e-01, -1.069681982e+02, 3.995521754e+01, -5.382071424e+00, 3.120248901e-01, -6.467957474e-03},
|
||||
{53, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.326760745e+01, 2.000000205e+00, 3.694394448e+02, -2.204699428e+02, 4.806381052e+01, -4.565474883e+00, 1.604614344e-01, -1.180749905e+02, 4.460080701e+01, -6.105217447e+00, 3.616537171e-01, -7.733059623e-03},
|
||||
{54, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.328399667e+01, 2.000000001e+00, 3.423943987e+02, -2.041330669e+02, 4.437639784e+01, -4.197363553e+00, 1.467594367e-01, -1.288973984e+02, 4.985324046e+01, -7.056041375e+00, 4.378018318e-01, -1.000965926e-02},
|
||||
{55, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.297881025e+01, 1.999999927e+00, -7.663422017e+01, 3.462700567e+01, -6.273553579e+00, 5.487612834e-01, -1.912897528e-02, -1.318428276e+02, 5.081036112e+01, -7.154907590e+00, 4.405355674e-01, -9.955685075e-03},
|
||||
{56, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.290657751e+01, 1.999999869e+00, 1.084179205e+02, -7.602229206e+01, 1.843754298e+01, -1.892451591e+00, 7.085434176e-02, -1.346311376e+02, 5.207427468e+01, -7.369834199e+00, 4.568138610e-01, -1.041859875e-02},
|
||||
{57, 6.000000000e+00, 7.725500002e+00, 2.824880000e+09, -1.292445241e+01, 1.999999898e+00, 2.995898890e+02, -1.889477671e+02, 4.336642429e+01, -4.330424108e+00, 1.599942758e-01, 5.503972208e+00, -1.227641064e+01, 3.699182312e+00, -3.884476060e-01, 1.375966896e-02},
|
||||
{58, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.293554133e+01, 1.999999890e+00, 1.709135500e+02, -1.120124681e+02, 2.615893820e+01, -2.624416758e+00, 9.674223967e-02, -1.375860132e+02, 5.337811974e+01, -7.586786386e+00, 4.730023198e-01, -1.087482303e-02},
|
||||
{59, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.293554133e+01, 1.999999890e+00, 1.214691988e+02, -8.336119630e+01, 1.996468944e+01, -2.032283439e+00, 7.562254632e-02, -1.631005912e+02, 6.472051894e+01, -9.476098737e+00, 6.127875286e-01, -1.475060958e-02},
|
||||
{60, 6.000000000e+00, 7.849500202e+00, 5.000350000e+09, -1.294309494e+01, 1.999999967e+00, 1.302719596e+02, -8.835087414e+01, 2.101971144e+01, -2.131084478e+00, 7.908549730e-02, -1.692901279e+02, 6.742727614e+01, -9.920661139e+00, 6.453186854e-01, -1.564524492e-02},
|
||||
{61, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.295078139e+01, 1.999999905e+00, 1.127680235e+02, -7.782238836e+01, 1.865126163e+01, -1.895116816e+00, 7.030502833e-02, -2.059821608e+02, 8.384774285e+01, -1.267344799e+01, 8.502354115e-01, -2.135994609e-02},
|
||||
{62, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.295860692e+01, 1.999999936e+00, 1.203145109e+02, -8.212556537e+01, 1.956606386e+01, -1.981212240e+00, 7.333626288e-02, -2.158058793e+02, 8.810144391e+01, -1.336380022e+01, 9.000362964e-01, -2.270715579e-02},
|
||||
{63, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.296657573e+01, 1.999999918e+00, 1.212159597e+02, -8.256559477e+01, 1.964122173e+01, -1.986442056e+00, 7.345564343e-02, -2.278531434e+02, 9.336519465e+01, -1.422588608e+01, 9.627883381e-01, -2.441986614e-02},
|
||||
{64, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.298296617e+01, 1.999999921e+00, 1.689382403e+02, -1.099987696e+02, 2.551961464e+01, -2.543234152e+00, 9.313568005e-02, -2.282716670e+02, 9.348611199e+01, -1.423588448e+01, 9.628551072e-01, -2.440492772e-02},
|
||||
{65, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.299139910e+01, 1.999999880e+00, 1.724155378e+02, -1.120798437e+02, 2.598264738e+01, -2.588807295e+00, 9.481417896e-02, -2.322687147e+02, 9.517466656e+01, -1.450332749e+01, 9.817069914e-01, -2.490386807e-02},
|
||||
{66, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.298716240e+01, 1.999999941e+00, 1.286079419e+02, -8.646296410e+01, 2.039801258e+01, -2.050839207e+00, 7.549033493e-02, -2.420048480e+02, 9.935663043e+01, -1.517653800e+01, 1.029875015e+00, -2.619626869e-02},
|
||||
{67, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.299567846e+01, 1.999999971e+00, 1.182799697e+02, -8.043389241e+01, 1.908027783e+01, -1.923209794e+00, 7.087268462e-02, -2.464462609e+02, 1.012059056e+02, -1.546468270e+01, 1.049814070e+00, -2.671320158e-02},
|
||||
{68, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.300436459e+01, 1.999999966e+00, 1.150510247e+02, -7.859576077e+01, 1.868688175e+01, -1.885844183e+00, 6.954765052e-02, -2.457555063e+02, 1.007538481e+02, -1.536692833e+01, 1.041070997e+00, -2.643279207e-02},
|
||||
{69, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.300877391e+01, 2.000000000e+00, 1.266280406e+02, -8.514491730e+01, 2.007089332e+01, -2.015475088e+00, 7.409191965e-02, -2.492442707e+02, 1.021615320e+02, -1.557878384e+01, 1.055183253e+00, -2.678362279e-02},
|
||||
{70, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.301772826e+01, 1.999999912e+00, 1.224253568e+02, -8.281395858e+01, 1.958609738e+01, -1.970785167e+00, 7.255458061e-02, -2.488808342e+02, 1.018569466e+02, -1.550601866e+01, 1.048325396e+00, -2.655661748e-02},
|
||||
{71, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.303151733e+01, 2.000000051e+00, 1.862181262e+02, -1.199038630e+02, 2.763107534e+01, -2.742586837e+00, 1.001956495e-01, -2.403102476e+02, 9.796272016e+01, -1.484525920e+01, 9.987147871e-01, -2.516533876e-02},
|
||||
{72, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.304575796e+01, 2.000000081e+00, 2.297759959e+02, -1.448485621e+02, 3.295877082e+01, -3.245850428e+00, 1.179456377e-01, -2.282155654e+02, 9.249921555e+01, -1.392266984e+01, 9.297052139e-01, -2.323558576e-02},
|
||||
{73, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.306048022e+01, 1.999999910e+00, 2.646909006e+02, -1.647716545e+02, 3.719903613e+01, -3.645113853e+00, 1.319890617e-01, -2.165150972e+02, 8.722660467e+01, -1.303415548e+01, 8.633600348e-01, -2.138300143e-02},
|
||||
{74, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.308092196e+01, 2.000000008e+00, 2.251239174e+02, -1.414731209e+02, 3.206048507e+01, -3.142433101e+00, 1.135971917e-01, -2.070173544e+02, 8.296725365e+01, -1.231986936e+01, 8.102887128e-01, -1.990853407e-02},
|
||||
{75, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.309151488e+01, 1.999999984e+00, 2.627532736e+02, -1.629008146e+02, 3.661592385e+01, -3.571257833e+00, 1.286871297e-01, -1.945762063e+02, 7.740995255e+01, -1.139129234e+01, 7.415172466e-01, -1.800335280e-02},
|
||||
{76, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.310790581e+01, 2.000000068e+00, 2.644549626e+02, -1.637369900e+02, 3.675734857e+01, -3.580665992e+00, 1.288721975e-01, -1.725967865e+02, 6.755389456e+01, -9.737633351e+00, 6.184954292e-01, -1.457897448e-02},
|
||||
{77, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.311918599e+01, 1.999999933e+00, 2.677629012e+02, -1.650589135e+02, 3.690999414e+01, -3.582378706e+00, 1.284763849e-01, -1.584140848e+02, 6.122430396e+01, -8.680876005e+00, 5.402879020e-01, -1.241386995e-02},
|
||||
{78, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.319382006e+01, 2.000000009e+00, 2.420702029e+02, -1.484461630e+02, 3.292288306e+01, -3.162757529e+00, 1.121487556e-01, -1.319886050e+02, 4.940494114e+01, -6.702740089e+00, 3.934770465e-01, -8.336673895e-03},
|
||||
{79, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.320760814e+01, 1.999999969e+00, 2.346714957e+02, -1.439356552e+02, 3.189416251e+01, -3.059071523e+00, 1.082595858e-01, -1.130109430e+02, 4.093029258e+01, -5.286747014e+00, 2.885753389e-01, -5.428939868e-03},
|
||||
{80, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.316115147e+01, 2.000000093e+00, 2.747370538e+02, -1.689673404e+02, 3.771696324e+01, -3.655841153e+00, 1.309852214e-01, -9.001823908e+01, 3.066094857e+01, -3.570459523e+00, 1.613797666e-01, -1.901561361e-03},
|
||||
{81, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.313667715e+01, 2.000000002e+00, 3.142563781e+02, -1.916613838e+02, 4.259167223e+01, -4.119713271e+00, 1.474792530e-01, -7.642731867e+01, 2.462410146e+01, -2.566977318e+00, 8.741068396e-02, 1.388590928e-04},
|
||||
{82, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.314266674e+01, 1.999999876e+00, 3.509258060e+02, -2.125470710e+02, 4.702461797e+01, -4.535380912e+00, 1.620138781e-01, -5.173355302e+01, 1.362015056e+01, -7.321282362e-01, -4.826261322e-02, 3.892879264e-03},
|
||||
{83, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.315490164e+01, 1.999999944e+00, 3.399729483e+02, -2.056319770e+02, 4.539614689e+01, -4.366195994e+00, 1.554792165e-01, -4.131443229e+01, 8.986236911e+00, 3.924628986e-02, -1.052060828e-01, 5.466043586e-03},
|
||||
{84, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.316749062e+01, 1.999999920e+00, 3.640602841e+02, -2.190164327e+02, 4.815603439e+01, -4.616573783e+00, 1.639147626e-01, -3.256862965e+01, 5.115606198e+00, 6.800853161e-01, -1.522315744e-01, 6.756786448e-03},
|
||||
{85, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.318045630e+01, 2.000000044e+00, 3.766488275e+02, -2.257321142e+02, 4.947300991e+01, -4.728919006e+00, 1.674240471e-01, -2.300947210e+01, 8.615223509e-01, 1.388425307e+00, -2.045157608e-01, 8.200511055e-03},
|
||||
{86, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.319382005e+01, 2.000000006e+00, 3.443622947e+02, -2.064342780e+02, 4.516044966e+01, -4.302253084e+00, 1.516667044e-01, -5.399039282e+00, -7.002814559e+00, 2.702516748e+00, -3.018766003e-01, 1.089953798e-02},
|
||||
{87, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.291364147e+01, 2.000000217e+00, -3.706791591e+01, 1.118013187e+01, -1.057728859e+00, 3.312859839e-02, -3.138341244e-06, -3.451314336e+00, -7.779254134e+00, 2.816269849e+00, -3.090776388e-01, 1.106424389e-02},
|
||||
{88, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.284163724e+01, 1.999999954e+00, 6.125934670e+01, -4.855548659e+01, 1.248551381e+01, -1.323304763e+00, 5.060744172e-02, -6.021643455e+00, -6.580234329e+00, 2.607440108e+00, -2.929625239e-01, 1.059951856e-02},
|
||||
{89, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.285387248e+01, 2.000000090e+00, 1.350863292e+02, -9.126618691e+01, 2.169932948e+01, -2.201947573e+00, 8.186860720e-02, 1.937135880e+01, -1.787129621e+01, 4.485878662e+00, -4.315325969e-01, 1.442445798e-02},
|
||||
{90, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.286966604e+01, 1.999999970e+00, 1.784388998e+02, -1.161623817e+02, 2.702376618e+01, -2.704797298e+00, 9.957279361e-02, 2.216057166e+01, -1.904990091e+01, 4.671627339e+00, -4.444534802e-01, 1.475921763e-02},
|
||||
{91, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.287289489e+01, 1.999999951e+00, 1.368355213e+02, -9.179790820e+01, 2.169910915e+01, -2.190249857e+00, 8.102241740e-02, 4.516580666e+00, -1.118102949e+01, 3.357662550e+00, -3.470694353e-01, 1.205639951e-02},
|
||||
{92, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.287942629e+01, 2.000000032e+00, 1.427130850e+02, -9.499714618e+01, 2.234475916e+01, -2.247599931e+00, 8.291713193e-02, 1.341991149e+01, -1.518503354e+01, 4.030838171e+00, -3.972060658e-01, 1.345248084e-02},
|
||||
{93, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.288605524e+01, 1.999999761e+00, 2.341801100e+01, -2.506119713e+01, 7.023029272e+00, -7.610742531e-01, 2.903245750e-02, -3.575331738e+01, 7.276302226e+00, 1.906771859e-01, -1.059475755e-01, 5.184029625e-03},
|
||||
{94, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.288272835e+01, 1.999999941e+00, 1.287618322e+02, -8.721780968e+01, 2.073255323e+01, -2.100572716e+00, 7.794295578e-02, -2.307262580e+01, 1.113132278e+00, 1.305250601e+00, -1.948949139e-01, 7.829116438e-03},
|
||||
{95, 6.000000000e+00, 7.951499931e+00, 7.998340000e+09, -1.288940956e+01, 1.999999880e+00, 1.334821220e+02, -8.985337775e+01, 2.127928526e+01, -2.150628571e+00, 7.965294640e-02, -3.518662723e+01, 6.514543434e+00, 4.030862442e-01, -1.279850170e-01, 5.970168353e-03},
|
||||
{96, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.290553004e+01, 2.000000198e+00, 4.545581472e+01, -3.771304300e+01, 9.729129321e+00, -1.017037014e+00, 3.807733199e-02, -4.973805034e+01, 1.342335334e+01, -8.221139917e-01, -3.176841835e-02, 3.146810827e-03},
|
||||
{97, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.291150963e+01, 2.000000019e+00, 4.689042092e+01, -3.843347264e+01, 9.859294531e+00, -1.027014690e+00, 3.834833665e-02, -4.657434145e+01, 1.204637835e+01, -5.982449163e-01, -4.786919243e-02, 3.579251285e-03},
|
||||
{98, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.290833198e+01, 1.999999824e+00, 1.337584189e+01, -1.907284620e+01, 5.691614909e+00, -6.307838734e-01, 2.430868142e-02, -5.573362773e+01, 1.615667599e+01, -1.288960621e+00, 3.655033732e-03, 2.140047522e-03},
|
||||
{99, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.291435263e+01, 1.999999988e+00, 1.376201293e+01, -1.919251815e+01, 5.693799461e+00, -6.287500644e-01, 2.416045199e-02, -4.914211254e+01, 1.314247998e+01, -7.739336035e-01, -3.530513333e-02, 3.241293077e-03},
|
||||
{100, 6.000000000e+00, 8.000000000e+00, 1.000000000e+10, -1.292045700e+01, 2.000000004e+00, 1.277081775e+01, -1.854047224e+01, 5.534680382e+00, -6.118054153e-01, 2.349768815e-02, -5.074293980e+01, 1.383260974e+01, -8.858904786e-01, -2.718885953e-02, 3.019620454e-03}
|
||||
};
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -1,403 +0,0 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
//
|
||||
// Author: Sebastien Incerti
|
||||
// 30 October 2008
|
||||
// on base of G4LowEnergyCompton developed by A.Forti and M.G.Pia
|
||||
//
|
||||
// History:
|
||||
// --------
|
||||
// 18 Apr 2009 V Ivanchenko Cleanup initialisation and generation of secondaries:
|
||||
// - apply internal high-energy limit only in constructor
|
||||
// - do not apply low-energy limit (default is 0)
|
||||
// - remove GetMeanFreePath method and table
|
||||
// - added protection against numerical problem in energy sampling
|
||||
// - use G4ElementSelector
|
||||
// 26 Dec 2010 V Ivanchenko Load data tables only once to avoid memory leak
|
||||
// 30 May 2011 V Ivanchenko Migration to model design for deexcitation
|
||||
|
||||
#include "G4LivermoreComptonModifiedModel.hh"
|
||||
#include "G4PhysicalConstants.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4Electron.hh"
|
||||
#include "G4ParticleChangeForGamma.hh"
|
||||
#include "G4LossTableManager.hh"
|
||||
#include "G4VAtomDeexcitation.hh"
|
||||
#include "G4AtomicShell.hh"
|
||||
#include "G4CrossSectionHandler.hh"
|
||||
#include "G4CompositeEMDataSet.hh"
|
||||
#include "G4LogLogInterpolation.hh"
|
||||
#include "G4Gamma.hh"
|
||||
#include "G4Exp.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
using namespace std;
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4LivermoreComptonModifiedModel::G4LivermoreComptonModifiedModel(const G4ParticleDefinition*,
|
||||
const G4String& nam)
|
||||
:G4VEmModel(nam),fParticleChange(nullptr),
|
||||
scatterFunctionData(nullptr),
|
||||
crossSectionHandler(nullptr),fAtomDeexcitation(nullptr),
|
||||
isInitialised(false)
|
||||
{
|
||||
verboseLevel=0 ;
|
||||
// Verbosity scale:
|
||||
// 0 = nothing
|
||||
// 1 = warning for energy non-conservation
|
||||
// 2 = details of energy budget
|
||||
// 3 = calculation of cross sections, file openings, sampling of atoms
|
||||
// 4 = entering in methods
|
||||
|
||||
if( verboseLevel>0 )
|
||||
G4cout << "Livermore Modified Compton model is constructed " << G4endl;
|
||||
|
||||
//Mark this model as "applicable" for atomic deexcitation
|
||||
SetDeexcitationFlag(true);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4LivermoreComptonModifiedModel::~G4LivermoreComptonModifiedModel()
|
||||
{
|
||||
delete crossSectionHandler;
|
||||
delete scatterFunctionData;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void G4LivermoreComptonModifiedModel::Initialise(const G4ParticleDefinition* particle,
|
||||
const G4DataVector& cuts)
|
||||
{
|
||||
if (verboseLevel > 2) {
|
||||
G4cout << "Calling G4LivermoreComptonModifiedModel::Initialise()" << G4endl;
|
||||
}
|
||||
|
||||
if (crossSectionHandler)
|
||||
{
|
||||
crossSectionHandler->Clear();
|
||||
delete crossSectionHandler;
|
||||
}
|
||||
delete scatterFunctionData;
|
||||
|
||||
// Reading of data files - all materials are read
|
||||
crossSectionHandler = new G4CrossSectionHandler;
|
||||
G4String crossSectionFile = "comp/ce-cs-";
|
||||
crossSectionHandler->LoadData(crossSectionFile);
|
||||
|
||||
G4VDataSetAlgorithm* scatterInterpolation = new G4LogLogInterpolation;
|
||||
G4String scatterFile = "comp/ce-sf-";
|
||||
scatterFunctionData = new G4CompositeEMDataSet(scatterInterpolation, 1., 1.);
|
||||
scatterFunctionData->LoadData(scatterFile);
|
||||
|
||||
// For Doppler broadening
|
||||
shellData.SetOccupancyData();
|
||||
G4String file = "/doppler/shell-doppler";
|
||||
shellData.LoadData(file);
|
||||
|
||||
InitialiseElementSelectors(particle,cuts);
|
||||
|
||||
if (verboseLevel > 2) {
|
||||
G4cout << "Loaded cross section files for Livermore Modified Compton model" << G4endl;
|
||||
}
|
||||
|
||||
if(isInitialised) { return; }
|
||||
isInitialised = true;
|
||||
|
||||
fParticleChange = GetParticleChangeForGamma();
|
||||
|
||||
fAtomDeexcitation = G4LossTableManager::Instance()->AtomDeexcitation();
|
||||
|
||||
if( verboseLevel>0 ) {
|
||||
G4cout << "Livermore modified Compton model is initialized " << G4endl
|
||||
<< "Energy range: "
|
||||
<< LowEnergyLimit() / eV << " eV - "
|
||||
<< HighEnergyLimit() / GeV << " GeV"
|
||||
<< G4endl;
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4double G4LivermoreComptonModifiedModel::ComputeCrossSectionPerAtom(
|
||||
const G4ParticleDefinition*,
|
||||
G4double GammaEnergy,
|
||||
G4double Z, G4double,
|
||||
G4double, G4double)
|
||||
{
|
||||
if (verboseLevel > 3) {
|
||||
G4cout << "Calling ComputeCrossSectionPerAtom() of G4LivermoreComptonModifiedModel" << G4endl;
|
||||
}
|
||||
if (GammaEnergy < LowEnergyLimit())
|
||||
{ return 0.0; }
|
||||
|
||||
G4double cs = crossSectionHandler->FindValue(G4int(Z), GammaEnergy);
|
||||
return cs;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void G4LivermoreComptonModifiedModel::SampleSecondaries(std::vector<G4DynamicParticle*>* fvect,
|
||||
const G4MaterialCutsCouple* couple,
|
||||
const G4DynamicParticle* aDynamicGamma,
|
||||
G4double, G4double)
|
||||
{
|
||||
// The scattered gamma energy is sampled according to Klein - Nishina formula.
|
||||
// then accepted or rejected depending on the Scattering Function multiplied
|
||||
// by factor from Klein - Nishina formula.
|
||||
// Expression of the angular distribution as Klein Nishina
|
||||
// angular and energy distribution and Scattering fuctions is taken from
|
||||
// D. E. Cullen "A simple model of photon transport" Nucl. Instr. Meth.
|
||||
// Phys. Res. B 101 (1995). Method of sampling with form factors is different
|
||||
// data are interpolated while in the article they are fitted.
|
||||
// Reference to the article is from J. Stepanek New Photon, Positron
|
||||
// and Electron Interaction Data for GEANT in Energy Range from 1 eV to 10
|
||||
// TeV (draft).
|
||||
// The random number techniques of Butcher & Messel are used
|
||||
// (Nucl Phys 20(1960),15).
|
||||
|
||||
G4double photonEnergy0 = aDynamicGamma->GetKineticEnergy();
|
||||
|
||||
if (verboseLevel > 3) {
|
||||
G4cout << "G4LivermoreComptonModifiedModel::SampleSecondaries() E(MeV)= "
|
||||
<< photonEnergy0/MeV << " in " << couple->GetMaterial()->GetName()
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
// do nothing below the threshold
|
||||
// should never get here because the XS is zero below the limit
|
||||
if (photonEnergy0 < LowEnergyLimit())
|
||||
return ;
|
||||
|
||||
G4double e0m = photonEnergy0 / electron_mass_c2 ;
|
||||
G4ParticleMomentum photonDirection0 = aDynamicGamma->GetMomentumDirection();
|
||||
|
||||
// Select randomly one element in the current material
|
||||
const G4ParticleDefinition* particle = aDynamicGamma->GetDefinition();
|
||||
const G4Element* elm = SelectRandomAtom(couple,particle,photonEnergy0);
|
||||
G4int Z = (G4int)elm->GetZ();
|
||||
|
||||
G4double epsilon0Local = 1. / (1. + 2. * e0m);
|
||||
G4double epsilon0Sq = epsilon0Local * epsilon0Local;
|
||||
G4double alpha1 = -G4Log(epsilon0Local);
|
||||
G4double alpha2 = 0.5 * (1. - epsilon0Sq);
|
||||
|
||||
G4double wlPhoton = h_Planck*c_light/photonEnergy0;
|
||||
|
||||
// Sample the energy of the scattered photon
|
||||
G4double epsilon;
|
||||
G4double epsilonSq;
|
||||
G4double oneCosT;
|
||||
G4double sinT2;
|
||||
G4double gReject;
|
||||
|
||||
do
|
||||
{
|
||||
if ( alpha1/(alpha1+alpha2) > G4UniformRand())
|
||||
{
|
||||
// std::pow(epsilon0Local,G4UniformRand())
|
||||
epsilon = G4Exp(-alpha1 * G4UniformRand());
|
||||
epsilonSq = epsilon * epsilon;
|
||||
}
|
||||
else
|
||||
{
|
||||
epsilonSq = epsilon0Sq + (1. - epsilon0Sq) * G4UniformRand();
|
||||
epsilon = std::sqrt(epsilonSq);
|
||||
}
|
||||
|
||||
oneCosT = (1. - epsilon) / ( epsilon * e0m);
|
||||
sinT2 = oneCosT * (2. - oneCosT);
|
||||
G4double x = std::sqrt(oneCosT/2.) / (wlPhoton/cm);
|
||||
G4double scatteringFunction = scatterFunctionData->FindValue(x,Z-1);
|
||||
gReject = (1. - epsilon * sinT2 / (1. + epsilonSq)) * scatteringFunction;
|
||||
|
||||
} while(gReject < G4UniformRand()*Z);
|
||||
|
||||
G4double cosTheta = 1. - oneCosT;
|
||||
G4double sinTheta = std::sqrt (sinT2);
|
||||
G4double phi = twopi * G4UniformRand() ;
|
||||
G4double dirx = sinTheta * std::cos(phi);
|
||||
G4double diry = sinTheta * std::sin(phi);
|
||||
G4double dirz = cosTheta ;
|
||||
|
||||
// Doppler broadening - Method based on:
|
||||
// Y. Namito, S. Ban and H. Hirayama,
|
||||
// "Implementation of the Doppler Broadening of a Compton-Scattered Photon
|
||||
// into the EGS4 Code", NIM A 349, pp. 489-494, 1994
|
||||
|
||||
// Maximum number of sampling iterations
|
||||
G4int maxDopplerIterations = 1000;
|
||||
G4double bindingE = 0.;
|
||||
G4double photonEoriginal = epsilon * photonEnergy0;
|
||||
G4double photonE = -1.;
|
||||
G4int iteration = 0;
|
||||
G4double systemE = 0;
|
||||
G4double ePAU = -1;
|
||||
G4int shellIdx = 0;
|
||||
G4double vel_c = 299792458;
|
||||
G4double momentum_au_to_nat = 1.992851740*std::pow(10.,-24.);
|
||||
G4double e_mass_kg = 9.10938188 * std::pow(10.,-31.);
|
||||
G4double eMax = -1;
|
||||
G4double Alpha=0;
|
||||
do
|
||||
{
|
||||
++iteration;
|
||||
// Select shell based on shell occupancy
|
||||
shellIdx = shellData.SelectRandomShell(Z);
|
||||
bindingE = shellData.BindingEnergy(Z,shellIdx);
|
||||
|
||||
// Randomly sample bound electron momentum
|
||||
// (memento: the data set is in Atomic Units)
|
||||
G4double pSample = profileData.RandomSelectMomentum(Z,shellIdx);
|
||||
// Rescale from atomic units
|
||||
|
||||
//Kinetic energy of target electron
|
||||
// Reverse vector projection onto scattering vector
|
||||
do {
|
||||
Alpha = G4UniformRand()*pi/2.0;
|
||||
} while(Alpha >= (pi/2.0));
|
||||
|
||||
ePAU = pSample / std::cos(Alpha);
|
||||
|
||||
// Convert to SI and the calculate electron energy in natural units
|
||||
G4double ePSI = ePAU * momentum_au_to_nat;
|
||||
G4double u_temp = sqrt( ((ePSI*ePSI)*(vel_c*vel_c)) / ((e_mass_kg*e_mass_kg)*(vel_c*vel_c)+(ePSI*ePSI)))/vel_c;
|
||||
G4double eEIncident = electron_mass_c2 / sqrt( 1 - (u_temp*u_temp));
|
||||
|
||||
//Total energy of the system
|
||||
systemE = eEIncident+photonEnergy0;
|
||||
|
||||
eMax = systemE - bindingE - electron_mass_c2;
|
||||
G4double pDoppler = pSample * fine_structure_const;
|
||||
G4double pDoppler2 = pDoppler * pDoppler;
|
||||
G4double var2 = 1. + oneCosT * e0m;
|
||||
G4double var3 = var2*var2 - pDoppler2;
|
||||
G4double var4 = var2 - pDoppler2 * cosTheta;
|
||||
G4double var = var4*var4 - var3 + pDoppler2 * var3;
|
||||
if (var > 0.)
|
||||
{
|
||||
G4double varSqrt = std::sqrt(var);
|
||||
G4double scale = photonEnergy0 / var3;
|
||||
// Random select either root
|
||||
if (G4UniformRand() < 0.5) { photonE = (var4 - varSqrt) * scale; }
|
||||
else { photonE = (var4 + varSqrt) * scale; }
|
||||
}
|
||||
else
|
||||
{
|
||||
photonE = -1.;
|
||||
}
|
||||
} while ( iteration <= maxDopplerIterations &&
|
||||
(photonE < 0. || photonE > eMax ) );
|
||||
|
||||
// End of recalculation of photon energy with Doppler broadening
|
||||
// Kinematics of the scattered electron
|
||||
G4double eKineticEnergy = systemE - photonE - bindingE - electron_mass_c2;
|
||||
|
||||
// protection against negative final energy: no e- is created
|
||||
G4double eDirX = 0.0;
|
||||
G4double eDirY = 0.0;
|
||||
G4double eDirZ = 1.0;
|
||||
|
||||
if(eKineticEnergy < 0.0) {
|
||||
G4cout << "Error, kinetic energy of electron less than zero" << G4endl;
|
||||
}
|
||||
else{
|
||||
// Estimation of Compton electron polar angle taken from:
|
||||
// The EGSnrc Code System: Monte Carlo Simulation of Electron and Photon Transport
|
||||
// Eqn 2.2.25 Pg 42, NRCC Report PIRS-701
|
||||
G4double E_num = photonEnergy0 - photonE*cosTheta;
|
||||
G4double E_dom = sqrt(photonEnergy0*photonEnergy0 + photonE*photonE -2*photonEnergy0*photonE*cosTheta);
|
||||
G4double cosThetaE = E_num / E_dom;
|
||||
G4double sinThetaE = -sqrt((1. - cosThetaE) * (1. + cosThetaE));
|
||||
|
||||
eDirX = sinThetaE * std::cos(phi);
|
||||
eDirY = sinThetaE * std::sin(phi);
|
||||
eDirZ = cosThetaE;
|
||||
|
||||
G4ThreeVector eDirection(eDirX,eDirY,eDirZ);
|
||||
eDirection.rotateUz(photonDirection0);
|
||||
G4DynamicParticle* dp = new G4DynamicParticle (G4Electron::Electron(),
|
||||
eDirection,eKineticEnergy) ;
|
||||
fvect->push_back(dp);
|
||||
}
|
||||
|
||||
// Revert to original if maximum number of iterations threshold has been reached
|
||||
if (iteration >= maxDopplerIterations)
|
||||
{
|
||||
photonE = photonEoriginal;
|
||||
bindingE = 0.;
|
||||
}
|
||||
|
||||
// Update G4VParticleChange for the scattered photon
|
||||
G4ThreeVector photonDirection1(dirx,diry,dirz);
|
||||
photonDirection1.rotateUz(photonDirection0);
|
||||
fParticleChange->ProposeMomentumDirection(photonDirection1) ;
|
||||
|
||||
G4double photonEnergy1 = photonE;
|
||||
|
||||
if (photonEnergy1 > 0.)
|
||||
{
|
||||
fParticleChange->SetProposedKineticEnergy(photonEnergy1) ;
|
||||
|
||||
if (iteration < maxDopplerIterations)
|
||||
{
|
||||
G4ThreeVector eDirection(eDirX,eDirY,eDirZ);
|
||||
eDirection.rotateUz(photonDirection0);
|
||||
G4DynamicParticle* dp = new G4DynamicParticle (G4Electron::Electron(),
|
||||
eDirection,eKineticEnergy) ;
|
||||
fvect->push_back(dp);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
photonEnergy1 = 0.;
|
||||
fParticleChange->SetProposedKineticEnergy(0.) ;
|
||||
fParticleChange->ProposeTrackStatus(fStopAndKill);
|
||||
}
|
||||
|
||||
// sample deexcitation
|
||||
//
|
||||
if(fAtomDeexcitation && iteration < maxDopplerIterations) {
|
||||
G4int index = couple->GetIndex();
|
||||
if(fAtomDeexcitation->CheckDeexcitationActiveRegion(index)) {
|
||||
size_t nbefore = fvect->size();
|
||||
G4AtomicShellEnumerator as = G4AtomicShellEnumerator(shellIdx);
|
||||
const G4AtomicShell* shell = fAtomDeexcitation->GetAtomicShell(Z, as);
|
||||
fAtomDeexcitation->GenerateParticles(fvect, shell, Z, index);
|
||||
size_t nafter = fvect->size();
|
||||
if(nafter > nbefore) {
|
||||
for (size_t i=nbefore; i<nafter; ++i) {
|
||||
bindingE -= ((*fvect)[i])->GetKineticEnergy();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(bindingE < 0.0) { bindingE = 0.0; }
|
||||
fParticleChange->ProposeLocalEnergyDeposit(bindingE);
|
||||
}
|
||||
@@ -30,7 +30,7 @@
|
||||
//
|
||||
// Modifications: Zhuxin Li@CENBG
|
||||
// 11 March 2020
|
||||
// derives from G4PairProductionRelModel
|
||||
// derives from G4PairProductionRelModel
|
||||
// -------------------------------------------------------------------
|
||||
|
||||
#include "G4LivermoreGammaConversionModel.hh"
|
||||
@@ -51,20 +51,19 @@ namespace { G4Mutex LivermoreGammaConversionModelMutex = G4MUTEX_INITIALIZER; }
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
const G4int G4LivermoreGammaConversionModel::maxZ;
|
||||
G4double G4LivermoreGammaConversionModel::lowEnergyLimit = 2.*CLHEP::electron_mass_c2;
|
||||
G4PhysicsFreeVector* G4LivermoreGammaConversionModel::data[] = {nullptr};
|
||||
|
||||
G4LivermoreGammaConversionModel::G4LivermoreGammaConversionModel
|
||||
(const G4ParticleDefinition* p, const G4String& nam)
|
||||
: G4PairProductionRelModel(p,nam),fParticleChange(nullptr)
|
||||
: G4PairProductionRelModel(p,nam),fParticleChange(nullptr),maxZ(100)
|
||||
{
|
||||
verboseLevel = 0;
|
||||
// Verbosity scale for debugging purposes:
|
||||
// 0 = nothing
|
||||
// 0 = nothing
|
||||
// 1 = calculation of cross sections, file openings...
|
||||
// 2 = entering in methods
|
||||
if(verboseLevel > 0)
|
||||
if(verboseLevel > 0)
|
||||
{
|
||||
G4cout << "G4LivermoreGammaConversionModel is constructed " << G4endl;
|
||||
}
|
||||
@@ -75,10 +74,12 @@ G4LivermoreGammaConversionModel::G4LivermoreGammaConversionModel
|
||||
G4LivermoreGammaConversionModel::~G4LivermoreGammaConversionModel()
|
||||
{
|
||||
if(IsMaster()) {
|
||||
for(G4int i=0; i<maxZ; ++i) {
|
||||
if(data[i]) {
|
||||
delete data[i];
|
||||
data[i] = nullptr;
|
||||
for(G4int i = 0; i <= maxZ; ++i)
|
||||
{
|
||||
if(data[i])
|
||||
{
|
||||
delete data[i];
|
||||
data[i] = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -90,44 +91,36 @@ void G4LivermoreGammaConversionModel::Initialise(
|
||||
const G4ParticleDefinition* particle,
|
||||
const G4DataVector& cuts)
|
||||
{ G4PairProductionRelModel::Initialise(particle, cuts);
|
||||
if (verboseLevel > 1)
|
||||
if (verboseLevel > 1)
|
||||
{
|
||||
G4cout << "Calling Initialise() of G4LivermoreGammaConversionModel."
|
||||
G4cout << "Calling Initialise() of G4LivermoreGammaConversionModel."
|
||||
<< G4endl
|
||||
<< "Energy range: "
|
||||
<< LowEnergyLimit() / MeV << " MeV - "
|
||||
<< HighEnergyLimit() / GeV << " GeV isMater: " << IsMaster()
|
||||
<< HighEnergyLimit() / GeV << " GeV isMater: " << IsMaster()
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
if(!fParticleChange) {
|
||||
if(fParticleChange == nullptr) {
|
||||
fParticleChange = GetParticleChangeForGamma();
|
||||
}
|
||||
|
||||
if(IsMaster())
|
||||
|
||||
if(IsMaster())
|
||||
{
|
||||
// Initialise element selector
|
||||
InitialiseElementSelectors(particle, cuts);
|
||||
|
||||
// Access to elements
|
||||
char* path = std::getenv("G4LEDATA");
|
||||
G4ProductionCutsTable* theCoupleTable =
|
||||
G4ProductionCutsTable::GetProductionCutsTable();
|
||||
|
||||
G4int numOfCouples = theCoupleTable->GetTableSize();
|
||||
|
||||
for(G4int i=0; i<numOfCouples; ++i)
|
||||
const G4ElementTable* elemTable = G4Element::GetElementTable();
|
||||
size_t numElems = (*elemTable).size();
|
||||
for(size_t ie = 0; ie < numElems; ++ie)
|
||||
{
|
||||
const G4MaterialCutsCouple* couple = theCoupleTable->GetMaterialCutsCouple(i);
|
||||
SetCurrentCouple(couple);
|
||||
const G4Material* mat = couple->GetMaterial();
|
||||
const G4ElementVector* theElementVector = mat->GetElementVector();
|
||||
G4int nelm = mat->GetNumberOfElements();
|
||||
|
||||
for (G4int j=0; j<nelm; ++j)
|
||||
const G4Element* elem = (*elemTable)[ie];
|
||||
const G4int Z = std::min(maxZ, elem->GetZasInt());
|
||||
if(data[Z] == nullptr)
|
||||
{
|
||||
G4int Z = std::min((*theElementVector)[j]->GetZasInt(), maxZ);
|
||||
if(!data[Z]) { ReadData(Z, path); }
|
||||
ReadData(Z, path);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -138,20 +131,20 @@ void G4LivermoreGammaConversionModel::Initialise(
|
||||
|
||||
void G4LivermoreGammaConversionModel::ReadData(size_t Z, const char* path)
|
||||
{
|
||||
if (verboseLevel > 1)
|
||||
if (verboseLevel > 1)
|
||||
{
|
||||
G4cout << "Calling ReadData() of G4LivermoreGammaConversionModel"
|
||||
G4cout << "Calling ReadData() of G4LivermoreGammaConversionModel"
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
if(data[Z]) { return; }
|
||||
|
||||
if(data[Z]!= nullptr) { return; }
|
||||
|
||||
const char* datadir = path;
|
||||
|
||||
if(!datadir)
|
||||
if(datadir == nullptr)
|
||||
{
|
||||
datadir = std::getenv("G4LEDATA");
|
||||
if(!datadir)
|
||||
if(datadir == nullptr)
|
||||
{
|
||||
G4Exception("G4LivermoreGammaConversionModel::ReadData()",
|
||||
"em0006",FatalException,
|
||||
@@ -161,10 +154,15 @@ void G4LivermoreGammaConversionModel::ReadData(size_t Z, const char* path)
|
||||
}
|
||||
data[Z] = new G4PhysicsFreeVector();
|
||||
std::ostringstream ost;
|
||||
ost << datadir << "/epics2017/pair/pp-cs-" << Z <<".dat";
|
||||
if(G4EmParameters::Instance()->LivermoreDataDir() == "livermore"){
|
||||
ost << datadir << "/livermore/pair/pp-cs-" << Z <<".dat";
|
||||
}else{
|
||||
ost << datadir << "/epics2017/pair/pp-cs-" << Z <<".dat";
|
||||
}
|
||||
|
||||
std::ifstream fin(ost.str().c_str());
|
||||
|
||||
if( !fin.is_open())
|
||||
|
||||
if( !fin.is_open())
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "G4LivermoreGammaConversionModel data file <" << ost.str().c_str()
|
||||
@@ -173,15 +171,15 @@ void G4LivermoreGammaConversionModel::ReadData(size_t Z, const char* path)
|
||||
"em0003",FatalException,
|
||||
ed,"G4LEDATA version should be G4EMLOW6.27 or later.");
|
||||
return;
|
||||
}
|
||||
else
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if(verboseLevel > 1) { G4cout << "File " << ost.str()
|
||||
|
||||
if(verboseLevel > 1) { G4cout << "File " << ost.str()
|
||||
<< " is opened by G4LivermoreGammaConversionModel" << G4endl;}
|
||||
|
||||
|
||||
data[Z]->Retrieve(fin, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
@@ -190,34 +188,34 @@ G4double G4LivermoreGammaConversionModel::ComputeCrossSectionPerAtom(
|
||||
const G4ParticleDefinition* particle,
|
||||
G4double GammaEnergy, G4double Z, G4double, G4double, G4double)
|
||||
{
|
||||
if (verboseLevel > 1)
|
||||
if (verboseLevel > 1)
|
||||
{
|
||||
G4cout << "G4LivermoreGammaConversionModel::ComputeCrossSectionPerAtom() Z= "
|
||||
G4cout << "G4LivermoreGammaConversionModel::ComputeCrossSectionPerAtom() Z= "
|
||||
<< Z << G4endl;
|
||||
}
|
||||
|
||||
if (GammaEnergy < lowEnergyLimit) { return 0.0; }
|
||||
if (GammaEnergy < lowEnergyLimit) { return 0.0; }
|
||||
|
||||
G4double xs = 0.0;
|
||||
|
||||
|
||||
G4int intZ = std::max(1, std::min(G4lrint(Z), maxZ));
|
||||
|
||||
G4PhysicsFreeVector* pv = data[intZ];
|
||||
|
||||
// if element was not initialised
|
||||
// do initialisation safely for MT mode
|
||||
if(!pv)
|
||||
if(pv == nullptr)
|
||||
{
|
||||
InitialiseForElement(particle, intZ);
|
||||
pv = data[intZ];
|
||||
if(!pv) { return xs; }
|
||||
if(pv == nullptr) { return xs; }
|
||||
}
|
||||
// x-section is taken from the table
|
||||
xs = pv->Value(GammaEnergy);
|
||||
xs = pv->Value(GammaEnergy);
|
||||
|
||||
if(verboseLevel > 0)
|
||||
{
|
||||
G4cout << "*** Gamma conversion xs for Z=" << Z << " at energy E(MeV)="
|
||||
G4cout << "*** Gamma conversion xs for Z=" << Z << " at energy E(MeV)="
|
||||
<< GammaEnergy/MeV << " cs=" << xs/millibarn << " mb" << G4endl;
|
||||
}
|
||||
return xs;
|
||||
@@ -226,11 +224,11 @@ G4double G4LivermoreGammaConversionModel::ComputeCrossSectionPerAtom(
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void G4LivermoreGammaConversionModel::InitialiseForElement(
|
||||
const G4ParticleDefinition*,
|
||||
const G4ParticleDefinition*,
|
||||
G4int Z)
|
||||
{
|
||||
G4AutoLock l(&LivermoreGammaConversionModelMutex);
|
||||
if(!data[Z]) { ReadData(Z); }
|
||||
if(data[Z] == nullptr) { ReadData(Z); }
|
||||
l.unlock();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,587 +0,0 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// Author: Sebastien Incerti
|
||||
// 22 January 2012
|
||||
// on base of G4LivermoreGammaConversionModelRC (original version)
|
||||
// and G4LivermoreRayleighModel (MT version)
|
||||
|
||||
#include "G4LivermoreGammaConversionModelRC.hh"
|
||||
#include "G4PhysicalConstants.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4Log.hh"
|
||||
#include "G4Electron.hh"
|
||||
#include "G4Positron.hh"
|
||||
#include "G4Gamma.hh"
|
||||
#include "G4ParticleChangeForGamma.hh"
|
||||
#include "G4Exp.hh"
|
||||
#include "G4AutoLock.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
using namespace std;
|
||||
namespace { G4Mutex LivermoreGammaConversionModelRCMutex = G4MUTEX_INITIALIZER; }
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4PhysicsFreeVector* G4LivermoreGammaConversionModelRC::data[] = {nullptr};
|
||||
|
||||
G4LivermoreGammaConversionModelRC::G4LivermoreGammaConversionModelRC
|
||||
(const G4ParticleDefinition*, const G4String& nam)
|
||||
:G4VEmModel(nam),smallEnergy(2.*MeV),isInitialised(false)
|
||||
{
|
||||
fParticleChange = nullptr;
|
||||
lowEnergyLimit = 2.0*electron_mass_c2;
|
||||
|
||||
verboseLevel= 0;
|
||||
// Verbosity scale for debugging purposes:
|
||||
// 0 = nothing
|
||||
// 1 = calculation of cross sections, file openings...
|
||||
// 2 = entering in methods
|
||||
if(verboseLevel > 0)
|
||||
{
|
||||
G4cout << "G4LivermoreGammaConversionModelRC is constructed " << G4endl;
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4LivermoreGammaConversionModelRC::~G4LivermoreGammaConversionModelRC()
|
||||
{
|
||||
if(IsMaster()) {
|
||||
for(G4int i=0; i<maxZ; ++i) {
|
||||
if(data[i]) {
|
||||
delete data[i];
|
||||
data[i] = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void G4LivermoreGammaConversionModelRC::Initialise(
|
||||
const G4ParticleDefinition* particle,
|
||||
const G4DataVector& cuts)
|
||||
{
|
||||
if (verboseLevel > 1)
|
||||
{
|
||||
G4cout << "Calling Initialise() of G4LivermoreGammaConversionModelRC."
|
||||
<< G4endl
|
||||
<< "Energy range: "
|
||||
<< LowEnergyLimit() / MeV << " MeV - "
|
||||
<< HighEnergyLimit() / GeV << " GeV"
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
if(IsMaster())
|
||||
{
|
||||
// Initialise element selector
|
||||
InitialiseElementSelectors(particle, cuts);
|
||||
|
||||
// Access to elements
|
||||
char* path = std::getenv("G4LEDATA");
|
||||
|
||||
G4ProductionCutsTable* theCoupleTable =
|
||||
G4ProductionCutsTable::GetProductionCutsTable();
|
||||
|
||||
G4int numOfCouples = theCoupleTable->GetTableSize();
|
||||
|
||||
for(G4int i=0; i<numOfCouples; ++i)
|
||||
{
|
||||
const G4Material* material =
|
||||
theCoupleTable->GetMaterialCutsCouple(i)->GetMaterial();
|
||||
const G4ElementVector* theElementVector = material->GetElementVector();
|
||||
G4int nelm = material->GetNumberOfElements();
|
||||
|
||||
for (G4int j=0; j<nelm; ++j)
|
||||
{
|
||||
G4int Z = (G4int)(*theElementVector)[j]->GetZ();
|
||||
if(Z < 1) { Z = 1; }
|
||||
else if(Z > maxZ) { Z = maxZ; }
|
||||
if(!data[Z]) { ReadData(Z, path); }
|
||||
}
|
||||
}
|
||||
}
|
||||
if(isInitialised) { return; }
|
||||
fParticleChange = GetParticleChangeForGamma();
|
||||
isInitialised = true;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void G4LivermoreGammaConversionModelRC::InitialiseLocal(
|
||||
const G4ParticleDefinition*, G4VEmModel* masterModel)
|
||||
{
|
||||
SetElementSelectors(masterModel->GetElementSelectors());
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4double
|
||||
G4LivermoreGammaConversionModelRC::MinPrimaryEnergy(const G4Material*,
|
||||
const G4ParticleDefinition*,
|
||||
G4double)
|
||||
{
|
||||
return lowEnergyLimit;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void G4LivermoreGammaConversionModelRC::ReadData(size_t Z, const char* path)
|
||||
{
|
||||
if (verboseLevel > 1)
|
||||
{
|
||||
G4cout << "Calling ReadData() of G4LivermoreGammaConversionModelRC"
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
if(data[Z]) { return; }
|
||||
|
||||
const char* datadir = path;
|
||||
|
||||
if(!datadir)
|
||||
{
|
||||
datadir = std::getenv("G4LEDATA");
|
||||
if(!datadir)
|
||||
{
|
||||
G4Exception("G4LivermoreGammaConversionModelRC::ReadData()",
|
||||
"em0006",FatalException,
|
||||
"Environment variable G4LEDATA not defined");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
data[Z] = new G4PhysicsFreeVector(0,/*spline=*/true);
|
||||
//
|
||||
|
||||
std::ostringstream ost;
|
||||
ost << datadir << "/livermore/pair/pp-cs-" << Z <<".dat";
|
||||
std::ifstream fin(ost.str().c_str());
|
||||
|
||||
if( !fin.is_open())
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "G4LivermoreGammaConversionModelRC data file <" << ost.str().c_str()
|
||||
<< "> is not opened!" << G4endl;
|
||||
G4Exception("G4LivermoreGammaConversionModelRC::ReadData()",
|
||||
"em0003",FatalException,
|
||||
ed,"G4LEDATA version should be G4EMLOW6.27 or later.");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if(verboseLevel > 3) { G4cout << "File " << ost.str()
|
||||
<< " is opened by G4LivermoreGammaConversionModelRC" << G4endl;}
|
||||
|
||||
data[Z]->Retrieve(fin, true);
|
||||
}
|
||||
|
||||
// Activation of spline interpolation
|
||||
data[Z] ->FillSecondDerivatives();
|
||||
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4double
|
||||
G4LivermoreGammaConversionModelRC::ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
|
||||
G4double GammaEnergy,
|
||||
G4double Z, G4double,
|
||||
G4double, G4double)
|
||||
{
|
||||
if (verboseLevel > 1)
|
||||
{
|
||||
G4cout << "Calling ComputeCrossSectionPerAtom() of G4LivermoreGammaConversionModelRC"
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
if (GammaEnergy < lowEnergyLimit) { return 0.0; }
|
||||
|
||||
G4double xs = 0.0;
|
||||
|
||||
G4int intZ=G4int(Z);
|
||||
|
||||
if(intZ < 1 || intZ > maxZ) { return xs; }
|
||||
|
||||
G4PhysicsFreeVector* pv = data[intZ];
|
||||
|
||||
// if element was not initialised
|
||||
// do initialisation safely for MT mode
|
||||
if(!pv)
|
||||
{
|
||||
InitialiseForElement(0, intZ);
|
||||
pv = data[intZ];
|
||||
if(!pv) { return xs; }
|
||||
}
|
||||
// x-section is taken from the table
|
||||
xs = pv->Value(GammaEnergy);
|
||||
|
||||
if(verboseLevel > 0)
|
||||
{
|
||||
G4int n = pv->GetVectorLength() - 1;
|
||||
G4cout << "****** DEBUG: tcs value for Z=" << Z << " at energy (MeV)="
|
||||
<< GammaEnergy/MeV << G4endl;
|
||||
G4cout << " cs (Geant4 internal unit)=" << xs << G4endl;
|
||||
G4cout << " -> first cs value in EADL data file (iu) =" << (*pv)[0] << G4endl;
|
||||
G4cout << " -> last cs value in EADL data file (iu) =" << (*pv)[n] << G4endl;
|
||||
G4cout << "*********************************************************" << G4endl;
|
||||
}
|
||||
|
||||
return xs;
|
||||
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void G4LivermoreGammaConversionModelRC::SampleSecondaries(
|
||||
std::vector<G4DynamicParticle*>* fvect,
|
||||
const G4MaterialCutsCouple* couple,
|
||||
const G4DynamicParticle* aDynamicGamma,
|
||||
G4double, G4double)
|
||||
{
|
||||
// The energies of the e+ e- secondaries are sampled using the Bethe - Heitler
|
||||
// cross sections with Coulomb correction. A modified version of the random
|
||||
// number techniques of Butcher & Messel is used (Nuc Phys 20(1960),15).
|
||||
|
||||
// Note 1 : Effects due to the breakdown of the Born approximation at low
|
||||
// energy are ignored.
|
||||
// Note 2 : The differential cross section implicitly takes account of
|
||||
// pair creation in both nuclear and atomic electron fields. However triplet
|
||||
// prodution is not generated.
|
||||
|
||||
if (verboseLevel > 1) {
|
||||
G4cout << "Calling SampleSecondaries() of G4LivermoreGammaConversionModelRC"
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
G4double photonEnergy = aDynamicGamma->GetKineticEnergy();
|
||||
G4ParticleMomentum photonDirection = aDynamicGamma->GetMomentumDirection();
|
||||
|
||||
G4double epsilon ;
|
||||
G4double epsilon0Local = electron_mass_c2 / photonEnergy ;
|
||||
|
||||
G4double electronTotEnergy = 0.0;
|
||||
G4double positronTotEnergy = 0.0;
|
||||
G4double HardPhotonEnergy = 0.0;
|
||||
|
||||
|
||||
// Do it fast if photon energy < 2. MeV
|
||||
if (photonEnergy < smallEnergy )
|
||||
{
|
||||
epsilon = epsilon0Local + (0.5 - epsilon0Local) * G4UniformRand();
|
||||
if (G4UniformRand() > 0.5)
|
||||
{
|
||||
electronTotEnergy = (1. - epsilon) * photonEnergy;
|
||||
positronTotEnergy = epsilon * photonEnergy;
|
||||
}
|
||||
else
|
||||
{
|
||||
positronTotEnergy = (1. - epsilon) * photonEnergy;
|
||||
electronTotEnergy = epsilon * photonEnergy;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Select randomly one element in the current material
|
||||
|
||||
const G4ParticleDefinition* particle = aDynamicGamma->GetDefinition();
|
||||
const G4Element* element = SelectRandomAtom(couple,particle,photonEnergy);
|
||||
|
||||
if (element == 0)
|
||||
{
|
||||
G4cout << "G4LivermoreGammaConversionModelRC::SampleSecondaries - element = 0"
|
||||
<< G4endl;
|
||||
return;
|
||||
}
|
||||
G4IonisParamElm* ionisation = element->GetIonisation();
|
||||
if (ionisation == 0)
|
||||
{
|
||||
G4cout << "G4LivermoreGammaConversionModelRC::SampleSecondaries - ionisation = 0"
|
||||
<< G4endl;
|
||||
return;
|
||||
}
|
||||
|
||||
// Extract Coulomb factor for this Element
|
||||
G4double fZ = 8. * (ionisation->GetlogZ3());
|
||||
if (photonEnergy > 50. * MeV) fZ += 8. * (element->GetfCoulomb());
|
||||
|
||||
// Limits of the screening variable
|
||||
G4double screenFactor = 136. * epsilon0Local / (element->GetIonisation()->GetZ3()) ;
|
||||
G4double screenMax = G4Exp ((42.24 - fZ)/8.368) - 0.952 ;
|
||||
G4double screenMin = std::min(4.*screenFactor,screenMax) ;
|
||||
|
||||
// Limits of the energy sampling
|
||||
G4double epsilon1 = 0.5 - 0.5 * std::sqrt(1. - screenMin / screenMax) ;
|
||||
G4double epsilonMin = std::max(epsilon0Local,epsilon1);
|
||||
G4double epsilonRange = 0.5 - epsilonMin ;
|
||||
|
||||
// Sample the energy rate of the created electron (or positron)
|
||||
G4double screen;
|
||||
G4double gReject ;
|
||||
|
||||
G4double f10 = ScreenFunction1(screenMin) - fZ;
|
||||
G4double f20 = ScreenFunction2(screenMin) - fZ;
|
||||
G4double normF1 = std::max(f10 * epsilonRange * epsilonRange,0.);
|
||||
G4double normF2 = std::max(1.5 * f20,0.);
|
||||
|
||||
// Method for Radiative corrections
|
||||
|
||||
G4double a=393.3750918, b=115.3070201, c=810.6428451, d=19.96497475, e=1016.874592, f=1.936685510,
|
||||
gLocal=751.2140962, h=0.099751048, i=299.9466339, j=0.002057250, k=49.81034926;
|
||||
G4double aa=-18.6371131, bb=-1729.95248, cc=9450.971186, dd=106336.0145, ee=55143.09287, ff=-117602.840,
|
||||
gg=-721455.467, hh=693957.8635, ii=156266.1085, jj=533209.9347;
|
||||
G4double Rechazo = 0.;
|
||||
G4double logepsMin = log(epsilonMin);
|
||||
G4double NormaRC = a + b*logepsMin + c/logepsMin + d*pow(logepsMin,2.) + e/pow(logepsMin,2.) + f*pow(logepsMin,3.) +
|
||||
gLocal/pow(logepsMin,3.) + h*pow(logepsMin,4.) + i/pow(logepsMin,4.) + j*pow(logepsMin,5.) +
|
||||
k/pow(logepsMin,5.);
|
||||
|
||||
G4double HardPhotonThreshold = 0.08;
|
||||
G4double r1, r2, r3, beta=0, gbeta, sigt = 582.068, sigh, rejet;
|
||||
G4double cg = (11./2.)/(G4Exp(-11.*HardPhotonThreshold/2.)-G4Exp(-11./2.));
|
||||
|
||||
r1 = G4UniformRand();
|
||||
sigh = 1028.58*G4Exp(-HardPhotonThreshold/0.09033) + 136.63; // sigma hard
|
||||
|
||||
if (r1 > 1.- sigh/sigt) {
|
||||
r2 = G4UniformRand();
|
||||
rejet = 0.;
|
||||
while (r2 > rejet) {
|
||||
r3 = G4UniformRand();
|
||||
beta = (-2./11.)*log(G4Exp(-0.08*11./2.)-r3*11./(2.*cg));
|
||||
gbeta = G4Exp(-11.*beta/2.);
|
||||
rejet = fbeta(beta)/(8000.*gbeta);
|
||||
}
|
||||
HardPhotonEnergy = beta * photonEnergy;
|
||||
}
|
||||
else{
|
||||
HardPhotonEnergy = 0.;
|
||||
}
|
||||
|
||||
photonEnergy -= HardPhotonEnergy;
|
||||
|
||||
do
|
||||
{
|
||||
do
|
||||
{
|
||||
if (normF1 / (normF1 + normF2) > G4UniformRand() )
|
||||
{
|
||||
epsilon = 0.5 - epsilonRange * std::pow(G4UniformRand(), 0.333333) ;
|
||||
screen = screenFactor / (epsilon * (1. - epsilon));
|
||||
gReject = (ScreenFunction1(screen) - fZ) / f10 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
epsilon = epsilonMin + epsilonRange * G4UniformRand();
|
||||
screen = screenFactor / (epsilon * (1 - epsilon));
|
||||
gReject = (ScreenFunction2(screen) - fZ) / f20 ;
|
||||
}
|
||||
} while ( gReject < G4UniformRand() );
|
||||
|
||||
|
||||
|
||||
if (G4UniformRand()>0.5) epsilon = (1. - epsilon); // Extención de Epsilon hasta 1.
|
||||
|
||||
G4double logepsilon = log(epsilon);
|
||||
G4double deltaP_R1 = 1. + (a + b*logepsilon + c/logepsilon + d*pow(logepsilon,2.) + e/pow(logepsilon,2.) +
|
||||
f*pow(logepsilon,3.) + gLocal/pow(logepsilon,3.) + h*pow(logepsilon,4.) + i/pow(logepsilon,4.) +
|
||||
j*pow(logepsilon,5.) + k/pow(logepsilon,5.))/100.;
|
||||
G4double deltaP_R2 = 1.+((aa + cc*logepsilon + ee*pow(logepsilon,2.) + gg*pow(logepsilon,3.) + ii*pow(logepsilon,4.))
|
||||
/ (1. + bb*logepsilon + dd*pow(logepsilon,2.) + ff*pow(logepsilon,3.) + hh*pow(logepsilon,4.)
|
||||
+ jj*pow(logepsilon,5.) ))/100.;
|
||||
|
||||
if (epsilon <= 0.5)
|
||||
{
|
||||
Rechazo = deltaP_R1/NormaRC;
|
||||
}
|
||||
else
|
||||
{
|
||||
Rechazo = deltaP_R2/NormaRC;
|
||||
}
|
||||
} while (Rechazo < G4UniformRand() );
|
||||
|
||||
electronTotEnergy = (1. - epsilon) * photonEnergy;
|
||||
positronTotEnergy = epsilon * photonEnergy;
|
||||
|
||||
} // End of epsilon sampling
|
||||
|
||||
|
||||
// Fix charges randomly
|
||||
|
||||
// Scattered electron (positron) angles. ( Z - axis along the parent photon)
|
||||
// Universal distribution suggested by L. Urban (Geant3 manual (1993) Phys211),
|
||||
// derived from Tsai distribution (Rev. Mod. Phys. 49, 421 (1977)
|
||||
G4double u;
|
||||
const G4double a1 = 0.625;
|
||||
G4double a2 = 3. * a1;
|
||||
|
||||
if (0.25 > G4UniformRand())
|
||||
{
|
||||
u = - G4Log(G4UniformRand() * G4UniformRand()) / a1 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
u = - G4Log(G4UniformRand() * G4UniformRand()) / a2 ;
|
||||
}
|
||||
|
||||
G4double thetaEle = u*electron_mass_c2/electronTotEnergy;
|
||||
G4double thetaPos = u*electron_mass_c2/positronTotEnergy;
|
||||
G4double phi = twopi * G4UniformRand();
|
||||
|
||||
G4double dxEle= std::sin(thetaEle)*std::cos(phi),dyEle= std::sin(thetaEle)*std::sin(phi),dzEle=std::cos(thetaEle);
|
||||
G4double dxPos=-std::sin(thetaPos)*std::cos(phi),dyPos=-std::sin(thetaPos)*std::sin(phi),dzPos=std::cos(thetaPos);
|
||||
|
||||
// Kinematics of the created pair:
|
||||
// the electron and positron are assumed to have a symetric angular
|
||||
// distribution with respect to the Z axis along the parent photon
|
||||
G4double electronKineEnergy = std::max(0.,electronTotEnergy - electron_mass_c2) ;
|
||||
|
||||
G4ThreeVector electronDirection (dxEle, dyEle, dzEle);
|
||||
electronDirection.rotateUz(photonDirection);
|
||||
|
||||
G4DynamicParticle* particle1 = new G4DynamicParticle (G4Electron::Electron(),
|
||||
electronDirection,
|
||||
electronKineEnergy);
|
||||
|
||||
// The e+ is always created
|
||||
G4double positronKineEnergy = std::max(0.,positronTotEnergy - electron_mass_c2) ;
|
||||
|
||||
G4ThreeVector positronDirection (dxPos, dyPos, dzPos);
|
||||
positronDirection.rotateUz(photonDirection);
|
||||
|
||||
// Create G4DynamicParticle object for the particle2
|
||||
G4DynamicParticle* particle2 = new G4DynamicParticle(G4Positron::Positron(),
|
||||
positronDirection,
|
||||
positronKineEnergy);
|
||||
// Fill output vector
|
||||
fvect->push_back(particle1);
|
||||
fvect->push_back(particle2);
|
||||
|
||||
if (HardPhotonEnergy > 0.)
|
||||
{
|
||||
G4double thetaHardPhoton = u*electron_mass_c2/HardPhotonEnergy;
|
||||
phi = twopi * G4UniformRand();
|
||||
G4double dxHardP= std::sin(thetaHardPhoton)*std::cos(phi);
|
||||
G4double dyHardP= std::sin(thetaHardPhoton)*std::sin(phi);
|
||||
G4double dzHardP =std::cos(thetaHardPhoton);
|
||||
|
||||
G4ThreeVector hardPhotonDirection (dxHardP, dyHardP, dzHardP);
|
||||
hardPhotonDirection.rotateUz(photonDirection);
|
||||
G4DynamicParticle* particle3 = new G4DynamicParticle (G4Gamma::Gamma(),
|
||||
hardPhotonDirection,
|
||||
HardPhotonEnergy);
|
||||
fvect->push_back(particle3);
|
||||
}
|
||||
|
||||
// kill incident photon
|
||||
fParticleChange->SetProposedKineticEnergy(0.);
|
||||
fParticleChange->ProposeTrackStatus(fStopAndKill);
|
||||
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4double G4LivermoreGammaConversionModelRC::ScreenFunction1(G4double screenVariable)
|
||||
{
|
||||
// Compute the value of the screening function 3*phi1 - phi2
|
||||
|
||||
G4double value;
|
||||
if (screenVariable > 1.)
|
||||
value = 42.24 - 8.368 * G4Log(screenVariable + 0.952);
|
||||
else
|
||||
value = 42.392 - screenVariable * (7.796 - 1.961 * screenVariable);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4double G4LivermoreGammaConversionModelRC::ScreenFunction2(G4double screenVariable)
|
||||
{
|
||||
// Compute the value of the screening function 1.5*phi1 - 0.5*phi2
|
||||
G4double value;
|
||||
if (screenVariable > 1.)
|
||||
value = 42.24 - 8.368 * G4Log(screenVariable + 0.952);
|
||||
else
|
||||
value = 41.405 - screenVariable * (5.828 - 0.8945 * screenVariable);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
G4double G4LivermoreGammaConversionModelRC::fbeta(G4double x)
|
||||
{
|
||||
// compute the probabililty distribution for hard photon
|
||||
G4double gamma, eta, d, p1, p2, p3, p4, p5, p6, p7, ffbeta;
|
||||
gamma = (1.-x)*(1.-x)/x;
|
||||
eta = (1.-x)/(1.+x);
|
||||
d = Dilog(1./x)-Dilog(x);
|
||||
p1 = -1.*(25528.*pow(gamma,2) + 116044.* gamma +151556.)/105.;
|
||||
p2 = 256.* pow(gamma,3) + 1092.* pow(gamma,2) +1260.*gamma + 420.;
|
||||
p3 = (676.*pow(gamma,3) + 9877.*pow(gamma,2) + 58415.*gamma + 62160.)/105.;
|
||||
p4 = 64.*pow(gamma,3) + 305.*pow(gamma,2) + 475.*gamma + 269. - 276./gamma;
|
||||
p5 = (676.*pow(gamma,3) + 38109.*pow(gamma,2) + 211637.*gamma + 266660. - 53632./gamma)/105.;
|
||||
p6 = 32.*pow(gamma,2) + 416.*gamma + 1310. +1184./gamma;
|
||||
p7 = 128.*pow(gamma,3) + 802.*pow(gamma,2) + 1028.*gamma - 470. - 1184./gamma;
|
||||
ffbeta = (1.-x) * (p1 + p2*pi*pi/6. + p3*log(gamma) +
|
||||
p4*pow(log(x),2) + (p5 + p6*log(gamma))*eta*log(x) + p7*d*eta);
|
||||
return ffbeta;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4double G4LivermoreGammaConversionModelRC::Dilog(G4double y)
|
||||
{
|
||||
G4double fdilog = 0.0;
|
||||
if (y <= 0.5) {
|
||||
fdilog = pow(pi,2)/6. + (1.-y)*(log(1-y)-1.)+pow((1.-y),2)*((1./2.)*log(1.-y)-1./4.)
|
||||
+pow((1.-y),3)*((1./3.)*log(1.-y)-1./9.)+pow((1.-y),4)*((1./4.)*log(1.-y)-1./16.);
|
||||
}
|
||||
if (0.5 < y && y < 2.) {
|
||||
fdilog = 1.-y+pow((1.-y),2)/4.+pow((1.-y),3)/9.+pow((1.-y),4)/16.+
|
||||
pow((1.-y),5)/25.+pow((1.-y),6)/36.+pow((1.-y),7)/49.;
|
||||
}
|
||||
if (y >= 2.) {
|
||||
fdilog = -pow(log(y),2)/2. - pow(pi,2)/6. + (log(y)+1.)/y +
|
||||
(log(y)/2.+1./4.)/pow(y,2) + (log(y)/3.+1./9.)/pow(y,3);
|
||||
}
|
||||
return fdilog;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void G4LivermoreGammaConversionModelRC::InitialiseForElement(
|
||||
const G4ParticleDefinition*,
|
||||
G4int Z)
|
||||
{
|
||||
G4AutoLock l(&LivermoreGammaConversionModelRCMutex);
|
||||
if(!data[Z]) { ReadData(Z); }
|
||||
l.unlock();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -68,7 +68,7 @@ using namespace std;
|
||||
|
||||
G4LivermorePhotoElectricModel::G4LivermorePhotoElectricModel(const G4String& nam)
|
||||
: G4VEmModel(nam),fParticleChange(nullptr), fAtomDeexcitation(nullptr),
|
||||
maxZ(99),nShellLimit(100),fDeexcitationActive(false),isInitialised(false)
|
||||
maxZ(100),nShellLimit(100),fDeexcitationActive(false),isInitialised(false)
|
||||
{
|
||||
verboseLevel= 0;
|
||||
// Verbosity scale:
|
||||
@@ -99,18 +99,29 @@ G4LivermorePhotoElectricModel::G4LivermorePhotoElectricModel(const G4String& nam
|
||||
|
||||
G4LivermorePhotoElectricModel::~G4LivermorePhotoElectricModel()
|
||||
{
|
||||
if(IsMaster()) {
|
||||
if(IsMaster())
|
||||
{
|
||||
delete fShellCrossSection;
|
||||
fShellCrossSection = nullptr;
|
||||
for(G4int i=0; i<maxZ; ++i) {
|
||||
delete fParamHigh[i];
|
||||
fParamHigh[i] = nullptr;
|
||||
delete fParamLow[i];
|
||||
fParamLow[i] = nullptr;
|
||||
delete fCrossSection[i];
|
||||
fCrossSection[i] = nullptr;
|
||||
delete fCrossSectionLE[i];
|
||||
fCrossSectionLE[i] = nullptr;
|
||||
for(G4int i = 0; i <= maxZ; ++i)
|
||||
{
|
||||
if(fParamHigh[i]){
|
||||
delete fParamHigh[i];
|
||||
fParamHigh[i] = nullptr;
|
||||
}
|
||||
if(fParamLow[i]){
|
||||
delete fParamLow[i];
|
||||
fParamLow[i] = nullptr;
|
||||
}
|
||||
if(fCrossSection[i]){
|
||||
delete fCrossSection[i];
|
||||
fCrossSection[i] = nullptr;
|
||||
}
|
||||
if(fCrossSectionLE[i]){
|
||||
delete fCrossSectionLE[i];
|
||||
fCrossSectionLE[i] = nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -127,28 +138,23 @@ G4LivermorePhotoElectricModel::Initialise(const G4ParticleDefinition*,
|
||||
|
||||
if(IsMaster()) {
|
||||
|
||||
if(!fWater) {
|
||||
if(fWater == nullptr) {
|
||||
fWater = G4Material::GetMaterial("G4_WATER", false);
|
||||
if(!fWater) { fWater = G4Material::GetMaterial("Water", false); }
|
||||
if(fWater == nullptr) { fWater = G4Material::GetMaterial("Water", false); }
|
||||
if(fWater) { fWaterEnergyLimit = 13.6*eV; }
|
||||
}
|
||||
|
||||
if(!fShellCrossSection) { fShellCrossSection = new G4ElementData(); }
|
||||
|
||||
G4ProductionCutsTable* theCoupleTable =
|
||||
G4ProductionCutsTable::GetProductionCutsTable();
|
||||
G4int numOfCouples = theCoupleTable->GetTableSize();
|
||||
|
||||
for(G4int i=0; i<numOfCouples; ++i) {
|
||||
const G4MaterialCutsCouple* couple =
|
||||
theCoupleTable->GetMaterialCutsCouple(i);
|
||||
const G4Material* material = couple->GetMaterial();
|
||||
const G4ElementVector* theElementVector = material->GetElementVector();
|
||||
G4int nelm = material->GetNumberOfElements();
|
||||
|
||||
for (G4int j=0; j<nelm; ++j) {
|
||||
G4int Z = std::min(maxZ, (*theElementVector)[j]->GetZasInt());
|
||||
if(!fCrossSection[Z]) { ReadData(Z); }
|
||||
if(fShellCrossSection == nullptr) { fShellCrossSection = new G4ElementData(); }
|
||||
|
||||
const G4ElementTable* elemTable = G4Element::GetElementTable();
|
||||
size_t numElems = (*elemTable).size();
|
||||
for(size_t ie = 0; ie < numElems; ++ie)
|
||||
{
|
||||
const G4Element* elem = (*elemTable)[ie];
|
||||
const G4int Z = std::min(maxZ, elem->GetZasInt());
|
||||
if(fCrossSection[Z] == nullptr)
|
||||
{
|
||||
ReadData(Z);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -217,11 +223,11 @@ G4double G4LivermorePhotoElectricModel::ComputeCrossSectionPerAtom(
|
||||
}
|
||||
G4double cs = 0.0;
|
||||
G4int Z = G4lrint(ZZ);
|
||||
if(Z >= maxZ) { return cs; }
|
||||
if(Z > maxZ) { return cs; }
|
||||
// if element was not initialised
|
||||
|
||||
// do initialisation safely for MT mode
|
||||
if(!fCrossSection[Z]) { InitialiseForElement(theGamma, Z); }
|
||||
if(fCrossSection[Z] == nullptr) { InitialiseForElement(theGamma, Z); }
|
||||
|
||||
//7: rows in the parameterization file; 5: number of parameters
|
||||
G4int idx = fNShells[Z]*7 - 5;
|
||||
@@ -308,10 +314,10 @@ G4LivermorePhotoElectricModel::SampleSecondaries(
|
||||
// Select the ionised shell in the current atom according to shell
|
||||
// cross sections
|
||||
// G4cout << "Select random shell Z= " << Z << G4endl;
|
||||
if(Z >= maxZ) { Z = maxZ-1; }
|
||||
if(Z > maxZ) { Z = maxZ; }
|
||||
|
||||
// element was not initialised gamma should be absorbed
|
||||
if(!fCrossSection[Z]) {
|
||||
if(fCrossSection[Z] == nullptr) {
|
||||
fParticleChange->ProposeLocalEnergyDeposit(gammaEnergy);
|
||||
return;
|
||||
}
|
||||
@@ -495,7 +501,12 @@ const G4String& G4LivermorePhotoElectricModel::FindDirectoryPath()
|
||||
const char* path = std::getenv("G4LEDATA");
|
||||
if (path) {
|
||||
std::ostringstream ost;
|
||||
ost << path << "/livermore/phot_epics2014/";
|
||||
if(G4EmParameters::Instance()->LivermoreDataDir() =="livermore"){
|
||||
ost << path << "/livermore/phot_epics2014/";
|
||||
}else{
|
||||
ost << path << "/epics2017/phot/";
|
||||
}
|
||||
|
||||
fDataDirectory = ost.str();
|
||||
} else {
|
||||
G4Exception("G4SeltzerBergerModel::FindDirectoryPath()","em0006",
|
||||
@@ -516,11 +527,11 @@ void G4LivermorePhotoElectricModel::ReadData(G4int Z)
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
if(fCrossSection[Z]) { return; }
|
||||
if(fCrossSection[Z]!= nullptr) { return; }
|
||||
|
||||
// spline for photoeffect total x-section above K-shell
|
||||
// no spline for photoeffect total x-section above K-shell
|
||||
// but below the parameterized ones
|
||||
fCrossSection[Z] = new G4PhysicsFreeVector(0,/*spline=*/true);
|
||||
fCrossSection[Z] = new G4PhysicsFreeVector();
|
||||
std::ostringstream ost;
|
||||
ost << FindDirectoryPath() << "pe-cs-" << Z <<".dat";
|
||||
std::ifstream fin(ost.str().c_str());
|
||||
@@ -698,10 +709,10 @@ void G4LivermorePhotoElectricModel::ReadData(G4int Z)
|
||||
|
||||
G4double G4LivermorePhotoElectricModel::GetBindingEnergy(G4int Z, G4int shell)
|
||||
{
|
||||
if(Z < 1 || Z >= maxZ) { return -1;} //If Z is out of the supported return 0
|
||||
if(Z < 1 || Z > maxZ) { return -1;} //If Z is out of the supported return 0
|
||||
//If necessary load data for Z
|
||||
InitialiseForElement(theGamma, Z);
|
||||
if(!fCrossSection[Z] || shell < 0 || shell >= fNShellsUsed[Z]) { return -1; }
|
||||
if(fCrossSection[Z] == nullptr || shell < 0 || shell >= fNShellsUsed[Z]) { return -1; }
|
||||
|
||||
if(Z>2)
|
||||
return fShellCrossSection->GetComponentDataByIndex(Z, shell)->Energy(0);
|
||||
@@ -714,10 +725,10 @@ G4double G4LivermorePhotoElectricModel::GetBindingEnergy(G4int Z, G4int shell)
|
||||
void G4LivermorePhotoElectricModel::InitialiseForElement(
|
||||
const G4ParticleDefinition*, G4int Z)
|
||||
{
|
||||
if (!fCrossSection[Z]) {
|
||||
if (fCrossSection[Z] == nullptr) {
|
||||
#ifdef G4MULTITHREADED
|
||||
G4MUTEXLOCK(&livPhotoeffMutex);
|
||||
if (!fCrossSection[Z]) {
|
||||
if (fCrossSection[Z] == nullptr) {
|
||||
#endif
|
||||
ReadData(Z);
|
||||
#ifdef G4MULTITHREADED
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
#include "G4Exp.hh"
|
||||
#include "G4Pow.hh"
|
||||
#include "G4LogLogInterpolation.hh"
|
||||
|
||||
#include "G4PhysicsModelCatalog.hh"
|
||||
#include "G4EntanglementAuxInfo.hh"
|
||||
#include "G4eplusAnnihilationEntanglementClipBoard.hh"
|
||||
|
||||
@@ -100,8 +100,7 @@ G4LivermorePolarizedComptonModel::G4LivermorePolarizedComptonModel(const G4Parti
|
||||
|
||||
fParticleChange = nullptr;
|
||||
fAtomDeexcitation = nullptr;
|
||||
fEntanglementModelIndex
|
||||
= G4PhysicsModelCatalog::Register("G4GammaGammaEntanglement");
|
||||
fEntanglementModelID = G4PhysicsModelCatalog::GetModelID("model_GammaGammaEntanglement");
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
@@ -468,7 +467,7 @@ void G4LivermorePolarizedComptonModel::SampleSecondaries(std::vector<G4DynamicPa
|
||||
// Check for entanglement and re-sample phi if necessary
|
||||
|
||||
const auto* auxInfo
|
||||
= fParticleChange->GetCurrentTrack()->GetAuxiliaryTrackInformation(fEntanglementModelIndex);
|
||||
= fParticleChange->GetCurrentTrack()->GetAuxiliaryTrackInformation(fEntanglementModelID);
|
||||
if (auxInfo) {
|
||||
const auto* entanglementAuxInfo = dynamic_cast<const G4EntanglementAuxInfo*>(auxInfo);
|
||||
if (entanglementAuxInfo) {
|
||||
|
||||
+127
-130
@@ -54,13 +54,13 @@ namespace { G4Mutex LivermorePolarizedRayleighModelMutex = G4MUTEX_INITIALIZER;
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4PhysicsFreeVector* G4LivermorePolarizedRayleighModel::dataCS[] = {nullptr};
|
||||
G4VEMDataSet* G4LivermorePolarizedRayleighModel::formFactorData = nullptr;
|
||||
G4PhysicsFreeVector* G4LivermorePolarizedRayleighModel::formFactorData[] = {nullptr};
|
||||
|
||||
G4LivermorePolarizedRayleighModel::G4LivermorePolarizedRayleighModel(const G4ParticleDefinition*,
|
||||
const G4String& nam)
|
||||
:G4VEmModel(nam),fParticleChange(nullptr),isInitialised(false)
|
||||
{
|
||||
lowEnergyLimit = 250 * eV;
|
||||
lowEnergyLimit = 250 * CLHEP::eV;
|
||||
//
|
||||
verboseLevel= 0;
|
||||
// Verbosity scale:
|
||||
@@ -72,10 +72,9 @@ G4LivermorePolarizedRayleighModel::G4LivermorePolarizedRayleighModel(const G4Par
|
||||
|
||||
if(verboseLevel > 0) {
|
||||
G4cout << "Livermore Polarized Rayleigh is constructed " << G4endl
|
||||
<< "Energy range: "
|
||||
<< LowEnergyLimit() / eV << " eV - "
|
||||
<< HighEnergyLimit() / GeV << " GeV"
|
||||
<< G4endl;
|
||||
<< "Energy range: " << LowEnergyLimit() / CLHEP::eV << " eV - "
|
||||
<< HighEnergyLimit() / CLHEP::GeV << " GeV"
|
||||
<< G4endl;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,17 +82,16 @@ G4LivermorePolarizedRayleighModel::G4LivermorePolarizedRayleighModel(const G4Par
|
||||
|
||||
G4LivermorePolarizedRayleighModel::~G4LivermorePolarizedRayleighModel()
|
||||
{
|
||||
if(IsMaster()) {
|
||||
for(G4int i=0; i<maxZ; ++i) {
|
||||
if(dataCS[i]) {
|
||||
delete dataCS[i];
|
||||
dataCS[i] = nullptr;
|
||||
}
|
||||
}
|
||||
delete formFactorData;
|
||||
formFactorData = nullptr;
|
||||
|
||||
}
|
||||
if(IsMaster()) {
|
||||
for(G4int i=0; i<maxZ; ++i) {
|
||||
if(dataCS[i]) {
|
||||
delete dataCS[i];
|
||||
dataCS[i] = nullptr;
|
||||
delete formFactorData[i];
|
||||
formFactorData[i] = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
@@ -112,37 +110,17 @@ void G4LivermorePolarizedRayleighModel::Initialise(const G4ParticleDefinition* p
|
||||
G4cout << "Calling G4LivermorePolarizedRayleighModel::Initialise()" << G4endl;
|
||||
|
||||
if(IsMaster()) {
|
||||
// Form Factor
|
||||
G4VDataSetAlgorithm* ffInterpolation = new G4LogLogInterpolation;
|
||||
G4String formFactorFile = "rayl/re-ff-";
|
||||
formFactorData = new G4CompositeEMDataSet(ffInterpolation,1.,1.);
|
||||
formFactorData->LoadData(formFactorFile);
|
||||
|
||||
// Initialise element selector
|
||||
InitialiseElementSelectors(particle, cuts);
|
||||
|
||||
// Access to elements
|
||||
char* path = std::getenv("G4LEDATA");
|
||||
G4ProductionCutsTable* theCoupleTable =
|
||||
G4ProductionCutsTable::GetProductionCutsTable();
|
||||
G4int numOfCouples = theCoupleTable->GetTableSize();
|
||||
|
||||
for(G4int i=0; i<numOfCouples; ++i)
|
||||
{
|
||||
const G4MaterialCutsCouple* couple =
|
||||
theCoupleTable->GetMaterialCutsCouple(i);
|
||||
const G4Material* material = couple->GetMaterial();
|
||||
const G4ElementVector* theElementVector = material->GetElementVector();
|
||||
G4int nelm = material->GetNumberOfElements();
|
||||
|
||||
for (G4int j=0; j<nelm; ++j)
|
||||
{
|
||||
G4int Z = G4lrint((*theElementVector)[j]->GetZ());
|
||||
if(Z < 1) { Z = 1; }
|
||||
else if(Z > maxZ) { Z = maxZ; }
|
||||
if( (!dataCS[Z]) ) { ReadData(Z, path); }
|
||||
}
|
||||
}
|
||||
auto elmTable = G4Element::GetElementTable();
|
||||
for (auto const & elm : *elmTable) {
|
||||
G4int Z = std::min(elm->GetZasInt(), maxZ);
|
||||
if( nullptr == dataCS[Z] ) { ReadData(Z, path); }
|
||||
}
|
||||
}
|
||||
|
||||
if(isInitialised) { return; }
|
||||
@@ -153,8 +131,8 @@ void G4LivermorePolarizedRayleighModel::Initialise(const G4ParticleDefinition* p
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void G4LivermorePolarizedRayleighModel::InitialiseLocal(const G4ParticleDefinition*,
|
||||
G4VEmModel* masterModel)
|
||||
void G4LivermorePolarizedRayleighModel::InitialiseLocal(
|
||||
const G4ParticleDefinition*, G4VEmModel* masterModel)
|
||||
{
|
||||
SetElementSelectors(masterModel->GetElementSelectors());
|
||||
}
|
||||
@@ -163,20 +141,19 @@ void G4LivermorePolarizedRayleighModel::InitialiseLocal(const G4ParticleDefiniti
|
||||
|
||||
void G4LivermorePolarizedRayleighModel::ReadData(size_t Z, const char* path)
|
||||
{
|
||||
if (verboseLevel > 1)
|
||||
{
|
||||
G4cout << "Calling ReadData() of G4LivermoreRayleighModel"
|
||||
<< G4endl;
|
||||
}
|
||||
if (verboseLevel > 1) {
|
||||
G4cout << "Calling ReadData() of G4LivermoreRayleighModel"
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
if(dataCS[Z]) { return; }
|
||||
if(nullptr != dataCS[Z]) { return; }
|
||||
|
||||
const char* datadir = path;
|
||||
|
||||
if(!datadir)
|
||||
if(nullptr == datadir)
|
||||
{
|
||||
datadir = std::getenv("G4LEDATA");
|
||||
if(!datadir)
|
||||
if(nullptr == datadir)
|
||||
{
|
||||
G4Exception("G4LivermoreRayleighModelModel::ReadData()","em0006",
|
||||
FatalException,
|
||||
@@ -185,78 +162,96 @@ void G4LivermorePolarizedRayleighModel::ReadData(size_t Z, const char* path)
|
||||
}
|
||||
}
|
||||
dataCS[Z] = new G4PhysicsFreeVector();
|
||||
formFactorData[Z] = new G4PhysicsFreeVector();
|
||||
|
||||
std::ostringstream ostCS;
|
||||
ostCS << datadir << "/livermore/rayl/re-cs-" << Z <<".dat";
|
||||
std::ifstream finCS(ostCS.str().c_str());
|
||||
|
||||
if( !finCS .is_open() )
|
||||
{
|
||||
G4ExceptionDescription ed;
|
||||
ed << "G4LivermorePolarizedRayleighModel data file <" << ostCS.str().c_str()
|
||||
<< "> is not opened!" << G4endl;
|
||||
G4Exception("G4LivermorePolarizedRayleighModel::ReadData()","em0003",FatalException,
|
||||
ed,"G4LEDATA version should be G4EMLOW6.27 or later.");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(verboseLevel > 3) {
|
||||
G4cout << "File " << ostCS.str()
|
||||
<< " is opened by G4LivermoreRayleighModel" << G4endl;
|
||||
}
|
||||
dataCS[Z]->Retrieve(finCS, true);
|
||||
}
|
||||
}
|
||||
if( !finCS .is_open() ) {
|
||||
G4ExceptionDescription ed;
|
||||
ed << "G4LivermorePolarizedRayleighModel data file <" << ostCS.str().c_str()
|
||||
<< "> is not opened!" << G4endl;
|
||||
G4Exception("G4LivermorePolarizedRayleighModel::ReadData()","em0003",
|
||||
FatalException,
|
||||
ed,"G4LEDATA version should be G4EMLOW6.27 or later.");
|
||||
return;
|
||||
} else {
|
||||
if(verboseLevel > 3) {
|
||||
G4cout << "File " << ostCS.str()
|
||||
<< " is opened by G4LivermoreRayleighModel" << G4endl;
|
||||
}
|
||||
dataCS[Z]->Retrieve(finCS, true);
|
||||
}
|
||||
|
||||
std::ostringstream ostFF;
|
||||
ostFF << datadir << "/livermore/rayl/re-ff-" << Z <<".dat";
|
||||
std::ifstream finFF(ostFF.str().c_str());
|
||||
|
||||
if( !finFF.is_open() ) {
|
||||
G4ExceptionDescription ed;
|
||||
ed << "G4LivermorePolarizedRayleighModel data file <" << ostFF.str().c_str()
|
||||
<< "> is not opened!" << G4endl;
|
||||
G4Exception("G4LivermorePolarizedRayleighModel::ReadData()","em0003",
|
||||
FatalException,
|
||||
ed,"G4LEDATA version should be G4EMLOW6.27 or later.");
|
||||
return;
|
||||
} else {
|
||||
if(verboseLevel > 3) {
|
||||
G4cout << "File " << ostFF.str()
|
||||
<< " is opened by G4LivermoreRayleighModel" << G4endl;
|
||||
}
|
||||
formFactorData[Z]->Retrieve(finFF, true);
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4double G4LivermorePolarizedRayleighModel::ComputeCrossSectionPerAtom(
|
||||
G4double G4LivermorePolarizedRayleighModel::ComputeCrossSectionPerAtom(
|
||||
const G4ParticleDefinition*,
|
||||
G4double GammaEnergy,
|
||||
G4double Z, G4double,
|
||||
G4double, G4double)
|
||||
{
|
||||
if (verboseLevel > 1)
|
||||
{
|
||||
G4cout << "G4LivermoreRayleighModel::ComputeCrossSectionPerAtom()"
|
||||
<< G4endl;
|
||||
}
|
||||
{
|
||||
if (verboseLevel > 1) {
|
||||
G4cout << "G4LivermoreRayleighModel::ComputeCrossSectionPerAtom()"
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
if(GammaEnergy < lowEnergyLimit) { return 0.0; }
|
||||
if(GammaEnergy < lowEnergyLimit) { return 0.0; }
|
||||
|
||||
G4double xs = 0.0;
|
||||
G4double xs = 0.0;
|
||||
|
||||
G4int intZ = G4lrint(Z);
|
||||
if(intZ < 1 || intZ > maxZ) { return xs; }
|
||||
G4int intZ = G4lrint(Z);
|
||||
if(intZ < 1 || intZ > maxZ) { return xs; }
|
||||
|
||||
G4PhysicsFreeVector* pv = dataCS[intZ];
|
||||
G4PhysicsFreeVector* pv = dataCS[intZ];
|
||||
|
||||
// if element was not initialised
|
||||
// do initialisation safely for MT mode
|
||||
if(!pv) {
|
||||
InitialiseForElement(0, intZ);
|
||||
pv = dataCS[intZ];
|
||||
if(!pv) { return xs; }
|
||||
}
|
||||
// if element was not initialised
|
||||
// do initialisation safely for MT mode
|
||||
if(nullptr == pv) {
|
||||
InitialiseForElement(0, intZ);
|
||||
pv = dataCS[intZ];
|
||||
if(nullptr == pv) { return xs; }
|
||||
}
|
||||
|
||||
G4int n = pv->GetVectorLength() - 1;
|
||||
G4double e = GammaEnergy/MeV;
|
||||
if(e >= pv->Energy(n)) {
|
||||
xs = (*pv)[n]/(e*e);
|
||||
} else if(e >= pv->Energy(0)) {
|
||||
xs = pv->Value(e)/(e*e);
|
||||
}
|
||||
return xs;
|
||||
}
|
||||
G4int n = pv->GetVectorLength() - 1;
|
||||
G4double e = GammaEnergy/MeV;
|
||||
if(e >= pv->Energy(n)) {
|
||||
xs = (*pv)[n]/(e*e);
|
||||
} else if(e >= pv->Energy(0)) {
|
||||
xs = pv->Value(e)/(e*e);
|
||||
}
|
||||
return xs;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void G4LivermorePolarizedRayleighModel::SampleSecondaries(std::vector<G4DynamicParticle*>* /*fvect*/,
|
||||
const G4MaterialCutsCouple* couple,
|
||||
const G4DynamicParticle* aDynamicGamma,
|
||||
G4double,
|
||||
G4double)
|
||||
void G4LivermorePolarizedRayleighModel::SampleSecondaries(
|
||||
std::vector<G4DynamicParticle*>*,
|
||||
const G4MaterialCutsCouple* couple,
|
||||
const G4DynamicParticle* aDynamicGamma,
|
||||
G4double, G4double)
|
||||
{
|
||||
if (verboseLevel > 3)
|
||||
G4cout << "Calling SampleSecondaries() of G4LivermorePolarizedRayleighModel" << G4endl;
|
||||
@@ -265,10 +260,10 @@ void G4LivermorePolarizedRayleighModel::SampleSecondaries(std::vector<G4DynamicP
|
||||
|
||||
if (photonEnergy0 <= lowEnergyLimit)
|
||||
{
|
||||
fParticleChange->ProposeTrackStatus(fStopAndKill);
|
||||
fParticleChange->SetProposedKineticEnergy(0.);
|
||||
fParticleChange->ProposeLocalEnergyDeposit(photonEnergy0);
|
||||
return ;
|
||||
fParticleChange->ProposeTrackStatus(fStopAndKill);
|
||||
fParticleChange->SetProposedKineticEnergy(0.);
|
||||
fParticleChange->ProposeLocalEnergyDeposit(photonEnergy0);
|
||||
return;
|
||||
}
|
||||
|
||||
G4ParticleMomentum photonDirection0 = aDynamicGamma->GetMomentumDirection();
|
||||
@@ -276,11 +271,11 @@ void G4LivermorePolarizedRayleighModel::SampleSecondaries(std::vector<G4DynamicP
|
||||
// Select randomly one element in the current material
|
||||
const G4ParticleDefinition* particle = aDynamicGamma->GetDefinition();
|
||||
const G4Element* elm = SelectRandomAtom(couple,particle,photonEnergy0);
|
||||
G4int Z = (G4int)elm->GetZ();
|
||||
G4int Z = elm->GetZasInt();
|
||||
|
||||
G4double outcomingPhotonCosTheta = GenerateCosTheta(photonEnergy0, Z);
|
||||
G4double outcomingPhotonPhi = GeneratePhi(outcomingPhotonCosTheta);
|
||||
G4double beta=GeneratePolarizationAngle();
|
||||
G4double beta = GeneratePolarizationAngle();
|
||||
|
||||
// incomingPhoton reference frame:
|
||||
// z = versor parallel to the incomingPhotonDirection
|
||||
@@ -295,7 +290,8 @@ void G4LivermorePolarizedRayleighModel::SampleSecondaries(std::vector<G4DynamicP
|
||||
G4ThreeVector x(GetPhotonPolarization(*aDynamicGamma));
|
||||
G4ThreeVector y(z.cross(x));
|
||||
|
||||
// z' = std::cos(phi)*std::sin(theta) x + std::sin(phi)*std::sin(theta) y + std::cos(theta) z
|
||||
// z' = std::cos(phi)*std::sin(theta)
|
||||
// x + std::sin(phi)*std::sin(theta) y + std::cos(theta) z
|
||||
G4double xDir;
|
||||
G4double yDir;
|
||||
G4double zDir;
|
||||
@@ -309,18 +305,18 @@ void G4LivermorePolarizedRayleighModel::SampleSecondaries(std::vector<G4DynamicP
|
||||
G4ThreeVector xPrime(x.perpPart(zPrime).unit());
|
||||
G4ThreeVector yPrime(zPrime.cross(xPrime));
|
||||
|
||||
// outgoingPhotonPolarization is directed as x' std::cos(beta) + y' std::sin(beta)
|
||||
// outgoingPhotonPolarization is directed as
|
||||
// x' std::cos(beta) + y' std::sin(beta)
|
||||
G4ThreeVector outcomingPhotonPolarization(xPrime*std::cos(beta) + yPrime*std::sin(beta));
|
||||
|
||||
fParticleChange->ProposeMomentumDirection(zPrime);
|
||||
fParticleChange->ProposePolarization(outcomingPhotonPolarization);
|
||||
fParticleChange->SetProposedKineticEnergy(photonEnergy0);
|
||||
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4double G4LivermorePolarizedRayleighModel::GenerateCosTheta(G4double incomingPhotonEnergy, G4int zAtom) const
|
||||
G4double G4LivermorePolarizedRayleighModel::GenerateCosTheta(G4double incomingPhotonEnergy, G4int Z) const
|
||||
{
|
||||
// d sigma k0
|
||||
// --------- = r0^2 * pi * F^2(x, Z) * ( 2 - sin^2 theta) * std::sin (theta), x = ---- std::sin(theta/2)
|
||||
@@ -338,15 +334,16 @@ G4double G4LivermorePolarizedRayleighModel::GenerateCosTheta(G4double incomingPh
|
||||
// On pcgeant2 the time is ~ 1 s for k0 ~ 1 MeV on the oxygen element. A 100 GeV
|
||||
// event will take ~ 10 hours.
|
||||
//
|
||||
// On the avarage the inner loop does 1.5 iterations before exiting
|
||||
const G4double xFactor = (incomingPhotonEnergy*cm)/(h_Planck*c_light);
|
||||
// On the avarage the inner loop does 1.5 iterations before exiting
|
||||
const G4double xxfact = CLHEP::cm/(CLHEP::h_Planck*CLHEP::c_light);
|
||||
const G4double xFactor = incomingPhotonEnergy*xxfact;
|
||||
|
||||
G4double cosTheta;
|
||||
G4double fCosTheta;
|
||||
G4double x;
|
||||
G4double fValue;
|
||||
|
||||
if (incomingPhotonEnergy > 5.*MeV)
|
||||
if (incomingPhotonEnergy > 5.*CLHEP::MeV)
|
||||
{
|
||||
cosTheta = 1.;
|
||||
}
|
||||
@@ -364,12 +361,12 @@ G4double G4LivermorePolarizedRayleighModel::GenerateCosTheta(G4double incomingPh
|
||||
x = xFactor*std::sqrt((1.-cosTheta)/2.);
|
||||
|
||||
if (x > 1.e+005)
|
||||
fValue = formFactorData->FindValue(x, zAtom-1);
|
||||
fValue = formFactorData[Z]->Value(x);
|
||||
else
|
||||
fValue = formFactorData->FindValue(0., zAtom-1);
|
||||
fValue = formFactorData[Z]->Value(0.);
|
||||
|
||||
fValue/=zAtom;
|
||||
fValue*=fValue;
|
||||
fValue /= Z;
|
||||
fValue *= fValue;
|
||||
}
|
||||
while(fValue < G4UniformRand());
|
||||
}
|
||||
@@ -396,7 +393,7 @@ G4double G4LivermorePolarizedRayleighModel::GeneratePhi(G4double cosTheta) const
|
||||
|
||||
do
|
||||
{
|
||||
phi = twopi * G4UniformRand();
|
||||
phi = CLHEP::twopi * G4UniformRand();
|
||||
cosPhi = std::cos(phi);
|
||||
phiProbability= 1. - sin2Theta*cosPhi*cosPhi;
|
||||
}
|
||||
@@ -431,7 +428,7 @@ G4ThreeVector G4LivermorePolarizedRayleighModel::GetPhotonPolarization(const G4D
|
||||
G4ThreeVector e1(photonMomentumDirection.orthogonal().unit());
|
||||
G4ThreeVector e2(photonMomentumDirection.cross(e1).unit());
|
||||
|
||||
G4double angle(G4UniformRand() * twopi);
|
||||
G4double angle(G4UniformRand() * CLHEP::twopi);
|
||||
|
||||
e1*=std::cos(angle);
|
||||
e2*=std::sin(angle);
|
||||
@@ -450,10 +447,10 @@ G4ThreeVector G4LivermorePolarizedRayleighModel::GetPhotonPolarization(const G4D
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void G4LivermorePolarizedRayleighModel::InitialiseForElement(const G4ParticleDefinition*,
|
||||
G4int Z)
|
||||
{
|
||||
G4AutoLock l(&LivermorePolarizedRayleighModelMutex);
|
||||
if(!dataCS[Z]) { ReadData(Z); }
|
||||
l.unlock();
|
||||
}
|
||||
void G4LivermorePolarizedRayleighModel::InitialiseForElement(
|
||||
const G4ParticleDefinition*, G4int Z)
|
||||
{
|
||||
G4AutoLock l(&LivermorePolarizedRayleighModelMutex);
|
||||
if(nullptr == dataCS[Z]) { ReadData(Z); }
|
||||
l.unlock();
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "G4LivermoreRayleighModel.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4RayleighAngularGenerator.hh"
|
||||
#include "G4EmParameters.hh"
|
||||
#include "G4AutoLock.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
@@ -43,10 +44,10 @@ namespace { G4Mutex LivermoreRayleighModelMutex = G4MUTEX_INITIALIZER; }
|
||||
G4PhysicsFreeVector* G4LivermoreRayleighModel::dataCS[] = {nullptr};
|
||||
|
||||
G4LivermoreRayleighModel::G4LivermoreRayleighModel()
|
||||
:G4VEmModel("LivermoreRayleigh"),isInitialised(false)
|
||||
:G4VEmModel("LivermoreRayleigh"),maxZ(100),isInitialised(false)
|
||||
{
|
||||
fParticleChange = nullptr;
|
||||
lowEnergyLimit = 10 * eV;
|
||||
lowEnergyLimit = 10 * CLHEP::eV;
|
||||
|
||||
SetAngularDistribution(new G4RayleighAngularGenerator());
|
||||
|
||||
@@ -67,11 +68,14 @@ G4LivermoreRayleighModel::G4LivermoreRayleighModel()
|
||||
|
||||
G4LivermoreRayleighModel::~G4LivermoreRayleighModel()
|
||||
{
|
||||
if(IsMaster()) {
|
||||
for(G4int i=0; i<maxZ; ++i) {
|
||||
if(dataCS[i]) {
|
||||
delete dataCS[i];
|
||||
dataCS[i] = nullptr;
|
||||
if(IsMaster())
|
||||
{
|
||||
for(G4int i = 0; i <= maxZ; ++i)
|
||||
{
|
||||
if(dataCS[i])
|
||||
{
|
||||
delete dataCS[i];
|
||||
dataCS[i] = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -97,26 +101,17 @@ void G4LivermoreRayleighModel::Initialise(const G4ParticleDefinition* particle,
|
||||
|
||||
// Access to elements
|
||||
char* path = std::getenv("G4LEDATA");
|
||||
G4ProductionCutsTable* theCoupleTable =
|
||||
G4ProductionCutsTable::GetProductionCutsTable();
|
||||
G4int numOfCouples = theCoupleTable->GetTableSize();
|
||||
|
||||
for(G4int i=0; i<numOfCouples; ++i)
|
||||
const G4ElementTable* elemTable = G4Element::GetElementTable();
|
||||
size_t numElems = (*elemTable).size();
|
||||
for(size_t ie = 0; ie < numElems; ++ie)
|
||||
{
|
||||
const G4Element* elem = (*elemTable)[ie];
|
||||
const G4int Z = std::min(maxZ, elem->GetZasInt());
|
||||
if(dataCS[Z] == nullptr)
|
||||
{
|
||||
const G4MaterialCutsCouple* couple =
|
||||
theCoupleTable->GetMaterialCutsCouple(i);
|
||||
const G4Material* material = couple->GetMaterial();
|
||||
const G4ElementVector* theElementVector = material->GetElementVector();
|
||||
G4int nelm = material->GetNumberOfElements();
|
||||
|
||||
for (G4int j=0; j<nelm; ++j)
|
||||
{
|
||||
G4int Z = (*theElementVector)[j]->GetZasInt();
|
||||
if(Z < 1) { Z = 1; }
|
||||
else if(Z > maxZ) { Z = maxZ; }
|
||||
if( (!dataCS[Z]) ) { ReadData(Z, path); }
|
||||
}
|
||||
ReadData(Z, path);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(isInitialised) { return; }
|
||||
fParticleChange = GetParticleChangeForGamma();
|
||||
@@ -141,14 +136,14 @@ void G4LivermoreRayleighModel::ReadData(size_t Z, const char* path)
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
if(dataCS[Z]) { return; }
|
||||
if(nullptr != dataCS[Z]) { return; }
|
||||
|
||||
const char* datadir = path;
|
||||
|
||||
if(!datadir)
|
||||
if(datadir == nullptr)
|
||||
{
|
||||
datadir = std::getenv("G4LEDATA");
|
||||
if(!datadir)
|
||||
if(datadir == nullptr)
|
||||
{
|
||||
G4Exception("G4LivermoreRayleighModelModel::ReadData()","em0006",
|
||||
FatalException,
|
||||
@@ -159,7 +154,12 @@ void G4LivermoreRayleighModel::ReadData(size_t Z, const char* path)
|
||||
dataCS[Z] = new G4PhysicsFreeVector();
|
||||
|
||||
std::ostringstream ostCS;
|
||||
ostCS << datadir << "/livermore/rayl/re-cs-" << Z <<".dat";
|
||||
if(G4EmParameters::Instance()->LivermoreDataDir() == "livermore"){
|
||||
ostCS << datadir << "/livermore/rayl/re-cs-" << Z <<".dat";
|
||||
}else{
|
||||
ostCS << datadir << "/epics2017/rayl/re-cs-" << Z <<".dat";
|
||||
}
|
||||
|
||||
std::ifstream finCS(ostCS.str().c_str());
|
||||
|
||||
if( !finCS .is_open() )
|
||||
@@ -205,10 +205,10 @@ G4double G4LivermoreRayleighModel::ComputeCrossSectionPerAtom(
|
||||
|
||||
// if element was not initialised
|
||||
// do initialisation safely for MT mode
|
||||
if(!pv) {
|
||||
if(nullptr == pv) {
|
||||
InitialiseForElement(0, intZ);
|
||||
pv = dataCS[intZ];
|
||||
if(!pv) { return xs; }
|
||||
if(nullptr == pv) { return xs; }
|
||||
}
|
||||
|
||||
G4int n = pv->GetVectorLength() - 1;
|
||||
@@ -219,7 +219,7 @@ G4double G4LivermoreRayleighModel::ComputeCrossSectionPerAtom(
|
||||
xs = pv->Value(e)/(e*e);
|
||||
}
|
||||
|
||||
if(verboseLevel > 0)
|
||||
if(verboseLevel > 1)
|
||||
{
|
||||
G4cout << "****** DEBUG: tcs value for Z=" << Z << " at energy (MeV)="
|
||||
<< e << G4endl;
|
||||
@@ -268,7 +268,7 @@ G4LivermoreRayleighModel::InitialiseForElement(const G4ParticleDefinition*,
|
||||
G4int Z)
|
||||
{
|
||||
G4AutoLock l(&LivermoreRayleighModelMutex);
|
||||
if(!dataCS[Z]) { ReadData(Z); }
|
||||
if(nullptr == dataCS[Z]) { ReadData(Z); }
|
||||
l.unlock();
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "G4MicroElecElastic.hh"
|
||||
#include "G4DummyModel.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4LowEnergyEmProcessSubType.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -46,7 +47,7 @@ G4MicroElecElastic::G4MicroElecElastic(const G4String& processName,
|
||||
G4ProcessType type):G4VEmProcess (processName, type),
|
||||
isInitialised(false)
|
||||
{
|
||||
SetProcessSubType(51);
|
||||
SetProcessSubType(fLowEnergyElastic);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
#include "G4Proton.hh"
|
||||
#include "G4GenericIon.hh"
|
||||
#include "G4Alpha.hh"
|
||||
#include "G4LowEnergyEmProcessSubType.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -56,7 +57,7 @@ G4MicroElecInelastic::G4MicroElecInelastic(const G4String& processName,
|
||||
G4ProcessType type)
|
||||
: G4VEmProcess (processName, type), isInitialised(false)
|
||||
{
|
||||
SetProcessSubType(53);
|
||||
SetProcessSubType(fLowEnergyIonisation);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -373,9 +373,9 @@ void G4MicroElecInelasticModel_new::Initialise(const G4ParticleDefinition* parti
|
||||
eIncidentEnergyStorage[mat] = eTdummyVec;
|
||||
|
||||
//Cleanup support vectors
|
||||
delete eProbaShellMap;
|
||||
delete eDiffCrossSectionData;
|
||||
delete eNrjTransfData;
|
||||
// delete eProbaShellMap;
|
||||
// delete eDiffCrossSectionData;
|
||||
// delete eNrjTransfData;
|
||||
}
|
||||
|
||||
// *** PROTON
|
||||
@@ -476,10 +476,10 @@ void G4MicroElecInelasticModel_new::Initialise(const G4ParticleDefinition* parti
|
||||
pIncidentEnergyStorage[mat] = pTdummyVec;
|
||||
|
||||
//Cleanup support vectors
|
||||
delete pNrjTransfData;
|
||||
delete eVecm;
|
||||
delete pDiffCrossSectionData;
|
||||
delete pProbaShellMap;
|
||||
// delete pNrjTransfData;
|
||||
// delete eVecm;
|
||||
// delete pDiffCrossSectionData;
|
||||
// delete pProbaShellMap;
|
||||
}
|
||||
tableTCS[mat] = tableData;
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#include "G4MicroElecLOPhononScattering.hh"
|
||||
#include "G4DummyModel.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4LowEnergyEmProcessSubType.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -67,7 +68,7 @@ G4MicroElecLOPhononScattering::G4MicroElecLOPhononScattering(
|
||||
:G4VEmProcess(processName, type),
|
||||
isInitialised(false)
|
||||
{
|
||||
SetProcessSubType(51);
|
||||
SetProcessSubType(fLowEnergyElastic);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
#include "G4PhysicalConstants.hh"
|
||||
#include "G4EmProcessSubType.hh"
|
||||
#include "G4GeometryTolerance.hh"
|
||||
#include "G4EmProcessSubType.hh"
|
||||
|
||||
#include "G4SystemOfUnits.hh"
|
||||
|
||||
@@ -70,7 +71,7 @@ G4MicroElecSurface::G4MicroElecSurface(const G4String& processName,G4ProcessType
|
||||
}
|
||||
|
||||
isInitialised=false;
|
||||
SetProcessSubType(25);
|
||||
SetProcessSubType(fSurfaceReflection);
|
||||
|
||||
theStatus = UndefinedSurf;
|
||||
material1 = nullptr;
|
||||
|
||||
@@ -89,9 +89,10 @@ void G4PenelopeBremsstrahlungAngular::ClearTables()
|
||||
for (auto j=fLorentzTables1->begin(); j != fLorentzTables1->end(); ++j)
|
||||
{
|
||||
G4PhysicsTable* tab = j->second;
|
||||
//tab->clearAndDestroy();
|
||||
tab->clearAndDestroy();
|
||||
delete tab;
|
||||
}
|
||||
fLorentzTables1->clear();
|
||||
delete fLorentzTables1;
|
||||
fLorentzTables1 = nullptr;
|
||||
}
|
||||
@@ -101,8 +102,10 @@ void G4PenelopeBremsstrahlungAngular::ClearTables()
|
||||
for (auto j=fLorentzTables2->begin(); j != fLorentzTables2->end(); ++j)
|
||||
{
|
||||
G4PhysicsTable* tab = j->second;
|
||||
tab->clearAndDestroy();
|
||||
delete tab;
|
||||
}
|
||||
fLorentzTables2->clear();
|
||||
delete fLorentzTables2;
|
||||
fLorentzTables2 = nullptr;
|
||||
}
|
||||
@@ -214,8 +217,8 @@ void G4PenelopeBremsstrahlungAngular::PrepareTables(const G4Material* material,G
|
||||
//fill vectors
|
||||
for (k=0;k<fNumberofZPoints;k++)
|
||||
{
|
||||
QQ1vector->PutValue(k,pZ[k],G4Log(fQQ1[k][i][j]));
|
||||
QQ2vector->PutValue(k,pZ[k],fQQ2[k][i][j]);
|
||||
QQ1vector->PutValues(k,pZ[k],G4Log(fQQ1[k][i][j]));
|
||||
QQ2vector->PutValues(k,pZ[k],fQQ2[k][i][j]);
|
||||
}
|
||||
//Filled: now calculate derivatives
|
||||
QQ1vector->FillSecondDerivatives();
|
||||
@@ -254,8 +257,8 @@ void G4PenelopeBremsstrahlungAngular::PrepareTables(const G4Material* material,G
|
||||
|
||||
for (j=0;j<fNumberofKPoints;j++)
|
||||
{
|
||||
Q1vector->PutValue(j,pK[j],G4Log(Q1[i][j])); //logarithmic
|
||||
Q2vector->PutValue(j,pK[j],Q2[i][j]);
|
||||
Q1vector->PutValues(j,pK[j],G4Log(Q1[i][j])); //logarithmic
|
||||
Q2vector->PutValues(j,pK[j],Q2[i][j]);
|
||||
}
|
||||
|
||||
for (j=0;j<reducedEnergyGrid;j++)
|
||||
@@ -291,8 +294,8 @@ void G4PenelopeBremsstrahlungAngular::PrepareTables(const G4Material* material,G
|
||||
G4PhysicsFreeVector* thevec2 = (G4PhysicsFreeVector*) (*theTable2)[j];
|
||||
for (i=0;i<fNumberofEPoints;i++)
|
||||
{
|
||||
thevec->PutValue(i,betas[i],Q1E[i][j]);
|
||||
thevec2->PutValue(i,betas[i],Q2E[i][j]);
|
||||
thevec->PutValues(i,betas[i],Q1E[i][j]);
|
||||
thevec2->PutValues(i,betas[i],Q2E[i][j]);
|
||||
}
|
||||
//Vectors are filled: calculate derivatives
|
||||
thevec->FillSecondDerivatives();
|
||||
|
||||
@@ -102,10 +102,11 @@ void G4PenelopeBremsstrahlungFS::ClearTables(G4bool isMaster)
|
||||
{
|
||||
for (auto& item : (*fReducedXSTable))
|
||||
{
|
||||
//G4PhysicsTable* tab = item.second;
|
||||
//tab->clearAndDestroy();
|
||||
delete item.second;
|
||||
G4PhysicsTable* tab = item.second;
|
||||
tab->clearAndDestroy();
|
||||
delete tab;
|
||||
}
|
||||
fReducedXSTable->clear();
|
||||
delete fReducedXSTable;
|
||||
fReducedXSTable = nullptr;
|
||||
}
|
||||
@@ -114,10 +115,11 @@ void G4PenelopeBremsstrahlungFS::ClearTables(G4bool isMaster)
|
||||
{
|
||||
for (auto& item : (*fSamplingTable))
|
||||
{
|
||||
//G4PhysicsTable* tab = item.second;
|
||||
// tab->clearAndDestroy();
|
||||
delete item.second;
|
||||
G4PhysicsTable* tab = item.second;
|
||||
tab->clearAndDestroy();
|
||||
delete tab;
|
||||
}
|
||||
fSamplingTable->clear();
|
||||
delete fSamplingTable;
|
||||
fSamplingTable = nullptr;
|
||||
}
|
||||
@@ -335,7 +337,7 @@ void G4PenelopeBremsstrahlungFS::BuildScaledXSTable(const G4Material* material,
|
||||
G4double aValue = (*tempMatrix)[ie*fNBinsX+ix];
|
||||
if (aValue < 1e-20*millibarn) //protection against log(0)
|
||||
aValue = 1e-20*millibarn;
|
||||
theVec->PutValue(ie+1,logene,G4Log(aValue));
|
||||
theVec->PutValues(ie+1,logene,G4Log(aValue));
|
||||
}
|
||||
//Add fake point at 1 eV using an extrapolation with the derivative
|
||||
//at the first valid point (Penelope approach)
|
||||
@@ -343,7 +345,7 @@ void G4PenelopeBremsstrahlungFS::BuildScaledXSTable(const G4Material* material,
|
||||
G4double log1eV = G4Log(1*eV);
|
||||
G4double val1eV = (*theVec)[1]+derivative*(log1eV-theVec->Energy(1));
|
||||
//fake point at very low energy
|
||||
theVec->PutValue(0,log1eV,val1eV);
|
||||
theVec->PutValues(0,log1eV,val1eV);
|
||||
}
|
||||
std::pair<const G4Material*,G4double> theKey = std::make_pair(material,cut);
|
||||
fReducedXSTable->insert(std::make_pair(theKey,thePhysicsTable));
|
||||
@@ -555,7 +557,7 @@ void G4PenelopeBremsstrahlungFS::InitializeEnergySampling(const G4Material* mate
|
||||
(G4PhysicsFreeVector*) ((*thePhysicsTable)[ie]);
|
||||
//Fill the table
|
||||
G4double value = 0; //first value
|
||||
theVec->PutValue(0,theXGrid[0],value);
|
||||
theVec->PutValues(0,theXGrid[0],value);
|
||||
for (size_t ix=1;ix<fNBinsX;ix++)
|
||||
{
|
||||
//Here calculate the cumulative distribution
|
||||
@@ -573,7 +575,7 @@ void G4PenelopeBremsstrahlungFS::InitializeEnergySampling(const G4Material* mate
|
||||
G4double A = y1-B*x1;
|
||||
G4double dS = A*G4Log(x2/x1)+B*(x2-x1);
|
||||
value += dS;
|
||||
theVec->PutValue(ix,theXGrid[ix],value);
|
||||
theVec->PutValues(ix,theXGrid[ix],value);
|
||||
}
|
||||
//fill the PB vector
|
||||
G4double xc = cut/theEGrid[ie];
|
||||
@@ -587,7 +589,7 @@ void G4PenelopeBremsstrahlungFS::InitializeEnergySampling(const G4Material* mate
|
||||
G4double pbval = (xc<=1) ?
|
||||
GetMomentumIntegral(tempData,xc,-1) :
|
||||
GetMomentumIntegral(tempData,1.0,-1);
|
||||
thePBvec->PutValue(ie,theEGrid[ie],pbval);
|
||||
thePBvec->PutValues(ie,theEGrid[ie],pbval);
|
||||
delete[] tempData;
|
||||
}
|
||||
|
||||
@@ -671,13 +673,13 @@ G4double G4PenelopeBremsstrahlungFS::SampleGammaEnergy(G4double energy,const G4M
|
||||
{
|
||||
G4double val = (*theVec1)[iloop]+(((*theVec2)[iloop]-(*theVec1)[iloop]))*
|
||||
(energy-theEGrid[eBin])/(theEGrid[eBin+1]-theEGrid[eBin]);
|
||||
theTempVec->PutValue(iloop,theXGrid[iloop],val);
|
||||
theTempVec->PutValues(iloop,theXGrid[iloop],val);
|
||||
}
|
||||
}
|
||||
else //first or last bin, no interpolation
|
||||
{
|
||||
for (size_t iloop=0;iloop<fNBinsX;iloop++)
|
||||
theTempVec->PutValue(iloop,theXGrid[iloop],(*theVec1)[iloop]);
|
||||
theTempVec->PutValues(iloop,theXGrid[iloop],(*theVec1)[iloop]);
|
||||
}
|
||||
|
||||
//Start the game
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "G4PhysicsFreeVector.hh"
|
||||
#include "G4DataVector.hh"
|
||||
#include "G4Exp.hh"
|
||||
#include "G4Log.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...
|
||||
G4PenelopeCrossSection::G4PenelopeCrossSection(size_t nPointsE,size_t nShells) :
|
||||
@@ -101,22 +102,22 @@ G4PenelopeCrossSection::~G4PenelopeCrossSection()
|
||||
//clean up tables
|
||||
if (fShellCrossSections)
|
||||
{
|
||||
//fShellCrossSections->clearAndDestroy();
|
||||
fShellCrossSections->clearAndDestroy();
|
||||
delete fShellCrossSections;
|
||||
}
|
||||
if (fShellNormalizedCrossSections)
|
||||
{
|
||||
//fShellNormalizedCrossSections->clearAndDestroy();
|
||||
fShellNormalizedCrossSections->clearAndDestroy();
|
||||
delete fShellNormalizedCrossSections;
|
||||
}
|
||||
if (fSoftCrossSections)
|
||||
{
|
||||
//fSoftCrossSections->clearAndDestroy();
|
||||
fSoftCrossSections->clearAndDestroy();
|
||||
delete fSoftCrossSections;
|
||||
}
|
||||
if (fHardCrossSections)
|
||||
{
|
||||
//fHardCrossSections->clearAndDestroy();
|
||||
fHardCrossSections->clearAndDestroy();
|
||||
delete fHardCrossSections;
|
||||
}
|
||||
}
|
||||
@@ -150,32 +151,32 @@ void G4PenelopeCrossSection::AddCrossSectionPoint(size_t binNumber,G4double ener
|
||||
|
||||
//XS0
|
||||
G4double val = G4Log(std::max(XS0,1e-42*cm2)); //avoid log(0)
|
||||
theVector->PutValue(binNumber,logEne,val);
|
||||
theVector->PutValues(binNumber,logEne,val);
|
||||
|
||||
//XS1
|
||||
theVector = (G4PhysicsFreeVector*) (*fSoftCrossSections)[1];
|
||||
val = G4Log(std::max(XS1,1e-42*eV*cm2)); //avoid log(0)
|
||||
theVector->PutValue(binNumber,logEne,val);
|
||||
theVector->PutValues(binNumber,logEne,val);
|
||||
|
||||
//XS2
|
||||
theVector = (G4PhysicsFreeVector*) (*fSoftCrossSections)[2];
|
||||
val = G4Log(std::max(XS2,1e-42*eV*eV*cm2)); //avoid log(0)
|
||||
theVector->PutValue(binNumber,logEne,val);
|
||||
theVector->PutValues(binNumber,logEne,val);
|
||||
|
||||
//XH0
|
||||
theVector = (G4PhysicsFreeVector*) (*fHardCrossSections)[0];
|
||||
val = G4Log(std::max(XH0,1e-42*cm2)); //avoid log(0)
|
||||
theVector->PutValue(binNumber,logEne,val);
|
||||
theVector->PutValues(binNumber,logEne,val);
|
||||
|
||||
//XH1
|
||||
theVector = (G4PhysicsFreeVector*) (*fHardCrossSections)[1];
|
||||
val = G4Log(std::max(XH1,1e-42*eV*cm2)); //avoid log(0)
|
||||
theVector->PutValue(binNumber,logEne,val);
|
||||
theVector->PutValues(binNumber,logEne,val);
|
||||
|
||||
//XH2
|
||||
theVector = (G4PhysicsFreeVector*) (*fHardCrossSections)[2];
|
||||
val = G4Log(std::max(XH2,1e-42*eV*eV*cm2)); //avoid log(0)
|
||||
theVector->PutValue(binNumber,logEne,val);
|
||||
theVector->PutValues(binNumber,logEne,val);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -216,7 +217,7 @@ void G4PenelopeCrossSection::AddShellCrossSectionPoint(size_t binNumber,
|
||||
}
|
||||
G4double logEne = G4Log(energy);
|
||||
G4double val = G4Log(std::max(xs,1e-42*cm2)); //avoid log(0)
|
||||
theVector->PutValue(binNumber,logEne,val);
|
||||
theVector->PutValues(binNumber,logEne,val);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -447,7 +448,7 @@ void G4PenelopeCrossSection::NormalizeShellCrossSections()
|
||||
G4double previousValue = (*theFullVec)[i]; //log(XS)
|
||||
G4double logEnergy = theFullVec->GetLowEdgeEnergy(i);
|
||||
//log(XS/normFactor) = log(XS) - log(normFactor)
|
||||
theVec->PutValue(i,logEnergy,previousValue-logNormFactor);
|
||||
theVec->PutValues(i,logEnergy,previousValue-logNormFactor);
|
||||
}
|
||||
}
|
||||
fIsNormalized = true;
|
||||
|
||||
@@ -104,7 +104,7 @@ G4PenelopePhotoElectricModel::~G4PenelopePhotoElectricModel()
|
||||
for(G4int i=0; i<=fMaxZ; ++i)
|
||||
{
|
||||
if(fLogAtomicShellXS[i]) {
|
||||
//fLogAtomicShellXS[i]->clearAndDestroy();
|
||||
fLogAtomicShellXS[i]->clearAndDestroy();
|
||||
delete fLogAtomicShellXS[i];
|
||||
fLogAtomicShellXS[i] = nullptr;
|
||||
}
|
||||
|
||||
@@ -143,131 +143,129 @@ G4RayleighAngularGenerator::SampleDirection(const G4DynamicParticle* dp,
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
|
||||
|
||||
const G4double
|
||||
G4RayleighAngularGenerator::PP0[101] = { 0,
|
||||
0, 2., 5.21459, 10.2817, 3.66207, 3.63903, 3.71155, 36.5165, 3.43548, 3.40045, // 1-10
|
||||
2.87811, 3.35541, 3.21141, 2.95234, 3.02524, 126.146, 175.044, 162, 296.833, 300.994, // 11-20
|
||||
373.186, 397.823, 430.071, 483.293, 2.14885, 335.553, 505.422, 644.739, 737.017, 707.575, // 21-30
|
||||
3.8094, 505.957, 4.10347, 574.665, 15.5277, 10.0991, 4.95013, 16.3391, 6.20836, 3.52767, // 31-40
|
||||
2.7763, 2.19565, 12.2802, 965.741, 1011.09, 2.85583, 3.65673, 225.777, 1.95284, 15.775, // 41-50
|
||||
39.9006, 3.7927, 64.7339, 1323.91, 3.73723, 2404.54, 28.3408, 29.9869, 217.128, 71.7138, // 51-60
|
||||
255.42, 134.495, 3364.59, 425.326, 449.405, 184.046, 3109.04, 193.133, 3608.48, 152.967, // 61-70
|
||||
484.517, 422.591, 423.518, 393.404, 437.172, 432.356, 478.71, 455.097, 495.237, 417.8, // 71-80
|
||||
3367.95, 3281.71, 3612.56, 3368.73, 3407.46, 40.2866, 641.24, 826.44, 3579.13, 4916.44, // 81-90
|
||||
930.184, 887.945, 3490.96, 4058.6, 3068.1, 3898.32, 1398.34, 5285.18, 1, 872.368, // 91-100
|
||||
G4RayleighAngularGenerator::PP0[101] = {0,
|
||||
-2.477067493e-06, 3.308728278e+00, 5.214590000e+00, 1.018853220e+01, 3.668594783e+00, 1.540100708e+01, 3.709326016e+00, 3.694224007e+00, 3.545302543e+00, 3.487912341e+00, // 1-10
|
||||
3.407539119e+00, 3.387258718e+00, 3.230544865e+00, 3.013493175e+00, 2.572039815e+00, 1.792301548e+00, 1.701680300e+00, 1.601363893e+02, 2.968330000e+02, 3.065649816e+02, // 11-20
|
||||
3.731860000e+02, 4.201934230e+02, 4.612920338e+02, 4.861184287e+02, 3.101874240e+02, 3.351026594e+02, 6.367362521e+02, 3.888087526e+02, 7.588301541e+02, 8.158625388e+02, // 21-30
|
||||
4.773566612e+02, 5.084376201e+02, 5.413677298e+02, 5.744903249e+02, 3.743351693e+00, 1.009910000e+01, 6.816358014e+02, 7.187067112e+02, 7.580649444e+02, 4.414330698e+00, // 31-40
|
||||
2.972874756e+00, 2.740289935e+00, 2.507487315e+00, 9.657410000e+02, 1.011090000e+03, 2.130702941e+00, 6.533143308e+00, 1.037000000e+03, 2.288698564e+00, 4.244459075e+00, // 41-50
|
||||
6.127527681e+01, 3.792700000e+00, 4.798110886e+00, 1.312500008e+03, 1.889593891e+00, 2.404540000e+03, 3.352713210e+01, 3.721985093e+01, 1.800704938e+02, 1.752112119e+03, // 51-60
|
||||
1.194981340e+02, 2.167522747e+02, 3.364590000e+03, 6.311743615e+01, 2.506979318e+02, 8.928490874e+01, 2.021000018e+03, 1.288577408e+02, 3.286469325e+03, 1.437863346e+02, // 61-70
|
||||
1.431016078e+02, 1.359161828e+02, 3.670456078e+02, 3.934040000e+02, 3.175509489e+02, 3.262959885e+03, 3.021668154e+03, 3.252098480e+02, 3.477962301e+02, 3.363519614e+02, // 71-80
|
||||
3.340399767e+02, 3.011038509e+03, 3.485497941e+02, 3.657731951e+02, 3.251994160e+03, 3.987097887e+02, 3.891269496e+03, 4.223467334e+02, 4.009941534e+02, 1.380789588e+00, // 81-90
|
||||
2.791527615e+00, 3.755804160e+03, 4.863705847e+02, 5.464276392e+02, 7.089644571e+02, 7.445117785e+02, 2.037086948e+00, 1.065528514e+03, 1.133135197e+00, 3.269427358e+03 // 91-100
|
||||
};
|
||||
|
||||
const G4double
|
||||
G4RayleighAngularGenerator::PP1[101] = { 0,
|
||||
1., 2., 3.7724, 2.17924, 11.9967, 17.7772, 23.5265, 23.797, 39.9937, 46.7748, // 1-10
|
||||
60, 68.6446, 81.7887, 98, 112, 128, 96.7939, 162, 61.5575, 96.4218, // 11-20
|
||||
65.4084, 83.3079, 96.2889, 90.123, 312, 338, 181.943, 94.3868, 54.5084, 132.819, // 21-30
|
||||
480, 512, 544, 578, 597.472, 647.993, 682.009, 722, 754.885, 799.974, // 31-40
|
||||
840, 882, 924, 968, 1012, 1058, 1104, 1151.95, 1199.05, 1250, // 41-50
|
||||
1300, 1352, 1404, 1458, 1512, 729.852, 1596.66, 1682, 1740, 1800, // 51-60
|
||||
1605.79, 1787.51, 603.151, 2048, 2112, 1993.95, 334.907, 2312, 885.149, 2337.19, // 61-70
|
||||
2036.48, 2169.41, 2241.49, 2344.6, 2812, 2888, 2964, 2918.04, 2882.97, 2938.74, // 71-80
|
||||
2716.13, 511.66, 581.475, 594.305, 672.232, 3657.71, 3143.76, 3045.56, 3666.7, 1597.84, // 81-90
|
||||
3428.87, 3681.22, 1143.31, 1647.17, 1444.9, 1894.33, 3309.12, 2338.59, 4900, 4856.61, // 91-100
|
||||
G4RayleighAngularGenerator::PP1[101] = {0,
|
||||
1.000002477e+00, 6.912717221e-01, 3.772400000e+00, 3.673669324e+00, 1.199955472e+01, 3.658311128e+00, 2.130780048e+01, 2.833297837e+01, 3.748184285e+01, 4.656971845e+01, // 1-10
|
||||
5.759246095e+01, 6.861274506e+01, 8.376139862e+01, 9.799999987e+01, 1.104279602e+02, 1.279999999e+02, 1.439999998e+02, 1.620000000e+02, 6.155750000e+01, 9.069690514e+01, // 11-20
|
||||
6.540840000e+01, 6.120116992e+01, 6.540487635e+01, 8.701154587e+01, 3.120000000e+02, 3.380000000e+02, 8.971041364e+01, 3.920000000e+02, 7.927032750e+01, 8.129623999e+01, // 21-30
|
||||
4.800000000e+02, 5.120000000e+02, 5.440000000e+02, 5.780000000e+02, 6.119999952e+02, 6.479930000e+02, 6.839999993e+02, 7.219999975e+02, 7.600000000e+02, 7.999965590e+02, // 31-40
|
||||
8.399999990e+02, 8.819999639e+02, 9.239993520e+02, 9.680000000e+02, 1.012000000e+03, 1.055869297e+03, 1.102904035e+03, 1.150000007e+02, 1.199999994e+03, 1.249999690e+03, // 41-50
|
||||
1.300000000e+03, 1.352000000e+03, 1.400242211e+03, 1.455000001e+02, 1.511110411e+03, 7.298520000e+02, 1.624000000e+03, 1.644780150e+03, 1.739999988e+03, 1.800000000e+03, // 51-60
|
||||
1.859999972e+03, 1.705247726e+03, 6.031510000e+02, 2.047999979e+03, 2.099526330e+03, 2.088715091e+03, 2.240000003e+02, 2.183146437e+03, 2.380000102e+02, 2.449999497e+03, // 61-70
|
||||
2.519999640e+03, 2.591999669e+03, 2.317935577e+03, 2.344600000e+03, 2.811999969e+03, 2.378704485e+03, 2.614304773e+03, 3.041994341e+03, 3.065168794e+03, 3.092144649e+03, // 71-80
|
||||
3.279999955e+03, 3.362000000e+03, 3.443996426e+03, 3.190843165e+03, 3.610058546e+02, 3.299292785e+03, 3.283959104e+03, 3.507767814e+03, 3.729069400e+03, 4.049999721e+03, // 81-90
|
||||
4.139900637e+03, 4.761958553e+02, 3.838629680e+03, 3.871572368e+03, 4.511999370e+03, 3.863489473e+03, 4.703865705e+03, 4.801999723e+03, 4.899867488e+03, 4.999989627e+03 // 91-100
|
||||
};
|
||||
|
||||
const G4double
|
||||
G4RayleighAngularGenerator::PP2[101] = { 0,
|
||||
0, 0, 0.0130091, 3.53906, 9.34125, 14.5838, 21.7619, 3.68644, 37.5709, 49.8248, // 1-10
|
||||
58.1219, 72, 83.9999, 95.0477, 109.975, 1.85351, 17.1623, 0, 2.60927, 2.58422, // 11-20
|
||||
2.4053, 2.86948, 2.63999, 2.58417, 310.851, 2.44683, 41.6348, 44.8739, 49.4746, 59.6053, // 21-30
|
||||
477.191, 6.04261, 540.897, 3.33531, 612, 637.908, 682.041, 705.661, 759.906, 796.498, // 31-40
|
||||
838.224, 879.804, 912.72, 2.25892, 1.90993, 1055.14, 1101.34, 926.275, 1200, 1234.23, // 41-50
|
||||
1261.1, 1348.21, 1340.27, 134.085, 1509.26, 1.60851, 1624, 1652.01, 1523.87, 1728.29, // 51-60
|
||||
1859.79, 1922, 1.25916, 1622.67, 1663.6, 2178, 1045.05, 2118.87, 267.371, 2409.84, // 61-70
|
||||
2520, 2592, 2664, 2738, 2375.83, 2455.64, 2486.29, 2710.86, 2862.79, 3043.46, // 71-80
|
||||
476.925, 2930.63, 2694.96, 3092.96, 3145.31, 3698, 3784, 3872, 675.166, 1585.71, // 81-90
|
||||
3921.95, 3894.83, 4014.73, 3130.23, 4512, 3423.35, 4701.53, 1980.23, 4900, 4271.02, // 91-100
|
||||
G4RayleighAngularGenerator::PP2[101] = {0,
|
||||
0.000000000e+00, 0.000000000e+00, 1.300910000e-02, 2.137798478e+00, 9.331850497e+00, 1.694068179e+01, 2.398287351e+01, 3.197279763e+01, 3.997285461e+01, 4.994236921e+01, // 1-10
|
||||
5.999999993e+01, 7.199999622e+01, 8.200805651e+01, 9.498650695e+01, 1.120000000e+02, 1.262076986e+02, 1.432983199e+02, 1.863610653e+00, 2.609270000e+00, 2.738113251e+00, // 11-20
|
||||
2.405300000e+00, 2.605407111e+00, 2.303089878e+00, 2.870025399e+00, 2.812575977e+00, 2.897340596e+00, 2.553334297e+00, 3.191247422e+00, 2.899518400e+00, 2.841221189e+00, // 21-30
|
||||
3.643338776e+00, 3.562379948e+00, 3.632270214e+00, 3.509675162e+00, 6.092566531e+02, 6.379080000e+02, 3.364199322e+00, 3.293291322e+00, 2.935055634e+00, 7.955891103e+02, // 31-40
|
||||
8.380271263e+02, 8.792597462e+02, 9.224931607e+02, 2.258920000e+00, 1.909930000e+00, 1.058000000e+03, 1.099562822e+03, 1.151999999e+03, 1.198711308e+03, 1.245755851e+03, // 41-50
|
||||
1.239724724e+03, 1.348210000e+03, 1.403959678e+03, 1.457999992e+03, 1.511999996e+03, 1.608510000e+00, 1.591472868e+03, 1.681999999e+03, 1.560929519e+03, 4.788788135e+01, // 51-60
|
||||
1.741501894e+03, 1.922000000e+03, 1.259160000e+00, 1.984882585e+03, 1.874775739e+03, 2.178000000e+03, 2.243999981e+03, 2.311995822e+03, 1.236530665e+03, 2.306214168e+03, // 61-70
|
||||
2.377898752e+03, 2.456084148e+03, 2.644018816e+03, 2.738000000e+03, 2.495449082e+03, 1.343356300e+02, 2.930270735e+02, 2.716795811e+03, 2.828034975e+03, 2.971503390e+03, // 71-80
|
||||
2.946960068e+03, 3.509614912e+02, 3.096453780e+03, 3.499383640e+03, 3.611999985e+03, 3.697997426e+03, 3.937713997e+02, 3.813885452e+03, 3.790936446e+03, 4.048619490e+03, // 81-90
|
||||
4.138307836e+03, 4.231999985e+03, 4.323999735e+03, 4.417999993e+03, 3.804036173e+03, 4.607998748e+03, 4.703097208e+03, 3.736471763e+03, 4.899999376e+03, 1.730583016e+03 // 91-100
|
||||
};
|
||||
|
||||
const G4double
|
||||
G4RayleighAngularGenerator::PP3[101] = { 0,
|
||||
1.53728e-16, 2.95909e-16, 1.95042e-15, 6.24521e-16, 4.69459e-17, 3.1394e-17, 2.38808e-17, 3.59428e-16, 1.2947e-17, 1.01182e-17, // 1-10
|
||||
6.99543e-18, 6.5138e-18, 5.24063e-18, 4.12831e-18, 4.22067e-18, 2.12802e-16, 3.27035e-16, 2.27705e-16, 1.86943e-15, 8.10577e-16, // 11-20
|
||||
1.80541e-15, 9.32266e-16, 5.93459e-16, 4.93049e-16, 5.03211e-19, 2.38223e-16, 4.5181e-16, 5.34468e-16, 5.16504e-16, 3.0641e-16, // 21-30
|
||||
1.24646e-18, 2.13805e-16, 1.21448e-18, 2.02122e-16, 5.91556e-18, 3.4609e-18, 1.39331e-18, 5.47242e-18, 1.71017e-18, 7.92438e-19, // 31-40
|
||||
4.72225e-19, 2.74825e-19, 4.02137e-18, 1.6662e-16, 1.68841e-16, 4.73202e-19, 7.28319e-19, 3.64382e-15, 1.53323e-19, 4.15409e-18, // 41-50
|
||||
7.91645e-18, 6.54036e-19, 1.04123e-17, 9.116e-17, 5.97268e-19, 1.23272e-15, 5.83259e-18, 5.42458e-18, 2.20137e-17, 1.19654e-17, // 51-60
|
||||
2.3481e-17, 1.53337e-17, 8.38225e-16, 3.40248e-17, 3.50901e-17, 1.95115e-17, 2.91803e-16, 1.98684e-17, 3.59425e-16, 1.54e-17, // 61-70
|
||||
3.04174e-17, 2.71295e-17, 2.6803e-17, 2.36469e-17, 2.56818e-17, 2.50364e-17, 2.6818e-17, 2.56229e-17, 2.7419e-17, 2.27442e-17, // 71-80
|
||||
1.38078e-15, 1.49595e-15, 1.20023e-16, 1.74446e-15, 1.82836e-15, 5.80108e-18, 3.02324e-17, 3.71029e-17, 1.01058e-16, 4.87707e-16, // 81-90
|
||||
4.18953e-17, 4.03182e-17, 1.11553e-16, 9.51125e-16, 2.57569e-15, 1.14294e-15, 2.98597e-15, 5.88714e-16, 1.46196e-20, 1.53226e-15, // 91-100
|
||||
G4RayleighAngularGenerator::PP3[101] = {0,
|
||||
1.325913011e-16, 4.871957764e-16, 1.950420000e-15, 3.995936773e-16, 4.732524874e-17, 5.469297930e-16, 2.375713373e-17, 1.810463731e-17, 1.336380641e-17, 1.052686533e-17, // 1-10
|
||||
8.030444002e-18, 6.678303405e-18, 5.358234684e-18, 4.335725896e-18, 3.306051079e-18, 1.819679449e-18, 1.228045928e-18, 2.430163362e-16, 1.869430000e-15, 9.951691390e-16, // 11-20
|
||||
1.805410000e-15, 1.568852030e-15, 1.464264654e-15, 4.939313750e-16, 2.361373681e-16, 2.319629775e-16, 4.429138015e-16, 2.283559073e-16, 3.210934122e-16, 2.876037822e-16, // 21-30
|
||||
2.121922892e-16, 2.064234936e-16, 1.996479886e-16, 1.946742248e-16, 8.778017543e-19, 3.460900000e-18, 1.809840754e-16, 1.783125511e-16, 1.722338339e-16, 9.822789565e-19, // 31-40
|
||||
4.605105770e-19, 3.816125471e-19, 3.017537476e-19, 1.666200000e-16, 1.688410000e-16, 1.839402998e-19, 1.246431543e-18, 9.807308372e-17, 1.932399654e-19, 6.865448303e-19, // 41-50
|
||||
9.418934098e-18, 6.540360000e-19, 6.723352605e-19, 1.147797684e-16, 7.975389174e-20, 1.232720000e-15, 5.621737854e-18, 6.015501574e-18, 1.770592320e-17, 1.646956996e-16, // 51-60
|
||||
1.285032193e-17, 1.897941915e-17, 8.382250000e-16, 8.047052107e-18, 1.953322654e-17, 1.048054550e-17, 1.547617945e-15, 1.315449339e-17, 2.966877317e-16, 1.381146328e-17, // 61-70
|
||||
1.351358940e-17, 1.262062535e-17, 2.238342977e-17, 2.364690000e-17, 1.901461934e-17, 2.019852016e-16, 1.258732966e-16, 1.866062124e-17, 1.933265996e-17, 1.869942002e-17, // 71-80
|
||||
1.842791671e-17, 1.006061314e-16, 1.845331171e-17, 1.903270841e-17, 9.716982760e-17, 2.023698895e-17, 1.689153339e-15, 2.047894466e-17, 1.932138801e-17, 1.971060876e-20, // 81-90
|
||||
1.861376691e-19, 8.994366946e-17, 2.168855529e-17, 2.359136120e-17, 2.975661335e-17, 3.035334920e-17, 1.119247839e-19, 4.012940590e-17, 1.467159462e-20, 9.769616225e-17 // 91-100
|
||||
};
|
||||
|
||||
const G4double
|
||||
G4RayleighAngularGenerator::PP4[101] = { 0,
|
||||
1.10561e-15, 3.50254e-16, 1.56836e-16, 7.86286e-15, 2.2706e-16, 7.28454e-16, 4.54123e-16, 8.03792e-17, 4.91833e-16, 1.45891e-16, // 1-10
|
||||
1.71829e-16, 3.90707e-15, 2.76487e-15, 4.345e-16, 6.80131e-16, 4.04186e-16, 8.95703e-17, 3.32136e-16, 1.3847e-17, 4.16869e-17, // 11-20
|
||||
1.37963e-17, 1.96187e-17, 2.93852e-17, 2.46581e-17, 4.49944e-16, 3.80311e-16, 1.62925e-15, 7.52449e-16, 9.45445e-16, 5.47652e-16, // 21-30
|
||||
6.89379e-16, 1.37078e-15, 1.22209e-15, 1.13856e-15, 9.06914e-16, 8.77868e-16, 9.70871e-16, 1.8532e-16, 1.69254e-16, 1.14059e-15, // 31-40
|
||||
7.90712e-16, 5.36611e-16, 8.27932e-16, 2.4329e-16, 5.82899e-16, 1.97595e-16, 1.96263e-16, 1.73961e-16, 1.62174e-16, 5.31143e-16, // 41-50
|
||||
5.29731e-16, 4.1976e-16, 4.91842e-16, 4.67937e-16, 4.32264e-16, 6.91046e-17, 1.62962e-16, 9.87241e-16, 1.04526e-15, 1.05819e-15, // 51-60
|
||||
1.10579e-16, 1.49116e-16, 4.61021e-17, 1.5143e-16, 1.53667e-16, 1.67844e-15, 2.7494e-17, 2.31253e-16, 2.27211e-15, 1.33401e-15, // 61-70
|
||||
9.02548e-16, 1.77743e-15, 1.76608e-15, 9.45054e-16, 1.06805e-16, 1.06085e-16, 1.01688e-16, 1.0226e-16, 7.7793e-16, 8.0166e-16, // 71-80
|
||||
9.18595e-17, 2.73428e-17, 3.01222e-17, 3.09814e-17, 3.39028e-17, 1.49653e-15, 1.19511e-15, 1.40408e-15, 2.37226e-15, 8.35973e-17, // 81-90
|
||||
1.4089e-15, 1.2819e-15, 4.96925e-17, 6.04886e-17, 7.39507e-17, 6.6832e-17, 1.09433e-16, 9.61804e-17, 1.38525e-16, 2.49104e-16, // 91-100
|
||||
G4RayleighAngularGenerator::PP4[101] = {0,
|
||||
1.105926652e-15, 2.260014406e-16, 1.568360000e-16, 7.604704395e-17, 2.874727277e-16, 3.180531750e-17, 3.632331994e-16, 2.720099679e-16, 1.197719851e-16, 1.079438057e-16, // 1-10
|
||||
2.381852183e-15, 3.734413372e-15, 8.391867563e-17, 4.824902206e-16, 1.501401964e-16, 3.852331215e-16, 3.990595815e-16, 3.293279270e-16, 1.384700000e-17, 3.625981107e-17, // 11-20
|
||||
1.379630000e-17, 9.139141296e-18, 1.872408780e-17, 2.203851185e-17, 2.682848134e-16, 2.769206296e-16, 2.418950951e-17, 2.841108885e-16, 1.400094487e-17, 1.387082935e-17, // 21-30
|
||||
5.210034592e-16, 7.614492538e-16, 8.948178869e-16, 9.788323391e-16, 8.671211693e-16, 8.778680000e-16, 1.077256234e-15, 1.679640775e-15, 1.420854572e-15, 7.623342657e-16, // 31-40
|
||||
6.465293663e-16, 3.854995461e-16, 4.894995857e-16, 2.432900000e-16, 5.828990000e-16, 1.609458606e-16, 2.173584371e-16, 1.795526101e-17, 9.530729189e-16, 2.344176851e-16, // 41-50
|
||||
3.105865310e-16, 4.197600000e-16, 1.326321431e-16, 1.773261410e-17, 1.494954852e-16, 6.910460000e-17, 9.139538226e-16, 1.600844678e-16, 7.627976232e-16, 6.798418289e-16, // 51-60
|
||||
7.097022036e-16, 1.115122840e-16, 4.610210000e-17, 7.337639645e-16, 3.348557496e-16, 1.736562533e-16, 1.915871639e-17, 1.931338908e-16, 1.974415886e-17, 2.054336404e-16, // 61-70
|
||||
2.003109343e-16, 1.934498511e-16, 1.319008056e-15, 9.450540000e-16, 1.087303394e-16, 1.665148262e-15, 1.202328448e-15, 1.128331221e-15, 8.531572269e-16, 7.408838005e-16, // 71-80
|
||||
1.158662950e-15, 1.374180788e-15, 8.566677765e-16, 9.492940536e-17, 1.870350513e-17, 9.491622217e-17, 8.928257029e-17, 9.336061303e-17, 9.334736660e-17, 4.790157134e-16, // 81-90
|
||||
1.305399034e-16, 2.169990868e-17, 8.372799536e-17, 8.658930267e-17, 8.911500996e-16, 8.860103256e-17, 4.406306122e-16, 6.993638266e-16, 1.349886337e-16, 3.034949291e-16 // 91-100
|
||||
};
|
||||
|
||||
const G4double
|
||||
G4RayleighAngularGenerator::PP5[101] = { 0,
|
||||
6.89413e-17, 2.11456e-17, 2.47782e-17, 7.01557e-17, 1.01544e-15, 1.76177e-16, 1.28191e-16, 1.80511e-17, 1.96803e-16, 3.16753e-16, // 1-10
|
||||
1.21362e-15, 6.6366e-17, 8.42625e-17, 1.01935e-16, 1.34162e-16, 1.87076e-18, 2.76259e-17, 1.2217e-16, 1.66059e-18, 1.76249e-18, // 11-20
|
||||
1.13734e-18, 1.58963e-18, 1.33987e-18, 1.18496e-18, 2.44536e-16, 6.69957e-19, 2.5667e-17, 2.62482e-17, 2.55816e-17, 2.6574e-17, // 21-30
|
||||
2.26522e-16, 2.17703e-18, 2.07434e-16, 8.8717e-19, 1.75583e-16, 1.81312e-16, 1.83716e-16, 2.58371e-15, 1.74416e-15, 1.7473e-16, // 31-40
|
||||
1.76817e-16, 1.74757e-16, 1.6739e-16, 2.68691e-19, 1.8138e-19, 1.60726e-16, 1.59441e-16, 1.36927e-16, 2.70127e-16, 1.63371e-16, // 41-50
|
||||
1.29776e-16, 1.49012e-16, 1.17301e-16, 1.67919e-17, 1.47596e-16, 1.14246e-19, 1.10392e-15, 1.58755e-16, 1.11706e-16, 1.80135e-16, // 51-60
|
||||
1.00213e-15, 9.44133e-16, 4.722e-20, 1.18997e-15, 1.16311e-15, 2.31716e-16, 1.86238e-15, 1.53632e-15, 2.45853e-17, 2.08069e-16, // 61-70
|
||||
1.08659e-16, 1.29019e-16, 1.24987e-16, 1.07865e-16, 1.03501e-15, 1.05211e-15, 9.38473e-16, 8.66912e-16, 9.3778e-17, 9.91467e-17, // 71-80
|
||||
2.58481e-17, 9.72329e-17, 9.77921e-16, 1.02928e-16, 1.01767e-16, 1.81276e-16, 1.07026e-16, 1.11273e-16, 3.25695e-17, 1.77629e-15, // 81-90
|
||||
1.18382e-16, 1.111e-16, 1.56996e-15, 8.45221e-17, 3.6783e-16, 1.20652e-16, 3.91104e-16, 3.52282e-15, 4.29979e-16, 1.28308e-16, // 91-100
|
||||
G4RayleighAngularGenerator::PP5[101] ={0,
|
||||
6.894128600e-17, 2.232031723e-17, 2.477820000e-17, 2.177967522e-15, 1.284829196e-15, 1.823111356e-16, 1.555489343e-16, 1.335924448e-16, 2.114259423e-16, 1.667587557e-16, // 1-10
|
||||
5.490626359e-17, 6.721220587e-17, 2.797861959e-15, 1.006989227e-16, 4.970209967e-16, 2.167639187e-16, 2.319436556e-16, 1.141095767e-18, 1.660590000e-18, 1.909325187e-18, // 11-20
|
||||
1.137340000e-18, 1.172666277e-18, 9.208052526e-19, 1.423664003e-18, 9.502898022e-19, 9.157542056e-19, 1.055368898e-18, 9.370568491e-19, 1.041778157e-18, 9.638088116e-19, // 21-30
|
||||
1.000486545e-18, 8.890635605e-19, 8.866911360e-19, 8.345076503e-19, 1.886536486e-16, 1.813120000e-16, 6.659892285e-19, 6.086335346e-19, 4.868786350e-19, 1.636754844e-16, // 31-40
|
||||
1.673069643e-16, 1.638573610e-16, 1.618391268e-16, 2.686910000e-19, 1.813800000e-19, 2.102345989e-16, 1.318039263e-16, 2.077093130e-16, 1.588911975e-16, 1.515458297e-16, // 41-50
|
||||
1.080904532e-16, 1.490120000e-16, 2.463071192e-16, 5.939133658e-16, 3.046264790e-16, 1.142460000e-19, 1.562245161e-16, 9.001027117e-16, 1.078667444e-16, 7.294347496e-18, // 51-60
|
||||
1.358154769e-16, 8.509795172e-16, 4.722000000e-20, 1.653557513e-16, 9.741638336e-17, 8.121141361e-16, 2.060180430e-16, 1.293242400e-15, 2.817685189e-15, 1.295140057e-15, // 61-70
|
||||
1.325219469e-15, 1.361391001e-15, 1.166226381e-16, 1.078650000e-16, 8.154952090e-16, 1.184682586e-17, 1.781757642e-17, 1.042830884e-16, 9.653409394e-17, 9.620084329e-17, // 71-80
|
||||
9.927188930e-17, 1.933919795e-17, 8.642866554e-17, 1.300494398e-15, 1.573438944e-15, 1.595960704e-15, 1.963662451e-17, 1.824165751e-15, 1.536213562e-15, 1.230473199e-16, // 81-90
|
||||
4.609653396e-16, 1.503608663e-15, 9.130139990e-16, 8.950731342e-16, 8.843355368e-17, 9.314765075e-16, 1.311786759e-16, 9.206849025e-17, 3.169463543e-16, 2.154753688e-15 // 91-100
|
||||
};
|
||||
|
||||
const G4double
|
||||
G4RayleighAngularGenerator::PP6[101] = { 0,
|
||||
6.57834, 3.91446, 7.59547, 10.707, 3.97317, 4.00593, 3.93206, 8.10644, 3.97743, 4.04641, // 1-10
|
||||
4.30202, 4.19399, 4.27399, 4.4169, 4.04829, 2.21745, 11.3523, 1.84976, 1.61905, 3.68297, // 11-20
|
||||
1.5704, 2.58852, 3.59827, 3.61633, 9.07174, 1.76738, 1.97272, 1.91032, 1.9838, 2.64286, // 21-30
|
||||
4.16296, 1.80149, 3.94257, 1.72731, 2.27523, 2.57383, 3.33453, 2.2361, 2.94376, 3.91332, // 31-40
|
||||
5.01832, 6.8016, 2.19508, 1.65926, 1.63781, 4.23097, 3.4399, 2.55583, 7.96814, 2.06573, // 41-50
|
||||
1.84175, 3.23516, 1.79129, 2.90259, 3.18266, 1.51305, 1.88361, 1.91925, 1.68033, 1.72078, // 51-60
|
||||
1.66246, 1.66676, 1.49394, 1.58924, 1.57558, 1.63307, 1.84447, 1.60296, 1.56719, 1.62166, // 61-70
|
||||
1.5753, 1.57329, 1.558, 1.57567, 1.55612, 1.54607, 1.53251, 1.51928, 1.50265, 1.52445, // 71-80
|
||||
1.4929, 1.51098, 2.52959, 1.42334, 1.41292, 2.0125, 1.45015, 1.43067, 2.6026, 1.39261, // 81-90
|
||||
1.38559, 1.37575, 2.53155, 2.51924, 1.32386, 2.31791, 2.47722, 1.33584, 9.60979, 6.84949, // 91-100
|
||||
G4RayleighAngularGenerator::PP6[101] = {0,
|
||||
5.245179284e+00, 3.941069622e+00, 7.595470000e+00, 1.556100268e+01, 3.958715820e+00, 1.006439332e+01, 3.947506567e+00, 3.911947451e+00, 3.960123395e+00, 3.995405309e+00, // 1-10
|
||||
4.165369684e+00, 4.154784462e+00, 4.243106173e+00, 4.326072224e+00, 4.520737868e+00, 5.804915543e+00, 7.148125826e+00, 1.979899376e+00, 1.619050000e+00, 3.020461557e+00, // 11-20
|
||||
1.570400000e+00, 1.595930653e+00, 1.592295792e+00, 3.539697537e+00, 1.823123604e+00, 1.823008934e+00, 3.108054801e+00, 1.802053625e+00, 3.315832610e+00, 3.438022820e+00, // 21-30
|
||||
1.788357076e+00, 1.779735777e+00, 1.782694477e+00, 1.778454849e+00, 4.288820945e+00, 2.573830000e+00, 1.754405892e+00, 1.749703489e+00, 1.739317589e+00, 3.536923800e+00, // 31-40
|
||||
4.992480078e+00, 5.353762609e+00, 5.983872882e+00, 1.659260000e+00, 1.637810000e+00, 7.594207497e+00, 2.760872072e+00, 2.996427458e+00, 6.765238189e+00, 3.358446915e+00, // 41-50
|
||||
1.895332668e+00, 3.235160000e+00, 3.117412878e+00, 2.561242590e+00, 1.080139229e+01, 1.513050000e+00, 1.944567866e+00, 1.922906186e+00, 1.732857547e+00, 1.666739664e+00, // 51-60
|
||||
1.735584396e+00, 1.700970330e+00, 1.493940000e+00, 1.789491004e+00, 1.668966729e+00, 1.722315051e+00, 1.564155879e+00, 1.679770510e+00, 1.660734791e+00, 1.650941092e+00, // 61-70
|
||||
1.646594633e+00, 1.646361209e+00, 1.596899505e+00, 1.575670000e+00, 1.595800331e+00, 1.598706510e+00, 2.267574396e+00, 1.571022960e+00, 1.556511213e+00, 1.547150547e+00, // 71-80
|
||||
1.539905529e+00, 2.445886590e+00, 1.521666588e+00, 1.514607927e+00, 2.418992922e+00, 1.489341220e+00, 1.445770175e+00, 1.477753418e+00, 1.473313627e+00, 1.034799940e+01, // 81-90
|
||||
2.720221569e+00, 2.423181552e+00, 1.433800031e+00, 1.424989075e+00, 1.398959178e+00, 1.397503726e+00, 2.862849596e+00, 1.377034589e+00, 9.782799214e+00, 1.348300032e+00 // 91-100
|
||||
};
|
||||
|
||||
const G4double
|
||||
G4RayleighAngularGenerator::PP7[101] = { 0,
|
||||
3.99983, 6.63093, 3.85593, 1.69342, 14.7911, 7.03995, 8.89527, 13.1929, 4.93354, 5.59461, // 1-10
|
||||
3.98033, 1.74578, 2.67629, 14.184, 8.88775, 13.1809, 4.51627, 13.7677, 9.53727, 4.04257, // 11-20
|
||||
7.88725, 5.78566, 4.08148, 4.18194, 7.96292, 8.38322, 3.31429, 13.106, 13.0857, 13.1053, // 21-30
|
||||
3.54708, 2.08567, 2.38131, 2.58162, 3.199, 3.20493, 3.19799, 1.88697, 1.80323, 3.15596, // 31-40
|
||||
4.10675, 5.68928, 3.93024, 11.2607, 4.86595, 12.1708, 12.2867, 9.29496, 1.61249, 5.0998, // 41-50
|
||||
5.25068, 6.67673, 5.82498, 6.12968, 6.94532, 1.71622, 1.63028, 3.34945, 2.84671, 2.66325, // 51-60
|
||||
2.73395, 1.93715, 1.72497, 2.74504, 2.71531, 1.52039, 1.58191, 1.61444, 2.67701, 1.51369, // 61-70
|
||||
2.60766, 1.46608, 1.49792, 2.49166, 2.84906, 2.80604, 2.92788, 2.76411, 2.59305, 2.5855, // 71-80
|
||||
2.80503, 1.4866, 1.46649, 1.45595, 1.44374, 1.54865, 2.45661, 2.43268, 1.35352, 1.35911, // 81-90
|
||||
2.26339, 2.26838, 1.35877, 1.37826, 1.3499, 1.36574, 1.33654, 1.33001, 1.37648, 4.28173, // 91-100
|
||||
G4RayleighAngularGenerator::PP7[101] ={0,
|
||||
3.999571467e+00, 3.991128282e+00, 3.855930000e+00, 3.954881255e+00, 1.209804865e+01, 3.984648146e+00, 1.159847718e+01, 1.208416029e+01, 7.793410191e+00, 7.050783546e+00, // 1-10
|
||||
1.860829199e+00, 1.805395915e+00, 5.601066041e+00, 1.285317248e+01, 2.982331588e+00, 1.387872806e+01, 1.234603360e+01, 1.341537351e+01, 9.537270000e+00, 4.399859528e+00, // 11-20
|
||||
7.887250000e+00, 1.010638153e+01, 5.125426065e+00, 4.529968522e+00, 1.295225813e+01, 1.125545587e+01, 3.469375224e+00, 9.019427119e+00, 4.422801993e+00, 4.231377923e+00, // 21-30
|
||||
4.487670198e+00, 3.377601937e+00, 3.060634263e+00, 2.916013798e+00, 3.277148894e+00, 3.204930000e+00, 2.941802865e+00, 2.233026370e+00, 2.626492823e+00, 4.442039033e+00, // 31-40
|
||||
4.924387077e+00, 7.722486735e+00, 6.373463850e+00, 1.126070000e+01, 4.865950000e+00, 1.666437783e+00, 1.165792401e+01, 1.832865314e+00, 3.197863589e+00, 1.108841018e+01, // 41-50
|
||||
8.586125523e+00, 6.676730000e+00, 1.759586815e+00, 1.779094293e+00, 1.606067697e+00, 1.716220000e+00, 3.714794374e+00, 1.684962847e+00, 3.694058142e+00, 3.883036642e+00, // 51-60
|
||||
3.616573408e+00, 2.616627730e+00, 1.724970000e+00, 3.214294756e+00, 6.048180604e+00, 1.644134456e+00, 1.645297046e+00, 1.638457907e+00, 1.632603379e+00, 1.628448343e+00, // 61-70
|
||||
1.632630475e+00, 1.635873458e+00, 1.825704957e+00, 2.491660000e+00, 2.578788354e+00, 1.564697536e+00, 1.957756845e+00, 1.753512815e+00, 2.248102578e+00, 2.608650253e+00, // 71-80
|
||||
1.775440582e+00, 1.577663847e+00, 2.371177051e+00, 2.470000483e+00, 1.508411013e+00, 2.464240407e+00, 2.506389292e+00, 2.470932595e+00, 2.409396196e+00, 4.479899308e+00, // 81-90
|
||||
1.455793655e+00, 1.441149845e+00, 2.479382371e+00, 2.453619326e+00, 2.383185233e+00, 2.503014659e+00, 4.272318275e+00, 2.713400801e+00, 1.391715512e+00, 2.623357264e+00 // 91-100
|
||||
};
|
||||
|
||||
const G4double
|
||||
G4RayleighAngularGenerator::PP8[101] = { 0,
|
||||
4, 4, 5.94686, 4.10265, 7.87177, 12.0509, 12.0472, 3.90597, 5.34338, 6.33072, // 1-10
|
||||
2.76777, 7.90099, 5.58323, 4.26372, 3.3005, 5.69179, 2.3698, 3.68167, 5.2807, 4.61212, // 11-20
|
||||
5.87809, 4.46207, 4.59278, 4.67584, 1.75212, 7.00575, 2.05428, 2.00415, 2.02048, 1.98413, // 21-30
|
||||
1.71725, 3.18743, 1.74231, 4.40997, 2.01626, 1.8622, 1.7544, 1.60332, 2.23338, 1.70932, // 31-40
|
||||
1.67223, 1.64655, 1.76198, 6.33416, 7.92665, 1.67835, 1.67408, 1.55895, 9.3642, 1.68776, // 41-50
|
||||
2.02167, 1.65401, 2.20616, 1.76498, 1.63064, 7.13771, 3.17033, 1.65236, 2.66943, 1.62703, // 51-60
|
||||
2.72469, 2.73686, 10.86, 2.76759, 2.69728, 1.62436, 2.76662, 1.48514, 1.57342, 1.61518, // 61-70
|
||||
3.18455, 2.73467, 2.72521, 2.786, 2.35611, 2.31574, 2.5787, 2.46877, 2.89052, 2.6478, // 71-80
|
||||
1.50419, 2.73998, 2.79809, 2.66207, 2.73089, 1.34835, 2.59656, 2.7006, 1.41867, 4.26255, // 81-90
|
||||
2.47985, 2.47126, 1.72573, 3.44856, 1.36451, 2.8715, 2.35731, 1.28196, 4.1224, 1.32633, // 91-100
|
||||
G4RayleighAngularGenerator::PP8[101] = {0,
|
||||
3.999988492e+00, 3.007894874e+00, 5.946860000e+00, 7.152304101e+00, 6.130363514e+00, 1.208178632e+01, 1.037802325e+01, 9.199988173e+00, 1.172397112e+01, 1.207012659e+01, // 1-10
|
||||
1.115856859e+01, 7.827803195e+00, 2.641126114e+00, 4.312456794e+00, 1.198258924e+01, 2.176176802e+00, 2.039327000e+00, 7.141859323e+00, 5.280700000e+00, 4.469270053e+00, // 11-20
|
||||
5.878090000e+00, 5.532784283e+00, 5.963337902e+00, 4.314887550e+00, 5.841459409e+00, 5.679735328e+00, 4.361061890e+00, 5.202026076e+00, 4.135817334e+00, 4.133917331e+00, // 21-30
|
||||
4.551995537e+00, 4.677756013e+00, 4.528279561e+00, 4.498802330e+00, 1.774563576e+00, 1.862200000e+00, 4.622134764e+00, 4.695173427e+00, 5.128574495e+00, 1.782470135e+00, // 31-40
|
||||
1.727732750e+00, 1.724150271e+00, 1.709518222e+00, 6.334160000e+00, 7.926650000e+00, 1.159184448e+01, 1.895174961e+00, 1.154752444e+01, 1.645989249e+00, 1.687530363e+00, // 41-50
|
||||
2.409664359e+00, 1.654010000e+00, 1.134686144e+01, 4.793719850e+00, 9.632614374e+00, 7.137710000e+00, 1.705278976e+00, 3.589745289e+00, 2.650211489e+00, 1.847594729e+00, // 51-60
|
||||
2.057911711e+00, 2.980049185e+00, 1.086000000e+01, 1.654657393e+00, 2.823690929e+00, 2.581116822e+00, 1.824902805e+00, 1.610400116e+00, 1.584768888e+00, 1.561632819e+00, // 61-70
|
||||
1.536232590e+00, 1.520253937e+00, 2.701107185e+00, 2.786000000e+00, 2.677490471e+00, 1.613510248e+00, 1.574877874e+00, 2.478321094e+00, 2.578973774e+00, 2.530183017e+00, // 71-80
|
||||
2.454130254e+00, 1.522182263e+00, 2.585541261e+00, 1.743698112e+00, 1.507618128e+00, 1.517673206e+00, 1.487198678e+00, 1.482431696e+00, 1.808266084e+00, 1.468787657e+00, // 81-90
|
||||
4.518186694e+00, 1.690796964e+00, 2.458974369e+00, 2.416442577e+00, 2.505591266e+00, 2.315596171e+00, 1.421452131e+00, 2.563262017e+00, 5.323940741e+00, 2.366288037e+00 // 91-100
|
||||
};
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
|
||||
|
||||
@@ -230,7 +230,7 @@ void G4ShellData::LoadData(const G4String& fileName)
|
||||
// Build the complete string identifying the file with the data set
|
||||
std::ostringstream ost;
|
||||
ost << fileName << ".dat";
|
||||
|
||||
// G4cout << fileName << G4endl;
|
||||
G4String name(ost.str());
|
||||
|
||||
char* path = std::getenv("G4LEDATA");
|
||||
|
||||
@@ -131,7 +131,9 @@ void G4ShellEMDataSet::SetEnergiesData(G4DataVector* energies,
|
||||
return;
|
||||
}
|
||||
|
||||
G4String msg = "component " + (G4String)componentId + " not found";
|
||||
G4String msg = "component ";
|
||||
msg += static_cast<char>(componentId);
|
||||
msg += " not found";
|
||||
|
||||
G4Exception("G4ShellEMDataSet::SetEnergiesData()","em0008", FatalErrorInArgument ,msg);
|
||||
}
|
||||
@@ -151,7 +153,9 @@ void G4ShellEMDataSet::SetLogEnergiesData(G4DataVector* energies,
|
||||
return;
|
||||
}
|
||||
|
||||
G4String msg = "component " + (G4String)componentId + " not found";
|
||||
G4String msg = "component ";
|
||||
msg += static_cast<char>(componentId);
|
||||
msg += " not found";
|
||||
G4Exception("G4ShellEMDataSet::SetLogEnergiesData()","em0008",
|
||||
FatalErrorInArgument ,msg);
|
||||
}
|
||||
@@ -173,7 +177,7 @@ G4bool G4ShellEMDataSet::LoadData(const G4String& file)
|
||||
G4Exception("G4ShellEMDataSet::LoadData()", "em0003",FatalException, message);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
G4DataVector* orig_shell_energies = 0;
|
||||
G4DataVector* orig_shell_data = 0;
|
||||
G4DataVector* log_shell_energies = 0;
|
||||
|
||||
@@ -129,6 +129,10 @@ void G4UAtomicDeexcitation::InitialiseForNewRun()
|
||||
{
|
||||
PIXEshellCS = new G4teoCrossSection(namePIXExsModel);
|
||||
}
|
||||
else if(namePIXExsModel == "ECPSSR_ANSTO")
|
||||
{
|
||||
PIXEshellCS = new G4teoCrossSection(namePIXExsModel);
|
||||
}
|
||||
else if(namePIXExsModel == "Empirical")
|
||||
{
|
||||
PIXEshellCS = new G4empCrossSection(namePIXExsModel);
|
||||
|
||||
@@ -582,8 +582,7 @@ const G4Element* G4VCrossSectionHandler::SelectRandomElement(const G4MaterialCut
|
||||
// Special case: the material consists of one element
|
||||
if (nElements == 1)
|
||||
{
|
||||
G4Element* element = (*elementVector)[0];
|
||||
return element;
|
||||
return (*elementVector)[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -673,8 +672,7 @@ void G4VCrossSectionHandler::ActiveElements()
|
||||
|
||||
for (G4int iEl=0; iEl<nElements; iEl++)
|
||||
{
|
||||
G4Element* element = (*elementVector)[iEl];
|
||||
G4double Z = element->GetZ();
|
||||
G4double Z = (*elementVector)[iEl]->GetZ();
|
||||
if (!(activeZ.contains(Z)) && Z >= zMin && Z <= zMax)
|
||||
{
|
||||
activeZ.push_back(Z);
|
||||
|
||||
@@ -164,8 +164,7 @@ void G4eIonisationParameters::LoadData()
|
||||
const size_t nElements = material->GetNumberOfElements();
|
||||
|
||||
for (size_t iEl=0; iEl<nElements; iEl++) {
|
||||
G4Element* element = (*elementVector)[iEl];
|
||||
G4double Z = element->GetZ();
|
||||
G4double Z = (*elementVector)[iEl]->GetZ();
|
||||
if (!(activeZ.contains(Z))) {
|
||||
activeZ.push_back(Z);
|
||||
}
|
||||
|
||||
@@ -34,17 +34,21 @@
|
||||
// 20 Oct 2011 ALF updated to take into account ECPSSR Form Factor
|
||||
// 09 Mar 2012 LP update methods
|
||||
// 09 Mar 2012 ALF update for M-shells Simulation
|
||||
//
|
||||
// 10 Nov 2021 S. Guatelli & S. Bakr Added ECPSSR form factor documented
|
||||
// in Bakr et al, NIM B, vol. 436, pp:285-291, 2018 and
|
||||
// called here ECPSSR_ANSTO
|
||||
|
||||
#include "globals.hh"
|
||||
#include "G4teoCrossSection.hh"
|
||||
#include "G4Proton.hh"
|
||||
#include "G4ecpssrBaseKxsModel.hh"
|
||||
#include "G4ecpssrBaseLixsModel.hh"
|
||||
|
||||
#include "G4ecpssrFormFactorKxsModel.hh"
|
||||
#include "G4ecpssrFormFactorLixsModel.hh"
|
||||
#include "G4ecpssrFormFactorMixsModel.hh"
|
||||
#include "G4ANSTOecpssrKxsModel.hh"
|
||||
#include "G4ANSTOecpssrLixsModel.hh"
|
||||
#include "G4ANSTOecpssrMixsModel.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
G4teoCrossSection::G4teoCrossSection(const G4String& nam)
|
||||
@@ -62,6 +66,12 @@ G4teoCrossSection::G4teoCrossSection(const G4String& nam)
|
||||
ecpssrShellLi = new G4ecpssrFormFactorLixsModel();
|
||||
ecpssrShellMi = new G4ecpssrFormFactorMixsModel();
|
||||
}
|
||||
else if (nam == "ECPSSR_ANSTO")
|
||||
{
|
||||
ecpssrShellK = new G4ANSTOecpssrKxsModel();
|
||||
ecpssrShellLi = new G4ANSTOecpssrLixsModel();
|
||||
ecpssrShellMi = new G4ANSTOecpssrMixsModel();
|
||||
}
|
||||
else
|
||||
{
|
||||
G4cout << "G4teoCrossSection::G4teoCrossSection: ERROR "
|
||||
|
||||
Reference in New Issue
Block a user