From 88a2bc9961d5840dcf871f8ec3a88e3eb21a45f6 Mon Sep 17 00:00:00 2001
From: matta <matta@npt>
Date: Tue, 19 Mar 2013 15:36:12 +0000
Subject: [PATCH] * Fixing bug in initial condition * Fixing
 GeometricalEfficiency.C macro to fit new TInitialCondition * Adding support
 for TInitialCondition in Sharc

---
 Inputs/DetectorConfiguration/Sharc.detector   | 28 ++++-----
 Inputs/EventGenerator/proton.source           |  6 +-
 NPAnalysis/macros/GeometricalEfficiency.C     | 30 +++++++---
 .../InitialConditions/TInitialConditions.cxx  | 28 +++++++++
 NPLib/InitialConditions/TInitialConditions.h  | 59 +++++++++++--------
 .../TInteractionCoordinates.h                 | 10 ++--
 NPSimulation/include/Sharc.hh                 |  1 -
 NPSimulation/src/ParticleStack.cc             |  1 +
 NPSimulation/src/Sharc.cc                     | 20 +++++++
 NPSimulation/src/SharcScorers.cc              | 31 +++++++++-
 NPSimulation/vis.mac                          |  2 +-
 11 files changed, 159 insertions(+), 57 deletions(-)

diff --git a/Inputs/DetectorConfiguration/Sharc.detector b/Inputs/DetectorConfiguration/Sharc.detector
index 9c8290941..2ede44d27 100644
--- a/Inputs/DetectorConfiguration/Sharc.detector
+++ b/Inputs/DetectorConfiguration/Sharc.detector
@@ -15,29 +15,29 @@ Sharc
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   %Upstream CD
   SharcQQQ
-    Z= -100
+    Z= -66
     R= 0
     Phi= 0
     ThicknessDector= 100
   SharcQQQ
-    Z= -100
+    Z= -66
     R= 0
     Phi= 90
     ThicknessDector= 100
   SharcQQQ
-    Z= -100
+    Z= -66
     R= 0
     Phi= 180
     ThicknessDector= 100
   SharcQQQ
-    Z= -100
+    Z= -66
     R= 0
     Phi= 270
     ThicknessDector= 100
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %Upstream Box
   SharcBOX
-    Z= -40
+    Z= -30.775
     ThicknessDector1= 100
     ThicknessDector2= 100
     ThicknessDector3= 100
@@ -49,7 +49,7 @@ Sharc
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %Down Stream Box
   SharcBOX
-    Z= 40
+    Z= 34.3
     ThicknessDector1= 100
     ThicknessDector2= 100
     ThicknessDector3= 100
@@ -60,23 +60,23 @@ Sharc
     ThicknessPAD4= 1000
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   %Downstream CD
- SharcQQQ
-    Z= 100
+ %SharcQQQ
+    Z= 66
     R= 0
     Phi= 0
     ThicknessDector= 100
- SharcQQQ
-    Z= 100
+ %SharcQQQ
+    Z= 66
     R= 0
     Phi= 90
     ThicknessDector= 100
-  SharcQQQ
-    Z= 100
+ % SharcQQQ
+    Z= 66
     R= 0
     Phi= 180
     ThicknessDector= 100
-  SharcQQQ
-    Z= 100
+  %SharcQQQ
+    Z= 66
     R= 0
     Phi= 270
     ThicknessDector= 100
diff --git a/Inputs/EventGenerator/proton.source b/Inputs/EventGenerator/proton.source
index ca319dcce..b6a19c47f 100644
--- a/Inputs/EventGenerator/proton.source
+++ b/Inputs/EventGenerator/proton.source
@@ -4,10 +4,10 @@
 %			   Energy are given in MeV , Position in mm				  %	
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 Isotropic
-	EnergyLow=  300	
-	EnergyHigh= 300
+	EnergyLow=  5	
+	EnergyHigh= 5
 	HalfOpenAngleMin= 0
-	HalfOpenAngleMax= 30
+	HalfOpenAngleMax= 180
 	x0= 0	
 	y0= 0	
 	z0= 0	
