00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "BDSGlobalConstants.hh"
00010
00011 #include "BDSSkewSextupole.hh"
00012 #include "G4Box.hh"
00013 #include "G4Tubs.hh"
00014 #include "G4VisAttributes.hh"
00015 #include "G4LogicalVolume.hh"
00016 #include "G4VPhysicalVolume.hh"
00017 #include "G4UserLimits.hh"
00018 #include "G4TransportationManager.hh"
00019
00020 #include <map>
00021
00022
00023
00024 typedef std::map<G4String,int> LogVolCountMap;
00025 extern LogVolCountMap* LogVolCount;
00026
00027 typedef std::map<G4String,G4LogicalVolume*> LogVolMap;
00028 extern LogVolMap* LogVol;
00029
00030 extern BDSMaterials* theMaterials;
00031
00032
00033 BDSSkewSextupole::BDSSkewSextupole(G4String& aName,G4double aLength,
00034 G4double bpRad,G4double FeRad,
00035 std::list<G4double> blmLocZ, std::list<G4double> blmLocTheta,
00036 G4String aTunnelMaterial, G4String aMaterial,
00037 G4double BDblPrime):
00038 BDSMultipole(aName,aLength, bpRad, FeRad,SetVisAttributes(),blmLocZ, blmLocTheta, aTunnelMaterial,aMaterial),
00039 itsBDblPrime(BDblPrime),
00040 itsStepper(NULL),itsMagField(NULL),itsEqRhs(NULL)
00041 {
00042 if (!(*LogVolCount)[itsName])
00043 {
00044 BuildBPFieldAndStepper();
00045 BuildBPFieldMgr(itsStepper,itsMagField);
00046 BuildDefaultMarkerLogicalVolume();
00047
00048 BuildBeampipe();
00049
00050 BuildDefaultOuterLogicalVolume(itsLength);
00051
00052 if(BDSGlobalConstants::Instance()->GetSensitiveBeamPipe()){
00053 SetMultipleSensitiveVolumes(itsBeampipeLogicalVolume);
00054 }
00055 if(BDSGlobalConstants::Instance()->GetSensitiveComponents()){
00056 SetMultipleSensitiveVolumes(itsOuterLogicalVolume);
00057 }
00058
00059 if(BDSGlobalConstants::Instance()->GetIncludeIronMagFields())
00060 {
00061 G4double polePos[4];
00062 G4double Bfield[3];
00063
00064 polePos[0]=-BDSGlobalConstants::Instance()->GetMagnetPoleRadius()*sin(pi/6);
00065 polePos[1]=BDSGlobalConstants::Instance()->GetMagnetPoleRadius()*cos(pi/6);
00066 polePos[2]=0.;
00067 polePos[3]=-999.;
00068
00069
00070 itsMagField->GetFieldValue(polePos,Bfield);
00071 G4double BFldIron=
00072 sqrt(Bfield[0]*Bfield[0]+Bfield[1]*Bfield[1])*
00073 BDSGlobalConstants::Instance()->GetMagnetPoleSize()/
00074 (BDSGlobalConstants::Instance()->GetComponentBoxSize()/2-
00075 BDSGlobalConstants::Instance()->GetMagnetPoleRadius());
00076
00077 BFldIron/=2.;
00078
00079 BuildOuterFieldManager(6, BFldIron,pi/6);
00080 }
00081
00082
00083 (*LogVolCount)[itsName]=1;
00084 (*LogVol)[itsName]=itsMarkerLogicalVolume;
00085 }
00086 else
00087 {
00088 (*LogVolCount)[itsName]++;
00089 if(BDSGlobalConstants::Instance()->GetSynchRadOn()&& BDSGlobalConstants::Instance()->GetSynchRescale())
00090 {
00091
00092
00093
00094 itsName+=BDSGlobalConstants::Instance()->StringFromInt((*LogVolCount)[itsName]);
00095 BuildBPFieldAndStepper();
00096 BuildBPFieldMgr(itsStepper,itsMagField);
00097 BuildDefaultMarkerLogicalVolume();
00098
00099 if(BDSGlobalConstants::Instance()->GetBuildTunnel()){
00100 BuildTunnel();
00101 }
00102 BuildBeampipe();
00103 BuildDefaultOuterLogicalVolume(itsLength);
00104
00105
00106 BuildBLMs();
00107
00108 if(BDSGlobalConstants::Instance()->GetSensitiveBeamPipe()){
00109 SetMultipleSensitiveVolumes(itsBeampipeLogicalVolume);
00110 }
00111 if(BDSGlobalConstants::Instance()->GetSensitiveComponents()){
00112 SetMultipleSensitiveVolumes(itsOuterLogicalVolume);
00113 }
00114
00115 (*LogVol)[itsName]=itsMarkerLogicalVolume;
00116 }
00117 else
00118 {
00119 itsMarkerLogicalVolume=(*LogVol)[itsName];
00120 }
00121 }
00122
00123 }
00124
00125
00126 G4VisAttributes* BDSSkewSextupole::SetVisAttributes()
00127 {
00128 itsVisAttributes=new G4VisAttributes(G4Colour(1,1,0));
00129 return itsVisAttributes;
00130 }
00131
00132
00133 void BDSSkewSextupole::BuildBPFieldAndStepper()
00134 {
00135
00136 itsMagField=new BDSSkewSextMagField(itsBDblPrime);
00137 itsEqRhs=new G4Mag_UsualEqRhs(itsMagField);
00138
00139 itsStepper=new BDSSkewSextStepper(itsEqRhs);
00140 itsStepper->SetBDblPrime(itsBDblPrime);
00141
00142 }
00143
00144 BDSSkewSextupole::~BDSSkewSextupole()
00145 {
00146 delete itsVisAttributes;
00147 delete itsMagField;
00148 delete itsEqRhs;
00149 delete itsStepper;
00150 }