Geant4-11
Public Member Functions | Protected Member Functions | Private Attributes
ExN01DetectorConstruction Class Reference

#include <ExN01DetectorConstruction.hh>

Inheritance diagram for ExN01DetectorConstruction:
G4VUserDetectorConstruction

Public Member Functions

virtual void CloneF ()
 
virtual void CloneSD ()
 
G4VPhysicalVolumeConstruct ()
 
G4int ConstructParallelGeometries ()
 
void ConstructParallelSD ()
 
virtual void ConstructSDandField ()
 
 ExN01DetectorConstruction ()
 
G4int GetNumberOfParallelWorld () const
 
G4VUserParallelWorldGetParallelWorld (G4int i) const
 
void RegisterParallelWorld (G4VUserParallelWorld *)
 
 ~ExN01DetectorConstruction ()
 

Protected Member Functions

void SetSensitiveDetector (const G4String &logVolName, G4VSensitiveDetector *aSD, G4bool multi=false)
 
void SetSensitiveDetector (G4LogicalVolume *logVol, G4VSensitiveDetector *aSD)
 

Private Attributes

G4LogicalVolumecalorimeterBlock_log
 
G4VPhysicalVolumecalorimeterBlock_phys
 
G4LogicalVolumecalorimeterLayer_log
 
G4VPhysicalVolumecalorimeterLayer_phys
 
G4LogicalVolumeexperimentalHall_log
 
G4VPhysicalVolumeexperimentalHall_phys
 
std::vector< G4VUserParallelWorld * > parallelWorld
 
G4LogicalVolumetracker_log
 
G4VPhysicalVolumetracker_phys
 

Detailed Description

Definition at line 47 of file ExN01DetectorConstruction.hh.

Constructor & Destructor Documentation

◆ ExN01DetectorConstruction()

ExN01DetectorConstruction::ExN01DetectorConstruction ( )

◆ ~ExN01DetectorConstruction()

ExN01DetectorConstruction::~ExN01DetectorConstruction ( )

Definition at line 58 of file ExN01DetectorConstruction.cc.

60{
61}

Member Function Documentation

◆ CloneF()

void G4VUserDetectorConstruction::CloneF ( )
virtualinherited

Definition at line 126 of file G4VUserDetectorConstruction.cc.

127{
128 using FMtoFMmap = std::map<G4FieldManager*, G4FieldManager*>;
129 using FMpair = std::pair<G4FieldManager*, G4FieldManager*>;
130
131 FMtoFMmap masterToWorker;
133 for(auto it = logVolStore->cbegin(); it != logVolStore->cend(); ++it)
134 {
135 G4LogicalVolume* g4LogicalVolume = *it;
136 // Use shadow of master to get instance of FM
137 G4FieldManager* masterFM = nullptr; // g4LogicalVolume->fFieldManager;
138 G4FieldManager* clonedFM = nullptr;
139 if(masterFM != nullptr)
140 {
141 auto fmFound = masterToWorker.find(masterFM);
142 if(fmFound == masterToWorker.cend())
143 {
144 // First time we see this SD, let's clone and remember...
145 try
146 {
147 auto insertedEl =
148 masterToWorker.insert(FMpair(masterFM, masterFM->Clone()));
149 clonedFM = (insertedEl.first)->second;
150 } catch(...)
151 {
153 msg << "Cloning of G4FieldManager failed."
154 << " But derived class does not implement cloning. Cannot "
155 "continue.";
156 G4Exception("G4VUserDetectorConstruction::CloneSD()", "Run0053",
157 FatalException, msg);
158 }
159 }
160 else
161 {
162 // We have already seen this SD attached to a different LogicalVolume,
163 // let's re-use previous clone
164 clonedFM = (*fmFound).second;
165 }
166 } // masterFM != 0
167 // Note that we do not push FM to daughters (false argument), however, since
168 // we area looping on all logical volumes and we implemented the "trick" of
169 // the map master<->cloned the final effect is the same as using here the
170 // correct Boolean flag: log-volumes that originally were sharing the same
171 // FM they will have cloned ones
172 g4LogicalVolume->SetFieldManager(clonedFM, false);
173 }
174}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
static constexpr double second
Definition: G4SIunits.hh:137
virtual G4FieldManager * Clone() const
static G4LogicalVolumeStore * GetInstance()
void SetFieldManager(G4FieldManager *pFieldMgr, G4bool forceToAllDaughters)

