diff --git a/Simulation/G4Utilities/G4UserActions/G4UserActions/RadiationMapsMaker.h b/Simulation/G4Utilities/G4UserActions/G4UserActions/RadiationMapsMaker.h index 34dfd248d8b47391143ed5ee3d6c8254572fe98a..f5e266af515b43a3c06b823c37246da7b4079d45 100644 --- a/Simulation/G4Utilities/G4UserActions/G4UserActions/RadiationMapsMaker.h +++ b/Simulation/G4Utilities/G4UserActions/G4UserActions/RadiationMapsMaker.h @@ -51,6 +51,16 @@ namespace G4UA double phiMinZoom = -180.; // degrees double phiMaxZoom = 180.; // degrees + + // neutron spectra + int nBinslogEn = 90; + double logEMinn = -11.; // min log10(E_kin/MeV) + double logEMaxn = 7.; // max log10(E_kin/MeV) + + // particle spectra for gamma,e^+/-,mu^+/-,pi^+/-,p,rest + int nBinslogEo = 45; + double logEMino = -2.; // min log10(E_kin/MeV) + double logEMaxo = 7.; // max log10(E_kin/MeV) }; @@ -117,6 +127,57 @@ namespace G4UA /// vector to normalize the volume fraction in 3d std::vector<double> m_3d_norm; + // particle spectra + + // neutrons + + /// vector of neutron spectra in log10(E/MeV) bins and the zoom 2d grid + std::vector<double> m_rz_neut_spec; + /// vector of neutron spectra in log10(E/MeV) bins and the full 2d grid + std::vector<double> m_full_rz_neut_spec; + + // gamma + + /// vector of gamma spectra in log10(E/MeV) bins and the zoom 2d grid + std::vector<double> m_rz_gamm_spec; + /// vector of e^+/- spectra in log10(E/MeV) bins and the full 2d grid + std::vector<double> m_full_rz_gamm_spec; + + // e^+/- + + /// vector of e^+/- spectra in log10(E/MeV) bins and the zoom 2d grid + std::vector<double> m_rz_elec_spec; + /// vector of e^+/- spectra in log10(E/MeV) bins and the full 2d grid + std::vector<double> m_full_rz_elec_spec; + + // mu^+/- + + /// vector of mu^+/- spectra in log10(E/MeV) bins and the zoom 2d grid + std::vector<double> m_rz_muon_spec; + /// vector of mu^+/- spectra in log10(E/MeV) bins and the full 2d grid + std::vector<double> m_full_rz_muon_spec; + + // pi^+/- + + /// vector of pi^+/- spectra in log10(E/MeV) bins and the zoom 2d grid + std::vector<double> m_rz_pion_spec; + /// vector of pi^+/- spectra in log10(E/MeV) bins and the full 2d grid + std::vector<double> m_full_rz_pion_spec; + + // proton + + /// vector of proton spectra in log10(E/MeV) bins and the zoom 2d grid + std::vector<double> m_rz_prot_spec; + /// vector of proton spectra in log10(E/MeV) bins and the full 2d grid + std::vector<double> m_full_rz_prot_spec; + + // rest + + /// vector of other particle spectra in log10(E/MeV) bins and the zoom 2d grid + std::vector<double> m_rz_rest_spec; + /// vector of e^+/- spectra in log10(E/MeV) bins and the full 2d grid + std::vector<double> m_full_rz_rest_spec; + void merge(const Report& maps); }; diff --git a/Simulation/G4Utilities/G4UserActions/share/jobOptions.RadiationMapsMaker.py b/Simulation/G4Utilities/G4UserActions/share/jobOptions.RadiationMapsMaker.py index dcc4ffcae05e3f97e830f7d0dc8bc083c66a6811..8636a2680dafb712ffc7df1d6381f272401cfa77 100644 --- a/Simulation/G4Utilities/G4UserActions/share/jobOptions.RadiationMapsMaker.py +++ b/Simulation/G4Utilities/G4UserActions/share/jobOptions.RadiationMapsMaker.py @@ -8,6 +8,8 @@ from G4UserActions.G4UserActionsConf import G4UA__RadiationMapsMakerTool # radmaptool.Material = "" # if left empty all materials are used (default) # radmaptool.NBinsR = 120 # radmaptool.NBinsZ = 240 +# radmaptool.NBinsLogEn = 90 +# radmaptool.NBinsLogEo = 45 # radmaptool.NBinsR3D = 30 # radmaptool.NBinsZ3D = 60 # radmaptool.NBinsPhi3D = 32 @@ -21,6 +23,10 @@ from G4UserActions.G4UserActionsConf import G4UA__RadiationMapsMakerTool # radmaptool.ZMaxFull = 2400.0 # in cm # radmaptool.PhiMinZoom = -180.0 # in degrees # radmaptool.PhiMaxZoom = 180.0 # in degrees +# radmaptool.LogEMinn = -11.0 # in log10(E/MeV) +# radmaptool.LogEMaxn = 7.0 # in log10(E/MeV) +# radmaptool.LogEMino = -2.0 # in log10(E/MeV) +# radmaptool.LogEMaxo = 7.0 # in log10(E/MeV) # simFlags.OptionalUserActionList.addAction('G4UA::RadiationMapsMakerTool') diff --git a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.cxx b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.cxx index b58aeb2b8fca8e83e0ee5353c9714a2c31a3254c..4e791a49b6e7bc4b4e4ba61a7b554f2a41379ccb 100644 --- a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.cxx +++ b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.cxx @@ -110,6 +110,27 @@ namespace G4UA{ m_3d_vol [i] += maps.m_3d_vol [i]; m_3d_norm[i] += maps.m_3d_norm[i]; } + + // neutron spectra have different size from all other particle's spectra + for(unsigned int i=0;i<maps.m_rz_neut_spec.size();i++) { + m_rz_neut_spec [i] += maps.m_rz_neut_spec [i]; + m_full_rz_neut_spec[i] += maps.m_full_rz_neut_spec[i]; + } + // all other particle's spectra have same size + for(unsigned int i=0;i<maps.m_rz_gamm_spec.size();i++) { + m_rz_gamm_spec [i] += maps.m_rz_gamm_spec [i]; + m_full_rz_gamm_spec[i] += maps.m_full_rz_gamm_spec[i]; + m_rz_elec_spec [i] += maps.m_rz_elec_spec [i]; + m_full_rz_elec_spec[i] += maps.m_full_rz_elec_spec[i]; + m_rz_muon_spec [i] += maps.m_rz_muon_spec [i]; + m_full_rz_muon_spec[i] += maps.m_full_rz_muon_spec[i]; + m_rz_pion_spec [i] += maps.m_rz_pion_spec [i]; + m_full_rz_pion_spec[i] += maps.m_full_rz_pion_spec[i]; + m_rz_prot_spec [i] += maps.m_rz_prot_spec [i]; + m_full_rz_prot_spec[i] += maps.m_full_rz_prot_spec[i]; + m_rz_rest_spec [i] += maps.m_rz_rest_spec [i]; + m_full_rz_rest_spec[i] += maps.m_full_rz_rest_spec[i]; + } } void RadiationMapsMaker::BeginOfRunAction(const G4Run*){ @@ -137,6 +158,21 @@ namespace G4UA{ m_maps.m_3d_neut.resize(0); m_maps.m_3d_chad.resize(0); + m_maps.m_rz_neut_spec .resize(0); + m_maps.m_full_rz_neut_spec.resize(0); + m_maps.m_rz_gamm_spec .resize(0); + m_maps.m_full_rz_gamm_spec.resize(0); + m_maps.m_rz_elec_spec .resize(0); + m_maps.m_full_rz_elec_spec.resize(0); + m_maps.m_rz_muon_spec .resize(0); + m_maps.m_full_rz_muon_spec.resize(0); + m_maps.m_rz_pion_spec .resize(0); + m_maps.m_full_rz_pion_spec.resize(0); + m_maps.m_rz_prot_spec .resize(0); + m_maps.m_full_rz_prot_spec.resize(0); + m_maps.m_rz_rest_spec .resize(0); + m_maps.m_full_rz_rest_spec.resize(0); + if (!m_config.material.empty()) { // need volume fraction only if particular material is selected m_maps.m_rz_vol .resize(0); @@ -170,6 +206,21 @@ namespace G4UA{ m_maps.m_3d_neut.resize(m_config.nBinsz3d*m_config.nBinsr3d*m_config.nBinsphi3d,0.0); m_maps.m_3d_chad.resize(m_config.nBinsz3d*m_config.nBinsr3d*m_config.nBinsphi3d,0.0); + m_maps.m_rz_neut_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEn,0.0); + m_maps.m_full_rz_neut_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEn,0.0); + m_maps.m_rz_gamm_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + m_maps.m_full_rz_gamm_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + m_maps.m_rz_elec_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + m_maps.m_full_rz_elec_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + m_maps.m_rz_muon_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + m_maps.m_full_rz_muon_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + m_maps.m_rz_pion_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + m_maps.m_full_rz_pion_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + m_maps.m_rz_prot_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + m_maps.m_full_rz_prot_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + m_maps.m_rz_rest_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + m_maps.m_full_rz_rest_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + if (!m_config.material.empty()) { // need volume fraction only if particular material is selected // 2d zoom @@ -276,14 +327,15 @@ namespace G4UA{ pdgid = 9; } } - // process NIEL, h20, Edep, NEUT and CHAD particles only - if ( pdgid == 1 || pdgid == 2 || pdgid == 4 || pdgid == 5 || pdgid == 6 || pdgid == 7 || pdgid == 8 || pdgid == 9 || /* NIEL & h20*/ + // process spectra, NIEL, h20, Edep, NEUT and CHAD particles only + + if ( pdgid == 0 || pdgid == 3 || /* spectra */ + pdgid == 1 || pdgid == 2 || pdgid == 4 || pdgid == 5 || pdgid == 6 || pdgid == 7 || pdgid == 8 || pdgid == 9 || /* NIEL & h20*/ aStep->GetTotalEnergyDeposit() > 0 || pdgid == 999) { - double absq = fabs(aStep->GetTrack()->GetDefinition()->GetPDGCharge()); - + double rho = aStep->GetTrack()->GetMaterial()->GetDensity()/CLHEP::g*CLHEP::cm3; bool goodMaterial(false); @@ -318,6 +370,8 @@ namespace G4UA{ double weight = 0; // weight for NIEL double eKin = aStep->GetTrack()->GetKineticEnergy(); + double logEKin = (eKin > 0?log10(eKin):(m_config.logEMinn<m_config.logEMino?m_config.logEMinn:m_config.logEMino)-1); + if ( pdgid == 1 || pdgid == 9 ) { if ( eKin < 15 ) { if ( eKin > 10 ) { @@ -346,195 +400,271 @@ namespace G4UA{ weight = m_tgeSi->Eval(eKin); } } - double dE_TOT = aStep->GetTotalEnergyDeposit()/nStep; double dE_NIEL = aStep->GetNonIonizingEnergyDeposit()/nStep; double dE_ION = dE_TOT-dE_NIEL; - - // NIEL SEE TID NEUT CHAD geantino - if ( weight > 0 || eKin > 20 || dE_TOT > 0 || ((pdgid == 6 || pdgid == 7) && eKin > 0.1) || (absq>0 && (pdgid == 1 || pdgid == 2 || pdgid == 8 || pdgid == 9)) || pdgid == 999 ) { - - for(unsigned int i=0;i<nStep;i++) { - double absz = fabs(z0+dz*(i+0.5)); - double rr = sqrt(pow(x0+dx*(i+0.5),2)+ - pow(y0+dy*(i+0.5),2)); - double pphi = atan2(y0+dy*(i+0.5),x0+dx*(i+0.5))*180/M_PI; - - int vBinZoom = -1; - int vBinFull = -1; - int vBin3d = -1; - - // zoom 2d - if ( m_config.zMinZoom < absz && - m_config.zMaxZoom > absz ) { - int iz = (absz-m_config.zMinZoom)/(m_config.zMaxZoom-m_config.zMinZoom)*m_config.nBinsz; - if ( m_config.rMinZoom < rr && - m_config.rMaxZoom > rr ) { - int ir = (rr-m_config.rMinZoom)/(m_config.rMaxZoom-m_config.rMinZoom)*m_config.nBinsr; - vBinZoom = m_config.nBinsr*iz+ir; + + for(unsigned int i=0;i<nStep;i++) { + double absz = fabs(z0+dz*(i+0.5)); + double rr = sqrt(pow(x0+dx*(i+0.5),2)+ + pow(y0+dy*(i+0.5),2)); + double pphi = atan2(y0+dy*(i+0.5),x0+dx*(i+0.5))*180/M_PI; + + int vBinZoom = -1; + int vBinFull = -1; + int vBin3d = -1; + int vBinZoomSpecn = -1; + int vBinFullSpecn = -1; + int vBinZoomSpeco = -1; + int vBinFullSpeco = -1; + + // zoom 2d + if ( m_config.zMinZoom < absz && + m_config.zMaxZoom > absz ) { + int iz = (absz-m_config.zMinZoom)/(m_config.zMaxZoom-m_config.zMinZoom)*m_config.nBinsz; + if ( m_config.rMinZoom < rr && + m_config.rMaxZoom > rr ) { + int ir = (rr-m_config.rMinZoom)/(m_config.rMaxZoom-m_config.rMinZoom)*m_config.nBinsr; + vBinZoom = m_config.nBinsr*iz+ir; + if ( m_config.logEMinn < logEKin && + m_config.logEMaxn > logEKin && + (pdgid == 6 || pdgid == 7)) { + int ile = (logEKin-m_config.logEMinn)/(m_config.logEMaxn-m_config.logEMinn)*m_config.nBinslogEn; + vBinZoomSpecn = m_config.nBinsr*m_config.nBinslogEn*iz+ir*m_config.nBinslogEn+ile; + } + if ( m_config.logEMino < logEKin && + m_config.logEMaxo > logEKin && + pdgid != 6 && pdgid != 7) { + int ile = (logEKin-m_config.logEMino)/(m_config.logEMaxo-m_config.logEMino)*m_config.nBinslogEo; + vBinZoomSpeco = m_config.nBinsr*m_config.nBinslogEo*iz+ir*m_config.nBinslogEo+ile; } } - - // full 2d - if ( m_config.zMinFull < absz && - m_config.zMaxFull > absz ) { - int iz = (absz-m_config.zMinFull)/(m_config.zMaxFull-m_config.zMinFull)*m_config.nBinsz; - if ( m_config.rMinFull < rr && - m_config.rMaxFull > rr ) { - int ir = (rr-m_config.rMinFull)/(m_config.rMaxFull-m_config.rMinFull)*m_config.nBinsr; - vBinFull = m_config.nBinsr*iz+ir; + } + + // full 2d + if ( m_config.zMinFull < absz && + m_config.zMaxFull > absz ) { + int iz = (absz-m_config.zMinFull)/(m_config.zMaxFull-m_config.zMinFull)*m_config.nBinsz; + if ( m_config.rMinFull < rr && + m_config.rMaxFull > rr ) { + int ir = (rr-m_config.rMinFull)/(m_config.rMaxFull-m_config.rMinFull)*m_config.nBinsr; + vBinFull = m_config.nBinsr*iz+ir; + if ( m_config.logEMinn < logEKin && + m_config.logEMaxn > logEKin && + (pdgid == 6 || pdgid == 7)) { + int ile = (logEKin-m_config.logEMinn)/(m_config.logEMaxn-m_config.logEMinn)*m_config.nBinslogEn; + vBinFullSpecn = m_config.nBinsr*m_config.nBinslogEn*iz+ir*m_config.nBinslogEn+ile; + } + if ( m_config.logEMino < logEKin && + m_config.logEMaxo > logEKin && + pdgid != 6 && pdgid != 7) { + int ile = (logEKin-m_config.logEMino)/(m_config.logEMaxo-m_config.logEMino)*m_config.nBinslogEo; + vBinFullSpeco = m_config.nBinsr*m_config.nBinslogEo*iz+ir*m_config.nBinslogEo+ile; } } - - // zoom 3d - if ( m_config.zMinZoom < absz && - m_config.zMaxZoom > absz ) { - int iz = (absz-m_config.zMinZoom)/(m_config.zMaxZoom-m_config.zMinZoom)*m_config.nBinsz3d; - if ( m_config.rMinZoom < rr && - m_config.rMaxZoom > rr ) { - int ir = (rr-m_config.rMinZoom)/(m_config.rMaxZoom-m_config.rMinZoom)*m_config.nBinsr3d; - if ( m_config.phiMinZoom == 0) { - // assume that all phi should be mapped to the selected phi range - double phi_mapped = pphi; - // first use phi range from 0 - 360 degrees - if (phi_mapped < 0) { - phi_mapped = 360 + phi_mapped; - } - // then map to selected phi-range - int iphi = phi_mapped/m_config.phiMaxZoom; - phi_mapped -= iphi*m_config.phiMaxZoom; - iphi = phi_mapped/m_config.phiMaxZoom*m_config.nBinsphi3d; - vBin3d = m_config.nBinsr3d*m_config.nBinsphi3d*iz+m_config.nBinsphi3d*ir+iphi; - } - else if ( m_config.phiMinZoom < pphi && - m_config.phiMaxZoom > pphi ) { - int iphi = (pphi-m_config.phiMinZoom)/(m_config.phiMaxZoom-m_config.phiMinZoom)*m_config.nBinsphi3d; - vBin3d = m_config.nBinsr3d*m_config.nBinsphi3d*iz+m_config.nBinsphi3d*ir+iphi; + } + + // zoom 3d + if ( m_config.zMinZoom < absz && + m_config.zMaxZoom > absz ) { + int iz = (absz-m_config.zMinZoom)/(m_config.zMaxZoom-m_config.zMinZoom)*m_config.nBinsz3d; + if ( m_config.rMinZoom < rr && + m_config.rMaxZoom > rr ) { + int ir = (rr-m_config.rMinZoom)/(m_config.rMaxZoom-m_config.rMinZoom)*m_config.nBinsr3d; + if ( m_config.phiMinZoom == 0) { + // assume that all phi should be mapped to the selected phi range + double phi_mapped = pphi; + // first use phi range from 0 - 360 degrees + if (phi_mapped < 0) { + phi_mapped = 360 + phi_mapped; } + // then map to selected phi-range + int iphi = phi_mapped/m_config.phiMaxZoom; + phi_mapped -= iphi*m_config.phiMaxZoom; + iphi = phi_mapped/m_config.phiMaxZoom*m_config.nBinsphi3d; + vBin3d = m_config.nBinsr3d*m_config.nBinsphi3d*iz+m_config.nBinsphi3d*ir+iphi; + } + else if ( m_config.phiMinZoom < pphi && + m_config.phiMaxZoom > pphi ) { + int iphi = (pphi-m_config.phiMinZoom)/(m_config.phiMaxZoom-m_config.phiMinZoom)*m_config.nBinsphi3d; + vBin3d = m_config.nBinsr3d*m_config.nBinsphi3d*iz+m_config.nBinsphi3d*ir+iphi; } } - - // TID & EION - if ( goodMaterial && vBinZoom >=0 ) { - if ( pdgid == 999 ) { - m_maps.m_rz_tid [vBinZoom] += dl; - m_maps.m_rz_eion[vBinZoom] += rho*dl; + } + // TID & EION + if ( goodMaterial && vBinZoom >=0 ) { + if ( pdgid == 999 ) { + m_maps.m_rz_tid [vBinZoom] += dl; + m_maps.m_rz_eion[vBinZoom] += rho*dl; + } + else { + m_maps.m_rz_tid [vBinZoom] += dE_ION/rho; + m_maps.m_rz_eion[vBinZoom] += dE_ION; + } + } + if ( goodMaterial && vBinFull >=0 ) { + if ( pdgid == 999 ) { + m_maps.m_full_rz_tid [vBinFull] += dl; + m_maps.m_full_rz_eion[vBinFull] += rho*dl; + } + else { + m_maps.m_full_rz_tid [vBinFull] += dE_ION/rho; + m_maps.m_full_rz_eion[vBinFull] += dE_ION; + } + } + if ( goodMaterial && vBin3d >=0 ) { + if ( pdgid == 999 ) { + m_maps.m_3d_tid [vBin3d] += dl; + m_maps.m_3d_eion[vBin3d] += rho*dl; + } + else { + m_maps.m_3d_tid [vBin3d] += dE_ION/rho; + m_maps.m_3d_eion[vBin3d] += dE_ION; + } + } + + if ( goodMaterial && (pdgid == 1 || pdgid == 2 || pdgid == 4 || pdgid == 5 || pdgid == 6 || pdgid == 7 || pdgid == 8 || pdgid == 9 )) { + // NIEL + if ( weight > 0 ) { + if ( vBinZoom >=0 ) { + m_maps.m_rz_niel [vBinZoom] += weight*dl; } - else { - m_maps.m_rz_tid [vBinZoom] += dE_ION/rho; - m_maps.m_rz_eion[vBinZoom] += dE_ION; + if ( vBinFull >=0 ) { + m_maps.m_full_rz_niel [vBinFull] += weight*dl; + } + if ( vBin3d >=0 ) { + m_maps.m_3d_niel [vBin3d] += weight*dl; } } - if ( goodMaterial && vBinFull >=0 ) { - if ( pdgid == 999 ) { - m_maps.m_full_rz_tid [vBinFull] += dl; - m_maps.m_full_rz_eion[vBinFull] += rho*dl; + // SEE + if ( eKin > 20 && (pdgid == 1 || pdgid == 2 || pdgid == 6 || pdgid == 7 || pdgid == 8 || pdgid == 9) ) { + if ( vBinZoom >=0 ) { + m_maps.m_rz_h20 [vBinZoom] += dl; } - else { - m_maps.m_full_rz_tid [vBinFull] += dE_ION/rho; - m_maps.m_full_rz_eion[vBinFull] += dE_ION; + if ( vBinFull >=0 ) { + m_maps.m_full_rz_h20 [vBinFull] += dl; + } + if ( vBin3d >=0 ) { + m_maps.m_3d_h20 [vBin3d] += dl; + } + } + // NEUT + if ( eKin > 0.1 && (pdgid == 6 || pdgid == 7 ) ) { + if ( vBinZoom >=0 ) { + m_maps.m_rz_neut [vBinZoom] += dl; + } + if ( vBinFull >=0 ) { + m_maps.m_full_rz_neut [vBinFull] += dl; + } + if ( vBin3d >=0 ) { + m_maps.m_3d_neut [vBin3d] += dl; + } + } + // CHAD + if ( absq > 0 && (pdgid == 1 || pdgid == 2 || pdgid == 8 || pdgid == 9 ) ) { + if ( vBinZoom >=0 ) { + m_maps.m_rz_chad [vBinZoom] += dl; + } + if ( vBinFull >=0 ) { + m_maps.m_full_rz_chad [vBinFull] += dl; + } + if ( vBin3d >=0 ) { + m_maps.m_3d_chad [vBin3d] += dl; + } + } + // Neutron Energy Spectra + if ( pdgid == 6 || pdgid == 7 ) { + if ( vBinZoomSpecn >=0 ) { + m_maps.m_rz_neut_spec [vBinZoomSpecn] += dl; + } + if ( vBinFullSpecn >=0 ) { + m_maps.m_full_rz_neut_spec [vBinFullSpecn] += dl; } } - if ( goodMaterial && vBin3d >=0 ) { - if ( pdgid == 999 ) { - m_maps.m_3d_tid [vBin3d] += dl; - m_maps.m_3d_eion[vBin3d] += rho*dl; + } + + if ( goodMaterial && (pdgid < 6 || pdgid > 7 )){ + // Other particle Energy Spectra + if ( vBinZoomSpeco >=0 ) { + if ( pdgid == 0 ) { + m_maps.m_rz_gamm_spec [vBinZoomSpeco] += dl; + } + else if ( pdgid == 1 ) { + m_maps.m_rz_prot_spec [vBinZoomSpeco] += dl; + } + else if ( pdgid == 2 ) { + m_maps.m_rz_pion_spec [vBinZoomSpeco] += dl; + } + else if ( pdgid == 3 ) { + m_maps.m_rz_muon_spec [vBinZoomSpeco] += dl; + } + else if ( pdgid == 4 || pdgid == 5 ) { + m_maps.m_rz_elec_spec [vBinZoomSpeco] += dl; } else { - m_maps.m_3d_tid [vBin3d] += dE_ION/rho; - m_maps.m_3d_eion[vBin3d] += dE_ION; + m_maps.m_rz_rest_spec [vBinZoomSpeco] += dl; } } - - if ( goodMaterial && (pdgid == 1 || pdgid == 2 || pdgid == 4 || pdgid == 5 || pdgid == 6 || pdgid == 7 || pdgid == 8 || pdgid == 9 )) { - // NIEL - if ( weight > 0 ) { - if ( vBinZoom >=0 ) { - m_maps.m_rz_niel [vBinZoom] += weight*dl; - } - if ( vBinFull >=0 ) { - m_maps.m_full_rz_niel [vBinFull] += weight*dl; - } - if ( vBin3d >=0 ) { - m_maps.m_3d_niel [vBin3d] += weight*dl; - } + if ( vBinFullSpeco >=0 ) { + if ( pdgid == 0 ) { + m_maps.m_full_rz_gamm_spec [vBinFullSpeco] += dl; } - // SEE - if ( eKin > 20 && (pdgid == 1 || pdgid == 2 || pdgid == 6 || pdgid == 7 || pdgid == 8 || pdgid == 9) ) { - if ( vBinZoom >=0 ) { - m_maps.m_rz_h20 [vBinZoom] += dl; - } - if ( vBinFull >=0 ) { - m_maps.m_full_rz_h20 [vBinFull] += dl; - } - if ( vBin3d >=0 ) { - m_maps.m_3d_h20 [vBin3d] += dl; - } + else if ( pdgid == 1 ) { + m_maps.m_full_rz_prot_spec [vBinFullSpeco] += dl; } - // NEUT - if ( eKin > 0.1 && (pdgid == 6 || pdgid == 7 ) ) { - if ( vBinZoom >=0 ) { - m_maps.m_rz_neut [vBinZoom] += dl; - } - if ( vBinFull >=0 ) { - m_maps.m_full_rz_neut [vBinFull] += dl; - } - if ( vBin3d >=0 ) { - m_maps.m_3d_neut [vBin3d] += dl; - } + else if ( pdgid == 2 ) { + m_maps.m_full_rz_pion_spec [vBinFullSpeco] += dl; } - // CHAD - if ( absq > 0 && (pdgid == 1 || pdgid == 2 || pdgid == 8 || pdgid == 9 ) ) { - if ( vBinZoom >=0 ) { - m_maps.m_rz_chad [vBinZoom] += dl; - } - if ( vBinFull >=0 ) { - m_maps.m_full_rz_chad [vBinFull] += dl; - } - if ( vBin3d >=0 ) { - m_maps.m_3d_chad [vBin3d] += dl; - } + else if ( pdgid == 3 ) { + m_maps.m_full_rz_muon_spec [vBinFullSpeco] += dl; + } + else if ( pdgid == 4 || pdgid == 5 ) { + m_maps.m_full_rz_elec_spec [vBinFullSpeco] += dl; + } + else { + m_maps.m_full_rz_rest_spec [vBinFullSpeco] += dl; } } - if (!m_config.material.empty()) { - // need volume fraction only if particular material is selected - if ( (eKin > 1 && (pdgid == 6 || pdgid == 7)) || pdgid == 999) { - // count all neutron > 1 MeV track lengths weighted by r - // to get norm for volume per bin. High energetic - // neutrons are used because they travel far enough to - // map entire bins and are not bent by magnetic fields. - // dl is a measure of length inside the current bin. - // The multiplication by r accounts for the larger - // volume corresponding to larger r assuming that the - // neutron flux is locally mainly from inside to - // outside. In regions where the neutron flux differs - // substantially from this cylindrical assumption a - // cylindrical Geantino scan (vertex: flat in z, x=y=0; - // momentum: pz=0, flat in phi) should be used to get - // the correct volume fraction. + } + + if (!m_config.material.empty()) { + // need volume fraction only if particular material is selected + if ( (eKin > 1 && (pdgid == 6 || pdgid == 7)) || pdgid == 999) { + // count all neutron > 1 MeV track lengths weighted by r + // to get norm for volume per bin. High energetic + // neutrons are used because they travel far enough to + // map entire bins and are not bent by magnetic fields. + // dl is a measure of length inside the current bin. + // The multiplication by r accounts for the larger + // volume corresponding to larger r assuming that the + // neutron flux is locally mainly from inside to + // outside. In regions where the neutron flux differs + // substantially from this cylindrical assumption a + // cylindrical Geantino scan (vertex: flat in z, x=y=0; + // momentum: pz=0, flat in phi) should be used to get + // the correct volume fraction. + if ( vBinZoom >=0 ) { + m_maps.m_rz_norm[vBinZoom] += rr*dl; + } + if ( vBinFull >=0 ) { + m_maps.m_full_rz_norm[vBinFull] += rr*dl; + } + if ( vBin3d >=0 ) { + m_maps.m_3d_norm[vBin3d] += rr*dl; + } + if ( goodMaterial ) { + // same but only inside the material of interest. + // The ratio vol/norm gives the volume fraction of the desired + // material inside the current bin if ( vBinZoom >=0 ) { - m_maps.m_rz_norm[vBinZoom] += rr*dl; + m_maps.m_rz_vol [vBinZoom] += rr*dl; } if ( vBinFull >=0 ) { - m_maps.m_full_rz_norm[vBinFull] += rr*dl; + m_maps.m_full_rz_vol [vBinFull] += rr*dl; } if ( vBin3d >=0 ) { - m_maps.m_3d_norm[vBin3d] += rr*dl; - } - if ( goodMaterial ) { - // same but only inside the material of interest. - // The ratio vol/norm gives the volume fraction of the desired - // material inside the current bin - if ( vBinZoom >=0 ) { - m_maps.m_rz_vol [vBinZoom] += rr*dl; - } - if ( vBinFull >=0 ) { - m_maps.m_full_rz_vol [vBinFull] += rr*dl; - } - if ( vBin3d >=0 ) { - m_maps.m_3d_vol [vBin3d] += rr*dl; - } + m_maps.m_3d_vol [vBin3d] += rr*dl; } } } diff --git a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.cxx b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.cxx index de6c9f17a0fab0ed75757f9b4dd34cdc5a0670b7..9015b2f8c1fe18b386603c97c39fa7644201e55e 100644 --- a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.cxx +++ b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.cxx @@ -22,6 +22,10 @@ namespace G4UA{ /// number of bins in r and z for all 2D maps declareProperty("NBinsR" , m_config.nBinsr); declareProperty("NBinsZ" , m_config.nBinsz); + /// number of bins in logE for energy spectra of neutrons in 2D grids + declareProperty("NBinsLogEn", m_config.nBinslogEn); + /// number of bins in logE for energy spectra of other particles in 2D grids + declareProperty("NBinsLogEo", m_config.nBinslogEo); /// number of bins in r, z and phi for all 3D maps declareProperty("NBinsR3D" , m_config.nBinsr3d); declareProperty("NBinsZ3D" , m_config.nBinsz3d); @@ -40,6 +44,12 @@ namespace G4UA{ /// for Zoomed area in 3D declareProperty("PhiMinZoom", m_config.phiMinZoom); declareProperty("PhiMaxZoom", m_config.phiMaxZoom); + /// for logE of neutrons in 2D spectra + declareProperty("LogEMinn" , m_config.logEMinn); + declareProperty("LogEMaxn" , m_config.logEMaxn); + /// for logE of other particles in 2D spectra + declareProperty("LogEMino" , m_config.logEMino); + declareProperty("LogEMaxo" , m_config.logEMaxo); } //--------------------------------------------------------------------------- @@ -47,21 +57,25 @@ namespace G4UA{ //--------------------------------------------------------------------------- StatusCode RadiationMapsMakerTool::initialize() { - ATH_MSG_INFO( "Initializing " << name() << "\n" << - "OutputFile: " << m_radMapsFileName << "\n" << - "Material: " << m_config.material << "\n" << - "2D Maps: " << m_config.nBinsz << " |z|-bins, " << - m_config.nBinsr << " r-bins" << "\n" << - "Zoom: " << m_config.zMinZoom << " < |z|/cm < " << m_config.zMaxZoom << ", " << - m_config.rMinZoom << " < r/cm < " << m_config.rMaxZoom << "\n" << - "Full: " << m_config.zMinFull << " < |z|/cm < " << m_config.zMaxFull << ", " << - m_config.rMinFull << " < r/cm < " << m_config.rMaxFull << "\n" << - "3D Maps: " << m_config.nBinsz3d << " |z|-bins, " << - m_config.nBinsr3d << " r-bins, " << - m_config.nBinsphi3d << " phi-bins" << "\n" << - "Zoom: " << m_config.zMinZoom << " < |z|/cm < " << m_config.zMaxZoom << ", " << - m_config.rMinZoom << " < r/cm < " << m_config.rMaxZoom << ", " << - m_config.phiMinZoom << " < phi/degrees < " << m_config.phiMaxZoom ); + ATH_MSG_INFO( "Initializing " << name() << "\n" << + "OutputFile: " << m_radMapsFileName << "\n" << + "Material: " << m_config.material << "\n" << + "2D Maps: " << m_config.nBinsz << " |z|-bins, " << + m_config.nBinsr << " r-bins" << "\n" << + "Zoom: " << m_config.zMinZoom << " < |z|/cm < " << m_config.zMaxZoom << ", " << + m_config.rMinZoom << " < r/cm < " << m_config.rMaxZoom << "\n" << + "Full: " << m_config.zMinFull << " < |z|/cm < " << m_config.zMaxFull << ", " << + m_config.rMinFull << " < r/cm < " << m_config.rMaxFull << "\n" << + "Neutron Spectra: " << m_config.nBinslogEn << " log10E-bins" << ", " << + m_config.logEMinn << " < log10(E/MeV) < " << m_config.logEMaxn << "\n" << + "Other Spectra: " << m_config.nBinslogEo << " log10E-bins" << ", " << + m_config.logEMino << " < log10(E/MeV) < " << m_config.logEMaxo << "\n" << + "3D Maps: " << m_config.nBinsz3d << " |z|-bins, " << + m_config.nBinsr3d << " r-bins, " << + m_config.nBinsphi3d << " phi-bins" << "\n" << + "Zoom: " << m_config.zMinZoom << " < |z|/cm < " << m_config.zMaxZoom << ", " << + m_config.rMinZoom << " < r/cm < " << m_config.rMaxZoom << ", " << + m_config.phiMinZoom << " < phi/degrees < " << m_config.phiMaxZoom ); return StatusCode::SUCCESS; } @@ -98,6 +112,21 @@ namespace G4UA{ maps.m_3d_neut.resize(0); maps.m_3d_chad.resize(0); + maps.m_rz_neut_spec .resize(0); + maps.m_full_rz_neut_spec.resize(0); + maps.m_rz_gamm_spec .resize(0); + maps.m_full_rz_gamm_spec.resize(0); + maps.m_rz_elec_spec .resize(0); + maps.m_full_rz_elec_spec.resize(0); + maps.m_rz_muon_spec .resize(0); + maps.m_full_rz_muon_spec.resize(0); + maps.m_rz_pion_spec .resize(0); + maps.m_full_rz_pion_spec.resize(0); + maps.m_rz_prot_spec .resize(0); + maps.m_full_rz_prot_spec.resize(0); + maps.m_rz_rest_spec .resize(0); + maps.m_full_rz_rest_spec.resize(0); + if (!m_config.material.empty()) { // need volume fraction only if particular material is selected // 2d zoom @@ -134,6 +163,20 @@ namespace G4UA{ maps.m_3d_neut.resize(m_config.nBinsz3d*m_config.nBinsr3d*m_config.nBinsphi3d,0.0); maps.m_3d_chad.resize(m_config.nBinsz3d*m_config.nBinsr3d*m_config.nBinsphi3d,0.0); + maps.m_rz_neut_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEn,0.0); + maps.m_full_rz_neut_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEn,0.0); + maps.m_rz_gamm_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + maps.m_full_rz_gamm_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + maps.m_rz_elec_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + maps.m_full_rz_elec_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + maps.m_rz_muon_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + maps.m_full_rz_muon_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + maps.m_rz_pion_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + maps.m_full_rz_pion_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + maps.m_rz_prot_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + maps.m_full_rz_prot_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + maps.m_rz_rest_spec .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); + maps.m_full_rz_rest_spec.resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0); if (!m_config.material.empty()) { // need volume fraction only if particular material is selected // 2d zoom @@ -245,6 +288,104 @@ namespace G4UA{ h_3d_neut ->SetTitle("FLUX [n_{>100 keV}/cm^{2}]"); h_3d_chad ->SetTitle("FLUX [h_{charged}/cm^{2}]"); + // neutron spectra + TH3D *h_full_rz_neut_spec = new TH3D("full_rz_neut_spec","full_rz_neut_spec",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,m_config.nBinslogEn,m_config.logEMinn,m_config.logEMaxn); + TH3D *h_rz_neut_spec = new TH3D("rz_neut_spec","rz_neut_spec",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinslogEn,m_config.logEMinn,m_config.logEMaxn); + + h_rz_neut_spec ->SetXTitle("|z| [cm]"); + h_rz_neut_spec ->SetYTitle("r [cm]"); + h_rz_neut_spec ->SetZTitle("log_{10}(E/MeV)"); + h_rz_neut_spec ->SetTitle("FLUX [n(log_{10}(E/MeV))/cm^{2}]"); + + h_full_rz_neut_spec ->SetXTitle("|z| [cm]"); + h_full_rz_neut_spec ->SetYTitle("r [cm]"); + h_full_rz_neut_spec ->SetZTitle("log_{10}(E/MeV)"); + h_full_rz_neut_spec ->SetTitle("FLUX [n(log_{10}(E/MeV))/cm^{2}]"); + + // gamma spectra + TH3D *h_full_rz_gamm_spec = new TH3D("full_rz_gamm_spec","full_rz_gamm_spec",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + TH3D *h_rz_gamm_spec = new TH3D("rz_gamm_spec","rz_gamm_spec",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + + h_rz_gamm_spec ->SetXTitle("|z| [cm]"); + h_rz_gamm_spec ->SetYTitle("r [cm]"); + h_rz_gamm_spec ->SetZTitle("log_{10}(E/MeV)"); + h_rz_gamm_spec ->SetTitle("FLUX [#gamma(log_{10}(E/MeV))/cm^{2}]"); + + h_full_rz_gamm_spec ->SetXTitle("|z| [cm]"); + h_full_rz_gamm_spec ->SetYTitle("r [cm]"); + h_full_rz_gamm_spec ->SetZTitle("log_{10}(E/MeV)"); + h_full_rz_gamm_spec ->SetTitle("FLUX [#gamma(log_{10}(E/MeV))/cm^{2}]"); + + // e^+/- spectra + TH3D *h_full_rz_elec_spec = new TH3D("full_rz_elec_spec","full_rz_elec_spec",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + TH3D *h_rz_elec_spec = new TH3D("rz_elec_spec","rz_elec_spec",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + + h_rz_elec_spec ->SetXTitle("|z| [cm]"); + h_rz_elec_spec ->SetYTitle("r [cm]"); + h_rz_elec_spec ->SetZTitle("log_{10}(E/MeV)"); + h_rz_elec_spec ->SetTitle("FLUX [e^{#pm}(log_{10}(E/MeV))/cm^{2}]"); + + h_full_rz_elec_spec ->SetXTitle("|z| [cm]"); + h_full_rz_elec_spec ->SetYTitle("r [cm]"); + h_full_rz_elec_spec ->SetZTitle("log_{10}(E/MeV)"); + h_full_rz_elec_spec ->SetTitle("FLUX [e^{#pm}(log_{10}(E/MeV))/cm^{2}]"); + + // mu^+/- spectra + TH3D *h_full_rz_muon_spec = new TH3D("full_rz_muon_spec","full_rz_muon_spec",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + TH3D *h_rz_muon_spec = new TH3D("rz_muon_spec","rz_muon_spec",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + + h_rz_muon_spec ->SetXTitle("|z| [cm]"); + h_rz_muon_spec ->SetYTitle("r [cm]"); + h_rz_muon_spec ->SetZTitle("log_{10}(E/MeV)"); + h_rz_muon_spec ->SetTitle("FLUX [#mu^{#pm}(log_{10}(E/MeV))/cm^{2}]"); + + h_full_rz_muon_spec ->SetXTitle("|z| [cm]"); + h_full_rz_muon_spec ->SetYTitle("r [cm]"); + h_full_rz_muon_spec ->SetZTitle("log_{10}(E/MeV)"); + h_full_rz_muon_spec ->SetTitle("FLUX [#mu^{#pm}(log_{10}(E/MeV))/cm^{2}]"); + + // pi^+/- spectra + TH3D *h_full_rz_pion_spec = new TH3D("full_rz_pion_spec","full_rz_pion_spec",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + TH3D *h_rz_pion_spec = new TH3D("rz_pion_spec","rz_pion_spec",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + + h_rz_pion_spec ->SetXTitle("|z| [cm]"); + h_rz_pion_spec ->SetYTitle("r [cm]"); + h_rz_pion_spec ->SetZTitle("log_{10}(E/MeV)"); + h_rz_pion_spec ->SetTitle("FLUX [#pi^{#pm}(log_{10}(E/MeV))/cm^{2}]"); + + h_full_rz_pion_spec ->SetXTitle("|z| [cm]"); + h_full_rz_pion_spec ->SetYTitle("r [cm]"); + h_full_rz_pion_spec ->SetZTitle("log_{10}(E/MeV)"); + h_full_rz_pion_spec ->SetTitle("FLUX [#pi^{#pm}(log_{10}(E/MeV))/cm^{2}]"); + + // proton spectra + TH3D *h_full_rz_prot_spec = new TH3D("full_rz_prot_spec","full_rz_prot_spec",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + TH3D *h_rz_prot_spec = new TH3D("rz_prot_spec","rz_prot_spec",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + + h_rz_prot_spec ->SetXTitle("|z| [cm]"); + h_rz_prot_spec ->SetYTitle("r [cm]"); + h_rz_prot_spec ->SetZTitle("log_{10}(E/MeV)"); + h_rz_prot_spec ->SetTitle("FLUX [p(log_{10}(E/MeV))/cm^{2}]"); + + h_full_rz_prot_spec ->SetXTitle("|z| [cm]"); + h_full_rz_prot_spec ->SetYTitle("r [cm]"); + h_full_rz_prot_spec ->SetZTitle("log_{10}(E/MeV)"); + h_full_rz_prot_spec ->SetTitle("FLUX [p(log_{10}(E/MeV))/cm^{2}]"); + + // rest spectra + TH3D *h_full_rz_rest_spec = new TH3D("full_rz_rest_spec","full_rz_rest_spec",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + TH3D *h_rz_rest_spec = new TH3D("rz_rest_spec","rz_rest_spec",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinslogEo,m_config.logEMino,m_config.logEMaxo); + + h_rz_rest_spec ->SetXTitle("|z| [cm]"); + h_rz_rest_spec ->SetYTitle("r [cm]"); + h_rz_rest_spec ->SetZTitle("log_{10}(E/MeV)"); + h_rz_rest_spec ->SetTitle("FLUX [rest(log_{10}(E/MeV))/cm^{2}]"); + + h_full_rz_rest_spec ->SetXTitle("|z| [cm]"); + h_full_rz_rest_spec ->SetYTitle("r [cm]"); + h_full_rz_rest_spec ->SetZTitle("log_{10}(E/MeV)"); + h_full_rz_rest_spec ->SetTitle("FLUX [rest(log_{10}(E/MeV))/cm^{2}]"); + TH2D * h_rz_vol = 0; TH2D * h_rz_norm = 0; TH2D * h_full_rz_vol = 0; @@ -322,6 +463,30 @@ namespace G4UA{ // CHAD val =maps.m_rz_chad[vBin]; h_rz_chad->SetBinContent(iBin,val/vol); + // Neutron Energy Spectra + for(int k=0;k<h_rz_neut_spec->GetNbinsZ();k++) { + int kBin = h_rz_neut_spec->GetBin(i+1,j+1,k+1); + int vBinE = m_config.nBinsr*m_config.nBinslogEn*i+j*m_config.nBinslogEn+k; + val =maps.m_rz_neut_spec[vBinE]; + h_rz_neut_spec->SetBinContent(kBin,val/vol); + } + // All other particle's Energy Spectra + for(int k=0;k<h_rz_gamm_spec->GetNbinsZ();k++) { + int kBin = h_rz_gamm_spec->GetBin(i+1,j+1,k+1); + int vBinE = m_config.nBinsr*m_config.nBinslogEo*i+j*m_config.nBinslogEo+k; + val =maps.m_rz_gamm_spec[vBinE]; + h_rz_gamm_spec->SetBinContent(kBin,val/vol); + val =maps.m_rz_elec_spec[vBinE]; + h_rz_elec_spec->SetBinContent(kBin,val/vol); + val =maps.m_rz_muon_spec[vBinE]; + h_rz_muon_spec->SetBinContent(kBin,val/vol); + val =maps.m_rz_pion_spec[vBinE]; + h_rz_pion_spec->SetBinContent(kBin,val/vol); + val =maps.m_rz_prot_spec[vBinE]; + h_rz_prot_spec->SetBinContent(kBin,val/vol); + val =maps.m_rz_rest_spec[vBinE]; + h_rz_rest_spec->SetBinContent(kBin,val/vol); + } if (!m_config.material.empty()) { // need volume fraction only if particular material is selected // VOL @@ -339,7 +504,14 @@ namespace G4UA{ h_rz_h20->Write(); h_rz_neut->Write(); h_rz_chad->Write(); - + h_rz_neut_spec->Write(); + h_rz_gamm_spec->Write(); + h_rz_elec_spec->Write(); + h_rz_muon_spec->Write(); + h_rz_pion_spec->Write(); + h_rz_prot_spec->Write(); + h_rz_rest_spec->Write(); + // normalize to volume element per bin for(int i=0;i<h_full_rz_tid->GetNbinsX();i++) { for(int j=0;j<h_full_rz_tid->GetNbinsY();j++) { @@ -369,6 +541,30 @@ namespace G4UA{ // CHAD val =maps.m_full_rz_chad[vBin]; h_full_rz_chad->SetBinContent(iBin,val/vol); + // Neutron Energy Spectra + for(int k=0;k<h_full_rz_neut_spec->GetNbinsZ();k++) { + int kBin = h_full_rz_neut_spec->GetBin(i+1,j+1,k+1); + int vBinE = m_config.nBinsr*m_config.nBinslogEn*i+j*m_config.nBinslogEn+k; + val =maps.m_full_rz_neut_spec[vBinE]; + h_full_rz_neut_spec->SetBinContent(kBin,val/vol); + } + // All other particle's Energy Spectra + for(int k=0;k<h_full_rz_gamm_spec->GetNbinsZ();k++) { + int kBin = h_full_rz_gamm_spec->GetBin(i+1,j+1,k+1); + int vBinE = m_config.nBinsr*m_config.nBinslogEo*i+j*m_config.nBinslogEo+k; + val =maps.m_full_rz_gamm_spec[vBinE]; + h_full_rz_gamm_spec->SetBinContent(kBin,val/vol); + val =maps.m_full_rz_elec_spec[vBinE]; + h_full_rz_elec_spec->SetBinContent(kBin,val/vol); + val =maps.m_full_rz_muon_spec[vBinE]; + h_full_rz_muon_spec->SetBinContent(kBin,val/vol); + val =maps.m_full_rz_pion_spec[vBinE]; + h_full_rz_pion_spec->SetBinContent(kBin,val/vol); + val =maps.m_full_rz_prot_spec[vBinE]; + h_full_rz_prot_spec->SetBinContent(kBin,val/vol); + val =maps.m_full_rz_rest_spec[vBinE]; + h_full_rz_rest_spec->SetBinContent(kBin,val/vol); + } if (!m_config.material.empty()) { // need volume fraction only if particular material is selected // VOL @@ -386,6 +582,13 @@ namespace G4UA{ h_full_rz_h20->Write(); h_full_rz_neut->Write(); h_full_rz_chad->Write(); + h_full_rz_neut_spec->Write(); + h_full_rz_gamm_spec->Write(); + h_full_rz_elec_spec->Write(); + h_full_rz_muon_spec->Write(); + h_full_rz_pion_spec->Write(); + h_full_rz_prot_spec->Write(); + h_full_rz_rest_spec->Write(); // normalize to volume element per bin for(int i=0;i<h_3d_tid->GetNbinsX();i++) { /* |z| */