diff --git a/NPAnalysis/macros/GeometricalEfficiency.C b/NPAnalysis/macros/GeometricalEfficiency.C
index 8c8023369..34d552501 100644
--- a/NPAnalysis/macros/GeometricalEfficiency.C
+++ b/NPAnalysis/macros/GeometricalEfficiency.C
@@ -27,21 +27,23 @@
  *****************************************************************************/
 
 #include <iostream>
+#include <cmath>
 
 #include "TROOT.h"
 #include "TSystem.h"
 #include "TFile.h"
+#include "TF1.h"
 #include "TString.h"
 #include "TTree.h"
 #include "TBranch.h"
 #include "TH1F.h"
+#include "TCanvas.h"
 
 #include "TInitialConditions.h"
 #include "TInteractionCoordinates.h"
 
 using namespace std ;
 
-
 void GeometricalEfficiency(const char * fname = "myResult")
 {
    // Open output ROOT file from NPTool simulation run
@@ -56,11 +58,11 @@ void GeometricalEfficiency(const char * fname = "myResult")
    // TInitialConditions branch
    TInitialConditions *initCond = 0;
    tree->SetBranchAddress("InitialConditions", &initCond);
-   tree->SetBranchStatus("InitialConditions", 1);
+   tree->SetBranchStatus("InitialConditions", true);
    // TInteractionCoordinates branch
    TInteractionCoordinates *interCoord = 0;
    tree->SetBranchAddress("InteractionCoordinates", &interCoord);
-   tree->SetBranchStatus("InteractionCoordinates", 1);
+   tree->SetBranchStatus("InteractionCoordinates", true);
 
    // Prepare histograms
    TH1F *hDetecTheta = new TH1F("hDetecTheta", "DetecTheta", 180, 0, 180);
@@ -73,13 +75,13 @@ void GeometricalEfficiency(const char * fname = "myResult")
       //if (i%1000 == 0) cout << "Entry " << i << endl;
       tree->GetEntry(i);
       // Fill histos
-      hEmittTheta->Fill(initCond->GetICEmittedAngleThetaLabWorldFrame(0));
+     hEmittTheta->Fill(initCond->GetThetaLab_WorldFrame(0));
+          
       if (interCoord->GetDetectedMultiplicity() > 0)
          hDetecTheta->Fill(interCoord->GetDetectedAngleTheta(0));
    }
 
-   TCanvas *c1 = new TCanvas("c1", "c1");
-   c1->Draw();
+   TCanvas* c1 = new TCanvas("c1", "c1");
    // Compute relative efficiency in %
    TH1F *efficiency = new TH1F("hEfficiency", "Efficiency", 180, 0, 180);
 //   efficiency->SetTitle("Efficiency GASPARD (Spheric version);#Theta [deg];#epsilon [%]");
@@ -89,9 +91,21 @@ void GeometricalEfficiency(const char * fname = "myResult")
    efficiency->Draw();
 
 
-   TCanvas *c2 = new TCanvas("c2", "c2");
-   c2->Draw();
+   TCanvas* c2 = new TCanvas("c2", "c2");
    hEmittTheta->Draw();
    hDetecTheta->SetLineColor(kRed);
    hDetecTheta->Draw("same");
+  
+  TCanvas* c3 = new TCanvas("c3", "c3");
+  TH1F* SolidA = new TH1F(*hDetecTheta);
+  SolidA->Sumw2();
+  TF1* C = new TF1("C",Form("%i /(4*%f)",nentries,M_PI),0,180);
+  SolidA->Divide(C,1);
+  SolidA->Rebin(2);
+  SolidA->Draw();
+  TF1* f = new TF1("f",Form("2 * %f * sin(x*%f/180.) *2*%f/180.",M_PI,M_PI,M_PI),0,180);
+  f->Draw("SAME");
+  SolidA->GetXaxis()->SetTitle("#theta_{Lab} (deg)");
+  SolidA->GetYaxis()->SetTitle("d#Omega (sr) ");
+  c3->Update();
 }
