00001 #include "BDSDebug.hh"
00002
00003 #include "BDSBeamPipeFactory.hh"
00004 #include "BDSBeamPipeFactoryBase.hh"
00005 #include "BDSBeamPipeFactoryCircular.hh"
00006 #include "BDSBeamPipeFactoryElliptical.hh"
00007 #include "BDSBeamPipeFactoryRectangular.hh"
00008 #include "BDSBeamPipeFactoryLHC.hh"
00009 #include "BDSBeamPipeFactoryLHCDetailed.hh"
00010 #include "BDSBeamPipeFactoryRectEllipse.hh"
00011 #include "BDSBeamPipeInfo.hh"
00012 #include "BDSBeamPipeType.hh"
00013 #include "globals.hh"
00014
00015 BDSBeamPipeFactory* BDSBeamPipeFactory::_instance = 0;
00016
00017 BDSBeamPipeFactory* BDSBeamPipeFactory::Instance()
00018 {
00019 if (_instance == 0)
00020 {_instance = new BDSBeamPipeFactory();}
00021 return _instance;
00022 }
00023
00024 BDSBeamPipeFactory::BDSBeamPipeFactory()
00025 {;}
00026
00027 BDSBeamPipeFactoryBase* BDSBeamPipeFactory::GetAppropriateFactory(BDSBeamPipeType type)
00028 {
00029 switch(type.underlying()){
00030
00031 case BDSBeamPipeType::circular:
00032 #ifdef BDSDEBUG
00033 G4cout << __METHOD_NAME__ << "circular beampipe factory" << G4endl;
00034 #endif
00035 return BDSBeamPipeFactoryCircular::Instance();
00036 break;
00037 case BDSBeamPipeType::elliptical:
00038 #ifdef BDSDEBUG
00039 G4cout << __METHOD_NAME__ << "elliptical beampipe factory" << G4endl;
00040 #endif
00041 return BDSBeamPipeFactoryElliptical::Instance();
00042 break;
00043 case BDSBeamPipeType::rectangular:
00044 #ifdef BDSDEBUG
00045 G4cout << __METHOD_NAME__ << "rectangular beampipe factory" << G4endl;
00046 #endif
00047 return BDSBeamPipeFactoryRectangular::Instance();
00048 break;
00049 case BDSBeamPipeType::lhc:
00050 #ifdef BDSDEBUG
00051 G4cout << __METHOD_NAME__ << "lhc beampipe factory" << G4endl;
00052 #endif
00053 return BDSBeamPipeFactoryLHC::Instance();
00054 break;
00055 case BDSBeamPipeType::lhcdetailed:
00056 #ifdef BDSDEBUG
00057 G4cout << __METHOD_NAME__ << "lhc detailed beampipe factory" << G4endl;
00058 #endif
00059 return BDSBeamPipeFactoryLHCDetailed::Instance();
00060 break;
00061 case BDSBeamPipeType::rectellipse:
00062 #ifdef BDSDEBUG
00063 G4cout << __METHOD_NAME__ << "rectangular ellipse beampipe factory" << G4endl;
00064 #endif
00065 return BDSBeamPipeFactoryRectEllipse::Instance();
00066 break;
00067 default:
00068 #ifdef BDSDEBUG
00069 G4cout << __METHOD_NAME__ << "unknown type \"" << type << "\" - circular beampipe factory by default" << G4endl;
00070 #endif
00071 return BDSBeamPipeFactoryCircular::Instance();
00072 break;
00073 }
00074 }
00075
00076 BDSBeamPipe* BDSBeamPipeFactory::CreateBeamPipe(G4String name,
00077 G4double length,
00078 BDSBeamPipeInfo* bpi)
00079 {
00080 #ifdef BDSDEBUG
00081 G4cout << __METHOD_NAME__ << G4endl;
00082 #endif
00083 return CreateBeamPipe(bpi->beamPipeType,
00084 name,
00085 length,
00086 bpi->aper1,
00087 bpi->aper2,
00088 bpi->aper3,
00089 bpi->aper4,
00090 bpi->vacuumMaterial,
00091 bpi->beamPipeThickness,
00092 bpi->beamPipeMaterial);
00093 }
00094
00095 BDSBeamPipe* BDSBeamPipeFactory::CreateBeamPipe(BDSBeamPipeType beamPipeType,
00096 G4String name,
00097 G4double length,
00098 G4double aper1,
00099 G4double aper2,
00100 G4double aper3,
00101 G4double aper4,
00102 G4Material* vacuumMaterial,
00103 G4double beamPipeThickness,
00104 G4Material* beamPipeMaterial)
00105 {
00106 #ifdef BDSDEBUG
00107 G4cout << __METHOD_NAME__ << G4endl;
00108 #endif
00109 BDSBeamPipeFactoryBase* factory = GetAppropriateFactory(beamPipeType);
00110 return factory->CreateBeamPipe(name,length,aper1,aper2,aper3,aper4,
00111 vacuumMaterial,beamPipeThickness,beamPipeMaterial);
00112 }
00113
00114 BDSBeamPipe* BDSBeamPipeFactory::CreateBeamPipeAngledIn(BDSBeamPipeType beamPipeType,
00115 G4String name,
00116 G4double length,
00117 G4double angleIn,
00118 G4double aper1,
00119 G4double aper2,
00120 G4double aper3,
00121 G4double aper4,
00122 G4Material* vacuumMaterial,
00123 G4double beamPipeThickness,
00124 G4Material* beamPipeMaterial
00125 )
00126 {
00127 BDSBeamPipeFactoryBase* factory = GetAppropriateFactory(beamPipeType);
00128 return factory->CreateBeamPipeAngledIn(name,length,angleIn,aper1,aper2,aper3,aper4,
00129 vacuumMaterial,beamPipeThickness,beamPipeMaterial);
00130 }
00131
00132 BDSBeamPipe* BDSBeamPipeFactory::CreateBeamPipeAngledOut(BDSBeamPipeType beamPipeType,
00133 G4String name,
00134 G4double length,
00135 G4double angleOut,
00136 G4double aper1,
00137 G4double aper2,
00138 G4double aper3,
00139 G4double aper4,
00140 G4Material* vacuumMaterial,
00141 G4double beamPipeThickness,
00142 G4Material* beamPipeMaterial
00143 )
00144 {
00145 BDSBeamPipeFactoryBase* factory = GetAppropriateFactory(beamPipeType);
00146 return factory->CreateBeamPipeAngledOut(name,length,angleOut,aper1,aper2,aper3,aper4,
00147 vacuumMaterial,beamPipeThickness,beamPipeMaterial);
00148 }
00149
00150 BDSBeamPipe* BDSBeamPipeFactory::CreateBeamPipeAngledInOut(BDSBeamPipeType beamPipeType,
00151 G4String name,
00152 G4double length,
00153 G4double angleIn,
00154 G4double angleOut,
00155 G4double aper1,
00156 G4double aper2,
00157 G4double aper3,
00158 G4double aper4,
00159 G4Material* vacuumMaterial,
00160 G4double beamPipeThickness,
00161 G4Material* beamPipeMaterial
00162 )
00163 {
00164 BDSBeamPipeFactoryBase* factory = GetAppropriateFactory(beamPipeType);
00165 return factory->CreateBeamPipeAngledInOut(name,length,angleIn,angleOut,aper1,aper2,aper3,aper4,
00166 vacuumMaterial,beamPipeThickness,beamPipeMaterial);
00167 }