/scratch0/jsnuveri/BDSIM/BDSIMgit/bdsim/src/BDSBeamPipeFactoryCircular.cc

00001 #include "BDSBeamPipeFactoryBase.hh"
00002 #include "BDSBeamPipeFactoryCircular.hh"
00003 #include "BDSBeamPipe.hh"
00004 
00005 #include "BDSDebug.hh"
00006 #include "BDSExecOptions.hh"
00007 #include "BDSGlobalConstants.hh"
00008 #include "BDSSDManager.hh"
00009 
00010 #include "globals.hh"                      // geant4 globals / types
00011 #include "G4CutTubs.hh"
00012 #include "G4LogicalVolume.hh"
00013 #include "G4Material.hh"
00014 #include "G4ThreeVector.hh"
00015 #include "G4Tubs.hh"
00016 #include "G4VSolid.hh"
00017 
00018 #include <cmath>
00019 #include <utility>                         // for std::pair
00020 
00021 
00022 BDSBeamPipeFactoryCircular* BDSBeamPipeFactoryCircular::_instance = 0;
00023 
00024 BDSBeamPipeFactoryCircular* BDSBeamPipeFactoryCircular::Instance()
00025 {
00026   if (_instance == 0)
00027     {_instance = new BDSBeamPipeFactoryCircular();}
00028   return _instance;
00029 }
00030 
00031 BDSBeamPipeFactoryCircular::BDSBeamPipeFactoryCircular():BDSBeamPipeFactoryBase()
00032 {
00033 }
00034 
00035 BDSBeamPipeFactoryCircular::~BDSBeamPipeFactoryCircular()
00036 {
00037   _instance = 0;
00038 }
00039 
00040 BDSBeamPipe* BDSBeamPipeFactoryCircular::CreateBeamPipe(G4String    nameIn,              // name
00041                                                         G4double    lengthIn,            // length [mm]
00042                                                         G4double    aper1In,             // aperture parameter 1
00043                                                         G4double    /*aper2In*/,         // aperture parameter 2
00044                                                         G4double    /*aper3In*/,         // aperture parameter 3
00045                                                         G4double    /*aper4In*/,         // aperture parameter 4
00046                                                         G4Material* vacuumMaterialIn,    // vacuum material
00047                                                         G4double    beamPipeThicknessIn, // beampipe thickness [mm]
00048                                                         G4Material* beamPipeMaterialIn   // beampipe material
00049                                                         )
00050 {
00051 #ifdef BDSDEBUG
00052   G4cout << __METHOD_NAME__ << G4endl;
00053 #endif
00054    // clean up after last usage
00055   CleanUp();
00056   
00057   // test input parameters - set global options as default if not specified
00058   TestInputParameters(vacuumMaterialIn,beamPipeThicknessIn,beamPipeMaterialIn,aper1In);
00059 
00060   // build the solids
00061   vacuumSolid   = new G4Tubs(nameIn + "_vacuum_solid",      // name
00062                              0,                             // inner radius
00063                              aper1In,                       // outer radius
00064                              lengthIn*0.5-2*lengthSafety,   // half length
00065                              0,                             // rotation start angle
00066                              CLHEP::twopi);                 // rotation finish angle
00067   
00068   beamPipeSolid = new G4Tubs(nameIn + "_pipe_solid",        // name
00069                              aper1In + lengthSafety,        // inner radius + length safety to avoid overlaps
00070                              aper1In + beamPipeThicknessIn, // outer radius
00071                              (lengthIn*0.5)-2*lengthSafety, // half length
00072                              0,                             // rotation start angle
00073                              CLHEP::twopi);                 // rotation finish angle
00074   
00075   G4double containerRadius = aper1In + beamPipeThicknessIn + lengthSafety;
00076   containerSolid = new G4Tubs(nameIn + "_container_solid",  // name
00077                               0,                            // inner radius
00078                               containerRadius,              // outer radius
00079                               (lengthIn*0.5)-lengthSafety,  // half length - must fit within magnet / outer geometry
00080                               0,                            // rotation start angle
00081                               CLHEP::twopi);                // rotation finish angle
00082   
00083   return CommonFinalConstruction(nameIn, vacuumMaterialIn, beamPipeMaterialIn, lengthIn, containerRadius);
00084 }
00085 
00086 BDSBeamPipe* BDSBeamPipeFactoryCircular::CreateBeamPipeAngledInOut(G4String    nameIn,              // name
00087                                                                    G4double    lengthIn,            // length [mm]
00088                                                                    G4double    angleInIn,           // the normal angle of the input face
00089                                                                    G4double    angleOutIn,          // the normal angle of the input face
00090                                                                    G4double    aper1In,             // aperture parameter 1
00091                                                                    G4double    /*aper2In*/,         // aperture parameter 2
00092                                                                    G4double    /*aper3In*/,         // aperture parameter 3
00093                                                                    G4double    /*aper4In */,        // aperture parameter 4
00094                                                                    G4Material* vacuumMaterialIn,    // vacuum material
00095                                                                    G4double    beamPipeThicknessIn, // beampipe thickness [mm]
00096                                                                    G4Material* beamPipeMaterialIn  // beampipe material
00097                                                                    )
00098 {
00099 #ifdef BDSDEBUG
00100   G4cout << __METHOD_NAME__ << G4endl;
00101 #endif
00102    // clean up after last usage
00103   CleanUp();
00104   
00105    // test input parameters - set global options as default if not specified
00106   TestInputParameters(vacuumMaterialIn,beamPipeThicknessIn,beamPipeMaterialIn,aper1In);
00107 
00108   std::pair<G4ThreeVector,G4ThreeVector> faces = CalculateFaces(angleInIn, angleOutIn);
00109   G4ThreeVector inputface  = faces.first;
00110   G4ThreeVector outputface = faces.second;
00111 
00112   G4double containerRadius = aper1In + beamPipeThicknessIn + lengthSafety;
00113   
00114   CreateGeneralAngledSolids(nameIn, lengthIn, aper1In, beamPipeThicknessIn, inputface, outputface);
00115   
00116   return CommonFinalConstruction(nameIn, vacuumMaterialIn, beamPipeMaterialIn, lengthIn, containerRadius);
00117 }
00118 
00120 
00122 void BDSBeamPipeFactoryCircular::TestInputParameters(G4Material*&  vacuumMaterialIn,     // reference to a pointer
00123                                                      G4double&     beamPipeThicknessIn,
00124                                                      G4Material*&  beamPipeMaterialIn,
00125                                                      G4double&     aper1In)
00126 {
00127   BDSBeamPipeFactoryBase::TestInputParameters(vacuumMaterialIn,beamPipeThicknessIn,beamPipeMaterialIn);
00128 
00129   if (aper1In < 1e-10)
00130     {aper1In = BDSGlobalConstants::Instance()->GetBeamPipeRadius();}
00131 }
00132 
00135 BDSBeamPipe* BDSBeamPipeFactoryCircular::CommonFinalConstruction(G4String    nameIn,
00136                                                                  G4Material* vacuumMaterialIn,
00137                                                                  G4Material* beamPipeMaterialIn,
00138                                                                  G4double    lengthIn,
00139                                                                  G4double    containerRadiusIn)
00140 {
00141 #ifdef BDSDEBUG
00142   G4cout << __METHOD_NAME__ << G4endl;
00143 #endif
00144   // prepare a longer container subtraction solid
00145   // doesn't have to be angled as it's only used for transverse subtraction
00146   containerSubtractionSolid = new G4Tubs(nameIn + "_container_sub_solid",// name
00147                                          0,                              // inner radius
00148                                          containerRadiusIn,              // outer radius
00149                                          lengthIn,                       // full length for unambiguous subtraction
00150                                          0,                              // rotation start angle
00151                                          CLHEP::twopi);                  // rotation finish angle
00152 
00153   BDSBeamPipeFactoryBase::CommonConstruction(nameIn,
00154                                              vacuumMaterialIn,
00155                                              beamPipeMaterialIn,
00156                                              lengthIn);
00157 
00158 
00159   
00160   // record extents
00161   std::pair<double,double> extX = std::make_pair(-containerRadiusIn,containerRadiusIn);
00162   std::pair<double,double> extY = std::make_pair(-containerRadiusIn,containerRadiusIn);
00163   std::pair<double,double> extZ = std::make_pair(-lengthIn*0.5,lengthIn*0.5);
00164 
00165   return BDSBeamPipeFactoryBase::BuildBeamPipeAndRegisterVolumes(extX,extY,extZ,
00166                                                                  containerRadiusIn);
00167 
00168 }
00169 
00172 void BDSBeamPipeFactoryCircular::CreateGeneralAngledSolids(G4String      nameIn,
00173                                                            G4double      lengthIn,
00174                                                            G4double      aper1In,
00175                                                            G4double      beamPipeThicknessIn,
00176                                                            G4ThreeVector inputfaceIn,
00177                                                            G4ThreeVector outputfaceIn)
00178 {
00179   // build the solids
00180   vacuumSolid   = new G4CutTubs(nameIn + "_vacuum_solid",      // name
00181                                 0,                             // inner radius
00182                                 aper1In,                       // outer radius
00183                                 lengthIn*0.5-2*lengthSafety,   // half length
00184                                 0,                             // rotation start angle
00185                                 CLHEP::twopi,                  // rotation finish angle
00186                                 inputfaceIn,                   // input face normal
00187                                 outputfaceIn );                // output face normal
00188                                       
00189   
00190   beamPipeSolid = new G4CutTubs(nameIn + "_pipe_solid",        // name
00191                                 aper1In + lengthSafety,        // inner radius + length safety to avoid overlaps
00192                                 aper1In + beamPipeThicknessIn, // outer radius
00193                                 lengthIn*0.5-2*lengthSafety,   // half length
00194                                 0,                             // rotation start angle
00195                                 CLHEP::twopi,                  // rotation finish angle
00196                                 inputfaceIn,                   // input face normal
00197                                 outputfaceIn );                // output face normal
00198   
00199 
00200   containerSolid = new G4CutTubs(nameIn + "_container_solid",  // name
00201                                  0,                            // inner radius
00202                                  aper1In + beamPipeThicknessIn + lengthSafety,  // outer radius
00203                                  lengthIn*0.5-lengthSafety,    // half length
00204                                  0,                            // rotation start angle
00205                                  CLHEP::twopi,                 // rotation finish angle
00206                                  inputfaceIn,                  // input face normal
00207                                  outputfaceIn);                // rotation finish angle
00208 }

Generated on 28 Jun 2015 for BDSIM by  doxygen 1.4.7