From fccce220bb3e593055966d193a7fd1498a0c53e1 Mon Sep 17 00:00:00 2001
From: adrien matta <matta@lpccaen.in2p3.fr>
Date: Fri, 3 Feb 2017 10:11:13 +0100
Subject: [PATCH] * Adding new Silicon Scorer based on png images to set the
 strip number         - allow arbitrary geometry         - can be used to
 simulate interstrip and dead layer         - Use a base class NPImage to
 manage the image information         - switch must2 to new scorers         -
 fix must2 limitation to event with less particle than           telescope
 (issue #17)

---
 Examples/Example1/ShowResults.C               |   2 +-
 Inputs/EventGenerator/alpha.source            |   6 +-
 NPLib/Core/CMakeLists.txt                     |   4 +-
 NPLib/Core/NPImage.cxx                        | 159 ++++
 NPLib/Core/NPImage.h                          |  71 ++
 NPLib/Detectors/Chio/TChio_digPhysics.cxx     |   7 +-
 NPLib/Detectors/MUST2/ressources/Mask.cxx     |  58 ++
 NPLib/Detectors/MUST2/ressources/maskBack.png | Bin 0 -> 320612 bytes
 .../Detectors/MUST2/ressources/maskFront.png  | Bin 0 -> 325078 bytes
 NPLib/ressources/CMake/Root.cmake             |   2 +-
 NPSimulation/Detectors/MUST2/MUST2Array.cc    | 709 +++++++-----------
 NPSimulation/Detectors/MUST2/MUST2Array.hh    |   2 +-
 NPSimulation/Scorers/CalorimeterScorers.cc    |   1 -
 NPSimulation/Scorers/SiliconScorers.cc        | 154 +++-
 NPSimulation/Scorers/SiliconScorers.hh        | 316 +++++---
 15 files changed, 926 insertions(+), 565 deletions(-)
 create mode 100644 NPLib/Core/NPImage.cxx
 create mode 100644 NPLib/Core/NPImage.h
 create mode 100644 NPLib/Detectors/MUST2/ressources/Mask.cxx
 create mode 100644 NPLib/Detectors/MUST2/ressources/maskBack.png
 create mode 100644 NPLib/Detectors/MUST2/ressources/maskFront.png

diff --git a/Examples/Example1/ShowResults.C b/Examples/Example1/ShowResults.C
index 6c2d5867b..4a6f99d23 100644
--- a/Examples/Example1/ShowResults.C
+++ b/Examples/Example1/ShowResults.C
@@ -42,7 +42,7 @@ ETOF->Draw("same");
 // Kinematical Line //
 c1->cd(3);
 //chain->Draw("ELab:ThetaLab>>hKine(500,0,45,400,0,40)","MUST2.CsI_E<0 && MUST2.TelescopeNumber<5 && EDE && ETOF","colz");
-chain->Draw("ELab:ThetaLab","MUST2.CsI_E<0 && MUST2.TelescopeNumber<5 && EDE && ETOF","colz");
+chain->Draw("ELab:ThetaLab>>h(1000,0,90,1000,0,30)","MUST2.CsI_E<0 && MUST2.TelescopeNumber<5 && EDE && ETOF","colz");
 
 NPL::Reaction r("11Li(d,3He)10He@553");
 r.SetExcitationHeavy(1.4);
diff --git a/Inputs/EventGenerator/alpha.source b/Inputs/EventGenerator/alpha.source
index e7453e142..6cb81d282 100644
--- a/Inputs/EventGenerator/alpha.source
+++ b/Inputs/EventGenerator/alpha.source
@@ -4,10 +4,10 @@
 %      Energy are given in MeV , Position in mm      % 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 Isotropic
- EnergyLow= 0 MeV
- EnergyHigh= 850 MeV
+ EnergyLow= 30 MeV
+ EnergyHigh= 30 MeV
  HalfOpenAngleMin= 0 deg
- HalfOpenAngleMax= 10 deg
+ HalfOpenAngleMax= 180 deg
  x0= 0 mm
  y0= 0 mm
  z0= 0 mm
diff --git a/NPLib/Core/CMakeLists.txt b/NPLib/Core/CMakeLists.txt
index e5ef4df37..fc38abc16 100644
--- a/NPLib/Core/CMakeLists.txt
+++ b/NPLib/Core/CMakeLists.txt
@@ -1,5 +1,5 @@
 add_custom_command(OUTPUT TAsciiFileDict.cxx COMMAND  ../scripts/build_dict.sh TAsciiFile.h TAsciiFileDict.cxx TAsciiFile.rootmap libNPCore.so)  
 add_custom_command(OUTPUT NPVDetectorDict.cxx COMMAND  ../scripts/build_dict.sh NPVDetector.h NPVDetectorDict.cxx NPVDetector.rootmap libNPCore.so NPCoreLinkdef.h)  
-add_library(NPCore SHARED NPVAnalysis.cxx NPAnalysisFactory.cxx NPCalibrationManager.cxx NPOptionManager.cxx RootOutput.cxx RootInput.cxx TAsciiFile.cxx TAsciiFileDict.cxx NPDetectorManager.cxx NPVDetector.cxx NPVDetectorDict.cxx NPVSpectra.cxx NPDetectorFactory.cxx NPSpectraServer.cxx NPInputParser.cxx)
+add_library(NPCore SHARED NPVAnalysis.cxx NPAnalysisFactory.cxx NPCalibrationManager.cxx NPOptionManager.cxx RootOutput.cxx RootInput.cxx TAsciiFile.cxx TAsciiFileDict.cxx NPDetectorManager.cxx NPVDetector.cxx NPVDetectorDict.cxx NPVSpectra.cxx NPDetectorFactory.cxx NPSpectraServer.cxx NPInputParser.cxx NPImage.cxx)
 target_link_libraries(NPCore ${ROOT_LIBRARIES}) 
-install(FILES NPVAnalysis.h NPAnalysisFactory.h  NPCalibrationManager.h NPOptionManager.h RootInput.h RootOutput.h TAsciiFile.h NPDetectorManager.h NPVDetector.h NPGlobalSystemOfUnits.h NPPhysicalConstants.h NPSystemOfUnits.h NPVSpectra.h NPDetectorFactory.h  NPSpectraServer.h NPInputParser.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY})
+install(FILES NPVAnalysis.h NPAnalysisFactory.h  NPCalibrationManager.h NPOptionManager.h RootInput.h RootOutput.h TAsciiFile.h NPDetectorManager.h NPVDetector.h NPGlobalSystemOfUnits.h NPPhysicalConstants.h NPSystemOfUnits.h NPVSpectra.h NPDetectorFactory.h  NPSpectraServer.h NPInputParser.h NPImage.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY})
diff --git a/NPLib/Core/NPImage.cxx b/NPLib/Core/NPImage.cxx
new file mode 100644
index 000000000..b14777de0
--- /dev/null
+++ b/NPLib/Core/NPImage.cxx
@@ -0,0 +1,159 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2016   this file is part of the NPTool Project         *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Adrien Matta   contact address: matta@lpccaen.in2p3.fr   *
+ *                                                                           *
+ * Creation Date  :                                                          *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *   This class is wrapper of root TASImage to manipulate and generate       *
+ *   detector pixel map                                                      *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+
+//NPTool
+#include "NPImage.h"
+
+//STL
+#include<iostream>
+
+////////////////////////////////////////////////////////////////////////////////
+NPL::Image::Image(){
+  m_Image = NULL;
+  m_ARGB = NULL;
+}
+////////////////////////////////////////////////////////////////////////////////
+NPL::Image::Image(std::string filename,double Xscalling,double Yscalling){
+  m_Image = new TASImage(filename.c_str());
+  m_ARGB = m_Image->GetArgbArray();
+  m_Xscaling = Xscalling;
+  m_Yscaling = Yscalling;
+}
+////////////////////////////////////////////////////////////////////////////////
+NPL::Image::~Image(){
+  if(m_Image)
+    delete m_Image;
+  if(m_ARGB)
+    delete m_ARGB;
+}
+////////////////////////////////////////////////////////////////////////////////
+void NPL::Image::Open(std::string filename){
+  if(m_Image)
+    delete m_Image;
+  if(m_ARGB)
+    delete m_ARGB;
+
+  m_Image = new TASImage(filename.c_str());
+  m_ARGB = m_Image->GetArgbArray();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void NPL::Image::Print(double scale){
+  unsigned int yPixel = m_Image->GetHeight();
+  unsigned int xPixel = m_Image->GetWidth();
+
+  m_Image->Scale(scale*xPixel,scale*yPixel);
+
+  for(unsigned int i = 0 ; i < m_Image->GetWidth() ; i++){
+    for(unsigned int j = 0 ; j < m_Image->GetHeight() ; j++){
+      unsigned int index = i*xPixel+j;
+      unsigned int b = GetBlueAtPixel(i,j);
+      unsigned int g = GetGreenAtPixel(i,j);
+      unsigned int r = GetRedAtPixel(i,j);
+      unsigned int a = GetAlphaAtPixel(i,j);
+
+      if(r||b||g)
+        std::cout << "x"<< " " ;
+      else
+        std::cout << "."<<" " ; 
+    }
+    std::cout << std::endl;
+  }
+} 
+////////////////////////////////////////////////////////////////////////////////
+void NPL::Image::Save(std::string filename){
+  m_Image->WriteImage(filename.c_str());
+} 
+
+
+////////////////////////////////////////////////////////////////////////////////
+void NPL::Image::Draw(){
+  m_Image->Draw();
+} 
+
+////////////////////////////////////////////////////////////////////////////////
+unsigned int NPL::Image::GetRedAtCoordinate(double x, double y){
+  unsigned int xp = x/m_Xscaling+m_Image->GetWidth()/2 ;
+  unsigned int yp = y/m_Yscaling+m_Image->GetHeight()/2 ;
+  return GetRedAtPixel(xp,yp);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+unsigned int NPL::Image::GetGreenAtCoordinate(double x, double y){
+  unsigned int xp = x/m_Xscaling+m_Image->GetWidth()/2 ;
+  unsigned int yp = y/m_Yscaling+m_Image->GetHeight()/2 ;
+  return GetRedAtPixel(xp,yp);
+}
+////////////////////////////////////////////////////////////////////////////////
+unsigned int NPL::Image::GetBlueAtCoordinate(double x, double y){
+  unsigned int xp = x/m_Xscaling+m_Image->GetWidth()/2 ;
+  unsigned int yp = y/m_Yscaling+m_Image->GetHeight()/2 ;
+  return GetRedAtPixel(xp,yp);
+}
+////////////////////////////////////////////////////////////////////////////////
+unsigned int NPL::Image::GetAlphaAtCoordinate(double x, double y){
+  unsigned int xp = x/m_Xscaling+m_Image->GetWidth()/2 ;
+  unsigned int yp = y/m_Yscaling+m_Image->GetHeight()/2 ;
+  return GetRedAtPixel(xp,yp);
+}
+////////////////////////////////////////////////////////////////////////////////
+unsigned int NPL::Image::GetPixelAtCoordinate(double x, double y){
+  unsigned int xp = x/m_Xscaling+m_Image->GetWidth()/2 ;
+  unsigned int yp = y/m_Yscaling+m_Image->GetHeight()/2 ;
+  return m_ARGB[PixelToIndex(xp,yp)];
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+unsigned int NPL::Image::PixelToIndex(unsigned int x, unsigned int y){
+  return x*m_Image->GetWidth()+y;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+unsigned int NPL::Image::GetRedAtPixel(unsigned int x, unsigned int y){
+  unsigned int v = m_ARGB[PixelToIndex(x,y)];  
+  v= (v>>16)&0xff;
+  return v;
+}
+////////////////////////////////////////////////////////////////////////////////
+unsigned int NPL::Image::GetGreenAtPixel(unsigned int x, unsigned int y){
+  unsigned int v = m_ARGB[PixelToIndex(x,y)];  
+  v= (v>>8)&0xff;
+  return v;
+
+}
+////////////////////////////////////////////////////////////////////////////////
+unsigned int NPL::Image::GetBlueAtPixel(unsigned int x, unsigned int y){
+  unsigned int v = m_ARGB[PixelToIndex(x,y)];  
+  v= v&0xff;
+  return v;
+
+}
+////////////////////////////////////////////////////////////////////////////////
+unsigned int NPL::Image::GetAlphaAtPixel(unsigned int x, unsigned int y){
+  unsigned int v = m_ARGB[PixelToIndex(x,y)];  
+  v= (v>>24)&0xff;
+  return v;
+
+}
+
diff --git a/NPLib/Core/NPImage.h b/NPLib/Core/NPImage.h
new file mode 100644
index 000000000..39000431e
--- /dev/null
+++ b/NPLib/Core/NPImage.h
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2016   this file is part of the NPTool Project         *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Adrien Matta   contact address: matta@lpccaen.in2p3.fr   *
+ *                                                                           *
+ * Creation Date  :                                                          *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *   This class is wrapper of root TASImage to manipulate and generate       *
+ *   detector pixel map                                                      *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+
+
+// ROOT
+#include"TASImage.h"
+
+//STL
+#include<string>
+
+namespace NPL{
+
+  class Image{
+
+  public:
+    Image();
+    Image(std::string filename,double Xscalling,double Yscalling);
+    ~Image();
+  
+  public:
+    void Open(std::string filename);
+    void Print(double scale=0); // print mockup in terminal
+    void Draw(); // draw in a new canvas (interactive only)
+    void Save(std::string filename); // save the image
+
+  public: // Get the value based on coordinate
+    unsigned int GetRedAtCoordinate(double x, double y);
+    unsigned int GetGreenAtCoordinate(double x, double y);
+    unsigned int GetBlueAtCoordinate(double x, double y);
+    unsigned int GetAlphaAtCoordinate(double x, double y);
+    unsigned int GetPixelAtCoordinate(double x, double y);
+
+
+  public: // Get the value based on pixel
+    unsigned int PixelToIndex(unsigned int x, unsigned int y);
+    unsigned int GetRedAtPixel(unsigned int x, unsigned int y);
+    unsigned int GetGreenAtPixel(unsigned int x, unsigned int y);
+    unsigned int GetBlueAtPixel(unsigned int x, unsigned int y);
+    unsigned int GetAlphaAtPixel(unsigned int x, unsigned int y);
+
+  public:
+    void GenerateStrip(unsigned int Nbr, double x, double y , double interstrip , unsigned int pixel);
+
+  private:
+    TASImage* m_Image; // the image itself
+    unsigned int* m_ARGB; // the alpha red green blue array of pixel value
+    double m_Xscaling; // pixel per mm
+    double m_Yscaling; // pixel per mm
+  };
+
+}
diff --git a/NPLib/Detectors/Chio/TChio_digPhysics.cxx b/NPLib/Detectors/Chio/TChio_digPhysics.cxx
index dc23e116a..7b238a1db 100644
--- a/NPLib/Detectors/Chio/TChio_digPhysics.cxx
+++ b/NPLib/Detectors/Chio/TChio_digPhysics.cxx
@@ -62,14 +62,11 @@ void TChio_digPhysics::ReadConfiguration(NPL::InputParser parser){
   if(NPOptionManager::getInstance()->GetVerboseLevel())
     cout << "//// " << blocks.size() << " detectors found " << endl; 
 
-  vector<string> token = {"A","B","C","D"};
+  vector<string> token = {"POS"};
 
   for(unsigned int i = 0 ; i < blocks.size() ; i++){
     if(blocks[i]->HasTokenList(token)){
-      TVector3 A = blocks[i]->GetTVector3("A","mm");
-      TVector3 B = blocks[i]->GetTVector3("B","mm");
-      TVector3 C = blocks[i]->GetTVector3("C","mm");
-      TVector3 D = blocks[i]->GetTVector3("D","mm");
+      TVector3 Pos = blocks[i]->GetTVector3("POS","mm");
 
      // AddChio(A,B,C,D);
     }
diff --git a/NPLib/Detectors/MUST2/ressources/Mask.cxx b/NPLib/Detectors/MUST2/ressources/Mask.cxx
new file mode 100644
index 000000000..33c72bc1d
--- /dev/null
+++ b/NPLib/Detectors/MUST2/ressources/Mask.cxx
@@ -0,0 +1,58 @@
+void Mask(){
+
+  double dimension = 100.42;
+  double active = 97.30;
+  double pitch = 97.30/128;
+  double width = 0.7;
+//
+//  double dimension = 100;
+//  double active = 97;
+//  double pitch = 97/97;
+//  double width = 0.5;
+
+  // mm per pixel 
+  double scale = 0.01;
+  //pitch in pixel
+  unsigned int spitch = pitch/scale;
+  unsigned int swidth  = width/scale;
+  unsigned int sinter = (spitch - swidth)/2;
+  cout << spitch << " " << swidth << " " << sinter << endl;
+  // image size
+  unsigned int size = dimension/scale;
+  cout << "Image size: " << size << "x" << size<< endl ;
+  double* zargb = new double[size*size];
+  TASImage* zero = new TASImage("zero",zargb,size,size,0);
+  zero->WriteImage("mask.png");
+  TASImage* mask = new TASImage("mask.png");
+  delete[] zargb;
+  unsigned int* argb = mask->GetArgbArray();
+  unsigned int* argb2 = mask->GetArgbArray();
+  unsigned int index = 0;
+  double border1 = (dimension-active)/scale;
+  double border2 = (active)/scale;
+
+  for(unsigned int px = 0 ; px < size ; px++){
+    for(unsigned int py = 0 ; py < size ; py++){
+      if(px%1000==0)
+        cout << "\r" << px << "/" << size << flush; 
+      // Compute array index
+      index = px * size + py; 
+      // Inactive sides
+      if(px < border1|| py < border1 || px>border2 || py>border2)
+        argb[index] = 0xffff0000;
+      else{ // strips
+        unsigned int coord = px-border1;
+        unsigned int nbr = coord/spitch;
+       // cout << coord << " " << nbr*spitch+sinter << " " << spitch << " " << sinter << " " << spitch << " " << sinter << endl;
+        if(coord<(nbr*spitch+sinter) || coord >(((nbr+1)*spitch-sinter))){// interstrip
+          argb[index] = 0xffff0000+(((nbr+1))<<8)+nbr; 
+        }   
+        else
+          argb[index] = 0xff000000 + nbr;
+      }
+    }
+  }
+  mask->WriteImage("mask.png");
+  //mask->Draw();
+
+}
diff --git a/NPLib/Detectors/MUST2/ressources/maskBack.png b/NPLib/Detectors/MUST2/ressources/maskBack.png
new file mode 100644
index 0000000000000000000000000000000000000000..40753f6d6e226ee99d1d9a27524e1576f56a9a5f
GIT binary patch
literal 320612
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

literal 0
HcmV?d00001

diff --git a/NPLib/Detectors/MUST2/ressources/maskFront.png b/NPLib/Detectors/MUST2/ressources/maskFront.png
new file mode 100644
index 0000000000000000000000000000000000000000..6644c19a7279d326859c83ab956ac8ffc3fa3681
GIT binary patch
literal 325078
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
JFU!g;{(owjM&1Ab

literal 0
HcmV?d00001

diff --git a/NPLib/ressources/CMake/Root.cmake b/NPLib/ressources/CMake/Root.cmake
index 245789a62..d6b72cb0d 100644
--- a/NPLib/ressources/CMake/Root.cmake
+++ b/NPLib/ressources/CMake/Root.cmake
@@ -36,7 +36,7 @@ endif()
 ## Collect the different information ##
 
 # List of Root dependencies
-set(ROOT_LIBRARIES dl Gui Core RIO Net Hist Gpad Tree Physics MathCore Thread )
+set(ROOT_LIBRARIES dl Gui Core RIO Net Hist Gpad Tree Physics MathCore Thread ASImage)
 
 # Lib directories
 exec_program(${NPTOOL_ROOT_CONFIG} ARGS "--libdir" OUTPUT_VARIABLE ROOT_LIBRARY_DIR)
diff --git a/NPSimulation/Detectors/MUST2/MUST2Array.cc b/NPSimulation/Detectors/MUST2/MUST2Array.cc
index bfe806930..52625d30d 100644
--- a/NPSimulation/Detectors/MUST2/MUST2Array.cc
+++ b/NPSimulation/Detectors/MUST2/MUST2Array.cc
@@ -37,13 +37,13 @@
 #include "G4VisAttributes.hh"
 #include "G4Colour.hh"
 #include "G4PVDivision.hh"
-
+#include "Randomize.hh"
 // NPS
 #include "MaterialManager.hh"
 #include "NPSDetectorFactory.hh"
 #include "ObsoleteGeneralScorers.hh"
-#include "MUST2Scorers.hh"
-
+#include "SiliconScorers.hh"
+#include "CalorimeterScorers.hh"
 #include "NPOptionManager.h"
 
 //ROOT
@@ -161,7 +161,7 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber,
       Name                  ,
       world                 ,
       false                 ,
-      0                     );
+      TelescopeNumber                     );
 
   if (m_non_sensitive_part_visiualisation){
     G4VisAttributes* FrameVisAtt = new G4VisAttributes(G4Colour(0.80, 0.80, 0.80));
@@ -176,7 +176,7 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber,
   G4LogicalVolume* logicVacBox = new G4LogicalVolume(solidVacBox, m_MaterialVacuum, "logicVacBox", 0, 0, 0);
 
 
-  new G4PVPlacement(0, positionVacBox, logicVacBox, Name + "_VacBox", logicMM, false, 0);
+  new G4PVPlacement(0, positionVacBox, logicVacBox, Name + "_VacBox", logicMM, false, TelescopeNumber );
 
   logicVacBox->SetVisAttributes(G4VisAttributes::Invisible);
 
@@ -193,8 +193,8 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber,
     G4Box*           solidAluStrip = new G4Box("AluBox", 0.5*SiliconFace, 0.5*SiliconFace, 0.5*AluStripThickness);
     G4LogicalVolume* logicAluStrip = new G4LogicalVolume(solidAluStrip, m_MaterialAluminium, "logicAluStrip", 0, 0, 0);
 
-    new G4PVPlacement(0, positionAluStripFront, logicAluStrip, Name + "_AluStripFront", logicMM, false, 0);
-    new G4PVPlacement(0, positionAluStripBack, logicAluStrip, Name + "_AluStripBack", logicMM, false, 0);
+    new G4PVPlacement(0, positionAluStripFront, logicAluStrip, Name + "_AluStripFront", logicMM, false, TelescopeNumber );
+    new G4PVPlacement(0, positionAluStripBack, logicAluStrip, Name + "_AluStripBack", logicMM, false, TelescopeNumber );
 
     logicAluStrip->SetVisAttributes(G4VisAttributes::Invisible);
 
@@ -203,7 +203,7 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber,
     G4Box*           solidSilicon = new G4Box("solidSilicon", 0.5*SiliconFace, 0.5*SiliconFace, 0.5*SiliconThickness);
     G4LogicalVolume* logicSilicon = new G4LogicalVolume(solidSilicon, m_MaterialSilicon, "logicSilicon", 0, 0, 0);
 
-    new G4PVPlacement(0, positionSilicon, logicSilicon, Name + "_Silicon", logicMM, false, 0);
+    new G4PVPlacement(0, positionSilicon, logicSilicon, Name + "_Silicon", logicMM, false, TelescopeNumber );
 
 
     ///Set Silicon strip sensible
@@ -245,148 +245,158 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber,
     G4ThreeVector ShiftSiLiDown  = G4ThreeVector(0.25  * SiliconFace + 0.5 * SiLiSpace, 0, 0)	;
 
     // SiLi : left side of SiLi detector
-    G4Box* solidSiLi_LT  = new G4Box("SiLi_LT"  , 0.5*SiLi_WidthX_Left  , 0.5*SiLi_HighY_Upper   , 0.5*SiLiThickness);
-    G4Box* solidSiLi_RT  = new G4Box("SiLi_RT"  , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Upper   , 0.5*SiLiThickness);
-    G4Box* solidSiLi_LC1 = new G4Box("SiLi_LC1" , 0.5*SiLi_WidthX_Left  , 0.5*SiLi_HighY_Center  , 0.5*SiLiThickness);
-    G4Box* solidSiLi_RC1 = new G4Box("SiLi_RC1" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Center  , 0.5*SiLiThickness);
-    G4Box* solidSiLi_LB  = new G4Box("SiLi_LB"  , 0.5*SiLi_WidthX_Left  , 0.5*SiLi_HighY_Upper   , 0.5*SiLiThickness);
-    G4Box* solidSiLi_RB  = new G4Box("SiLi_RB"  , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Upper   , 0.5*SiLiThickness);
-    G4Box* solidSiLi_LC2 = new G4Box("SiLi_LC2" , 0.5*SiLi_WidthX_Left  , 0.5*SiLi_HighY_Center  , 0.5*SiLiThickness);
-    G4Box* solidSiLi_RC2 = new G4Box("SiLi_RC2" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Center  , 0.5*SiLiThickness);
-
-    G4LogicalVolume* logicSiLi_LT    = new G4LogicalVolume(solidSiLi_LT   , m_MaterialSilicon , "SiLi_LT"  , 0 , 0 , 0);
-    G4LogicalVolume* logicSiLi_RT    = new G4LogicalVolume(solidSiLi_RT   , m_MaterialSilicon , "SiLi_RT"  , 0 , 0 , 0);
-    G4LogicalVolume* logicSiLi_LC1   = new G4LogicalVolume(solidSiLi_LC1  , m_MaterialSilicon , "SiLi_LC1" , 0 , 0 , 0);
-    G4LogicalVolume* logicSiLi_RC1   = new G4LogicalVolume(solidSiLi_RC1  , m_MaterialSilicon , "SiLi_RC1" , 0 , 0 , 0);
-    G4LogicalVolume* logicSiLi_LB    = new G4LogicalVolume(solidSiLi_LB   , m_MaterialSilicon , "SiLi_LB"  , 0 , 0 , 0);
-    G4LogicalVolume* logicSiLi_RB    = new G4LogicalVolume(solidSiLi_RB   , m_MaterialSilicon , "SiLi_RB"  , 0 , 0 , 0);
-    G4LogicalVolume* logicSiLi_LC2   = new G4LogicalVolume(solidSiLi_LC2  , m_MaterialSilicon , "SiLi_LC2" , 0 , 0 , 0);
-    G4LogicalVolume* logicSiLi_RC2   = new G4LogicalVolume(solidSiLi_RC2  , m_MaterialSilicon , "SiLi_RC2" , 0 , 0 , 0);
+    G4Box* solidSiLi_LT  = new G4Box("SiLi_LT", 0.5*SiLi_WidthX_Left, 0.5*SiLi_HighY_Upper, 0.5*SiLiThickness);
+    G4Box* solidSiLi_RT  = new G4Box("SiLi_RT", 0.5*SiLi_WidthX_Right, 0.5*SiLi_HighY_Upper, 0.5*SiLiThickness);
+    G4Box* solidSiLi_LC1 = new G4Box("SiLi_LC1", 0.5*SiLi_WidthX_Left, 0.5*SiLi_HighY_Center, 0.5*SiLiThickness);
+    G4Box* solidSiLi_RC1 = new G4Box("SiLi_RC1", 0.5*SiLi_WidthX_Right, 0.5*SiLi_HighY_Center, 0.5*SiLiThickness);
+    G4Box* solidSiLi_LB  = new G4Box("SiLi_LB", 0.5*SiLi_WidthX_Left, 0.5*SiLi_HighY_Upper, 0.5*SiLiThickness);
+    G4Box* solidSiLi_RB  = new G4Box("SiLi_RB", 0.5*SiLi_WidthX_Right, 0.5*SiLi_HighY_Upper, 0.5*SiLiThickness);
+    G4Box* solidSiLi_LC2 = new G4Box("SiLi_LC2", 0.5*SiLi_WidthX_Left, 0.5*SiLi_HighY_Center, 0.5*SiLiThickness);
+    G4Box* solidSiLi_RC2 = new G4Box("SiLi_RC2", 0.5*SiLi_WidthX_Right, 0.5*SiLi_HighY_Center, 0.5*SiLiThickness);
+
+    G4LogicalVolume* logicSiLi_LT  = new G4LogicalVolume(solidSiLi_LT , m_MaterialSilicon, "SiLi_LT" , 0, 0, 0);
+    G4LogicalVolume* logicSiLi_RT  = new G4LogicalVolume(solidSiLi_RT , m_MaterialSilicon, "SiLi_RT" , 0, 0, 0);
+    G4LogicalVolume* logicSiLi_LC1 = new G4LogicalVolume(solidSiLi_LC1, m_MaterialSilicon, "SiLi_LC1", 0, 0, 0);
+    G4LogicalVolume* logicSiLi_RC1 = new G4LogicalVolume(solidSiLi_RC1, m_MaterialSilicon, "SiLi_RC1", 0, 0, 0);
+    G4LogicalVolume* logicSiLi_LB  = new G4LogicalVolume(solidSiLi_LB , m_MaterialSilicon, "SiLi_LB" , 0, 0, 0);
+    G4LogicalVolume* logicSiLi_RB  = new G4LogicalVolume(solidSiLi_RB , m_MaterialSilicon, "SiLi_RB" , 0, 0, 0);
+    G4LogicalVolume* logicSiLi_LC2 = new G4LogicalVolume(solidSiLi_LC2, m_MaterialSilicon, "SiLi_LC2", 0, 0, 0);
+    G4LogicalVolume* logicSiLi_RC2 = new G4LogicalVolume(solidSiLi_RC2, m_MaterialSilicon, "SiLi_RC2", 0, 0, 0);
 
     G4double interSiLi = 0.5 * mm;
 
     // Top
-    G4ThreeVector positionSiLi_LT_up = G4ThreeVector(  -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX ,
-        0.5 * SiLi_HighY_Upper  + SiLi_HighY_Center + 1.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_LT_up = 
+      G4ThreeVector(  -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX ,
+          0.5 * SiLi_HighY_Upper  + SiLi_HighY_Center + 1.5 * interSiLi,
+          0);
 
     positionSiLi_LT_up += ShiftSiLiUp ;
 
-    G4ThreeVector positionSiLi_RT_up = G4ThreeVector(  0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
-        0.5 * SiLi_HighY_Upper  + SiLi_HighY_Center + 1.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_RT_up = 
+      G4ThreeVector(  0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
+          0.5 * SiLi_HighY_Upper  + SiLi_HighY_Center + 1.5 * interSiLi,
+          0);
 
     positionSiLi_RT_up += ShiftSiLiUp ;
 
-    G4ThreeVector positionSiLi_LC1_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX ,
-        0.5 * SiLi_HighY_Center + 0.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_LC1_up = 
+      G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX ,
+          0.5 * SiLi_HighY_Center + 0.5 * interSiLi,
+          0);
 
     positionSiLi_LC1_up += ShiftSiLiUp ;
 
-    G4ThreeVector positionSiLi_RC1_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
-        0.5 * SiLi_HighY_Center + 0.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_RC1_up = 
+      G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
+          0.5 * SiLi_HighY_Center + 0.5 * interSiLi,
+          0);
 
     positionSiLi_RC1_up += ShiftSiLiUp ;
 
-    G4ThreeVector positionSiLi_LB_up = G4ThreeVector(  -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX ,
-        -0.5 * SiLi_HighY_Upper  - SiLi_HighY_Center - 1.5 * interSiLi ,
-        0);
+    G4ThreeVector positionSiLi_LB_up = 
+      G4ThreeVector(  -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX ,
+          -0.5 * SiLi_HighY_Upper  - SiLi_HighY_Center - 1.5 * interSiLi ,
+          0);
 
     positionSiLi_LB_up += ShiftSiLiUp ;
 
-    G4ThreeVector positionSiLi_RB_up = G4ThreeVector(  0.5 * SiLi_WidthX_Right - SiLi_ShiftX ,
-        -0.5 * SiLi_HighY_Upper  - SiLi_HighY_Center - 1.5 * interSiLi ,
-        0);
+    G4ThreeVector positionSiLi_RB_up = 
+      G4ThreeVector(  0.5 * SiLi_WidthX_Right - SiLi_ShiftX ,
+          -0.5 * SiLi_HighY_Upper  - SiLi_HighY_Center - 1.5 * interSiLi ,
+          0);
 
     positionSiLi_RB_up += ShiftSiLiUp ;
 
-    G4ThreeVector positionSiLi_LC2_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX ,
-        -0.5 * SiLi_HighY_Center - 0.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_LC2_up = 
+      G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX ,
+          -0.5 * SiLi_HighY_Center - 0.5 * interSiLi,
+          0);
 
     positionSiLi_LC2_up += ShiftSiLiUp ;
 
-    G4ThreeVector positionSiLi_RC2_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX ,
-        -0.5 * SiLi_HighY_Center - 0.5 * interSiLi  ,
-        0);
+    G4ThreeVector positionSiLi_RC2_up = 
+      G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX ,
+          -0.5 * SiLi_HighY_Center - 0.5 * interSiLi  ,
+          0);
 
     positionSiLi_RC2_up += ShiftSiLiUp ;
 
 
     // Down
-    G4ThreeVector positionSiLi_LT_down = G4ThreeVector(   -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX,
-        0.5 * SiLi_HighY_Upper  + SiLi_HighY_Center + 1.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_LT_down = 
+      G4ThreeVector(   -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX,
+          0.5 * SiLi_HighY_Upper  + SiLi_HighY_Center + 1.5 * interSiLi,
+          0);
 
     positionSiLi_LT_down += ShiftSiLiDown ;
 
-    G4ThreeVector positionSiLi_RT_down = G4ThreeVector(   0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
-        0.5 * SiLi_HighY_Upper  + SiLi_HighY_Center + 1.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_RT_down = 
+      G4ThreeVector(   0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
+          0.5 * SiLi_HighY_Upper  + SiLi_HighY_Center + 1.5 * interSiLi,
+          0);
 
     positionSiLi_RT_down += ShiftSiLiDown ;
 
-    G4ThreeVector positionSiLi_LC1_down = G4ThreeVector(  -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX,
-        0.5 * SiLi_HighY_Center + 0.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_LC1_down = 
+      G4ThreeVector(  -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX,
+          0.5 * SiLi_HighY_Center + 0.5 * interSiLi,
+          0);
 
     positionSiLi_LC1_down += ShiftSiLiDown ;
 
-    G4ThreeVector positionSiLi_RC1_down = G4ThreeVector(  0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
-        0.5 * SiLi_HighY_Center + 0.5 * interSiLi ,
-        0);
+    G4ThreeVector positionSiLi_RC1_down = 
+      G4ThreeVector(  0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
+          0.5 * SiLi_HighY_Center + 0.5 * interSiLi ,
+          0);
 
     positionSiLi_RC1_down += ShiftSiLiDown ;
 
-    G4ThreeVector positionSiLi_LB_down = G4ThreeVector(   -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX,
-        -0.5 * SiLi_HighY_Upper  - SiLi_HighY_Center - 1.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_LB_down = 
+      G4ThreeVector(   -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX,
+          -0.5 * SiLi_HighY_Upper  - SiLi_HighY_Center - 1.5 * interSiLi,
+          0);
 
     positionSiLi_LB_down += ShiftSiLiDown ;
 
-    G4ThreeVector positionSiLi_RB_down = G4ThreeVector(   0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
-        -0.5 * SiLi_HighY_Upper  - SiLi_HighY_Center - 1.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_RB_down = 
+      G4ThreeVector(   0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
+          -0.5 * SiLi_HighY_Upper  - SiLi_HighY_Center - 1.5 * interSiLi,
+          0);
 
     positionSiLi_RB_down += ShiftSiLiDown ;
 
-    G4ThreeVector positionSiLi_LC2_down = G4ThreeVector(  -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX,
-        -0.5 * SiLi_HighY_Center - 0.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_LC2_down = 
+      G4ThreeVector(  -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX,
+          -0.5 * SiLi_HighY_Center - 0.5 * interSiLi,
+          0);
 
     positionSiLi_LC2_down += ShiftSiLiDown ;
 
-    G4ThreeVector positionSiLi_RC2_down = G4ThreeVector(  0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
-        -0.5 * SiLi_HighY_Center - 0.5 * interSiLi,
-        0);
+    G4ThreeVector positionSiLi_RC2_down = 
+      G4ThreeVector(  0.5 * SiLi_WidthX_Right - SiLi_ShiftX,
+          -0.5 * SiLi_HighY_Center - 0.5 * interSiLi,
+          0);
 
     positionSiLi_RC2_down += ShiftSiLiDown ;
 
+    new G4PVPlacement(0 , positionSiLi_RT_down  , logicSiLi_RT  , Name + "_SiLi_Pad1" , logicSiLi , false ,1);
+    new G4PVPlacement(0 , positionSiLi_LT_down  , logicSiLi_LT  , Name + "_SiLi_Pad2" , logicSiLi , false ,2);
+    new G4PVPlacement(0 , positionSiLi_RC1_down , logicSiLi_RC1 , Name + "_SiLi_Pad3" , logicSiLi , false ,3);
+    new G4PVPlacement(0 , positionSiLi_LC1_down , logicSiLi_LC1 , Name + "_SiLi_Pad4" , logicSiLi , false ,4);
+    new G4PVPlacement(0 , positionSiLi_LC2_down , logicSiLi_LC2 , Name + "_SiLi_Pad5" , logicSiLi , false ,5);
+    new G4PVPlacement(0 , positionSiLi_RC2_down , logicSiLi_RC2 , Name + "_SiLi_Pad6" , logicSiLi , false ,6);
+    new G4PVPlacement(0 , positionSiLi_LB_down  , logicSiLi_LB  , Name + "_SiLi_Pad7" , logicSiLi , false ,7);
+    new G4PVPlacement(0 , positionSiLi_RB_down  , logicSiLi_RB  , Name + "_SiLi_Pad8" , logicSiLi , false ,8);
+    new G4PVPlacement(0 , positionSiLi_LT_up  , logicSiLi_LT  , Name + "_SiLi_Pad9"  , logicSiLi , false ,9);
+    new G4PVPlacement(0 , positionSiLi_RT_up  , logicSiLi_RT  , Name + "_SiLi_Pad10" , logicSiLi , false ,10);
+    new G4PVPlacement(0 , positionSiLi_LC1_up , logicSiLi_LC1 , Name + "_SiLi_Pad11" , logicSiLi , false ,11);
+    new G4PVPlacement(0 , positionSiLi_RC1_up , logicSiLi_RC1 , Name + "_SiLi_Pad12" , logicSiLi , false ,12);
+    new G4PVPlacement(0 , positionSiLi_RC2_up , logicSiLi_RC2 , Name + "_SiLi_Pad13" , logicSiLi , false ,13);
+    new G4PVPlacement(0 , positionSiLi_LC2_up , logicSiLi_LC2 , Name + "_SiLi_Pad14" , logicSiLi , false ,14);
+    new G4PVPlacement(0 , positionSiLi_RB_up  , logicSiLi_RB  , Name + "_SiLi_Pad15" , logicSiLi , false ,15);
+    new G4PVPlacement(0 , positionSiLi_LB_up  , logicSiLi_LB  , Name + "_SiLi_Pad16" , logicSiLi , false ,16);
 
-    // up
-    new G4PVPlacement(0 , positionSiLi_LT_up  , logicSiLi_LT  , Name + "_SiLi_Pad9"   , logicSiLi , false , 0)  ;
-    new G4PVPlacement(0 , positionSiLi_RT_up  , logicSiLi_RT  , Name + "_SiLi_Pad10"  , logicSiLi , false , 0)  ;
-    new G4PVPlacement(0 , positionSiLi_LC1_up , logicSiLi_LC1 , Name + "_SiLi_Pad11" 	, logicSiLi , false , 0);
-    new G4PVPlacement(0 , positionSiLi_RC1_up , logicSiLi_RC1 , Name + "_SiLi_Pad12" 	, logicSiLi , false , 0);
-
-    new G4PVPlacement(0 , positionSiLi_LB_up  , logicSiLi_LB  , Name + "_SiLi_Pad16"  , logicSiLi , false , 0)  ;
-    new G4PVPlacement(0 , positionSiLi_RB_up  , logicSiLi_RB  , Name + "_SiLi_Pad15"  , logicSiLi , false , 0)  ;
-    new G4PVPlacement(0 , positionSiLi_LC2_up , logicSiLi_LC2 , Name + "_SiLi_Pad14" 	, logicSiLi , false , 0);
-    new G4PVPlacement(0 , positionSiLi_RC2_up , logicSiLi_RC2 , Name + "_SiLi_Pad13" 	, logicSiLi , false , 0);
-
-
-    // down
-    new G4PVPlacement(0 , positionSiLi_LT_down  , logicSiLi_LT  , Name + "_SiLi_Pad2"  , logicSiLi , false , 0) ;
-    new G4PVPlacement(0 , positionSiLi_RT_down  , logicSiLi_RT  , Name + "_SiLi_Pad1"  , logicSiLi , false , 0) ;
-    new G4PVPlacement(0 , positionSiLi_LC1_down , logicSiLi_LC1 , Name + "_SiLi_Pad4" 	, logicSiLi , false , 0) ;
-    new G4PVPlacement(0 , positionSiLi_RC1_down , logicSiLi_RC1 , Name + "_SiLi_Pad3" 	, logicSiLi , false , 0) ;
-
-    new G4PVPlacement(0 , positionSiLi_LB_down  , logicSiLi_LB  , Name + "_SiLi_Pad7"  , logicSiLi , false , 0) ;
-    new G4PVPlacement(0 , positionSiLi_RB_down  , logicSiLi_RB  , Name + "_SiLi_Pad8"  , logicSiLi , false , 0) ;
-    new G4PVPlacement(0 , positionSiLi_LC2_down , logicSiLi_LC2 , Name + "_SiLi_Pad5" 	, logicSiLi , false , 0) ;
-    new G4PVPlacement(0 , positionSiLi_RC2_down , logicSiLi_RC2 , Name + "_SiLi_Pad6" 	, logicSiLi , false , 0) ;
 
     // Set SiLi sensible
     logicSiLi_LT->SetSensitiveDetector(m_SiLiScorer);
@@ -563,13 +573,13 @@ void MUST2Array::ReadConfiguration(NPL::InputParser parser){
     cout << "//// " << blocks.size() << " telescope found" << endl;
   for(unsigned int i  = 0 ; i < blocks.size() ; i++){
     if(NPOptionManager::getInstance()->GetVerboseLevel())
-    cout << endl << "//// Must 2 Telecope " << i+1 <<  endl;
+      cout << endl << "//// Must 2 Telecope " << i+1 <<  endl;
     // Cartesian Case
     vector<string> cart = {"X1_Y1","X1_Y128","X128_Y1","X128_Y128","SI","SILI","CSI"};
     // Spherical Case
     vector<string> sphe= {"R","THETA","PHI","BETA","SI","SILI","CSI"};
 
-        if(blocks[i]->HasTokenList(cart)){
+    if(blocks[i]->HasTokenList(cart)){
       G4ThreeVector A = NPS::ConvertVector( blocks[i]->GetTVector3("X1_Y1","mm"));
       G4ThreeVector B = NPS::ConvertVector( blocks[i]->GetTVector3("X128_Y1","mm"));
       G4ThreeVector C = NPS::ConvertVector( blocks[i]->GetTVector3("X1_Y128","mm"));
@@ -598,7 +608,7 @@ void MUST2Array::ReadConfiguration(NPL::InputParser parser){
     }
 
     if(blocks[i]->GetString("VIS")=="all")
-       m_non_sensitive_part_visiualisation = true;
+      m_non_sensitive_part_visiualisation = true;
 
   }
 }
@@ -609,13 +619,13 @@ void MUST2Array::ReadConfiguration(NPL::InputParser parser){
 void MUST2Array::ConstructDetector(G4LogicalVolume* world){
   G4RotationMatrix* MMrot  		= NULL ;
   G4ThreeVector     MMpos  		= G4ThreeVector(0, 0, 0) ;
-  G4ThreeVector     MMu       	= G4ThreeVector(0, 0, 0) ;
-  G4ThreeVector     MMv       	= G4ThreeVector(0, 0, 0) ;
-  G4ThreeVector     MMw       	= G4ThreeVector(0, 0, 0) ;
+  G4ThreeVector     MMu       = G4ThreeVector(0, 0, 0) ;
+  G4ThreeVector     MMv       = G4ThreeVector(0, 0, 0) ;
+  G4ThreeVector     MMw       = G4ThreeVector(0, 0, 0) ;
   G4ThreeVector     MMCenter 	= G4ThreeVector(0, 0, 0) ;
-  bool           	Si     		= true ;
-  bool          	 	SiLi   		= true ;
-  bool           	CsI    		= true ;
+  bool Si   = true ;
+  bool SiLi = true ;
+  bool CsI  = true ;
 
   G4int NumberOfTelescope = m_DefinitionType.size() ;
 
@@ -708,320 +718,184 @@ void MUST2Array::InitializeRootOutput(){
 // Read sensitive part and fill the Root tree.
 // Called at in the EventAction::EndOfEventAvtion
 void MUST2Array::ReadSensitive(const G4Event* event){
-  G4String DetectorNumber 	;
-  m_Event->Clear()			;
+  G4String DetectorNumber;
+  m_Event->Clear();
 
   //////////////////////////////////////////////////////////////////////////////////////
   //////////////////////// Used to Read Event Map of detector //////////////////////////
   //////////////////////////////////////////////////////////////////////////////////////
 
-  // Si
-  std::map<G4int, G4int*>::iterator DetectorNumber_itr;
-  std::map<G4int, G4double*>::iterator Energy_itr;
-  std::map<G4int, G4double*>::iterator Time_itr;
-  std::map<G4int, G4int*>::iterator X_itr;
-  std::map<G4int, G4int*>::iterator Y_itr;
-  std::map<G4int, G4double*>::iterator Pos_X_itr;
-  std::map<G4int, G4double*>::iterator Pos_Y_itr;
-  std::map<G4int, G4double*>::iterator Pos_Z_itr;
-  std::map<G4int, G4double*>::iterator Ang_Theta_itr;
-  std::map<G4int, G4double*>::iterator Ang_Phi_itr;
-
-  NPS::HitsMap<G4int>*	  DetectorNumberHitMap;
-  NPS::HitsMap<G4double>* EnergyHitMap;
-  NPS::HitsMap<G4double>* TimeHitMap;
-  NPS::HitsMap<G4int>* XHitMap;
-  NPS::HitsMap<G4int>* YHitMap;
-  NPS::HitsMap<G4double>* PosXHitMap;
-  NPS::HitsMap<G4double>* PosYHitMap;
-  NPS::HitsMap<G4double>* PosZHitMap;
-  NPS::HitsMap<G4double>* AngThetaHitMap;
-  NPS::HitsMap<G4double>* AngPhiHitMap;
-
-  // Si(Li)
-  std::map<G4int, G4double*>::iterator SiLiEnergy_itr;
-  std::map<G4int, G4int*>::iterator SiLiPadNbr_itr;
-  NPS::HitsMap<G4double>* 				 SiLiEnergyHitMap;
-  NPS::HitsMap<G4int>* 				    SiLiPadNbrHitMap;
-
-  // CsI
-  std::map<G4int, G4double*>::iterator CsIEnergy_itr;
-  std::map<G4int, G4int*>::iterator    CsICristalNbr_itr;
-  NPS::HitsMap<G4double>* 				    CsIEnergyHitMap;
-  NPS::HitsMap<G4int>* 				       CsICristalNbrHitMap;
-  //////////////////////////////////////////////////////////////////////////////////////
-  //////////////////////////////////////////////////////////////////////////////////////
-
-  // Read the Scorer associate to the Silicon Strip
-
-  //Detector Number
-  G4int StripDetCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/DetectorNumber");
-  DetectorNumberHitMap = (NPS::HitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripDetCollectionID));
-  DetectorNumber_itr =  DetectorNumberHitMap->GetMap()->begin();
-
-  //Energy
-  G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripEnergy") ;
-  EnergyHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID)) ;
-  Energy_itr = EnergyHitMap->GetMap()->begin();
-
-  //Time of Flight
-  G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripTime");
-  TimeHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID));
-  Time_itr = TimeHitMap->GetMap()->begin();
-
-  //Strip Number X
-  G4int StripXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripNumberX") ;
-  XHitMap = (NPS::HitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripXCollectionID));
-  X_itr = XHitMap->GetMap()->begin();
-
-  //Strip Number Y
-  G4int StripYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripNumberY");
-  YHitMap = (NPS::HitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripYCollectionID));
-  Y_itr = YHitMap->GetMap()->begin();
-
-  //Interaction Coordinate X
-  G4int InterCoordXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordX");
-  PosXHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordXCollectionID));
-  Pos_X_itr = PosXHitMap->GetMap()->begin();
-
-  //Interaction Coordinate Y
-  G4int InterCoordYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordY");
-  PosYHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordYCollectionID));
-  Pos_Y_itr = PosYHitMap->GetMap()->begin();
-
-  //Interaction Coordinate Z
-  G4int InterCoordZCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordZ");
-  PosZHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordZCollectionID));
-  Pos_Z_itr = PosXHitMap->GetMap()->begin();
-
-  //Interaction Coordinate Angle Theta
-  G4int InterCoordAngThetaCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordAngTheta");
-  AngThetaHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordAngThetaCollectionID));
-  Ang_Theta_itr = AngThetaHitMap->GetMap()->begin();
-
-  //Interaction Coordinate Angle Phi
-  G4int InterCoordAngPhiCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordAngPhi");	
-  AngPhiHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordAngPhiCollectionID));
-  Ang_Phi_itr = AngPhiHitMap->GetMap()->begin();			
-
-  // Read the Scorer associate to the SiLi
-  //Energy
-  G4int SiLiEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiEnergy");
-  SiLiEnergyHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(SiLiEnergyCollectionID));
-  SiLiEnergy_itr = SiLiEnergyHitMap->GetMap()->begin();
-
-  G4int SiLiPadNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiPadNbr");
-  SiLiPadNbrHitMap = (NPS::HitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(SiLiPadNbrCollectionID));
-  SiLiPadNbr_itr = SiLiPadNbrHitMap->GetMap()->begin();
-
-  // Read the Scorer associate to the CsI crystal
-  //Energy
-  G4int CsIEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsIEnergy");
-  CsIEnergyHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(CsIEnergyCollectionID));
-  CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin();
-
-  G4int CsICristalNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsICristalNbr");
-  CsICristalNbrHitMap = (NPS::HitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(CsICristalNbrCollectionID));
-  CsICristalNbr_itr = CsICristalNbrHitMap->GetMap()->begin();
-
-
   /////////////////////