References G4FieldManager::Clone(), FatalException, G4Exception(), G4LogicalVolumeStore::GetInstance(), second, and G4LogicalVolume::SetFieldManager().

◆ CloneSD()

void G4VUserDetectorConstruction::CloneSD ( )
virtualinherited

Definition at line 177 of file G4VUserDetectorConstruction.cc.

178{
179 // Loop on ALL logial volumes to search for attached SD
181
182 using SDtoSDmap = std::map<G4VSensitiveDetector*, G4VSensitiveDetector*>;
183 using SDpair = std::pair<G4VSensitiveDetector*, G4VSensitiveDetector*>;
184 SDtoSDmap masterToWorker;
185
186 for(auto it = logVolStore->cbegin(); it != logVolStore->cend(); ++it)
187 {
188 G4LogicalVolume* g4LogicalVolume = *it;
189 // Use shadow of master to get the instance of SD
190 G4VSensitiveDetector* masterSD = nullptr;
191 G4VSensitiveDetector* clonedSD = nullptr;
192 if(masterSD != nullptr)
193 {
194 auto sdFound = masterToWorker.find(masterSD);
195 if(sdFound == masterToWorker.cend())
196 {
197 // First time we see this SD, let's clone and remember...
198 try
199 {
200 auto insertedEl =
201 masterToWorker.insert(SDpair(masterSD, masterSD->Clone()));
202 clonedSD = (insertedEl.first)->second;
203 } catch(...)
204 {
206 msg << "Cloning of G4VSensitiveDetector requested for:"
207 << masterSD->GetName() << "\n"
208#ifndef WIN32
209 << " (full path name: " << masterSD->GetFullPathName() << ").\n"
210#endif
211 << " But derived class does not implement cloning. Cannot "
212 "continue.";
213 G4Exception("G4VUserDetectorConstruction::CloneSD()", "Run0053",
214 FatalException, msg);
215 }
216 }
217 else
218 {
219 // We have already seen this SD attached to a different LogicalVolume,
220 // let's re-use previous clone
221 clonedSD = (*sdFound).second;
222 }
223 } // masterSD!=0
224 g4LogicalVolume->SetSensitiveDetector(clonedSD);
225 }
226}
void SetSensitiveDetector(G4VSensitiveDetector *pSDetector)
virtual G4VSensitiveDetector * Clone() const
G4String GetFullPathName() const

References G4VSensitiveDetector::Clone(), FatalException, G4Exception(), G4VSensitiveDetector::GetFullPathName(), G4LogicalVolumeStore::GetInstance(), G4VSensitiveDetector::GetName(), second, and G4LogicalVolume::SetSensitiveDetector().

◆ Construct()

G4VPhysicalVolume * ExN01DetectorConstruction::Construct ( )
virtual

Implements G4VUserDetectorConstruction.

Definition at line 64 of file ExN01DetectorConstruction.cc.

