src/BDSSkewSextupole.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    Modified 22.03.05 by J.C.Carter, Royal Holloway, Univ. of London.
00007    Changed StringFromInt to BDSGlobalConstants::Instance() version
00008 */
00009 #include "BDSGlobalConstants.hh" 
00010 
00011 #include "BDSSkewSextupole.hh"
00012 #include "G4Box.hh"
00013 #include "G4Tubs.hh"
00014 #include "G4VisAttributes.hh"
00015 #include "G4LogicalVolume.hh"
00016 #include "G4VPhysicalVolume.hh"
00017 #include "G4UserLimits.hh"
00018 #include "G4TransportationManager.hh"
00019 
00020 #include <map>
00021 
00022 //============================================================
00023 
00024 typedef std::map<G4String,int> LogVolCountMap;
00025 extern LogVolCountMap* LogVolCount;
00026 
00027 typedef std::map<G4String,G4LogicalVolume*> LogVolMap;
00028 extern LogVolMap* LogVol;
00029 
00030 extern BDSMaterials* theMaterials;
00031 //============================================================
00032 
00033 BDSSkewSextupole::BDSSkewSextupole(G4String& aName,G4double aLength, 
00034                                    G4double bpRad,G4double FeRad,
00035                                    std::list<G4double> blmLocZ, std::list<G4double> blmLocTheta,
00036                                    G4String aTunnelMaterial, G4String aMaterial,
00037                                    G4double BDblPrime):
00038   BDSMultipole(aName,aLength, bpRad, FeRad,SetVisAttributes(),blmLocZ, blmLocTheta, aTunnelMaterial,aMaterial),
00039   itsBDblPrime(BDblPrime),
00040   itsStepper(NULL),itsMagField(NULL),itsEqRhs(NULL)
00041 {
00042   if (!(*LogVolCount)[itsName])
00043     {
00044       BuildBPFieldAndStepper();
00045       BuildBPFieldMgr(itsStepper,itsMagField);
00046       BuildDefaultMarkerLogicalVolume();
00047 
00048       BuildBeampipe();
00049 
00050       BuildDefaultOuterLogicalVolume(itsLength);
00051 
00052       if(BDSGlobalConstants::Instance()->GetSensitiveBeamPipe()){
00053         SetMultipleSensitiveVolumes(itsBeampipeLogicalVolume);
00054       }
00055       if(BDSGlobalConstants::Instance()->GetSensitiveComponents()){
00056         SetMultipleSensitiveVolumes(itsOuterLogicalVolume);
00057       }
00058 
00059       if(BDSGlobalConstants::Instance()->GetIncludeIronMagFields())
00060         {
00061           G4double polePos[4];
00062           G4double Bfield[3];
00063 
00064           polePos[0]=-BDSGlobalConstants::Instance()->GetMagnetPoleRadius()*sin(pi/6);
00065           polePos[1]=BDSGlobalConstants::Instance()->GetMagnetPoleRadius()*cos(pi/6);
00066           polePos[2]=0.;
00067           polePos[3]=-999.;//flag to use polePos rather than local track
00068                            //coordinate in GetFieldValue            
00069             
00070           itsMagField->GetFieldValue(polePos,Bfield);
00071           G4double BFldIron=
00072             sqrt(Bfield[0]*Bfield[0]+Bfield[1]*Bfield[1])*
00073             BDSGlobalConstants::Instance()->GetMagnetPoleSize()/
00074             (BDSGlobalConstants::Instance()->GetComponentBoxSize()/2-
00075              BDSGlobalConstants::Instance()->GetMagnetPoleRadius());
00076           // Magnetic flux from a pole is divided in two directions
00077           BFldIron/=2.;
00078 
00079           BuildOuterFieldManager(6, BFldIron,pi/6);
00080         }
00081 
00082 
00083       (*LogVolCount)[itsName]=1;
00084       (*LogVol)[itsName]=itsMarkerLogicalVolume;
00085     }
00086   else
00087     {
00088       (*LogVolCount)[itsName]++;
00089       if(BDSGlobalConstants::Instance()->GetSynchRadOn()&& BDSGlobalConstants::Instance()->GetSynchRescale())
00090         {
00091           // with synchrotron radiation, the rescaled magnetic field
00092           // means elements with the same name must have different
00093           //logical volumes, becuase they have different fields
00094           itsName+=BDSGlobalConstants::Instance()->StringFromInt((*LogVolCount)[itsName]);
00095           BuildBPFieldAndStepper();
00096           BuildBPFieldMgr(itsStepper,itsMagField);
00097           BuildDefaultMarkerLogicalVolume();
00098           
00099           if(BDSGlobalConstants::Instance()->GetBuildTunnel()){
00100             BuildTunnel();
00101           }
00102           BuildBeampipe();
00103           BuildDefaultOuterLogicalVolume(itsLength);
00104 
00105           //Build the beam loss monitors
00106           BuildBLMs();
00107 
00108           if(BDSGlobalConstants::Instance()->GetSensitiveBeamPipe()){
00109             SetMultipleSensitiveVolumes(itsBeampipeLogicalVolume);
00110           }
00111           if(BDSGlobalConstants::Instance()->GetSensitiveComponents()){
00112             SetMultipleSensitiveVolumes(itsOuterLogicalVolume);
00113           }
00114 
00115           (*LogVol)[itsName]=itsMarkerLogicalVolume;
00116         }
00117       else
00118         {
00119           itsMarkerLogicalVolume=(*LogVol)[itsName];
00120         }      
00121     }
00122   
00123 }
00124 
00125 
00126 G4VisAttributes* BDSSkewSextupole::SetVisAttributes()
00127 {
00128   itsVisAttributes=new G4VisAttributes(G4Colour(1,1,0));
00129   return itsVisAttributes;
00130 }
00131 
00132 
00133 void BDSSkewSextupole::BuildBPFieldAndStepper()
00134 {
00135   // set up the magnetic field and stepper
00136   itsMagField=new BDSSkewSextMagField(itsBDblPrime);
00137   itsEqRhs=new G4Mag_UsualEqRhs(itsMagField);
00138   
00139   itsStepper=new BDSSkewSextStepper(itsEqRhs);
00140   itsStepper->SetBDblPrime(itsBDblPrime);
00141 
00142 }
00143 
00144 BDSSkewSextupole::~BDSSkewSextupole()
00145 {
00146   delete itsVisAttributes;
00147   delete itsMagField;
00148   delete itsEqRhs;
00149   delete itsStepper;
00150 }

Generated on 27 Aug 2013 for BDSIM by  doxygen 1.4.7