diff --git a/NPLib/InitialConditions/TInitialConditions.cxx b/NPLib/InitialConditions/TInitialConditions.cxx
index 926ca611a..8baf85729 100644
--- a/NPLib/InitialConditions/TInitialConditions.cxx
+++ b/NPLib/InitialConditions/TInitialConditions.cxx
@@ -98,3 +98,31 @@ void TInitialConditions::Dump() const{
   
   
 }
+
+
+TVector3 TInitialConditions::GetBeamDirection() const{
+  return TVector3( sin(fIC_Incident_Emittance_ThetaX),
+                   sin(fIC_Incident_Emittance_PhiY),
+                   cos(fIC_Incident_Emittance_ThetaX) + cos(fIC_Incident_Emittance_PhiY));
+}
+
+TVector3 TInitialConditions::GetParticleDirection (const int &i) const {
+  return TVector3(  fIC_Momentum_Direction_X[i],
+                    fIC_Momentum_Direction_Y[i],
+                    fIC_Momentum_Direction_Z[i]);
+}
+
+
+double TInitialConditions::GetThetaLab_WorldFrame (const int &i) const {
+  return (GetParticleDirection(i).Angle(TVector3(0,0,1)))/deg;
+  
+}
+
+
+
+
+double TInitialConditions::GetThetaLab_IncidentFrame (const int &i) const{
+  return (GetParticleDirection(i).Angle(GetBeamDirection()))/deg;
+}
+
+
diff --git a/NPLib/InitialConditions/TInitialConditions.h b/NPLib/InitialConditions/TInitialConditions.h
index 3e2efd4d9..2e4eb9cd0 100644
--- a/NPLib/InitialConditions/TInitialConditions.h
+++ b/NPLib/InitialConditions/TInitialConditions.h
@@ -30,11 +30,19 @@
 // STL Header
 #include <vector>
 #include <string>
-
+#include <cmath>
 using namespace std ;
 
 // Root Header
 #include "TObject.h"