66{
67 //------------------------------------------------------ materials
68 G4double a; // atomic mass
69 G4double z; // atomic number
70 G4double density;
71
72 G4Material* Ar =
73 new G4Material("ArgonGas", z= 18., a= 39.95*g/mole, density= 1.782*mg/cm3);
74
75 G4Material* Al =
76 new G4Material("Aluminum", z= 13., a= 26.98*g/mole, density= 2.7*g/cm3);
77
78 G4Material* Pb =
79 new G4Material("Lead", z= 82., a= 207.19*g/mole, density= 11.35*g/cm3);
80
81 //------------------------------------------------------ volumes
82
83 //------------------------------ experimental hall (world volume)
84 //------------------------------ beam line along x axis
85
86 G4double expHall_x = 3.0*m;
87 G4double expHall_y = 1.0*m;
88 G4double expHall_z = 1.0*m;
89 G4Box* experimentalHall_box
90 = new G4Box("expHall_box",expHall_x,expHall_y,expHall_z);
91 experimentalHall_log = new G4LogicalVolume(experimentalHall_box,
92 Ar,"expHall_log",0,0,0);
95 "expHall",0,false,0);
96
97 //------------------------------ a tracker tube
98
99 G4double innerRadiusOfTheTube = 0.*cm;
100 G4double outerRadiusOfTheTube = 60.*cm;
101 G4double hightOfTheTube = 50.*cm;
102 G4double startAngleOfTheTube = 0.*deg;
103 G4double spanningAngleOfTheTube = 360.*deg;
104 G4Tubs* tracker_tube = new G4Tubs("tracker_tube",innerRadiusOfTheTube,
105 outerRadiusOfTheTube,hightOfTheTube,
106 startAngleOfTheTube,
107 spanningAngleOfTheTube);
108 tracker_log = new G4LogicalVolume(tracker_tube,Al,"tracker_log",0,0,0);
109 G4double trackerPos_x = -1.0*m;
110 G4double trackerPos_y = 0.*m;
111 G4double trackerPos_z = 0.*m;
113 G4ThreeVector(trackerPos_x,trackerPos_y,trackerPos_z),
114 tracker_log,"tracker",experimentalHall_log,false,0);
115
116 //------------------------------ a calorimeter block
117
118 G4double block_x = 1.0*m;
119 G4double block_y = 50.0*cm;
120 G4double block_z = 50.0*cm;
121 G4Box* calorimeterBlock_box = new G4Box("calBlock_box",block_x,
122 block_y,block_z);
123 calorimeterBlock_log = new G4LogicalVolume(calorimeterBlock_box,
124 Pb,"caloBlock_log",0,0,0);
125 G4double blockPos_x = 1.0*m;
126 G4double blockPos_y = 0.0*m;
127 G4double blockPos_z = 0.0*m;
129 G4ThreeVector(blockPos_x,blockPos_y,blockPos_z),
130 calorimeterBlock_log,"caloBlock",experimentalHall_log,false,0);
131
132 //------------------------------ calorimeter layers
133
134 G4double calo_x = 1.*cm;
135 G4double calo_y = 40.*cm;
136 G4double calo_z = 40.*cm;
137 G4Box* calorimeterLayer_box = new G4Box("caloLayer_box",
138 calo_x,calo_y,calo_z);
139 calorimeterLayer_log = new G4LogicalVolume(calorimeterLayer_box,
140 Al,"caloLayer_log",0,0,0);
141 for(G4int i=0;i<19;i++) // loop for 19 layers
142 {
143 G4double caloPos_x = (i-9)*10.*cm;
144 G4double caloPos_y = 0.0*m;
145 G4double caloPos_z = 0.0*m;
147 G4ThreeVector(caloPos_x,caloPos_y,caloPos_z),
148 calorimeterLayer_log,"caloLayer",calorimeterBlock_log,false,i);
149 }
150
151 //------------------------------------------------------------------
152
154}
static constexpr double mole
Definition: G4SIunits.hh:279
static constexpr double cm3
Definition: G4SIunits.hh:101
static constexpr double m
Definition: G4SIunits.hh:109
static constexpr double g
Definition: G4SIunits.hh:168
static constexpr double mg
Definition: G4SIunits.hh:169
static constexpr double cm
Definition: G4SIunits.hh:99
static constexpr double deg
Definition: G4SIunits.hh:132
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
Definition: G4Box.hh:56
Definition: G4Tubs.hh:75

References calorimeterBlock_log, calorimeterBlock_phys, calorimeterLayer_log, calorimeterLayer_phys, cm, cm3, deg, experimentalHall_log, experimentalHall_phys, g, m, mg, mole, tracker_log, and tracker_phys.

◆ ConstructParallelGeometries()

G4int G4VUserDetectorConstruction::ConstructParallelGeometries ( )
inherited

Definition at line 73 of file G4VUserDetectorConstruction.cc.

74{
75 G4int nP = 0;
76 for(auto pwItr = parallelWorld.cbegin();
77 pwItr != parallelWorld.cend(); ++pwItr)
78 {
79 (*pwItr)->Construct();
80 ++nP;
81 }
82 return nP;
83}
std::vector< G4VUserParallelWorld * > parallelWorld

References G4VUserDetectorConstruction::parallelWorld.

Referenced by G4RunManager::InitializeGeometry().

◆ ConstructParallelSD()

void G4VUserDetectorConstruction::ConstructParallelSD ( )
inherited

Definition at line 86 of file G4VUserDetectorConstruction.cc.

87{
88 for(auto pwItr = parallelWorld.cbegin();
89 pwItr != parallelWorld.cend(); ++pwItr)
90 {
91 (*pwItr)->ConstructSD();
92 }
93}

References G4VUserDetectorConstruction::parallelWorld.

Referenced by G4RunManager::InitializeGeometry(), and G4WorkerRunManager::InitializeGeometry().

◆ ConstructSDandField()

void G4VUserDetectorConstruction::ConstructSDandField ( )
virtualinherited

Definition at line 111 of file G4VUserDetectorConstruction.cc.

