From 621bea712a09e88956e8ca4561c459b0316a57e2 Mon Sep 17 00:00:00 2001
From: Sven Menke <sven.menke@cern.ch>
Date: Mon, 29 Jun 2020 12:09:37 +0000
Subject: [PATCH] RadiationMapsMaker: Direction info for spectra and memory
 footprint improvement in finalize

---
 .../share/jobOptions.RadiationMapsMaker.py    |   4 +
 .../G4UserActions/src/RadiationMapsMaker.cxx  |  86 +-
 .../G4UserActions/src/RadiationMapsMaker.h    |  26 +-
 .../src/RadiationMapsMakerTool.cxx            | 984 ++++++++----------
 .../src/RadiationMapsMakerTool.h              |   2 +-
 5 files changed, 566 insertions(+), 536 deletions(-)

diff --git a/Simulation/G4Utilities/G4UserActions/share/jobOptions.RadiationMapsMaker.py b/Simulation/G4Utilities/G4UserActions/share/jobOptions.RadiationMapsMaker.py
index c72dd9e6702..d8dc202a3bf 100644
--- a/Simulation/G4Utilities/G4UserActions/share/jobOptions.RadiationMapsMaker.py
+++ b/Simulation/G4Utilities/G4UserActions/share/jobOptions.RadiationMapsMaker.py
@@ -15,6 +15,8 @@ from G4UserActions.G4UserActionsConf import G4UA__RadiationMapsMakerTool
 # radmaptool.NBinsLogEn      =    90
 # radmaptool.NBinsLogEo      =    45
 # radmaptool.NBinsLogTimeCut =    20
+# radmaptool.NBinsDPhi       =    18
+# radmaptool.NBinsTheta      =     9
 # radmaptool.NBinsR3D        =    30
 # radmaptool.NBinsZ3D        =    60
 # radmaptool.NBinsPhi3D      =    32
@@ -34,6 +36,8 @@ from G4UserActions.G4UserActionsConf import G4UA__RadiationMapsMakerTool
 # radmaptool.LogEMaxo        =    7.0  # in log10(E/MeV)
 # radmaptool.LogTMin         =   -9.0  # in log10(t_cut/s)
 # radmaptool.LogTMax         =   11.0  # in log10(t_cut/s)
+# radmaptool.ThetaMin        =    0.0  # in degrees 
+# radmaptool.ThetaMin        =   90.0  # in degrees
 # radmaptool.ElemZMin        =    1    # Atomic number
 # radmaptool.ElemZMax        =   92    # Atomic number
 #
diff --git a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.cxx b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.cxx
index 8bf2474349b..b309896e414 100644
--- a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.cxx
+++ b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.cxx
@@ -131,6 +131,10 @@ namespace G4UA{
       m_rz_neut_spec     [i] += maps.m_rz_neut_spec     [i];
       m_full_rz_neut_spec[i] += maps.m_full_rz_neut_spec[i];
     }
+    // x theta bins
+    for(unsigned int i=0;i<maps.m_theta_full_rz_neut_spec.size();i++) {
+      m_theta_full_rz_neut_spec[i] += maps.m_theta_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];
@@ -146,6 +150,16 @@ namespace G4UA{
       m_rz_rest_spec     [i] += maps.m_rz_rest_spec     [i];
       m_full_rz_rest_spec[i] += maps.m_full_rz_rest_spec[i];
     }