-
-  G4int sizeN = DetectorNumberHitMap->entries();
-  G4int sizeE = EnergyHitMap->entries();
-  G4int sizeT = TimeHitMap->entries();
-  G4int sizeX = XHitMap->entries();
-  G4int sizeY = YHitMap->entries();
-
-  // Loop on Telescope Number entry
-  for (G4int l = 0 ; l < sizeN ; l++) {
-    G4int N         =  *(DetectorNumber_itr->second);
-    G4int NTrackID  =   DetectorNumber_itr->first - N;
-
-
-    if (N > 0) {
-
-      m_Event->SetMMStripXEDetectorNbr(N) ;
-      m_Event->SetMMStripYEDetectorNbr(N) ;
-      m_Event->SetMMStripXTDetectorNbr(N) ;
-      m_Event->SetMMStripYTDetectorNbr(N) ;
-
-      //  Energy
-      Energy_itr = EnergyHitMap->GetMap()->begin();
-      for (G4int h = 0 ; h < sizeE ; h++) {
-        G4int ETrackID  =   Energy_itr->first - N;
-        G4double E      = *(Energy_itr->second);
-
-        if (ETrackID == NTrackID) {
-          m_Event->SetMMStripXEEnergy(RandGauss::shoot(E, ResoStrip));
-          m_Event->SetMMStripYEEnergy(RandGauss::shoot(E, ResoStrip));
-        }
-
-        Energy_itr++;
-      }
-
-
-      //  Time
-      Time_itr = TimeHitMap->GetMap()->begin();
-      for (G4int h = 0 ; h < sizeT ; h++) {
-        G4int TTrackID  =   Time_itr->first - N;
-        G4double T      = *(Time_itr->second);
-
-        if (TTrackID == NTrackID) {
-          m_Event->SetMMStripXTTime(RandGauss::shoot(T, ResoTimeMust)) ;
-          m_Event->SetMMStripYTTime(RandGauss::shoot(T, ResoTimeMust)) ;
-        }
-
-        Time_itr++;
-      }
-
-
-      // X
-      X_itr = XHitMap->GetMap()->begin();
-      for (G4int h = 0 ; h < sizeX ; h++) {
-        G4int XTrackID  =   X_itr->first  - N;
-        G4int X         = *(X_itr->second);
-        if (XTrackID == NTrackID) {
-          m_Event->SetMMStripXEStripNbr(X);
-          m_Event->SetMMStripXTStripNbr(X);
-        }
-
-        X_itr++;
+  // Read the Scorer associate to the Silicon Strip
+  SILICONSCORERS::PS_Silicon_Images* SiScorer = (SILICONSCORERS::PS_Silicon_Images*) m_StripScorer->GetPrimitive(0);
+
+  set<int> trig; // list of telescope that got a Si trigger
+  vector<unsigned int> indexes = SiScorer->GetIndexes();
+  unsigned int size = indexes.size();
+  for(unsigned int i = 0 ;i<size;i++){
+    unsigned int index = indexes[i];
+    double energy = SiScorer->GetEnergy(index);
+    double energyX = RandGauss::shoot(energy, ResoStrip);
+    double energyY= RandGauss::shoot(energy, ResoStrip);
+    int detectorNbr = SiScorer->GetDetectorNbr(index); 
+    double time = SiScorer->GetTime(index);
+    // X
+    if(energyX>0.1*keV){ // above threshold
+      // Pixel value at interaction point
+      unsigned int a,r,g,b;
+      //  pixel
+      SiScorer->GetARGBFront(indexes[i],a,r,g,b);
+      if(r==0){
+        trig.insert(detectorNbr);
+        // Energy 
+        m_Event->SetMMStripXEDetectorNbr(detectorNbr);
+        m_Event->SetMMStripXEStripNbr(b+1);
+        m_Event->SetMMStripXEEnergy(energyX);
+
+        // Time 
+        m_Event->SetMMStripXTDetectorNbr(detectorNbr);
+        m_Event->SetMMStripXTStripNbr(b+1);
+        m_Event->SetMMStripXTTime(RandGauss::shoot(time, ResoTimeMust));
       }
-
-      // Y
-      Y_itr = YHitMap->GetMap()->begin()  ;
-      for (G4int h = 0 ; h < sizeY ; h++) {
-        G4int YTrackID  =   Y_itr->first  - N ;
-        G4int Y         = *(Y_itr->second);
-        if (YTrackID == NTrackID) {
-          m_Event->SetMMStripYEStripNbr(Y);
-          m_Event->SetMMStripYTStripNbr(Y);
+      else{ // Interstrip X, keep maximum shared energy
+        double rand = G4UniformRand();
+        if(rand>0.5){
+          energyX = rand*energyX;
+          if(energyX>0.1*keV){
+            trig.insert(detectorNbr);
+            // Energy 
+            m_Event->SetMMStripXEDetectorNbr(detectorNbr);
+            m_Event->SetMMStripXEStripNbr(b+1);
+            m_Event->SetMMStripXEEnergy(energyX);
+
+            // Time 
+            m_Event->SetMMStripXTDetectorNbr(detectorNbr);
+            m_Event->SetMMStripXTStripNbr(b+1);
+            m_Event->SetMMStripXTTime(RandGauss::shoot(time, ResoTimeMust));
+          } 
         }
-
-        Y_itr++;
-      }
-
-      // Pos X
-      Pos_X_itr = PosXHitMap->GetMap()->begin();
-      for (G4int h = 0 ; h < PosXHitMap->entries() ; h++) {
-        G4int PosXTrackID =   Pos_X_itr->first  - N ;
-        G4double PosX     = *(Pos_X_itr->second) ;
-        if (PosXTrackID == NTrackID) {
-          ms_InterCoord->SetDetectedPositionX(PosX) ;
+        else{
+          energyX = (1-rand)*energyX;
+          if(energyX>0.1*keV){
+            trig.insert(detectorNbr);
+
+            // Energy 
+            m_Event->SetMMStripXEDetectorNbr(detectorNbr);
+            m_Event->SetMMStripXEStripNbr(g+1);
+            m_Event->SetMMStripXEEnergy(energyX);
+
+            // Time 
+            m_Event->SetMMStripXTDetectorNbr(detectorNbr);
+            m_Event->SetMMStripXTStripNbr(g+1);
+            m_Event->SetMMStripXTTime(RandGauss::shoot(time, ResoTimeMust));
+          }
         }
-        Pos_X_itr++;
       }
-
-      // Pos Y
-      Pos_Y_itr = PosYHitMap->GetMap()->begin();
-      for (G4int h = 0 ; h < PosYHitMap->entries() ; h++) {
-        G4int PosYTrackID =   Pos_Y_itr->first  - N ;
-        G4double PosY     = *(Pos_Y_itr->second) ;
-        if (PosYTrackID == NTrackID) {
-          ms_InterCoord->SetDetectedPositionY(PosY) ;
-        }
-        Pos_Y_itr++;
+    }
+    // Y
+    if(energyY>0.1*keV){ // above threshold
+      // Pixel value at interaction point
+      unsigned int a,r,g,b;
+      //  pixel
+      SiScorer->GetARGBBack(indexes[i],a,r,g,b);
+      if(r==0){
+        trig.insert(detectorNbr);
+        // Energy 
+        m_Event->SetMMStripYEDetectorNbr(detectorNbr);
+        m_Event->SetMMStripYEStripNbr(b+1);
+        m_Event->SetMMStripYEEnergy(energyY);
+
+        // Time 
+        m_Event->SetMMStripYTDetectorNbr(detectorNbr);
+        m_Event->SetMMStripYTStripNbr(b+1);
+        m_Event->SetMMStripYTTime(RandGauss::shoot(time, ResoTimeMust));
       }
-
-      // Pos Z
-      Pos_Z_itr = PosZHitMap->GetMap()->begin();
-      for (G4int h = 0 ; h < PosZHitMap->entries() ; h++) {
-        G4int PosZTrackID =   Pos_Z_itr->first   - N  ;
-        G4double PosZ     = *(Pos_Z_itr->second)      ;
-        if (PosZTrackID == NTrackID) {
-          ms_InterCoord->SetDetectedPositionZ(PosZ) ;
+      else{ // Interstrip Y, keep both strip with shared energy
+        double rand = G4UniformRand();
+        double energyY1 = rand*energyY;
+        if(energyY1>0.1*keV){
+          trig.insert(detectorNbr);
+
+          // Energy 
+          m_Event->SetMMStripYEDetectorNbr(detectorNbr);
+          m_Event->SetMMStripYEStripNbr(b+1);
+          m_Event->SetMMStripYEEnergy(energyY1);
+
+          // Time 
+          m_Event->SetMMStripYTDetectorNbr(detectorNbr);
+          m_Event->SetMMStripYTStripNbr(b+1);
+          m_Event->SetMMStripYTTime(RandGauss::shoot(time, ResoTimeMust));
         }
-        Pos_Z_itr++;
-      }
 
-      // Angle Theta
-      Ang_Theta_itr = AngThetaHitMap->GetMap()->begin();
-      for (G4int h = 0 ; h < AngThetaHitMap->entries(); h++) {
-        G4int AngThetaTrackID =   Ang_Theta_itr->first  - N   ;
-        G4double AngTheta     = *(Ang_Theta_itr->second)      ;
-        if (AngThetaTrackID == NTrackID) {
-          ms_InterCoord->SetDetectedAngleTheta(AngTheta) ;
+        if(energyY1>0.1*keV){
+          trig.insert(detectorNbr);
+          double energyY2 = (1-rand)*energyY;
+          // Energy 
+          m_Event->SetMMStripYEDetectorNbr(detectorNbr);
+          m_Event->SetMMStripYEStripNbr(g+1);
+          m_Event->SetMMStripYEEnergy(energyY2);
+
+          // Time 
+          m_Event->SetMMStripYTDetectorNbr(detectorNbr);
+          m_Event->SetMMStripYTStripNbr(g+1);
+          m_Event->SetMMStripYTTime(RandGauss::shoot(time, ResoTimeMust));
         }
-        Ang_Theta_itr++;
       }
+    }
+  }
 
-      // Angle Phi
-      Ang_Phi_itr = AngPhiHitMap->GetMap()->begin();
-      for (G4int h = 0 ; h < AngPhiHitMap->entries() ; h++) {
-        G4int AngPhiTrackID =   Ang_Phi_itr->first  - N   ;
-        G4double AngPhi     = *(Ang_Phi_itr->second)      ;
-        if (AngPhiTrackID == NTrackID) {
-          ms_InterCoord->SetDetectedAnglePhi(AngPhi) ;
-        }
-        Ang_Phi_itr++;
-      }
-
-      // Si(Li)
-      SiLiEnergy_itr = SiLiEnergyHitMap->GetMap()->begin() ;
-      SiLiPadNbr_itr = SiLiPadNbrHitMap->GetMap()->begin() ;
-
-      for (G4int h = 0 ; h < SiLiEnergyHitMap->entries() ; h++) {
-        G4int SiLiEnergyTrackID =   SiLiEnergy_itr->first  -N ;
-        G4double SiLiEnergy     = *(SiLiEnergy_itr->second)   ;
-
-        G4int PadNbr = *(SiLiPadNbr_itr->second)   ;
+  // Si(Li)
+  NPS::HitsMap<G4double*>* SiLiHitMap;
+  std::map<G4int, G4double**>::iterator SiLi_itr;
 
-        if (SiLiEnergyTrackID == NTrackID) {
-          m_Event->SetMMSiLiEEnergy(RandGauss::shoot(SiLiEnergy, ResoSiLi)) ;
-          m_Event->SetMMSiLiEPadNbr(PadNbr);
-          m_Event->SetMMSiLiTPadNbr(PadNbr);
-          m_Event->SetMMSiLiTTime(1);
-          m_Event->SetMMSiLiTDetectorNbr(N);
-          m_Event->SetMMSiLiEDetectorNbr(N);
-        }
+  G4int SiLiCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiScorer");
+  SiLiHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(SiLiCollectionID));
 
-        SiLiEnergy_itr++	;
-        SiLiPadNbr_itr++	;
+  // CsI
+  NPS::HitsMap<G4double*>* CsIHitMap;
+  std::map<G4int, G4double**>::iterator CsI_itr;
+
+  G4int CsICollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsIScorer");
+  CsIHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CsICollectionID));
+
+
+  // Look for SiLi data in Trigg Telescope
+  std::set<int>::iterator itr;
+  for(itr=trig.begin();itr!=trig.end();itr++){
+    for(SiLi_itr = SiLiHitMap->GetMap()->begin(); SiLi_itr!=SiLiHitMap->GetMap()->end() ; SiLi_itr++){
+      G4double* Info = *(SiLi_itr->second);
+      if(Info[7]==*itr){//matching telescope number
+        m_Event->SetMMSiLiEDetectorNbr(Info[7]); 
+        m_Event->SetMMSiLiEEnergy(RandGauss::shoot(Info[0],ResoSiLi)); 
+        m_Event->SetMMSiLiEPadNbr(Info[8]);
+        m_Event->SetMMSiLiTDetectorNbr(Info[7]); 
+        m_Event->SetMMSiLiTTime(RandGauss::shoot(Info[1],ResoTimeMust)); 
+        m_Event->SetMMSiLiTPadNbr(Info[8]);
       }
+    }
+  }
 
-      // CsI    
-      CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin()  				;
-      CsICristalNbr_itr = CsICristalNbrHitMap->GetMap()->begin()  ;
-
-      for (G4int h = 0 ; h < CsIEnergyHitMap->entries() ; h++) {
-        G4int CsIEnergyTrackID  =   CsIEnergy_itr->first-N ;
-        G4double CsIEnergy      = *(CsIEnergy_itr->second) ;
-
-        G4int CristalNumber  = *(CsICristalNbr_itr->second) ;
-        if (CsIEnergyTrackID == NTrackID) {
-          m_Event->SetMMCsIEEnergy(RandGauss::shoot(CsIEnergy, ResoCsI*sqrt(CsIEnergy)));
-          m_Event->SetMMCsIECristalNbr(CristalNumber);
-          m_Event->SetMMCsITCristalNbr(CristalNumber);
-          m_Event->SetMMCsITTime(1);
-          m_Event->SetMMCsITDetectorNbr(N);
-          m_Event->SetMMCsIEDetectorNbr(N);
-        }
-
-        CsIEnergy_itr++			;
-        CsICristalNbr_itr++	;
+  // Look for CsI data in Trigg Telescope
+  for(itr=trig.begin();itr!=trig.end();itr++){
+    for(CsI_itr = CsIHitMap->GetMap()->begin(); CsI_itr!=CsIHitMap->GetMap()->end() ; CsI_itr++){
+      G4double* Info = *(CsI_itr->second);
+      
+      if(Info[7]==*itr){//matching telescope number
+        m_Event->SetMMCsIEDetectorNbr(Info[7]); 
+        m_Event->SetMMCsIEEnergy(RandGauss::shoot(Info[0],ResoCsI)); 
+        m_Event->SetMMCsIECristalNbr(Info[8]);
+        m_Event->SetMMCsITDetectorNbr(Info[7]); 
+        m_Event->SetMMCsITTime(RandGauss::shoot(Info[1],ResoTimeMust)); 
+        m_Event->SetMMCsITCristalNbr(Info[8]);
       }
-
     }
-
-    DetectorNumber_itr++;
   }
 
+
+  SiScorer->clear();
   // clear map for next event
-  DetectorNumberHitMap	->clear();
-  EnergyHitMap   			->clear() ;
-  TimeHitMap     			->clear() ;
-  XHitMap        			->clear() ;
-  YHitMap        			->clear() ;
-  SiLiEnergyHitMap			->clear() ;
-  SiLiPadNbrHitMap			->clear() ;
-  CsIEnergyHitMap			->clear() ;
-  CsICristalNbrHitMap		->clear() ;
-  PosXHitMap					->clear() ; 
-  PosYHitMap					->clear() ;
-  PosZHitMap					->clear() ;
-  AngThetaHitMap			->clear() ;
-  AngPhiHitMap				->clear() ;
+  SiLiHitMap->clear() ;
+  CsIHitMap->clear() ;
 }
 
 
@@ -1037,49 +911,26 @@ void MUST2Array::InitializeScorers() {
   // if the scorer were created previously nothing else need to be made
   if(already_exist) return; 
 
-  G4VPrimitiveScorer* DetNbr 									= new OBSOLETEGENERALSCORERS::PSDetectorNumber("DetectorNumber","MUST2Telescope", 0);
-  G4VPrimitiveScorer* Energy 									= new OBSOLETEGENERALSCORERS::PSEnergy("StripEnergy","MUST2Telescope", 0);			
-  G4VPrimitiveScorer* TOF 										= new OBSOLETEGENERALSCORERS::PSTOF("StripTime","MUST2Telescope", 0);          					 		 
-
-  G4VPrimitiveScorer* StripPositionX							= new PSStripNumberX("StripNumberX", 0, SiliconFace, 128);
-  G4VPrimitiveScorer* StripPositionY							= new PSStripNumberY("StripNumberY", 0, SiliconFace, 128);  		
-
-  G4VPrimitiveScorer* InteractionCoordinatesX 				= new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","MUST2Telescope", 0);
-  G4VPrimitiveScorer* InteractionCoordinatesY				= new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","MUST2Telescope", 0);
-  G4VPrimitiveScorer* InteractionCoordinatesZ  			= new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","MUST2Telescope", 0);
-
-  G4VPrimitiveScorer* InteractionCoordinatesAngleTheta	= new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordAngTheta","MUST2Telescope", 0);
-  G4VPrimitiveScorer* InteractionCoordinatesAnglePhi    = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesAnglePhi("InterCoordAngPhi","MUST2Telescope", 0) ;	    
-
+  G4VPrimitiveScorer* SiScorer = new SILICONSCORERS::PS_Silicon_Images("SiScorer","/scratch/nptool/NPLib/Detectors/MUST2/maskFront.png","/scratch/nptool/NPLib/Detectors/MUST2/maskBack.png",0.01,0.01,0,0,0xffff0000,0);
 
   //and register it to the multifunctionnal detector
-  m_StripScorer->RegisterPrimitive(DetNbr);
-  m_StripScorer->RegisterPrimitive(Energy);
-  m_StripScorer->RegisterPrimitive(TOF);
-  m_StripScorer->RegisterPrimitive(StripPositionX);
-  m_StripScorer->RegisterPrimitive(StripPositionY);
-  m_StripScorer->RegisterPrimitive(InteractionCoordinatesX);
-  m_StripScorer->RegisterPrimitive(InteractionCoordinatesY);
-  m_StripScorer->RegisterPrimitive(InteractionCoordinatesZ);
-  m_StripScorer->RegisterPrimitive(InteractionCoordinatesAngleTheta);
-  m_StripScorer->RegisterPrimitive(InteractionCoordinatesAnglePhi);
-
+  m_StripScorer->RegisterPrimitive(SiScorer);
   //	SiLi Associate Scorer
-  G4VPrimitiveScorer* SiLiEnergy 			= new OBSOLETEGENERALSCORERS::PSEnergy("SiLiEnergy","MUST2Telescope", 0) ;
-  G4VPrimitiveScorer* SiLiPadNbr 			= new PSPadOrCristalNumber("SiLiPadNbr",0) ;
-  m_SiLiScorer->RegisterPrimitive(SiLiEnergy);
-  m_SiLiScorer->RegisterPrimitive(SiLiPadNbr);
+  vector<int> SiLi_nesting={3,0};
+  G4VPrimitiveScorer* SiLiScorer= 
+    new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("SiLiScorer",SiLi_nesting) ;
+  m_SiLiScorer->RegisterPrimitive(SiLiScorer);
 
   //	CsI Associate Scorer 
-  G4VPrimitiveScorer* CsIEnergy 		= new OBSOLETEGENERALSCORERS::PSEnergy("CsIEnergy","MUST2Telescope", 0) 	;
-  G4VPrimitiveScorer* CsICristalNbr 	= new PSPadOrCristalNumber("CsICristalNbr",0) ;
-  m_CsIScorer->RegisterPrimitive(CsIEnergy) ;
-  m_CsIScorer->RegisterPrimitive(CsICristalNbr) ;
+  vector<int> CsI_nesting = {2,0};
+  G4VPrimitiveScorer* CsIScorer= 
+    new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("CsIScorer",CsI_nesting, 0) 	;
+  m_CsIScorer->RegisterPrimitive(CsIScorer) ;
 
   //	Add All Scorer to the Global Scorer Manager
-  G4SDManager::GetSDMpointer()->AddNewDetector(m_StripScorer) ;
-  G4SDManager::GetSDMpointer()->AddNewDetector(m_SiLiScorer)	 ;
-  G4SDManager::GetSDMpointer()->AddNewDetector(m_CsIScorer)	 ;
+  G4SDManager::GetSDMpointer()->AddNewDetector(m_StripScorer);
+  G4SDManager::GetSDMpointer()->AddNewDetector(m_SiLiScorer);
+  G4SDManager::GetSDMpointer()->AddNewDetector(m_CsIScorer);
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
diff --git a/NPSimulation/Detectors/MUST2/MUST2Array.hh b/NPSimulation/Detectors/MUST2/MUST2Array.hh
index ff06606ae..68914a94e 100644
--- a/NPSimulation/Detectors/MUST2/MUST2Array.hh
+++ b/NPSimulation/Detectors/MUST2/MUST2Array.hh
@@ -47,7 +47,7 @@ namespace MUST2
 
    const G4double AluStripThickness = 0.4*micrometer ;
    const G4double SiliconThickness  = 300*micrometer ;
-   const G4double SiliconFace       = 98*mm ;
+   const G4double SiliconFace       = 100.42*mm ;
    const G4double VacBoxThickness   = 3*cm ;
 
    const G4double SiLiThickness     = 5.1*mm;  // Must be checked
diff --git a/NPSimulation/Scorers/CalorimeterScorers.cc b/NPSimulation/Scorers/CalorimeterScorers.cc
index c892f401e..ef102b9ce 100644
--- a/NPSimulation/Scorers/CalorimeterScorers.cc
+++ b/NPSimulation/Scorers/CalorimeterScorers.cc
@@ -126,7 +126,6 @@ G4bool PS_CalorimeterWithInteraction::ProcessHits(G4Step* aStep, G4TouchableHist
     Infos[5] = m_Position.theta();
     Infos[6] = m_Position.phi();
     
-    
     for(unsigned int i = 0 ; i < mysize ; i++){
         Infos[i+7] = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_NestingLevel[i]);
     }
diff --git a/NPSimulation/Scorers/SiliconScorers.cc b/NPSimulation/Scorers/SiliconScorers.cc
index acc039beb..f3e176108 100644
--- a/NPSimulation/Scorers/SiliconScorers.cc
+++ b/NPSimulation/Scorers/SiliconScorers.cc
@@ -22,7 +22,159 @@
 #include "SiliconScorers.hh"
 #include "G4UnitsTable.hh"
 using namespace SILICONSCORERS ;
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+PS_Silicon_Images::PS_Silicon_Images(G4String name, string imageFront,string imageBack,double scalingFront, double scalingBack, double centerOffsetX,double centerOffsetY,unsigned int ignoreValue, G4int depth)  :G4VPrimitiveScorer(name, depth),HCID(-1){
+  m_ImageFront = new NPL::Image(imageFront,scalingFront,scalingFront); 
+  m_ImageBack  = new NPL::Image(imageBack,scalingBack,scalingBack); 
+  m_ScalingFront = scalingFront;
+  m_ScalingBack  = scalingBack;
+  m_CenterOffsetX = centerOffsetX;
+  m_CenterOffsetY = centerOffsetY;
+  m_IgnoreValue = ignoreValue;
+  m_Level = depth;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+G4bool PS_Silicon_Images::ProcessHits(G4Step* aStep, G4TouchableHistory*){
+  // contain Energy Time, DetNbr, PixelFront and PixelBack
+  t_Energy = aStep->GetTotalEnergyDeposit();
+  t_Time = aStep->GetPreStepPoint()->GetGlobalTime();
+
+  t_DetectorNbr = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_Level);
+  t_Position  = aStep->GetPreStepPoint()->GetPosition();
+
+  // Interaction coordinates (used to fill the InteractionCoordinates branch)
+  t_X = t_Position.x();
+  t_Y = t_Position.y();
+  t_Z = t_Position.z();
+  t_Theta = t_Position.theta();
+  t_Phi = t_Position.phi();
+
+  t_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(t_Position);
+
+  t_PixelFront = m_ImageFront->GetPixelAtCoordinate(t_Position.x(),t_Position.y());
+  t_PixelBack = m_ImageBack->GetPixelAtCoordinate(t_Position.x(),t_Position.y());
+
+  unsigned int front = (m_ImageFront->GetPixelAtCoordinate(t_Position.x(),t_Position.y()))&0xff;
+  unsigned int back  = (m_ImageBack->GetPixelAtCoordinate(t_Position.x(),t_Position.y()))&0xff;
+
+
+  // If front and back are in inactive part of the wafer,
+  // nothing is added to the map
+  if(t_PixelFront == m_IgnoreValue && t_PixelBack == m_IgnoreValue)
+    return FALSE;
+
+  t_Index =  aStep->GetTrack()->GetTrackID() + t_DetectorNbr * 1e3 ;
+  // Check if the particle has interact before, if yes, add up the energies.
+  map<unsigned int, double>::iterator it;
+  it= m_Energy.find(t_Index);
+  if(it!=m_Energy.end()){
+    double dummy = it->second;
+    t_Energy+=dummy;
+  }
+
+  m_Energy[t_Index] = t_Energy; 
+  m_Time[t_Index] = t_Time;
+  m_DetectorNbr[t_Index] = t_DetectorNbr;
+  m_PixelFront[t_Index] = t_PixelFront;
+  m_PixelBack[t_Index] = t_PixelBack;
+  m_X[t_Index] = t_X;
+  m_Y[t_Index] = t_Y;
+  m_Z[t_Index] = t_Z;
+  m_Theta[t_Index] = t_Theta;
+  m_Phi[t_Index] = t_Phi;
+
+
+  return TRUE;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void PS_Silicon_Images::Initialize(G4HCofThisEvent* HCE){
+}
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void PS_Silicon_Images::EndOfEvent(G4HCofThisEvent*){
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void PS_Silicon_Images::clear(){
+  m_Energy.clear();
+  m_Time.clear();
+  m_DetectorNbr.clear();
+  m_PixelFront.clear();
+  m_PixelBack.clear();
+  m_X.clear();
+  m_Y.clear();
+  m_Z.clear();
+  m_Theta.clear();
+  m_Phi.clear();
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+vector<unsigned int> PS_Silicon_Images::GetIndexes(){
+  vector<unsigned int > indexes;
+  map<unsigned int , double>::iterator it;
+  for(it=m_Energy.begin(); it!=m_Energy.end();it++)
+    indexes.push_back(it->first);
+
+  return indexes;
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+unsigned int PS_Silicon_Images::GetPixelFront(unsigned int index){
+  return  m_PixelFront[index];
+} 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+unsigned int PS_Silicon_Images::GetPixelBack(unsigned int index){
+  return m_PixelBack[index];
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void PS_Silicon_Images::GetARGBFront(unsigned int index,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b){
+  unsigned int Info =m_PixelFront[index];
+  a = (Info>>24)&0xff;
+  r = (Info>>16)&0xff;
+  g = (Info>>8)&0xff;
+  b = (Info>>0)&0xff;
+} 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void PS_Silicon_Images::GetARGBBack(unsigned int index,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b){
+  unsigned int Info =m_PixelBack[index];
+
+  a = (Info>>24)&0xff;
+  r = (Info>>16)&0xff;
+  g = (Info>>8)&0xff;
+  b = (Info>>0)&0xff;
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+double PS_Silicon_Images::GetEnergy(unsigned int index){
+  return m_Energy[index];
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+double PS_Silicon_Images::GetTime(unsigned int index){
+  return m_Time[index];
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+unsigned int PS_Silicon_Images::GetDetectorNbr(unsigned int index){
+  return m_DetectorNbr[index];
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+double PS_Silicon_Images::GetX(unsigned int index){
+  return m_X[index]; 
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+double PS_Silicon_Images::GetY(unsigned int index){
+  return m_Y[index]; 
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+double PS_Silicon_Images::GetZ(unsigned int index){
+  return m_Z[index]; 
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+double PS_Silicon_Images::GetTheta(unsigned int index){
+  return m_Theta[index]; 
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+double PS_Silicon_Images::GetPhi(unsigned int index){
+  return m_Phi[index]; 
+}
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 PS_Silicon_Rectangle::PS_Silicon_Rectangle(G4String name,G4int Level, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4int depth,G4String axis)
   :G4VPrimitiveScorer(name, depth),HCID(-1){
@@ -192,7 +344,7 @@ G4bool PS_Silicon_Annular::ProcessHits(G4Step* aStep, G4TouchableHistory*){
     phi+=2*M_PI;
   m_StripSectorNumber   = (int) ((phi - m_PhiStart)  / m_StripPitchSector ) + 1 ;
   m_StripQuadrantNumber = (int) ((phi - m_PhiStart)  /m_StripPitchQuadrant) + 1 ; 
-  
+
   //Rare case where particle is close to edge of silicon plan
   if (m_StripRingNumber > m_NumberOfStripRing) m_StripRingNumber = m_NumberOfStripRing;
   if (m_StripSectorNumber > m_NumberOfStripSector) m_StripSectorNumber = m_NumberOfStripSector;
diff --git a/NPSimulation/Scorers/SiliconScorers.hh b/NPSimulation/Scorers/SiliconScorers.hh
index 01b4fbffc..ccbc133f0 100644
--- a/NPSimulation/Scorers/SiliconScorers.hh
+++ b/NPSimulation/Scorers/SiliconScorers.hh
@@ -26,13 +26,87 @@
  *****************************************************************************/
 #include "G4VPrimitiveScorer.hh"
 #include "NPSHitsMap.hh"
-
+#include "NPImage.h"
 #include <map>
 using namespace std;
 using namespace CLHEP;
 
 namespace SILICONSCORERS {
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+  //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+  class PS_Silicon_Images : public G4VPrimitiveScorer{
+
+    public: // with description
+      PS_Silicon_Images(G4String name, string imageFront,string imageBack,double scalingFront, double scalingBack, double centerOffsetX,double centerOffsetY,unsigned int ignoreValue, G4int depth=0);
+      ~PS_Silicon_Images(){};
+
+    protected: // with description
+      G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+    public:
+      void Initialize(G4HCofThisEvent*);
+      void EndOfEvent(G4HCofThisEvent*);
+      void clear();
+      void DrawAll(){};
+      void PrintAll(){};
+
+    private: // Geometry of the detector
+      NPL::Image* m_ImageFront; 
+      NPL::Image* m_ImageBack; 
+      double m_ScalingFront;
+      double m_ScalingBack;
+      double m_CenterOffsetX;
+      double m_CenterOffsetY;
+      unsigned int m_IgnoreValue;
+
+      // Level at which to find the copy number linked to the detector number
+      G4int    m_Level;
+
+    private: // inherited from G4VPrimitiveScorer
+      G4int HCID;
+      map<unsigned int,double> m_Energy;
+      map<unsigned int,double> m_Time;
+      map<unsigned int,unsigned int> m_DetectorNbr;
+      map<unsigned int,unsigned int> m_PixelFront;
+      map<unsigned int,unsigned int> m_PixelBack;
+      map<unsigned int,double> m_X;
+      map<unsigned int,double> m_Y;
+      map<unsigned int,double> m_Z;
+      map<unsigned int,double> m_Theta;
+      map<unsigned int,double> m_Phi;
+
+    private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit)
+     G4ThreeVector t_Position;
+     unsigned int t_Index;
+     double t_Energy;
+     double t_Time;
+     unsigned int t_DetectorNbr;
+     unsigned int t_PixelFront;
+     unsigned int t_PixelBack;
+     double t_X;
+     double t_Y;
+     double t_Z;
+     double t_Theta;
+     double t_Phi;
+
+    public: // information accessor
+      vector<unsigned int> GetIndexes();
+      unsigned int GetPixelFront(unsigned int index); 
+      unsigned int GetPixelBack(unsigned int index);
+      void GetARGBFront(unsigned int index,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b); 
+      void GetARGBBack(unsigned int index,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b);
+
+      double GetEnergy(unsigned int index);
+      double GetTime(unsigned int index);
+      unsigned int GetDetectorNbr(unsigned int index);
+      double GetX(unsigned int index);
+      double GetY(unsigned int index);
+      double GetZ(unsigned int index);
+      double GetTheta(unsigned int index);
+      double GetPhi(unsigned int index);
+
+  };
+
+  //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 
   struct RectangularOutput {
     G4double totalEnergy;
@@ -48,46 +122,46 @@ namespace SILICONSCORERS {
   };
 
   class PS_Silicon_Rectangle : public G4VPrimitiveScorer{
-    
-  public: // with description
-    PS_Silicon_Rectangle(G4String name, G4int Level, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4int depth=0,G4String axis="xy");
-     ~PS_Silicon_Rectangle();
-
-  protected: // with description
-     G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-    
-  public:
-    void Initialize(G4HCofThisEvent*);
-    void EndOfEvent(G4HCofThisEvent*);
-    void clear();
-    void DrawAll();
-    void PrintAll();
-  
-  private: // Geometry of the detector
-    G4double m_StripPlaneLength;
-    G4double m_StripPlaneWidth;
-    G4int    m_NumberOfStripLength;
-    G4int    m_NumberOfStripWidth;
-    G4double m_StripPitchLength;
-    G4double m_StripPitchWidth;
-    G4String m_Axis;
-    // Level at which to find the copy number linked to the detector number
-    G4int    m_Level;
-
-  private: // inherited from G4VPrimitiveScorer
-    G4int HCID;
-    NPS::HitsMap<G4double*>* EvtMap;
-    
-  private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit)
-    G4ThreeVector m_Position  ;
-    G4int m_DetectorNumber    ;
-    G4int m_StripLengthNumber ;
-    G4int m_StripWidthNumber  ;
-    G4int m_Index             ;
-    
+
+    public: // with description
+      PS_Silicon_Rectangle(G4String name, G4int Level, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4int depth=0,G4String axis="xy");
+      ~PS_Silicon_Rectangle();
+
+    protected: // with description
+      G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+    public:
+      void Initialize(G4HCofThisEvent*);
+      void EndOfEvent(G4HCofThisEvent*);
+      void clear();
+      void DrawAll();
+      void PrintAll();
+
+    private: // Geometry of the detector
+      G4double m_StripPlaneLength;
+      G4double m_StripPlaneWidth;
+      G4int    m_NumberOfStripLength;
+      G4int    m_NumberOfStripWidth;
+      G4double m_StripPitchLength;
+      G4double m_StripPitchWidth;
+      G4String m_Axis;
+      // Level at which to find the copy number linked to the detector number
+      G4int    m_Level;
+
+    private: // inherited from G4VPrimitiveScorer
+      G4int HCID;
+      NPS::HitsMap<G4double*>* EvtMap;
+
+    private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit)
+      G4ThreeVector m_Position  ;
+      G4int m_DetectorNumber    ;
+      G4int m_StripLengthNumber ;
+      G4int m_StripWidthNumber  ;
+      G4int m_Index             ;
+
   };
-  
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+
+  //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 
   struct AnnularOutput {
     G4double totalEnergy;
@@ -104,51 +178,51 @@ namespace SILICONSCORERS {
   };
 
   class PS_Silicon_Annular : public G4VPrimitiveScorer{
-    
-  public: // with description
-    PS_Silicon_Annular(G4String name,G4int Level, G4double StripPlaneInnerRadius, G4double StripPlaneOuterRadius, G4double PhiStart,G4double PhiStop, G4int NumberOfStripRing,G4int NumberOfStripSector=1, G4int NumberOfQuadrant=1,G4int depth=0);
-    ~PS_Silicon_Annular();
-    
-  protected: // with description
-    G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-    
-  public:
-    void Initialize(G4HCofThisEvent*);
-    void EndOfEvent(G4HCofThisEvent*);
-    void clear();
-    void DrawAll();
-    void PrintAll();
-    
-  private: // Geometry of the detector
-    G4double m_StripPlaneInnerRadius;
-    G4double m_StripPlaneOuterRadius;
-    G4double m_PhiStart;
-    G4double m_PhiStop;
-    G4int    m_NumberOfStripRing;
-    G4int    m_NumberOfStripSector;
-    G4int    m_NumberOfStripQuadrant;
-    G4double m_StripPitchRing;
-    G4double m_StripPitchSector;
-    G4double m_StripPitchQuadrant; 
-    G4String m_Axis;
-    // Level at which to find the copy number linked to the detector number
-    G4int    m_Level;
-
-  private: // inherited from G4VPrimitiveScorer
-    G4int HCID;
-    NPS::HitsMap<G4double*>* EvtMap;
-
-  private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit)
-    G4ThreeVector m_Position    ;
-    G4ThreeVector m_uz          ;
-    G4int m_DetectorNumber      ;
-    G4int m_StripRingNumber   ;
-    G4int m_StripSectorNumber    ;
-    G4int m_StripQuadrantNumber ;
-    G4int m_Index               ;
-    
+
+    public: // with description
+      PS_Silicon_Annular(G4String name,G4int Level, G4double StripPlaneInnerRadius, G4double StripPlaneOuterRadius, G4double PhiStart,G4double PhiStop, G4int NumberOfStripRing,G4int NumberOfStripSector=1, G4int NumberOfQuadrant=1,G4int depth=0);
+      ~PS_Silicon_Annular();
+
+    protected: // with description
+      G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+    public:
+      void Initialize(G4HCofThisEvent*);
+      void EndOfEvent(G4HCofThisEvent*);
+      void clear();
+      void DrawAll();
+      void PrintAll();
+
+    private: // Geometry of the detector
+      G4double m_StripPlaneInnerRadius;
+      G4double m_StripPlaneOuterRadius;
+      G4double m_PhiStart;
+      G4double m_PhiStop;
+      G4int    m_NumberOfStripRing;
+      G4int    m_NumberOfStripSector;
+      G4int    m_NumberOfStripQuadrant;
+      G4double m_StripPitchRing;
+      G4double m_StripPitchSector;
+      G4double m_StripPitchQuadrant; 
+      G4String m_Axis;
+      // Level at which to find the copy number linked to the detector number
+      G4int    m_Level;
+
+    private: // inherited from G4VPrimitiveScorer
+      G4int HCID;
+      NPS::HitsMap<G4double*>* EvtMap;
+
+    private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit)
+      G4ThreeVector m_Position    ;
+      G4ThreeVector m_uz          ;
+      G4int m_DetectorNumber      ;
+      G4int m_StripRingNumber   ;
+      G4int m_StripSectorNumber    ;
+      G4int m_StripQuadrantNumber ;
+      G4int m_Index               ;
+
   };
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+  //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
   struct ResistiveOutput {
     G4double upstreamEnergy;
     G4double downstreamEnergy;
@@ -163,42 +237,42 @@ namespace SILICONSCORERS {
   };
 
   class PS_Silicon_Resistive : public G4VPrimitiveScorer{
-    
-  public: // with description
-    PS_Silicon_Resistive(G4String name, G4int Level,
-                         G4double StripPlaneLength, G4double StripPlaneWidth,
-                         G4int NumberOfStripWidth,G4int depth=0);
-    
-    ~PS_Silicon_Resistive();
-    
-  protected: // with description
-    G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-    
-  public:
-    void Initialize(G4HCofThisEvent*);
-    void EndOfEvent(G4HCofThisEvent*);
-    void clear();
-    void DrawAll();
-    void PrintAll();
-    
-  private: // Geometry of the detector
-    G4double m_StripPlaneLength;
-    G4double m_StripPlaneWidth;
-    G4int    m_NumberOfStripWidth;
-    G4double m_StripPitchWidth;
-    // Level at which to find the copy number linked to the detector number
-    G4int    m_Level;
-   
-  private: // inherited from G4VPrimitiveScorer
-    G4int HCID;
-    NPS::HitsMap<G4double*>* EvtMap;
-    
-  private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit)
-    G4ThreeVector m_Position  ;
-    G4int m_DetectorNumber    ;
-    G4int m_StripWidthNumber  ;
-    G4int m_Index             ;
-    
+
+    public: // with description
+      PS_Silicon_Resistive(G4String name, G4int Level,
+          G4double StripPlaneLength, G4double StripPlaneWidth,
+          G4int NumberOfStripWidth,G4int depth=0);
+
+      ~PS_Silicon_Resistive();
+
+    protected: // with description
+      G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+    public:
+      void Initialize(G4HCofThisEvent*);
+      void EndOfEvent(G4HCofThisEvent*);
+      void clear();
+      void DrawAll();
+      void PrintAll();
+
+    private: // Geometry of the detector
+      G4double m_StripPlaneLength;
+      G4double m_StripPlaneWidth;
+      G4int    m_NumberOfStripWidth;
+      G4double m_StripPitchWidth;
+      // Level at which to find the copy number linked to the detector number
+      G4int    m_Level;
+
+    private: // inherited from G4VPrimitiveScorer
+      G4int HCID;
+      NPS::HitsMap<G4double*>* EvtMap;
+
+    private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit)
+      G4ThreeVector m_Position  ;
+      G4int m_DetectorNumber    ;
+      G4int m_StripWidthNumber  ;
+      G4int m_Index             ;
+
   };
 
 }
-- 
GitLab