112{
113 // G4RunManager::RMType rmtype =
114 // G4RunManager::GetRunManager()->GetRunManagerType(); if(rmtype !=
115 // G4RunManager::sequentialRM)
116 // {
117 // G4cout
118 // << "User-derived detector construction class does not implement \n"
119 // << "ConstructSDandFiled method: workers will not have SD and fields!\n"
120 // << "The user can safely ignore this message if (s)he has no sensitive\n"
121 // << "detector or field in her/his application." << G4endl;
122 // }
123}

Referenced by G4RunManager::InitializeGeometry(), and G4WorkerRunManager::InitializeGeometry().

◆ GetNumberOfParallelWorld()

G4int G4VUserDetectorConstruction::GetNumberOfParallelWorld ( ) const
inherited

◆ GetParallelWorld()

G4VUserParallelWorld * G4VUserDetectorConstruction::GetParallelWorld ( G4int  i) const
inherited

Definition at line 103 of file G4VUserDetectorConstruction.cc.

104{
105 if(i < 0 || i >= GetNumberOfParallelWorld())
106 return nullptr;
107 return parallelWorld[i];
108}

References G4VUserDetectorConstruction::GetNumberOfParallelWorld(), and G4VUserDetectorConstruction::parallelWorld.

◆ RegisterParallelWorld()

void G4VUserDetectorConstruction::RegisterParallelWorld ( G4VUserParallelWorld aPW)
inherited

Definition at line 57 of file G4VUserDetectorConstruction.cc.

59{
60 auto pwItr = std::find(parallelWorld.cbegin(), parallelWorld.cend(), aPW);
61 if (pwItr != parallelWorld.cend())
62 {
63 G4String eM = "A parallel world <";
64 eM += aPW->GetName();
65 eM += "> is already registered to the user detector construction.";
66 G4Exception("G4VUserDetectorConstruction::RegisterParallelWorld",
67 "Run0051", FatalErrorInArgument, eM);
68 }
69 parallelWorld.push_back(aPW);
70}
@ FatalErrorInArgument
const G4String & GetName()

References FatalErrorInArgument, G4Exception(), G4VUserParallelWorld::GetName(), and G4VUserDetectorConstruction::parallelWorld.

◆ SetSensitiveDetector() [1/2]

void G4VUserDetectorConstruction::SetSensitiveDetector ( const G4String logVolName,
G4VSensitiveDetector aSD,
G4bool  multi = false 
)
protectedinherited

Definition at line 229 of file G4VUserDetectorConstruction.cc.

232{
233 G4bool found = false;
235 auto volmap = store->GetMap();
236 auto pos = volmap.find(logVolName);
237 if(pos != volmap.cend())
238 {
239 if ((pos->second.size()>1) && !multi)
240 {
241 G4String eM = "More than one logical volumes of name <";
242 eM += pos->first;
243 eM += "> are found and thus the sensitive detector <";
244 eM += aSD->GetName();
245 eM += "> cannot be uniquely assigned.";
246 G4Exception("G4VUserDetectorConstruction::SetSensitiveDetector()",
247 "Run0052", FatalErrorInArgument, eM);
248 }
249 found = true;
250 for (std::size_t i = 0; i < pos->second.size(); ++i)
251 {
252 SetSensitiveDetector(pos->second[i], aSD);
253 }
254 }
255 if(!found)
256 {
257 G4String eM2 = "No logical volume of name <";
258 eM2 += logVolName;
259 eM2 += "> is found. The specified sensitive detector <";
260 eM2 += aSD->GetName();
261 eM2 += "> couldn't be assigned to any volume.";
262 G4Exception("G4VUserDetectorConstruction::SetSensitiveDetector()",
263 "Run0053", FatalErrorInArgument, eM2);
264 }
265}
static const G4double pos
bool G4bool
Definition: G4Types.hh:86
const std::map< G4String, std::vector< G4LogicalVolume * > > & GetMap() const
void SetSensitiveDetector(const G4String &logVolName, G4VSensitiveDetector *aSD, G4bool multi=false)

References FatalErrorInArgument, G4Exception(), G4LogicalVolumeStore::GetInstance(), G4LogicalVolumeStore::GetMap(), G4VSensitiveDetector::GetName(), pos, and G4VUserDetectorConstruction::SetSensitiveDetector().

Referenced by MyDetectorConstruction::SetSDtoScoreVoxel(), and G4VUserDetectorConstruction::SetSensitiveDetector().

◆ SetSensitiveDetector() [2/2]

