00001
00002
00003
00004
00005
00006
00007 #ifndef BDSELEMENT_H
00008 #define BDSELEMENT_H
00009
00010 #include "globals.hh"
00011 #include "BDSAcceleratorComponent.hh"
00012 #include "BDSMaterials.hh"
00013 #include "BDSMagField.hh"
00014 #include "BDSTiltOffset.hh"
00015
00016 #include "G4CachedMagneticField.hh"
00017 #include "G4ChordFinder.hh"
00018 #include "G4EqMagElectricField.hh"
00019 #include "G4FieldManager.hh"
00020 #include "G4LogicalVolume.hh"
00021 #include "G4Mag_UsualEqRhs.hh"
00022 #include "G4Mag_EqRhs.hh"
00023 #include "G4UserLimits.hh"
00024 #include "G4UniformMagField.hh"
00025
00026 class BDSElement :public BDSAcceleratorComponent
00027 {
00028 public:
00029 BDSElement(G4String name,
00030 G4double length,
00031 G4String geometry,
00032 G4String bmap,
00033 G4double aBmapZOffset,
00034 BDSTiltOffset tiltOffset = BDSTiltOffset());
00035 ~BDSElement();
00036
00037
00038 void PrepareField(G4VPhysicalVolume *referenceVolume);
00039
00040 void AlignComponent(G4ThreeVector& TargetPos,
00041 G4RotationMatrix *TargetRot,
00042 G4RotationMatrix& globalRotation,
00043 G4ThreeVector& rtot,
00044 G4ThreeVector& rlast,
00045 G4ThreeVector& localX,
00046 G4ThreeVector& localY,
00047 G4ThreeVector& localZ);
00048
00049 private:
00050
00051 virtual void BuildContainerLogicalVolume();
00052 void SetVisAttributes();
00053
00054 void BuildElementMarkerLogicalVolume();
00055 void BuildGeometry();
00056 void PlaceComponents(G4String geometry, G4String bmap);
00057 void BuildMagField(G4bool forceToAllDaughters=false);
00058
00059 G4String itsGeometry;
00060 G4String itsBmap;
00061
00062 G4String itsFieldVolName;
00063 G4bool itsFieldIsUniform;
00064 G4ChordFinder* fChordFinder;
00065
00066 G4MagIntegratorStepper* itsFStepper;
00067 G4EqMagElectricField* itsFEquation;
00068 G4Mag_UsualEqRhs* itsEqRhs;
00069
00070 BDSMagField *itsMagField;
00071 G4CachedMagneticField *itsCachedMagField;
00072 G4UniformMagField *itsUniformMagField;
00073 G4double itsOuterR;
00074 G4double itsBmapZOffset;
00075
00076
00077 G4VPhysicalVolume* align_in_volume;
00078
00079
00080 G4VPhysicalVolume* align_out_volume;
00081
00082 };
00083
00084
00085 #endif