00001 #include "BDSDebug.hh"
00002 #include "BDSMagnetOuterFactory.hh"
00003 #include "BDSMagnetOuterFactoryBase.hh"
00004 #include "BDSMagnetOuterFactoryCylindrical.hh"
00005 #include "BDSMagnetOuterFactoryPolesCircular.hh"
00006 #include "BDSMagnetOuterFactoryPolesFacet.hh"
00007 #include "BDSMagnetOuterFactoryPolesFacetCrop.hh"
00008 #include "BDSMagnetOuterFactoryPolesSquare.hh"
00009 #include "BDSMagnetOuterFactoryLHCLeft.hh"
00010 #include "BDSMagnetOuterFactoryLHCRight.hh"
00011 #include "BDSMagnetOuterFactoryNone.hh"
00012 #include "BDSMagnetGeometryType.hh"
00013
00014 #include "globals.hh"
00015
00016 BDSMagnetOuterFactory* BDSMagnetOuterFactory::_instance = 0;
00017
00018 BDSMagnetOuterFactory* BDSMagnetOuterFactory::Instance()
00019 {
00020 if (_instance == 0)
00021 {_instance = new BDSMagnetOuterFactory();}
00022 return _instance;
00023 }
00024
00025 BDSMagnetOuterFactory::BDSMagnetOuterFactory()
00026 {;}
00027
00028 BDSMagnetOuterFactoryBase* BDSMagnetOuterFactory::GetAppropriateFactory(BDSMagnetGeometryType magnetTypeIn)
00029 {
00030 switch(magnetTypeIn.underlying()){
00031
00032 case BDSMagnetGeometryType::none:
00033 #ifdef BDSDEBUG
00034 G4cout << __METHOD_NAME__ << "'none' magnet factory (no outer geometry)" << G4endl;
00035 #endif
00036 return BDSMagnetOuterFactoryNone::Instance();
00037 break;
00038 case BDSMagnetGeometryType::cylindrical:
00039 #ifdef BDSDEBUG
00040 G4cout << __METHOD_NAME__ << "cylindrical magnet factory" << G4endl;
00041 #endif
00042 return BDSMagnetOuterFactoryCylindrical::Instance();
00043 break;
00044 case BDSMagnetGeometryType::polescircular:
00045 #ifdef BDSDEBUG
00046 G4cout << __METHOD_NAME__ << "poles with circular yoke factory" << G4endl;
00047 #endif
00048 return BDSMagnetOuterFactoryPolesCircular::Instance();
00049 break;
00050 case BDSMagnetGeometryType::polessquare:
00051 #ifdef BDSDEBUG
00052 G4cout << __METHOD_NAME__ << "poles with square yoke factory" << G4endl;
00053 #endif
00054 return BDSMagnetOuterFactoryPolesSquare::Instance();
00055 break;
00056 case BDSMagnetGeometryType::polesfacet:
00057 #ifdef BDSDEBUG
00058 G4cout << __METHOD_NAME__ << "poles with faceted yoke factory" << G4endl;
00059 #endif
00060 return BDSMagnetOuterFactoryPolesFacet::Instance();
00061 break;
00062 case BDSMagnetGeometryType::polesfacetcrop:
00063 #ifdef BDSDEBUG
00064 G4cout << __METHOD_NAME__ << "poles with faceted and cropped yoke factory" << G4endl;
00065 #endif
00066 return BDSMagnetOuterFactoryPolesFacetCrop::Instance();
00067 break;
00068 case BDSMagnetGeometryType::lhcleft:
00069 #ifdef BDSDEBUG
00070 G4cout << __METHOD_NAME__ << "LHC magnet factory - with left offset" << G4endl;
00071 #endif
00072 return BDSMagnetOuterFactoryLHCLeft::Instance();
00073 break;
00074 case BDSMagnetGeometryType::lhcright:
00075 #ifdef BDSDEBUG
00076 G4cout << __METHOD_NAME__ << "LHC magnet factory - with right offset" << G4endl;
00077 #endif
00078 return BDSMagnetOuterFactoryLHCRight::Instance();
00079 break;
00080 default:
00081 G4cerr << __METHOD_NAME__ << "unknown type \"" << magnetTypeIn << G4endl;
00082 exit(1);
00083 break;
00084 }
00085 }
00086
00087 BDSGeometryComponent* BDSMagnetOuterFactory::CreateSectorBend(BDSMagnetGeometryType magnetType,
00088 G4String name,
00089 G4double length,
00090 BDSBeamPipe* beamPipe,
00091 G4double boxSize,
00092 G4double angle,
00093 G4Material* outerMaterial)
00094 {
00095 #ifdef BDSDEBUG
00096 G4cout << __METHOD_NAME__ << G4endl;
00097 #endif
00098 BDSMagnetOuterFactoryBase* factory = GetAppropriateFactory(magnetType);
00099 return factory->CreateSectorBend(name, length, beamPipe, boxSize, angle, outerMaterial);
00100 }
00101
00102 BDSGeometryComponent* BDSMagnetOuterFactory::CreateRectangularBend(BDSMagnetGeometryType magnetType,
00103 G4String name,
00104 G4double length,
00105 BDSBeamPipe* beamPipe,
00106 G4double boxSize,
00107 G4double angle,
00108 G4Material* outerMaterial)
00109 {
00110 #ifdef BDSDEBUG
00111 G4cout << __METHOD_NAME__ << G4endl;
00112 #endif
00113 BDSMagnetOuterFactoryBase* factory = GetAppropriateFactory(magnetType);
00114 return factory->CreateRectangularBend(name, length, beamPipe, boxSize, angle, outerMaterial);
00115 }
00116
00117
00118 BDSGeometryComponent* BDSMagnetOuterFactory::CreateQuadrupole(BDSMagnetGeometryType magnetType,
00119 G4String name,
00120 G4double length,
00121 BDSBeamPipe* beamPipe,
00122 G4double boxSize,
00123 G4Material* outerMaterial)
00124 {
00125 #ifdef BDSDEBUG
00126 G4cout << __METHOD_NAME__ << G4endl;
00127 #endif
00128 BDSMagnetOuterFactoryBase* factory = GetAppropriateFactory(magnetType);
00129 return factory->CreateQuadrupole(name, length, beamPipe, boxSize, outerMaterial);
00130 }
00131
00132 BDSGeometryComponent* BDSMagnetOuterFactory::CreateSextupole(BDSMagnetGeometryType magnetType,
00133 G4String name,
00134 G4double length,
00135 BDSBeamPipe* beamPipe,
00136 G4double boxSize,
00137 G4Material* outerMaterial)
00138 {
00139 #ifdef BDSDEBUG
00140 G4cout << __METHOD_NAME__ << G4endl;
00141 #endif
00142 BDSMagnetOuterFactoryBase* factory = GetAppropriateFactory(magnetType);
00143 return factory->CreateSextupole(name, length, beamPipe, boxSize, outerMaterial);
00144 }
00145
00146 BDSGeometryComponent* BDSMagnetOuterFactory::CreateOctupole(BDSMagnetGeometryType magnetType,
00147 G4String name,
00148 G4double length,
00149 BDSBeamPipe* beamPipe,
00150 G4double boxSize,
00151 G4Material* outerMaterial)
00152 {
00153 #ifdef BDSDEBUG
00154 G4cout << __METHOD_NAME__ << G4endl;
00155 #endif
00156 BDSMagnetOuterFactoryBase* factory = GetAppropriateFactory(magnetType);
00157 return factory->CreateOctupole(name, length, beamPipe, boxSize, outerMaterial);
00158 }
00159
00160 BDSGeometryComponent* BDSMagnetOuterFactory::CreateDecapole(BDSMagnetGeometryType magnetType,
00161 G4String name,
00162 G4double length,
00163 BDSBeamPipe* beamPipe,
00164 G4double boxSize,
00165 G4Material* outerMaterial)
00166 {
00167 #ifdef BDSDEBUG
00168 G4cout << __METHOD_NAME__ << G4endl;
00169 #endif
00170 BDSMagnetOuterFactoryBase* factory = GetAppropriateFactory(magnetType);
00171 return factory->CreateDecapole(name, length, beamPipe, boxSize, outerMaterial);
00172 }
00173
00174 BDSGeometryComponent* BDSMagnetOuterFactory::CreateSolenoid(BDSMagnetGeometryType magnetType,
00175 G4String name,
00176 G4double length,
00177 BDSBeamPipe* beamPipe,
00178 G4double boxSize,
00179 G4Material* outerMaterial)
00180 {
00181 #ifdef BDSDEBUG
00182 G4cout << __METHOD_NAME__ << G4endl;
00183 #endif
00184 BDSMagnetOuterFactoryBase* factory = GetAppropriateFactory(magnetType);
00185 return factory->CreateSolenoid(name, length, beamPipe, boxSize, outerMaterial);
00186 }
00187
00188 BDSGeometryComponent* BDSMagnetOuterFactory::CreateMultipole(BDSMagnetGeometryType magnetType,
00189 G4String name,
00190 G4double length,
00191 BDSBeamPipe* beamPipe,
00192 G4double boxSize,
00193 G4Material* outerMaterial)
00194 {
00195 #ifdef BDSDEBUG
00196 G4cout << __METHOD_NAME__ << G4endl;
00197 #endif
00198 BDSMagnetOuterFactoryBase* factory = GetAppropriateFactory(magnetType);
00199 return factory->CreateMultipole(name, length, beamPipe, boxSize, outerMaterial);
00200 }
00201
00202 BDSGeometryComponent* BDSMagnetOuterFactory::CreateRfCavity(BDSMagnetGeometryType magnetType,
00203 G4String name,
00204 G4double length,
00205 BDSBeamPipe* beamPipe,
00206 G4double boxSize,
00207 G4Material* outerMaterial)
00208 {
00209 #ifdef BDSDEBUG
00210 G4cout << __METHOD_NAME__ << G4endl;
00211 #endif
00212 BDSMagnetOuterFactoryBase* factory = GetAppropriateFactory(magnetType);
00213 return factory->CreateRfCavity(name, length, beamPipe, boxSize, outerMaterial);
00214 }
00215
00216 BDSGeometryComponent* BDSMagnetOuterFactory::CreateMuSpoiler(BDSMagnetGeometryType magnetType,
00217 G4String name,
00218 G4double length,
00219 BDSBeamPipe* beamPipe,
00220 G4double boxSize,
00221 G4Material* outerMaterial)
00222 {
00223 #ifdef BDSDEBUG
00224 G4cout << __METHOD_NAME__ << G4endl;
00225 #endif
00226 BDSMagnetOuterFactoryBase* factory = GetAppropriateFactory(magnetType);
00227 return factory->CreateMuSpoiler(name, length, beamPipe, boxSize, outerMaterial);
00228 }
00229
00230 BDSGeometryComponent* BDSMagnetOuterFactory::CreateKicker(BDSMagnetGeometryType magnetType,
00231 G4String name,
00232 G4double length,
00233 BDSBeamPipe* beamPipe,
00234 G4double boxSize,
00235 G4bool vertical,
00236 G4Material* outerMaterial)
00237 {
00238 #ifdef BDSDEBUG
00239 G4cout << __METHOD_NAME__ << G4endl;
00240 #endif
00241 BDSMagnetOuterFactoryBase* factory = GetAppropriateFactory(magnetType);
00242 return factory->CreateKicker(name, length, beamPipe, boxSize, vertical, outerMaterial);
00243 }