Dear all,
I’m writing a code to get quantities such as energy deposition and particle fluxes in a sensitive detector by using G4MultiFunctionalDetector and G4VPrimitiveScorer, together with needed filters. The final results all work well after Merge, and match those from UI-command base scoring. What I’m trying to achieve now is to generate histograms of those quantities for a run, e.g., electron fluxes on the sensitive detector as function of energy. My first approach was to create primitive scorers in a loop and adding the G4SDParticleWithEnergyFilter for each energy bins in the histogram that I want to generate. Here’s a snippet of my code for electrons flux:
auto detector0 = new G4MultiFunctionalDetector("Detector");
G4SDManager::GetSDMpointer()->AddNewDetector(detector0);
G4double minEnergy = 0.0*MeV;
G4double maxEnergy = 1000.0*MeV;
G4double energyStp = 200.0*MeV;
G4int noBins = (maxEnergy-minEnergy)/energyStp;
for(G4int i=0; i<noBins; i++){
G4String eMinusScorer = "electronFlx" + to_string(i+1);
G4PSFlatSurfaceFlux *eMinusFlx = new G4PSFlatSurfaceFlux(eMinusScorer, fFlux_In);
G4SDParticleWithEnergyFilter *eMinusFilter = new G4SDParticleWithEnergyFilter("eMinusFilter");
eMinusFilter->add("e-");
eMinusFilter->SetKineticEnergy(i*energyStp,(i+1)*energyStp);
eMinusFlx->SetFilter(eMinusFilter);
detector0->RegisterPrimitive(eMinusFlx);
}
SetSensitiveDetector("SensorLV1", detector0);
I can theoretically run it if the primary energy is relatively low, or if I drastically increase the energy step (so less histogram bins). But I see that the approach uses an enormous amount of memory, and I get a “Segmentation fault (core dumped)” in most cases.
I’m sure that there’s a smarter way of getting those histograms, but I’m a little lost on where to start. Would anyone be kind to give me a direction?
Many thanks in advance.
Br,
Leonardo.