Files
geant4/examples/extended/optical/wls/src/WLSMaterials.cc
T
2016-06-10 12:08:39 +02:00

419 lines
15 KiB
C++

//
// ********************************************************************
// * 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: WLSMaterials.cc 82854 2014-07-14 09:08:25Z gcosmo $
//
/// \file optical/wls/src/WLSMaterials.cc
/// \brief Implementation of the WLSMaterials class
//
//
#include "WLSMaterials.hh"
#include "G4SystemOfUnits.hh"
WLSMaterials* WLSMaterials::fInstance = 0;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
WLSMaterials::WLSMaterials()
{
fNistMan = G4NistManager::Instance();
fNistMan->SetVerbose(2);
CreateMaterials();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
WLSMaterials::~WLSMaterials()
{
delete fPMMA;
delete fPethylene;
delete fFPethylene;
delete fPolystyrene;
delete fSilicone;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
WLSMaterials* WLSMaterials::GetInstance()
{
if (fInstance == 0)
{
fInstance = new WLSMaterials();
}
return fInstance;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4Material* WLSMaterials::GetMaterial(const G4String material)
{
G4Material* mat = fNistMan->FindOrBuildMaterial(material);
if (!mat) mat = G4Material::GetMaterial(material);
if (!mat) {
std::ostringstream o;
o << "Material " << material << " not found!";
G4Exception("WLSMaterials::GetMaterial","",
FatalException,o.str().c_str());
}
return mat;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void WLSMaterials::CreateMaterials()
{
G4double density;
G4int ncomponents;
G4double fractionmass;
std::vector<G4int> natoms;
std::vector<G4double> fractionMass;
std::vector<G4String> elements;
// Materials Definitions
// =====================
//--------------------------------------------------
// Vacuum
//--------------------------------------------------
fNistMan->FindOrBuildMaterial("G4_Galactic");
//--------------------------------------------------
// Air
//--------------------------------------------------
fAir = fNistMan->FindOrBuildMaterial("G4_AIR");
//--------------------------------------------------
// WLSfiber PMMA
//--------------------------------------------------
elements.push_back("C"); natoms.push_back(5);
elements.push_back("H"); natoms.push_back(8);
elements.push_back("O"); natoms.push_back(2);
density = 1.190*g/cm3;
fPMMA = fNistMan->
ConstructNewMaterial("PMMA", elements, natoms, density);
elements.clear();
natoms.clear();
//--------------------------------------------------
// Cladding (polyethylene)
//--------------------------------------------------
elements.push_back("C"); natoms.push_back(2);
elements.push_back("H"); natoms.push_back(4);
density = 1.200*g/cm3;
fPethylene = fNistMan->
ConstructNewMaterial("Pethylene", elements, natoms, density);
elements.clear();
natoms.clear();
//--------------------------------------------------
// Double Cladding (fluorinated polyethylene)
//--------------------------------------------------
elements.push_back("C"); natoms.push_back(2);
elements.push_back("H"); natoms.push_back(4);
density = 1.400*g/cm3;
fFPethylene = fNistMan->
ConstructNewMaterial("FPethylene", elements, natoms, density);
elements.clear();
natoms.clear();
//--------------------------------------------------
// Polystyrene
//--------------------------------------------------
elements.push_back("C"); natoms.push_back(8);
elements.push_back("H"); natoms.push_back(8);
density = 1.050*g/cm3;
fPolystyrene = fNistMan->
ConstructNewMaterial("Polystyrene", elements, natoms, density);
elements.clear();
natoms.clear();
//--------------------------------------------------
// Silicone (Template for Optical Grease)
//--------------------------------------------------
elements.push_back("C"); natoms.push_back(2);
elements.push_back("H"); natoms.push_back(6);
density = 1.060*g/cm3;
fSilicone = fNistMan->
ConstructNewMaterial("Silicone", elements, natoms, density);
elements.clear();
natoms.clear();
//--------------------------------------------------
// Aluminium
//--------------------------------------------------
fNistMan->FindOrBuildMaterial("G4_Al");
//--------------------------------------------------
// TiO2
//--------------------------------------------------
elements.push_back("Ti"); natoms.push_back(1);
elements.push_back("O"); natoms.push_back(2);
density = 4.26*g/cm3;
G4Material* TiO2 = fNistMan->
ConstructNewMaterial("TiO2", elements, natoms, density);
elements.clear();
natoms.clear();
//--------------------------------------------------
// Scintillator Coating - 15% TiO2 and 85% polystyrene by weight.
//--------------------------------------------------
density = 1.52*g/cm3;
fCoating =
new G4Material("Coating", density, ncomponents=2);
fCoating->AddMaterial(TiO2, fractionmass = 15*perCent);
fCoating->AddMaterial(fPolystyrene, fractionmass = 85*perCent);
//
// ------------ Generate & Add Material Properties Table ------------
//
G4double photonEnergy[] =
{2.00*eV,2.03*eV,2.06*eV,2.09*eV,2.12*eV,
2.15*eV,2.18*eV,2.21*eV,2.24*eV,2.27*eV,
2.30*eV,2.33*eV,2.36*eV,2.39*eV,2.42*eV,
2.45*eV,2.48*eV,2.51*eV,2.54*eV,2.57*eV,
2.60*eV,2.63*eV,2.66*eV,2.69*eV,2.72*eV,
2.75*eV,2.78*eV,2.81*eV,2.84*eV,2.87*eV,
2.90*eV,2.93*eV,2.96*eV,2.99*eV,3.02*eV,
3.05*eV,3.08*eV,3.11*eV,3.14*eV,3.17*eV,
3.20*eV,3.23*eV,3.26*eV,3.29*eV,3.32*eV,
3.35*eV,3.38*eV,3.41*eV,3.44*eV,3.47*eV};
const G4int nEntries = sizeof(photonEnergy)/sizeof(G4double);
//--------------------------------------------------
// Air
//--------------------------------------------------
G4double refractiveIndex[] =
{ 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00};
assert(sizeof(refractiveIndex) == sizeof(photonEnergy));
G4MaterialPropertiesTable* mpt = new G4MaterialPropertiesTable();
mpt->AddProperty("RINDEX", photonEnergy, refractiveIndex, nEntries);
fAir->SetMaterialPropertiesTable(mpt);
//--------------------------------------------------
// PMMA for WLSfibers
//--------------------------------------------------
G4double refractiveIndexWLSfiber[] =
{ 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60,
1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60,
1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60,
1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60,
1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60};
assert(sizeof(refractiveIndexWLSfiber) == sizeof(photonEnergy));
G4double absWLSfiber[] =
{5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,
5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,
5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,5.40*m,1.10*m,
1.10*m,1.10*m,1.10*m,1.10*m,1.10*m,1.10*m, 1.*mm, 1.*mm, 1.*mm, 1.*mm,
1.*mm, 1.*mm, 1.*mm, 1.*mm, 1.*mm, 1.*mm, 1.*mm, 1.*mm, 1.*mm, 1.*mm};
assert(sizeof(absWLSfiber) == sizeof(photonEnergy));
G4double emissionFib[] =
{0.05, 0.10, 0.30, 0.50, 0.75, 1.00, 1.50, 1.85, 2.30, 2.75,
3.25, 3.80, 4.50, 5.20, 6.00, 7.00, 8.50, 9.50, 11.1, 12.4,
12.9, 13.0, 12.8, 12.3, 11.1, 11.0, 12.0, 11.0, 17.0, 16.9,
15.0, 9.00, 2.50, 1.00, 0.05, 0.00, 0.00, 0.00, 0.00, 0.00,
0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00};
assert(sizeof(emissionFib) == sizeof(photonEnergy));
// Add entries into properties table
G4MaterialPropertiesTable* mptWLSfiber = new G4MaterialPropertiesTable();
mptWLSfiber->
AddProperty("RINDEX",photonEnergy,refractiveIndexWLSfiber,nEntries);
// mptWLSfiber->AddProperty("ABSLENGTH",photonEnergy,absWLSfiber,nEntries);
mptWLSfiber->AddProperty("WLSABSLENGTH",photonEnergy,absWLSfiber,nEntries);
mptWLSfiber->AddProperty("WLSCOMPONENT",photonEnergy,emissionFib,nEntries);
mptWLSfiber->AddConstProperty("WLSTIMECONSTANT", 0.5*ns);
fPMMA->SetMaterialPropertiesTable(mptWLSfiber);
//--------------------------------------------------
// Polyethylene
//--------------------------------------------------
G4double refractiveIndexClad1[] =
{ 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49,
1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49,
1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49,
1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49,
1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49};
assert(sizeof(refractiveIndexClad1) == sizeof(photonEnergy));
G4double absClad[] =
{20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,
20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,
20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,
20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,
20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m,20.0*m};
assert(sizeof(absClad) == sizeof(photonEnergy));
// Add entries into properties table
G4MaterialPropertiesTable* mptClad1 = new G4MaterialPropertiesTable();
mptClad1->AddProperty("RINDEX",photonEnergy,refractiveIndexClad1,nEntries);
mptClad1->AddProperty("ABSLENGTH",photonEnergy,absClad,nEntries);
fPethylene->SetMaterialPropertiesTable(mptClad1);
//--------------------------------------------------
// Fluorinated Polyethylene
//--------------------------------------------------
G4double refractiveIndexClad2[] =
{ 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42,
1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42,
1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42,
1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42,
1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42};
assert(sizeof(refractiveIndexClad2) == sizeof(photonEnergy));
// Add entries into properties table
G4MaterialPropertiesTable* mptClad2 = new G4MaterialPropertiesTable();
mptClad2->AddProperty("RINDEX",photonEnergy,refractiveIndexClad2,nEntries);
mptClad2->AddProperty("ABSLENGTH",photonEnergy,absClad,nEntries);
fFPethylene->SetMaterialPropertiesTable(mptClad2);
//--------------------------------------------------
// Silicone
//--------------------------------------------------
G4double refractiveIndexSilicone[] =
{ 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46,
1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46,
1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46,
1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46,
1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46, 1.46};
assert(sizeof(refractiveIndexSilicone) == sizeof(photonEnergy));
// Add entries into properties table
G4MaterialPropertiesTable* mptSilicone = new G4MaterialPropertiesTable();
mptSilicone->
AddProperty("RINDEX",photonEnergy,refractiveIndexSilicone,nEntries);
mptSilicone->AddProperty("ABSLENGTH",photonEnergy,absClad,nEntries);
fSilicone->SetMaterialPropertiesTable(mptSilicone);
//--------------------------------------------------
// Polystyrene
//--------------------------------------------------
G4double refractiveIndexPS[] =
{ 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50,
1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50,
1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50,
1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50,
1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50};
assert(sizeof(refractiveIndexPS) == sizeof(photonEnergy));
G4double absPS[] =
{2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,
2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,
2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,
2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,
2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm,2.*cm};
assert(sizeof(absPS) == sizeof(photonEnergy));
G4double scintilFast[] =
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
assert(sizeof(scintilFast) == sizeof(photonEnergy));
// Add entries into properties table
G4MaterialPropertiesTable* mptPolystyrene = new G4MaterialPropertiesTable();
mptPolystyrene->AddProperty("RINDEX",photonEnergy,refractiveIndexPS,nEntries);
mptPolystyrene->AddProperty("ABSLENGTH",photonEnergy,absPS,nEntries);
mptPolystyrene->
AddProperty("FASTCOMPONENT",photonEnergy, scintilFast,nEntries);
mptPolystyrene->AddConstProperty("SCINTILLATIONYIELD",10./keV);
mptPolystyrene->AddConstProperty("RESOLUTIONSCALE",1.0);
mptPolystyrene->AddConstProperty("FASTTIMECONSTANT", 10.*ns);
fPolystyrene->SetMaterialPropertiesTable(mptPolystyrene);
// Set the Birks Constant for the Polystyrene scintillator
fPolystyrene->GetIonisation()->SetBirksConstant(0.126*mm/MeV);
}