00001 #include "globals.hh"
00002 #include "BDSTeleporter.hh"
00003 #include "BDSAcceleratorComponent.hh"
00004 #include "BDSGlobalConstants.hh"
00005 #include "G4VisAttributes.hh"
00006 #include "G4LogicalVolume.hh"
00007 #include "G4Box.hh"
00008 #include "BDSMaterials.hh"
00009 #include "G4ChordFinder.hh"
00010 #include "G4FieldManager.hh"
00011 #include "BDSDebug.hh"
00012 #include "BDSMagField.hh"
00013 #include "G4Mag_UsualEqRhs.hh"
00014 #include "BDSTeleporterStepper.hh"
00015 #include "G4ThreeVector.hh"
00016 #include "BDSBeamline.hh"
00017 #include <cmath>
00018 #include "parser/enums.h"
00019
00020 BDSTeleporter::BDSTeleporter(G4String name,
00021 G4double length):
00022 BDSAcceleratorComponent(name, length, 0, "teleporter"),
00023 itsChordFinder(NULL),itsFieldManager(NULL),itsStepper(NULL),itsMagField(NULL),itsEqRhs(NULL)
00024 {
00025 #ifdef BDSDEBUG
00026 G4cout << __METHOD_NAME__ << " Constructing Teleporter of length: "
00027 << length/CLHEP::m << " m" << G4endl;
00028 #endif
00029 }
00030
00031 void BDSTeleporter::Build()
00032 {
00033 BuildBPFieldAndStepper();
00034 BuildBPFieldMgr(itsStepper,itsMagField);
00035 BDSAcceleratorComponent::Build();
00036 }
00037
00038 void BDSTeleporter::BuildContainerLogicalVolume()
00039 {
00040 G4double radius = BDSGlobalConstants::Instance()->GetSamplerDiameter() * 0.5;
00041 containerSolid = new G4Box(name+"_container_solid",
00042 radius,
00043 radius,
00044 chordLength*0.5);
00045 containerLogicalVolume = new G4LogicalVolume(containerSolid,
00046 emptyMaterial,
00047 name + "_container_lv");
00048 containerLogicalVolume->SetFieldManager(itsFieldManager,false);
00049
00050
00051 SetExtentX(-radius,radius);
00052 SetExtentY(-radius,radius);
00053 SetExtentZ(-chordLength*0.5, chordLength*0.5);
00054 }
00055
00056 void BDSTeleporter::BuildBPFieldAndStepper()
00057 {
00058 #ifdef BDSDEBUG
00059 G4cout << "BDSTeleporter Build Stepper & Field " << G4endl;
00060 #endif
00061
00062 itsMagField = new BDSMagField();
00063 itsEqRhs = new G4Mag_UsualEqRhs(itsMagField);
00064 itsStepper = new BDSTeleporterStepper(itsEqRhs);
00065 }
00066
00067 void BDSTeleporter::BuildBPFieldMgr( G4MagIntegratorStepper* stepper,
00068 G4MagneticField* field)
00069 {
00070
00071 itsChordFinder =
00072 new G4ChordFinder(field,
00073 chordLength*0.5/CLHEP::m,
00074 stepper);
00075
00076 itsChordFinder->SetDeltaChord(BDSGlobalConstants::Instance()->GetDeltaChord());
00077 itsFieldManager = new G4FieldManager();
00078 itsFieldManager->SetDetectorField(field);
00079 itsFieldManager->SetChordFinder(itsChordFinder);
00080 if(BDSGlobalConstants::Instance()->GetDeltaIntersection()>0){
00081 itsFieldManager->SetDeltaIntersection(BDSGlobalConstants::Instance()->GetDeltaIntersection());
00082 }
00083 if(BDSGlobalConstants::Instance()->GetMinimumEpsilonStep()>0)
00084 itsFieldManager->SetMinimumEpsilonStep(BDSGlobalConstants::Instance()->GetMinimumEpsilonStep());
00085 if(BDSGlobalConstants::Instance()->GetMaximumEpsilonStep()>0)
00086 itsFieldManager->SetMaximumEpsilonStep(BDSGlobalConstants::Instance()->GetMaximumEpsilonStep());
00087 if(BDSGlobalConstants::Instance()->GetDeltaOneStep()>0)
00088 itsFieldManager->SetDeltaOneStep(BDSGlobalConstants::Instance()->GetDeltaOneStep());
00089 }
00090
00091 void BDS::CalculateAndSetTeleporterDelta(BDSBeamline* thebeamline)
00092 {
00093
00094
00095 G4ThreeVector lastitemposition = thebeamline->back()->GetReferencePositionEnd();
00096 G4ThreeVector firstitemposition = thebeamline->front()->GetReferencePositionStart();
00097 G4ThreeVector delta = lastitemposition - firstitemposition;
00098 #ifdef BDSDEBUG
00099 G4cout << "Calculating Teleporter delta" << G4endl;
00100 G4cout << "last item position : " << lastitemposition << " mm" << G4endl;
00101 G4cout << "first item position : " << firstitemposition << " mm" << G4endl;
00102 #endif
00103 G4cout << "Teleport delta : " << delta << " mm" << G4endl;
00104 BDSGlobalConstants::Instance()->SetTeleporterDelta(delta);
00105
00106
00107
00108
00109 G4double teleporterlength = fabs(delta.z()) - 1e-8;
00110 G4cout << "Calculated teleporter length : " << teleporterlength << " mm" << G4endl;
00111 BDSGlobalConstants::Instance()->SetTeleporterLength(teleporterlength);
00112 }
00113
00114 BDSTeleporter::~BDSTeleporter()
00115 {
00116 delete itsMagField;
00117 delete itsEqRhs;
00118 delete itsStepper;
00119 }