#include "Construction.hh" MyDetectorConstruction::MyDetectorConstruction() {} MyDetectorConstruction::~MyDetectorConstruction() {} G4VPhysicalVolume *MyDetectorConstruction::Construct() { // ======================================================================= // Material Definitions // ======================================================================= G4NistManager *nist = G4NistManager::Instance(); // Air G4Material *worldMat = nist->FindOrBuildMaterial("G4_Galactic"); // Si Element G4Element *Si = nist->FindOrBuildElement("Si"); // O Element G4Element *O = nist->FindOrBuildElement("O"); // Lu Element G4Element *Lu = nist->FindOrBuildElement("Lu"); // LSO G4Material *LSO = new G4Material("CsI", 7.4*g/cm3, 3); LSO->AddElement(Lu, 2); LSO->AddElement(Si, 1); LSO->AddElement(O, 5); // Silicon Grease G4Material *Grease = new G4Material("Si", 0.97*g/cm3, 1); Grease->AddElement(Si, 1); // Glass G4Material *Glass = new G4Material("SiO2", 2.7*g/cm3, 2); Glass->AddElement(Si, 1); Glass->AddElement(O, 2); // ======================================================================= // Optical Parameters // ======================================================================= // LSO G4double LSO_Energy[3] = {0.1*eV, 2.95*eV, 100*eV }; G4double LSO_Scint1[3] = {0.0, 1.0, 0.0 }; G4double LSO_Scint2[3] = {0.0, 1.0, 0.0 }; G4double LSO_AbsLen[3] = {80.0*cm, 80.0*cm, 80.0*cm}; G4double LSO_RefInd[3] = {1.82, 1.82, 1.82 }; G4MaterialPropertiesTable *mptLSO = new G4MaterialPropertiesTable(); mptLSO->AddProperty("SCINTILLATIONCOMPONENT1", LSO_Energy, LSO_Scint1, 3); mptLSO->AddProperty("SCINTILLATIONCOMPONENT2", LSO_Energy, LSO_Scint2, 3); mptLSO->AddProperty("RINDEX", LSO_Energy, LSO_RefInd, 3); mptLSO->AddProperty("ABSLENGTH", LSO_Energy, LSO_AbsLen, 3); mptLSO->AddConstProperty("SCINTILLATIONYIELD", 35.0/keV); mptLSO->AddConstProperty("RESOLUTIONSCALE", 1.0 ); mptLSO->AddConstProperty("SCINTILLATIONTIMECONSTANT1", 20.*ns); mptLSO->AddConstProperty("SCINTILLATIONTIMECONSTANT2", 40.*ns); mptLSO->AddConstProperty("SCINTILLATIONYIELD1", 1.0 ); mptLSO->AddConstProperty("SCINTILLATIONYIELD2", 0.0 ); LSO->SetMaterialPropertiesTable(mptLSO); // World G4double Air_RefInd_Energy[2] = {0.1*eV, 100*eV}; G4double Air_RefInd_Values[2] = {1.000293, 1.000293}; G4MaterialPropertiesTable *mptWorld = new G4MaterialPropertiesTable(); mptWorld->AddProperty("RINDEX", Air_RefInd_Energy, Air_RefInd_Values, 2); worldMat->SetMaterialPropertiesTable(mptWorld); // Grease G4double Grease_RefInd_Energy[2] = {0.1*eV, 100*eV}; G4double Grease_RefInd_Values[2] = {1.50, 1.50}; G4MaterialPropertiesTable *mptGrease = new G4MaterialPropertiesTable(); mptGrease->AddProperty("RINDEX", Grease_RefInd_Energy, Grease_RefInd_Values, 2); Grease->SetMaterialPropertiesTable(mptGrease); // ======================================================================= // Geometry Dimensions // ======================================================================= // Housing Thickness, arbitrary value in relation optical photon transport G4double housingThickness = 0.5*cm; // Scintillation Crystal Dimensions Half Thickness G4double crystalX = 1.5 * mm; // Depth G4double crystalY = 1.5 * mm; // Width G4double crystalZ = 10 * mm; // Length // Grease Half Thickness G4double greaseX = crystalX; // Depth G4double greaseY = crystalY; // Width G4double greaseZ = 0.1/2 * mm; // Height // Photocathode (Sensitive Detector) Half Thickness G4double photocathodeX = crystalX; // Depth G4double photocathodeY = crystalY; // Width G4double photocathodeZ = 5.0/2 * mm; // Height // ======================================================================= // Geometry Transpose // ======================================================================= // Scintillation Crystal G4ThreeVector crystalT(0.0*cm, 0.0*cm, crystalZ); // Photocathode G4ThreeVector photocathodeT(0.0*cm, 0.0*cm, -photocathodeZ-greaseZ*2); // Optical Coupling G4ThreeVector greaseT(0.0*cm, 0.0*cm, -greaseZ); // ======================================================================= // Geometry Definitions // ======================================================================= // World Definition G4Box *solidWorld = new G4Box("solidWorld", 0.35*m, 0.25*m, 0.35*m); G4LogicalVolume *logicWorld = new G4LogicalVolume(solidWorld, worldMat, "logicWorld"); G4VPhysicalVolume *physWorld = new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), logicWorld, "physWorld", 0, false, 0, true); // Scintillation Crystal G4Box *solidCrystal = new G4Box("solidCrystal", crystalX, crystalY, crystalZ); G4LogicalVolume *logicCrystal = new G4LogicalVolume(solidCrystal, LSO, "logicCrystal"); G4VPhysicalVolume *physCrystal = new G4PVPlacement(0, crystalT, logicCrystal, "physCrystal", logicWorld, false, 0, true); // Optical Coupling G4Box *solidGrease = new G4Box("solidGrease", greaseX, greaseY, greaseZ); G4LogicalVolume *logicGrease = new G4LogicalVolume(solidGrease, Grease, "logicGrease"); G4VPhysicalVolume *physGrease = new G4PVPlacement(0, greaseT, logicGrease, "physGrease", logicWorld, false, 0, true); // Photocathode (Sensitive Detector) G4Box *solidPhotocathode = new G4Box("solidPhotocathode", photocathodeX, photocathodeY, photocathodeZ); G4LogicalVolume *logicPhotocathode = new G4LogicalVolume(solidPhotocathode, Grease, "logicPhotocathode"); G4VPhysicalVolume *physPhotocathode = new G4PVPlacement(0, photocathodeT, logicPhotocathode, "physPhotocathode", logicWorld, false, 0, true); // ======================================================================= // Optical Boundary // ======================================================================= // Lambertian Reflector, with absorption G4double AbsEnergy[2] = {0.1*eV, 10*eV}; G4double AbsReflectivity[2] = {0.97, 0.97}; G4MaterialPropertiesTable* Absorption = new G4MaterialPropertiesTable(); Absorption->AddProperty("REFLECTIVITY", AbsEnergy, AbsReflectivity, 2); // Specular Dielectric G4OpticalSurface *Unified_Polished_DD = new G4OpticalSurface("Dielectric-Dielectric_Unified_Polished"); Unified_Polished_DD->SetType(dielectric_dielectric); Unified_Polished_DD->SetModel(unified); Unified_Polished_DD->SetFinish(polished); Unified_Polished_DD->SetMaterialPropertiesTable(Absorption); // Specular Reflector G4OpticalSurface *Unified_Polished = new G4OpticalSurface("Unified_Polished"); Unified_Polished->SetType(dielectric_metal); Unified_Polished->SetModel(unified); Unified_Polished->SetFinish(polished); // Lambertian Reflector G4OpticalSurface *Unified_Rough = new G4OpticalSurface("Unified_Rough"); Unified_Rough->SetType(dielectric_metal); Unified_Rough->SetModel(unified); Unified_Rough->SetFinish(ground); // G4OpticalSurface* LUT_Detector_Surface = new G4OpticalSurface("LUT_Detector_Surface"); LUT_Detector_Surface->SetType(dielectric_LUTDAVIS); LUT_Detector_Surface->SetFinish(Detector_LUT); LUT_Detector_Surface->SetModel(DAVIS); // G4OpticalSurface* LUT_Surface = new G4OpticalSurface("LUT_Surface"); LUT_Surface->SetType(dielectric_LUTDAVIS); LUT_Surface->SetFinish(Polished_LUT); LUT_Surface->SetModel(DAVIS); // ======================================================================= // Assign Optical Boundary // ======================================================================= G4LogicalBorderSurface *CrystaltoGrease = new G4LogicalBorderSurface("CrystaltoGrease", physCrystal, physGrease, Unified_Polished_DD); G4LogicalBorderSurface *CrystaltoWorld = new G4LogicalBorderSurface("CrystaltoWorld", physCrystal, physWorld, LUT_Surface); G4LogicalBorderSurface *GreaseBorder = new G4LogicalBorderSurface("GreasetoWorld", physGrease, physWorld, Unified_Polished); fScoringVolume = logicPhotocathode; ScintillatorScoringVolume = logicCrystal; return physWorld; } void MyDetectorConstruction::ConstructSDandField() { }