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

00001 #include "BDSBeamPipeType.hh"
00002 #include "BDSBeamPipeFactoryLHCDetailed.hh"
00003 #include "BDSDebug.hh"
00004 #include "globals.hh"
00005 
00006 #include <map>
00007 
00008 BDSBeamPipeType BDS::DetermineBeamPipeType(G4String apertureType)
00009 {
00010   std::map<G4String, BDSBeamPipeType> types;
00011   types["circular"]    = BDSBeamPipeType::circular;
00012   types["elliptical"]  = BDSBeamPipeType::elliptical;
00013   types["rectangular"] = BDSBeamPipeType::rectangular;
00014   types["lhc"]         = BDSBeamPipeType::lhc;
00015   types["lhcdetailed"] = BDSBeamPipeType::lhcdetailed;
00016   types["rectellipse"] = BDSBeamPipeType::rectellipse;
00017 
00018   apertureType.toLower();
00019 
00020   if ( types.find(apertureType) == types.end() )
00021     {
00022       // it's not a valid key
00023       G4cerr << __METHOD_NAME__ << " " << apertureType << " is not a valid apertureType" << G4endl;
00024       exit(1);
00025     }
00026 
00027   BDSBeamPipeType returnValue = types[apertureType];
00028 #ifdef BDSDEBUG
00029   G4cout << __METHOD_NAME__ << "determined aperture type to be " << returnValue << G4endl;
00030 #endif
00031   return returnValue;
00032 }
00033 
00034 void BDS::CheckApertureInfo(BDSBeamPipeType beamPipeTypeIn, G4double& beamPipeRadius,
00035                             G4double& aper1, G4double& aper2, G4double& aper3, G4double& aper4)
00036 {
00037   if (beamPipeTypeIn == BDSBeamPipeType::circular)
00038     {InfoOKForCircular(beamPipeRadius,aper1,aper2,aper3,aper4);}
00039   if (beamPipeTypeIn == BDSBeamPipeType::elliptical)
00040     {InfoOKForElliptical(beamPipeRadius,aper1,aper2,aper3,aper4);}
00041   if (beamPipeTypeIn == BDSBeamPipeType::rectangular)
00042     {InfoOKForRectangular(beamPipeRadius,aper1,aper2,aper3,aper4);}
00043   if (beamPipeTypeIn == BDSBeamPipeType::lhc)
00044     {InfoOKForLHC(beamPipeRadius,aper1,aper2,aper3,aper4);}
00045   if (beamPipeTypeIn == BDSBeamPipeType::lhcdetailed)
00046     {InfoOKForLHCDetailed(beamPipeRadius,aper1,aper2,aper3,aper4);}
00047   if (beamPipeTypeIn == BDSBeamPipeType::rectellipse)
00048     {InfoOKForRectEllipse(beamPipeRadius,aper1,aper2,aper3,aper4);}
00049   else
00050     {InfoOKForCircular(beamPipeRadius,aper1,aper2,aper3,aper4);}
00051 }
00052 
00053 void BDS::InfoOKForCircular(G4double& beamPipeRadius, G4double& aper1, G4double& /*aper2*/, G4double& /*aper3*/, G4double& /*aper4*/)
00054 {
00055   if ((beamPipeRadius == 0) && (aper1 == 0)) {
00056       G4cerr << __METHOD_NAME__ << "Error: option \"beampipeRadius\" or \"aper1\" must be greater than 0 for all aperture types" << G4endl;
00057       exit(1);
00058     }
00059   if ((aper1 == 0) && (beamPipeRadius > 0)) {
00060       // beampiperadius set but aper1 not - need aper1 to be set - copy value from beampipe radius
00061       aper1 = beamPipeRadius;
00062     }
00063   if ((beamPipeRadius == 0) && (aper1 > 0)) {
00064       // aper1 set but beampiperadius not - copy just in case
00065       beamPipeRadius = aper1;
00066     }
00067 }
00068 
00069 void BDS::InfoOKForElliptical(G4double& beamPipeRadius, G4double& aper1, G4double& aper2, G4double& aper3, G4double& aper4)
00070 {
00071   // can actually use the same checks for rectangular as two parameter
00072   InfoOKForRectangular(beamPipeRadius,aper1,aper2,aper3,aper4);
00073 }
00074 
00075 void BDS::InfoOKForRectangular(G4double& beamPipeRadius, G4double& aper1, G4double& aper2, G4double& aper3, G4double& aper4)
00076 {
00077   // basic circular checks first - require at least one parameter for a square beam pipe
00078   InfoOKForCircular(beamPipeRadius,aper1,aper2,aper3,aper4);
00079 
00080   if ((aper2 == 0) && (aper1 > 0)) {
00081     // note if aper1 is > 0 so must beampipe radius or they share a value from circular checks
00082     G4cerr << __METHOD_NAME__ << "WARNING - \"aper2\" not set for rectangular aperture model" << G4endl;
00083     exit(1);
00084     //aper2 = aper1;
00085   }
00086 
00087   if ((aper2 > 0) && (aper1 == 0)) {
00088     // aper2 set but not aper1 - copy it to aper1
00089     G4cerr << __METHOD_NAME__ << "WARNING - \"aper2\" set but \"aper1\" not set for rectangular aperture model" << G4endl;
00090     exit(1);
00091     //aper1 = aper2;
00092   }
00093 }
00094 
00095 void BDS::InfoOKForLHC(G4double& beamPipeRadius, G4double& aper1, G4double& aper2, G4double& aper3, G4double& aper4)
00096 {
00097   InfoOKForCircular(beamPipeRadius,aper1,aper2,aper3,aper4);
00098 
00099   if (aper2 == 0) {
00100     // aper2 isn't set
00101     G4cerr << __METHOD_NAME__ << "WARNING - \"aper2\" not set for lhc aperture model" << G4endl;
00102     exit(1);
00103   }
00104 
00105   if (aper3 == 0) {
00106     // aper3 isn't set
00107     G4cerr << __METHOD_NAME__ << "WARNING - \"aper3\" not set for lhc aperture model" << G4endl;
00108     exit(1);
00109   }
00110 
00111   if ((aper3 > aper1) and (aper2 < aper3)) {
00112     G4cerr << __METHOD_NAME__ << "WARNING - \"aper3\" > \"aper1\" (or \"beamPipeRadius\") for lhc aperture model - will not produce desired shape" << G4endl;
00113     exit(1);
00114   }
00115 
00116   if ((aper3 > aper2) and (aper1 < aper3)) {
00117     G4cerr << __METHOD_NAME__ << "WARNING - \"aper3\" > \"aper2\" (or \"beamPipeRadius\") for lhc aperture model - will not produce desired shape" << G4endl;
00118     exit(1);
00119   }
00120 }
00121 
00122 void BDS::InfoOKForLHCDetailed(G4double& beamPipeRadius, G4double& aper1, G4double& aper2, G4double& aper3, G4double& aper4)
00123 {
00124   InfoOKForLHC(beamPipeRadius,aper1,aper2,aper3,aper4);
00125 }
00126 
00127 void BDS::InfoOKForRectEllipse(G4double& beamPipeRadius, G4double& aper1, G4double& aper2, G4double& aper3, G4double& aper4)
00128 {
00129   // basic checks
00130   InfoOKForCircular(beamPipeRadius,aper1,aper2,aper3,aper4);
00131   /*
00132   //treat rectangle as point coordinates.  If this point is inside ellipse,
00133   //rectangle is too small -> error should just use elliptical aperture
00134   G4double test = sqrt((aper1/aper3)*(aper1/aper3) + (aper2/aper4)*(aper2/aper4));
00135   if (test < 1)
00136     {
00137       //rectangle too small
00138       G4cerr << __METHOD_NAME__ << "WARNING - combination of \"aper1\" and \"aper2\" too small"
00139              << " rectangle is entirely inside ellipse - simply use elliptical aperture" << G4endl;
00140       exit(1);
00141     }
00142   */
00143   //check if ellipse is b
00144   if ((aper1 > aper3) and (aper2 > aper4))
00145     {;}
00146 }

Generated on 28 Jun 2015 for BDSIM by  doxygen 1.4.7