#include "CT_detector_construction.hh" #include "G4Material.hh" #include "G4Element.hh" #include "G4Box.hh" #include "G4Tubs.hh" #include "G4LogicalVolume.hh" #include "G4ThreeVector.hh" #include "G4PVPlacement.hh" #include "globals.hh" #include "G4MagneticField.hh" #include "G4UniformMagField.hh" #include "G4SDManager.hh" #include "G4FieldManager.hh" #include "G4TransportationManager.hh" #include "G4Mag_UsualEqRhs.hh" #include "G4MagIntegratorStepper.hh" #include "G4ChordFinder.hh" #include "G4UserLimits.hh" #include "G4ExplicitEuler.hh" #include "G4ImplicitEuler.hh" #include "G4SimpleRunge.hh" #include "G4SimpleHeum.hh" #include "G4ClassicalRK4.hh" #include "G4HelixExplicitEuler.hh" #include "G4HelixImplicitEuler.hh" #include "G4HelixSimpleRunge.hh" #include "G4CashKarpRKF45.hh" #include "G4RKG3_Stepper.hh" #include "G4VisAttributes.hh" #include "common.hh" #include "globals.hh" #include "G4SystemOfUnits.hh" #include "G4NistManager.hh" #include "G4RotationMatrix.hh" CT_detector_construction::CT_detector_construction(double rotation_angle) : rotation_angle_(rotation_angle), experimentalHall_log(0), experimentalHall_phys(0),Air(NULL) { elementTable= G4Element::GetElementTable(); materialTable= G4Material::GetMaterialTable(); } CT_detector_construction::~CT_detector_construction() { } G4VPhysicalVolume* CT_detector_construction::Construct() { G4Material* Vaccum= new G4Material("interGalactic", 1., 1.008*g/mole, 1.e-25*g/cm3, kStateGas, 2.73*kelvin, 3.e-18*pascal); G4double massOfMole_N = 14.01*g/mole; G4double massOfMole_O = 16.00*g/mole; G4double atomicNumber_N = 7; G4double atomicNumber_O = 8; G4double density_air = 1.29*mg/cm3; G4int nelements = 2; G4NistManager* manager = G4NistManager::Instance(); manager->SetVerbose(0); //G4Element* N = new G4Element("Nitrogen", "N", atomicNumber_N, massOfMole_N); //G4Element* O = new G4Element("Oxygen" , "O", atomicNumber_O, massOfMole_O); G4Element* H = manager->FindOrBuildElement(1); G4Element* C = manager->FindOrBuildElement(6); G4Element* N = manager->FindOrBuildElement(7); G4Element* O = manager->FindOrBuildElement(8); G4Element* Si = manager->FindOrBuildElement(14); G4Element* Ge = manager->FindOrBuildElement(32); G4Element* Sb = manager->FindOrBuildElement(51); G4Element* I = manager->FindOrBuildElement(53); G4Element* Cs = manager->FindOrBuildElement(55); G4Element* Pb = manager->FindOrBuildElement(82); G4Element* Bi = manager->FindOrBuildElement(83); G4Element* Cu = manager->FindOrBuildElement(29); G4Element* Fe = manager->FindOrBuildElement(56); Air = new G4Material("Air", density_air, nelements); Air->AddElement(N, 70.*perCent); Air->AddElement(O, 30.*perCent); G4double expHall_x = 4.0*m; G4double expHall_y = 4.0*m; G4double expHall_z = 4.0*m; G4Box* experimentalHall_box = new G4Box("expHall_box",expHall_x,expHall_y,expHall_z); experimentalHall_log = new G4LogicalVolume(experimentalHall_box, Air,"expHall_log",0,0,0); experimentalHall_phys = new G4PVPlacement(0,G4ThreeVector(), experimentalHall_log,"expHall",0,false,0); //FR-4 material G4double PCB_den = 1.85*g/cm3; G4Material* PCB= new G4Material("PCB",PCB_den,4); PCB->AddElement(C,0.285); PCB->AddElement(H,0.475); PCB->AddElement(O,0.060); PCB->AddElement(Si,0.180); G4double Cu_den= 8.96*g/cm3; G4Material* Cu_ma= new G4Material("Cu_ma",Cu_den,1); Cu_ma->AddElement(Cu,1 ); G4RotationMatrix* rotD3 = new G4RotationMatrix(); rotD3->rotateX(45*deg); rotD3->rotateZ(this->rotation_angle_*deg); G4Box* PCB_box = new G4Box("PCB_box",5*mm,5*mm,1*mm); G4LogicalVolume* PCB_log= new G4LogicalVolume(PCB_box, PCB,"PCB_log",0,0,0); G4VPhysicalVolume *PCB_phys = new G4PVPlacement(rotD3, G4ThreeVector(0, 0, 0), PCB_log, "PCB_phys", experimentalHall_log, false, 0); G4Box* Cu_box = new G4Box("Cu_box", 4*mm, 0.5*mm, 0.04*mm); G4LogicalVolume* Cu_log = new G4LogicalVolume(Cu_box,Cu_ma,"Cu_log"); G4VPhysicalVolume* Cu_phys[5]; char name_sol_1[64]; char name_log_1[64]; char name_phy_1[64]; for (G4int i=0; i<5; i++){ sprintf(name_phy_1,"Cu_phy_%d",i+1); G4double dd=1.5*mm; Cu_phys[i] = new G4PVPlacement(0, G4ThreeVector(0, -5.*mm+i*dd+1.5*mm, 0), Cu_log, name_phy_1, PCB_log, false, i, false); } G4Box* de_ba = new G4Box("de_ba",36.*mm,36.*mm,0.1*mm); G4LogicalVolume* de_ba_log= new G4LogicalVolume(de_ba, Vaccum,"de_ba_log",0,0,0); G4PVPlacement *de_ba_phys = new G4PVPlacement(0, G4ThreeVector(0, 0, 300*mm), de_ba_log, "de_ba_phys", experimentalHall_log, false, 0); G4Box* de_box[600][600]; G4LogicalVolume* de_log [600][600]; G4VPhysicalVolume* de_phys[600][600]; char name_sol[64]; char name_log[64]; char name_phy[64]; for (G4int i=0; i<600; i++){ for(G4int j=0; j<600; j++){ sprintf(name_sol,"de_sol_%d_%d",i+1,j+1); sprintf(name_log,"de_log_%d_%d",i+1,j+1); sprintf(name_phy,"de_phy_%d_%d",i+1,j+1); de_box[i][j] = new G4Box(name_sol,0.06*mm,0.06*mm,0.1*mm); de_log [i][j] = new G4LogicalVolume(de_box[i][j],Vaccum,name_log,0,0,0); double length=72.*mm; double dd=0.12*mm; de_phys[i][j] = new G4PVPlacement(0, G4ThreeVector((-1.*length/2.+i*dd+dd/2.), (-1.*length/2.+j*dd+dd/2.), 0), de_log[i][j], name_phy, de_ba_log, false, j+i*600); } } return experimentalHall_phys; } G4Material* CT_detector_construction::GetMaterial(const G4String& name) const ///////////////////////////////////////////////////////////////////////// { G4Material* material= 0; G4int i; for(i=0; i< (G4int)materialTable-> size(); i++) { G4Material* aMaterial= (*materialTable)[i]; G4String aName= aMaterial-> GetName(); if(aName==name) { material= aMaterial; } } if(!material) { G4String errorMessage= " Material named <" + name + "> is not defined."; //new G4Exception definition y.mariken.jp 2012/11/08 G4Exception("KnuclMaterialManager::GetMaterial", "materials not defined", FatalException, errorMessage); // G4Exception(errorMessage); //G4Exception("KnuclMaterialManager::GetMaterial()", //"Invalid Material", FatalException, //errorMessage); } return material; }