+#include "TVector3.h"
+
+// NPTOOL headers
+#include "../include/NPGlobalSystemOfUnits.h"
+#include "../include/NPPhysicalConstants.h"
+#ifdef NP_SYSTEM_OF_UNITS_H
+using namespace NPUNITS;
+#endif
 
 class TInitialConditions : public TObject{
 private:
@@ -69,29 +77,29 @@ public:
   
   /////////////////////           GetTERS           ////////////////////////
   // Incident beam parameter
-  void SetIncidentParticleName   (string Incident_Particle_Name)   {fIC_Incident_Particle_Name = Incident_Particle_Name;}
-  void SetIncidentInitialKineticEnergy  (double Incident_Initial_Kinetic_Energy)
+  void SetIncidentParticleName   (const string &Incident_Particle_Name)   {fIC_Incident_Particle_Name = Incident_Particle_Name;}
+  void SetIncidentInitialKineticEnergy  (const double &Incident_Initial_Kinetic_Energy)
     {fIC_Incident_Initial_Kinetic_Energy  = Incident_Initial_Kinetic_Energy;}
-  void SetIncidentFinalKineticEnergy  (double Incident_Final_Kinetic_Energy)
+  void SetIncidentFinalKineticEnergy  (const double &Incident_Final_Kinetic_Energy)
     {fIC_Incident_Final_Kinetic_Energy  = Incident_Final_Kinetic_Energy;}
 
-  void SetIncidentEmittanceTheta (double Incident_Emittance_Theta) {fIC_Incident_Emittance_Theta = Incident_Emittance_Theta;}
-  void SetIncidentEmittancePhi   (double Incident_Emittance_Phi)   {fIC_Incident_Emittance_Phi   = Incident_Emittance_Phi;}
-  void SetIncidentEmittanceThetaX (double Incident_Emittance_ThetaX) {fIC_Incident_Emittance_ThetaX = Incident_Emittance_ThetaX;}
-  void SetIncidentEmittancePhiY   (double Incident_Emittance_PhiY)   {fIC_Incident_Emittance_PhiY   = Incident_Emittance_PhiY;}
+  void SetIncidentEmittanceTheta (const double &Incident_Emittance_Theta) {fIC_Incident_Emittance_Theta = Incident_Emittance_Theta;}
+  void SetIncidentEmittancePhi   (const double &Incident_Emittance_Phi)   {fIC_Incident_Emittance_Phi   = Incident_Emittance_Phi;}
+  void SetIncidentEmittanceThetaX (const double &Incident_Emittance_ThetaX) {fIC_Incident_Emittance_ThetaX = Incident_Emittance_ThetaX;}
+  void SetIncidentEmittancePhiY   (const double &Incident_Emittance_PhiY)   {fIC_Incident_Emittance_PhiY   = Incident_Emittance_PhiY;}
   
   // Beam status at the initial interaction point
-  void SetIncidentPositionX     (double Incident_Position_X)      {fIC_Incident_Position_X     = Incident_Position_X;}
-  void SetIncidentPositionY     (double Incident_Position_Y)      {fIC_Incident_Position_Y     = Incident_Position_Y;}
-  void SetIncidentPositionZ     (double Incident_Position_Z)      {fIC_Incident_Position_Z     = Incident_Position_Z;}
+  void SetIncidentPositionX     (const double &Incident_Position_X)      {fIC_Incident_Position_X     = Incident_Position_X;}
+  void SetIncidentPositionY     (const double &Incident_Position_Y)      {fIC_Incident_Position_Y     = Incident_Position_Y;}
+  void SetIncidentPositionZ     (const double &Incident_Position_Z)      {fIC_Incident_Position_Z     = Incident_Position_Z;}
   
   // emmitted particle
-  void SetParticleName       (string Particle_Name)         {fIC_Particle_Name.push_back(Particle_Name);}
-  void SetThetaCM            (double ThetaCM)               {fIC_ThetaCM.push_back(ThetaCM);}
-  void SetKineticEnergy      (double Kinetic_Energy)        {fIC_Kinetic_Energy.push_back(Kinetic_Energy);}
-  void SetMomentumDirectionX (double Momentum_Direction_X)  {fIC_Momentum_Direction_X.push_back(Momentum_Direction_X);}
-  void SetMomentumDirectionY (double Momentum_Direction_Y)  {fIC_Momentum_Direction_Y.push_back(Momentum_Direction_Y);}
-  void SetMomentumDirectionZ (double Momentum_Direction_Z)  {fIC_Momentum_Direction_Z.push_back(Momentum_Direction_Z);}
+  void SetParticleName       (const string &Particle_Name)         {fIC_Particle_Name.push_back(Particle_Name);}
+  void SetThetaCM            (const double &ThetaCM)               {fIC_ThetaCM.push_back(ThetaCM);}
+  void SetKineticEnergy      (const double &Kinetic_Energy)        {fIC_Kinetic_Energy.push_back(Kinetic_Energy);}
+  void SetMomentumDirectionX (const double &Momentum_Direction_X)  {fIC_Momentum_Direction_X.push_back(Momentum_Direction_X);}
+  void SetMomentumDirectionY (const double &Momentum_Direction_Y)  {fIC_Momentum_Direction_Y.push_back(Momentum_Direction_Y);}
+  void SetMomentumDirectionZ (const double &Momentum_Direction_Z)  {fIC_Momentum_Direction_Z.push_back(Momentum_Direction_Z);}
   
   /////////////////////           GETTERS           ////////////////////////
   // Incident beam parameter
@@ -107,12 +115,17 @@ public:
   double GetIncidentPositionZ     () const {return fIC_Incident_Position_Z     ;}
   
   // emmitted particle
-  string GetParticleName        (int i) const {return fIC_Particle_Name[i];}
-  double GetThetaCM             (int i) const {return fIC_ThetaCM[i];}
-  double GetKineticEnergy       (int i) const {return fIC_Kinetic_Energy[i];}
-  double GetMomentumDirectionX  (int i) const {return fIC_Momentum_Direction_X[i];}
-  double GetMomentumDirectionY  (int i) const {return fIC_Momentum_Direction_Y[i];}
-  double GetMomentumDirectionZ  (int i) const {return fIC_Momentum_Direction_Z[i];}
+  string GetParticleName        (const int &i) const {return fIC_Particle_Name[i];}
+  double GetThetaCM             (const int &i) const {return fIC_ThetaCM[i];}
+  double GetKineticEnergy       (const int &i) const {return fIC_Kinetic_Energy[i];}
+  double GetMomentumDirectionX  (const int &i) const {return fIC_Momentum_Direction_X[i];}
+  double GetMomentumDirectionY  (const int &i) const {return fIC_Momentum_Direction_Y[i];}
+  double GetMomentumDirectionZ  (const int &i) const {return fIC_Momentum_Direction_Z[i];}
+  
+  TVector3 GetBeamDirection         () const ;
+  TVector3 GetParticleDirection     (const int &i) const ;
+  double GetThetaLab_WorldFrame     (const int &i) const ;
+  double GetThetaLab_IncidentFrame  (const int &i) const ;
   
   unsigned int GetEmittedMult() const {return fIC_Particle_Name.size();}
   
diff --git a/NPLib/InteractionCoordinates/TInteractionCoordinates.h b/NPLib/InteractionCoordinates/TInteractionCoordinates.h
index 051fa8c17..ec2d303e3 100644
--- a/NPLib/InteractionCoordinates/TInteractionCoordinates.h
+++ b/NPLib/InteractionCoordinates/TInteractionCoordinates.h
@@ -70,12 +70,12 @@ public:
    Int_t    GetDetectedMultiplicity()      {return fDetected_Position_X.size();}
    // Incident particle properties (before interactions in the target)
    // Vertex of interaction
-   Double_t GetDetectedPositionX(Int_t i)   {return fDetected_Position_X.at(i);}
-   Double_t GetDetectedPositionY(Int_t i)   {return fDetected_Position_Y.at(i);}
-   Double_t GetDetectedPositionZ(Int_t i)   {return fDetected_Position_Z.at(i);}
+   Double_t GetDetectedPositionX(Int_t i)   {return fDetected_Position_X[i];}
+   Double_t GetDetectedPositionY(Int_t i)   {return fDetected_Position_Y[i];}
+   Double_t GetDetectedPositionZ(Int_t i)   {return fDetected_Position_Z[i];}
    // Incident particle angles
-   Double_t GetDetectedAngleTheta(Int_t i) {return fDetected_Angle_Theta.at(i);}
-   Double_t GetDetectedAnglePhi(Int_t i)   {return fDetected_Angle_Phi.at(i);}
+   Double_t GetDetectedAngleTheta(Int_t i) {return fDetected_Angle_Theta[i];}
+   Double_t GetDetectedAnglePhi(Int_t i)   {return fDetected_Angle_Phi[i];}
    
    ClassDef(TInteractionCoordinates, 1) // InteractionCoordinates structure
 };
