#include #include #include #include #include #include #include #include #include using namespace CLHEP; namespace RAT { PMTBaseConstructor::PMTBaseConstructor( const std::string& prefix, const PMTBaseConstructorParams& params ) : fPMTBaseParameters( params ) { fPrefix = prefix + std::string("_pmtbase"); fPMTBaseLogic = NULL; } void PMTBaseConstructor::Construct() { G4Tubs* fullPMTBase = new G4Tubs( fPrefix + "_main", 0.0, fPMTBaseParameters.fOuterRadius, fPMTBaseParameters.fHeight / 2.0, 0.0, twopi ); G4Tubs* baseVoid = new G4Tubs( fPrefix + "_void", 0.0, fPMTBaseParameters.fInnerRadius, fPMTBaseParameters.fVoidDepth / 2.0, 0.0, twopi ); G4double voidPosition = fPMTBaseParameters.fHeight / 2.0 - fPMTBaseParameters.fVoidDepth / 2.0; //Remove the void G4VSolid* baseSolid = new G4SubtractionSolid( fPrefix + "_solid", fullPMTBase, baseVoid, 0, G4ThreeVector( 0, 0, voidPosition ) ); fPMTBaseLogic = new G4LogicalVolume( baseSolid, fPMTBaseParameters.fBulkMaterial, fPrefix + "_logic" ); // ------------ Vis Attributes ------------- fPMTBaseLogic->SetVisAttributes( fPMTBaseParameters.fVisAttributes ); } G4LogicalVolume* PMTBaseConstructor::GetLogicalVolume() { if( fPMTBaseLogic == NULL ) Log::Die("PMTBaseConstructor::GetLogicalVolume: Construct has not been called."); return fPMTBaseLogic; } G4double PMTBaseConstructor::GetMaxHeight() { //Above PMT equator, order of EdgeZCoord matters return fPMTBaseParameters.fOffset + fPMTBaseParameters.fHeight / 2.0; } G4double PMTBaseConstructor::GetMaxDepth() { //Below PMT equator, order of EdgeZCoord matters return fPMTBaseParameters.fOffset - fPMTBaseParameters.fHeight / 2.0; } G4double PMTBaseConstructor::GetHexRadius() { // Radius is assumed constant return fPMTBaseParameters.fOuterRadius; } G4double PMTBaseConstructor::GetOffset() { return fPMTBaseParameters.fOffset; } } //::RAT