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