00001
00002
00003
00004
00005
00006 #include "BDSGlobalConstants.hh"
00007
00008 #include "BDSDrift.hh"
00009 #include "G4Box.hh"
00010 #include "G4Tubs.hh"
00011 #include "G4VisAttributes.hh"
00012 #include "G4LogicalVolume.hh"
00013 #include "G4VPhysicalVolume.hh"
00014 #include "G4UserLimits.hh"
00015 #include "G4TransportationManager.hh"
00016 #include "G4CashKarpRKF45.hh"
00017
00018 #include <map>
00019
00020
00021
00022 typedef std::map<G4String,int> LogVolCountMap;
00023 extern LogVolCountMap* LogVolCount;
00024
00025 typedef std::map<G4String,G4LogicalVolume*> LogVolMap;
00026 extern LogVolMap* LogVol;
00027
00028
00029
00030 BDSDrift::BDSDrift (G4String aName, G4double aLength,
00031 std::list<G4double> blmLocZ, std::list<G4double> blmLocTheta, G4double aperX, G4double aperY, G4String tunnelMaterial, G4bool aperset, G4double aper, G4double tunnelOffsetX, G4double phiAngleIn, G4double phiAngleOut):
00032 BDSMultipole(aName, aLength, aper, aper, SetVisAttributes(), blmLocZ, blmLocTheta, tunnelMaterial, "", aperX, aperY, 0, 0, tunnelOffsetX, phiAngleIn, phiAngleOut),
00033 itsStartOuterR(0.0),itsEndOuterR(0.0),itsStepper(NULL),itsMagField(NULL),itsEqRhs(NULL)
00034 {
00035 if(!aperset){
00036 itsStartOuterR=aperX + BDSGlobalConstants::Instance()->GetBeampipeThickness();
00037 itsEndOuterR=aperY + BDSGlobalConstants::Instance()->GetBeampipeThickness();
00038 SetStartOuterRadius(itsStartOuterR);
00039 SetEndOuterRadius(itsEndOuterR);
00040 }
00041 itsType="drift";
00042
00043 if (!(*LogVolCount)[itsName])
00044 {
00045
00046
00047
00048 BuildDefaultMarkerLogicalVolume();
00049 G4VisAttributes* VisAtt1 = new G4VisAttributes(G4Colour(0.0, 1.0, 0.0));
00050 VisAtt1->SetVisibility(false);
00051 VisAtt1->SetForceSolid(true);
00052 itsMarkerLogicalVolume->SetVisAttributes(VisAtt1);
00053
00054
00055
00056
00057 if(BDSGlobalConstants::Instance()->GetBuildTunnel()){
00058 BuildTunnel();
00059 }
00060
00061 BuildBpFieldAndStepper();
00062 BuildBPFieldMgr(itsStepper, itsMagField);
00063 if (aperset){
00064 BuildBeampipe();
00065 } else {
00066 BuildBeampipe(aperX, aperY);
00067 }
00068 BuildBLMs();
00069
00070
00071
00072
00073 if(BDSGlobalConstants::Instance()->GetSensitiveBeamPipe()){
00074 SetMultipleSensitiveVolumes(itsBeampipeLogicalVolume);
00075 }
00076
00077
00078
00079
00080 (*LogVolCount)[itsName]=1;
00081 (*LogVol)[itsName]=itsMarkerLogicalVolume;
00082 }
00083 else
00084 {
00085 (*LogVolCount)[itsName]++;
00086
00087
00088
00089
00090 itsMarkerLogicalVolume=(*LogVol)[itsName];
00091 }
00092 }
00093
00094 G4VisAttributes* BDSDrift::SetVisAttributes()
00095 {
00096 itsVisAttributes=new G4VisAttributes(G4Colour(0,1,0));
00097 return itsVisAttributes;
00098 }
00099
00100 void BDSDrift::BuildBpFieldAndStepper(){
00101
00102 itsMagField=new BDSMagField();
00103 itsEqRhs=new G4Mag_UsualEqRhs(itsMagField);
00104 itsStepper=new BDSDriftStepper(itsEqRhs);
00105 }
00106
00107 void BDSDrift::BuildBLMs(){
00108 itsBlmLocationR = std::max(itsStartOuterR, itsEndOuterR) - itsBpRadius;
00109 BDSAcceleratorComponent::BuildBLMs();
00110 }
00111
00112 BDSDrift::~BDSDrift()
00113 {
00114 delete itsVisAttributes;
00115
00116 delete itsMagField;
00117 delete itsEqRhs;
00118 delete itsStepper;
00119 }