ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DetectorConstruction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file DetectorConstruction.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 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
33 
34 #include "DetectorConstruction.hh"
35 #include "G4Material.hh"
36 #include "G4MaterialTable.hh"
37 #include "G4Element.hh"
38 #include "G4ProductionCuts.hh"
39 #include "G4ElementTable.hh"
40 #include "G4Box.hh"
41 #include "G4Tubs.hh"
42 #include "G4LogicalVolume.hh"
43 #include "G4Region.hh"
44 #include "G4ThreeVector.hh"
45 #include "G4PVPlacement.hh"
46 #include "G4SDManager.hh"
47 #include "G4SystemOfUnits.hh"
48 #include "G4NistManager.hh"
49 #include "G4RegionStore.hh"
50 #include "BiasingOperator.hh"
51 
52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
53 
55  fSiliconTrackerLogical( nullptr ), fEmCaloLogical( nullptr ), fHadCaloLogical( nullptr ) {}
56 
57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
58 
60 
61 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
62 
64 
65  G4cout << "\nDetectorConstruction....\n" << G4endl;
66 
67  //--------- Material definition ---------
68  G4NistManager* nistManager = G4NistManager::Instance();
69  G4Material* air = nistManager->FindOrBuildMaterial( "G4_AIR" );
70  G4Material* csi = nistManager->FindOrBuildMaterial( "G4_CESIUM_IODIDE" );
71  G4Material* silicon = nistManager->FindOrBuildMaterial( "G4_Si" );
72  G4Material* iron = nistManager->FindOrBuildMaterial( "G4_Fe" );
73 
74  // World
75  G4Box* worldBox = new G4Box( "WorldBox", 200.0*cm, 200.0*cm, 200.0*cm );
76  G4LogicalVolume* worldLogical = new G4LogicalVolume( worldBox, air, "WorldLogical", 0, 0, 0 );
77  G4PVPlacement* worldPhys = new G4PVPlacement( 0, G4ThreeVector(), "WorldPhysical",
78  worldLogical, 0, false, 0 );
79 
80  // Silicon Tracker: for simplicity and to have more hadronic interactions,
81  // it is single layer of silicon (20 cm thick)
82  G4double halfDetectorXYsize = 100.0*cm;
83  G4Box* siliconBox = new G4Box( "siliconBox", halfDetectorXYsize, halfDetectorXYsize, 10.0*cm );
84  fSiliconTrackerLogical = new G4LogicalVolume( siliconBox, silicon,
85  "SiliconTrackerLogical", 0, 0, 0 );
86  new G4PVPlacement( 0, G4ThreeVector( 0.0, 0.0, 0.0 ), "SiliconTrackerPhysical",
87  fSiliconTrackerLogical, worldPhys, false, 0 );
88 
89  // Electromagnetic (EM) calorimeter: an homogeneous crystal (40 cm thick)
90  G4Box* emCaloBox = new G4Box( "EmCaloBox", halfDetectorXYsize, halfDetectorXYsize, 20.0*cm );
91  fEmCaloLogical = new G4LogicalVolume( emCaloBox, csi, "EmCalorimeterLogical", 0, 0, 0 );
92  new G4PVPlacement( 0, G4ThreeVector( 0.0, 0.0, 35.0*cm ), "EmCalorimeterPhysical",
93  fEmCaloLogical, worldPhys, false, 0 );
94 
95  // The hadronic (HAD) calorimeter: an homogeneous block of metal (100 cm thick)
96  G4Box* hadCaloBox = new G4Box( "HadCaloBox", halfDetectorXYsize, halfDetectorXYsize, 50.0*cm );
97  fHadCaloLogical = new G4LogicalVolume( hadCaloBox, iron, "HadCaloLogical", 0, 0, 0 );
98  new G4PVPlacement( 0, G4ThreeVector( 0.0, 0.0, 110.0*cm ), "HadCaloPhysical",
99  fHadCaloLogical, worldPhys, false, 0 );
100 
101  // Define the tracker region
102  G4Region* trackerRegion = new G4Region( "Tracker_region" );
104  std::vector< double > cuts;
105  cuts.push_back( 10.0*cm ); cuts.push_back( 10.0*cm );
106  cuts.push_back( 10.0*cm ); cuts.push_back( 10.0*cm );
107  trackerRegion->SetProductionCuts( new G4ProductionCuts );
108  trackerRegion->GetProductionCuts()->SetProductionCuts( cuts );
109 
110  // Define the EM calorimeter region
111  G4Region* emCaloRegion = new G4Region( "EM_calo_region" );
112  emCaloRegion->AddRootLogicalVolume( fEmCaloLogical );
113  cuts.clear();
114  cuts.push_back( 20.0*cm ); cuts.push_back( 20.0*cm );
115  cuts.push_back( 20.0*cm ); cuts.push_back( 20.0*cm );
116  emCaloRegion->SetProductionCuts( new G4ProductionCuts );
117  emCaloRegion->GetProductionCuts()->SetProductionCuts( cuts );
118 
119  // Define the HAD calorimeter region
120  G4Region* hadCaloRegion = new G4Region( "HAD_calo_region" );
121  hadCaloRegion->AddRootLogicalVolume( fHadCaloLogical );
122  cuts.clear();
123  cuts.push_back( 50.0*cm ); cuts.push_back( 50.0*cm );
124  cuts.push_back( 50.0*cm ); cuts.push_back( 50.0*cm );
125  hadCaloRegion->SetProductionCuts( new G4ProductionCuts );
126  hadCaloRegion->GetProductionCuts()->SetProductionCuts( cuts );
127 
128  return worldPhys;
129 }
130 
131 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
132 
134  // Instanciate the biasing operator and specify the particles of interest (i.e. p, n, pi+, pi-)
135  // and the logical volume(s) where this operator should be applied.
136  BiasingOperator* biasingOperator = new BiasingOperator;
137  biasingOperator->AddParticle( "proton" );
138  biasingOperator->AddParticle( "neutron" );
139  biasingOperator->AddParticle( "pi+" );
140  biasingOperator->AddParticle( "pi-" );
141  biasingOperator->AttachTo( fSiliconTrackerLogical );
142 }
143 
144 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......