Files
geant4/examples/advanced/microbeam/src/DetectorConstruction.cc
T
2021-06-25 16:12:29 +02:00

723 lines
25 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. *
// ********************************************************************
//
// This example is provided by the Geant4-DNA collaboration
// Any report or published results obtained using the Geant4-DNA software
// shall cite the following Geant4-DNA collaboration publication:
// Med. Phys. 37 (2010) 4692-4708
// The Geant4-DNA web site is available at http://geant4-dna.org
//
// If you use this example, please cite the following publication:
// Rad. Prot. Dos. 133 (2009) 2-11
#include "DetectorConstruction.hh"
#include "G4PhysicalConstants.hh"
#include "G4SystemOfUnits.hh"
#include "G4MagIntegratorDriver.hh"
#include "G4AutoDelete.hh"
DetectorConstruction::DetectorConstruction()
:fDefaultMaterial(nullptr),fCollimatorMaterial(nullptr),fBoiteMaterial(nullptr),
fCathodeMaterial(nullptr),fVerreMaterial(nullptr),fVerre2Material(nullptr),
fKgmMaterial(nullptr),fBoite2Material(nullptr),fBoite3Material(nullptr),
fNucleusMaterial1(nullptr),fCytoplasmMaterial1(nullptr),
fNucleusMaterial2(nullptr),fCytoplasmMaterial2(nullptr),
fNucleusMaterial3(nullptr),fCytoplasmMaterial3(nullptr),
fPhysiWorld(nullptr),fLogicWorld(nullptr),fSolidWorld(nullptr),
fPhysiVol(nullptr),fLogicVol(nullptr),fSolidVol(nullptr),
fPhysiBoite(nullptr),fLogicBoite(nullptr),fSolidBoite(nullptr),
fPhysiYoke1(nullptr),fLogicYoke1(nullptr),fSolidYoke1(nullptr),
fPhysi1Gap(nullptr),fLogic1Gap(nullptr),fSolid1Gap(nullptr),
fPhysi2Gap(nullptr),fLogic2Gap(nullptr),fSolid2Gap(nullptr),
fPhysi3Gap(nullptr),fLogic3Gap(nullptr),fSolid3Gap(nullptr),
fPhysiYoke2(nullptr),fLogicYoke2(nullptr),fSolidYoke2(nullptr),
fPhysi4Gap(nullptr),fLogic4Gap(nullptr),fSolid4Gap(nullptr),
fPhysi5Gap(nullptr),fLogic5Gap(nullptr),fSolid5Gap(nullptr),
fPhysiBoiteIso(nullptr),fLogicBoiteIso(nullptr),fSolidBoiteIso(nullptr),
fPhysiCathode(nullptr),fLogicCathode(nullptr),fSolidCathode(nullptr),
fPhysiIso(nullptr),fLogicIso(nullptr),fSolidIso(nullptr),
fPhysiVerre(nullptr),fLogicVerre(nullptr),fSolidVerre(nullptr),
fPhysiBoite2(nullptr),fLogicBoite2(nullptr),fSolidBoite2(nullptr),
fPhysiBoite3(nullptr),fLogicBoite3(nullptr),fSolidBoite3(nullptr),
fPhysiKgm(nullptr),fLogicKgm(nullptr),fSolidKgm(nullptr),
fPhysiVerre2(nullptr),fLogicVerre2(nullptr),fSolidVerre2(nullptr),
fPhysiPhantom(nullptr),fLogicPhantom(nullptr),fSolidPhantom(nullptr)
{
DefineMaterials();
// Initialisation of variables which
// will then be appropriately fixed in methods of this class
// to implement the simulation geometry set-up
fDensityPhantom = 0.; // in g/cm3
fDensityNucleus = 0.; // in g/cm3
fDensityCytoplasm = 0.; // in g/cm3
fWorldSizeXY=fWorldSizeZ=0.;
fCollObjSizeXY = 0.;
fCollObjSizeZ = 0.;
// TARGET POSITION
fCiblePositionX = 0.;
fCiblePositionY = 0.;
fCiblePositionZ = 0.;
// MICROBEAM LINE ANGLE
fLineAngle = 0.;
fNbOfPixelsInPhantom=0;
}
DetectorConstruction::~DetectorConstruction()
{}
G4VPhysicalVolume* DetectorConstruction::Construct()
{
if(fPhysiWorld) { return fPhysiWorld; }
return ConstructLine();
}
void DetectorConstruction::DefineMaterials()
{
G4String name, symbol;
G4double density;
G4int ncomponents, natoms,nel;
G4double z, a;
G4double fractionmass;
G4double temperature, pressure;
// Define Elements
G4Element* H = new G4Element ("Hydrogen", "H", 1. , 1.01*g/mole);
G4Element* N = new G4Element ("Nitrogen", "N", 7., 14.01*g/mole);
G4Element* O = new G4Element ("Oxygen" , "O", 8. , 16.00*g/mole);
G4Element* Ar = new G4Element ("Argon" , "Ar", 18., 39.948*g/mole );
G4Element* C = new G4Element ("Carbon","C", 6., 12.011*g/mole);
G4Element * Si = new G4Element ("Silicon","Si",14., 28.0855*g/mole);
G4Element * Cu = new G4Element ("Cuivre","Cu",29., 63.546*g/mole);
G4Element * Zn = new G4Element ("Zinc","Zn",30.,65.409*g/mole);
G4Element * P = new G4Element ("Phosphorus","P",15.,30.973761*g/mole);
// Vacuum standard definition...
density = universe_mean_density;
G4Material* vacuum = new G4Material(name="Vacuum", z=1., a=1.01*g/mole,
density);
// Water
density = 1.000*g/cm3;
G4Material* H2O = new G4Material(name="H2O" , density, ncomponents=2);
H2O->AddElement(H, natoms=2);
H2O->AddElement(O, natoms=1);
// Air
density = 1.290*mg/cm3;
pressure = 1*atmosphere;
temperature = 293.16*kelvin;
G4Material* Air = new G4Material(name="Air" , density, ncomponents=2, kStateGas, temperature, pressure);
Air->AddElement(N, fractionmass=0.7);
Air->AddElement(O, fractionmass=0.3);
// Low Pressure air
density = (5e-6/1013.)*1.290*mg/cm3; // 5e-6 mbar is the usual beam pipe air pressure
pressure = 1*atmosphere;
temperature = 293.16*kelvin;
G4Material* LPAir = new G4Material(name="LPAir" , density, ncomponents=3, kStateGas, temperature, pressure);
LPAir->AddElement(N, fractionmass=0.715);
LPAir->AddElement(O, fractionmass=0.25);
LPAir->AddElement(Ar, fractionmass=0.035);
// Platinum
a = 195.09*g/mole;
density = 21.4*g/cm3;
G4Material* Pt = new G4Material(name="Pl", z=78., a, density);
// Butane @ 10 mbar
density = 2.552e-2*mg/cm3;
pressure = 0.01*bar;
temperature = 293.16*kelvin;
G4Material* Butane = new G4Material(name = "Butane", density, nel = 2, kStateGas, temperature, pressure);
Butane->AddElement (C, natoms=4);
Butane->AddElement (H, natoms=10);
// Polypropylene
density = 0.9*g/cm3;
G4Material* Polyprop = new G4Material(name = "Polyprop", density, nel = 2);
Polyprop->AddElement (C,3);
Polyprop->AddElement (H,6);
// Si3N4
density = 3.44*g/cm3;
G4Material* Si3N4 = new G4Material(name = "Si3N4", density, nel = 2);
Si3N4->AddElement (Si, natoms=3);
Si3N4->AddElement (N, natoms=4);
// SiO2
density = 2.5*g/cm3;
G4Material* SiO2 = new G4Material(name = "SiO2", density, nel = 2);
SiO2->AddElement (Si, natoms=1);
SiO2->AddElement (O, natoms=2);
// Brass
density = 8.5*g/cm3;
G4Material* Laiton = new G4Material(name = "Laiton", density, nel = 2);
Laiton->AddElement (Cu,1);
Laiton->AddElement (Zn,1);
// Phantom
fDensityPhantom = 1.; // in g/cm3
// Nucleus composition from Alard et al., Rad. Res. 158, 650 (2002) and
// Comp. Math. Meth. Med. 147252 (2012)
//
// Cytoplasm composition is assumed to be water
// Cytoplasm
fDensityCytoplasm = 1.; // in g/cm3
density = fDensityCytoplasm*g/cm3;
G4Material* Cytoplasm1 = new G4Material(name="Cytoplasm1" , density, ncomponents=2);
Cytoplasm1->AddElement(H, fractionmass=0.112);
Cytoplasm1->AddElement(O, fractionmass=0.888);
// Nucleoli
fDensityCytoplasm = 1.;
// in g/cm3 (nucleoli are assumed to have the same chemical comp. as nucleus)
density = fDensityCytoplasm*g/cm3;
G4Material* Cytoplasm2 = new G4Material(name="Cytoplasm2" , density, ncomponents=5);
Cytoplasm2->AddElement(H, fractionmass=0.1064);
Cytoplasm2->AddElement(O, fractionmass=0.745);
Cytoplasm2->AddElement(C, fractionmass=0.0904);
Cytoplasm2->AddElement(N, fractionmass=0.0321);
Cytoplasm2->AddElement(P, fractionmass=0.0261);
// default is water
fDensityCytoplasm = 1.; // in g/cm3
density = fDensityCytoplasm*g/cm3;
G4Material* Cytoplasm3 = new G4Material(name="Cytoplasm3" , density, ncomponents=2);
Cytoplasm3->AddElement(H, fractionmass=0.112);
Cytoplasm3->AddElement(O, fractionmass=0.888);
// Nucleus chemical composition
fDensityNucleus = 1.; // in g/cm3
density = fDensityNucleus*g/cm3;
G4Material* Nucleus1 = new G4Material(name="Nucleus1" , density, ncomponents=5);
Nucleus1->AddElement(H, fractionmass=0.1064);
Nucleus1->AddElement(O, fractionmass=0.745);
Nucleus1->AddElement(C, fractionmass=0.0904);
Nucleus1->AddElement(N, fractionmass=0.0321);
Nucleus1->AddElement(P, fractionmass=0.0261);
fDensityNucleus = 1.; // in g/cm3
density = fDensityNucleus*g/cm3;
G4Material* Nucleus2 = new G4Material(name="Nucleus2" , density, ncomponents=5);
Nucleus2->AddElement(H, fractionmass=0.1064);
Nucleus2->AddElement(O, fractionmass=0.745);
Nucleus2->AddElement(C, fractionmass=0.0904);
Nucleus2->AddElement(N, fractionmass=0.0321);
Nucleus2->AddElement(P, fractionmass=0.0261);
// default
fDensityNucleus = 1.; // in g/cm3
density = fDensityNucleus*g/cm3;
G4Material* Nucleus3 = new G4Material(name="Nucleus3" , density, ncomponents=5);
Nucleus3->AddElement(H, fractionmass=0.1064);
Nucleus3->AddElement(O, fractionmass=0.745);
Nucleus3->AddElement(C, fractionmass=0.0904);
Nucleus3->AddElement(N, fractionmass=0.0321);
Nucleus3->AddElement(P, fractionmass=0.0261);
// Materials in setup
fDefaultMaterial = vacuum;
fCollimatorMaterial = Pt;
fBoiteMaterial = Butane;
fCathodeMaterial = Laiton;
fVerreMaterial = Si3N4;
fVerre2Material = SiO2;
fKgmMaterial = H2O;
fBoite2Material = Air;
fBoite3Material = Polyprop;
fNucleusMaterial1 = Nucleus1;
fCytoplasmMaterial1 = Cytoplasm1;
fNucleusMaterial2 = Nucleus2;
fCytoplasmMaterial2 = Cytoplasm2;
fNucleusMaterial3 = Nucleus3;
fCytoplasmMaterial3 = Cytoplasm3;
// DISPLAY MATERIALS
G4cout << G4endl << *(G4Material::GetMaterialTable()) << G4endl;
}
G4VPhysicalVolume* DetectorConstruction::ConstructLine()
{
// WORLD
fWorldSizeXY = 20*m;
fWorldSizeZ = 40*m;
// MICROBEAM LINE ANGLE
fLineAngle = 10*deg;
// TARGET POSITION
fCiblePositionX = -1461.42*mm;
fCiblePositionY = 0*mm;
fCiblePositionZ = -1327 + (955*std::cos(fLineAngle))*mm;
//*************
// WORLD VOLUME
//*************
fSolidWorld = new G4Box("World", //its name
fWorldSizeXY/2,fWorldSizeXY/2,fWorldSizeZ/2); //its size
fLogicWorld = new G4LogicalVolume(fSolidWorld, //its solid
fDefaultMaterial, //its material
"World"); //its name
fPhysiWorld = new G4PVPlacement(0, //no rotation
G4ThreeVector(), //at (0,0,0)
"World", //its name
fLogicWorld, //its logical volume
nullptr, //its mother volume
false, //no boolean operation
0); //copy number
//*****************
// FULL LINE VOLUME
//*****************
fSolidVol = new G4Box("Vol",
10.*m/2,10.*m/2,(14025)*mm/2);
fLogicVol = new G4LogicalVolume(fSolidVol,
fDefaultMaterial,
"Vol");
fPhysiVol = new G4PVPlacement(0,
G4ThreeVector(0,0,-2012.5*mm),
"Vol",
fLogicVol,
fPhysiWorld,
false,
0);
// *************************************************
// Whole microbeam line at 10 deg contained in a box
// *************************************************
G4double PosX = fCiblePositionX*mm +( (6958.3/2-3.3)*std::sin(fLineAngle))*mm;
G4double PosZ = (fCiblePositionZ+2012.5)*mm - ((6958.3/2-3.3)*std::cos(fLineAngle))*mm;
// Adjust box absolute position
PosX = PosX + 1.3 * micrometer * std::cos(fLineAngle);
PosZ = PosZ + 1.3 * micrometer * std::sin(fLineAngle);
G4RotationMatrix *rot = new G4RotationMatrix();
// rot->rotateX(0*deg);
rot->rotateY(10*deg);
// rot->rotateZ(0*deg);
fSolidBoite = new G4Box("Boite", 4*cm, 4*cm, 6958.3*mm/2);
fLogicBoite = new G4LogicalVolume(fSolidBoite, fDefaultMaterial, "Boite");
fPhysiBoite = new G4PVPlacement(rot,
G4ThreeVector(PosX,0,PosZ),
"Boite",
fLogicBoite,
fPhysiVol,
false,
0);
//*********************************************************************
// OBJECT COLLIMATOR (after switching magnet, 5 micrometer in diameter)
//*********************************************************************
fCollObjSizeXY = 8*cm;
fCollObjSizeZ = 0.07*mm;
fSolidYoke1 = new G4Box("_CollObj_yoke1_", fCollObjSizeXY/2,fCollObjSizeXY/2,fCollObjSizeZ/2);
fLogicYoke1 = new G4LogicalVolume(fSolidYoke1, fCollimatorMaterial, "_CollObj_yoke1_");
fPhysiYoke1 = new G4PVPlacement( 0, G4ThreeVector(0,0,6958.3*mm/2-3.3*mm-6955*mm+0.07*mm/2), fLogicYoke1,
"_CollObj_yoke1_",fLogicBoite, false, 0);
// --> FIRST PART
fSolid1Gap = new G4Cons("_CollObj_gap1_", 0.*micrometer, 6*micrometer,
0.*micrometer,2.5*micrometer,
3.5*micrometer,
0, twopi);
fLogic1Gap = new G4LogicalVolume(fSolid1Gap, fDefaultMaterial, "_CollObj_gap1_");
fPhysi1Gap = new G4PVPlacement(0, G4ThreeVector(0,0,0.0315*mm), fLogic1Gap, "_CollObj_gap1_",
fLogicYoke1, false, 0);
// --> SECOND PART
fSolid2Gap = new G4Cons("_CollObj_gap2_", 0.*micrometer, 15*micrometer,
0.*micrometer,6*micrometer,
6.5*micrometer,
0, twopi);
fLogic2Gap = new G4LogicalVolume(fSolid2Gap, fDefaultMaterial, "_CollObj_gap2_");
fPhysi2Gap = new G4PVPlacement(0, G4ThreeVector(0,0,0.0215*mm), fLogic2Gap, "_CollObj_gap2_",
fLogicYoke1, false, 0);
// --> THIRD PART
fSolid3Gap = new G4Cons("_CollObj_gap3_", 0.*micrometer, 105*micrometer,
0.*micrometer,15*micrometer,
25*micrometer,
0, twopi);
fLogic3Gap = new G4LogicalVolume(fSolid3Gap, fDefaultMaterial, "_CollObj_gap3_");
fPhysi3Gap = new G4PVPlacement(0, G4ThreeVector(0,0,-0.010*mm), fLogic3Gap, "_CollObj_gap3_", fLogicYoke1,
false, 0);
//************************
// GAS DETECTOR COLLIMATOR
//************************
fSolidYoke2 = new G4Box("_CollDet_yoke_", 2.5*cm, 2.5*cm, 0.035*mm);
fLogicYoke2 = new G4LogicalVolume(fSolidYoke2, fCollimatorMaterial, "_CollDet_yoke_");
fPhysiYoke2 = new G4PVPlacement(0,
G4ThreeVector(0,0,6958.3*mm/2-0.3*mm-3*mm-0.004*mm-0.1*mm-1*mm-2.5*mm-0.070*mm/2),
fLogicYoke2, "_CollDet_yoke_", fLogicBoite, false, 0);
// --> FIRST PART
fSolid4Gap = new G4Cons("_CollDet_gap4_", 0.*micrometer, 8*micrometer,
0.*micrometer,5*micrometer,
7.5*micrometer,
0, twopi);
fLogic4Gap = new G4LogicalVolume(fSolid4Gap, fDefaultMaterial, "_CollDet_gap4_");
fPhysi4Gap = new G4PVPlacement(0, G4ThreeVector(0,0,0.0275*mm), fLogic4Gap, "_CollDet_gap4_",
fLogicYoke2, false, 0);
// --> SECOND PART
fSolid5Gap = new G4Cons("_CollDet_gap5_", 0.*micrometer, 105*micrometer,
0.*micrometer,8*micrometer,
27.5*micrometer,
0, twopi);
fLogic5Gap = new G4LogicalVolume(fSolid5Gap, fDefaultMaterial, "_CollDet_gap5_");
fPhysi5Gap = new G4PVPlacement(0,
G4ThreeVector(0,0,-0.0075*mm),
fLogic5Gap,
"_CollDet_gap5_",
fLogicYoke2,
false,
0);
// ************
// GAS DETECTOR
// ************
fSolidBoiteIso = new G4Box("Isobutane", 2.5*cm, 2.5*cm, 1.75*mm);
fLogicBoiteIso = new G4LogicalVolume(fSolidBoiteIso, fBoiteMaterial, "Isobutane");
fPhysiBoiteIso = new G4PVPlacement(0,
G4ThreeVector(0,0,6958.3*mm/2-0.3*mm-3*mm-0.004*mm-0.1*mm-3.5*mm/2),
"Isobutane",
fLogicBoiteIso,
fPhysiBoite,
false,
0);
// --> GAS DETECTOR END CAP
fSolidCathode = new G4Box("_Laiton_", 2.5*cm, 2.5*cm, 0.5*mm);
fLogicCathode = new G4LogicalVolume(fSolidCathode, fCathodeMaterial, "_Laiton_");
fPhysiCathode = new G4PVPlacement(0,
G4ThreeVector(0,0,1.25*mm),
"_Laiton_",
fLogicCathode,
fPhysiBoiteIso,
false, 0);
// --> ISOBUTANE GAS
fSolidIso = new G4Box("_Iso_", 1.*mm, 1.*mm, 0.499925*mm);
fLogicIso = new G4LogicalVolume(fSolidIso, fBoiteMaterial, "_Iso_");
fPhysiIso = new G4PVPlacement(0,
G4ThreeVector(0,0,-0.000075*mm),
"_Iso_",
fLogicIso,
fPhysiCathode,
false,
0);
// --> Si3N4 WINDOW
fSolidVerre = new G4Box("_Si3N4_", 0.5*mm, 0.5*mm, 0.075*micrometer);
fLogicVerre = new G4LogicalVolume(fSolidVerre, fVerreMaterial, "_Si3N4_");
fPhysiVerre = new G4PVPlacement(0,
G4ThreeVector(0,0,0.499925*mm),
"_Si3N4_",
fLogicVerre,
fPhysiCathode,
false,
0);
// *******
// AIR GAP
// *******
fSolidBoite2 = new G4Box("_Air_", 2.5*cm, 2.5*cm, 0.1*mm/2);
fLogicBoite2 = new G4LogicalVolume(fSolidBoite2, fBoite2Material, "_Air_");
fPhysiBoite2 = new G4PVPlacement(0,
G4ThreeVector(0,0,6958.3*mm/2-0.3*mm-3*mm-0.004*mm-0.1*mm/2),
"_Air_",
fLogicBoite2,
fPhysiBoite,
false,
0);
//*************
// CELL SUPPORT
//*************
fSolidBoite3 = new G4Box("Polyprop", 2.5*cm, 2.5*cm, 0.004*mm/2);
fLogicBoite3 = new G4LogicalVolume(fSolidBoite3, fBoite3Material, "Polyprop");
fPhysiBoite3 = new G4PVPlacement(0,
G4ThreeVector(0,0,6958.3*mm/2-0.3*mm-3*mm-0.004*mm/2),
"Polyprop",
fLogicBoite3,
fPhysiBoite,
false,
0);
//****
// KGM
//****
fSolidKgm = new G4Box("KGM", 2.5*cm, 2.5*cm, 3*mm/2);
fLogicKgm = new G4LogicalVolume(fSolidKgm, fKgmMaterial, "KGM");
fPhysiKgm = new G4PVPlacement(0,
G4ThreeVector(0,0,6958.3*mm/2-0.3*mm-3*mm/2),
"KGM",
fLogicKgm,
fPhysiBoite,
false,
0);
//*****************
// MICROSCOPE PLATE
//*****************
fSolidVerre2 = new G4Box("_Lame_", 2.5*cm, 2.5*cm, 0.150*mm);
fLogicVerre2 = new G4LogicalVolume(fSolidVerre2, fVerre2Material, "_Lame_");
fPhysiVerre2 = new G4PVPlacement(0,
G4ThreeVector(0,0,6958.3*mm/2-0.3*mm/2),
"_Lame_",
fLogicVerre2,
fPhysiBoite,
false,
0);
// **************
// CELL CYTOPLASM
// **************
// WITHIN KGM
/*
fSolidCyto=new G4Ellipsoid("CYTO",25*micrometer, 25*micrometer, 11*micrometer);
fLogicCyto=new G4LogicalVolume (fSolidCyto, fDefaultMaterial, "CYTO");
fPhysiCyto=new G4PVPlacement(0, G4ThreeVector(0,0,-1.5*mm+11*micrometer),"CYTO",fLogicCyto, fPhysiKgm, false, 0);
*/
// ************
// CELL PHANTOM
// ************
fMyCellParameterisation = new CellParameterisation
(fNucleusMaterial1,fCytoplasmMaterial1,
fNucleusMaterial2,fCytoplasmMaterial2,
fNucleusMaterial3,fCytoplasmMaterial3);
fSolidPhantom = new G4Box("Phantom",
fMyCellParameterisation->GetPixelSizeX()/2,
fMyCellParameterisation->GetPixelSizeY()/2,
fMyCellParameterisation->GetPixelSizeZ()/2);
fLogicPhantom = new G4LogicalVolume(fSolidPhantom,fDefaultMaterial,"Phantom",0,0,0);
SetNbOfPixelsInPhantom (fMyCellParameterisation->GetPhantomTotalPixels());
SetMassNucleus(fMyCellParameterisation->GetNucleusMass());
SetMassCytoplasm(fMyCellParameterisation->GetCytoplasmMass());
fPhysiPhantom = new G4PVParameterised(
"Phantom", // their name
fLogicPhantom, // their logical volumr
//logicCyto, // Mother logical volume is Cyto
fLogicKgm, // Mother logical volume is Kgm
kUndefined, // Are placed along this axis
fMyCellParameterisation->GetPhantomTotalPixels(), // Number of boxes
fMyCellParameterisation,false); // The parametrisation
G4cout << " ==========> The phantom contains " << fMyCellParameterisation->GetPhantomTotalPixels() << " voxels " << G4endl;
G4cout << " ==========> Nucleus mass (kg)=" << fMyCellParameterisation->GetNucleusMass() / kg << G4endl;
G4cout << " ==========> Cytoplasm mass (kg)=" << fMyCellParameterisation->GetCytoplasmMass()/ kg << G4endl;
G4cout << " ==========> Voxel size X (um)=" << fMyCellParameterisation->GetPixelSizeX()/um << G4endl;
G4cout << " ==========> Voxel size Y (um)=" << fMyCellParameterisation->GetPixelSizeY()/um << G4endl;
G4cout << " ==========> Voxel size Z (um)=" << fMyCellParameterisation->GetPixelSizeZ()/um << G4endl;
G4cout << G4endl;
// VISUALISATION ATTRIBUTES (for phantom, see in Parameterisation class)
G4VisAttributes* simpleWorldVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); //White
simpleWorldVisAtt->SetVisibility(true);
G4VisAttributes* simplePlain= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); //White
simplePlain->SetVisibility(true);
simplePlain->SetForceSolid(true);
G4VisAttributes* simpleBoxAttLine= new G4VisAttributes(G4Colour(1.0,0.0,0.0));
simpleBoxAttLine->SetVisibility(true);
G4VisAttributes* simpleBoxAtt= new G4VisAttributes(G4Colour(1.0,1.0,0.0));
simpleBoxAtt->SetDaughtersInvisible(false);
simpleBoxAtt->SetForceSolid(false);
G4VisAttributes* simpleBoxAtt2= new G4VisAttributes(G4Colour(0.0,1.0,0.0));
simpleBoxAtt2->SetDaughtersInvisible(false);
simpleBoxAtt2->SetForceSolid(false);
G4VisAttributes* simpleBoxAttKGM= new G4VisAttributes(G4Colour(0.0,0.0,1.0));
simpleBoxAttKGM->SetDaughtersInvisible(false);
simpleBoxAttKGM->SetForceSolid(false);
G4VisAttributes* simpleBoxAttPropyl= new G4VisAttributes(G4Colour(1.0,1.0,1.0));
simpleBoxAttPropyl->SetDaughtersInvisible(true);
simpleBoxAttPropyl->SetForceSolid(false);
G4VisAttributes* simpleBoxAttAir= new G4VisAttributes(G4Colour(0.0,1.0,0.0));
simpleBoxAttAir->SetDaughtersInvisible(true);
simpleBoxAttAir->SetForceSolid(false);
G4VisAttributes* simpleBoxAtt3= new G4VisAttributes(G4Colour(0.0,0.0,1.0));
simpleBoxAtt3->SetDaughtersInvisible(false);
simpleBoxAtt3->SetForceSolid(false);
fLogicYoke1->SetVisAttributes(simpleBoxAtt);
fLogic1Gap->SetVisAttributes(simpleBoxAtt);
fLogic2Gap->SetVisAttributes(simpleBoxAtt);
fLogic3Gap->SetVisAttributes(simpleBoxAtt);
fLogicYoke2->SetVisAttributes(simpleBoxAtt);
fLogic4Gap->SetVisAttributes(simpleBoxAtt);
fLogic5Gap->SetVisAttributes(simpleBoxAtt);
fLogicBoite->SetVisAttributes(simpleBoxAttLine);
fLogicCathode->SetVisAttributes(simpleBoxAttPropyl);
fLogicIso->SetVisAttributes(simpleBoxAttPropyl);
fLogicBoiteIso->SetVisAttributes(simpleBoxAttPropyl);
fLogicVerre->SetVisAttributes(simpleBoxAtt);
fLogicBoite2->SetVisAttributes(simpleBoxAttAir);
fLogicBoite3->SetVisAttributes(simpleBoxAtt);
fLogicKgm->SetVisAttributes(simpleBoxAttKGM);
fLogicVerre2->SetVisAttributes(simpleBoxAtt);
return fPhysiWorld;
}
void DetectorConstruction::ConstructSDandField()
{
EMField* field = new EMField();
G4AutoDelete::Register(field);
G4EqMagElectricField* fEquation = new G4EqMagElectricField(field);
G4MagIntegratorStepper* fStepper = new G4ClassicalRK4 (fEquation,8);
G4FieldManager* fFieldMgr =
G4TransportationManager::GetTransportationManager()->GetFieldManager();
// Relaxed
G4MagInt_Driver* fIntgrDriver =
new G4MagInt_Driver(1*mm,fStepper,fStepper->GetNumberOfVariables() );
G4ChordFinder* fChordFinder = new G4ChordFinder(fIntgrDriver);
fFieldMgr->SetChordFinder(fChordFinder);
fFieldMgr->SetDetectorField(field);
// FOLLOWING PARAMETERS TUNED FROM RAY-TRACING SIMULATIONS OF THE AIFIRA NANOBEAM LINE
/*
fFieldMgr->GetChordFinder()->SetDeltaChord(1e-9*m);
fFieldMgr->SetDeltaIntersection(1e-9*m);
fFieldMgr->SetDeltaOneStep(1e-9*m);
fPropInField =
G4TransportationManager::GetTransportationManager()->GetPropagatorInField();
fPropInField->SetMinimumEpsilonStep(1e-16); // instead of 11
fPropInField->SetMaximumEpsilonStep(1e-15); // instead of 10
*/
}