00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "BDSExecOptions.hh"
00014 #include "BDSGlobalConstants.hh"
00015 #include "BDSDump.hh"
00016 #include "G4Box.hh"
00017 #include "G4Tubs.hh"
00018 #include "G4VisAttributes.hh"
00019 #include "G4LogicalVolume.hh"
00020 #include "G4VPhysicalVolume.hh"
00021 #include "G4PVPlacement.hh"
00022 #include "G4UserLimits.hh"
00023 #include "BDSOutput.hh"
00024 #include "BDSDumpSD.hh"
00025 #include "G4SDManager.hh"
00026
00027
00028 #include <map>
00029
00030
00031
00032 typedef std::map<G4String,int> LogVolCountMap;
00033 extern LogVolCountMap* LogVolCount;
00034
00035 typedef std::map<G4String,G4LogicalVolume*> LogVolMap;
00036 extern LogVolMap* LogVol;
00037 extern BDSOutput* bdsOutput;
00038 BDSDumpSD* BDSDumpSensDet;
00039 extern G4int nptwiss;
00040
00041
00042
00043 BDSDump::BDSDump (G4String aName,G4double aLength, G4String aTunnelMaterial):
00044 BDSAcceleratorComponent(
00045 aName,
00046 aLength,0,0,0,
00047 SetVisAttributes(), aTunnelMaterial),
00048 itsVisAttributes(NULL)
00049 {
00050 nptwiss = BDSExecOptions::Instance()->GetNPTwiss();
00051 SetName("Dump_"+BDSGlobalConstants::Instance()->StringFromInt(nDumps)+"_"+itsName);
00052 DumpLogicalVolume();
00053 const int nParticles = nptwiss;
00054 BDSGlobalConstants::Instance()->referenceQueue.push_back(new G4double[nParticles]);
00055 ++nDumps;
00056
00057
00058 }
00059
00060 int BDSDump::GetNumberOfDumps()
00061 {
00062 return nDumps;
00063 }
00064
00065 int BDSDump::nDumps=0;
00066
00067 int BDSDump::nUsedDumps=0;
00068
00069 void BDSDump::DumpLogicalVolume()
00070 {
00071 if(!(*LogVolCount)[itsName])
00072 {
00073
00074 G4double SampTransSize;
00075 SampTransSize=BDSGlobalConstants::Instance()->GetSamplerDiameter()/2.0;
00076
00077 itsMarkerLogicalVolume=
00078 new G4LogicalVolume(
00079 new G4Box(itsName+"_solid",
00080 SampTransSize,
00081 SampTransSize,
00082 itsLength/2.0),
00083 BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),
00084 itsName);
00085
00086 (*LogVolCount)[itsName]=1;
00087 (*LogVol)[itsName]=itsMarkerLogicalVolume;
00088 #ifndef NOUSERLIMITS
00089 itsOuterUserLimits =new G4UserLimits();
00090 itsOuterUserLimits->SetMaxAllowedStep(itsLength);
00091 itsOuterUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00092 itsOuterUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00093 itsMarkerLogicalVolume->SetUserLimits(itsOuterUserLimits);
00094 #endif
00095
00096 if(nDumps==0)
00097 {
00098 G4SDManager* SDMan = G4SDManager::GetSDMpointer();
00099 BDSDumpSensDet=new BDSDumpSD(itsName,"plane");
00100 SDMan->AddNewDetector(BDSDumpSensDet);
00101 }
00102 itsMarkerLogicalVolume->SetSensitiveDetector(BDSDumpSensDet);
00103 }
00104 else
00105 {
00106 (*LogVolCount)[itsName]++;
00107 itsMarkerLogicalVolume=(*LogVol)[itsName];
00108 itsMarkerLogicalVolume->SetSensitiveDetector(BDSDumpSensDet);
00109 }
00110 }
00111
00112 G4VisAttributes* BDSDump::SetVisAttributes()
00113 {
00114 itsVisAttributes=new G4VisAttributes(G4Colour(1,1,1));
00115 return itsVisAttributes;
00116 }
00117
00118 BDSDump::~BDSDump()
00119 {
00120 delete itsVisAttributes;
00121 nDumps--;
00122 }