5 #include "G4SubtractionSolid.hh"
6 #include "G4LogicalVolume.hh"
7 #include "G4VisAttributes.hh"
8 #include "G4Material.hh"
9 #include "G4Polycone.hh"
10 #include "G4PVPlacement.hh"
11 #include "G4LogicalBorderSurface.hh"
13 #include "G4SDManager.hh"
17 #include "G4SystemOfUnits.hh"
19 #include "G4NistManager.hh"
27 PMTKey_t key(PMTName,CollectionName);
41 G4VisAttributes* WCPMTVisAtt =
new G4VisAttributes(G4Colour(0.0,0.0,1.0));
42 WCPMTVisAtt->SetForceSolid(
true);
43 WCPMTVisAtt->SetForceAuxEdgeVisible(
true);
49 G4VisAttributes* WCPMTVisAtt;
50 if(detectorElement ==
"OD") WCPMTVisAtt =
new G4VisAttributes(G4Colour(1.0, 0.0, 0.0));
51 else WCPMTVisAtt =
new G4VisAttributes(G4Colour(0.2,0.2,0.2));
52 WCPMTVisAtt->SetForceWireframe(
true);}
56 G4double glassThickness;
63 G4double sphereRadius = (expose*expose+ radius*radius)/(2*expose);
64 G4double PMTOffset = sphereRadius - expose;
69 G4double PMTHolderZ[2] = {0, expose};
70 G4double PMTHolderR[2] = {radius, radius};
71 G4double PMTHolderr[2] = {0,0};
76 if (0 < lightcollector && lightcollector < 3){
77 G4cout<<
"Building Light Collectors"<<G4endl;
78 G4NistManager* man = G4NistManager::Instance();
79 G4Material* conc_material = man->FindOrBuildMaterial(
"G4_PLEXIGLASS");
80 logicLightCone =
new WCSimLC(
"LC", conc_material, lightcollector);
84 PMTHolderR[0] = std::max(radius,logicLightCone->
GetRadius()+.1);
85 PMTHolderR[1] = std::max(radius,logicLightCone->
GetRadius()+.1);
87 else if (lightcollector!=0){
88 G4cout<<
"Wrong Light Collectors ID is specified!"<<G4endl;
91 G4Polycone* solidWCPMT =
92 new G4Polycone(
"WCPMT",
101 G4LogicalVolume* logicWCPMT =
102 new G4LogicalVolume( solidWCPMT,
103 G4Material::GetMaterial(
"Water"),
109 G4VisAttributes* WCPMTVisAtt =
new G4VisAttributes(G4Colour(0.0,0.0,1.0));
110 WCPMTVisAtt->SetForceSolid(
true);
111 WCPMTVisAtt->SetForceAuxEdgeVisible(
true);
113 logicWCPMT->SetVisAttributes(WCPMTVisAtt);}
117 logicWCPMT->SetVisAttributes(G4VisAttributes::Invisible);}
120 G4Box* solidCutOffTubs =
121 new G4Box(
"cutOffTubs",
128 G4Sphere* tmpSolidInteriorWCPMT =
129 new G4Sphere(
"tmpInteriorWCPMT",
130 0.0*m,(sphereRadius-glassThickness),
134 G4SubtractionSolid* solidInteriorWCPMT =
135 new G4SubtractionSolid(
"InteriorWCPMT",
136 tmpSolidInteriorWCPMT,
141 G4LogicalVolume* logicInteriorWCPMT =
142 new G4LogicalVolume( solidInteriorWCPMT,
143 G4Material::GetMaterial(
"Air"),
147 G4VPhysicalVolume* physiInteriorWCPMT =
149 G4ThreeVector(0, 0, -1.0*PMTOffset),
159 G4VisAttributes* WCPMTVisAtt =
new G4VisAttributes(G4Colour(0.0,0.0,1.0));
160 WCPMTVisAtt->SetForceSolid(
true);
161 WCPMTVisAtt->SetForceAuxEdgeVisible(
true);
163 logicInteriorWCPMT->SetVisAttributes(WCPMTVisAtt);}
167 logicInteriorWCPMT->SetVisAttributes(G4VisAttributes::Invisible);}
171 G4Sphere* tmpGlassFaceWCPMT =
172 new G4Sphere(
"tmpGlassFaceWCPMT",
173 (sphereRadius-glassThickness),
178 G4SubtractionSolid* solidGlassFaceWCPMT =
179 new G4SubtractionSolid( CollectionName,
183 G4LogicalVolume *logicGlassFaceWCPMT =
184 new G4LogicalVolume( solidGlassFaceWCPMT,
185 G4Material::GetMaterial(
"Glass"),
189 G4VPhysicalVolume* physiGlassFaceWCPMT =
191 G4ThreeVector(0, 0, -1.0*PMTOffset),
200 if (0 < lightcollector && lightcollector < 3){
201 G4cout<<
"Registering Light Collectors"<<G4endl;
202 G4VPhysicalVolume* physiLightCone =
204 G4ThreeVector(0, 0, -1.0*logicLightCone->
GetOffset()),
211 G4cout<<
"Registering Light Collectors Done"<<G4endl;
221 G4VisAttributes* WCPMTVisAtt;
222 if(detectorElement ==
"OD") WCPMTVisAtt =
new G4VisAttributes(G4Colour(1.0, 0.0, 0.0));
223 else WCPMTVisAtt =
new G4VisAttributes(G4Colour(0.2,0.2,0.2));
224 WCPMTVisAtt->SetForceWireframe(
true);
226 logicGlassFaceWCPMT->SetVisAttributes(WCPMTVisAtt);
227 G4VisAttributes* WCLCVisAtt =
new G4VisAttributes(G4Colour(.3,.3,0.));
228 WCLCVisAtt->SetForceWireframe(
true);
229 WCLCVisAtt->SetForceAuxEdgeVisible(
true);
232 if (logicLightCone!=NULL)
233 logicLightCone->SetVisAttributes(WCLCVisAtt);
239 G4VisAttributes* WCPMTVisAtt =
new G4VisAttributes(G4Colour(0.0,0.0,1.0));
240 WCPMTVisAtt->SetForceSolid(
true);
241 WCPMTVisAtt->SetForceAuxEdgeVisible(
true);
244 logicGlassFaceWCPMT->SetVisAttributes(WCPMTVisAtt);}
249 G4VisAttributes* WCPMTVisAtt;
250 if(detectorElement ==
"OD") WCPMTVisAtt =
new G4VisAttributes(G4Colour(1.0, 0.0, 0.0));
251 else WCPMTVisAtt =
new G4VisAttributes(G4Colour(0.2,0.2,0.2));
252 WCPMTVisAtt->SetForceWireframe(
true);
254 logicGlassFaceWCPMT->SetVisAttributes(WCPMTVisAtt);}
258 G4SDManager* SDman = G4SDManager::GetSDMpointer();
259 G4String SDName =
"/WCSim/";
260 SDName += CollectionName;
264 if( ! SDman->FindSensitiveDetector(SDName,
false) ) {
267 SDman->AddNewDetector(
aWCPMT );
270 logicGlassFaceWCPMT->SetSensitiveDetector(
aWCPMT );
275 new G4LogicalBorderSurface(
"GlassCathodeSurface",
G4LogicalVolume * ConstructPMT(G4String, G4String, G4String detectorElement="tank")
static PMTMap_t PMTLogicalVolumes
WCSimPMTObject * GetPMTPointer(G4String CollectionName)
G4OpticalSurface * OpGlassCathodeSurface
std::map< PMTKey_t, G4LogicalVolume * > PMTMap_t
virtual G4double GetExposeHeight()=0
virtual G4double GetRadius()=0
virtual G4double GetPMTGlassThickness()=0
std::pair< G4String, G4String > PMTKey_t