src/BDSKicker.cc

00001 #include "BDSGlobalConstants.hh" 
00002 
00003 #include "BDSKicker.hh"
00004 #include "G4VisAttributes.hh"
00005 #include "G4LogicalVolume.hh"
00006 #include "G4VPhysicalVolume.hh"
00007 #include "G4TransportationManager.hh"
00008 
00009 #include <map>
00010 
00011 //============================================================
00012 
00013 typedef std::map<G4String,int> LogVolCountMap;
00014 extern LogVolCountMap* LogVolCount;
00015 
00016 typedef std::map<G4String,G4LogicalVolume*> LogVolMap;
00017 extern LogVolMap* LogVol;
00018 
00019 //============================================================
00020 
00021 BDSKicker::BDSKicker(G4String aName, G4double aLength, 
00022                      G4double bpRad, G4double FeRad,
00023                      G4double bField, G4double angle, G4double outR,
00024                      G4double tilt, G4double bGrad, 
00025                      G4String aTunnelMaterial, G4String aMaterial):
00026   BDSMultipole(aName, aLength, bpRad, FeRad, SetVisAttributes(), aTunnelMaterial, aMaterial,
00027                0, 0, angle),
00028   itsStepper(NULL),itsMagField(NULL),itsEqRhs(NULL)
00029 {
00030   SetOuterRadius(outR);
00031   itsTilt=tilt;
00032   itsBField=bField;
00033   itsBGrad=bGrad;
00034   if (tilt==0)
00035     itsType="hkick";
00036   else if (tilt==pi/2)
00037     itsType="vkick";
00038   else
00039     itsType="kick";
00040 
00041   if (!(*LogVolCount)[itsName])
00042     {
00043       //
00044       // build external volume
00045       // 
00046       BuildDefaultMarkerLogicalVolume();
00047 
00048       //
00049       // build beampipe (geometry + magnetic field)
00050       //
00051       BuildBPFieldAndStepper();
00052       BuildBPFieldMgr(itsStepper,itsMagField);
00053       BuildBeampipe();
00054 
00055       //
00056       // build magnet (geometry + magnetic field)
00057       //
00058       BuildDefaultOuterLogicalVolume(itsLength);
00059       if(BDSGlobalConstants::Instance()->GetIncludeIronMagFields())
00060         {
00061           G4double polePos[4];
00062           G4double Bfield[3];
00063 
00064           //coordinate in GetFieldValue
00065           polePos[0]=0.;
00066           polePos[1]=BDSGlobalConstants::Instance()->GetMagnetPoleRadius();
00067           polePos[2]=0.;
00068           polePos[3]=-999.;//flag to use polePos rather than local track
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 
00077           // Magnetic flux from a pole is divided in two directions
00078           BFldIron/=2.;
00079 
00080           BuildOuterFieldManager(2, BFldIron,0);
00081         }
00082 
00083       //
00084       // define sensitive volumes for hit generation
00085       //
00086       if(BDSGlobalConstants::Instance()->GetSensitiveBeamPipe()){
00087         SetMultipleSensitiveVolumes(itsBeampipeLogicalVolume);
00088       }
00089       if(BDSGlobalConstants::Instance()->GetSensitiveComponents()){
00090         SetMultipleSensitiveVolumes(itsOuterLogicalVolume);
00091       }
00092 
00093       //
00094       // set visualization attributes
00095       //
00096       itsVisAttributes=SetVisAttributes();
00097       itsVisAttributes->SetForceSolid(true);
00098       itsOuterLogicalVolume->SetVisAttributes(itsVisAttributes);
00099 
00100       //
00101       // append marker logical volume to volume map
00102       //
00103       (*LogVolCount)[itsName]=1;
00104       (*LogVol)[itsName]=itsMarkerLogicalVolume;
00105     }
00106   else
00107     {
00108       (*LogVolCount)[itsName]++;
00109 
00110       //
00111       // no rescaling ???
00112       //
00113  
00114       //
00115       // use already defined marker volume
00116       //
00117       itsMarkerLogicalVolume=(*LogVol)[itsName];
00118     }
00119 }
00120 
00121 
00122 G4VisAttributes* BDSKicker::SetVisAttributes()
00123 {
00124   itsVisAttributes=new G4VisAttributes(G4Colour(0,0,1));
00125   return itsVisAttributes;
00126 }
00127 
00128 
00129 void BDSKicker::BuildBPFieldAndStepper()
00130 {
00131   // set up the magnetic field and stepper
00132   G4ThreeVector Bfield(0.,-itsBField,0.); // note the - sign...
00133   itsMagField=new BDSSbendMagField(Bfield,itsLength,itsAngle);
00134   
00135   itsEqRhs=new G4Mag_UsualEqRhs(itsMagField);  
00136   
00137   itsStepper = new myQuadStepper(itsEqRhs);
00138   itsStepper->SetBField(-itsBField); // note the - sign...
00139   itsStepper->SetBGrad(itsBGrad);
00140 }
00141 
00142 BDSKicker::~BDSKicker()
00143 {
00144   delete itsVisAttributes;
00145   delete itsMagField;
00146   delete itsEqRhs;
00147   delete itsStepper;
00148 }

Generated on 27 Aug 2013 for BDSIM by  doxygen 1.4.7