void G4VUserDetectorConstruction::SetSensitiveDetector ( G4LogicalVolume logVol,
G4VSensitiveDetector aSD 
)
protectedinherited

Definition at line 268 of file G4VUserDetectorConstruction.cc.

270{
271 assert(logVol != nullptr && aSD != nullptr);
272
273 // The aSD has already been added by user to the manager if needed
274 // G4SDManager::GetSDMpointer()->AddNewDetector(aSD);
275
276 // New Logic: allow for "multiple" SDs being attached to a single LV.
277 // To do that we use a special proxy SD called G4MultiSensitiveDetector
278
279 // Get existing SD if already set and check if it is of the special type
280 G4VSensitiveDetector* originalSD = logVol->GetSensitiveDetector();
281 if(originalSD == aSD)
282 {
284 msg << "Attempting to add multiple times the same sensitive detector (\"";
285 msg << originalSD->GetName() << "\") is not allowed, skipping.";
286 G4Exception("G4VUserDetectorConstruction::SetSensitiveDetector", "Run0054",
287 JustWarning, msg);
288 return;
289 }
290 if(originalSD == nullptr)
291 {
292 logVol->SetSensitiveDetector(aSD);
293 }
294 else
295 {
297 dynamic_cast<G4MultiSensitiveDetector*>(originalSD);
298 if(msd != nullptr)
299 {
300 msd->AddSD(aSD);
301 }
302 else
303 {
304 std::ostringstream mn;
305 mn << "/MultiSD_" << logVol->GetName() << "_" << logVol;
306 const G4String msdname = mn.str();
307 msd = new G4MultiSensitiveDetector(msdname);
308 // We need to register the proxy to have correct handling of IDs
310 msd->AddSD(originalSD);
311 msd->AddSD(aSD);
312 logVol->SetSensitiveDetector(msd);
313 }
314 }
315}
@ JustWarning
G4VSensitiveDetector * GetSensitiveDetector() const
const G4String & GetName() const
void AddSD(G4VSensitiveDetector *sd)
static G4SDManager * GetSDMpointer()
Definition: G4SDManager.cc:38
void AddNewDetector(G4VSensitiveDetector *aSD)
Definition: G4SDManager.cc:70

References G4SDManager::AddNewDetector(), G4MultiSensitiveDetector::AddSD(), G4Exception(), G4VSensitiveDetector::GetName(), G4LogicalVolume::GetName(), G4SDManager::GetSDMpointer(), G4LogicalVolume::GetSensitiveDetector(), JustWarning, and G4LogicalVolume::SetSensitiveDetector().

Field Documentation

◆ calorimeterBlock_log

G4LogicalVolume* ExN01DetectorConstruction::calorimeterBlock_log
private

Definition at line 60 of file ExN01DetectorConstruction.hh.

Referenced by Construct().

◆ calorimeterBlock_phys

G4VPhysicalVolume* ExN01DetectorConstruction::calorimeterBlock_phys
private

Definition at line 67 of file ExN01DetectorConstruction.hh.

Referenced by Construct().

◆ calorimeterLayer_log

G4LogicalVolume* ExN01DetectorConstruction::calorimeterLayer_log
private

Definition at line 61 of file ExN01DetectorConstruction.hh.

Referenced by Construct().

◆ calorimeterLayer_phys

G4VPhysicalVolume* ExN01DetectorConstruction::calorimeterLayer_phys
private

Definition at line 66 of file ExN01DetectorConstruction.hh.

Referenced by Construct().

◆ experimentalHall_log

G4LogicalVolume* ExN01DetectorConstruction::experimentalHall_log
private

Definition at line 58 of file ExN01DetectorConstruction.hh.

Referenced by Construct().

◆ experimentalHall_phys

G4VPhysicalVolume* ExN01DetectorConstruction::experimentalHall_phys
private

Definition at line 65 of file ExN01DetectorConstruction.hh.

Referenced by Construct().

◆ parallelWorld

std::vector<G4VUserParallelWorld*> G4VUserDetectorConstruction::parallelWorld
privateinherited

◆ tracker_log

G4LogicalVolume* ExN01DetectorConstruction::tracker_log
private

Definition at line 59 of file ExN01DetectorConstruction.hh.

Referenced by Construct().

◆ tracker_phys

G4VPhysicalVolume* ExN01DetectorConstruction::tracker_phys
private

Definition at line 68 of file ExN01DetectorConstruction.hh.

Referenced by Construct().


The documentation for this class was generated from the following files: