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