I have a fairly simple hybrid detector consisting of an ionization chamber filled with isobutane gas and a DSSSD (Double-Sided Silicon Strip Detector) with 300 μm. The ionization chamber has a 0.9 μm Mylar window at its entrance and is segmented into 11 slabs of 1 cm each. The DSSSD has a 0.4 μm aluminum dead layer.
A heavy ion (A < 50) with tens of MeV of energy passes through the system, and I record the energy deposited in each slab. For example, for an 11B ion with 9 MeV of energy, I would expect hundreds of keV to be deposited in each slab and several MeV deposited in the DSSSD. Nevertheless, the ion deposits almost all its energy in the isobutane gas and barely reaches the DSSSD detector.
I wrote a method to print the stopping power values on screen, and when comparing them to LISE++ or SRIM, I noticed significant differences—sometimes up to two orders of magnitude. I am sharing with you the material definitions and PhysicsList implementation. I have also tried changing the PhysicsList (e.g., QGSP_INCLXX_LIV and FTFP_BERT_EMX) and encountered exactly the same issue.
Interestingly, when I simulate an alpha particle, the output of the simulation makes sense.
I’m sharing with you the material and physics definitions, along with a specific portion of the code used to print the dE/dx values on screen.**
Thanks in advance for the help!
PhysicsList.cc (9.0 KB)
DetectorConstruction.cc (40.8 KB)
void SteppingAction::UserSteppingAction(const G4Step* aStep)
{
//get volume of the current step
G4VPhysicalVolume* volume = aStep->GetPreStepPoint()->GetTouchableHandle()->GetVolume();
G4Material* TrackingMaterial = aStep → GetTrack() →
GetVolume() →
GetLogicalVolume() →
GetMaterial();
G4double IonsAlongStep = fElIonPair->SampleNumberOfIonsAlongStep(aStep);
//Get step particle definition
G4ParticleDefinition* stepParticle = aStep-> GetTrack() → GetDefinition();
//collect energy and track length step by step
G4double edep = aStep->GetTotalEnergyDeposit();
G4double edepNonIon = aStep->GetNonIonizingEnergyDeposit();
G4double StepLength = aStep->GetStepLength();
// Kinetic energy of the particle at the beginning of the step
G4double kineticEnergy = aStep->GetPreStepPoint()->GetKineticEnergy();
G4EmCalculator calc;
G4double dedx = calc.ComputeTotalDEDX(
kineticEnergy,
stepParticle,
TrackingMaterial
);
std::cout << "Volume: " << volume->GetName() << " copy " << volume->GetCopyNo() << std::endl;
fDetector->PrintMaterialProperties(TrackingMaterial);
std::cout << "TrackingMaterial: " << TrackingMaterial->GetName() << std::endl;
std::cout << “Kinetic Energy: " << kineticEnergy << " MeV” << std::endl;
std::cout << “edep: " << edep << " MeV” << std::endl;
std::cout << “EdepNonIon : " << edepNonIon << " MeV” << std::endl;
std::cout << “Step length: " << StepLength/cm << " cm” << std::endl;
std::cout << “dE/dx [edep/(StepLength/cm)]: " << (edep/(StepLength/cm)) << " MeV/cm” << std::endl;
std::cout << “dE/dx [G4EMCalculator]: " << dedx*10. << " MeV/cm” << std::endl;
std::cout << “Edep [dedx * StepLength/cm]: " << dedx * StepLength/cm << " MeV” << std::endl;
std::cout << “---------------------------------” << std::endl;
.
.
.
}
Geant4 version: 11.2.2
Linux luispc 6.8.0-60-generic #63~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 22 19:00:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
cmake version 3.23.0