#include "construction.hh" #include "detector.hh" MyDetectorConstruction::MyDetectorConstruction() { nCols = 7; nRows = 7; fMessenger = new G4GenericMessenger(this, "/detector/", "Detector Construction"); fMessenger->DeclareProperty("nCols", nCols, "Number of columns"); fMessenger->DeclareProperty("nRows", nRows, "Number of rows"); fMessenger->DeclareProperty("isMuon", isMuon, "Toggle setup"); fMessenger->DeclareProperty("isScintillator", isScintillator, "Toggle setup"); fMessenger->DeclareProperty("isTOF", isTOF, "Time of Flight"); DefineMaterial(); xWorld = 1.0*m; yWorld = 1.05*m; zWorld = 2.0*m; isMuon = true; isScintillator = false; isTOF = false; } MyDetectorConstruction::~MyDetectorConstruction() {} void MyDetectorConstruction::DefineMaterial() { G4NistManager *nist = G4NistManager::Instance(); SiO2 = new G4Material("SiO2", 2.201*g/cm3, 2); SiO2->AddElement(nist->FindOrBuildElement("Si"), 1); SiO2->AddElement(nist->FindOrBuildElement("O"), 2); Pb = nist->FindOrBuildElement("Pb"); W = nist->FindOrBuildElement("W"); O = nist->FindOrBuildElement("O"); Aluminium = new G4Material("Al", 2.70*g/cm3, 1); Aluminium->AddElement(nist->FindOrBuildElement("Al"), 1); PbWO4 = new G4Material("PbWO4", 8.300*g/cm3, 3); PbWO4->AddElement(Pb, 1); PbWO4->AddElement(W, 2); PbWO4->AddElement(O, 2); H2O = new G4Material("H2O", 1.000*g/cm3, 2); H2O->AddElement(nist->FindOrBuildElement("H"), 2); H2O->AddElement(nist->FindOrBuildElement("O"), 1); C = nist->FindOrBuildElement("C"); Aerogel = new G4Material("Aerogel", 0.200*g/cm3, 3); Aerogel->AddMaterial(SiO2, 62.5*perCent); Aerogel->AddMaterial(H2O, 37.4*perCent); Aerogel->AddElement(C, 0.1*perCent); worldMat = nist ->FindOrBuildMaterial("G4_AIR"); G4double energy[2] = {1.239841939*eV/0.9, 1.239841939*eV/0.2}; G4double rindexPbWO4[2]= {2.16, 2.16}; G4double rindexWorld[2]= {1.0, 1.0}; G4MaterialPropertiesTable *mptWorld = new G4MaterialPropertiesTable(); mptWorld->AddProperty("RINDEX",energy, rindexWorld, 2); G4MaterialPropertiesTable *mptPbWO4 = new G4MaterialPropertiesTable(); mptPbWO4->AddProperty("RINDEX", energy, rindexPbWO4, 2); PbWO4->SetMaterialPropertiesTable(mptPbWO4); worldMat->SetMaterialPropertiesTable(mptWorld); Na = nist->FindOrBuildElement("Na"); I = nist->FindOrBuildElement("I"); NaI = new G4Material("NaI", 3.67*g/cm3, 2); NaI->AddElement(Na, 1); NaI->AddElement(I, 1); } void MyDetectorConstruction::ConstructMuon() { solidRadiator = new G4Box("solidRadiator", 50.4*cm, 30.4*cm, 121.9*cm); logicRadiator = new G4LogicalVolume(solidRadiator, Aluminium,"logicalRadiator"); fScoringVolume = logicRadiator; physRadiator = new G4PVPlacement(0, G4ThreeVector(0.,0.,0.25*m), logicRadiator, "physRadiator", logicWorld, false, 0, true); solidDetector = new G4Box("solidDetector", 2.2*cm, 2.2*cm, 23.6*cm); logicDetector = new G4LogicalVolume(solidDetector, PbWO4, "logicalDetector"); for(G4int i=0; i < nRows; i++) { for(G4int j=0; j < nCols; j++) { physDetector = new G4PVPlacement(0, G4ThreeVector(-0.11*m+(i)*m/(4*nRows), -0.11*m+(j)*m/(4*nCols), 1.*m), logicDetector, "physDetector", logicWorld, false, 0, true); } } } void MyDetectorConstruction::ConstructScintillator() { solidScintillator = new G4Tubs("solidScintillator", 10*cm, 20*cm, 30*cm, 0*deg, 360*deg); logicScintillator = new G4LogicalVolume(solidScintillator, NaI, "logicalScintillator"); fScoringVolume = logicScintillator; physScintillator = new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), logicScintillator, "physScintillator ", logicWorld, false, 0, true); } void MyDetectorConstruction::ConstructTOF() { solidDetector = new G4Box("solidDetector", 1.*m, 1.*m, 0.1*m ); logicDetector = new G4LogicalVolume(solidDetector, worldMat, "logicDetector"); physDetector = new G4PVPlacement(0, G4ThreeVector(0.*m, 0.*m, -4.*m), logicDetector, "physDetector", logicWorld, false, 0, true); physDetector = new G4PVPlacement(0, G4ThreeVector(0.*m, 0.*m, 3.*m), logicDetector, "physDetector", logicWorld, false, 1, true); } G4VPhysicalVolume *MyDetectorConstruction::Construct() { solidWorld = new G4Box("solidWorld", xWorld, yWorld, zWorld); logicWorld = new G4LogicalVolume(solidWorld, worldMat, "solidWorld"); physWorld = new G4PVPlacement(0, G4ThreeVector(0. ,0., 0.), logicWorld, "physWorld", 0, false, 0, true); if (isMuon) ConstructMuon(); if (isScintillator) ConstructScintillator(); if (isTOF) ConstructTOF(); return physWorld; } void MyDetectorConstruction::ConstructSDandField() { MySensitiveDetector *sensDet = new MySensitiveDetector("SensitiveDetector"); if (isMuon) logicDetector->SetSensitiveDetector(sensDet); }