diff --git a/NPSimulation/include/Sharc.hh b/NPSimulation/include/Sharc.hh
index 5dbf7f4dc..8a8fafe3b 100644
--- a/NPSimulation/include/Sharc.hh
+++ b/NPSimulation/include/Sharc.hh
@@ -194,7 +194,6 @@ private:
   G4MultiFunctionalDetector*   m_BOXScorer ;
   G4MultiFunctionalDetector*   m_PADScorer ;
   G4MultiFunctionalDetector*   m_QQQScorer ;
-
   
 private:
   //    Initialize material used in detector definition
diff --git a/NPSimulation/src/ParticleStack.cc b/NPSimulation/src/ParticleStack.cc
index 5c4eb7617..61ec26be6 100644
--- a/NPSimulation/src/ParticleStack.cc
+++ b/NPSimulation/src/ParticleStack.cc
@@ -211,6 +211,7 @@ string ParticleStack::ChangeNameToG4Standard(string OriginalName){
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void ParticleStack::ShootAllParticle(G4Event* anEvent){
   unsigned int size = m_ParticleStack.size();
+  m_InitialConditions->Clear();
   
   for(unsigned int i = 0 ; i < size ; i++){
     
diff --git a/NPSimulation/src/Sharc.cc b/NPSimulation/src/Sharc.cc
index 3a6c6e9bd..c1d34f433 100644
--- a/NPSimulation/src/Sharc.cc
+++ b/NPSimulation/src/Sharc.cc
@@ -661,6 +661,15 @@ void Sharc::ReadSensitive(const G4Event* event){
     m_Event->SetBack_Energy(RandGauss::shoot(Energy, ResoEnergy));
     m_Event->SetBack_TimeCFD(RandGauss::shoot(Time, ResoTime));
     m_Event->SetBack_TimeLED(RandGauss::shoot(Time, ResoTime));
+    
+    
+    // Interraction Coordinates
+    ms_InterCoord->SetDetectedPositionX(Info[5]) ;
+    ms_InterCoord->SetDetectedPositionY(Info[6]) ;
+    ms_InterCoord->SetDetectedPositionZ(Info[7]) ;
+    ms_InterCoord->SetDetectedAngleTheta(Info[8]/deg) ;
+    ms_InterCoord->SetDetectedAnglePhi(Info[9]/deg) ;
+    
   }
   
   // clear map for next event
@@ -687,6 +696,7 @@ void Sharc::ReadSensitive(const G4Event* event){
     m_Event->SetPAD_Energy(RandGauss::shoot(Energy, ResoEnergy));
     m_Event->SetPAD_TimeCFD(RandGauss::shoot(Time, ResoTime));
     m_Event->SetPAD_TimeLED(RandGauss::shoot(Time, ResoTime));
+
   }
   
   // clear map for next event
@@ -722,6 +732,14 @@ void Sharc::ReadSensitive(const G4Event* event){
     m_Event->SetBack_Energy(RandGauss::shoot(Energy, ResoEnergy));
     m_Event->SetBack_TimeCFD(RandGauss::shoot(Time, ResoTime));
     m_Event->SetBack_TimeLED(RandGauss::shoot(Time, ResoTime));
+    
+    // Interraction Coordinates
+    ms_InterCoord->SetDetectedPositionX(Info[5]) ;
+    ms_InterCoord->SetDetectedPositionY(Info[6]) ;
+    ms_InterCoord->SetDetectedPositionZ(Info[7]) ;
+    ms_InterCoord->SetDetectedAngleTheta(Info[8]/deg) ;
+    ms_InterCoord->SetDetectedAnglePhi(Info[9]/deg) ;
+    
   }
   
   // clear map for next event
@@ -762,6 +780,8 @@ void Sharc::InitializeScorers(){
                                  QQQ_Wafer_NumberOf_AnnularStrip,
                                  EnergyThreshold);
   
+  
+  
   //and register it to the multifunctionnal detector
   m_BOXScorer->RegisterPrimitive(BOXScorer);
   m_PADScorer->RegisterPrimitive(PADScorer);
diff --git a/NPSimulation/src/SharcScorers.cc b/NPSimulation/src/SharcScorers.cc
index 51c08da2f..8cda2113c 100644
--- a/NPSimulation/src/SharcScorers.cc
+++ b/NPSimulation/src/SharcScorers.cc
@@ -48,7 +48,7 @@ PS_Silicon_Rectangle::~PS_Silicon_Rectangle(){
 G4bool PS_Silicon_Rectangle::ProcessHits(G4Step* aStep, G4TouchableHistory*){
 
   // contain Energy Time, DetNbr, StripFront and StripBack
-  G4double* EnergyAndTime = new G4double[5];
+  G4double* EnergyAndTime = new G4double[10];
   EnergyAndTime[0] = aStep->GetTotalEnergyDeposit();
   
   // If the energy deposit is below the threshold, the deposit is ignored
@@ -61,6 +61,14 @@ G4bool PS_Silicon_Rectangle::ProcessHits(G4Step* aStep, G4TouchableHistory*){
   
   m_DetectorNumber = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(0);
   m_Position  = aStep->GetPreStepPoint()->GetPosition();
+  
+  // Interaction coordinates (used to fill the InteractionCoordinates branch)
+  EnergyAndTime[5] = m_Position.x();
+  EnergyAndTime[6] = m_Position.y();
+  EnergyAndTime[7] = m_Position.z();
+  EnergyAndTime[8] = m_Position.theta();
+  EnergyAndTime[9] = m_Position.phi();
+  
   m_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(m_Position);
   
   m_StripLengthNumber = (int)((m_Position.x() + m_StripPlaneLength / 2.) / m_StripPitchLength ) + 1  ;
@@ -70,6 +78,7 @@ G4bool PS_Silicon_Rectangle::ProcessHits(G4Step* aStep, G4TouchableHistory*){
   EnergyAndTime[3] = m_StripLengthNumber;
   EnergyAndTime[4] = m_StripWidthNumber;
   
+    
   //Rare case where particle is close to edge of silicon plan
   if (m_StripLengthNumber == m_NumberOfStripLength+1) m_StripLengthNumber = m_StripLengthNumber;
   if (m_StripWidthNumber == m_NumberOfStripWidth+1) m_StripWidthNumber = m_StripWidthNumber;
@@ -94,6 +103,11 @@ void PS_Silicon_Rectangle::EndOfEvent(G4HCofThisEvent*){
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void PS_Silicon_Rectangle::clear(){
+  std::map<G4int, G4double**>::iterator    MapIterator;
+  for (MapIterator = EvtMap->GetMap()->begin() ; MapIterator != EvtMap->GetMap()->end() ; MapIterator++){
+    delete *(MapIterator->second);
+  }
+  
   EvtMap->clear();
 }
 
@@ -139,7 +153,7 @@ PS_Silicon_Annular::~PS_Silicon_Annular(){
 G4bool PS_Silicon_Annular::ProcessHits(G4Step* aStep, G4TouchableHistory*){
   
   // contain Energy Time, DetNbr, StripFront and StripBack
-  G4double* EnergyAndTime = new G4double[5];
+  G4double* EnergyAndTime = new G4double[10];
   EnergyAndTime[0] = aStep->GetTotalEnergyDeposit();
   
   // If the energy deposit is below the threshold, the deposit is ignored
@@ -152,6 +166,14 @@ G4bool PS_Silicon_Annular::ProcessHits(G4Step* aStep, G4TouchableHistory*){
   
   m_DetectorNumber = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(0);
   m_Position = aStep->GetPreStepPoint()->GetPosition();
+  
+  // Interaction coordinates (used to fill the InteractionCoordinates branch)
+  EnergyAndTime[5] = m_Position.x();
+  EnergyAndTime[6] = m_Position.y();
+  EnergyAndTime[7] = m_Position.z();
+  EnergyAndTime[8] = m_Position.theta();
+  EnergyAndTime[9] = m_Position.phi();
+  
   m_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(m_Position);
   
   m_StripRadialNumber = (int)((m_Position.angle(m_uz) - m_DeltaTheta*0.5) / m_StripPitchRadial ) + 1  ;
@@ -185,6 +207,11 @@ void PS_Silicon_Annular::EndOfEvent(G4HCofThisEvent*){
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void PS_Silicon_Annular::clear(){
+  std::map<G4int, G4double**>::iterator    MapIterator;
+  for (MapIterator = EvtMap->GetMap()->begin() ; MapIterator != EvtMap->GetMap()->end() ; MapIterator++){
+    delete *(MapIterator->second);
+  }
+  
   EvtMap->clear();
 }
 
diff --git a/NPSimulation/vis.mac b/NPSimulation/vis.mac
index d0df3eacf..96d2fc4a6 100644
--- a/NPSimulation/vis.mac
+++ b/NPSimulation/vis.mac
@@ -67,7 +67,7 @@
 #/vis/modeling/trajectories/drawByParticleID-0/set e- blue
 #
 # To superimpose all of the events from a given run:
-/vis/scene/endOfEventAction accumulate
+#/vis/scene/endOfEventAction accumulate
 #
 # Re-establish auto refreshing and verbosity:
 /vis/viewer/set/autoRefresh true
-- 
GitLab