/scratch0/jsnuveri/BDSIM/BDSIMgit/bdsim/src/BDSTeleporter.cc

00001 #include "globals.hh" //G4 global constants & types
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();   // create custom stepper
00034   BuildBPFieldMgr(itsStepper,itsMagField);  // register it in a manager
00035   BDSAcceleratorComponent::Build(); // create container and attach stepper
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); // modelled from BDSMagnet.cc
00049 
00050   // register extents with BDSGeometryComponent base class
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   // set up the magnetic field and stepper
00062   itsMagField = new BDSMagField(); //Zero magnetic field.
00063   itsEqRhs    = new G4Mag_UsualEqRhs(itsMagField);
00064   itsStepper  = new BDSTeleporterStepper(itsEqRhs);
00065 }
00066 
00067 void BDSTeleporter::BuildBPFieldMgr( G4MagIntegratorStepper* stepper,
00068     G4MagneticField* field)
00069 {
00070   //this is all copied from BDSMagnet.cc although names tidied a bit
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   // get position of last item in beamline
00094   // and then calculate necessary offset teleporter should apply
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   // calculate length of teleporter
00107   // beamline is built along z and sbend deflects in x
00108   // setting length here ensures that length is always the z difference
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 }

Generated on 28 Jun 2015 for BDSIM by  doxygen 1.4.7