00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef BDSMultipole_h
00013 #define BDSMultipole_h
00014
00015 #include "globals.hh"
00016 #include "BDSAcceleratorComponent.hh"
00017 #include "BDSMaterials.hh"
00018 #include "G4LogicalVolume.hh"
00019
00020 #include "G4FieldManager.hh"
00021 #include "G4ChordFinder.hh"
00022 #include "G4Mag_EqRhs.hh"
00023 #include "G4UserLimits.hh"
00024 #include "G4VisAttributes.hh"
00025 #include "G4MagneticField.hh"
00026 #include "G4PVPlacement.hh"
00027
00028
00029 class BDSMultipole :public BDSAcceleratorComponent
00030 {
00031 public:
00032
00033 BDSMultipole( G4String aName,
00034 G4double aLength,
00035 G4double aBpRadius,
00036 G4double aInnerIronRadius,
00037 G4VisAttributes* aVisAtt,
00038 G4String aMaterial = "",
00039 G4double aXAper=0.,
00040 G4double aYAper=0.,
00041 G4double angle=0.);
00042
00043 virtual ~BDSMultipole();
00044
00045 void BuildBeampipe(G4double aLength,G4String materialName = "", G4int nSegments=1);
00046
00047 void BuildDefaultMarkerLogicalVolume();
00048
00049 void BuildDefaultOuterLogicalVolume(G4double aLength,G4bool OuterMaterialIsVacuum=false);
00050
00051 void BuildBPFieldMgr(G4MagIntegratorStepper* aStepper,
00052 G4MagneticField* aField);
00053
00054 G4FieldManager* GetBPFieldMgr();
00055
00056 void BuildOuterFieldManager(G4int nPoles, G4double poleField,
00057 G4double phiOffset);
00058
00059 void SetOuterRadius(G4double outR);
00060
00061 protected:
00062 G4LogicalVolume* itsBeampipeLogicalVolume;
00063 G4LogicalVolume* itsInnerBPLogicalVolume;
00064 G4VisAttributes* itsVisAttributes;
00065 G4UserLimits* itsUserLimits;
00066 G4UserLimits* itsBeampipeUserLimits;
00067 G4PVPlacement* itsPhysiComp;
00068 G4FieldManager* itsBPFieldMgr;
00069 G4FieldManager* itsOuterFieldMgr;
00070
00071 protected:
00072 G4double itsInnerIronRadius;
00073 G4Tubs* itsBPTube;
00074 G4Tubs* itsInnerBPTube;
00075 G4ChordFinder* itsChordFinder;
00076 G4int itsNPoles;
00077 G4MagneticField* itsOuterMagField;
00078
00079 G4RotationMatrix* itsSegRot;
00080 G4ThreeVector itsSegPos;
00081 G4int itsNSegments;
00082 G4double itsOuterR;
00083 };
00084
00085 inline G4FieldManager* BDSMultipole::GetBPFieldMgr()
00086 {return itsBPFieldMgr;}
00087
00088 inline void BDSMultipole::SetOuterRadius(G4double outR)
00089 {itsOuterR = outR;}
00090
00091 #endif