00001 #include "BDSGlobalConstants.hh"
00002
00003 #include "BDSKicker.hh"
00004 #include "G4VisAttributes.hh"
00005 #include "G4LogicalVolume.hh"
00006 #include "G4VPhysicalVolume.hh"
00007 #include "G4TransportationManager.hh"
00008
00009 #include <map>
00010
00011
00012
00013 typedef std::map<G4String,int> LogVolCountMap;
00014 extern LogVolCountMap* LogVolCount;
00015
00016 typedef std::map<G4String,G4LogicalVolume*> LogVolMap;
00017 extern LogVolMap* LogVol;
00018
00019
00020
00021 BDSKicker::BDSKicker(G4String aName, G4double aLength,
00022 G4double bpRad, G4double FeRad,
00023 G4double bField, G4double angle, G4double outR,
00024 G4double tilt, G4double bGrad,
00025 G4String aTunnelMaterial, G4String aMaterial):
00026 BDSMultipole(aName, aLength, bpRad, FeRad, SetVisAttributes(), aTunnelMaterial, aMaterial,
00027 0, 0, angle),
00028 itsStepper(NULL),itsMagField(NULL),itsEqRhs(NULL)
00029 {
00030 SetOuterRadius(outR);
00031 itsTilt=tilt;
00032 itsBField=bField;
00033 itsBGrad=bGrad;
00034 if (tilt==0)
00035 itsType="hkick";
00036 else if (tilt==pi/2)
00037 itsType="vkick";
00038 else
00039 itsType="kick";
00040
00041 if (!(*LogVolCount)[itsName])
00042 {
00043
00044
00045
00046 BuildDefaultMarkerLogicalVolume();
00047
00048
00049
00050
00051 BuildBPFieldAndStepper();
00052 BuildBPFieldMgr(itsStepper,itsMagField);
00053 BuildBeampipe();
00054
00055
00056
00057
00058 BuildDefaultOuterLogicalVolume(itsLength);
00059 if(BDSGlobalConstants::Instance()->GetIncludeIronMagFields())
00060 {
00061 G4double polePos[4];
00062 G4double Bfield[3];
00063
00064
00065 polePos[0]=0.;
00066 polePos[1]=BDSGlobalConstants::Instance()->GetMagnetPoleRadius();
00067 polePos[2]=0.;
00068 polePos[3]=-999.;
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
00078 BFldIron/=2.;
00079
00080 BuildOuterFieldManager(2, BFldIron,0);
00081 }
00082
00083
00084
00085
00086 if(BDSGlobalConstants::Instance()->GetSensitiveBeamPipe()){
00087 SetMultipleSensitiveVolumes(itsBeampipeLogicalVolume);
00088 }
00089 if(BDSGlobalConstants::Instance()->GetSensitiveComponents()){
00090 SetMultipleSensitiveVolumes(itsOuterLogicalVolume);
00091 }
00092
00093
00094
00095
00096 itsVisAttributes=SetVisAttributes();
00097 itsVisAttributes->SetForceSolid(true);
00098 itsOuterLogicalVolume->SetVisAttributes(itsVisAttributes);
00099
00100
00101
00102
00103 (*LogVolCount)[itsName]=1;
00104 (*LogVol)[itsName]=itsMarkerLogicalVolume;
00105 }
00106 else
00107 {
00108 (*LogVolCount)[itsName]++;
00109
00110
00111
00112
00113
00114
00115
00116
00117 itsMarkerLogicalVolume=(*LogVol)[itsName];
00118 }
00119 }
00120
00121
00122 G4VisAttributes* BDSKicker::SetVisAttributes()
00123 {
00124 itsVisAttributes=new G4VisAttributes(G4Colour(0,0,1));
00125 return itsVisAttributes;
00126 }
00127
00128
00129 void BDSKicker::BuildBPFieldAndStepper()
00130 {
00131
00132 G4ThreeVector Bfield(0.,-itsBField,0.);
00133 itsMagField=new BDSSbendMagField(Bfield,itsLength,itsAngle);
00134
00135 itsEqRhs=new G4Mag_UsualEqRhs(itsMagField);
00136
00137 itsStepper = new myQuadStepper(itsEqRhs);
00138 itsStepper->SetBField(-itsBField);
00139 itsStepper->SetBGrad(itsBGrad);
00140 }
00141
00142 BDSKicker::~BDSKicker()
00143 {
00144 delete itsVisAttributes;
00145 delete itsMagField;
00146 delete itsEqRhs;
00147 delete itsStepper;
00148 }