KAHIBARO
Discord Login Register

32.2. Replica Volumes

Why Use Replica Volumes

Replica volumes are a way to divide a larger volume into many identical, regularly arranged subvolumes without placing each copy by hand. In Geant4 this is done with the class G4PVReplica.

A replica is not an independent physical volume created with G4PVPlacement. Instead, a single logical volume is replicated many times along one coordinate or around a circle, and Geant4 automatically handles the positions and boundaries of all the copies.

Replica volumes are particularly useful when you have a detector made of many identical strips, layers, or slices, such as a calorimeter segmented in depth, a stack of thin detectors, or a regular grid in one dimension. Using replicas reduces the amount of code you need to write and often improves performance, because the geometry is highly regular and Geant4 can navigate it efficiently.

There are two key points you should always remember about replicas. First, they always fill their mother volume exactly, with no gaps. Second, all replicas share the same logical volume, so they all have the same material and size, except for the dimension along which the replication is performed.

Replica volumes fill their mother volume completely with identical copies of a single logical volume, and all replicas must have the same material and dimensions (except along the replication axis).

The Concept of G4PVReplica

G4PVReplica is the class that defines a replicated physical volume. It tells Geant4 how to divide a mother logical volume into many identical daughters.

The constructor of G4PVReplica connects three main pieces:

  1. The name of the replicated volume.
  2. The logical volume that will be replicated.
  3. The mother logical volume that will contain all the replicas.

It also defines along which axis the replication happens, how many replicas there are, and how thick each one is. In C++, this looks like

cpp
auto replicaPhys = new G4PVReplica("MyReplica",
                                   replicaLogical,   // logical volume to replicate
                                   motherLogical,    // mother logical volume
                                   axis,             // replication axis
                                   nReplicas,        // number of replicas
                                   width,            // width along axis
                                   offset);          // optional offset

The position of each individual replica is not something you compute directly. Geant4 derives the location and the bounding surfaces of each copy based on the replication parameters you pass to the constructor.

Internally, Geant4 assigns a copy number to each replica. For a given particle step inside a replica, you can query this copy number with

cpp
auto copyNo = step->GetPreStepPoint()
                    ->GetTouchableHandle()
                    ->GetCopyNumber();

This is very important when you want to know in which segment, strip, or slice a hit occurred. You will use the copy number to index arrays, histograms, or hit collections in other parts of your application.

The copy number of a replica volume is the main way to identify which instance of a repeated detector element has been hit.

Types of Replication

Geant4 supports three basic ways to replicate a volume with G4PVReplica. These correspond to the three possible choices for the axis argument in the constructor.

The three replication modes are summarized in the following table:

Axis valueReplication typeTypical use case
kXAxis, kYAxis, kZAxisLinear replication along a Cartesian axisCalorimeter slices, layered detectors
kRhoRadial replicationCylindrical shells, radial segments
kPhiAngular (phi) replicationDetector wedges around a ring

Each type has specific geometry requirements and is best suited for particular solids and layouts.

Linear replication along x, y, or z

Linear replication is the most commonly used form. You divide a box or a cylinder into equal slices along one Cartesian axis. For example, you can split a G4Box into many thin slabs along the z axis to create a set of depth segments in a calorimeter.

For linear replication you choose axis as one of kXAxis, kYAxis, or kZAxis. The width parameter is the size of each replica along that axis. The total length of the mother volume along that axis must be exactly nReplicas * width.

If the mother is a G4Box, its half-length along the replication axis must match half of this total length. Geant4 then places the first replica at one end of the mother and the last replica at the other end, so that they just touch with no overlap.

Radial replication with kRho

Radial replication is used with cylindrical solids such as G4Tubs, in order to create concentric cylindrical layers. You choose axis = kRho, and Geant4 divides the radial extent of the mother solid into several cylindrical shells.

Each replica is then a ring of constant thickness in radius. This is useful for modeling radial segmentation in cylindrical detectors such as some calorimeters or shielding layers.

The number of replicas and the radial thickness must be consistent with the inner and outer radius of the mother cylindrical solid. Geant4 ensures that the replicas fill the mother volume between its inner and outer radii.

Angular replication with kPhi

Angular replication is used to divide a ring or cylindrical shell into wedges in the azimuthal direction. You choose axis = kPhi, and Geant4 subdivides the total phi range of the mother volume into nReplicas identical slices.

This is often used to build detector rings from identical sectors, such as a PET ring made of multiple identical modules or a cylindrical tracker divided into sectors.

The mother volume must have a nonzero angular span in phi. The angular width of each replica is determined by dividing the phi range by the number of replicas. The replicas are arranged around the axis of the cylinder so that their angular boundaries exactly coincide.

Setting Up a Replica

To set up a replica volume, you must already have a mother logical volume and a logical volume that describes the shape and material of a single replica. The key point is that the replica logical volume must be consistent with the shape of the mother and the chosen replication axis.

For example, suppose you want to divide a calorimeter into 100 slices along the z axis. You might first define the mother solid and its logical volume:

cpp
auto caloSolid = new G4Box("CaloSolid",
                           10.0*cm, 10.0*cm, 50.0*cm); // half-lengths
auto caloLogical = new G4LogicalVolume(caloSolid, caloMaterial, "CaloLogical");

The full length of this box along z is 100.0*cm. If you want 100 slices, each slice will be 1.0 cm thick. The replica solid must have a half-length of 0.5 cm along z:

cpp
auto sliceSolid = new G4Box("SliceSolid",
                            10.0*cm, 10.0*cm, 0.5*cm); // half-lengths
auto sliceLogical = new G4LogicalVolume(sliceSolid, caloMaterial, "SliceLogical");

You then create the replicas with:

cpp
auto slicePhys = new G4PVReplica("SlicePhys",
                                 sliceLogical,
                                 caloLogical,
                                 kZAxis,
                                 100,            // number of replicas
                                 1.0*cm,         // slice thickness along z
                                 0.0*cm);        // offset

After this, you usually place caloLogical as a single volume inside the world using G4PVPlacement. The many slices are created implicitly inside it and do not require individual placements.

When you set up a replica, keep the following practical rules in mind.

First, the shape of the daughter logical volume must match the subdivision of the mother. For linear replication, both are usually the same class of solid, such as G4Box inside G4Box, with only one dimension scaled. For radial and angular replication, solids like G4Tubs are required.

Second, the product of the number of replicas and the width must match the available extent in the mother. If this is inconsistent, the geometry will be ill defined.

Third, you cannot apply an arbitrary rotation or translation to each replica. They are fully defined by the replication parameters, so G4PVReplica does not take a rotation matrix or translation vector.

For a valid replica, the size of the mother volume along the replication axis must equal the number of replicas multiplied by the width, and the replica placement is entirely controlled by G4PVReplica, not by manual translations or rotations.

Differences Between Replicas and Parameterized Volumes

Replica volumes are one of two main approaches in Geant4 for repeated geometry, the other being parameterized volumes. Both can create many similar subvolumes, but they are designed for different situations.

The key differences can be summarized as follows:

AspectReplica volumesParameterized volumes
Geometry variationAll replicas identicalShape, size, and material may vary
PlacementFixed, regular subdivisionArbitrary, defined by a parameterization
Supported solidsLimited, mainly boxes and cylindersMany solids supported
Navigation performanceVery efficient in regular geometriesGood, but depends on complexity
Use caseUniform segmentation, fixed gridNon uniform layouts, complex arrays

Replica volumes are best when the segmentation is uniform and strictly regular, such as equal thickness slices or equal angular wedges. If you want to gradually change the thickness of layers, or if some detector elements are missing, you must use a parameterized volume instead.

In code, a replica is defined with G4PVReplica and does not need a user defined class for the placement. A parameterized volume uses G4PVParameterised together with a user class that computes the dimensions and positions of each copy.

Conceptually, you can think of replicas as cutting a loaf of bread into equal slices, while parameterized volumes let you cut slices of different thickness or shapes. As soon as you need that flexibility, replication is no longer suitable and parameterization becomes necessary.

Limitations and Practical Tips

Replica volumes have several important limitations that you must respect in order to avoid geometry errors and hard to debug problems.

First, you cannot assign a different material or different solid to individual replicas of the same logical volume. All replicas share exactly the same G4LogicalVolume, so they all have the same material, field, and user information.

Second, you cannot place additional daughter volumes inside some replicas and not others. If you place a daughter inside the replica logical volume, it will appear in every replica instance. There is no way with simple replication to put a daughter in only one specific copy.

Third, you cannot apply rotations or translations instance by instance. The positions of replicas are derived from the replication axis, width, and offset. If you need arbitrary individual rotations or positions, you must use multiple placements or parameterized volumes.

Fourth, certain solids and orientations are not supported. For example, you cannot usually replicate a spherical solid along z with kZAxis. Radial and angular replications are tied to cylindrical coordinates and require appropriate mother shapes.

Fifth, placing a replica volume inside another replica is very restricted and easy to misuse. For beginners, it is often safer to avoid deep hierarchies of replicas and instead use a simple structure, for example a mother segmented in one direction, and then possibly daughters placed inside each segment with usual placements.

In practice, when you use replicas to segment a detector, you will often combine them with sensitive detectors and hit collections. You assign a sensitive detector to the replica logical volume. During the simulation, when a step happens in one slice or segment, you access the copy number to know which replica generated that hit. This lets you build energy profiles, depth dose curves, or detector maps with very little geometry code.

For example, in a calorimeter divided into 100 slices along z, you can accumulate energy deposition per slice by using the copy number from the touchable. This is much simpler than creating and naming 100 separate logical or physical volumes.

Use replica volumes only for strictly regular, identical segmentation. If you need different shapes, materials, or a more complex layout per copy, switch to parameterized volumes or explicit placements instead of forcing replicas to do something they are not designed for.

By understanding these constraints and strengths, you can decide when replica volumes are the right tool and use them effectively for segmented detectors and regular geometries in your Geant4 applications.

Views: 10

Comments

Please login to add a comment.

Don't have an account? Register now!