+    // x theta bins
+    for(unsigned int i=0;i<maps.m_theta_full_rz_gamm_spec.size();i++) {
+      m_theta_full_rz_gamm_spec[i]  += maps.m_theta_full_rz_gamm_spec[i];
+      m_theta_full_rz_elec_spec[i]  += maps.m_theta_full_rz_elec_spec[i];
+      m_theta_full_rz_muon_spec[i]  += maps.m_theta_full_rz_muon_spec[i];
+      m_theta_full_rz_pion_spec[i]  += maps.m_theta_full_rz_pion_spec[i];
+      m_theta_full_rz_prot_spec[i]  += maps.m_theta_full_rz_prot_spec[i];
+      m_theta_full_rz_rchgd_spec[i] += maps.m_theta_full_rz_rchgd_spec[i];
+      m_theta_full_rz_rneut_spec[i] += maps.m_theta_full_rz_rneut_spec[i];
+    }
   }
 
   void RadiationMapsMaker::BeginOfRunAction(const G4Run*){
@@ -193,6 +207,15 @@ namespace G4UA{
     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);
+
+    m_maps.m_theta_full_rz_neut_spec .resize(0);
+    m_maps.m_theta_full_rz_gamm_spec .resize(0);
+    m_maps.m_theta_full_rz_elec_spec .resize(0);
+    m_maps.m_theta_full_rz_muon_spec .resize(0);
+    m_maps.m_theta_full_rz_pion_spec .resize(0);
+    m_maps.m_theta_full_rz_prot_spec .resize(0);
+    m_maps.m_theta_full_rz_rchgd_spec.resize(0);
+    m_maps.m_theta_full_rz_rneut_spec.resize(0);
     
     if (!m_config.material.empty()) {
       // need volume fraction only if particular material is selected
@@ -248,6 +271,15 @@ namespace G4UA{
     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);
 
+    m_maps.m_theta_full_rz_neut_spec .resize(m_config.nBinsdphi*m_config.nBinstheta*m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEn,0.0);
+    m_maps.m_theta_full_rz_gamm_spec .resize(m_config.nBinsdphi*m_config.nBinstheta*m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0);
+    m_maps.m_theta_full_rz_elec_spec .resize(m_config.nBinsdphi*m_config.nBinstheta*m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0);
+    m_maps.m_theta_full_rz_muon_spec .resize(m_config.nBinsdphi*m_config.nBinstheta*m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0);
+    m_maps.m_theta_full_rz_pion_spec .resize(m_config.nBinsdphi*m_config.nBinstheta*m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0);
+    m_maps.m_theta_full_rz_prot_spec .resize(m_config.nBinsdphi*m_config.nBinstheta*m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0);
+    m_maps.m_theta_full_rz_rchgd_spec.resize(m_config.nBinsdphi*m_config.nBinstheta*m_config.nBinsz*m_config.nBinsr*m_config.nBinslogEo,0.0);
+    m_maps.m_theta_full_rz_rneut_spec.resize(m_config.nBinsdphi*m_config.nBinstheta*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
@@ -407,7 +439,7 @@ namespace G4UA{
       double y1 = aStep->GetPostStepPoint()->GetPosition().y()*0.1;
       double z0 = aStep->GetPreStepPoint()->GetPosition().z()*0.1;
       double z1 = aStep->GetPostStepPoint()->GetPosition().z()*0.1;
-      
+
       double l = sqrt(pow(x1-x0,2)+pow(y1-y0,2)+pow(z1-z0,2));
       // make 1 mm steps but at least 1 step
       double dl0 = 0.1;
@@ -419,6 +451,14 @@ namespace G4UA{
       
       double weight = 0; // weight for NIEL
       double eKin = aStep->GetTrack()->GetKineticEnergy();
+      double theta = aStep->GetTrack()->GetMomentumDirection().theta()*180./M_PI;
+      // if theta range in configuration is 0 - 90 assume that 180-theta should
+      // be used for theta > 90; otherwise leave theta unchanged
+      theta = (theta > 90&&m_config.thetaMin==0&&m_config.thetaMax==90?180-theta:theta);
+      double dphi = (aStep->GetTrack()->GetMomentumDirection().phi()-p.phi())*180./M_PI;
+      while ( dphi > 360 ) dphi -= 360.;
+      while ( dphi <   0 ) dphi += 360.;
+      
       double logEKin = (eKin > 0?log10(eKin):(m_config.logEMinn<m_config.logEMino?m_config.logEMinn:m_config.logEMino)-1);
 
       if ( pdgid == 1 || pdgid == 9 ) {
@@ -472,6 +512,8 @@ namespace G4UA{
 	int vBinFullSpeco = -1;
 	int vBinZoomTime  = -1;
 	int vBinFullTime  = -1;
+	int vBinThetaFullSpecn = -1;
+	int vBinThetaFullSpeco = -1;
 	
 	// zoom 2d
 	if ( m_config.zMinZoom < abszorz && 
@@ -517,12 +559,26 @@ namespace G4UA{
 		 (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.thetaMin < theta && 
+		   m_config.thetaMax > theta ) {
+		int ith = (theta-m_config.thetaMin)/(m_config.thetaMax-m_config.thetaMin)*m_config.nBinstheta;
+		int idph = dphi/360.*m_config.nBinsdphi;
+		ith = ith*m_config.nBinsdphi+idph;
+		vBinThetaFullSpecn = m_config.nBinsr*m_config.nBinslogEn*m_config.nBinsdphi*m_config.nBinstheta*iz+ir*m_config.nBinslogEn*m_config.nBinsdphi*m_config.nBinstheta+ile*m_config.nBinsdphi*m_config.nBinstheta+ith;
+	      }
 	    }
 	    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;
+	      if ( m_config.thetaMin < theta && 
+		   m_config.thetaMax > theta ) {
+		int ith = (theta-m_config.thetaMin)/(m_config.thetaMax-m_config.thetaMin)*m_config.nBinstheta;
+		int idph = dphi/360.*m_config.nBinsdphi;
+		ith = ith*m_config.nBinsdphi+idph;
+		vBinThetaFullSpeco = m_config.nBinsr*m_config.nBinslogEo*m_config.nBinsdphi*m_config.nBinstheta*iz+ir*m_config.nBinslogEo*m_config.nBinsdphi*m_config.nBinstheta+ile*m_config.nBinsdphi*m_config.nBinstheta+ith;
+	      }
 	    }
 	  }
 	}
@@ -685,6 +741,9 @@ namespace G4UA{
 	    if ( vBinFullSpecn >=0 ) {
 	      m_maps.m_full_rz_neut_spec [vBinFullSpecn] += dl;
 	    }
+	    if ( vBinThetaFullSpecn >=0 ) {
+	      m_maps.m_theta_full_rz_neut_spec [vBinThetaFullSpecn] += dl;
+	    }
 	  }
 	}
 	
@@ -730,6 +789,31 @@ namespace G4UA{
 	      m_maps.m_full_rz_rest_spec [vBinFullSpeco] += dl;
 	    }
 	  }
+	  if ( vBinThetaFullSpeco >=0 ) {
+	    if ( pdgid == 0 ) {
+	      m_maps.m_theta_full_rz_gamm_spec [vBinThetaFullSpeco] += dl;
+	    }
+	    else if ( pdgid == 1 ) {
+	      m_maps.m_theta_full_rz_prot_spec [vBinThetaFullSpeco] += dl;
+	    }
+	    else if ( pdgid == 2 ) {
+	      m_maps.m_theta_full_rz_pion_spec [vBinThetaFullSpeco] += dl;
+	    }
+	    else if ( pdgid == 3 ) {
+	      m_maps.m_theta_full_rz_muon_spec [vBinThetaFullSpeco] += dl;
+	    }
+	    else if ( pdgid == 4 || pdgid == 5 ) {
+	      m_maps.m_theta_full_rz_elec_spec [vBinThetaFullSpeco] += dl;
+	    }
+	    else {
+	      if ( absq > 0 ) {
+		m_maps.m_theta_full_rz_rchgd_spec [vBinThetaFullSpeco] += dl;
+	      }
+	      else {
+		m_maps.m_theta_full_rz_rneut_spec [vBinThetaFullSpeco] += dl;
+	      }
+	    }
+	  }
 	}
 	
 	if (!m_config.material.empty()) {
diff --git a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.h b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.h
index 682ba45e496..b718b060a5a 100644
--- a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.h
+++ b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMaker.h
@@ -54,6 +54,14 @@ namespace G4UA
 	double phiMinZoom = -180.; // degrees
 	double phiMaxZoom =  180.; // degrees
 
+	// theta x dphi bins are used in the theta-spectra
+	
+	int nBinsdphi =  18; // 0 degrees <= dphi < 360 degrees
+	int nBinstheta =  9;
+
+	double thetaMin =  0.; // degrees
+	double thetaMax = 90.; // degrees
+
 	// neutron spectra
 	int nBinslogEn  =  90;   
 	double logEMinn = -11.; // min log10(E_kin/MeV) 
@@ -146,13 +154,17 @@ namespace G4UA
 	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;
+        /// vector of neutron spectra in log10(E/MeV) bins and the full 2d grid x theta bins
+	std::vector<double> m_theta_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
+        /// vector of gamma spectra in log10(E/MeV) bins and the full 2d grid
 	std::vector<double> m_full_rz_gamm_spec;
+        /// vector of gamma spectra in log10(E/MeV) bins and the full 2d grid x theta bins
+	std::vector<double> m_theta_full_rz_gamm_spec;
 
 	// e^+/-
 	
@@ -160,6 +172,8 @@ namespace G4UA
 	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;
+        /// vector of e^+/- spectra in log10(E/MeV) bins and the full 2d grid x theta bins
+	std::vector<double> m_theta_full_rz_elec_spec;
 
 	// mu^+/-
 	
@@ -167,6 +181,8 @@ namespace G4UA
 	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;
+        /// vector of mu^+/- spectra in log10(E/MeV) bins and the full 2d grid x theta bins
+	std::vector<double> m_theta_full_rz_muon_spec;
 
 	// pi^+/-
 	
@@ -174,6 +190,8 @@ namespace G4UA
 	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;
+        /// vector of pi^+/- spectra in log10(E/MeV) bins and the full 2d grid x theta bins
+	std::vector<double> m_theta_full_rz_pion_spec;
 
 	// proton
 	
@@ -181,6 +199,8 @@ namespace G4UA
 	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;
+        /// vector of proton spectra in log10(E/MeV) bins and the full 2d grid x theta bins
+	std::vector<double> m_theta_full_rz_prot_spec;
 
 	// rest
 	
@@ -188,6 +208,10 @@ namespace G4UA
 	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;
+        /// vector of rest charged spectra in log10(E/MeV) bins and the full 2d grid x theta bins
+	std::vector<double> m_theta_full_rz_rchgd_spec;
+        /// vector of rest neutral spectra in log10(E/MeV) bins and the full 2d grid x theta bins
+	std::vector<double> m_theta_full_rz_rneut_spec;
 
 	// time dependent maps
 
diff --git a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.cxx b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.cxx
index 0940d3c2f84..b1cd1fd0755 100644
--- a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.cxx
+++ b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.cxx
@@ -18,6 +18,7 @@ namespace G4UA{
     declareProperty("RadMapsFileName", m_radMapsFileName);
     /// Name of the material to make radiation maps for (take all if empty) 
     declareProperty("Material"       , m_config.material);
+    /// If true consider hits with y>0 only -- useful for shafts
     declareProperty("PositiveYOnly"  , m_config.posYOnly);
     /// map granularities 
     /// number of bins in r and z for all 2D maps
@@ -27,6 +28,10 @@ namespace G4UA{
     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 dphi for dphi x theta dependent energy spectra
+    declareProperty("NBinsDPhi"      , m_config.nBinsdphi);
+    /// number of bins in theta for dphi x theta dependent energy spectra
+    declareProperty("NBinsTheta"     , m_config.nBinstheta);
     /// number of bins in r, z and phi for all 3D maps
     declareProperty("NBinsR3D"       , m_config.nBinsr3d);
     declareProperty("NBinsZ3D"       , m_config.nBinsz3d);
@@ -53,6 +58,9 @@ namespace G4UA{
     /// for logE of other particles in 2D spectra
     declareProperty("LogEMino"       , m_config.logEMino);
     declareProperty("LogEMaxo"       , m_config.logEMaxo);
+    /// for Theta in 2D spectra
+    declareProperty("ThetaMin"       , m_config.thetaMin);
+    declareProperty("ThetaMax"       , m_config.thetaMax);
     /// for logT in time-dependent TID 2D maps
     declareProperty("LogTMin"        , m_config.logTMin);
     declareProperty("LogTMax"        , m_config.logTMax);
@@ -80,6 +88,9 @@ namespace G4UA{
                                          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" << 
+                  "DPhi-Bins:       " << m_config.nBinsdphi << " dphi-bins, 0 < dphi < 360 \n" << 
+		  "Theta-Bins:      " << m_config.nBinstheta << " theta-bins"                                     << ", "                  <<
+                                         m_config.thetaMin   << " < theta < "                                     << m_config.thetaMax   << "\n" << 
                   "3D Maps:         " << m_config.nBinsz3d   << (m_config.zMinFull<0?" z-bins, ":" |z|-bins, ")   << 
                                          m_config.nBinsr3d   << " r-bins, "                                       << 
                                          m_config.nBinsphi3d << " phi-bins"                                       << "\n"                << 
@@ -101,46 +112,72 @@ namespace G4UA{
   {
     ATH_MSG_DEBUG( "Finalizing " << name() );
 
-    // first make sure the vectors are empty
-
     RadiationMapsMaker::Report maps;
 
-    maps.m_rz_tid .resize(0);
-    maps.m_rz_eion.resize(0);
-    maps.m_rz_niel.resize(0);
-    maps.m_rz_h20 .resize(0);
-    maps.m_rz_neut.resize(0);
-    maps.m_rz_chad.resize(0);
-
-    maps.m_full_rz_tid .resize(0);
-    maps.m_full_rz_eion.resize(0);
-    maps.m_full_rz_niel.resize(0);
-    maps.m_full_rz_h20 .resize(0);
-    maps.m_full_rz_neut.resize(0);
-    maps.m_full_rz_chad.resize(0);
-
-    maps.m_3d_tid .resize(0);
-    maps.m_3d_eion.resize(0);
-    maps.m_3d_niel.resize(0);
-    maps.m_3d_h20 .resize(0);
-    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);
+    // vector of pointers to vectors of double to save space
+    std::vector<std::vector<double> *> pVal = {
+      &(maps.m_rz_tid),&(maps.m_rz_eion),&(maps.m_rz_niel),&(maps.m_rz_h20),&(maps.m_rz_neut),&(maps.m_rz_chad),
+      &(maps.m_full_rz_tid),&(maps.m_full_rz_eion),&(maps.m_full_rz_niel),&(maps.m_full_rz_h20),&(maps.m_full_rz_neut),&(maps.m_full_rz_chad)
+    };
+
+    std::vector<std::vector<double> *> pVal3d = {
+      &(maps.m_3d_tid),&(maps.m_3d_eion),&(maps.m_3d_niel),&(maps.m_3d_h20),&(maps.m_3d_neut),&(maps.m_3d_chad)
+    };
+
+    std::vector<std::vector<double> *> pValSpec = {
+      &(maps.m_rz_neut_spec),&(maps.m_rz_gamm_spec),&(maps.m_rz_elec_spec),&(maps.m_rz_muon_spec),&(maps.m_rz_pion_spec),&(maps.m_rz_prot_spec),&(maps.m_rz_rest_spec),     
+      &(maps.m_full_rz_neut_spec),&(maps.m_full_rz_gamm_spec),&(maps.m_full_rz_elec_spec),&(maps.m_full_rz_muon_spec),&(maps.m_full_rz_pion_spec),&(maps.m_full_rz_prot_spec),&(maps.m_full_rz_rest_spec)
+    };
+
+    std::vector<int> nBinslogE = {
+      m_config.nBinslogEn,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo,
+      m_config.nBinslogEn,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo      
+    };
+
+    std::vector<std::vector<double> *> pValThetaSpec = {
+      &(maps.m_theta_full_rz_neut_spec),&(maps.m_theta_full_rz_gamm_spec),&(maps.m_theta_full_rz_elec_spec),&(maps.m_theta_full_rz_muon_spec),&(maps.m_theta_full_rz_pion_spec),&(maps.m_theta_full_rz_prot_spec),&(maps.m_theta_full_rz_rchgd_spec),&(maps.m_theta_full_rz_rneut_spec)
+    };
+
+    std::vector<int> nBinsThetalogE = {
+      m_config.nBinslogEn,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo,m_config.nBinslogEo
+    };
+
+    for(unsigned int hi=0;hi<pVal.size();hi++) {
+
+      // first make sure the vectors are empty
+
+      (pVal[hi])->resize(0);
+
+      // then resize to proper size and initialize with 0's 
+      // all maps are needed for the merge - so have to do resize
+      // for all before merging any ...
+
+      (pVal[hi])->resize(m_config.nBinsz*m_config.nBinsr,0.0);
+    }
+
+    // same for 3d 
+
+    for(unsigned int hi=0;hi<pVal3d.size();hi++) {
+      (pVal3d[hi])->resize(0);
+      (pVal3d[hi])->resize(m_config.nBinsz3d*m_config.nBinsr3d*m_config.nBinsphi3d,0.0);
+    }
+
+    // same for spectra
 
+    for(unsigned int hi=0;hi<pValSpec.size();hi++) {
+      (pValSpec[hi])->resize(0);
+      (pValSpec[hi])->resize(m_config.nBinsz*m_config.nBinsr*nBinslogE[hi],0.0);
+    }
+
+    // same for theta x dphi spectra
+
+    for(unsigned int hi=0;hi<pValThetaSpec.size();hi++) {
+      (pValThetaSpec[hi])->resize(0);
+      (pValThetaSpec[hi])->resize(m_config.nBinsdphi*m_config.nBinstheta*m_config.nBinsz*m_config.nBinsr*nBinsThetalogE[hi],0.0);
+    }
+
+    // same for misc individual maps
+    
     maps.m_rz_tid_time      .resize(0);
     maps.m_full_rz_tid_time .resize(0);
 
@@ -161,42 +198,8 @@ namespace G4UA{
     }
 
     // then resize to proper size and initialize with 0's 
-
-    maps.m_rz_tid .resize(m_config.nBinsz*m_config.nBinsr,0.0);
-    maps.m_rz_eion.resize(m_config.nBinsz*m_config.nBinsr,0.0);
-    maps.m_rz_niel.resize(m_config.nBinsz*m_config.nBinsr,0.0);
-    maps.m_rz_h20 .resize(m_config.nBinsz*m_config.nBinsr,0.0);
-    maps.m_rz_neut.resize(m_config.nBinsz*m_config.nBinsr,0.0);
-    maps.m_rz_chad.resize(m_config.nBinsz*m_config.nBinsr,0.0);
-
-    maps.m_full_rz_tid .resize(m_config.nBinsz*m_config.nBinsr,0.0);
-    maps.m_full_rz_eion.resize(m_config.nBinsz*m_config.nBinsr,0.0);
-    maps.m_full_rz_niel.resize(m_config.nBinsz*m_config.nBinsr,0.0);
-    maps.m_full_rz_h20 .resize(m_config.nBinsz*m_config.nBinsr,0.0);
-    maps.m_full_rz_neut.resize(m_config.nBinsz*m_config.nBinsr,0.0);
-    maps.m_full_rz_chad.resize(m_config.nBinsz*m_config.nBinsr,0.0);
-    
-    maps.m_3d_tid .resize(m_config.nBinsz3d*m_config.nBinsr3d*m_config.nBinsphi3d,0.0);
-    maps.m_3d_eion.resize(m_config.nBinsz3d*m_config.nBinsr3d*m_config.nBinsphi3d,0.0);
-    maps.m_3d_niel.resize(m_config.nBinsz3d*m_config.nBinsr3d*m_config.nBinsphi3d,0.0);
-    maps.m_3d_h20 .resize(m_config.nBinsz3d*m_config.nBinsr3d*m_config.nBinsphi3d,0.0);
-    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);
+    // all maps are needed for the merge - so have to do resize
+    // for all first ...
 
     maps.m_rz_tid_time      .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogT,0.0);
     maps.m_full_rz_tid_time .resize(m_config.nBinsz*m_config.nBinsr*m_config.nBinslogT,0.0);
@@ -224,321 +227,378 @@ namespace G4UA{
 
     TFile * f = new TFile(m_radMapsFileName.c_str(),"RECREATE");
 
-    TH2D * h_rz_tid  = new TH2D("rz_tid" ,"rz_tid" ,m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom);
-    TH2D * h_rz_eion = new TH2D("rz_eion","rz_eion",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom);
-    TH2D * h_rz_niel = new TH2D("rz_niel","rz_niel",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom);
-    TH2D * h_rz_h20  = new TH2D("rz_h20" ,"rz_h20" ,m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom);
-    TH2D * h_rz_neut = new TH2D("rz_neut","rz_neut",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom);
-    TH2D * h_rz_chad = new TH2D("rz_chad","rz_chad",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom);
+    // histograms can be booked, filled, written and deleted in a loop
+    // in order to save memory. Need vectors to loop over them ...
+
+    std::vector<const char *> h2dNames = {
+      "rz_tid","rz_eion","rz_niel","rz_h20","rz_neut","rz_chad",
+      "full_rz_tid","full_rz_eion","full_rz_niel","full_rz_h20","full_rz_neut","full_rz_chad"
+    };
+
+    std::vector<const char *> h2dZTitles = {
+      "TID [Gy]","E_{ion}/V [MeV/cm^{3}]","NIEL [n_{eq}/cm^{2}]","SEE [h_{>20 MeV}/cm^{2}]","FLUX [n_{>100 keV}/cm^{2}]","FLUX [h_{charged}/cm^{2}]",
+      "TID [Gy]","E_{ion}/V [MeV/cm^{3}]","NIEL [n_{eq}/cm^{2}]","SEE [h_{>20 MeV}/cm^{2}]","FLUX [n_{>100 keV}/cm^{2}]","FLUX [h_{charged}/cm^{2}]"
+    };
+
+    std::vector<double> zMin = {
+      m_config.zMinZoom,m_config.zMinZoom,m_config.zMinZoom,m_config.zMinZoom,m_config.zMinZoom,m_config.zMinZoom,
+      m_config.zMinFull,m_config.zMinFull,m_config.zMinFull,m_config.zMinFull,m_config.zMinFull,m_config.zMinFull
+    };
+ 
+    std::vector<double> zMax = {
+      m_config.zMaxZoom,m_config.zMaxZoom,m_config.zMaxZoom,m_config.zMaxZoom,m_config.zMaxZoom,m_config.zMaxZoom,
+      m_config.zMaxFull,m_config.zMaxFull,m_config.zMaxFull,m_config.zMaxFull,m_config.zMaxFull,m_config.zMaxFull
+    };
+ 
+    std::vector<double> rMin = {
+      m_config.rMinZoom,m_config.rMinZoom,m_config.rMinZoom,m_config.rMinZoom,m_config.rMinZoom,m_config.rMinZoom,
+      m_config.rMinFull,m_config.rMinFull,m_config.rMinFull,m_config.rMinFull,m_config.rMinFull,m_config.rMinFull
+    };
+ 
+    std::vector<double> rMax = {
+      m_config.rMaxZoom,m_config.rMaxZoom,m_config.rMaxZoom,m_config.rMaxZoom,m_config.rMaxZoom,m_config.rMaxZoom,
+      m_config.rMaxFull,m_config.rMaxFull,m_config.rMaxFull,m_config.rMaxFull,m_config.rMaxFull,m_config.rMaxFull
+    };
 
     const char * xtitle =  (m_config.zMinFull<0?"z [cm]":"|z| [cm]");
 
-    h_rz_tid  ->SetXTitle(xtitle);
-    h_rz_eion ->SetXTitle(xtitle);
-    h_rz_niel ->SetXTitle(xtitle);
-    h_rz_h20  ->SetXTitle(xtitle);
-    h_rz_neut ->SetXTitle(xtitle);
-    h_rz_chad ->SetXTitle(xtitle);
-
-    h_rz_tid  ->SetYTitle("r [cm]");
-    h_rz_eion ->SetYTitle("r [cm]");
-    h_rz_niel ->SetYTitle("r [cm]");
-    h_rz_h20  ->SetYTitle("r [cm]");
-    h_rz_neut ->SetYTitle("r [cm]");
-    h_rz_chad ->SetYTitle("r [cm]");
-
-    h_rz_tid  ->SetZTitle("TID [Gy]");
-    h_rz_eion ->SetZTitle("E_{ion}/V [MeV/cm^{3}]");
-    h_rz_niel ->SetZTitle("NIEL [n_{eq}/cm^{2}]");
-    h_rz_h20  ->SetZTitle("SEE [h_{>20 MeV}/cm^{2}]");
-    h_rz_neut ->SetZTitle("FLUX [n_{>100 keV}/cm^{2}]");
-    h_rz_chad ->SetZTitle("FLUX [h_{charged}/cm^{2}]");
-
-    TH2D *h_full_rz_tid  = new TH2D("full_rz_tid" ,"full_rz_tid" ,m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull);
-    TH2D *h_full_rz_eion = new TH2D("full_rz_eion","full_rz_eion",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull);
-    TH2D *h_full_rz_niel = new TH2D("full_rz_niel","full_rz_niel",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull);
-    TH2D *h_full_rz_h20  = new TH2D("full_rz_h20" ,"full_rz_h20" ,m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull);
-    TH2D *h_full_rz_neut = new TH2D("full_rz_neut","full_rz_neut",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull);
-    TH2D *h_full_rz_chad = new TH2D("full_rz_chad","full_rz_chad",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull);
-
-    h_full_rz_tid  ->SetXTitle(xtitle);
-    h_full_rz_eion ->SetXTitle(xtitle);
-    h_full_rz_niel ->SetXTitle(xtitle);
-    h_full_rz_h20  ->SetXTitle(xtitle);
-    h_full_rz_neut ->SetXTitle(xtitle);
-    h_full_rz_chad ->SetXTitle(xtitle);
-
-    h_full_rz_tid  ->SetYTitle("r [cm]");
-    h_full_rz_eion ->SetYTitle("r [cm]");
-    h_full_rz_niel ->SetYTitle("r [cm]");
-    h_full_rz_h20  ->SetYTitle("r [cm]");
-    h_full_rz_neut ->SetYTitle("r [cm]");
-    h_full_rz_chad ->SetYTitle("r [cm]");
-
-    h_full_rz_tid  ->SetZTitle("TID [Gy]");
-    h_full_rz_eion ->SetZTitle("E_{ion}/V [MeV/cm^{3}]");
-    h_full_rz_niel ->SetZTitle("NIEL [n_{eq}/cm^{2}]");
-    h_full_rz_h20  ->SetZTitle("SEE [h_{>20 MeV}/cm^{2}]");
-    h_full_rz_neut ->SetZTitle("FLUX [n_{>100 keV}/cm^{2}]");
-    h_full_rz_chad ->SetZTitle("FLUX [h_{charged}/cm^{2}]");
-
-    TH3D * h_3d_tid  = new TH3D("h3d_tid" ,"h3d_tid" ,m_config.nBinsz3d,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr3d,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinsphi3d,m_config.phiMinZoom,m_config.phiMaxZoom);
-    TH3D * h_3d_eion = new TH3D("h3d_eion","h3d_eion",m_config.nBinsz3d,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr3d,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinsphi3d,m_config.phiMinZoom,m_config.phiMaxZoom);
-    TH3D * h_3d_niel = new TH3D("h3d_niel","h3d_niel",m_config.nBinsz3d,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr3d,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinsphi3d,m_config.phiMinZoom,m_config.phiMaxZoom);
-    TH3D * h_3d_h20  = new TH3D("h3d_h20" ,"h3d_h20" ,m_config.nBinsz3d,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr3d,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinsphi3d,m_config.phiMinZoom,m_config.phiMaxZoom);
-    TH3D * h_3d_neut = new TH3D("h3d_neut","h3d_neut",m_config.nBinsz3d,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr3d,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinsphi3d,m_config.phiMinZoom,m_config.phiMaxZoom);
-    TH3D * h_3d_chad = new TH3D("h3d_chad","h3d_chad",m_config.nBinsz3d,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr3d,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinsphi3d,m_config.phiMinZoom,m_config.phiMaxZoom);
-
-    h_3d_tid  ->SetXTitle(xtitle);
-    h_3d_eion ->SetXTitle(xtitle);
-    h_3d_niel ->SetXTitle(xtitle);
-    h_3d_h20  ->SetXTitle(xtitle);
-    h_3d_neut ->SetXTitle(xtitle);
-    h_3d_chad ->SetXTitle(xtitle);
-
-    h_3d_tid  ->SetYTitle("r [cm]");
-    h_3d_eion ->SetYTitle("r [cm]");
-    h_3d_niel ->SetYTitle("r [cm]");
-    h_3d_h20  ->SetYTitle("r [cm]");
-    h_3d_neut ->SetYTitle("r [cm]");
-    h_3d_chad ->SetYTitle("r [cm]");
-
-    h_3d_tid  ->SetZTitle("#phi [#circ]");
-    h_3d_eion ->SetZTitle("#phi [#circ]");
-    h_3d_niel ->SetZTitle("#phi [#circ]");
-    h_3d_h20  ->SetZTitle("#phi [#circ]");
-    h_3d_neut ->SetZTitle("#phi [#circ]");
-    h_3d_chad ->SetZTitle("#phi [#circ]");
-
-    h_3d_tid  ->SetTitle("TID [Gy]");
-    h_3d_eion ->SetTitle("E_{ion}/V [MeV/cm^{3}]");
-    h_3d_niel ->SetTitle("NIEL [n_{eq}/cm^{2}]");
-    h_3d_h20  ->SetTitle("SEE [h_{>20 MeV}/cm^{2}]");
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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(xtitle);
-    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}]");
-
-    // time dependent TID maps
+    TH2D * h_rz_vol  = 0;
+    TH2D * h_rz_norm = 0;
+    TH2D * h_full_rz_vol  = 0;
+    TH2D * h_full_rz_norm = 0;
+
+    for(unsigned int hi=0;hi<h2dNames.size();hi++) {
+      TH2D *h2d = new TH2D(h2dNames[hi],h2dNames[hi],m_config.nBinsz,zMin[hi],zMax[hi],m_config.nBinsr,rMin[hi],rMax[hi]);
+      h2d->SetXTitle(xtitle);
+      h2d->SetYTitle("r [cm]");
+      h2d->SetZTitle(h2dZTitles[hi]);
+      if (hi==0 && !m_config.material.empty()) {
+	// need volume fraction only if particular material is selected
+	//
+	// the maps for TID, NIEL and SEE need to be divided by the ratio of (vol/norm) in order to get
+	// the proper estimate per volume bin for the selected material. 
+	// This is *not* done in the tool directly and left to the user after having summed the histograms
+	// from many individual jobs.
+	// 
+	h_rz_vol  = new TH2D("rz_vol" ,"rz_vol" ,m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom);
+	h_rz_norm = new TH2D("rz_norm","rz_norm",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom);
+	h_full_rz_vol  = new TH2D("full_rz_vol" ,"full_rz_vol" ,m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull);
+	h_full_rz_norm = new TH2D("full_rz_norm","full_rz_norm",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull);
+	
+	h_rz_vol  ->SetXTitle(xtitle);
+	h_rz_norm ->SetXTitle(xtitle);
+	h_rz_vol  ->SetYTitle("r [cm]");
+	h_rz_norm ->SetYTitle("r [cm]");
+	std::string hname("Volume fraction of ");
+	hname += m_config.material;
+	h_rz_vol  ->SetZTitle(hname.data());
+	h_rz_norm ->SetZTitle("Volume norm");
+
+	h_full_rz_vol  ->SetXTitle(xtitle);
+	h_full_rz_norm ->SetXTitle(xtitle);
+	h_full_rz_vol  ->SetYTitle("r [cm]");
+	h_full_rz_norm ->SetYTitle("r [cm]");
+	h_full_rz_vol  ->SetZTitle(hname.data());
+	h_full_rz_norm ->SetZTitle("Volume norm");
+      }
+      
+      // normalize to volume element per bin
+      for(int i=0;i<h2d->GetNbinsX();i++) { 
+	for(int j=0;j<h2d->GetNbinsY();j++) { 
+	  int iBin = h2d->GetBin(i+1,j+1); 
+	  int vBin = m_config.nBinsr*i+j;
+	  double r0=h2d->GetYaxis()->GetBinLowEdge(j+1);
+	  double r1=h2d->GetYaxis()->GetBinUpEdge(j+1);
+	  double z0=h2d->GetXaxis()->GetBinLowEdge(i+1);
+	  double z1=h2d->GetXaxis()->GetBinUpEdge(i+1); 
+	  double vol=(z1-z0)*M_PI*(r1*r1-r0*r0);
+	  // if |z| instead of z double the volume
+	  if ( m_config.zMinFull >= 0 ) vol *= 2; 
+	  // if positive y hemisphere is used only -- half the volume
+	  if ( m_config.posYOnly ) vol *= 0.5; 
+	  double val = (*(pVal[hi]))[vBin];
+	  h2d->SetBinContent(iBin,val/vol);
+	  if (hi ==0 && !m_config.material.empty()) {
+	    // need volume fraction only if particular material is selected
+	    // VOL
+	    val =maps.m_rz_vol[vBin];
+	    h_rz_vol->SetBinContent(iBin,val/vol);
+	    // NORM
+	    val =maps.m_rz_norm[vBin];
+	    h_rz_norm->SetBinContent(iBin,val/vol);
+	  }
+	  if (hi ==h2dNames.size()/2 && !m_config.material.empty()) {
+	    // need volume fraction only if particular material is selected
+	    // VOL
+	    val =maps.m_full_rz_vol[vBin];
+	    h_full_rz_vol->SetBinContent(iBin,val/vol);
+	    // NORM
+	    val =maps.m_full_rz_norm[vBin];
+	    h_full_rz_norm->SetBinContent(iBin,val/vol);
+	  }
+	}
+      }
+      h2d->Write();
+      h2d->Delete();
+      if (hi ==h2dNames.size()/2 && !m_config.material.empty()) {
+	h_rz_vol->Write();
+	h_rz_vol->Delete();
+	h_rz_norm->Write();
+	h_rz_norm->Delete();
+	h_full_rz_vol->Write();
+	h_full_rz_vol->Delete();
+	h_full_rz_norm->Write();
+	h_full_rz_norm->Delete();
+      }
+    }
+
+    std::vector<const char *> h3dNames = {
+      "h3d_tid","h3d_eion","h3d_niel","h3d_h20","h3d_neut","h3d_chad"
+    };
+
+    std::vector<const char *> h3dTitles = {
+      "TID [Gy]","E_{ion}/V [MeV/cm^{3}]","NIEL [n_{eq}/cm^{2}]","SEE [h_{>20 MeV}/cm^{2}]","FLUX [n_{>100 keV}/cm^{2}]","FLUX [h_{charged}/cm^{2}]"
+    };
+
+    TH3D * h_3d_vol  = 0;
+    TH3D * h_3d_norm = 0;
+
+    for(unsigned int hi=0;hi<h3dNames.size();hi++) {
+      TH3D *h3d = new TH3D(h3dNames[hi],h3dNames[hi],m_config.nBinsz3d,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr3d,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinsphi3d,m_config.phiMinZoom,m_config.phiMaxZoom);
+      h3d->SetXTitle(xtitle);
+      h3d->SetYTitle("r [cm]");
+      h3d->SetZTitle("#phi [#circ]");
+      h3d->SetTitle(h3dTitles[hi]);
+      if (hi == 0 && !m_config.material.empty()) {
+	h_3d_vol  = new TH3D("h3d_vol" ,"h3d_vol" ,m_config.nBinsz3d,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr3d,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinsphi3d,m_config.phiMinZoom,m_config.phiMaxZoom);
+	h_3d_norm = new TH3D("h3d_norm","h3d_norm",m_config.nBinsz3d,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr3d,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinsphi3d,m_config.phiMinZoom,m_config.phiMaxZoom);
+	h_3d_vol  ->SetXTitle(xtitle);
+	h_3d_norm ->SetXTitle(xtitle);
+	h_3d_vol  ->SetYTitle("r [cm]");
+	h_3d_norm ->SetYTitle("r [cm]");
+	h_3d_vol  ->SetZTitle("#phi [#circ]");
+	h_3d_norm ->SetZTitle("#phi [#circ]");
+	std::string hname("Volume fraction of ");
+	hname += m_config.material;
+	h_3d_vol  ->SetTitle(hname.data());
+	h_3d_norm ->SetTitle("Volume norm");
+      }
+      // normalize to volume element per bin
+      for(int i=0;i<h3d->GetNbinsX();i++) { 
+	for(int j=0;j<h3d->GetNbinsY();j++) { 
+	  for(int k=0;k<h3d->GetNbinsZ();k++) { 
+	    int vBin = m_config.nBinsr3d*m_config.nBinsphi3d*i+m_config.nBinsphi3d*j+k;
+	    int iBin = h3d->GetBin(i+1,j+1,k+1); 
+	    double phi0=h3d->GetZaxis()->GetBinLowEdge(k+1);
+	    double phi1=h3d->GetZaxis()->GetBinUpEdge(k+1);
+	    double r0=h3d->GetYaxis()->GetBinLowEdge(j+1);
+	    double r1=h3d->GetYaxis()->GetBinUpEdge(j+1);
+	    double z0=h3d->GetXaxis()->GetBinLowEdge(i+1);
+	    double z1=h3d->GetXaxis()->GetBinUpEdge(i+1); 
+	    double vol=(z1-z0)*M_PI*(r1*r1-r0*r0)*(phi1-phi0)/360.; 
+	    // if |z| instead of z double the volume
+	    if ( m_config.zMinFull >= 0 ) vol *= 2; 
+	    // assume that phi-range corresponds to full 360 degrees in case 
+	    // lower phi boundary is 0 - i.e. all phi-segments mapped to first
+	    if ( m_config.phiMinZoom == 0 ) {
+	      vol *= 360./m_config.phiMaxZoom;
+	      // if positive y hemisphere is used only -- half the volume
+	      if ( m_config.posYOnly ) 
+		vol *= 0.5; 
+	    }
+	    double val = (*(pVal3d[hi]))[vBin];
+	    h3d->SetBinContent(iBin,val/vol);
+	    if (hi == 0 && !m_config.material.empty()) {
+	      // VOL
+	      val =maps.m_3d_vol[vBin];
+	      h_3d_vol->SetBinContent(iBin,val/vol);
+	      // NORM
+	      val =maps.m_3d_norm[vBin];
+	      h_3d_norm->SetBinContent(iBin,val/vol);
+	    }
+	  }
+	}
+      }
+      h3d->Write();
+      h3d->Delete();
+      if (hi == 0 && !m_config.material.empty()) {
+	h_3d_vol->Write();
+	h_3d_vol->Delete();
+	h_3d_norm->Write();
+	h_3d_norm->Delete();
+      }
+    }
+
+    // spectra
+    
+    std::vector<const char *> hSpecNames = {
+      "rz_neut_spec","rz_gamm_spec","rz_elec_spec","rz_muon_spec","rz_pion_spec","rz_prot_spec","rz_rest_spec",
+      "full_rz_neut_spec","full_rz_gamm_spec","full_rz_elec_spec","full_rz_muon_spec","full_rz_pion_spec","full_rz_prot_spec","full_rz_rest_spec"
+    };
+
+    std::vector<const char *> hSpecTitles = {
+      "FLUX [n(log_{10}(E/MeV))/cm^{2}]","FLUX [#gamma(log_{10}(E/MeV))/cm^{2}]","FLUX [e^{#pm}(log_{10}(E/MeV))/cm^{2}]","FLUX [#mu^{#pm}(log_{10}(E/MeV))/cm^{2}]","FLUX [#pi^{#pm}(log_{10}(E/MeV))/cm^{2}]","FLUX [p(log_{10}(E/MeV))/cm^{2}]","FLUX [rest(log_{10}(E/MeV))/cm^{2}]",
+      "FLUX [n(log_{10}(E/MeV))/cm^{2}]","FLUX [#gamma(log_{10}(E/MeV))/cm^{2}]","FLUX [e^{#pm}(log_{10}(E/MeV))/cm^{2}]","FLUX [#mu^{#pm}(log_{10}(E/MeV))/cm^{2}]","FLUX [#pi^{#pm}(log_{10}(E/MeV))/cm^{2}]","FLUX [p(log_{10}(E/MeV))/cm^{2}]","FLUX [rest(log_{10}(E/MeV))/cm^{2}]"
+    };
+
+    std::vector<double> zMinSpec = {
+      m_config.zMinZoom,m_config.zMinZoom,m_config.zMinZoom,m_config.zMinZoom,m_config.zMinZoom,m_config.zMinZoom,m_config.zMinZoom,
+      m_config.zMinFull,m_config.zMinFull,m_config.zMinFull,m_config.zMinFull,m_config.zMinFull,m_config.zMinFull,m_config.zMinFull
+    };
+ 
+    std::vector<double> zMaxSpec = {
+      m_config.zMaxZoom,m_config.zMaxZoom,m_config.zMaxZoom,m_config.zMaxZoom,m_config.zMaxZoom,m_config.zMaxZoom,m_config.zMaxZoom,
+      m_config.zMaxFull,m_config.zMaxFull,m_config.zMaxFull,m_config.zMaxFull,m_config.zMaxFull,m_config.zMaxFull,m_config.zMaxFull
+    };
+ 
+    std::vector<double> rMinSpec = {
+      m_config.rMinZoom,m_config.rMinZoom,m_config.rMinZoom,m_config.rMinZoom,m_config.rMinZoom,m_config.rMinZoom,m_config.rMinZoom,
+      m_config.rMinFull,m_config.rMinFull,m_config.rMinFull,m_config.rMinFull,m_config.rMinFull,m_config.rMinFull,m_config.rMinFull
+    };
+ 
+    std::vector<double> rMaxSpec = {
+      m_config.rMaxZoom,m_config.rMaxZoom,m_config.rMaxZoom,m_config.rMaxZoom,m_config.rMaxZoom,m_config.rMaxZoom,m_config.rMaxZoom,
+      m_config.rMaxFull,m_config.rMaxFull,m_config.rMaxFull,m_config.rMaxFull,m_config.rMaxFull,m_config.rMaxFull,m_config.rMaxFull
+    };
+
+    std::vector<double> logEMin = {
+      m_config.logEMinn,m_config.logEMino,m_config.logEMino,m_config.logEMino,m_config.logEMino,m_config.logEMino,m_config.logEMino,
+      m_config.logEMinn,m_config.logEMino,m_config.logEMino,m_config.logEMino,m_config.logEMino,m_config.logEMino,m_config.logEMino
+    };
+ 
+    std::vector<double> logEMax = {
+      m_config.logEMaxn,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo,
+      m_config.logEMaxn,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo
+    };
+ 
+    for(unsigned int hi=0;hi<hSpecNames.size();hi++) {
+      TH3D *hSpec = new TH3D(hSpecNames[hi],hSpecNames[hi],m_config.nBinsz,zMinSpec[hi],zMaxSpec[hi],m_config.nBinsr,rMinSpec[hi],rMaxSpec[hi],nBinslogE[hi],logEMin[hi],logEMax[hi]);
+      hSpec->SetXTitle(xtitle);
+      hSpec->SetYTitle("r [cm]");
+      hSpec->SetZTitle("log_{10}(E/MeV)");
+      hSpec->SetTitle(hSpecTitles[hi]);
+      // normalize to volume element per bin
+      for(int i=0;i<hSpec->GetNbinsX();i++) { 
+	for(int j=0;j<hSpec->GetNbinsY();j++) {
+	  double r0=hSpec->GetYaxis()->GetBinLowEdge(j+1);
+	  double r1=hSpec->GetYaxis()->GetBinUpEdge(j+1);
+	  double z0=hSpec->GetXaxis()->GetBinLowEdge(i+1);
+	  double z1=hSpec->GetXaxis()->GetBinUpEdge(i+1); 
+	  double vol=(z1-z0)*M_PI*(r1*r1-r0*r0);
+	  // if |z| instead of z double the volume
+	  if ( m_config.zMinFull >= 0 ) vol *= 2; 
+	  // if positive y hemisphere is used only -- half the volume
+	  if ( m_config.posYOnly ) vol *= 0.5; 
+	  double val;
+	  // Energy Spectra
+	  for(int k=0;k<hSpec->GetNbinsZ();k++) { 
+	    int kBin = hSpec->GetBin(i+1,j+1,k+1); 
+	    int vBinE = m_config.nBinsr*nBinslogE[hi]*i+j*nBinslogE[hi]+k;
+	    val = (*(pValSpec[hi]))[vBinE];
+	    hSpec->SetBinContent(kBin,val/vol);
+	  }
+	}
+      }
+      hSpec->Write();
+      hSpec->Delete();
+    }
+    
+    std::vector<const char *> hThetaSpecNames = {
+      "theta_dphi_full_rz_neut_spec","theta_dphi_full_rz_gamm_spec","theta_dphi_full_rz_elec_spec","theta_dphi_full_rz_muon_spec","theta_dphi_full_rz_pion_spec","theta_dphi_full_rz_prot_spec","theta_dphi_full_rz_rchgd_spec","theta_dphi_full_rz_rneut_spec"
+    };
+
+    std::vector<const char *> hThetaSpecTitles = {
+      "FLUX [n(log_{10}(E/MeV))/cm^{2}]","FLUX [#gamma(log_{10}(E/MeV))/cm^{2}]","FLUX [e^{#pm}(log_{10}(E/MeV))/cm^{2}]","FLUX [#mu^{#pm}(log_{10}(E/MeV))/cm^{2}]","FLUX [#pi^{#pm}(log_{10}(E/MeV))/cm^{2}]","FLUX [p(log_{10}(E/MeV))/cm^{2}]","FLUX [rest^{chgd}(log_{10}(E/MeV))/cm^{2}]","FLUX [rest^{neut}(log_{10}(E/MeV))/cm^{2}]"
+    };
+
+    std::vector<double> thetalogEMin = {
+      m_config.logEMinn,m_config.logEMino,m_config.logEMino,m_config.logEMino,m_config.logEMino,m_config.logEMino,m_config.logEMino,m_config.logEMino
+    };
+ 
+    std::vector<double> thetalogEMax = {
+      m_config.logEMaxn,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo,m_config.logEMaxo
+    };
+ 
+    for(unsigned int hi=0;hi<hThetaSpecNames.size();hi++) {
+      for(int i=0;i<m_config.nBinstheta;i++) {
+	for(int j=0;j<m_config.nBinsdphi;j++) {
+	  TString hname(hThetaSpecNames[hi]);
+	  hname += "_";
+	  hname += (int)(m_config.thetaMin +   i  *(m_config.thetaMax-m_config.thetaMin)/m_config.nBinstheta);
+	  hname += "_";
+	  hname += (int)(m_config.thetaMin + (i+1)*(m_config.thetaMax-m_config.thetaMin)/m_config.nBinstheta);
+	  hname += "_";
+	  hname += (int)(j*360./m_config.nBinsdphi);
+	  hname += "_";
+	  hname += (int)((j+1)*360./m_config.nBinsdphi);
+	  TH3D * hThetaSpec = new TH3D(hname.Data(),hname.Data(),m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,nBinsThetalogE[hi],thetalogEMin[hi],thetalogEMax[hi]);
+	  
+	  hThetaSpec->SetXTitle(xtitle);
+	  hThetaSpec->SetYTitle("r [cm]");
+	  hThetaSpec->SetZTitle("log_{10}(E/MeV)");
+	  hname = TString(hThetaSpecTitles[hi]);
+	  hname += " Theta: ";
+	  hname += (int)(m_config.thetaMin +   i  *(m_config.thetaMax-m_config.thetaMin)/m_config.nBinstheta);
+	  hname += " - ";
+	  hname += (int)(m_config.thetaMin + (i+1)*(m_config.thetaMax-m_config.thetaMin)/m_config.nBinstheta);
+	  hname += " DPhi: ";
+	  hname += (int)(j*360./m_config.nBinsdphi);
+	  hname += " - ";
+	  hname += (int)((j+1)*360./m_config.nBinsdphi);
+	  hThetaSpec->SetTitle(hname.Data());
+	  // normalize to volume element per bin
+	  for(int k=0;k<hThetaSpec->GetNbinsX();k++) { 
+	    for(int l=0;l<hThetaSpec->GetNbinsY();l++) {
+	      double r0=hThetaSpec->GetYaxis()->GetBinLowEdge(l+1);
+	      double r1=hThetaSpec->GetYaxis()->GetBinUpEdge(l+1);
+	      double z0=hThetaSpec->GetXaxis()->GetBinLowEdge(k+1);
+	      double z1=hThetaSpec->GetXaxis()->GetBinUpEdge(k+1); 
+	      double vol=(z1-z0)*M_PI*(r1*r1-r0*r0);
+	      // if |z| instead of z double the volume
+	      if ( m_config.zMinFull >= 0 ) vol *= 2; 
+	      // if positive y hemisphere is used only -- half the volume
+	      if ( m_config.posYOnly ) vol *= 0.5; 
+	      double val;
+	      // Energy Spectra
+	      for(int m=0;m<hThetaSpec->GetNbinsZ();m++) { 
+		int mBin = hThetaSpec->GetBin(k+1,l+1,m+1); 
+		int vBinETh = m_config.nBinsr*nBinsThetalogE[hi]*m_config.nBinsdphi*m_config.nBinstheta*k+l*nBinsThetalogE[hi]*m_config.nBinsdphi*m_config.nBinstheta+m*m_config.nBinsdphi*m_config.nBinstheta+i*m_config.nBinsdphi+j;
+		val = (*(pValThetaSpec[hi]))[vBinETh];
+		hThetaSpec->SetBinContent(mBin,val/vol);
+	      }
+	    }
+	  }
+	  hThetaSpec->Write();
+	  hThetaSpec->Delete();
+	}
+      }
+    }
+    
+    // time dependent TID maps zoom
     TH3D * h_rz_tid_time       = new TH3D("rz_tid_time" ,"rz_tid_time"           ,m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinslogT,m_config.logTMin,m_config.logTMax);
-    TH3D * h_full_rz_tid_time  = new TH3D("full_rz_tid_time" ,"full_rz_tid_time" ,m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,m_config.nBinslogT,m_config.logTMin,m_config.logTMax);
     h_rz_tid_time     ->SetXTitle(xtitle);
-    h_full_rz_tid_time->SetXTitle(xtitle);
     h_rz_tid_time     ->SetYTitle("r [cm]");
-    h_full_rz_tid_time->SetYTitle("r [cm]");
     h_rz_tid_time     ->SetZTitle("log_{10}(t_{cut}/s)");
-    h_full_rz_tid_time->SetZTitle("log_{10}(t_{cut}/s)");
 
-    // element mass fraction maps
+    // element mass fraction maps zoom
     TH3D * h_rz_element       = new TH3D("rz_element" ,"rz_element"           ,m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom,m_config.elemZMax-m_config.elemZMin+1,m_config.elemZMin-0.5,m_config.elemZMax+0.5);
-    TH3D * h_full_rz_element  = new TH3D("full_rz_element" ,"full_rz_element" ,m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,m_config.elemZMax-m_config.elemZMin+1,m_config.elemZMin-0.5,m_config.elemZMax+0.5);
     h_rz_element     ->SetXTitle(xtitle);
-    h_full_rz_element->SetXTitle(xtitle);
     h_rz_element     ->SetYTitle("r [cm]");
-    h_full_rz_element->SetYTitle("r [cm]");
     h_rz_element     ->SetZTitle("Z");
-    h_full_rz_element->SetZTitle("Z");
-
-    TH2D * h_rz_vol  = 0;
-    TH2D * h_rz_norm = 0;
-    TH2D * h_full_rz_vol  = 0;
-    TH2D * h_full_rz_norm = 0;
-    TH3D * h_3d_vol  = 0;
-    TH3D * h_3d_norm = 0;
-    if (!m_config.material.empty()) {
-      // need volume fraction only if particular material is selected
-      //
-      // the maps for TID, NIEL and SEE need to be divided by the ratio of (vol/norm) in order to get
-      // the proper estimate per volume bin for the selected material. 
-      // This is *not* done in the tool directly and left to the user after having summed the histograms
-      // from many individual jobs.
-      // 
-      h_rz_vol  = new TH2D("rz_vol" ,"rz_vol" ,m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom);
-      h_rz_norm = new TH2D("rz_norm","rz_norm",m_config.nBinsz,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr,m_config.rMinZoom,m_config.rMaxZoom);
-      h_full_rz_vol  = new TH2D("full_rz_vol" ,"full_rz_vol" ,m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull);
-      h_full_rz_norm = new TH2D("full_rz_norm","full_rz_norm",m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull);
-      h_3d_vol  = new TH3D("h3d_vol" ,"h3d_vol" ,m_config.nBinsz3d,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr3d,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinsphi3d,m_config.phiMinZoom,m_config.phiMaxZoom);
-      h_3d_norm = new TH3D("h3d_norm","h3d_norm",m_config.nBinsz3d,m_config.zMinZoom,m_config.zMaxZoom,m_config.nBinsr3d,m_config.rMinZoom,m_config.rMaxZoom,m_config.nBinsphi3d,m_config.phiMinZoom,m_config.phiMaxZoom);
-
-      h_rz_vol  ->SetXTitle(xtitle);
-      h_rz_norm ->SetXTitle(xtitle);
-      h_rz_vol  ->SetYTitle("r [cm]");
-      h_rz_norm ->SetYTitle("r [cm]");
-      std::string hname("Volume fraction of ");
-      hname += m_config.material;
-      h_rz_vol  ->SetZTitle(hname.data());
-      h_rz_norm ->SetZTitle("Volume norm");
-
-      h_full_rz_vol  ->SetXTitle(xtitle);
-      h_full_rz_norm ->SetXTitle(xtitle);
-      h_full_rz_vol  ->SetYTitle("r [cm]");
-      h_full_rz_norm ->SetYTitle("r [cm]");
-      h_full_rz_vol  ->SetZTitle(hname.data());
-      h_full_rz_norm ->SetZTitle("Volume norm");
-
-      h_3d_vol  ->SetXTitle(xtitle);
-      h_3d_norm ->SetXTitle(xtitle);
-      h_3d_vol  ->SetYTitle("r [cm]");
-      h_3d_norm ->SetYTitle("r [cm]");
-      h_3d_vol  ->SetZTitle("#phi [#circ]");
-      h_3d_norm ->SetZTitle("#phi [#circ]");
-      h_3d_vol  ->SetTitle(hname.data());
-      h_3d_norm ->SetTitle("Volume norm");
-    }
 
     // normalize to volume element per bin
-    for(int i=0;i<h_rz_tid->GetNbinsX();i++) { 
-      for(int j=0;j<h_rz_tid->GetNbinsY();j++) { 
-	int iBin = h_rz_tid->GetBin(i+1,j+1); 
-	int vBin = m_config.nBinsr*i+j;
-	double r0=h_rz_tid->GetYaxis()->GetBinLowEdge(j+1);
-	double r1=h_rz_tid->GetYaxis()->GetBinUpEdge(j+1);
-	double z0=h_rz_tid->GetXaxis()->GetBinLowEdge(i+1);
-	double z1=h_rz_tid->GetXaxis()->GetBinUpEdge(i+1); 
+    for(int i=0;i<h_rz_tid_time->GetNbinsX();i++) { 
+      for(int j=0;j<h_rz_tid_time->GetNbinsY();j++) { 
+	double r0=h_rz_tid_time->GetYaxis()->GetBinLowEdge(j+1);
+	double r1=h_rz_tid_time->GetYaxis()->GetBinUpEdge(j+1);
+	double z0=h_rz_tid_time->GetXaxis()->GetBinLowEdge(i+1);
+	double z1=h_rz_tid_time->GetXaxis()->GetBinUpEdge(i+1); 
 	double vol=(z1-z0)*M_PI*(r1*r1-r0*r0);
 	// if |z| instead of z double the volume
 	if ( m_config.zMinFull >= 0 ) vol *= 2; 
 	// if positive y hemisphere is used only -- half the volume
 	if ( m_config.posYOnly ) vol *= 0.5; 
 	double val;
-	// TID
-	val =maps.m_rz_tid[vBin];
-	h_rz_tid->SetBinContent(iBin,val/vol);
-	// EION
-	val =maps.m_rz_eion[vBin];
-	h_rz_eion->SetBinContent(iBin,val/vol);
-	// NIEL
-	val =maps.m_rz_niel[vBin];
-	h_rz_niel->SetBinContent(iBin,val/vol);
-	// SEE
-	val =maps.m_rz_h20[vBin];
-	h_rz_h20->SetBinContent(iBin,val/vol);
-	// NEUT
-	val =maps.m_rz_neut[vBin];
-	h_rz_neut->SetBinContent(iBin,val/vol);
-	// 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);
-	}
 	// Time dependent TID maps
 	for(int k=0;k<h_rz_tid_time->GetNbinsZ();k++) { 
 	  int kBin = h_rz_tid_time->GetBin(i+1,j+1,k+1); 
@@ -553,90 +613,39 @@ namespace G4UA{
 	  val =maps.m_rz_element[vBinElem];
 	  h_rz_element->SetBinContent(kBin,val/vol);
 	}
-	if (!m_config.material.empty()) {
-	  // need volume fraction only if particular material is selected
-	  // VOL
-	  val =maps.m_rz_vol[vBin];
-	  h_rz_vol->SetBinContent(iBin,val/vol);
-	  // NORM
-	  val =maps.m_rz_norm[vBin];
-	  h_rz_norm->SetBinContent(iBin,val/vol);
-	}
       }
     }
-    h_rz_tid->Write();
-    h_rz_eion->Write();
-    h_rz_niel->Write();
-    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();
+
     h_rz_tid_time->Write();
+    h_rz_tid_time->Delete();
     h_rz_element->Write();
+    h_rz_element->Delete();
     
+    // time dependent TID maps full
+    TH3D * h_full_rz_tid_time  = new TH3D("full_rz_tid_time" ,"full_rz_tid_time" ,m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,m_config.nBinslogT,m_config.logTMin,m_config.logTMax);
+    h_full_rz_tid_time->SetXTitle(xtitle);
+    h_full_rz_tid_time->SetYTitle("r [cm]");
+    h_full_rz_tid_time->SetZTitle("log_{10}(t_{cut}/s)");
+
+    // element mass fraction maps full
+    TH3D * h_full_rz_element  = new TH3D("full_rz_element" ,"full_rz_element" ,m_config.nBinsz,m_config.zMinFull,m_config.zMaxFull,m_config.nBinsr,m_config.rMinFull,m_config.rMaxFull,m_config.elemZMax-m_config.elemZMin+1,m_config.elemZMin-0.5,m_config.elemZMax+0.5);
+    h_full_rz_element->SetXTitle(xtitle);
+    h_full_rz_element->SetYTitle("r [cm]");
+    h_full_rz_element->SetZTitle("Z");
+
     // 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++) { 
-	int iBin = h_full_rz_tid->GetBin(i+1,j+1); 
-	int vBin = m_config.nBinsr*i+j;
-	double r0=h_full_rz_tid->GetYaxis()->GetBinLowEdge(j+1);
-	double r1=h_full_rz_tid->GetYaxis()->GetBinUpEdge(j+1);
-	double z0=h_full_rz_tid->GetXaxis()->GetBinLowEdge(i+1);
-	double z1=h_full_rz_tid->GetXaxis()->GetBinUpEdge(i+1); 
+    for(int i=0;i<h_full_rz_tid_time->GetNbinsX();i++) { 
+      for(int j=0;j<h_full_rz_tid_time->GetNbinsY();j++) { 
+	double r0=h_full_rz_tid_time->GetYaxis()->GetBinLowEdge(j+1);
+	double r1=h_full_rz_tid_time->GetYaxis()->GetBinUpEdge(j+1);
+	double z0=h_full_rz_tid_time->GetXaxis()->GetBinLowEdge(i+1);
+	double z1=h_full_rz_tid_time->GetXaxis()->GetBinUpEdge(i+1); 
 	double vol=(z1-z0)*M_PI*(r1*r1-r0*r0); 
 	// if |z| instead of z double the volume
 	if ( m_config.zMinFull >= 0 ) vol *= 2; 
 	// if positive y hemisphere is used only -- half the volume
 	if ( m_config.posYOnly ) vol *= 0.5; 
 	double val;
-	// TID
-	val =maps.m_full_rz_tid[vBin];
-	h_full_rz_tid->SetBinContent(iBin,val/vol);
-	// EION
-	val =maps.m_full_rz_eion[vBin];
-	h_full_rz_eion->SetBinContent(iBin,val/vol);
-	// NIEL
-	val =maps.m_full_rz_niel[vBin];
-	h_full_rz_niel->SetBinContent(iBin,val/vol);
-	// SEE
-	val =maps.m_full_rz_h20[vBin];
-	h_full_rz_h20->SetBinContent(iBin,val/vol);
-	// NEUT
-	val =maps.m_full_rz_neut[vBin];
-	h_full_rz_neut->SetBinContent(iBin,val/vol);
-	// 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);
-	}
 	// Time dependent TID maps
 	for(int k=0;k<h_full_rz_tid_time->GetNbinsZ();k++) { 
 	  int kBin = h_full_rz_tid_time->GetBin(i+1,j+1,k+1); 
@@ -651,103 +660,12 @@ namespace G4UA{
 	  val =maps.m_full_rz_element[vBinElem];
 	  h_full_rz_element->SetBinContent(kBin,val/vol);
 	}
-	if (!m_config.material.empty()) {
-	  // need volume fraction only if particular material is selected
-	  // VOL
-	  val =maps.m_full_rz_vol[vBin];
-	  h_full_rz_vol->SetBinContent(iBin,val/vol);
-	  // NORM
-	  val =maps.m_full_rz_norm[vBin];
-	  h_full_rz_norm->SetBinContent(iBin,val/vol);
-	}
       }
     }
-    h_full_rz_tid->Write();
-    h_full_rz_eion->Write();
-    h_full_rz_niel->Write();
-    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();
     h_full_rz_tid_time->Write();
+    h_full_rz_tid_time->Delete();
     h_full_rz_element->Write();
-
-    // normalize to volume element per bin
-    for(int i=0;i<h_3d_tid->GetNbinsX();i++) { /* |z| */
-      for(int j=0;j<h_3d_tid->GetNbinsY();j++) { /* r */
-	for(int k=0;k<h_3d_tid->GetNbinsZ();k++) { /* phi */
-	  int vBin = m_config.nBinsr3d*m_config.nBinsphi3d*i+m_config.nBinsphi3d*j+k;
-	  int iBin = h_3d_tid->GetBin(i+1,j+1,k+1); 
-	  double phi0=h_3d_tid->GetZaxis()->GetBinLowEdge(k+1);
-	  double phi1=h_3d_tid->GetZaxis()->GetBinUpEdge(k+1);
-	  double r0=h_3d_tid->GetYaxis()->GetBinLowEdge(j+1);
-	  double r1=h_3d_tid->GetYaxis()->GetBinUpEdge(j+1);
-	  double z0=h_3d_tid->GetXaxis()->GetBinLowEdge(i+1);
-	  double z1=h_3d_tid->GetXaxis()->GetBinUpEdge(i+1); 
-	  double vol=(z1-z0)*M_PI*(r1*r1-r0*r0)*(phi1-phi0)/360.; 
-	  // if |z| instead of z double the volume
-	  if ( m_config.zMinFull >= 0 ) vol *= 2; 
-	  // assume that phi-range corresponds to full 360 degrees in case 
-	  // lower phi boundary is 0 - i.e. all phi-segments mapped to first
-	  if ( m_config.phiMinZoom == 0 ) {
-	    vol *= 360./m_config.phiMaxZoom;
-	    // if positive y hemisphere is used only -- half the volume
-	    if ( m_config.posYOnly ) 
-	      vol *= 0.5; 
-	  }
-	  double val;
-	  // TID
-	  val =maps.m_3d_tid[vBin];
-	  h_3d_tid->SetBinContent(iBin,val/vol);
-	  // EION
-	  val =maps.m_3d_eion[vBin];
-	  h_3d_eion->SetBinContent(iBin,val/vol);
-	  // NIEL
-	  val =maps.m_3d_niel[vBin];
-	  h_3d_niel->SetBinContent(iBin,val/vol);
-	  // SEE
-	  val =maps.m_3d_h20[vBin];
-	  h_3d_h20->SetBinContent(iBin,val/vol);
-	  // NEUT
-	  val =maps.m_3d_neut[vBin];
-	  h_3d_neut->SetBinContent(iBin,val/vol);
-	  // CHAD
-	  val =maps.m_3d_chad[vBin];
-	  h_3d_chad->SetBinContent(iBin,val/vol);
-	  if (!m_config.material.empty()) {
-	    // need volume fraction only if particular material is selected
-	    // VOL
-	    val =maps.m_3d_vol[vBin];
-	    h_3d_vol->SetBinContent(iBin,val/vol);
-	    // NORM
-	    val =maps.m_3d_norm[vBin];
-	    h_3d_norm->SetBinContent(iBin,val/vol);
-	  }
-	}
-      }
-    }
-    h_3d_tid->Write();
-    h_3d_eion->Write();
-    h_3d_niel->Write();
-    h_3d_h20->Write();
-    h_3d_neut->Write();
-    h_3d_chad->Write();
-
-    if (!m_config.material.empty()) {
-      // need volume fraction only if particular material is selected
-      h_rz_vol->Write();
-      h_rz_norm->Write();
-      h_full_rz_vol->Write();
-      h_full_rz_norm->Write();
-      h_3d_vol->Write();
-      h_3d_norm->Write();
-    }
+    h_full_rz_element->Delete();
 
     f->Close();
 
diff --git a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.h b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.h
index 6313fafd75a..8d0cb87f4d2 100644
--- a/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.h
+++ b/Simulation/G4Utilities/G4UserActions/src/RadiationMapsMakerTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef G4USERACTIONS_G4UA__RADIATIONMAPSMAKERTOOL_H 
-- 
GitLab