src/BDSDrift.cc

00001 /* BDSIM code.    Version 1.0
00002    Author: Grahame A. Blair, Royal Holloway, Univ. of London.
00003    Last modified 24.7.2002
00004    Copyright (c) 2002 by G.A.Blair.  ALL RIGHTS RESERVED. 
00005 */
00006 #include "BDSGlobalConstants.hh" 
00007 
00008 #include "BDSDrift.hh"
00009 #include "G4Box.hh"
00010 #include "G4Tubs.hh"
00011 #include "G4VisAttributes.hh"
00012 #include "G4LogicalVolume.hh"
00013 #include "G4VPhysicalVolume.hh"
00014 #include "G4UserLimits.hh"
00015 #include "G4TransportationManager.hh"
00016 #include "G4CashKarpRKF45.hh"
00017 
00018 #include <map>
00019 
00020 //============================================================
00021 
00022 typedef std::map<G4String,int> LogVolCountMap;
00023 extern LogVolCountMap* LogVolCount;
00024 
00025 typedef std::map<G4String,G4LogicalVolume*> LogVolMap;
00026 extern LogVolMap* LogVol;
00027 
00028 //============================================================
00029 
00030 BDSDrift::BDSDrift (G4String aName, G4double aLength, 
00031                     std::list<G4double> blmLocZ, std::list<G4double> blmLocTheta, G4double aperX, G4double aperY, G4String tunnelMaterial, G4bool aperset, G4double aper, G4double tunnelOffsetX, G4double phiAngleIn, G4double phiAngleOut):
00032   BDSMultipole(aName, aLength, aper, aper, SetVisAttributes(),  blmLocZ, blmLocTheta, tunnelMaterial, "", aperX, aperY, 0, 0, tunnelOffsetX, phiAngleIn, phiAngleOut),
00033   itsStartOuterR(0.0),itsEndOuterR(0.0),itsStepper(NULL),itsMagField(NULL),itsEqRhs(NULL)
00034 {
00035   if(!aperset){
00036     itsStartOuterR=aperX + BDSGlobalConstants::Instance()->GetBeampipeThickness();
00037     itsEndOuterR=aperY + BDSGlobalConstants::Instance()->GetBeampipeThickness();
00038     SetStartOuterRadius(itsStartOuterR);
00039     SetEndOuterRadius(itsEndOuterR);
00040   }
00041   itsType="drift";
00042 
00043   if (!(*LogVolCount)[itsName])
00044     {
00045       //
00046       // build external volume
00047       // 
00048       BuildDefaultMarkerLogicalVolume();
00049       G4VisAttributes* VisAtt1 = new G4VisAttributes(G4Colour(0.0, 1.0, 0.0));
00050       VisAtt1->SetVisibility(false);
00051       VisAtt1->SetForceSolid(true);
00052       itsMarkerLogicalVolume->SetVisAttributes(VisAtt1);
00053 
00054       //
00055       // build beampipe (geometry + magnetic field)
00056       //
00057       if(BDSGlobalConstants::Instance()->GetBuildTunnel()){
00058         BuildTunnel();
00059       }
00060 
00061       BuildBpFieldAndStepper();
00062       BuildBPFieldMgr(itsStepper, itsMagField);
00063       if (aperset){
00064         BuildBeampipe();
00065       } else {
00066         BuildBeampipe(aperX, aperY);
00067       }
00068       BuildBLMs();
00069   
00070       //
00071       // define sensitive volumes for hit generation
00072       //
00073       if(BDSGlobalConstants::Instance()->GetSensitiveBeamPipe()){
00074         SetMultipleSensitiveVolumes(itsBeampipeLogicalVolume);
00075       }
00076       
00077       //
00078       // append marker logical volume to volume map
00079       //
00080       (*LogVolCount)[itsName]=1;
00081       (*LogVol)[itsName]=itsMarkerLogicalVolume;
00082     }
00083   else
00084     {
00085       (*LogVolCount)[itsName]++;
00086       
00087       //
00088       // use already defined marker volume
00089       //
00090       itsMarkerLogicalVolume=(*LogVol)[itsName];
00091     }
00092 }
00093 
00094 G4VisAttributes* BDSDrift::SetVisAttributes()
00095 {
00096   itsVisAttributes=new G4VisAttributes(G4Colour(0,1,0)); //useless
00097   return itsVisAttributes;
00098 }
00099 
00100 void BDSDrift::BuildBpFieldAndStepper(){
00101     // set up the magnetic field and stepper
00102   itsMagField=new BDSMagField(); //Zero magnetic field.
00103   itsEqRhs=new G4Mag_UsualEqRhs(itsMagField);
00104   itsStepper=new BDSDriftStepper(itsEqRhs);
00105 }
00106 
00107 void BDSDrift::BuildBLMs(){
00108   itsBlmLocationR = std::max(itsStartOuterR, itsEndOuterR) - itsBpRadius;
00109   BDSAcceleratorComponent::BuildBLMs(); // resets itsBlmLocationR! -- JS
00110 }
00111 
00112 BDSDrift::~BDSDrift()
00113 {
00114   delete itsVisAttributes;
00115 //   //  delete itsPhysiComp;
00116   delete itsMagField;
00117   delete itsEqRhs;
00118   delete itsStepper;
00119 }

Generated on 27 Aug 2013 for BDSIM by  doxygen 1.4.7