Difference in positron range in water

Hello,
I have simulated an experiment to measure the positron range in water. I simulated it in two different ways and I got two different results. I call one of them uniform water and the other voxelized water. For this simulation I am using 500 KeV positron and standard_opt3 electromagnetic model physics list.

1- Uniform water: The world volume is filled with water and the positron range is around 1.125mm.
2- Voxelized water: Again the world volume is filled with water and I used a for loop to add 8 small cubes of water (2x2x2), each small cube is of size 4x4x4 mm^3, with a tiny space between them to avoid overlap. The positron range in this case is around 1.198
mm.

So, it shows that the positron range increases by 6.5 percent when we set up voxelized water. However, both cases are in essence the same thing and we should get the same range for the positron.

I really appreciate it if anyone can help or guide me to understand why this happens.

I am attaching my detector construction source file here. The file is for uniform water. If you uncomment from line 125 upto line 161, then the code is what I used for voxelized water.

DetectorConstruction.cc (5.9 KB)

Does anyone have a similar experience working with voxelized geometry?
I have run the above experiment and got the average positron range with 100K positrons. I have run it multiple times and also with different physics list and/or different materials instead of water. However, always the positron range for the voxelized case is greater than uniform case (in some settings the range difference is bigger than 10%).

Am I right in thinking when we use voxelized material (having small cubes of a materials next to one another), the positron range increases compared to the case when we use the uniform material?

Is this something related to geant4 package or I am doing some mistake in my simulation?

Regards,
Sayyed

Can someone please help me solving this problem?

Try it without the small gaps. I don’t think G4Boxes will overlap (I’m not a geometry expert). Also, it’s not clear why the voxelization should have any effect, if the range is 1 mm and the voxel size is 4 mm. Unless you happen to be shooting particles directly into the gap.

Thank you for your reply. I tried to avoid shooting directly into gaps by shifting the position of the voxels, but the result was the same. I also simulated the experiment as follows and I made sure that I never shoot particles directly into the gaps with around 100K positrons. I tried to place just one cube of volume 4mmx4mmx4mm and the range was as of the range in uniform water. But when I placed two cubes of volume 4mmx4mmx4mm next to one another, then the positron range increased compared to the range in uniform water. Here is how I placed them next to one another:

paramSolid = new G4Box(“ParamSolid”, 2.*mm, 2.*mm, 2.*mm);

defaultMaterial = NISTManager->FindOrBuildMaterial(“G4_WATER”);

paramLogVol = new G4LogicalVolume(paramSolid, defaultMaterial, “ParamLogVol”);

physCube = new G4PVPlacement(0, G4ThreeVector(0.*mm,0.*mm,0.*mm), paramLogVol, “physCube”, logicWorld, 0, false, 0);

physCube1 = new G4PVPlacement(0, G4ThreeVector(4.*mm, 0.*mm, 0.*mm), paramLogVol, “physCube1”, logicWorld, 0, false, 0);

I also made the size of the cube smaller and smaller, The range was increasing even more compared to cubes of volume 4mmx4mmx4mm. for example, when I placed the following two cubes, the range was bigger than the range obtained from the two cubes provided above.
paramSolid = new G4Box(“ParamSolid”, 1.*mm, 1.*mm, 1.*mm);

defaultMaterial = NISTManager->FindOrBuildMaterial(“G4_WATER”);

paramLogVol = new G4LogicalVolume(paramSolid, defaultMaterial, “ParamLogVol”);

physCube = new G4PVPlacement(0, G4ThreeVector(0.*mm,0.*mm,0.*mm), paramLogVol, “physCube”, logicWorld, 0, false, 0);

physCube1 = new G4PVPlacement(0, G4ThreeVector(2.*mm, 0.*mm, 0.*mm), paramLogVol, “physCube1”, logicWorld, 0, false, 0);

For sure, as we make the cubes smaller this increasing of the range has a limit.
However, more interestingly, when I placed big enough cubes (as follows) the range was the same as the uniform water (= the world volume is filled with water).

paramSolid = new G4Box(“ParamSolid”, 6.*mm, 6.*mm, 6.*mm);

defaultMaterial = NISTManager->FindOrBuildMaterial(“G4_WATER”);

paramLogVol = new G4LogicalVolume(paramSolid, defaultMaterial, “ParamLogVol”);

physCube = new G4PVPlacement(0, G4ThreeVector(0.*mm,0.*mm,0.*mm), paramLogVol, “physCube”, logicWorld, 0, false, 0);

physCube1 = new G4PVPlacement(0, G4ThreeVector(12.*mm, 0.*mm, 0.*mm), paramLogVol, “physCube1”, logicWorld, 0, false, 0);

I also witnessed that few positrons can travel at most around 4 mm. So, when I make the cubes bigger and no positron can reach the edge of a cube and enter the other cube, the average range is as the uniform water. But when positrons can pass the boundaries of a cube and enter to the adjacent cube, then the range starts to increase.

Is this something with tracking positrons when they pass the boundaries? Probably geant4 loses some information.

It may have to do with multiple scattering near a boundary. What physics list are you using? Most accurate is option4 electromagnetics (list name ends with _EMZ). Or, maybe you could try single scattering.

How do you determine the range?

Can you replicate this with the example examples/extended/electromagnetic/TestEm11?

I was using option3 electromagnetics.

By looking at the difference distance between the point of origin of the positrons (which is set through particleGun->SetParticlePosition() to a fixed position) and the vertex position of the annihilation photons.

Thanks for your guidance, it was really helpful. I checked and can confirm the issue is related to the Multiple Scattering process (msc) in electromagnetic physics list. If I inactivate this process the range of the positrons in water are no longer dependent on the small voxel/cube size.

May I ask what is the best way to replace the msc process with a single scattering model? maybe through commands?

Thanks,

May I ask what the best way to replace the msc process with a single scattering model is? maybe through commands?

Thanks,

I don’t know what the best practice is. You could look at the extended/electromagnetic/TestEm examples. Several have custom physics lists with single scattering. Look for “SS” in the name of the class.

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.