Loading...
Searching...
No Matches
B2bDetectorConstruction.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//
27/// \file B2bDetectorConstruction.cc
28/// \brief Implementation of the B2bDetectorConstruction class
29
33#include "B2TrackerSD.hh"
34
35#include "G4Material.hh"
36#include "G4NistManager.hh"
37
38#include "G4Box.hh"
39#include "G4Tubs.hh"
40#include "G4LogicalVolume.hh"
41#include "G4PVPlacement.hh"
42#include "G4PVParameterised.hh"
43#include "G4GlobalMagFieldMessenger.hh"
44#include "G4SDManager.hh"
45
46#include "G4GeometryTolerance.hh"
47#include "G4GeometryManager.hh"
48
49#include "G4UserLimits.hh"
50
51#include "G4VisAttributes.hh"
52#include "G4Colour.hh"
53
54#include "G4SystemOfUnits.hh"
55
56//#include "G4ios.hh"
57
58//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
59
60G4ThreadLocal
62
65 fLogicTarget(NULL), fLogicChamber(NULL),
66 fTargetMaterial(NULL), fChamberMaterial(NULL),
67 fStepLimit(NULL),
68 fCheckOverlaps(true)
69{
71}
72
73//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
74
82
83//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
84
86{
87 // Define materials
89
90 // Define volumes
91 return DefineVolumes();
92}
93
94//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
95
97{
98 // Material definition
99
100 G4NistManager* nistManager = G4NistManager::Instance();
101
102 // Air defined using NIST Manager
103 nistManager->FindOrBuildMaterial("G4_AIR");
104
105 // Lead defined using NIST Manager
106 fTargetMaterial = nistManager->FindOrBuildMaterial("G4_Pb");
107
108 // Xenon gas defined using NIST Manager
109 fChamberMaterial = nistManager->FindOrBuildMaterial("G4_Xe");
110
111 // Print materials
112 G4cout << *(G4Material::GetMaterialTable()) << G4endl;
113}
114
115//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
116
118{
119 G4Material* air = G4Material::GetMaterial("G4_AIR");
120
121 // Sizes of the principal geometrical components (solids)
122
123 G4int NbOfChambers = 5;
124 G4double chamberSpacing = 80*cm; // from chamber center to center!
125
126 G4double chamberWidth = 20.0*cm; // width of the chambers
127 G4double targetLength = 5.0*cm; // full length of Target
128
129 G4double trackerLength = (NbOfChambers+1)*chamberSpacing;
130
131 G4double worldLength = 1.2 * (2*targetLength + trackerLength);
132
133 G4double targetRadius = 0.5*targetLength; // Radius of Target
134 targetLength = 0.5*targetLength; // Half length of the Target
135 G4double trackerSize = 0.5*trackerLength; // Half length of the Tracker
136
137 // Definitions of Solids, Logical Volumes, Physical Volumes
138
139 // World
140
141 G4GeometryManager::GetInstance()->SetWorldMaximumExtent(worldLength);
142
143 G4cout << "Computed tolerance = "
144 << G4GeometryTolerance::GetInstance()->GetSurfaceTolerance()/mm
145 << " mm" << G4endl;
146
147 G4Box* worldS
148 = new G4Box("world", //its name
149 worldLength/2,worldLength/2,worldLength/2); //its size
150 G4LogicalVolume* worldLV
151 = new G4LogicalVolume(
152 worldS, //its solid
153 air, //its material
154 "World"); //its name
155
156 // Must place the World Physical volume unrotated at (0,0,0).
157 //
158 G4VPhysicalVolume* worldPV
159 = new G4PVPlacement(
160 0, // no rotation
161 G4ThreeVector(), // at (0,0,0)
162 worldLV, // its logical volume
163 "World", // its name
164 0, // its mother volume
165 false, // no boolean operations
166 0, // copy number
167 fCheckOverlaps); // checking overlaps
168
169 // Target
170
171 G4ThreeVector positionTarget = G4ThreeVector(0,0,-(targetLength+trackerSize));
172
173 G4Tubs* targetS
174 = new G4Tubs("target",0.,targetRadius,targetLength,0.*deg,360.*deg);
176 = new G4LogicalVolume(targetS, fTargetMaterial,"Target",0,0,0);
177 new G4PVPlacement(0, // no rotation
178 positionTarget, // at (x,y,z)
179 fLogicTarget, // its logical volume
180 "Target", // its name
181 worldLV, // its mother volume
182 false, // no boolean operations
183 0, // copy number
184 fCheckOverlaps); // checking overlaps
185
186 G4cout << "Target is " << 2*targetLength/cm << " cm of "
187 << fTargetMaterial->GetName() << G4endl;
188
189 // Tracker
190
191 G4ThreeVector positionTracker = G4ThreeVector(0,0,0);
192
193 G4Tubs* trackerS
194 = new G4Tubs("tracker",0,trackerSize,trackerSize, 0.*deg, 360.*deg);
195 G4LogicalVolume* trackerLV
196 = new G4LogicalVolume(trackerS, air, "Tracker",0,0,0);
197 new G4PVPlacement(0, // no rotation
198 positionTracker, // at (x,y,z)
199 trackerLV, // its logical volume
200 "Tracker", // its name
201 worldLV, // its mother volume
202 false, // no boolean operations
203 0, // copy number
204 fCheckOverlaps); // checking overlaps
205
206 // Tracker segments
207
208 // An example of Parameterised volumes
209 // Dummy values for G4Tubs -- modified by parameterised volume
210
211 G4Tubs* chamberS
212 = new G4Tubs("tracker",0, 100*cm, 100*cm, 0.*deg, 360.*deg);
214 = new G4LogicalVolume(chamberS,fChamberMaterial,"Chamber",0,0,0);
215
216 G4double firstPosition = -trackerSize + chamberSpacing;
217 G4double firstLength = trackerLength/10;
218 G4double lastLength = trackerLength;
219
220 G4VPVParameterisation* chamberParam =
222 NbOfChambers, // NoChambers
223 firstPosition, // Z of center of first
224 chamberSpacing, // Z spacing of centers
225 chamberWidth, // chamber width
226 firstLength, // initial length
227 lastLength); // final length
228
229 // dummy value : kZAxis -- modified by parameterised volume
230
231 new G4PVParameterised("Chamber", // their name
232 fLogicChamber, // their logical volume
233 trackerLV, // Mother logical volume
234 kZAxis, // Are placed along this axis
235 NbOfChambers, // Number of chambers
236 chamberParam, // The parametrisation
237 fCheckOverlaps); // checking overlaps
238
239 G4cout << "There are " << NbOfChambers << " chambers in the tracker region. "
240 << "\nThe chambers are " << chamberWidth/cm << " cm of "
241 << fChamberMaterial->GetName() << "\nThe distance between chamber is "
242 << chamberSpacing/cm << " cm" << G4endl;
243
244 // Visualization attributes
245
246 G4VisAttributes* boxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0));
247 worldLV ->SetVisAttributes(boxVisAtt);
248 fLogicTarget ->SetVisAttributes(boxVisAtt);
249 trackerLV ->SetVisAttributes(boxVisAtt);
250
251 G4VisAttributes* chamberVisAtt = new G4VisAttributes(G4Colour(1.0,1.0,0.0));
252 fLogicChamber->SetVisAttributes(chamberVisAtt);
253
254 // Example of User Limits
255 //
256 // Below is an example of how to set tracking constraints in a given
257 // logical volume
258 //
259 // Sets a max step length in the tracker region, with G4StepLimiter
260
261 G4double maxStep = 0.5*chamberWidth;
262 fStepLimit = new G4UserLimits(maxStep);
263 trackerLV->SetUserLimits(fStepLimit);
264
265 /// Set additional contraints on the track, with G4UserSpecialCuts
266 ///
267 /// G4double maxLength = 2*trackerLength, maxTime = 0.1*ns, minEkin = 10*MeV;
268 /// trackerLV->SetUserLimits(new G4UserLimits(maxStep,
269 /// maxLength,
270 /// maxTime,
271 /// minEkin));
272
273 // Always return the physical world
274
275 return worldPV;
276}
277
278//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
279
281{
282 // Sensitive detectors
283
284 G4String trackerChamberSDname = "B2/TrackerChamberSD";
285 B2TrackerSD* aTrackerSD = new B2TrackerSD(trackerChamberSDname,
286 "TrackerHitsCollection");
287 G4SDManager::GetSDMpointer()->AddNewDetector(aTrackerSD);
288 SetSensitiveDetector( fLogicChamber, aTrackerSD );
289
290 // Create global magnetic field messenger.
291 // Uniform magnetic field is then created automatically if
292 // the field value is not zero.
293 G4ThreeVector fieldValue = G4ThreeVector();
295 fMagFieldMessenger->SetVerboseLevel(1);
296}
297
298//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
299
301{
302 G4NistManager* nistManager = G4NistManager::Instance();
303
304 G4Material* pttoMaterial =
305 nistManager->FindOrBuildMaterial(materialName);
306
307 if (fTargetMaterial != pttoMaterial) {
308 if ( pttoMaterial ) {
309 fTargetMaterial = pttoMaterial;
310 if (fLogicTarget) fLogicTarget->SetMaterial(fTargetMaterial);
311 G4cout << "\n----> The target is made of " << materialName << G4endl;
312 } else {
313 G4cout << "\n--> WARNING from SetTargetMaterial : "
314 << materialName << " not found" << G4endl;
315 }
316 }
317}
318
319//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
320
322{
323 G4NistManager* nistManager = G4NistManager::Instance();
324
325 G4Material* pttoMaterial =
326 nistManager->FindOrBuildMaterial(materialName);
327
328 if (fChamberMaterial != pttoMaterial) {
329 if ( pttoMaterial ) {
330 fChamberMaterial = pttoMaterial;
332 G4cout << "\n----> The chambers are made of " << materialName << G4endl;
333 } else {
334 G4cout << "\n--> WARNING from SetChamberMaterial : "
335 << materialName << " not found" << G4endl;
336 }
337 }
338}
339
340//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
341
343{
344 if ((fStepLimit)&&(maxStep>0.)) fStepLimit->SetMaxAllowedStep(maxStep);
345}
346
347//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
Definition of the B2TrackerSD class.
Definition of the B2bChamberParameterisation class.
Definition of the B2bDetectorConstruction class.
Definition of the B2bDetectorMessenger class.
B2Tracker sensitive detector class.
A parameterisation that describes a series of boxes along Z.
virtual G4VPhysicalVolume * Construct()
B2bDetectorMessenger * fMessenger
G4VPhysicalVolume * DefineVolumes()
static G4ThreadLocal G4GlobalMagFieldMessenger * fMagFieldMessenger
Messenger class that defines commands for B2bDetectorConstruction.

Applications | User Support | Publications | Collaboration