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

#include <MyDetectorConstruction.hh>

Inheritance diagram for MyDetectorConstruction:
G4VUserDetectorConstruction

Public Member Functions

virtual void CloneF ()
 
virtual void CloneSD ()
 
virtual G4VPhysicalVolumeConstruct ()
 
G4int ConstructParallelGeometries ()
 
void ConstructParallelSD ()
 
virtual void ConstructSDandField ()
 
G4int GetNumberOfParallelWorld () const
 
G4VUserParallelWorldGetParallelWorld (G4int i) const
 
 MyDetectorConstruction ()
 
void RegisterParallelWorld (G4VUserParallelWorld *)
 
void SetSDtoScoreVoxel (G4VSensitiveDetector *asd)
 
 ~MyDetectorConstruction ()
 

Protected Member Functions

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

Private Attributes

std::vector< G4VUserParallelWorld * > parallelWorld
 
G4LogicalVolumescoreVoxel
 

Detailed Description

Definition at line 44 of file MyDetectorConstruction.hh.

Constructor & Destructor Documentation

◆ MyDetectorConstruction()

MyDetectorConstruction::MyDetectorConstruction ( )

Definition at line 48 of file MyDetectorConstruction.cc.

49 : scoreVoxel(0)
51{
52}

◆ ~MyDetectorConstruction()

MyDetectorConstruction::~MyDetectorConstruction ( )

Definition at line 55 of file MyDetectorConstruction.cc.

57{
58}

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 * MyDetectorConstruction::Construct ( )
virtual

Implements G4VUserDetectorConstruction.

Definition at line 61 of file MyDetectorConstruction.cc.

63{
64 G4Material* mate;
66
67 // ==============================================================
68 // world volume
69 // ==============================================================
70 G4Box* areaSolid= new G4Box("area", 25.*cm, 25.*cm, 1.1*m);
71 G4Material* vacuum= G4Material::GetMaterial("Vacuum");
72 G4LogicalVolume* areaLV= new G4LogicalVolume(areaSolid, vacuum, "area");
73 G4PVPlacement* area= new G4PVPlacement(0, G4ThreeVector(), "area",
74 areaLV, 0, false, 0);
75 // vis. attributes
76 va= new G4VisAttributes(G4Color(1.,1.,1.));
77 va-> SetVisibility(false);
78 areaLV-> SetVisAttributes(va);
79
80 // ==============================================================
81 // phantom
82 // ==============================================================
83 // water phantom
84 const double dxyphantom= 40.*cm;
85 const double dzphantom= 50.*cm;
86
87 G4Box* sphantom= new G4Box("phantom",
88 dxyphantom/2., dxyphantom/2., dzphantom/2.);
89 G4Material* water= G4Material::GetMaterial("Water");
90 G4LogicalVolume* lphantom= new G4LogicalVolume(sphantom,
91 water, "phantom");
92 G4PVPlacement* phantom= new G4PVPlacement(0,
93 G4ThreeVector(0.,0., dzphantom/2.),
94 lphantom, "phantom",
95 areaLV, false, 0);
96
97 va= new G4VisAttributes(G4Color(0.,0.1,0.8));
98 lphantom-> SetVisAttributes(va);
99
100 // score voxels
101 const G4double dvoxel= 2.*mm;
102 const G4double dvoxel_y= 20.*mm;
103
104 G4Box* svoxel= new G4Box("voxel", dvoxel/2., dvoxel_y/2., dvoxel/2.);
105 scoreVoxel= new G4LogicalVolume(svoxel, water, "voxel");
106 va= new G4VisAttributes(G4Color(0.,0.8,0.8));
107 va-> SetVisibility(false);
108 scoreVoxel-> SetVisAttributes(va);
109
110 G4int ix, iz;
111 G4int index=0;
112 for (iz=0; iz<200; iz++) {
113 for (ix=-40; ix<=40; ix++) {
114 G4double x0= ix*dvoxel;
115 G4double z0= -dzphantom/2.+(iz+0.5)*dvoxel;
116 G4PVPlacement* pvoxel= new
117 G4PVPlacement(0, G4ThreeVector(x0, 0., z0),
118 scoreVoxel, "voxel", lphantom,
119 false, index);
120 index++;
121 }
122 }
123
124 return area;
125}
G4Colour G4Color
Definition: G4Color.hh:41
static constexpr double m
Definition: G4SIunits.hh:109
static constexpr double mm
Definition: G4SIunits.hh:95
static constexpr double cm
Definition: G4SIunits.hh:99
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
Definition: G4Box.hh:56
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
Definition: G4Material.cc:686

References cm, G4Material::GetMaterial(), m, mm, scoreVoxel, and G4InuclParticleNames::z0.

◆ 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.

◆ SetSDtoScoreVoxel()

void MyDetectorConstruction::SetSDtoScoreVoxel ( G4VSensitiveDetector asd)

Definition at line 129 of file MyDetectorConstruction.cc.

131{
132 if(scoreVoxel) {
134 }
135}
void SetSensitiveDetector(const G4String &logVolName, G4VSensitiveDetector *aSD, G4bool multi=false)

References scoreVoxel, and G4VUserDetectorConstruction::SetSensitiveDetector().

Referenced by BOOST_PYTHON_MODULE().

◆ 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

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

Referenced by 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

◆ parallelWorld

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

◆ scoreVoxel

G4LogicalVolume* MyDetectorConstruction::scoreVoxel
private

Definition at line 46 of file MyDetectorConstruction.hh.

Referenced by Construct(), and SetSDtoScoreVoxel().


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