ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RE06ParallelWorld.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file RE06ParallelWorld.cc
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 //
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"
40 #include "G4VPrimitiveScorer.hh"
41 #include "G4PSEnergyDeposit.hh"
42 #include "G4PSNofSecondary.hh"
43 #include "G4PSTrackLength.hh"
44 #include "G4PSNofStep.hh"
46 #include "G4VSDFilter.hh"
47 #include "G4SDParticleFilter.hh"
48 #include "G4ios.hh"
49 #include "G4SystemOfUnits.hh"
50 
51 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
52 
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 
77 {;}
78 
79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
80 
82 {
83  if(!fConstructed)
84  {
85  fConstructed = true;
86  SetupGeometry();
87  }
88 }
89 
90 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
91 
93 {
94  if(!fSDConstructed)
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,
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");
142  fLayerPhysical[i]
143  = new G4PVReplica(fCalName[i]+"_Layer",fLayerLogical[i],fCalorLogical[i],
145  }
146 
147 }
148 
149 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
150 
152 {
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 
193  }
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  {
209  fCalorPhysical[i]
210  ->SetTranslation(G4ThreeVector(0.,0.,G4double(i-1)*2.*m));
211  }
212  else
213  {
214  fCalorPhysical[i]
215  ->SetTranslation(G4ThreeVector(0.,G4double(i-1)*m,0.));
216  }
217  }
218 }
219 
220 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......