Import Geant4 10.7.0 source tree
This commit is contained in:
@@ -0,0 +1,455 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * License and Disclaimer *
|
||||
// * *
|
||||
// * The Geant4 software is copyright of the Copyright Holders of *
|
||||
// * the Geant4 Collaboration. It is provided under the terms and *
|
||||
// * conditions of the Geant4 Software License, included in the file *
|
||||
// * LICENSE and available at http://cern.ch/geant4/license . These *
|
||||
// * include a list of copyright holders. *
|
||||
// * *
|
||||
// * Neither the authors of this software system, nor their employing *
|
||||
// * institutes,nor the agencies providing financial support for this *
|
||||
// * work make any representation or warranty, express or implied, *
|
||||
// * regarding this software system or assume any liability for its *
|
||||
// * use. Please see the license in the file LICENSE and URL above *
|
||||
// * for the full disclaimer and the limitation of liability. *
|
||||
// * *
|
||||
// * This code implementation is the result of the scientific and *
|
||||
// * technical work of the GEANT4 collaboration. *
|
||||
// * By using, copying, modifying or distributing the software (or *
|
||||
// * any work based on the software) you agree to acknowledge its *
|
||||
// * use in resulting scientific publications, and indicate your *
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4EmPenelopePhysicsMI.cc 109526 2018-04-30 07:11:52Z gcosmo $
|
||||
// customized by gpaterno for MI in Rayleigh Scattering, March 2019
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "G4EmPenelopePhysicsMI.hh"
|
||||
#include "G4ParticleDefinition.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "G4ParticleTable.hh"
|
||||
|
||||
//Processes and models
|
||||
//gamma
|
||||
#include "G4PhotoElectricEffect.hh"
|
||||
#include "G4PenelopePhotoElectricModel.hh"
|
||||
|
||||
#include "G4ComptonScattering.hh"
|
||||
#include "G4PenelopeComptonModel.hh"
|
||||
|
||||
#include "G4GammaConversion.hh"
|
||||
#include "G4PenelopeGammaConversionModel.hh"
|
||||
|
||||
#include "G4RayleighScattering.hh"
|
||||
#include "G4PenelopeRayleighModel.hh"
|
||||
#include "G4PenelopeRayleighModelMI.hh"
|
||||
|
||||
//e- and e+
|
||||
#include "G4eMultipleScattering.hh"
|
||||
#include "G4UniversalFluctuation.hh"
|
||||
|
||||
#include "G4eIonisation.hh"
|
||||
#include "G4PenelopeIonisationModel.hh"
|
||||
|
||||
#include "G4eBremsstrahlung.hh"
|
||||
#include "G4PenelopeBremsstrahlungModel.hh"
|
||||
|
||||
//e+ only
|
||||
#include "G4eplusAnnihilation.hh"
|
||||
#include "G4PenelopeAnnihilationModel.hh"
|
||||
|
||||
//mu
|
||||
#include "G4MuMultipleScattering.hh"
|
||||
#include "G4MuIonisation.hh"
|
||||
#include "G4MuBremsstrahlung.hh"
|
||||
#include "G4MuPairProduction.hh"
|
||||
|
||||
#include "G4MuBremsstrahlungModel.hh"
|
||||
#include "G4MuPairProductionModel.hh"
|
||||
#include "G4hBremsstrahlungModel.hh"
|
||||
#include "G4hPairProductionModel.hh"
|
||||
|
||||
//hadrons
|
||||
#include "G4hMultipleScattering.hh"
|
||||
#include "G4MscStepLimitType.hh"
|
||||
|
||||
#include "G4hBremsstrahlung.hh"
|
||||
#include "G4hPairProduction.hh"
|
||||
|
||||
#include "G4hIonisation.hh"
|
||||
#include "G4ionIonisation.hh"
|
||||
#include "G4alphaIonisation.hh"
|
||||
#include "G4IonParametrisedLossModel.hh"
|
||||
#include "G4NuclearStopping.hh"
|
||||
|
||||
//msc models
|
||||
#include "G4UrbanMscModel.hh"
|
||||
#include "G4GoudsmitSaundersonMscModel.hh"
|
||||
#include "G4WentzelVIModel.hh"
|
||||
#include "G4CoulombScattering.hh"
|
||||
#include "G4eCoulombScatteringModel.hh"
|
||||
|
||||
#include "G4LossTableManager.hh"
|
||||
#include "G4VAtomDeexcitation.hh"
|
||||
#include "G4UAtomicDeexcitation.hh"
|
||||
|
||||
//particles
|
||||
#include "G4Gamma.hh"
|
||||
#include "G4Electron.hh"
|
||||
#include "G4Positron.hh"
|
||||
#include "G4MuonPlus.hh"
|
||||
#include "G4MuonMinus.hh"
|
||||
#include "G4PionPlus.hh"
|
||||
#include "G4PionMinus.hh"
|
||||
#include "G4KaonPlus.hh"
|
||||
#include "G4KaonMinus.hh"
|
||||
#include "G4Proton.hh"
|
||||
#include "G4AntiProton.hh"
|
||||
#include "G4Deuteron.hh"
|
||||
#include "G4Triton.hh"
|
||||
#include "G4He3.hh"
|
||||
#include "G4Alpha.hh"
|
||||
#include "G4GenericIon.hh"
|
||||
|
||||
#include "G4PhysicsListHelper.hh"
|
||||
#include "G4BuilderType.hh"
|
||||
#include "G4EmModelActivator.hh"
|
||||
|
||||
//factory
|
||||
#include "G4PhysicsConstructorFactory.hh"
|
||||
|
||||
G4_DECLARE_PHYSCONSTR_FACTORY(G4EmPenelopePhysicsMI);
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4EmPenelopePhysicsMI::G4EmPenelopePhysicsMI(G4int ver, const G4String&,
|
||||
G4bool UseMIFlag):
|
||||
G4VPhysicsConstructor("G4EmPenelopeMI"), fVerbose(ver),fUseMIFlag(UseMIFlag)
|
||||
{
|
||||
G4EmParameters* param = G4EmParameters::Instance();
|
||||
param->SetDefaults();
|
||||
param->SetVerbose(fVerbose);
|
||||
param->SetMinEnergy(100*eV);
|
||||
param->SetLowestElectronEnergy(100*eV);
|
||||
param->SetNumberOfBinsPerDecade(20);
|
||||
param->SetMscRangeFactor(0.02);
|
||||
param->SetMscStepLimitType(fUseDistanceToBoundary);
|
||||
param->SetMuHadLateralDisplacement(true);
|
||||
param->SetFluo(true);
|
||||
param->SetPIXEElectronCrossSectionModel("Penelope");
|
||||
SetPhysicsType(bElectromagnetic);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4EmPenelopePhysicsMI::~G4EmPenelopePhysicsMI()
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void G4EmPenelopePhysicsMI::ConstructParticle()
|
||||
{
|
||||
//gamma
|
||||
G4Gamma::Gamma();
|
||||
|
||||
//leptons
|
||||
G4Electron::Electron();
|
||||
G4Positron::Positron();
|
||||
G4MuonPlus::MuonPlus();
|
||||
G4MuonMinus::MuonMinus();
|
||||
|
||||
//mesons
|
||||
G4PionPlus::PionPlusDefinition();
|
||||
G4PionMinus::PionMinusDefinition();
|
||||
G4KaonPlus::KaonPlusDefinition();
|
||||
G4KaonMinus::KaonMinusDefinition();
|
||||
|
||||
//baryons
|
||||
G4Proton::Proton();
|
||||
G4AntiProton::AntiProton();
|
||||
|
||||
//ions
|
||||
G4Deuteron::Deuteron();
|
||||
G4Triton::Triton();
|
||||
G4He3::He3();
|
||||
G4Alpha::Alpha();
|
||||
G4GenericIon::GenericIonDefinition();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void G4EmPenelopePhysicsMI::ConstructProcess()
|
||||
{
|
||||
if(fVerbose > 1) {
|
||||
G4cout << "### " << GetPhysicsName() << " Construct Processes " << G4endl;
|
||||
}
|
||||
|
||||
G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
|
||||
|
||||
//muon & hadron bremsstrahlung and pair production
|
||||
G4MuBremsstrahlung* mub = new G4MuBremsstrahlung();
|
||||
G4MuPairProduction* mup = new G4MuPairProduction();
|
||||
G4hBremsstrahlung* pib = new G4hBremsstrahlung();
|
||||
G4hPairProduction* pip = new G4hPairProduction();
|
||||
G4hBremsstrahlung* kb = new G4hBremsstrahlung();
|
||||
G4hPairProduction* kp = new G4hPairProduction();
|
||||
G4hBremsstrahlung* pb = new G4hBremsstrahlung();
|
||||
G4hPairProduction* pp = new G4hPairProduction();
|
||||
|
||||
//muon & hadron multiple scattering
|
||||
G4MuMultipleScattering* mumsc = new G4MuMultipleScattering();
|
||||
mumsc->SetEmModel(new G4WentzelVIModel());
|
||||
G4hMultipleScattering* hmsc = new G4hMultipleScattering("ionmsc");
|
||||
|
||||
//high energy limit for e+- scattering models
|
||||
G4double highEnergyLimit = G4EmParameters::Instance()->MscEnergyLimit();
|
||||
|
||||
//nuclear stopping
|
||||
G4NuclearStopping* pnuc = new G4NuclearStopping();
|
||||
|
||||
//Applicability range for Penelope models
|
||||
//for higher energies, the Standard models are used
|
||||
G4double PenelopeHighEnergyLimit = 1.0*GeV;
|
||||
|
||||
//Add Penelope EM Processes
|
||||
G4ParticleTable* table = G4ParticleTable::GetParticleTable();
|
||||
for (const auto& particleName : fPartList.PartNames()) {
|
||||
G4ParticleDefinition* particle = table->FindParticle(particleName);
|
||||
if (!particle) { continue; }
|
||||
if (particleName == "gamma") {
|
||||
|
||||
//Photo-electric effect
|
||||
G4PhotoElectricEffect* thePhotoElectricEffect = new G4PhotoElectricEffect();
|
||||
G4PenelopePhotoElectricModel* thePEPenelopeModel = new
|
||||
G4PenelopePhotoElectricModel();
|
||||
thePEPenelopeModel->SetHighEnergyLimit(PenelopeHighEnergyLimit);
|
||||
thePhotoElectricEffect->SetEmModel(thePEPenelopeModel);
|
||||
ph->RegisterProcess(thePhotoElectricEffect, particle);
|
||||
|
||||
//Compton scattering
|
||||
G4ComptonScattering* theComptonScattering = new G4ComptonScattering();
|
||||
G4PenelopeComptonModel* theComptonPenelopeModel =
|
||||
new G4PenelopeComptonModel();
|
||||
theComptonPenelopeModel->SetHighEnergyLimit(PenelopeHighEnergyLimit);
|
||||
theComptonScattering->SetEmModel(theComptonPenelopeModel);
|
||||
ph->RegisterProcess(theComptonScattering, particle);
|
||||
|
||||
//Gamma conversion
|
||||
G4GammaConversion* theGammaConversion = new G4GammaConversion();
|
||||
G4PenelopeGammaConversionModel* theGCPenelopeModel =
|
||||
new G4PenelopeGammaConversionModel();
|
||||
theGammaConversion->SetEmModel(theGCPenelopeModel);
|
||||
ph->RegisterProcess(theGammaConversion, particle);
|
||||
|
||||
//Rayleigh scattering (modified by gpaterno)
|
||||
G4RayleighScattering* theRayleigh = new G4RayleighScattering();
|
||||
G4PenelopeRayleighModelMI* theRayleighPenelopeModel =
|
||||
new G4PenelopeRayleighModelMI();
|
||||
theRayleighPenelopeModel->SetVerbosityLevel(1);
|
||||
theRayleighPenelopeModel->SetMIActive(fUseMIFlag);
|
||||
//theRayleighPenelopeModel->SetHighEnergyLimit(PenelopeHighEnergyLimit);
|
||||
theRayleigh->SetEmModel(theRayleighPenelopeModel);
|
||||
ph->RegisterProcess(theRayleigh, particle);
|
||||
|
||||
} else if (particleName == "e-") {
|
||||
|
||||
//multiple scattering
|
||||
G4eMultipleScattering* msc = new G4eMultipleScattering;
|
||||
G4UrbanMscModel* msc1 = new G4UrbanMscModel();
|
||||
G4WentzelVIModel* msc2 = new G4WentzelVIModel();
|
||||
msc1->SetHighEnergyLimit(highEnergyLimit);
|
||||
msc2->SetLowEnergyLimit(highEnergyLimit);
|
||||
msc->SetEmModel(msc1);
|
||||
msc->SetEmModel(msc2);
|
||||
|
||||
G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel();
|
||||
G4CoulombScattering* ss = new G4CoulombScattering();
|
||||
ss->SetEmModel(ssm);
|
||||
ss->SetMinKinEnergy(highEnergyLimit);
|
||||
ssm->SetLowEnergyLimit(highEnergyLimit);
|
||||
ssm->SetActivationLowEnergyLimit(highEnergyLimit);
|
||||
|
||||
//Ionisation
|
||||
G4eIonisation* eIoni = new G4eIonisation();
|
||||
G4PenelopeIonisationModel* theIoniPenelope =
|
||||
new G4PenelopeIonisationModel();
|
||||
theIoniPenelope->SetHighEnergyLimit(PenelopeHighEnergyLimit);
|
||||
eIoni->AddEmModel(0,theIoniPenelope,new G4UniversalFluctuation());
|
||||
eIoni->SetStepFunction(0.2, 100*um); //
|
||||
|
||||
//Bremsstrahlung
|
||||
G4eBremsstrahlung* eBrem = new G4eBremsstrahlung();
|
||||
G4PenelopeBremsstrahlungModel* theBremPenelope =
|
||||
new G4PenelopeBremsstrahlungModel();
|
||||
theBremPenelope->SetHighEnergyLimit(PenelopeHighEnergyLimit);
|
||||
eBrem->SetEmModel(theBremPenelope);
|
||||
|
||||
//register processes
|
||||
ph->RegisterProcess(msc, particle);
|
||||
ph->RegisterProcess(eIoni, particle);
|
||||
ph->RegisterProcess(eBrem, particle);
|
||||
ph->RegisterProcess(ss, particle);
|
||||
|
||||
} else if (particleName == "e+") {
|
||||
|
||||
//multiple scattering
|
||||
G4eMultipleScattering* msc = new G4eMultipleScattering;
|
||||
G4UrbanMscModel* msc1 = new G4UrbanMscModel();
|
||||
G4WentzelVIModel* msc2 = new G4WentzelVIModel();
|
||||
msc1->SetHighEnergyLimit(highEnergyLimit);
|
||||
msc2->SetLowEnergyLimit(highEnergyLimit);
|
||||
msc->SetEmModel(msc1);
|
||||
msc->SetEmModel(msc2);
|
||||
|
||||
G4eCoulombScatteringModel* ssm = new G4eCoulombScatteringModel();
|
||||
G4CoulombScattering* ss = new G4CoulombScattering();
|
||||
ss->SetEmModel(ssm);
|
||||
ss->SetMinKinEnergy(highEnergyLimit);
|
||||
ssm->SetLowEnergyLimit(highEnergyLimit);
|
||||
ssm->SetActivationLowEnergyLimit(highEnergyLimit);
|
||||
|
||||
//Ionisation
|
||||
G4eIonisation* eIoni = new G4eIonisation();
|
||||
G4PenelopeIonisationModel* theIoniPenelope =
|
||||
new G4PenelopeIonisationModel();
|
||||
theIoniPenelope->SetHighEnergyLimit(PenelopeHighEnergyLimit);
|
||||
eIoni->AddEmModel(0,theIoniPenelope,new G4UniversalFluctuation());
|
||||
eIoni->SetStepFunction(0.2, 100*um); //
|
||||
|
||||
//Bremsstrahlung
|
||||
G4eBremsstrahlung* eBrem = new G4eBremsstrahlung();
|
||||
G4PenelopeBremsstrahlungModel* theBremPenelope =
|
||||
new G4PenelopeBremsstrahlungModel();
|
||||
theBremPenelope->SetHighEnergyLimit(PenelopeHighEnergyLimit);
|
||||
eBrem->SetEmModel(theBremPenelope);
|
||||
|
||||
//Annihilation
|
||||
G4eplusAnnihilation* eAnni = new G4eplusAnnihilation();
|
||||
G4PenelopeAnnihilationModel* theAnnPenelope =
|
||||
new G4PenelopeAnnihilationModel();
|
||||
theAnnPenelope->SetHighEnergyLimit(PenelopeHighEnergyLimit);
|
||||
eAnni->AddEmModel(0, theAnnPenelope);
|
||||
|
||||
//register processes
|
||||
ph->RegisterProcess(msc, particle);
|
||||
ph->RegisterProcess(eIoni, particle);
|
||||
ph->RegisterProcess(eBrem, particle);
|
||||
ph->RegisterProcess(eAnni, particle);
|
||||
ph->RegisterProcess(ss, particle);
|
||||
|
||||
} else if (particleName == "mu+" ||particleName == "mu-") {
|
||||
|
||||
G4MuIonisation* muIoni = new G4MuIonisation();
|
||||
muIoni->SetStepFunction(0.2, 50*um);
|
||||
|
||||
ph->RegisterProcess(mumsc, particle);
|
||||
ph->RegisterProcess(muIoni, particle);
|
||||
ph->RegisterProcess(mub, particle);
|
||||
ph->RegisterProcess(mup, particle);
|
||||
ph->RegisterProcess(new G4CoulombScattering(), particle);
|
||||
|
||||
} else if (particleName == "alpha" || particleName == "He3") {
|
||||
|
||||
G4hMultipleScattering* msc = new G4hMultipleScattering();
|
||||
G4ionIonisation* ionIoni = new G4ionIonisation();
|
||||
ionIoni->SetStepFunction(0.1, 10*um);
|
||||
|
||||
ph->RegisterProcess(msc, particle);
|
||||
ph->RegisterProcess(ionIoni, particle);
|
||||
ph->RegisterProcess(pnuc, particle);
|
||||
|
||||
} else if (particleName == "GenericIon") {
|
||||
|
||||
G4ionIonisation* ionIoni = new G4ionIonisation();
|
||||
ionIoni->SetEmModel(new G4IonParametrisedLossModel());
|
||||
ionIoni->SetStepFunction(0.1, 1*um);
|
||||
|
||||
ph->RegisterProcess(hmsc, particle);
|
||||
ph->RegisterProcess(ionIoni, particle);
|
||||
ph->RegisterProcess(pnuc, particle);
|
||||
|
||||
} else if (particleName == "pi+" || particleName == "pi-" ) {
|
||||
|
||||
G4hMultipleScattering* pimsc = new G4hMultipleScattering();
|
||||
G4hIonisation* hIoni = new G4hIonisation();
|
||||
hIoni->SetStepFunction(0.2, 50*um);
|
||||
|
||||
ph->RegisterProcess(pimsc, particle);
|
||||
ph->RegisterProcess(hIoni, particle);
|
||||
ph->RegisterProcess(pib, particle);
|
||||
ph->RegisterProcess(pip, particle);
|
||||
|
||||
} else if (particleName == "kaon+" || particleName == "kaon-" ) {
|
||||
|
||||
G4hMultipleScattering* kmsc = new G4hMultipleScattering();
|
||||
G4hIonisation* hIoni = new G4hIonisation();
|
||||
hIoni->SetStepFunction(0.2, 50*um);
|
||||
|
||||
ph->RegisterProcess(kmsc, particle);
|
||||
ph->RegisterProcess(hIoni, particle);
|
||||
ph->RegisterProcess(kb, particle);
|
||||
ph->RegisterProcess(kp, particle);
|
||||
|
||||
} else if (particleName == "proton" || particleName == "anti_proton") {
|
||||
|
||||
G4hMultipleScattering* pmsc = new G4hMultipleScattering();
|
||||
G4hIonisation* hIoni = new G4hIonisation();
|
||||
hIoni->SetStepFunction(0.2, 50*um);
|
||||
|
||||
ph->RegisterProcess(pmsc, particle);
|
||||
ph->RegisterProcess(hIoni, particle);
|
||||
ph->RegisterProcess(pb, particle);
|
||||
ph->RegisterProcess(pp, particle);
|
||||
ph->RegisterProcess(pnuc, particle);
|
||||
|
||||
} else if (particleName == "B+" ||
|
||||
particleName == "B-" ||
|
||||
particleName == "D+" ||
|
||||
particleName == "D-" ||
|
||||
particleName == "Ds+" ||
|
||||
particleName == "Ds-" ||
|
||||
particleName == "anti_He3" ||
|
||||
particleName == "anti_alpha" ||
|
||||
particleName == "anti_deuteron" ||
|
||||
particleName == "anti_lambda_c+" ||
|
||||
particleName == "anti_omega-" ||
|
||||
particleName == "anti_sigma_c+" ||
|
||||
particleName == "anti_sigma_c++" ||
|
||||
particleName == "anti_sigma+" ||
|
||||
particleName == "anti_sigma-" ||
|
||||
particleName == "anti_triton" ||
|
||||
particleName == "anti_xi_c+" ||
|
||||
particleName == "anti_xi-" ||
|
||||
particleName == "deuteron" ||
|
||||
particleName == "lambda_c+" ||
|
||||
particleName == "omega-" ||
|
||||
particleName == "sigma_c+" ||
|
||||
particleName == "sigma_c++" ||
|
||||
particleName == "sigma+" ||
|
||||
particleName == "sigma-" ||
|
||||
particleName == "tau+" ||
|
||||
particleName == "tau-" ||
|
||||
particleName == "triton" ||
|
||||
particleName == "xi_c+" ||
|
||||
particleName == "xi-" ) {
|
||||
|
||||
ph->RegisterProcess(hmsc, particle);
|
||||
ph->RegisterProcess(new G4hIonisation(), particle);
|
||||
}
|
||||
}
|
||||
|
||||
//Nuclear stopping
|
||||
pnuc->SetMaxKinEnergy(MeV);
|
||||
|
||||
//Deexcitation
|
||||
G4VAtomDeexcitation* deexcitation = new G4UAtomicDeexcitation();
|
||||
G4LossTableManager::Instance()->SetAtomDeexcitation(deexcitation);
|
||||
|
||||
G4EmModelActivator mact(GetPhysicsName());
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -0,0 +1,67 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSActionInitialization.cc
|
||||
/// \brief Implementation of the SAXSActionInitialization class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "SAXSActionInitialization.hh"
|
||||
#include "SAXSPrimaryGeneratorAction.hh"
|
||||
#include "SAXSRunAction.hh"
|
||||
#include "SAXSEventAction.hh"
|
||||
#include "SAXSSteppingAction.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSActionInitialization::SAXSActionInitialization() :
|
||||
G4VUserActionInitialization()
|
||||
{;}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSActionInitialization::~SAXSActionInitialization()
|
||||
{;}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSActionInitialization::Build() const
|
||||
{
|
||||
SetUserAction(new SAXSPrimaryGeneratorAction());
|
||||
SetUserAction(new SAXSRunAction());
|
||||
SAXSEventAction* eventAction = new SAXSEventAction();
|
||||
SetUserAction(eventAction);
|
||||
SetUserAction(new SAXSSteppingAction(eventAction));
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void SAXSActionInitialization::BuildForMaster() const
|
||||
{
|
||||
SetUserAction(new SAXSRunAction());
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,542 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSDetectorConstructionMessenger.cc
|
||||
/// \brief Implementation of the SAXSDetectorConstructionMessenger class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "SAXSDetectorConstructionMessenger.hh"
|
||||
#include "SAXSDetectorConstruction.hh"
|
||||
|
||||
#include "G4UIdirectory.hh"
|
||||
#include "G4UIcmdWithADoubleAndUnit.hh"
|
||||
#include "G4UIcmdWithADouble.hh"
|
||||
#include "G4UIcmdWithAnInteger.hh"
|
||||
#include "G4UIcmdWith3VectorAndUnit.hh"
|
||||
#include "G4UIcmdWithABool.hh"
|
||||
#include "G4UIcmdWithAString.hh"
|
||||
|
||||
#include "G4RunManager.hh"
|
||||
#include "G4ios.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSDetectorConstructionMessenger::SAXSDetectorConstructionMessenger
|
||||
(SAXSDetectorConstruction* detconstr):
|
||||
G4UImessenger(), fDetector(detconstr)
|
||||
{
|
||||
fCmdDir = new G4UIdirectory("/det/");
|
||||
fCmdDir->SetGuidance("Detector Control");
|
||||
|
||||
fSetCustomMatFFfilename = new G4UIcmdWithAString("/det/SetCustomMatFF",this);
|
||||
fSetCustomMatFFfilename->SetGuidance("Set CustomMat FF filename");
|
||||
fSetCustomMatFFfilename->SetParameterName("mmff",false);
|
||||
fSetCustomMatFFfilename->AvailableForStates(G4State_PreInit);
|
||||
|
||||
fSetCustomMatDensityCmd = new G4UIcmdWithADouble("/det/setCustomMatDensity",
|
||||
this);
|
||||
fSetCustomMatDensityCmd->SetGuidance("Set density for custom material");
|
||||
fSetCustomMatDensityCmd->SetParameterName("cmden",false);
|
||||
fSetCustomMatDensityCmd->SetRange("cmden>0.");
|
||||
fSetCustomMatDensityCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetCustomMatHmassfractCmd = new G4UIcmdWithADouble
|
||||
("/det/setCustomMatHmassfract",this);
|
||||
fSetCustomMatHmassfractCmd->
|
||||
SetGuidance("Set H mass fraction for custom material");
|
||||
fSetCustomMatHmassfractCmd->SetParameterName("cmHmf",false);
|
||||
fSetCustomMatHmassfractCmd->SetRange("cmHmf>=0.");
|
||||
fSetCustomMatHmassfractCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetCustomMatCmassfractCmd = new G4UIcmdWithADouble
|
||||
("/det/setCustomMatCmassfract",this);
|
||||
fSetCustomMatCmassfractCmd->
|
||||
SetGuidance("Set C mass fraction for custom material");
|
||||
fSetCustomMatCmassfractCmd->SetParameterName("cmCmf",false);
|
||||
fSetCustomMatCmassfractCmd->SetRange("cmCmf>=0.");
|
||||
fSetCustomMatCmassfractCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetCustomMatNmassfractCmd = new G4UIcmdWithADouble
|
||||
("/det/setCustomMatNmassfract",this);
|
||||
fSetCustomMatNmassfractCmd->SetGuidance
|
||||
("Set N mass fraction for custom material");
|
||||
fSetCustomMatNmassfractCmd->SetParameterName("cmNmf",false);
|
||||
fSetCustomMatNmassfractCmd->SetRange("cmNmf>=0.");
|
||||
fSetCustomMatNmassfractCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetCustomMatOmassfractCmd = new G4UIcmdWithADouble
|
||||
("/det/setCustomMatOmassfract",this);
|
||||
fSetCustomMatOmassfractCmd->SetGuidance
|
||||
("Set O mass fraction for custom material");
|
||||
fSetCustomMatOmassfractCmd->SetParameterName("cmOmf",false);
|
||||
fSetCustomMatOmassfractCmd->SetRange("cmOmf>=0.");
|
||||
fSetCustomMatOmassfractCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetCustomMatNamassfractCmd = new G4UIcmdWithADouble
|
||||
("/det/setCustomMatNamassfract",this);
|
||||
fSetCustomMatNamassfractCmd->
|
||||
SetGuidance("Set Na mass fraction for custom material");
|
||||
fSetCustomMatNamassfractCmd->SetParameterName("cmNamf",false);
|
||||
fSetCustomMatNamassfractCmd->SetRange("cmNamf>=0.");
|
||||
fSetCustomMatNamassfractCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetCustomMatPmassfractCmd = new G4UIcmdWithADouble
|
||||
("/det/setCustomMatPmassfract",this);
|
||||
fSetCustomMatPmassfractCmd->
|
||||
SetGuidance("Set P mass fraction for custom material");
|
||||
fSetCustomMatPmassfractCmd->SetParameterName("cmPmf",false);
|
||||
fSetCustomMatPmassfractCmd->SetRange("cmPmf>=0.");
|
||||
fSetCustomMatPmassfractCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetCustomMatSmassfractCmd = new G4UIcmdWithADouble
|
||||
("/det/setCustomMatSmassfract",this);
|
||||
fSetCustomMatSmassfractCmd->
|
||||
SetGuidance("Set S mass fraction for custom material");
|
||||
fSetCustomMatSmassfractCmd->SetParameterName("cmSmf",false);
|
||||
fSetCustomMatSmassfractCmd->SetRange("cmSmf>=0.");
|
||||
fSetCustomMatSmassfractCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetCustomMatClmassfractCmd =
|
||||
new G4UIcmdWithADouble("/det/setCustomMatClmassfract",this);
|
||||
fSetCustomMatClmassfractCmd->
|
||||
SetGuidance("Set Cl mass fraction for custom material");
|
||||
fSetCustomMatClmassfractCmd->SetParameterName("cmClmf",false);
|
||||
fSetCustomMatClmassfractCmd->SetRange("cmClmf>=0.");
|
||||
fSetCustomMatClmassfractCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetCustomMatKmassfractCmd = new G4UIcmdWithADouble
|
||||
("/det/setCustomMatKmassfract",this);
|
||||
fSetCustomMatKmassfractCmd->
|
||||
SetGuidance("Set K mass fraction for custom material");
|
||||
fSetCustomMatKmassfractCmd->SetParameterName("cmKmf",false);
|
||||
fSetCustomMatKmassfractCmd->SetRange("cmKmf>=0.");
|
||||
fSetCustomMatKmassfractCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetCustomMatCamassfractCmd = new G4UIcmdWithADouble
|
||||
("/det/setCustomMatCamassfract",this);
|
||||
fSetCustomMatCamassfractCmd->
|
||||
SetGuidance("Set Ca mass fraction for custom material");
|
||||
fSetCustomMatCamassfractCmd->SetParameterName("cmCamf",false);
|
||||
fSetCustomMatCamassfractCmd->SetRange("cmCamf>=0.");
|
||||
fSetCustomMatCamassfractCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fPhantomMaterialCmd = new G4UIcmdWithAnInteger("/det/setPhantomMaterial",this);
|
||||
fPhantomMaterialCmd->SetGuidance("Set Phantom material");
|
||||
fPhantomMaterialCmd->SetParameterName("PhantomMat",false);
|
||||
fPhantomMaterialCmd->SetRange("PhantomMat>=1 && PhantomMat<=30");
|
||||
fPhantomMaterialCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fPhantomDiameterCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setPhantomDiameter",this);
|
||||
fPhantomDiameterCmd->SetGuidance("Set Phantom Diameter");
|
||||
fPhantomDiameterCmd->SetParameterName("PhantomDiameter",false);
|
||||
fPhantomDiameterCmd->SetUnitCategory("Length");
|
||||
fPhantomDiameterCmd->SetRange("PhantomDiameter>0.");
|
||||
fPhantomDiameterCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fPhantomHeightCmd = new G4UIcmdWithADoubleAndUnit("/det/setPhantomHeight",this);
|
||||
fPhantomHeightCmd->SetGuidance("Set Phantom Thickness");
|
||||
fPhantomHeightCmd->SetParameterName("PhantomHeight",false);
|
||||
fPhantomHeightCmd->SetUnitCategory("Length");
|
||||
fPhantomHeightCmd->SetRange("PhantomHeight>0.");
|
||||
fPhantomHeightCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fPhantomZCmd = new G4UIcmdWithADoubleAndUnit("/det/setPhantomZ",this);
|
||||
fPhantomZCmd->SetGuidance("Set Phantom Z");
|
||||
fPhantomZCmd->SetParameterName("PhantomZ",false);
|
||||
fPhantomZCmd->SetUnitCategory("Length");
|
||||
fPhantomZCmd->SetRange("PhantomZ>=0.");
|
||||
fPhantomZCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetComp0Cmd = new G4UIcmdWithADouble("/det/setComp0",this);
|
||||
fSetComp0Cmd->SetGuidance("Set Comp0 for medical material");
|
||||
fSetComp0Cmd->SetParameterName("c0",false);
|
||||
fSetComp0Cmd->SetRange("c0>=0.");
|
||||
fSetComp0Cmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetComp1Cmd = new G4UIcmdWithADouble("/det/setComp1",this);
|
||||
fSetComp1Cmd->SetGuidance("Set Comp1 for medical material");
|
||||
fSetComp1Cmd->SetParameterName("c1",false);
|
||||
fSetComp1Cmd->SetRange("c1>=0.");
|
||||
fSetComp1Cmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetComp2Cmd = new G4UIcmdWithADouble("/det/setComp2",this);
|
||||
fSetComp2Cmd->SetGuidance("Set Comp2 for medical material");
|
||||
fSetComp2Cmd->SetParameterName("c2",false);
|
||||
fSetComp2Cmd->SetRange("c2>=0.");
|
||||
fSetComp2Cmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetComp3Cmd = new G4UIcmdWithADouble("/det/setComp3",this);
|
||||
fSetComp3Cmd->SetGuidance("Set Comp3 for medical material");
|
||||
fSetComp3Cmd->SetParameterName("c3",false);
|
||||
fSetComp3Cmd->SetRange("c3>=0.");
|
||||
fSetComp3Cmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fThetaSetupCmd = new G4UIcmdWithADouble("/det/setThetaSetup",this);
|
||||
fThetaSetupCmd->SetGuidance("Set theta setup (rad)");
|
||||
fThetaSetupCmd->SetParameterName("theta",false);
|
||||
fThetaSetupCmd->SetRange("theta>=0.");
|
||||
fThetaSetupCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSetSlitsCmd = new G4UIcmdWithABool("/det/setSlits", this);
|
||||
fSetSlitsCmd->SetGuidance("set Slits");
|
||||
fSetSlitsCmd->SetParameterName("fIWantSlits",true);
|
||||
fSetSlitsCmd->SetDefaultValue(false);
|
||||
|
||||
fSlit1ThicknessCmd = new G4UIcmdWithADoubleAndUnit("/det/setSlit1Thickness",this);
|
||||
fSlit1ThicknessCmd->SetGuidance("Set Slit1 Thickness");
|
||||
fSlit1ThicknessCmd->SetParameterName("Slit1Thickness",false);
|
||||
fSlit1ThicknessCmd->SetUnitCategory("Length");
|
||||
fSlit1ThicknessCmd->SetRange("Slit1Thickness>0.");
|
||||
fSlit1ThicknessCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit2ThicknessCmd = new G4UIcmdWithADoubleAndUnit("/det/setSlit2Thickness",this);
|
||||
fSlit2ThicknessCmd->SetGuidance("Set Slit2 Thickness");
|
||||
fSlit2ThicknessCmd->SetParameterName("Slit2Thickness",false);
|
||||
fSlit2ThicknessCmd->SetUnitCategory("Length");
|
||||
fSlit2ThicknessCmd->SetRange("Slit2Thickness>0.");
|
||||
fSlit2ThicknessCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit3ThicknessCmd = new G4UIcmdWithADoubleAndUnit("/det/setSlit3Thickness",this);
|
||||
fSlit3ThicknessCmd->SetGuidance("Set Slit3 Thickness");
|
||||
fSlit3ThicknessCmd->SetParameterName("Slit3Thickness",false);
|
||||
fSlit3ThicknessCmd->SetUnitCategory("Length");
|
||||
fSlit3ThicknessCmd->SetRange("Slit3Thickness>0.");
|
||||
fSlit3ThicknessCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit4ThicknessCmd = new G4UIcmdWithADoubleAndUnit("/det/setSlit4Thickness",this);
|
||||
fSlit4ThicknessCmd->SetGuidance("Set Slit4 Thickness");
|
||||
fSlit4ThicknessCmd->SetParameterName("Slit4Thickness",false);
|
||||
fSlit4ThicknessCmd->SetUnitCategory("Length");
|
||||
fSlit4ThicknessCmd->SetRange("Slit4Thickness>0.");
|
||||
fSlit4ThicknessCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit1DistanceCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit1SampleDistance",this);
|
||||
fSlit1DistanceCmd->SetGuidance("Set Slit1-to-Sample Distance");
|
||||
fSlit1DistanceCmd->SetParameterName("Slit1dist",false);
|
||||
fSlit1DistanceCmd->SetUnitCategory("Length");
|
||||
fSlit1DistanceCmd->SetRange("Slit1dist>0.");
|
||||
fSlit1DistanceCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit2DistanceCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit2SampleDistance",this);
|
||||
fSlit2DistanceCmd->SetGuidance("Set Slit2-to-Sample Distance");
|
||||
fSlit2DistanceCmd->SetParameterName("Slit2dist",false);
|
||||
fSlit2DistanceCmd->SetUnitCategory("Length");
|
||||
fSlit2DistanceCmd->SetRange("Slit2dist>0.");
|
||||
fSlit2DistanceCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit3DistanceCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit3SampleDistance",this);
|
||||
fSlit3DistanceCmd->SetGuidance("Set Slit3-to-Sample Distance");
|
||||
fSlit3DistanceCmd->SetParameterName("Slit3dist",false);
|
||||
fSlit3DistanceCmd->SetUnitCategory("Length");
|
||||
fSlit3DistanceCmd->SetRange("Slit3dist>0.");
|
||||
fSlit3DistanceCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit4DistanceCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit4SampleDistance",this);
|
||||
fSlit4DistanceCmd->SetGuidance("Set Slit4-to-Sample Distance");
|
||||
fSlit4DistanceCmd->SetParameterName("Slit4dist",false);
|
||||
fSlit4DistanceCmd->SetUnitCategory("Length");
|
||||
fSlit4DistanceCmd->SetRange("Slit4dist>0.");
|
||||
fSlit4DistanceCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit1xApertureCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit1xAperture",this);
|
||||
fSlit1xApertureCmd->SetGuidance("Set Slit1 x Aperture");
|
||||
fSlit1xApertureCmd->SetParameterName("Slit1xAp",false);
|
||||
fSlit1xApertureCmd->SetUnitCategory("Length");
|
||||
fSlit1xApertureCmd->SetRange("Slit1xAp>0.");
|
||||
fSlit1xApertureCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit2xApertureCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit2xAperture",this);
|
||||
fSlit2xApertureCmd->SetGuidance("Set Slit2 x Aperture");
|
||||
fSlit2xApertureCmd->SetParameterName("Slit2xAp",false);
|
||||
fSlit2xApertureCmd->SetUnitCategory("Length");
|
||||
fSlit2xApertureCmd->SetRange("Slit2xAp>0.");
|
||||
fSlit2xApertureCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit3xApertureCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit3xAperture",this);
|
||||
fSlit3xApertureCmd->SetGuidance("Set Slit3 x Aperture");
|
||||
fSlit3xApertureCmd->SetParameterName("Slit3xAp",false);
|
||||
fSlit3xApertureCmd->SetUnitCategory("Length");
|
||||
fSlit3xApertureCmd->SetRange("Slit3xAp>0.");
|
||||
fSlit3xApertureCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit4xApertureCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit4xAperture",this);
|
||||
fSlit4xApertureCmd->SetGuidance("Set Slit4 x Aperture");
|
||||
fSlit4xApertureCmd->SetParameterName("Slit4xAp",false);
|
||||
fSlit4xApertureCmd->SetUnitCategory("Length");
|
||||
fSlit4xApertureCmd->SetRange("Slit4xAp>0.");
|
||||
fSlit4xApertureCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit1yApertureCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit1yAperture",this);
|
||||
fSlit1yApertureCmd->SetGuidance("Set Slit1 y Aperture");
|
||||
fSlit1yApertureCmd->SetParameterName("Slit1yAp",false);
|
||||
fSlit1yApertureCmd->SetUnitCategory("Length");
|
||||
fSlit1yApertureCmd->SetRange("Slit1yAp>0.");
|
||||
fSlit1yApertureCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit2yApertureCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit2yAperture",this);
|
||||
fSlit2yApertureCmd->SetGuidance("Set Slit2 y Aperture");
|
||||
fSlit2yApertureCmd->SetParameterName("Slit2yAp",false);
|
||||
fSlit2yApertureCmd->SetUnitCategory("Length");
|
||||
fSlit2yApertureCmd->SetRange("Slit2yAp>0.");
|
||||
fSlit2yApertureCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit3yApertureCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit3yAperture",this);
|
||||
fSlit3yApertureCmd->SetGuidance("Set Slit3 y Aperture");
|
||||
fSlit3yApertureCmd->SetParameterName("Slit3yAp",false);
|
||||
fSlit3yApertureCmd->SetUnitCategory("Length");
|
||||
fSlit3yApertureCmd->SetRange("Slit3yAp>0.");
|
||||
fSlit3yApertureCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fSlit4yApertureCmd =
|
||||
new G4UIcmdWithADoubleAndUnit("/det/setSlit4yAperture",this);
|
||||
fSlit4yApertureCmd->SetGuidance("Set Slit4 y Aperture");
|
||||
fSlit4yApertureCmd->SetParameterName("Slit4yAp",false);
|
||||
fSlit4yApertureCmd->SetUnitCategory("Length");
|
||||
fSlit4yApertureCmd->SetRange("Slit4yAp>0.");
|
||||
fSlit4yApertureCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fDetectorThicknessCmd = new G4UIcmdWithADoubleAndUnit
|
||||
("/det/setDetectorThickness",this);
|
||||
fDetectorThicknessCmd->SetGuidance("Set Detector Thickness");
|
||||
fDetectorThicknessCmd->SetParameterName("DetectorThickness",false);
|
||||
fDetectorThicknessCmd->SetUnitCategory("Length");
|
||||
fDetectorThicknessCmd->SetRange("DetectorThickness>0.");
|
||||
fDetectorThicknessCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fDetectorSizeCmd = new G4UIcmdWithADoubleAndUnit("/det/setDetectorSize",this);
|
||||
fDetectorSizeCmd->SetGuidance("Set DetectorSize");
|
||||
fDetectorSizeCmd->SetParameterName("scrnsize",false);
|
||||
fDetectorSizeCmd->SetUnitCategory("Length");
|
||||
fDetectorSizeCmd->SetRange("scrnsize>0.");
|
||||
fDetectorSizeCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
|
||||
fDetectorDistanceCmd = new G4UIcmdWithADoubleAndUnit
|
||||
("/det/setDetectorSampleDistance",this);
|
||||
fDetectorDistanceCmd->SetGuidance("Set Detector Distance");
|
||||
fDetectorDistanceCmd->SetParameterName("detDist",false);
|
||||
fDetectorDistanceCmd->SetUnitCategory("Length");
|
||||
fDetectorDistanceCmd->SetRange("detDist>0.");
|
||||
fDetectorDistanceCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
SAXSDetectorConstructionMessenger::~SAXSDetectorConstructionMessenger()
|
||||
{
|
||||
delete fCmdDir;
|
||||
|
||||
delete fSetCustomMatFFfilename;
|
||||
delete fSetCustomMatDensityCmd;
|
||||
delete fSetCustomMatHmassfractCmd;
|
||||
delete fSetCustomMatCmassfractCmd;
|
||||
delete fSetCustomMatNmassfractCmd;
|
||||
delete fSetCustomMatOmassfractCmd;
|
||||
delete fSetCustomMatNamassfractCmd;
|
||||
delete fSetCustomMatPmassfractCmd;
|
||||
delete fSetCustomMatSmassfractCmd;
|
||||
delete fSetCustomMatClmassfractCmd;
|
||||
delete fSetCustomMatKmassfractCmd;
|
||||
delete fSetCustomMatCamassfractCmd;
|
||||
|
||||
delete fPhantomMaterialCmd;
|
||||
delete fPhantomDiameterCmd;
|
||||
delete fPhantomHeightCmd;
|
||||
delete fPhantomZCmd;
|
||||
|
||||
delete fSetComp0Cmd;
|
||||
delete fSetComp1Cmd;
|
||||
delete fSetComp2Cmd;
|
||||
delete fSetComp3Cmd;
|
||||
|
||||
delete fThetaSetupCmd;
|
||||
|
||||
delete fSetSlitsCmd;
|
||||
delete fSlit1ThicknessCmd;
|
||||
delete fSlit2ThicknessCmd;
|
||||
delete fSlit3ThicknessCmd;
|
||||
delete fSlit4ThicknessCmd;
|
||||
delete fSlit1DistanceCmd;
|
||||
delete fSlit2DistanceCmd;
|
||||
delete fSlit3DistanceCmd;
|
||||
delete fSlit4DistanceCmd;
|
||||
delete fSlit1xApertureCmd;
|
||||
delete fSlit2xApertureCmd;
|
||||
delete fSlit3xApertureCmd;
|
||||
delete fSlit4xApertureCmd;
|
||||
delete fSlit1yApertureCmd;
|
||||
delete fSlit2yApertureCmd;
|
||||
delete fSlit3yApertureCmd;
|
||||
delete fSlit4yApertureCmd;
|
||||
|
||||
delete fDetectorThicknessCmd;
|
||||
delete fDetectorSizeCmd;
|
||||
delete fDetectorDistanceCmd;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void SAXSDetectorConstructionMessenger::SetNewValue(G4UIcommand* command,
|
||||
G4String newValue)
|
||||
{
|
||||
if (command == fSetCustomMatFFfilename)
|
||||
fDetector->SetCustomMatFF(newValue);
|
||||
|
||||
if (command == fSetCustomMatDensityCmd)
|
||||
fDetector->SetCustomMatDensity
|
||||
(fSetCustomMatDensityCmd->GetNewDoubleValue(newValue));
|
||||
|
||||
if (command == fSetCustomMatHmassfractCmd)
|
||||
fDetector->SetCustomMatHmassfract
|
||||
(fSetCustomMatHmassfractCmd->GetNewDoubleValue(newValue));
|
||||
|
||||
if (command == fSetCustomMatCmassfractCmd)
|
||||
fDetector->SetCustomMatCmassfract
|
||||
(fSetCustomMatCmassfractCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetCustomMatNmassfractCmd)
|
||||
fDetector->SetCustomMatNmassfract
|
||||
(fSetCustomMatNmassfractCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetCustomMatOmassfractCmd)
|
||||
fDetector->SetCustomMatOmassfract
|
||||
(fSetCustomMatOmassfractCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetCustomMatNamassfractCmd)
|
||||
fDetector->SetCustomMatNamassfract
|
||||
(fSetCustomMatNamassfractCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetCustomMatPmassfractCmd)
|
||||
fDetector->SetCustomMatPmassfract
|
||||
(fSetCustomMatPmassfractCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetCustomMatSmassfractCmd)
|
||||
fDetector->SetCustomMatSmassfract
|
||||
(fSetCustomMatSmassfractCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetCustomMatClmassfractCmd)
|
||||
fDetector->SetCustomMatClmassfract
|
||||
(fSetCustomMatClmassfractCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetCustomMatKmassfractCmd)
|
||||
fDetector->SetCustomMatKmassfract
|
||||
(fSetCustomMatKmassfractCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetCustomMatCamassfractCmd)
|
||||
fDetector->SetCustomMatCamassfract
|
||||
(fSetCustomMatCamassfractCmd->GetNewDoubleValue(newValue));
|
||||
|
||||
if (command == fPhantomMaterialCmd) {
|
||||
fDetector->SetPhantomMaterial
|
||||
(fPhantomMaterialCmd->GetNewIntValue(newValue));}
|
||||
if (command == fPhantomDiameterCmd) {
|
||||
fDetector->SetPhantomDiameter
|
||||
(fPhantomDiameterCmd->GetNewDoubleValue(newValue));}
|
||||
if (command == fPhantomHeightCmd) {
|
||||
fDetector->SetPhantomHeight
|
||||
(fPhantomHeightCmd->GetNewDoubleValue(newValue));}
|
||||
if (command == fPhantomZCmd) {
|
||||
fDetector->SetPhantomZ
|
||||
(fPhantomZCmd->GetNewDoubleValue(newValue));}
|
||||
|
||||
if (command == fSetComp0Cmd)
|
||||
fDetector->SetComp0(fSetComp0Cmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetComp1Cmd)
|
||||
fDetector->SetComp1(fSetComp1Cmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetComp2Cmd)
|
||||
fDetector->SetComp2(fSetComp2Cmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetComp3Cmd)
|
||||
fDetector->SetComp3(fSetComp3Cmd->GetNewDoubleValue(newValue));
|
||||
|
||||
if (command == fThetaSetupCmd)
|
||||
fDetector->SetThetaSetup
|
||||
(fThetaSetupCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSetSlitsCmd)
|
||||
fDetector->SetSlits(fSetSlitsCmd->GetNewBoolValue(newValue));
|
||||
if (command == fSlit1ThicknessCmd)
|
||||
fDetector->SetSlit1Thickness
|
||||
(fSlit1ThicknessCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit2ThicknessCmd)
|
||||
fDetector->SetSlit2Thickness
|
||||
(fSlit2ThicknessCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit3ThicknessCmd)
|
||||
fDetector->SetSlit3Thickness
|
||||
(fSlit3ThicknessCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit4ThicknessCmd)
|
||||
fDetector->SetSlit4Thickness
|
||||
(fSlit4ThicknessCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit1DistanceCmd)
|
||||
fDetector->SetSlit1SampleDistance
|
||||
(fSlit1DistanceCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit2DistanceCmd)
|
||||
fDetector->SetSlit2SampleDistance
|
||||
(fSlit2DistanceCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit3DistanceCmd)
|
||||
fDetector->SetSlit3SampleDistance
|
||||
(fSlit3DistanceCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit4DistanceCmd)
|
||||
fDetector->SetSlit4SampleDistance
|
||||
(fSlit4DistanceCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit1xApertureCmd)
|
||||
fDetector->SetSlit1xAperture
|
||||
(fSlit1xApertureCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit2xApertureCmd)
|
||||
fDetector->SetSlit2xAperture
|
||||
(fSlit2xApertureCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit3xApertureCmd)
|
||||
fDetector->SetSlit3xAperture
|
||||
(fSlit3xApertureCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit4xApertureCmd)
|
||||
fDetector->SetSlit4xAperture
|
||||
(fSlit4xApertureCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit1yApertureCmd)
|
||||
fDetector->SetSlit1yAperture
|
||||
(fSlit1yApertureCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit2yApertureCmd)
|
||||
fDetector->SetSlit2yAperture
|
||||
(fSlit2yApertureCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit3yApertureCmd)
|
||||
fDetector->SetSlit3yAperture
|
||||
(fSlit3yApertureCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fSlit4yApertureCmd)
|
||||
fDetector->SetSlit4yAperture
|
||||
(fSlit4yApertureCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fDetectorThicknessCmd)
|
||||
fDetector->SetDetectorThickness
|
||||
(fDetectorThicknessCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fDetectorSizeCmd)
|
||||
fDetector->SetDetectorSize
|
||||
(fDetectorSizeCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fDetectorDistanceCmd)
|
||||
fDetector->SetDetectorSampleDistance
|
||||
(fDetectorDistanceCmd->GetNewDoubleValue(newValue));
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSEventAction.cc
|
||||
/// \brief Implementation of the SAXSEventAction class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
#ifdef G4MULTITHREADED
|
||||
#include "G4MTRunManager.hh"
|
||||
#else
|
||||
#include "G4RunManager.hh"
|
||||
#endif
|
||||
|
||||
#include "G4Event.hh"
|
||||
#include "G4EventManager.hh"
|
||||
#include "G4HCofThisEvent.hh"
|
||||
#include "G4VHitsCollection.hh"
|
||||
#include "G4TrajectoryContainer.hh"
|
||||
#include "G4Trajectory.hh"
|
||||
#include "G4VVisManager.hh"
|
||||
#include "G4SDManager.hh"
|
||||
#include "G4UImanager.hh"
|
||||
#include "G4ios.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
|
||||
#include "SAXSAnalysis.hh"
|
||||
#include "SAXSEventAction.hh"
|
||||
#include "SAXSSensitiveDetectorHit.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
SAXSEventAction::SAXSEventAction():
|
||||
G4UserEventAction(),
|
||||
fSensitiveDetector_ID(-1),
|
||||
fVerboseLevel(0),
|
||||
fNRi(0),
|
||||
fNCi(0),
|
||||
fNDi(0),
|
||||
fEventWeight(0.)
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
SAXSEventAction::~SAXSEventAction() {}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void SAXSEventAction::BeginOfEventAction(const G4Event*)
|
||||
{
|
||||
fNRi = 0;
|
||||
fNCi = 0;
|
||||
fNDi = 0;
|
||||
fEventWeight = 1.;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void SAXSEventAction::EndOfEventAction(const G4Event* aEvent)
|
||||
{
|
||||
//instantiating The Sensitive Detector Manager
|
||||
G4SDManager* SDman = G4SDManager::GetSDMpointer();
|
||||
|
||||
//Hit Detection System
|
||||
if (fSensitiveDetector_ID==-1) {
|
||||
G4String SensitiveDetectorName;
|
||||
if (SDman->FindSensitiveDetector(SensitiveDetectorName="det",0)) {
|
||||
fSensitiveDetector_ID =
|
||||
SDman->GetCollectionID(SensitiveDetectorName="det/collection");
|
||||
}
|
||||
}
|
||||
|
||||
SensitiveDetectorHitsCollection* fSensitiveDetectorHC = 0;
|
||||
G4HCofThisEvent* HCE = aEvent->GetHCofThisEvent();
|
||||
|
||||
if (HCE) {
|
||||
if (fSensitiveDetector_ID != -1) {
|
||||
G4VHitsCollection* aHC = HCE->GetHC(fSensitiveDetector_ID);
|
||||
fSensitiveDetectorHC = (SensitiveDetectorHitsCollection*)(aHC);
|
||||
}
|
||||
}
|
||||
|
||||
//instantiating The Analysis Manager
|
||||
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
|
||||
|
||||
//get the Event Number
|
||||
G4int eventNumber =
|
||||
G4RunManager::GetRunManager()->GetCurrentEvent()->GetEventID();
|
||||
|
||||
//filling the SD scoring ntuple
|
||||
if (fSensitiveDetectorHC) {
|
||||
size_t vNumberOfHit = fSensitiveDetectorHC->entries();
|
||||
for (size_t i=0; i<vNumberOfHit; i++) {
|
||||
SAXSSensitiveDetectorHit* aHit = (*fSensitiveDetectorHC)[i];
|
||||
analysisManager->FillNtupleDColumn(0,0,aHit->GetEnergy()/CLHEP::keV);
|
||||
analysisManager->FillNtupleDColumn(0,1,aHit->GetPos().x()/CLHEP::mm);
|
||||
analysisManager->FillNtupleDColumn(0,2,aHit->GetPos().y()/CLHEP::mm);
|
||||
analysisManager->FillNtupleDColumn(0,3,aHit->GetPos().z()/CLHEP::mm);
|
||||
analysisManager->FillNtupleDColumn(0,4,aHit->GetMom().x());
|
||||
analysisManager->FillNtupleDColumn(0,5,aHit->GetMom().y());
|
||||
analysisManager->FillNtupleDColumn(0,6,aHit->GetMom().z());
|
||||
analysisManager->FillNtupleDColumn(0,7,aHit->GetTime()/CLHEP::ns);
|
||||
analysisManager->FillNtupleIColumn(0,8,aHit->GetType());
|
||||
analysisManager->FillNtupleIColumn(0,9,aHit->GetTrackID());
|
||||
analysisManager->FillNtupleIColumn(0,10,fNRi);
|
||||
analysisManager->FillNtupleIColumn(0,11,fNCi);
|
||||
analysisManager->FillNtupleIColumn(0,12,fNDi);
|
||||
analysisManager->FillNtupleIColumn(0,13,eventNumber);
|
||||
analysisManager->FillNtupleDColumn(0,14,aHit->GetWeight());
|
||||
analysisManager->AddNtupleRow(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
@@ -0,0 +1,195 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSPhysicsList.cc
|
||||
/// \brief Implementation of the SAXSPhysicsList class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "SAXSPhysicsList.hh"
|
||||
#include "SAXSPhysicsListMessenger.hh"
|
||||
|
||||
#include "G4UnitsTable.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "globals.hh"
|
||||
|
||||
#include "G4ProcessManager.hh"
|
||||
#include "G4Threading.hh"
|
||||
|
||||
//Particles
|
||||
#include "G4ParticleDefinition.hh"
|
||||
#include "G4ParticleTypes.hh"
|
||||
#include "G4ParticleTable.hh"
|
||||
|
||||
//EM Physics Lists
|
||||
#include "G4EmStandardPhysics.hh"
|
||||
#include "G4EmLivermorePhysics.hh"
|
||||
#include "G4EmPenelopePhysics.hh"
|
||||
#include "G4EmLowEPPhysics.hh"
|
||||
#include "G4EmStandardPhysics_option4.hh"
|
||||
#include "G4EmPenelopePhysicsMI.hh"
|
||||
|
||||
//EM options
|
||||
#include "G4EmSaturation.hh"
|
||||
#include "G4LossTableManager.hh"
|
||||
#include "G4UAtomicDeexcitation.hh"
|
||||
|
||||
//Hadronic and Extra Physics Lists
|
||||
#include "G4EmExtraPhysics.hh"
|
||||
#include "G4HadronPhysicsQGSP_BIC_HP.hh"
|
||||
#include "G4HadronElasticPhysicsHP.hh"
|
||||
#include "G4IonPhysics.hh"
|
||||
#include "G4StoppingPhysics.hh"
|
||||
|
||||
//Optical processes
|
||||
#include "G4Cerenkov.hh"
|
||||
#include "G4Scintillation.hh"
|
||||
#include "G4OpAbsorption.hh"
|
||||
#include "G4OpRayleigh.hh"
|
||||
#include "G4OpMieHG.hh"
|
||||
#include "G4OpBoundaryProcess.hh"
|
||||
|
||||
//Decays
|
||||
#include "G4Decay.hh"
|
||||
#include "G4DecayPhysics.hh"
|
||||
#include "G4RadioactiveDecayPhysics.hh"
|
||||
#include "G4PhysicsListHelper.hh"
|
||||
#include "G4RadioactiveDecayBase.hh"
|
||||
#include "G4NuclideTable.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSPhysicsList::SAXSPhysicsList():
|
||||
G4VUserPhysicsList(),
|
||||
fUseMIFlag(true),
|
||||
fPMessenger(0)
|
||||
{
|
||||
G4cout << "### PhysicsList instantiated ###" << G4endl;
|
||||
|
||||
G4LossTableManager::Instance();
|
||||
|
||||
//set default cuts value
|
||||
defaultCutValue = 0.1*mm;
|
||||
|
||||
//define the messenger
|
||||
fPMessenger = new SAXSPhysicsListMessenger(this);
|
||||
|
||||
//set verbosity
|
||||
SetVerboseLevel(1);
|
||||
|
||||
//particle list
|
||||
fParticleList = new G4DecayPhysics(verboseLevel);
|
||||
|
||||
//EM Physics
|
||||
fEmPhysicsList = new G4EmPenelopePhysics(verboseLevel);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSPhysicsList::~SAXSPhysicsList() {}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSPhysicsList::ConstructParticle()
|
||||
{
|
||||
fParticleList->ConstructParticle();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSPhysicsList::ConstructProcess()
|
||||
{
|
||||
//transportation
|
||||
AddTransportation();
|
||||
|
||||
//EM physics
|
||||
fEmPhysicsList->ConstructProcess();
|
||||
|
||||
//Atomic deexcitation
|
||||
G4VAtomDeexcitation* de = new G4UAtomicDeexcitation();
|
||||
de->SetFluo(true); //Activate deexcitation processes and fluorescence
|
||||
de->SetAuger(true); //Activate Auger effect if deexcitation is activated
|
||||
de->SetAugerCascade(true); //Activate Auger Cascade if deexcitation is activated
|
||||
de->SetPIXE(true); //Activate Particle Induced X-Ray Emission (PIXE)
|
||||
G4LossTableManager::Instance()->SetAtomDeexcitation(de);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSPhysicsList::SelectPhysicsList(const G4String& name)
|
||||
{
|
||||
if (verboseLevel>1) {
|
||||
G4cout << "### PhysicsList::SelectPhysicsList: <" << name << "> ###" << G4endl;
|
||||
}
|
||||
|
||||
if (name == "standard") {
|
||||
delete fEmPhysicsList;
|
||||
fEmPhysicsList = new G4EmStandardPhysics(verboseLevel);
|
||||
G4cout << "### selected Standard PhysicsList ###" << G4endl;
|
||||
} else if (name == "standard_option4") {
|
||||
delete fEmPhysicsList;
|
||||
fEmPhysicsList = new G4EmStandardPhysics_option4(verboseLevel);
|
||||
G4cout << "### selected Standard_option4 PhysicsList ###" << G4endl;
|
||||
} else if (name == "livermore") {
|
||||
delete fEmPhysicsList;
|
||||
fEmPhysicsList = new G4EmLivermorePhysics(verboseLevel);
|
||||
G4cout << "### selected Livermore PhysicsList ###" << G4endl;
|
||||
} else if (name == "penelope") {
|
||||
delete fEmPhysicsList;
|
||||
fEmPhysicsList = new G4EmPenelopePhysics(verboseLevel);
|
||||
G4cout << "### selected Penelope PhysicsList ###" << G4endl;
|
||||
} else if (name == "penelopeMI") {
|
||||
delete fEmPhysicsList;
|
||||
fEmPhysicsList = new G4EmPenelopePhysicsMI(verboseLevel,"G4EmPenelopeMI",fUseMIFlag);
|
||||
G4cout << "### selected Penelope PhysicsList with MI effects ###" << G4endl;
|
||||
} else if (name == "LowEP") {
|
||||
delete fEmPhysicsList;
|
||||
fEmPhysicsList = new G4EmLowEPPhysics(1,name);
|
||||
G4cout << "### selected LowEP PhysicsList ###" << G4endl;
|
||||
} else {
|
||||
G4cout << "### PhysicsList::SelectPhysicsList: <" << name
|
||||
<< ">"<< " is not defined ###" << G4endl;
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSPhysicsList::SetCuts()
|
||||
{
|
||||
//set the default cuts value for all particle types
|
||||
SetCutsWithDefault();
|
||||
if (verboseLevel>0) DumpCutValuesTable();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSPhysicsList::SetDefaultCutsValue(G4double value)
|
||||
{
|
||||
//define a new default cuts value
|
||||
defaultCutValue = value;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSPhysicsListMessenger.cc
|
||||
/// \brief Definition of the SAXSPhysicsListMessenger class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "SAXSPhysicsListMessenger.hh"
|
||||
#include "SAXSPhysicsList.hh"
|
||||
|
||||
#include "G4UIdirectory.hh"
|
||||
#include "G4UIcmdWithAnInteger.hh"
|
||||
#include "G4UIcmdWithADoubleAndUnit.hh"
|
||||
#include "G4UIcmdWithAString.hh"
|
||||
#include "G4UIcmdWithABool.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSPhysicsListMessenger::SAXSPhysicsListMessenger(SAXSPhysicsList* pPhys):
|
||||
G4UImessenger(),
|
||||
fPhysicsList(pPhys)
|
||||
{
|
||||
fPhysDir = new G4UIdirectory("/phys/");
|
||||
fPhysDir->SetGuidance("PhysicsList control");
|
||||
|
||||
fCutsCmd = new G4UIcmdWithADoubleAndUnit("/phys/setCuts",this);
|
||||
fCutsCmd->SetGuidance("set cuts");
|
||||
fCutsCmd->SetParameterName("cuts",false);
|
||||
fCutsCmd->SetUnitCategory("Length");
|
||||
fCutsCmd->SetRange("cuts>0.");
|
||||
fCutsCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
|
||||
|
||||
fListCmd = new G4UIcmdWithAString("/phys/SelectPhysicsList",this);
|
||||
fListCmd->SetGuidance("Select the EM physics list");
|
||||
fListCmd->SetParameterName("PList",false);
|
||||
fListCmd->AvailableForStates(G4State_PreInit);
|
||||
|
||||
fUseMIFlagCmd = new G4UIcmdWithABool("/phys/useMIFlag",this);
|
||||
fUseMIFlagCmd->SetGuidance
|
||||
("Enable (default) or disable MI for the PenelopeMI physics list");
|
||||
fUseMIFlagCmd->SetParameterName("useMIFlag", true);
|
||||
fUseMIFlagCmd->AvailableForStates(G4State_PreInit);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSPhysicsListMessenger::~SAXSPhysicsListMessenger()
|
||||
{
|
||||
delete fPhysDir;
|
||||
delete fCutsCmd;
|
||||
delete fListCmd;
|
||||
delete fUseMIFlagCmd;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSPhysicsListMessenger::SetNewValue(G4UIcommand* command,
|
||||
G4String newValue)
|
||||
{
|
||||
if (command == fCutsCmd)
|
||||
fPhysicsList->SetDefaultCutsValue(fCutsCmd->GetNewDoubleValue(newValue));
|
||||
if (command == fListCmd)
|
||||
fPhysicsList->SelectPhysicsList(newValue);
|
||||
if (command == fUseMIFlagCmd)
|
||||
fPhysicsList->SetUseMIFlag(fUseMIFlagCmd->GetNewBoolValue(newValue));
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSPrimaryGeneratorAction.cc
|
||||
/// \brief Implementation of the SAXSPrimaryGeneratorAction class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "SAXSPrimaryGeneratorAction.hh"
|
||||
#include "SAXSDetectorConstruction.hh"
|
||||
|
||||
#include "G4RunManager.hh"
|
||||
#include "G4Event.hh"
|
||||
#include "G4AutoLock.hh"
|
||||
#include "G4ParticleTable.hh"
|
||||
#include "G4ParticleDefinition.hh"
|
||||
|
||||
#include "Randomize.hh"
|
||||
|
||||
#include "G4GeneralParticleSource.hh"
|
||||
#include "G4ParticleGun.hh"
|
||||
|
||||
#include "G4PhysicalConstants.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
#include "globals.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSPrimaryGeneratorAction::SAXSPrimaryGeneratorAction() :
|
||||
G4VUserPrimaryGeneratorAction()
|
||||
{
|
||||
fParticleGPS = new G4GeneralParticleSource();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSPrimaryGeneratorAction::~SAXSPrimaryGeneratorAction()
|
||||
{
|
||||
delete fParticleGPS;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
|
||||
{
|
||||
fParticleGPS->GeneratePrimaryVertex(anEvent);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSRunAction.cc
|
||||
/// \brief Implementation of the SAXSRunAction class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "G4Run.hh"
|
||||
#include "G4RunManager.hh"
|
||||
#include "G4UnitsTable.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
|
||||
#include "SAXSRunAction.hh"
|
||||
#include "SAXSRunActionMessenger.hh"
|
||||
#include "SAXSDetectorConstruction.hh"
|
||||
#include "SAXSAnalysis.hh"
|
||||
|
||||
#include "G4SDManager.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSRunAction::SAXSRunAction():
|
||||
G4UserRunAction(),
|
||||
fIsFileOpened(false)
|
||||
{
|
||||
//set the number of events to print progress during the simulation
|
||||
G4RunManager::GetRunManager()->SetPrintProgress(10000);
|
||||
|
||||
//define the messenger
|
||||
fMessenger = new SAXSRunActionMessenger(this);
|
||||
|
||||
//default output filename (can be set through macro)
|
||||
fFileName = "output";
|
||||
|
||||
//Create the analysis manager
|
||||
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
|
||||
analysisManager->SetFileName(fFileName);
|
||||
analysisManager->SetNtupleMerging(true); //only for root
|
||||
analysisManager->SetVerboseLevel(1);
|
||||
|
||||
//Creating the SD scoring ntuple
|
||||
analysisManager->CreateNtuple("part","Particle");
|
||||
analysisManager->CreateNtupleDColumn("e");
|
||||
analysisManager->CreateNtupleDColumn("posx");
|
||||
analysisManager->CreateNtupleDColumn("posy");
|
||||
analysisManager->CreateNtupleDColumn("posz");
|
||||
analysisManager->CreateNtupleDColumn("momx");
|
||||
analysisManager->CreateNtupleDColumn("momy");
|
||||
analysisManager->CreateNtupleDColumn("momz");
|
||||
analysisManager->CreateNtupleDColumn("t");
|
||||
analysisManager->CreateNtupleIColumn("type");
|
||||
analysisManager->CreateNtupleIColumn("trackID");
|
||||
analysisManager->CreateNtupleIColumn("NRi");
|
||||
analysisManager->CreateNtupleIColumn("NCi");
|
||||
analysisManager->CreateNtupleIColumn("NDi");
|
||||
analysisManager->CreateNtupleIColumn("eventID");
|
||||
analysisManager->CreateNtupleDColumn("weight");
|
||||
analysisManager->FinishNtuple();
|
||||
|
||||
//Creating ntuple for scattering
|
||||
analysisManager->CreateNtuple("scatt","Scattering");
|
||||
analysisManager->CreateNtupleIColumn("processID");
|
||||
analysisManager->CreateNtupleDColumn("e");
|
||||
analysisManager->CreateNtupleDColumn("theta");
|
||||
analysisManager->CreateNtupleDColumn("weight");
|
||||
analysisManager->FinishNtuple();
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSRunAction::~SAXSRunAction() {
|
||||
//write results
|
||||
if (fIsFileOpened)
|
||||
{
|
||||
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
|
||||
analysisManager->Write();
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSRunAction::BeginOfRunAction(const G4Run*)
|
||||
{
|
||||
//open the output file
|
||||
if (!fIsFileOpened)
|
||||
{
|
||||
G4AnalysisManager::Instance()->OpenFile(fFileName);
|
||||
fIsFileOpened = true;
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSRunAction::EndOfRunAction(const G4Run* run)
|
||||
{
|
||||
G4int nofEvents = run->GetNumberOfEvent();
|
||||
if (nofEvents == 0) return;
|
||||
|
||||
//print
|
||||
if (IsMaster()) {
|
||||
G4cout
|
||||
<< G4endl
|
||||
<< "--------------------End of Global Run-----------------------"
|
||||
<< G4endl
|
||||
<< " The run had " << nofEvents << " events";
|
||||
} else {
|
||||
G4cout
|
||||
<< G4endl
|
||||
<< "--------------------End of Local Run------------------------"
|
||||
<< G4endl
|
||||
<< " The run had " << nofEvents << " events";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSRunAction::SetFileName(G4String filename)
|
||||
{
|
||||
//method to set the output filename
|
||||
if (filename != "") fFileName = filename;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSRunActionMessenger.cc
|
||||
/// \brief Definition of the SAXSRunActionMessenger class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "SAXSRunActionMessenger.hh"
|
||||
#include "SAXSRunAction.hh"
|
||||
|
||||
#include "G4UIcmdWithAString.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSRunActionMessenger::SAXSRunActionMessenger(SAXSRunAction* runaction):
|
||||
G4UImessenger(),
|
||||
fSetFileNameCmd(0)
|
||||
{
|
||||
fRunAction = runaction;
|
||||
|
||||
fSetFileNameCmd = new G4UIcmdWithAString("/run/setfilenamesave",this);
|
||||
fSetFileNameCmd->SetGuidance("Set File Name Save");
|
||||
fSetFileNameCmd->SetParameterName("SetFileNameSave",false);
|
||||
fSetFileNameCmd->SetDefaultValue("output");
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSRunActionMessenger::~SAXSRunActionMessenger() {delete fSetFileNameCmd;}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSRunActionMessenger::SetNewValue(G4UIcommand* command,G4String newValue)
|
||||
{
|
||||
if (command == fSetFileNameCmd) fRunAction->SetFileName(newValue);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSSensitiveDetector.cc
|
||||
/// \brief Implementation of the SAXSSensitiveDetector class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
#include "SAXSSensitiveDetector.hh"
|
||||
#include "SAXSSensitiveDetectorHit.hh"
|
||||
|
||||
#include "G4HCofThisEvent.hh"
|
||||
#include "G4TouchableHistory.hh"
|
||||
#include "G4Track.hh"
|
||||
#include "G4Step.hh"
|
||||
#include "G4SDManager.hh"
|
||||
#include "G4Navigator.hh"
|
||||
#include "G4ios.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
SAXSSensitiveDetector::SAXSSensitiveDetector(G4String name):
|
||||
G4VSensitiveDetector(name)
|
||||
{
|
||||
G4String HCname;
|
||||
collectionName.insert(HCname="collection");
|
||||
fHCID = -1;
|
||||
|
||||
fVarStopAndKill = true;
|
||||
|
||||
fSDMessenger = new SAXSSensitiveDetectorMessenger(this);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
SAXSSensitiveDetector::~SAXSSensitiveDetector() {}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void SAXSSensitiveDetector::Initialize(G4HCofThisEvent* HCE)
|
||||
{
|
||||
fHitsCollection =
|
||||
new SensitiveDetectorHitsCollection(SensitiveDetectorName,collectionName[0]);
|
||||
if(fHCID<0)
|
||||
fHCID = G4SDManager::GetSDMpointer()->GetCollectionID(fHitsCollection);
|
||||
HCE->AddHitsCollection(fHCID,fHitsCollection);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
bool SAXSSensitiveDetector::ProcessHits(G4Step* aStep,G4TouchableHistory*)
|
||||
{
|
||||
G4Track* vTrack = aStep->GetTrack();
|
||||
|
||||
G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
|
||||
|
||||
G4ThreeVector worldPosition = preStepPoint->GetPosition();
|
||||
G4ThreeVector localPosition = preStepPoint->GetTouchableHandle()->
|
||||
GetHistory()->GetTopTransform().TransformPoint(worldPosition);
|
||||
|
||||
G4ThreeVector mom = preStepPoint->GetMomentumDirection();
|
||||
|
||||
//if the partcile is not on the boundary of the sensitive detector, return
|
||||
if (!(preStepPoint->GetStepStatus() == fGeomBoundary)) {return false;}
|
||||
|
||||
G4int vType = -1;
|
||||
if(preStepPoint->GetMass() == 0 && preStepPoint->GetCharge() == 0) {
|
||||
vType = 0;
|
||||
}
|
||||
else if(preStepPoint->GetMass() != 0 && preStepPoint->GetCharge() == 0) {
|
||||
vType = 1;
|
||||
}
|
||||
else if(preStepPoint->GetMass() != 0 && preStepPoint->GetCharge() > 0) {
|
||||
vType = 2;
|
||||
}
|
||||
else if(preStepPoint->GetMass() != 0 && preStepPoint->GetCharge() < 0) {
|
||||
vType = 3;
|
||||
}
|
||||
|
||||
//insert a hit
|
||||
SAXSSensitiveDetectorHit* aHit = new SAXSSensitiveDetectorHit();
|
||||
aHit->SetPos(localPosition);
|
||||
aHit->SetMom(mom);
|
||||
aHit->SetType(vType);
|
||||
aHit->SetEnergy(preStepPoint->GetKineticEnergy());
|
||||
aHit->SetTime(preStepPoint->GetGlobalTime());
|
||||
aHit->SetTrackID(vTrack->GetTrackID());
|
||||
aHit->SetWeight(vTrack->GetWeight());
|
||||
fHitsCollection->insert(aHit);
|
||||
|
||||
if (fVarStopAndKill) {vTrack->SetTrackStatus(fStopAndKill);}
|
||||
|
||||
return true;
|
||||
}
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void SAXSSensitiveDetector::EndOfEvent(G4HCofThisEvent*) {}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSSensitiveDetectorHit.cc
|
||||
/// \brief Implementation of the SAXSSensitiveDetectorHit class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
#include "SAXSSensitiveDetectorHit.hh"
|
||||
|
||||
#include "G4ios.hh"
|
||||
#include "G4VVisManager.hh"
|
||||
#include "G4Circle.hh"
|
||||
#include "G4Colour.hh"
|
||||
#include "G4AttDefStore.hh"
|
||||
#include "G4AttDef.hh"
|
||||
#include "G4AttValue.hh"
|
||||
#include "G4UIcommand.hh"
|
||||
#include "G4UnitsTable.hh"
|
||||
#include "G4VisAttributes.hh"
|
||||
#include "G4LogicalVolume.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
G4ThreadLocal G4Allocator<SAXSSensitiveDetectorHit>* hitAllocator = nullptr;
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
SAXSSensitiveDetectorHit::SAXSSensitiveDetectorHit() :
|
||||
G4VHit()
|
||||
{
|
||||
fTime = 0.;
|
||||
fPos = G4ThreeVector(0.,0.,0.);
|
||||
fMom = G4ThreeVector(0.,0.,0.);
|
||||
fEnergy = 0.;
|
||||
fType = -1;
|
||||
fTrackID = -1;
|
||||
fWeight = -1;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
SAXSSensitiveDetectorHit::SAXSSensitiveDetectorHit(const SAXSSensitiveDetectorHit &right):
|
||||
G4VHit()
|
||||
{
|
||||
fTrackID = right.fTrackID;
|
||||
fTrackIDP = right.fTrackIDP;
|
||||
fPos = right.fPos;
|
||||
fMom = right.fMom;
|
||||
fTime = right.fTime;
|
||||
fEnergy = right.fEnergy;
|
||||
fType = right.fType;
|
||||
fWeight = right.fWeight;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
const SAXSSensitiveDetectorHit& SAXSSensitiveDetectorHit::operator=
|
||||
(const SAXSSensitiveDetectorHit &right)
|
||||
{
|
||||
fTrackID = right.fTrackID;
|
||||
fTrackIDP = right.fTrackIDP;
|
||||
fPos = right.fPos;
|
||||
fMom = right.fMom;
|
||||
fTime = right.fTime;
|
||||
fEnergy = right.fEnergy;
|
||||
fType = right.fType;
|
||||
fWeight = right.fWeight;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
int SAXSSensitiveDetectorHit::operator==(const SAXSSensitiveDetectorHit &) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void SAXSSensitiveDetectorHit::Draw()
|
||||
{
|
||||
G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance();
|
||||
if (pVVisManager)
|
||||
{
|
||||
G4Circle circle(fPos);
|
||||
circle.SetScreenSize(2);
|
||||
circle.SetFillStyle(G4Circle::filled);
|
||||
G4Colour colour(1.,1.,0.);
|
||||
G4VisAttributes attribs(colour);
|
||||
circle.SetVisAttributes(attribs);
|
||||
pVVisManager->Draw(circle);
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void SAXSSensitiveDetectorHit::Print()
|
||||
{
|
||||
G4cout << " Hit at time " << fTime/ns
|
||||
<< " (nsec) - pos(x,y,z) " << fPos/mm
|
||||
<< " (mm) - mom(x,y,z) " << fMom/eV << " eV" << G4endl;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSSensitiveDetectorMessenger.cc
|
||||
/// \brief Implementation of the SAXSSensitiveDetectorMessenger class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#include "SAXSSensitiveDetectorMessenger.hh"
|
||||
#include "SAXSSensitiveDetector.hh"
|
||||
|
||||
#include "G4UIdirectory.hh"
|
||||
#include "G4UIcmdWithABool.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSSensitiveDetectorMessenger::SAXSSensitiveDetectorMessenger(SAXSSensitiveDetector* SD):
|
||||
G4UImessenger(), fSenDet(SD)
|
||||
{
|
||||
fSenDetDir = new G4UIdirectory("/sd/");
|
||||
fSenDetDir->SetGuidance("Sensitive Detector control.");
|
||||
|
||||
fUserStopAndKillCmd = new G4UIcmdWithABool("/sd/setSK", this);
|
||||
fUserStopAndKillCmd->SetGuidance("bStopAndKill: (1) true, (0) false.");
|
||||
fUserStopAndKillCmd->SetParameterName("bStopAndKill", true);
|
||||
fUserStopAndKillCmd->SetDefaultValue(false);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSSensitiveDetectorMessenger::~SAXSSensitiveDetectorMessenger()
|
||||
{
|
||||
delete fSenDetDir;
|
||||
delete fUserStopAndKillCmd;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSSensitiveDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue)
|
||||
{
|
||||
if (command == fUserStopAndKillCmd)
|
||||
fSenDet->SetVarStopAndKill(fUserStopAndKillCmd->GetNewBoolValue(newValue));
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -0,0 +1,172 @@
|
||||
//
|
||||
// ********************************************************************
|
||||
// * 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. *
|
||||
// ********************************************************************
|
||||
//
|
||||
/// \file SAXSSteppingAction.cc
|
||||
/// \brief Definition of the SAXSSteppingAction class
|
||||
//
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
#ifdef G4MULTITHREADED
|
||||
#include "G4MTRunManager.hh"
|
||||
#else
|
||||
#include "G4RunManager.hh"
|
||||
#endif
|
||||
|
||||
#include "G4Event.hh"
|
||||
#include "G4EventManager.hh"
|
||||
#include "G4HCofThisEvent.hh"
|
||||
#include "G4VHitsCollection.hh"
|
||||
#include "G4TrajectoryContainer.hh"
|
||||
#include "G4Trajectory.hh"
|
||||
#include "G4VVisManager.hh"
|
||||
#include "G4SDManager.hh"
|
||||
#include "G4UImanager.hh"
|
||||
#include "G4ios.hh"
|
||||
#include "G4SystemOfUnits.hh"
|
||||
|
||||
#include "SAXSSteppingAction.hh"
|
||||
#include "SAXSEventAction.hh"
|
||||
#include "SAXSDetectorConstruction.hh"
|
||||
#include "SAXSAnalysis.hh"
|
||||
|
||||
#include "G4Step.hh"
|
||||
#include "G4Track.hh"
|
||||
#include "G4OpticalPhoton.hh"
|
||||
|
||||
#include <cmath>
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSSteppingAction::SAXSSteppingAction(SAXSEventAction* eventAction):
|
||||
G4UserSteppingAction(),
|
||||
fEventAction(eventAction),
|
||||
fPhantom(0),
|
||||
fEventNumber(-1),
|
||||
fNSe(0)
|
||||
{}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
SAXSSteppingAction::~SAXSSteppingAction() {}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void SAXSSteppingAction::UserSteppingAction(const G4Step* step)
|
||||
{
|
||||
//DetectorConstruction instance
|
||||
const SAXSDetectorConstruction* detectorConstruction =
|
||||
static_cast<const SAXSDetectorConstruction*>
|
||||
(G4RunManager::GetRunManager()->GetUserDetectorConstruction());
|
||||
|
||||
//get Phantom volume
|
||||
fPhantom = detectorConstruction->GetPhantom();
|
||||
|
||||
//get pre and post step points
|
||||
G4StepPoint* preStepPoint = step->GetPreStepPoint();
|
||||
G4StepPoint* postStepPoint = step->GetPostStepPoint();
|
||||
|
||||
//get the volume of the current step
|
||||
G4LogicalVolume* volume = preStepPoint->GetTouchableHandle()
|
||||
->GetVolume()->GetLogicalVolume();
|
||||
|
||||
//get track and particle name
|
||||
G4Track* track = step->GetTrack();
|
||||
G4int ID = track->GetTrackID();
|
||||
G4String partName = track->GetDefinition()->GetParticleName();
|
||||
|
||||
//update the primary particle (event) weight
|
||||
G4double PrimaryWeight = 1.;
|
||||
if (partName == "gamma" && ID==1) {
|
||||
PrimaryWeight = track->GetWeight();
|
||||
fEventAction->UpdateEventWeight(PrimaryWeight);
|
||||
}
|
||||
|
||||
//if the particle is not a primary photon stepping in the phantom, exit!
|
||||
if (volume != fPhantom || partName != "gamma" || ID!=1) return;
|
||||
|
||||
//if it is a new event, reset variable values to 0
|
||||
G4int eventNumber = G4RunManager::GetRunManager()
|
||||
->GetCurrentEvent()->GetEventID();
|
||||
if (eventNumber != fEventNumber) {
|
||||
fEventNumber = eventNumber;
|
||||
fNSe = 0;
|
||||
}
|
||||
|
||||
//identify the process that occurred
|
||||
G4String Process;
|
||||
if (postStepPoint->GetProcessDefinedStep() != NULL) {
|
||||
Process = postStepPoint->GetProcessDefinedStep()->GetProcessName();
|
||||
} else {
|
||||
Process = "UserLimit";
|
||||
}
|
||||
//G4cout << "Process: " << Process << G4endl;
|
||||
G4int ProcIndex = -1;
|
||||
if (Process == "Transportation" || Process == "CoupledTransportation"
|
||||
|| Process == "UserLimit") {
|
||||
ProcIndex = 0;
|
||||
}
|
||||
if (Process == "Rayl" || Process == "biasWrapper(Rayl)") {
|
||||
ProcIndex = 1;
|
||||
fNSe++;
|
||||
fEventAction->AddNRi();
|
||||
}
|
||||
if (Process == "compt" || Process == "biasWrapper(compt)") {
|
||||
ProcIndex = 2;
|
||||
fNSe++;
|
||||
fEventAction->AddNCi();
|
||||
}
|
||||
if (Process == "phot" || Process == "biasWrapper(phot)") ProcIndex = 3;
|
||||
if (Process == "conv" || Process == "biasWrapper(conv)") ProcIndex = 4;
|
||||
if (Process == "photonNuclear" ||
|
||||
Process == "biasWrapper(photonNuclear)") {
|
||||
ProcIndex = 5;
|
||||
}
|
||||
if (Process == "PowderDiffraction" ||
|
||||
Process == "biasWrapper(PowderDiffraction)") {
|
||||
ProcIndex = 6;
|
||||
fNSe++;
|
||||
fEventAction->AddNDi();
|
||||
}
|
||||
//G4cout << "ProcIndex: " << ProcIndex << G4endl;
|
||||
|
||||
//calculate the scattering angle
|
||||
G4ThreeVector mom1 = preStepPoint->GetMomentumDirection();
|
||||
G4ThreeVector mom2 = postStepPoint->GetMomentumDirection();
|
||||
G4double theta = mom1.angle(mom2);
|
||||
|
||||
//fill the Scattering ntuple
|
||||
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
|
||||
if (theta > 1e-6) { //record only if the angle is not 0
|
||||
analysisManager->FillNtupleIColumn(1,0,ProcIndex);
|
||||
analysisManager->FillNtupleDColumn(1,1,
|
||||
preStepPoint->GetKineticEnergy()/CLHEP::keV);
|
||||
analysisManager->FillNtupleDColumn(1,2,theta/CLHEP::deg);
|
||||
analysisManager->FillNtupleDColumn(1,3,track->GetWeight());
|
||||
analysisManager->AddNtupleRow(1);
|
||||
}
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
Reference in New Issue
Block a user