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
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& , G4double& , G4double& )
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
00061 aper1 = beamPipeRadius;
00062 }
00063 if ((beamPipeRadius == 0) && (aper1 > 0)) {
00064
00065 beamPipeRadius = aper1;
00066 }
00067 }
00068
00069 void BDS::InfoOKForElliptical(G4double& beamPipeRadius, G4double& aper1, G4double& aper2, G4double& aper3, G4double& aper4)
00070 {
00071
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
00078 InfoOKForCircular(beamPipeRadius,aper1,aper2,aper3,aper4);
00079
00080 if ((aper2 == 0) && (aper1 > 0)) {
00081
00082 G4cerr << __METHOD_NAME__ << "WARNING - \"aper2\" not set for rectangular aperture model" << G4endl;
00083 exit(1);
00084
00085 }
00086
00087 if ((aper2 > 0) && (aper1 == 0)) {
00088
00089 G4cerr << __METHOD_NAME__ << "WARNING - \"aper2\" set but \"aper1\" not set for rectangular aperture model" << G4endl;
00090 exit(1);
00091
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
00101 G4cerr << __METHOD_NAME__ << "WARNING - \"aper2\" not set for lhc aperture model" << G4endl;
00102 exit(1);
00103 }
00104
00105 if (aper3 == 0) {
00106
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
00130 InfoOKForCircular(beamPipeRadius,aper1,aper2,aper3,aper4);
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 if ((aper1 > aper3) and (aper2 > aper4))
00145 {;}
00146 }