ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
B2bDetectorConstruction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file B2bDetectorConstruction.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 //
26 //
29 
30 #include "B2bDetectorConstruction.hh"
31 #include "B2bDetectorMessenger.hh"
32 #include "B2bChamberParameterisation.hh"
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"
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 
62 
65  fLogicTarget(NULL), fLogicChamber(NULL),
66  fTargetMaterial(NULL), fChamberMaterial(NULL),
67  fStepLimit(NULL),
68  fCheckOverlaps(true)
69 {
70  fMessenger = new B2bDetectorMessenger(this);
71 }
72 
73 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
74 
76 {
77  delete fStepLimit;
78  delete fMessenger;
79  delete fMagFieldMessenger;
81 }
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
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 
142 
143  G4cout << "Computed tolerance = "
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 
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");
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();
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;
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......