Geant4-11
G4ReflectionFactory.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// Class G4ReflectionFactory Implementation
27//
28// Decomposition of a general transformation
29// that can include reflection in a "reflection-free" transformation:
30//
31// x(inM') = TG*x(inM) TG - general transformation
32// = T*(R*x(inM)) T - "reflection-free" transformation
33// = T* x(inReflM)
34//
35// Daughters transformation:
36// When a volume V containing daughter D with transformation TD
37// is placed in mother M with a general tranformation TGV,
38// the TGV is decomposed,
39// new reflected volume ReflV containing a new daughter ReflD
40// with reflected transformation ReflTD is created:
41//
42// x(inV) = TD * x(inD);
43// x(inM) = TGV * x(inV)
44// = TV * R * x(inV)
45// = TV * R * TD * x(inD)
46// = TV * R*TD*R-1 * R*x(inD)
47// = TV * ReflTD * x(inReflD)
48
49// Author: Ivana Hrivnacova (Ivana.Hrivnacova@cern.ch), 16.10.2001
50// --------------------------------------------------------------------
51
53#include "G4ReflectedSolid.hh"
54#include "G4Region.hh"
55#include "G4LogicalVolume.hh"
56#include "G4PVPlacement.hh"
57#include "G4PVReplica.hh"
60
64
65//_____________________________________________________________________________
66
68{
69 // Static singleton access method.
70 // ---
71
72 if (fInstance == nullptr) { fInstance = new G4ReflectionFactory(); }
73
74 return fInstance;
75}
76
77//_____________________________________________________________________________
78
80 : fNameExtension(fDefaultNameExtension)
81{
82 // Protected singleton constructor.
83 // ---
84
85 fScalePrecision = 10.
87 fInstance = this;
88}
89
90//_____________________________________________________________________________
91
93{
94 delete fInstance;
95}
96
97//
98// public methods
99//
100
101//_____________________________________________________________________________
102
105 const G4String& name,
106 G4LogicalVolume* LV,
107 G4LogicalVolume* motherLV,
108 G4bool isMany,
109 G4int copyNo,
110 G4bool surfCheck)
111{
112 // Evaluates the passed transformation; if it contains reflection
113 // it performs its decomposition, creates new reflected solid and
114 // logical volume (or retrieves them from a map if the reflected
115 // objects were already created), transforms the daughters (if present)
116 // and place it in the given mother.
117 // The result is a pair of physical volumes;
118 // the second physical volume is a placement in a reflected mother
119 // - or nullptr if mother LV was not reflected.
120 // ---
121
122 if (fVerboseLevel>0)
123 {
124 G4cout << "Place " << name << " lv " << LV << " "
125 << LV->GetName() << G4endl;
126 }
127
128 // decompose transformation
129 G4Scale3D scale;
130 G4Rotate3D rotation;
131 G4Translate3D translation;
132
133 transform3D.getDecomposition(scale, rotation, translation);
134 G4Transform3D pureTransform3D = translation * rotation;
135
136 //PrintTransform(transform3D);
137 //PrintTransform(pureTransform3D);
138
139 // check that scale correspond to fScale
140 //
141 CheckScale(scale);
142
143 //
144 // reflection IS NOT present in transform3D
145 //
146
147 if (!IsReflection(scale))
148 {
149 if (fVerboseLevel>0)
150 G4cout << "Scale positive" << G4endl;
151
153 = new G4PVPlacement(pureTransform3D, LV, name,
154 motherLV, isMany, copyNo, surfCheck);
155
156 G4VPhysicalVolume* pv2 = nullptr;
157 if (G4LogicalVolume* reflMotherLV = GetReflectedLV(motherLV))
158 {
159 // if mother was reflected
160 // reflect this LV and place it in reflected mother
161
162 pv2 = new G4PVPlacement(fScale * (pureTransform3D * fScale.inverse()),
163 ReflectLV(LV, surfCheck), name, reflMotherLV,
164 isMany, copyNo, surfCheck);
165 }
166
167 return G4PhysicalVolumesPair(pv1, pv2);
168 }
169
170 //
171 // reflection IS present in transform3D
172 //
173
174 if (fVerboseLevel>0)
175 G4cout << "scale negative" << G4endl;
176
178 = new G4PVPlacement(pureTransform3D, ReflectLV(LV, surfCheck), name,
179 motherLV, isMany, copyNo, surfCheck);
180
181 G4VPhysicalVolume* pv2 = nullptr;
182 if (G4LogicalVolume* reflMotherLV = GetReflectedLV(motherLV))
183 {
184
185 // if mother was reflected
186 // place the refLV consituent in reflected mother
187
188 pv2 = new G4PVPlacement(fScale * (pureTransform3D * fScale.inverse()),
189 LV, name, reflMotherLV, isMany, copyNo, surfCheck);
190 }
191
192 return G4PhysicalVolumesPair(pv1, pv2);
193}
194
195
196//_____________________________________________________________________________
197
200 G4LogicalVolume* LV,
201 G4LogicalVolume* motherLV,
202 EAxis axis,
203 G4int nofReplicas,
204 G4double width,
205 G4double offset)
206{
207 // Creates replica in given mother.
208 // The result is a pair of physical volumes;
209 // the second physical volume is a replica in a reflected mother
210 // - or nullptr if mother LV was not reflected.
211 // ---
212
213 if (fVerboseLevel>0)
214 {
215 G4cout << "Replicate " << name << " lv " << LV << " "
216 << LV->GetName() << G4endl;
217 }
218
220 = new G4PVReplica(name, LV, motherLV, axis, nofReplicas, width, offset);
221
222 G4VPhysicalVolume* pv2 = nullptr;
223 if (G4LogicalVolume* reflMotherLV = GetReflectedLV(motherLV))
224 {
225 // if mother was reflected
226 // reflect the LV and replicate it in reflected mother
227
228 pv2 = new G4PVReplica(name, ReflectLV(LV), reflMotherLV,
229 axis, nofReplicas, width, offset);
230 }
231
232 return G4PhysicalVolumesPair(pv1, pv2);
233}
234
235//_____________________________________________________________________________
236
239 G4LogicalVolume* LV,
240 G4LogicalVolume* motherLV,
241 EAxis axis,
242 G4int nofDivisions,
243 G4double width,
244 G4double offset)
245{
246 // Creates division in the given mother.
247 // The result is a pair of physical volumes;
248 // the second physical volume is a division in a reflected mother
249 // or nullptr if mother LV was not reflected.
250 // ---
251
252 if (fVerboseLevel>0)
253 {
254 G4cout << "Divide " << name << " lv " << LV << " "
255 << LV->GetName() << G4endl;
256 }
257
258 G4VPVDivisionFactory* divisionFactory = GetPVDivisionFactory();
259
260 G4VPhysicalVolume* pv1 = divisionFactory
261 ->CreatePVDivision(name, LV, motherLV, axis, nofDivisions, width, offset);
262
263 G4VPhysicalVolume* pv2 = nullptr;
264 if (G4LogicalVolume* reflMotherLV = GetReflectedLV(motherLV))
265 {
266 // if mother was reflected
267 // reflect the LV and replicate it in reflected mother
268
269 pv2 = divisionFactory->CreatePVDivision(name, ReflectLV(LV), reflMotherLV,
270 axis, nofDivisions, width, offset);
271 }
272
273 return G4PhysicalVolumesPair(pv1, pv2);
274}
275
276
277//_____________________________________________________________________________
278
281 G4LogicalVolume* LV,
282 G4LogicalVolume* motherLV,
283 EAxis axis,
284 G4int nofDivisions,
285 G4double offset)
286{
287 // Creates division in the given mother.
288 // The result is a pair of physical volumes;
289 // the second physical volume is a division in a reflected mother
290 // or nullptr if mother LV was not reflected.
291 // ---
292
293 if (fVerboseLevel>0)
294 {
295 G4cout << "Divide " << name << " lv " << LV << " "
296 << LV->GetName() << G4endl;
297 }
298
299 G4VPVDivisionFactory* divisionFactory = GetPVDivisionFactory();
300
301 G4VPhysicalVolume* pv1 = divisionFactory
302 ->CreatePVDivision(name, LV, motherLV, axis, nofDivisions, offset);
303
304 G4VPhysicalVolume* pv2 = nullptr;
305 if (G4LogicalVolume* reflMotherLV = GetReflectedLV(motherLV))
306 {
307 // if mother was reflected
308 // reflect the LV and replicate it in reflected mother
309
310 pv2 = divisionFactory->CreatePVDivision(name, ReflectLV(LV), reflMotherLV,
311 axis, nofDivisions, offset);
312 }
313
314 return G4PhysicalVolumesPair(pv1, pv2);
315}
316
317
318//_____________________________________________________________________________
319
322 G4LogicalVolume* LV,
323 G4LogicalVolume* motherLV,
324 EAxis axis,
325 G4double width,
326 G4double offset)
327{
328 // Creates division in the given mother.
329 // The result is a pair of physical volumes;
330 // the second physical volume is a division in a reflected mother
331 // or nullptr if mother LV was not reflected.
332 // ---
333
334 if (fVerboseLevel>0)
335 {
336 G4cout << "Divide " << name << " lv " << LV << " "
337 << LV->GetName() << G4endl;
338 }
339
340 G4VPVDivisionFactory* divisionFactory = GetPVDivisionFactory();
341
342 G4VPhysicalVolume* pv1 = divisionFactory
343 -> CreatePVDivision(name, LV, motherLV, axis, width, offset);
344
345 G4VPhysicalVolume* pv2 = nullptr;
346 if (G4LogicalVolume* reflMotherLV = GetReflectedLV(motherLV))
347 {
348 // if mother was reflected
349 // reflect the LV and replicate it in reflected mother
350
351 pv2 = divisionFactory->CreatePVDivision(name, ReflectLV(LV), reflMotherLV,
352 axis, width, offset);
353 }
354
355 return G4PhysicalVolumesPair(pv1, pv2);
356}
357
358
359//
360// private methods
361//
362
363//_____________________________________________________________________________
364
366 G4bool surfCheck)
367{
368 // Gets/creates the reflected solid and logical volume
369 // and copies + transforms LV daughters.
370 // ---
371
372 G4LogicalVolume* refLV = GetReflectedLV(LV);
373
374 if (!refLV)
375 {
376
377 // create new (reflected) objects
378 //
379 refLV = CreateReflectedLV(LV);
380
381 // process daughters
382 //
383 ReflectDaughters(LV, refLV, surfCheck);
384
385 // check if to be set as root region
386 //
387 if (LV->IsRootRegion())
388 {
389 LV->GetRegion()->AddRootLogicalVolume(refLV);
390 }
391 }
392
393 return refLV;
394}
395
396//_____________________________________________________________________________
397
399{
400 // Creates the reflected solid and logical volume
401 // and add the logical volumes pair in the maps.
402 // ---
403
404 // consistency check
405 //
406 if (fReflectedLVMap.find(LV) != fReflectedLVMap.end())
407 {
408 std::ostringstream message;
409 message << "Invalid reflection for volume: "
410 << LV->GetName() << G4endl
411 << "Cannot be applied to a volume already reflected !";
412 G4Exception("G4ReflectionFactory::CreateReflectedLV()",
413 "GeomVol0002", FatalException, message);
414 }
415
416 G4VSolid* refSolid
418 LV->GetSolid(), fScale);
419
420 G4LogicalVolume* refLV
421 = new G4LogicalVolume(refSolid,
422 LV->GetMaterial(),
423 LV->GetName() + fNameExtension,
424 LV->GetFieldManager(),
426 LV->GetUserLimits());
427 refLV->SetVisAttributes(LV->GetVisAttributes()); // vis-attributes
428 refLV->SetBiasWeight(LV->GetBiasWeight()); // biasing weight
429 if (LV->IsRegion())
430 {
431 refLV->SetRegion(LV->GetRegion()); // set a region in case
432 }
433
434 fConstituentLVMap[LV] = refLV;
435 fReflectedLVMap[refLV] = LV;
436
437 return refLV;
438}
439
440//_____________________________________________________________________________
441
443 G4LogicalVolume* refLV,
444 G4bool surfCheck)
445{
446 // Reflects daughters recursively.
447 // ---
448
449 if (fVerboseLevel>0)
450 {
451 G4cout << "G4ReflectionFactory::ReflectDaughters(): "
452 << LV->GetNoDaughters() << " of " << LV->GetName() << G4endl;
453 }
454
455 for (size_t i=0; i<LV->GetNoDaughters(); ++i)
456 {
457 G4VPhysicalVolume* dPV = LV->GetDaughter(i);
458
459 if (!dPV->IsReplicated())
460 {
461 ReflectPVPlacement(dPV, refLV, surfCheck);
462 }
463 else if (!dPV->GetParameterisation())
464 {
465 ReflectPVReplica(dPV, refLV);
466 }
468 G4VPVDivisionFactory::Instance()->IsPVDivision(dPV))
469 {
470 ReflectPVDivision(dPV, refLV);
471 }
472 else
473 {
474 ReflectPVParameterised(dPV, refLV, surfCheck);
475 }
476 }
477}
478
479//_____________________________________________________________________________
480
482 G4LogicalVolume* refLV,
483 G4bool surfCheck)
484{
485 // Copies and transforms daughter of PVPlacement type of
486 // a constituent volume into a reflected volume.
487 // ---
488
489 G4LogicalVolume* dLV = dPV->GetLogicalVolume();
490
491 // update daughter transformation
492 //
494 dt = fScale * (dt * fScale.inverse());
495
496 G4LogicalVolume* refDLV;
497
498 if (fVerboseLevel>0)
499 G4cout << "Daughter: " << dPV << " " << dLV->GetName();
500
501 if (!IsReflected(dLV))
502 {
503
504 if (fVerboseLevel>0)
505 G4cout << " will be reflected." << G4endl;
506
507 // get reflected volume if already created
508 refDLV = GetReflectedLV(dLV);
509
510 if (refDLV == nullptr)
511 {
512 // create new daughter solid and logical volume
513 //
514 refDLV = CreateReflectedLV(dLV);
515
516 // recursive call
517 //
518 ReflectDaughters(dLV, refDLV, surfCheck);
519 }
520
521 // create new daughter physical volume
522 // with updated transformation
523
524 new G4PVPlacement(dt, refDLV, dPV->GetName(), refLV,
525 dPV->IsMany(), dPV->GetCopyNo(), surfCheck);
526
527 }
528 else
529 {
530 if (fVerboseLevel>0)
531 G4cout << " will be reconstitued." << G4endl;
532
533 refDLV = GetConstituentLV(dLV);
534
535 new G4PVPlacement(dt, refDLV, dPV->GetName(), refLV,
536 dPV->IsMany(), dPV->GetCopyNo(), surfCheck);
537 }
538}
539
540//_____________________________________________________________________________
541
543 G4LogicalVolume* refLV)
544{
545 // Copies and transforms daughter of PVReplica type of
546 // a constituent volume into a reflected volume.
547 // ---
548
549 G4LogicalVolume* dLV = dPV->GetLogicalVolume();
550
551 // get replication data
552 //
553 EAxis axis;
554 G4int nofReplicas;
555 G4double width;
556 G4double offset;
557 G4bool consuming;
558
559 dPV->GetReplicationData(axis, nofReplicas, width, offset, consuming);
560
561 G4LogicalVolume* refDLV;
562
563 if (fVerboseLevel>0)
564 G4cout << "Daughter: " << dPV << " " << dLV->GetName();
565
566 if (!IsReflected(dLV))
567 {
568 if (fVerboseLevel>0)
569 G4cout << " will be reflected." << G4endl;
570
571 // get reflected volume if already created
572 //
573 refDLV = GetReflectedLV(dLV);
574
575 if (refDLV == nullptr)
576 {
577 // create new daughter solid and logical volume
578 //
579 refDLV = CreateReflectedLV(dLV);
580
581 // recursive call
582 //
583 ReflectDaughters(dLV, refDLV);
584 }
585
586 // create new daughter replica
587 //
588 new G4PVReplica(dPV->GetName(), refDLV, refLV,
589 axis, nofReplicas, width, offset);
590 }
591 else
592 {
593 if (fVerboseLevel>0)
594 G4cout << " will be reconstitued." << G4endl;
595
596 refDLV = GetConstituentLV(dLV);
597
598 new G4PVReplica(dPV->GetName(), refDLV, refLV,
599 axis, nofReplicas, width, offset);
600 }
601}
602
603//_____________________________________________________________________________
604
606 G4LogicalVolume* refLV)
607{
608 // Copies and transforms daughter of PVDivision type of
609 // a constituent volume into a reflected volume.
610 // ---
611
612 G4VPVDivisionFactory* divisionFactory = GetPVDivisionFactory();
613
614 G4LogicalVolume* dLV = dPV->GetLogicalVolume();
615
616 // get parameterisation data
617 //
619
620 G4LogicalVolume* refDLV;
621
622 if (fVerboseLevel>0)
623 G4cout << "Daughter: " << dPV << " " << dLV->GetName();
624
625 if (!IsReflected(dLV))
626 {
627 if (fVerboseLevel>0)
628 G4cout << " will be reflected." << G4endl;
629
630 // get reflected volume if already created
631 //
632 refDLV = GetReflectedLV(dLV);
633
634 if (refDLV == nullptr)
635 {
636 // create new daughter solid and logical volume
637 //
638 refDLV = CreateReflectedLV(dLV);
639
640 // recursive call
641 //
642 ReflectDaughters(dLV, refDLV);
643 }
644
645 // create new daughter replica
646 //
647 divisionFactory->CreatePVDivision(dPV->GetName(), refDLV, refLV, param);
648 }
649 else
650 {
651 if (fVerboseLevel>0)
652 G4cout << " will be reconstitued." << G4endl;
653
654 refDLV = GetConstituentLV(dLV);
655
656 divisionFactory->CreatePVDivision(dPV->GetName(), refDLV, refLV, param);
657 }
658}
659
660//_____________________________________________________________________________
661
664{
665 // Not implemented.
666 // Should copy and transform daughter of PVReplica type of
667 // a constituent volume into a reflected volume.
668 // ---
669
670 std::ostringstream message;
671 message << "Not yet implemented. Volume: " << dPV->GetName() << G4endl
672 << "Reflection of parameterised volumes is not yet implemented.";
673 G4Exception("G4ReflectionFactory::ReflectPVParameterised()",
674 "GeomVol0001", FatalException, message);
675}
676
677//_____________________________________________________________________________
678
681{
682 // Returns the consituent volume of the given reflected volume,
683 // nullptr if the given reflected volume was not found.
684 // ---
685
687
688 if (it == fReflectedLVMap.end()) return nullptr;
689
690 return (*it).second;
691}
692
693//_____________________________________________________________________________
694
697{
698 // Returns the reflected volume of the given consituent volume,
699 // nullptr if the given volume was not reflected.
700 // ---
701
703
704 if (it == fConstituentLVMap.end()) return nullptr;
705
706 return (*it).second;
707}
708
709//_____________________________________________________________________________
710
712{
713 // Returns true if the given volume has been already reflected
714 // (is in the map of constituent volumes).
715 // ---
716
717 return (fConstituentLVMap.find(lv) != fConstituentLVMap.end());
718}
719
720//_____________________________________________________________________________
721
723{
724 // Returns true if the given volume is a reflected volume
725 // (is in the map reflected volumes).
726 // ---
727
728 return (fReflectedLVMap.find(lv) != fReflectedLVMap.end());
729}
730
731//_____________________________________________________________________________
732
734{
735 // Returns true if the scale is negative, false otherwise.
736 // ---
737
738 if (scale(0,0)*scale(1,1)*scale(2,2) < 0.)
739 return true;
740 else
741 return false;
742}
743
744//_____________________________________________________________________________
745
748{
749 return fReflectedLVMap;
750}
751
752//_____________________________________________________________________________
753
755{
756 fConstituentLVMap.clear();
757 fReflectedLVMap.clear();
758}
759
760//_____________________________________________________________________________
761
763{
764 // temporary - for debugging purpose
765 // ---
766
768 for (it = fConstituentLVMap.begin(); it != fConstituentLVMap.end(); ++it)
769 {
770 G4cout << "lv: " << (*it).first << " lv_refl: " << (*it).second << G4endl;
771 }
772 G4cout << G4endl;
773}
774
775//_____________________________________________________________________________
776
778{
779 // Check if scale correspond to fScale,
780 // if not give exception.
781 // ---
782
783 if (!IsReflection(scale)) return;
784
785 G4double diff = 0.;
786 for (auto i=0; i<4; ++i)
787 for (auto j=0; j<4; ++j)
788 diff += std::abs(scale(i,j) - fScale(i,j));
789
790 if (diff > fScalePrecision)
791 {
792 std::ostringstream message;
793 message << "Unexpected scale in input !" << G4endl
794 << " Difference: " << diff;
795 G4Exception("G4ReflectionFactory::CheckScale()",
796 "GeomVol0002", FatalException, message);
797 }
798}
799
800//_____________________________________________________________________________
801
803{
804 // Returns the G4PVDivisionFactory instance if it exists,
805 // otherwise gives exception
806 // ---
807
809 if (!divisionFactory)
810 {
811 std::ostringstream message;
812 message << "A concrete G4PVDivisionFactory instantiated is required !"
813 << G4endl
814 << " It has been requested to reflect divided volumes."
815 << G4endl
816 << " In this case, it is required to instantiate a concrete"
817 << G4endl
818 << " factory G4PVDivisionFactory in your program -before-"
819 << G4endl
820 << " executing the reflection !";
821 G4Exception("G4ReflectionFactory::GetPVDivisionFactory()",
822 "GeomVol0002", FatalException, message);
823 }
824
825 return divisionFactory;
826}
827
828//_____________________________________________________________________________
829
831{
832 fScalePrecision = scaleValue;
833}
834
835//_____________________________________________________________________________
836
838{
839 return fScalePrecision;
840}
841
842//_____________________________________________________________________________
843
845{
846 fVerboseLevel = verboseLevel;
847}
848
849//_____________________________________________________________________________
850
852{
853 return fVerboseLevel;
854}
855
856//_____________________________________________________________________________
857
859{
860 fNameExtension = nameExtension;
861}
862
863//_____________________________________________________________________________
864
866{
867 return fNameExtension;
868}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
std::pair< G4VPhysicalVolume *, G4VPhysicalVolume * > G4PhysicalVolumesPair
std::map< G4LogicalVolume *, G4LogicalVolume *, std::less< G4LogicalVolume * > > G4ReflectedVolumesMap
HepGeom::ScaleZ3D G4ScaleZ3D
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4double GetSurfaceTolerance() const
static G4GeometryTolerance * GetInstance()
G4VSolid * GetSolid() const
const G4VisAttributes * GetVisAttributes() const
G4VSensitiveDetector * GetSensitiveDetector() const
void SetRegion(G4Region *reg)
size_t GetNoDaughters() const
G4bool IsRootRegion() const
G4Region * GetRegion() const
G4double GetBiasWeight() const
G4bool IsRegion() const
G4Material * GetMaterial() const
G4VPhysicalVolume * GetDaughter(const G4int i) const
G4UserLimits * GetUserLimits() const
G4FieldManager * GetFieldManager() const
void SetVisAttributes(const G4VisAttributes *pVA)
void SetBiasWeight(G4double w)
const G4String & GetName() const
G4LogicalVolume * ReflectLV(G4LogicalVolume *LV, G4bool surfCheck=false)
G4bool IsReflection(const G4Scale3D &scale) const
const G4String & GetVolumesNameExtension() const
G4bool IsReflected(G4LogicalVolume *lv) const
G4PhysicalVolumesPair Divide(const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, EAxis axis, G4int nofDivisions, G4double width, G4double offset)
G4LogicalVolume * GetReflectedLV(G4LogicalVolume *lv) const
static G4ReflectionFactory * Instance()
void SetVerboseLevel(G4int verboseLevel)
G4ReflectedVolumesMap::const_iterator LogicalVolumesMapIterator
void ReflectPVPlacement(G4VPhysicalVolume *PV, G4LogicalVolume *refLV, G4bool surfCheck=false)
G4double GetScalePrecision() const
G4VPVDivisionFactory * GetPVDivisionFactory() const
void CheckScale(const G4Scale3D &scale) const
G4PhysicalVolumesPair Place(const G4Transform3D &transform3D, const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, G4bool isMany, G4int copyNo, G4bool surfCheck=false)
static const G4Scale3D fScale
static G4ThreadLocal G4ReflectionFactory * fInstance
G4ReflectedVolumesMap fConstituentLVMap
G4bool IsConstituent(G4LogicalVolume *lv) const
void ReflectPVReplica(G4VPhysicalVolume *PV, G4LogicalVolume *refLV)
void SetScalePrecision(G4double scaleValue)
void ReflectDaughters(G4LogicalVolume *LV, G4LogicalVolume *refLV, G4bool surfCheck=false)
void ReflectPVParameterised(G4VPhysicalVolume *PV, G4LogicalVolume *refLV, G4bool surfChk=false)
void ReflectPVDivision(G4VPhysicalVolume *PV, G4LogicalVolume *refLV)
const G4ReflectedVolumesMap & GetReflectedVolumesMap() const
static const G4String fDefaultNameExtension
G4LogicalVolume * GetConstituentLV(G4LogicalVolume *reflLV) const
G4LogicalVolume * CreateReflectedLV(G4LogicalVolume *LV)
G4ReflectedVolumesMap fReflectedLVMap
G4PhysicalVolumesPair Replicate(const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, EAxis axis, G4int nofReplicas, G4double width, G4double offset=0.)
void SetVolumesNameExtension(const G4String &nameExtension)
void AddRootLogicalVolume(G4LogicalVolume *lv, G4bool search=true)
Definition: G4Region.cc:293
static G4VPVDivisionFactory * Instance()
virtual G4VPhysicalVolume * CreatePVDivision(const G4String &pName, G4LogicalVolume *pLogical, G4LogicalVolume *pMother, const EAxis pAxis, const G4int nReplicas, const G4double width, const G4double offset)=0
virtual G4bool IsReplicated() const =0
G4LogicalVolume * GetLogicalVolume() const
G4RotationMatrix GetObjectRotationValue() const
virtual void GetReplicationData(EAxis &axis, G4int &nReplicas, G4double &width, G4double &offset, G4bool &consuming) const =0
virtual G4int GetCopyNo() const =0
const G4String & GetName() const
virtual G4VPVParameterisation * GetParameterisation() const =0
virtual G4bool IsMany() const =0
G4ThreeVector GetObjectTranslation() const
G4String GetName() const
void getDecomposition(Scale3D &scale, Rotate3D &rotation, Translate3D &translation) const
Definition: Transform3D.cc:173
Transform3D inverse() const
Definition: Transform3D.cc:141
EAxis
Definition: geomdefs.hh:54
const char * name(G4int ptype)
#define G4ThreadLocal
Definition: tls.hh:77