Loading...
Searching...
No Matches
RE06ParallelWorld.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26/// \file RE06/src/RE06ParallelWorld.cc
27/// \brief Implementation of the RE06ParallelWorld class
28//
29//
30
31#include "RE06ParallelWorld.hh"
32
33#include "G4Tubs.hh"
34#include "G4LogicalVolume.hh"
35#include "G4PVPlacement.hh"
36#include "G4PVReplica.hh"
37
38#include "G4SDManager.hh"
39#include "G4MultiFunctionalDetector.hh"
40#include "G4VPrimitiveScorer.hh"
41#include "G4PSEnergyDeposit.hh"
42#include "G4PSNofSecondary.hh"
43#include "G4PSTrackLength.hh"
44#include "G4PSNofStep.hh"
45#include "G4PSMinKinEAtGeneration.hh"
46#include "G4VSDFilter.hh"
47#include "G4SDParticleFilter.hh"
48#include "G4ios.hh"
49#include "G4SystemOfUnits.hh"
50
51//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
52
53G4ThreadLocal G4bool RE06ParallelWorld::fSDConstructed = false;
54
56:G4VUserParallelWorld(worldName),
57 fConstructed(false),
58 fSerial(false),
59 fTotalThickness(2.0*m),
60 fNumberOfLayers(20)
61{
62 for(size_t i=0;i<3;i++)
63 {
64 fCalorLogical[i] = 0;
65 fLayerLogical[i] = 0;
66 fCalorPhysical[i] = 0;
67 fLayerPhysical[i] = 0;
68 }
69 fCalName[0] = "Calor-AP";
70 fCalName[1] = "Calor-BP";
71 fCalName[2] = "Calor-CP";
72}
73
74//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
75
78
79//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
80
82{
83 if(!fConstructed)
84 {
85 fConstructed = true;
87 }
88}
89
90//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
91
93{
95 {
96 fSDConstructed = true;
98 }
99}
100
101//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
103{
104 //
105 // World
106 //
107 G4VPhysicalVolume* ghostWorld = GetWorld();
108 G4LogicalVolume* worldLogical = ghostWorld->GetLogicalVolume();
109
110 //
111 // Calorimeter
112 //
113 G4VSolid* calorSolid
114 = new G4Tubs("Calor",0.0,0.5*m,fTotalThickness/2.,0.0,360.*deg);
115 G4int i;
116 for(i=0;i<3;i++)
117 {
118 fCalorLogical[i] = new G4LogicalVolume(calorSolid,0,fCalName[i]);
119 if(fSerial)
120 {
121 fCalorPhysical[i] = new G4PVPlacement(0,
122 G4ThreeVector(0.,0.,G4double(i-1)*fTotalThickness),
123 fCalorLogical[i],fCalName[i],worldLogical,false,i);
124 }
125 else
126 {
127 fCalorPhysical[i] = new G4PVPlacement(0,
128 G4ThreeVector(0.,G4double(i-1)*m,0.),
129 fCalorLogical[i],fCalName[i],worldLogical,false,i);
130 }
131 }
132
133 //
134 // Layers --- as absorbers
135 //
136 G4VSolid* layerSolid
137 = new G4Tubs("Layer",0.0,0.5*m,fTotalThickness/2.,0.0,360.*deg);
138 for(i=0;i<3;i++)
139 {
140 fLayerLogical[i]
141 = new G4LogicalVolume(layerSolid,0,fCalName[i]+"_LayerLog");
143 = new G4PVReplica(fCalName[i]+"_Layer",fLayerLogical[i],fCalorLogical[i],
145 }
146
147}
148
149//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
150
152{
153 G4SDManager::GetSDMpointer()->SetVerboseLevel(1);
154 G4String filterName, particleName;
155
156 G4SDParticleFilter* gammaFilter
157 = new G4SDParticleFilter(filterName="gammaFilter",particleName="gamma");
158 G4SDParticleFilter* electronFilter
159 = new G4SDParticleFilter(filterName="electronFilter",particleName="e-");
160 G4SDParticleFilter* positronFilter
161 = new G4SDParticleFilter(filterName="positronFilter",particleName="e+");
162 G4SDParticleFilter* epFilter
163 = new G4SDParticleFilter(filterName="epFilter");
164 epFilter->add(particleName="e-");
165 epFilter->add(particleName="e+");
166
167 for(G4int i=0;i<3;i++)
168 {
169 G4String detName = fCalName[i]+"_para";
171
172 G4VPrimitiveScorer* primitive;
173 primitive = new G4PSEnergyDeposit("eDep");
174 det->RegisterPrimitive(primitive);
175 primitive = new G4PSNofSecondary("nGamma");
176 primitive->SetFilter(gammaFilter);
177 det->RegisterPrimitive(primitive);
178 primitive = new G4PSNofSecondary("nElectron");
179 primitive->SetFilter(electronFilter);
180 det->RegisterPrimitive(primitive);
181 primitive = new G4PSNofSecondary("nPositron");
182 primitive->SetFilter(positronFilter);
183 det->RegisterPrimitive(primitive);
184 primitive = new G4PSTrackLength("trackLength");
185 primitive->SetFilter(epFilter);
186 det->RegisterPrimitive(primitive);
187 primitive = new G4PSNofStep("nStep");
188 primitive->SetFilter(epFilter);
189 det->RegisterPrimitive(primitive);
190
191 G4SDManager::GetSDMpointer()->AddNewDetector(det);
192 SetSensitiveDetector(fLayerLogical[i], det);
193 }
194 G4SDManager::GetSDMpointer()->SetVerboseLevel(0);
195
196}
197
198//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
199
201{
202 if(fSerial==serial) return;
203 fSerial=serial;
204 if(!fConstructed) return;
205 for(G4int i=0;i<3;i++)
206 {
207 if(fSerial)
208 {
210 ->SetTranslation(G4ThreeVector(0.,0.,G4double(i-1)*2.*m));
211 }
212 else
213 {
215 ->SetTranslation(G4ThreeVector(0.,G4double(i-1)*m,0.));
216 }
217 }
218}
219
220//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
Definition of the RE06ParallelWorld class.
G4VPhysicalVolume * fCalorPhysical[3]
static G4ThreadLocal G4bool fSDConstructed
G4LogicalVolume * fCalorLogical[3]
virtual void ConstructSD()
G4VPhysicalVolume * fLayerPhysical[3]
RE06ParallelWorld(G4String worldName)
virtual void Construct()
G4LogicalVolume * fLayerLogical[3]
void SetSerialGeometry(G4bool ser)

Applications | User Support | Publications | Collaboration