From 9f03027c5c35361e23bbd11a5737b369f1bd5ddf Mon Sep 17 00:00:00 2001
From: Nicolas de Sereville <deserevi@ipno.in2p3.fr>
Date: Thu, 15 Jan 2015 18:11:09 +0100
Subject: [PATCH] + Add rectangular shapes for Gaspard + Update MUGAST geometry
 so rectangular detectors are now taken   into account

---
 Inputs/DetectorConfiguration/MUGAST.detector  |  45 +-
 NPLib/GASPARD/GaspardTracker.cxx              |  16 +
 NPLib/GASPARD/GaspardTrackerRectangle.cxx     | 526 +++++++++++
 NPLib/GASPARD/GaspardTrackerRectangle.h       | 119 +++
 NPLib/GASPARD/GaspardTrackerRectangle.o       | Bin 0 -> 76576 bytes
 NPLib/GASPARD/GaspardTrackerTrapezoid.cxx     |   8 +-
 NPLib/GASPARD/Makefile                        |   4 +-
 NPSimulation/GASPARD/GaspardTracker.cc        |  19 +
 NPSimulation/GASPARD/GaspardTrackerAnnular.hh |   4 +-
 NPSimulation/GASPARD/GaspardTrackerModule.cc  |   1 +
 .../GASPARD/GaspardTrackerRectangle.cc        | 821 ++++++++++++++++++
 .../GASPARD/GaspardTrackerRectangle.hh        | 182 ++++
 .../GASPARD/GaspardTrackerTrapezoid.hh        |  30 +-
 13 files changed, 1726 insertions(+), 49 deletions(-)
 create mode 100644 NPLib/GASPARD/GaspardTrackerRectangle.cxx
 create mode 100644 NPLib/GASPARD/GaspardTrackerRectangle.h
 create mode 100644 NPLib/GASPARD/GaspardTrackerRectangle.o
 create mode 100644 NPSimulation/GASPARD/GaspardTrackerRectangle.cc
 create mode 100644 NPSimulation/GASPARD/GaspardTrackerRectangle.hh

diff --git a/Inputs/DetectorConfiguration/MUGAST.detector b/Inputs/DetectorConfiguration/MUGAST.detector
index 81bedc361..c73db9923 100644
--- a/Inputs/DetectorConfiguration/MUGAST.detector
+++ b/Inputs/DetectorConfiguration/MUGAST.detector
@@ -1,9 +1,9 @@
-}%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1
 GeneralTarget
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1
 Target
-	THICKNESS= 18
+	THICKNESS= 1
 	RADIUS=	7.5
 	MATERIAL= CD2
 	X= 0
@@ -29,8 +29,8 @@ GPDTrapezoid
    X128_Y1=	     122.368   54.712   -71.098
    X1_Y1=		      57.084  119.996   -71.098
    FIRSTSTAGE=    1
-   SECONDSTAGE=   1
-   THIRDSTAGE=    1
+   SECONDSTAGE=   0
+   THIRDSTAGE=    0
    VIS= all
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2
 GPDTrapezoid
@@ -62,33 +62,26 @@ GPDTrapezoid
    SECONDSTAGE= 0
    THIRDSTAGE= 0
    VIS= all
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel
-<<<<<<< HEAD
-%GPDSquare
-   X1_Y1= -61.823 128.742 53.5
-   X128_Y1= -61.823 128.742 -58.5
-   X1_Y128= -132.251 58.314 -58.5
-   X128_Y128= -132.251 58.314 53.5
-=======
-GPDSquare
-   X128_Y1= -61.823 128.742 53.5
-   X1_Y128= -61.823 128.742 -58.5
-   X128_Y128= -132.251 58.314 -58.5
-   X1_Y1= -132.251 58.314 53.5
->>>>>>> f6b4686ada3bd21e20e035ddb4e9549f9980aa08
+GPDRectangle
+   X1_Y1=     -132.251  58.314   53.5
+   X128_Y1=    -61.823 128.742   53.5
+   X1_Y128=   -132.251 58.314   -58.5
+   X128_Y128=  -61.823 128.742  -58.5
    FIRSTSTAGE= 1
-   SECONDSTAGE= 1
-   THIRDSTAGE= 1
+   SECONDSTAGE= 0 
+   THIRDSTAGE= 0
    VIS= all
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2
-%GPDSquare
-   X1_Y1=      -134.75   47.281 53.5
-   X128_Y1=    -134.75   47.281 -58.5
-   X1_Y128=    -134.75  -52.319 -58.5
-   X128_Y128=  -134.75  -52.319 53.5
+GPDRectangle
+   X1_Y1=     -134.75  -52.319  53.5
+   X128_Y1=   -134.75   47.281  53.5
+   X1_Y128=   -134.75  -52.319 -58.5
+   X128_Y128= -134.75   47.281 -58.5
    FIRSTSTAGE= 1
-   SECONDSTAGE= 1
-   THIRDSTAGE= 1
+   SECONDSTAGE= 0
+   THIRDSTAGE= 0
    VIS= all
 
 
diff --git a/NPLib/GASPARD/GaspardTracker.cxx b/NPLib/GASPARD/GaspardTracker.cxx
index c3f1479bd..af49f5ef6 100644
--- a/NPLib/GASPARD/GaspardTracker.cxx
+++ b/NPLib/GASPARD/GaspardTracker.cxx
@@ -44,6 +44,7 @@
 #include "GaspardTrackerTrapezoid.h"
 #include "GaspardTrackerAnnular.h"
 #include "GaspardTrackerSquare.h"
+#include "GaspardTrackerRectangle.h"
 
 using namespace std ;   
 
@@ -80,6 +81,7 @@ void GaspardTracker::ReadConfiguration(string Path)
    ConfigFile.open(Path.c_str());
 
    bool GPDTrkSquare     = false;
+   bool GPDTrkRectangle  = false;
    bool GPDTrkTrapezoid  = false;
    bool GPDTrkAnnular    = false;
    bool GPDTrkDummyShape = false;
@@ -101,6 +103,20 @@ void GaspardTracker::ReadConfiguration(string Path)
          myDetector->ReadConfiguration(Path);
          ConfigFile.open(Path.c_str());
       }
+      else if (LineBuffer.compare(0, 12, "GPDRectangle") == 0  &&  GPDTrkRectangle == false) {
+         GPDTrkRectangle = true;
+
+         // instantiate a new "detector" corresponding to the Rectangle elements
+         GaspardTrackerModule* myDetector = new GaspardTrackerRectangle(m_ModulesMap, m_EventPhysics);
+
+         // Pass the data object to the GaspardTracker*** object
+         myDetector->SetGaspardDataPointer(m_EventData);
+
+         // read part of the configuration file corresponding to trapezoid elements
+         ConfigFile.close();
+         myDetector->ReadConfiguration(Path);
+         ConfigFile.open(Path.c_str());
+      }
       else if (LineBuffer.compare(0, 12, "GPDTrapezoid") == 0  &&  GPDTrkTrapezoid == false) {
          GPDTrkTrapezoid = true;
 
diff --git a/NPLib/GASPARD/GaspardTrackerRectangle.cxx b/NPLib/GASPARD/GaspardTrackerRectangle.cxx
new file mode 100644
index 000000000..f8e4e1a30
--- /dev/null
+++ b/NPLib/GASPARD/GaspardTrackerRectangle.cxx
@@ -0,0 +1,526 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2014   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:                  contact address:                        *
+ *                                                                           *
+ * Creation Date  :                                                          *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *                                                                           *
+ *                                                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+#include "GaspardTrackerRectangle.h"
+
+// C++ headers
+#include <limits>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <cmath>
+#include <stdlib.h>
+
+// Gaspard
+#include "TGaspardTrackerPhysics.h"
+
+
+GaspardTrackerRectangle::GaspardTrackerRectangle(map<int, GaspardTrackerModule*> &Module,
+                                                 TGaspardTrackerPhysics* &EventPhysics) 
+   : m_ModuleTest(Module),
+          m_EventPhysics(EventPhysics),
+          m_EventData(0),
+          m_PreTreatData(new TGaspardTrackerData),
+          m_NumberOfModule(0),
+          m_FirstStageLength(112),   // mm
+          m_FirstStageWidth(99.6),   // mm
+          m_NumberOfStrips(128)
+{
+   m_StripPitchX = m_FirstStageWidth  / (double)m_NumberOfStrips;
+   m_StripPitchY = m_FirstStageLength / (double)m_NumberOfStrips;
+}
+
+
+
+GaspardTrackerRectangle::~GaspardTrackerRectangle()
+{
+   delete m_PreTreatData;
+}
+
+
+
+void GaspardTrackerRectangle::ReadConfiguration(string Path)
+{
+   ifstream ConfigFile;
+   ConfigFile.open(Path.c_str());
+   string LineBuffer;
+   string DataBuffer;
+
+   // A:X1_Y1     --> X:1    Y:1
+   // B:X128_Y1   --> X:128  Y:1
+   // C:X1_Y128   --> X:1    Y:128
+   // D:X128_Y128 --> X:128  Y:128
+
+   double   Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz;
+   TVector3 A, B, C, D;
+   double   Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0;
+
+   bool check_A = false;
+   bool check_C = false;
+   bool check_B = false;
+   bool check_D = false;
+
+   bool check_Theta = false;
+   bool check_Phi   = false;
+   bool check_R     = false;
+   bool check_beta  = false;
+
+   bool ReadingStatus = false;
+
+   while (!ConfigFile.eof()) {
+      getline(ConfigFile, LineBuffer);
+
+      // If line is a GaspardXXX bloc, reading toggle to true
+      // and toggle to true flags indicating which shape is treated.
+      if (LineBuffer.compare(0, 12, "GPDRectangle") == 0) {
+         cout << "///////////////////////" << endl;
+         cout << "Rectangle module found:" << endl;
+         ReadingStatus = true;
+      }
+
+      // Reading Block
+      while (ReadingStatus) {
+         ConfigFile >> DataBuffer ;
+         // Comment Line 
+         if (DataBuffer.compare(0, 1, "%") == 0) {
+            ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' );
+         }
+         // Finding another telescope (safety), toggle out
+         else if (DataBuffer.compare(0, 12, "GPDRectangle") == 0) {
+            cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl;
+            ReadingStatus = false;
+         }
+
+         // Position method
+         else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) {
+            check_A = true;
+            ConfigFile >> DataBuffer;
+            Ax = atof(DataBuffer.c_str());
+            Ax = Ax;
+            ConfigFile >> DataBuffer;
+            Ay = atof(DataBuffer.c_str());
+            Ay = Ay;
+            ConfigFile >> DataBuffer;
+            Az = atof(DataBuffer.c_str());
+            Az = Az;
+
+            A = TVector3(Ax, Ay, Az);
+            cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl;
+         }
+         else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) {
+            check_B = true;
+            ConfigFile >> DataBuffer;
+            Bx = atof(DataBuffer.c_str());
+            Bx = Bx;
+            ConfigFile >> DataBuffer;
+            By = atof(DataBuffer.c_str());
+            By = By;
+            ConfigFile >> DataBuffer;
+            Bz = atof(DataBuffer.c_str());
+            Bz = Bz;
+
+            B = TVector3(Bx, By, Bz);
+            cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl;
+         }
+         else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) {
+            check_C = true;
+            ConfigFile >> DataBuffer;
+            Cx = atof(DataBuffer.c_str());
+            Cx = Cx;
+            ConfigFile >> DataBuffer;
+            Cy = atof(DataBuffer.c_str());
+            Cy = Cy;
+            ConfigFile >> DataBuffer;
+            Cz = atof(DataBuffer.c_str());
+            Cz = Cz;
+
+            C = TVector3(Cx, Cy, Cz);
+            cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl;
+         }
+         else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) {
+            check_D = true;
+            ConfigFile >> DataBuffer;
+            Dx = atof(DataBuffer.c_str());
+            Dx = Dx;
+            ConfigFile >> DataBuffer;
+            Dy = atof(DataBuffer.c_str());
+            Dy = Dy;
+            ConfigFile >> DataBuffer;
+            Dz = atof(DataBuffer.c_str());
+            Dz = Dz;
+
+            D = TVector3(Dx, Dy, Dz);
+            cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl;
+         } // End Position Method
+
+         // Angle method
+         else if (DataBuffer.compare(0, 6, "THETA=") == 0) {
+            check_Theta = true;
+            ConfigFile >> DataBuffer;
+            Theta = atof(DataBuffer.c_str());
+            Theta = Theta;
+            cout << "Theta:  " << Theta << endl;
+         }
+         else if (DataBuffer.compare(0, 4, "PHI=") == 0) {
+            check_Phi = true;
+            ConfigFile >> DataBuffer;
+            Phi = atof(DataBuffer.c_str());
+            Phi = Phi;
+            cout << "Phi:  " << Phi << endl;
+         }
+         else if (DataBuffer.compare(0, 2, "R=") == 0) {
+            check_R = true;
+            ConfigFile >> DataBuffer;
+            R = atof(DataBuffer.c_str());
+            R = R;
+            cout << "R:  " << R << endl;
+         }
+         else if (DataBuffer.compare(0, 5, "BETA=") == 0) {
+            check_beta = true;
+            ConfigFile >> DataBuffer;
+            beta_u = atof(DataBuffer.c_str());
+            beta_u = beta_u;
+            ConfigFile >> DataBuffer;
+            beta_v = atof(DataBuffer.c_str());
+            beta_v = beta_v;
+            ConfigFile >> DataBuffer;
+            beta_w = atof(DataBuffer.c_str());
+            beta_w = beta_w;
+            cout << "Beta:  " << beta_u << " " << beta_v << " " << beta_w << endl;
+         }
+
+         /////////////////////////////////////////////////
+         // If All necessary information there, toggle out
+         if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) {
+            ReadingStatus = false;
+
+            // Add The previously define telescope
+            // With position method
+            if ( check_A && check_B && check_C && check_D ) {
+               AddModule(A, B, C, D);
+               m_ModuleTest[m_index["Rectangle"] + m_NumberOfModule] = this;
+            }
+
+            // with angle method
+            else if ( check_Theta && check_Phi && check_R && check_beta ) {
+               AddModule(Theta, Phi, R, beta_u, beta_v, beta_w);
+               m_ModuleTest[m_index["Rectangle"] + m_NumberOfModule] = this;
+            }
+
+            // reset boolean flag for point positioning
+            check_A = false;
+            check_B = false;
+            check_C = false;
+            check_D = false;
+            // reset boolean flag for angle positioning
+            check_Theta = false;
+            check_Phi   = false;
+            check_R     = false;
+            check_beta  = false;
+
+         } // end test for adding a module
+      } // end while for reading block
+   } // end while for reading file
+
+   cout << endl << "/////////////////////////////" << endl<<endl;
+}
+
+
+
+void GaspardTrackerRectangle::PreTreat()
+{
+}
+
+
+
+void GaspardTrackerRectangle::BuildPhysicalEvent()
+{
+   // Check flags
+//   bool Check_FirstStage  = false;
+   bool Check_SecondStage = false;
+   bool Check_ThirdStage  = false;
+
+   // Thresholds
+/*
+   double FirstStage_Front_E_Threshold = 0; double FirstStage_Front_T_Threshold = 0;
+   double FirstStage_Back_E_Threshold  = 0; double FirstStage_Back_T_Threshold  = 0;
+   double SecondStage_E_Threshold      = 0; double SecondStage_T_Threshold      = 0;
+   double ThirdStage_E_Threshold       = 0; double ThirdStage_T_Threshold       = 0;
+*/
+   // calculate multipicity in the first stage
+   int multXE = m_EventData->GetGPDTrkFirstStageFrontEMult();
+   int multYE = m_EventData->GetGPDTrkFirstStageBackEMult();
+   int multXT = m_EventData->GetGPDTrkFirstStageFrontTMult();
+   int multYT = m_EventData->GetGPDTrkFirstStageBackTMult();
+   // calculate multiplicity of 2nd and third stages
+   int mult2E = m_EventData->GetGPDTrkSecondStageEMult();
+   int mult2T = m_EventData->GetGPDTrkSecondStageTMult();
+   int mult3E = m_EventData->GetGPDTrkThirdStageEMult();
+   int mult3T = m_EventData->GetGPDTrkThirdStageTMult();
+
+   // Deal with multiplicity 1 for the first layer
+   if (multXE==1 && multYE==1 && multXT==1 && multYT==1) {
+      // calculate detector number
+      int det_ref = m_EventData->GetGPDTrkFirstStageFrontEDetectorNbr(0);
+      int detecXE = m_EventData->GetGPDTrkFirstStageFrontEDetectorNbr(0) / det_ref;
+      int detecXT = m_EventData->GetGPDTrkFirstStageFrontTDetectorNbr(0) / det_ref;
+      int detecYE = m_EventData->GetGPDTrkFirstStageBackEDetectorNbr(0) / det_ref;
+      int detecYT = m_EventData->GetGPDTrkFirstStageBackTDetectorNbr(0) / det_ref;
+
+      // case of same detector
+      if (detecXE*detecXT*detecYE*detecYT == 1) {
+         // store module number
+         m_EventPhysics->SetModuleNumber(det_ref);
+         // calculate strip number
+         int stripXE = m_EventData->GetGPDTrkFirstStageFrontEStripNbr(0);
+         int stripXT = m_EventData->GetGPDTrkFirstStageFrontTStripNbr(0);
+         int stripYE = m_EventData->GetGPDTrkFirstStageBackEStripNbr(0);
+         int stripYT = m_EventData->GetGPDTrkFirstStageBackTStripNbr(0);
+
+         // case of same strips on X and Y
+         if (stripXE == stripXT  &&  stripYE == stripYT) {        // here we have a good strip event
+            // various
+//            Check_FirstStage = true;
+            // store strip ID
+            m_EventPhysics->SetFirstStageFrontPosition(stripXE);
+            m_EventPhysics->SetFirstStageBackPosition(stripYE);
+            // get energy from strips and store it
+            double EnergyStripFront = m_EventData->GetGPDTrkFirstStageFrontEEnergy(0);
+            m_EventPhysics->SetFirstStageEnergy(EnergyStripFront);
+            double EnergyTot = EnergyStripFront;
+            // get time from strips and store it
+            double TimeStripBack  = m_EventData->GetGPDTrkFirstStageBackEEnergy(0);
+            m_EventPhysics->SetFirstStageTime(TimeStripBack);
+
+            // check if we have a 2nd stage event
+            if (mult2E==1 && mult2T==1) {
+               Check_SecondStage = true;
+               double EnergySecond = m_EventData->GetGPDTrkSecondStageEEnergy(0);
+               m_EventPhysics->SetSecondStageEnergy(EnergySecond);
+               EnergyTot += EnergySecond;
+            }
+            else if (mult2E>1 || mult2T>1) {
+               cout << "Warning: multiplicity in second stage greater than in firststage" << endl;
+            }
+
+            // check if we have a third stage event
+            if (mult3E==1 && mult3T==1) {
+               Check_ThirdStage = true;
+               double EnergyThird = m_EventData->GetGPDTrkThirdStageEEnergy(0);
+               m_EventPhysics->SetThirdStageEnergy(EnergyThird);
+               EnergyTot += EnergyThird;
+            }
+            else if (mult3E>1 || mult3T>1) {
+               cout << "Warning: multiplicity in third stage greater than in firststage" << endl;
+            }
+
+            // Fill total energy
+            m_EventPhysics->SetTotalEnergy(EnergyTot);
+
+            // Fill default values for second an third stages
+            if (!Check_SecondStage) {
+               m_EventPhysics->SetSecondStageEnergy(-1000);
+               m_EventPhysics->SetSecondStageTime(-1000);
+               m_EventPhysics->SetSecondStagePosition(-1000);
+            }
+            if (!Check_ThirdStage) {
+               m_EventPhysics->SetThirdStageEnergy(-1000);
+               m_EventPhysics->SetThirdStageTime(-1000);
+               m_EventPhysics->SetThirdStagePosition(-1000);
+            }
+         }
+         else {
+            cout << "Not same strips" << endl;
+         }
+      }
+      else {
+         cout << "Not same detector" << endl;
+      }
+   }
+   else {
+/*      cout << "Multiplicity is not one, it is: " << endl;
+      cout << "\tmultXE: " << multXE << endl;
+      cout << "\tmultXT: " << multXT << endl;
+      cout << "\tmultYE: " << multYE << endl;
+      cout << "\tmultYT: " << multYT << endl;*/
+   }
+}
+
+
+
+void GaspardTrackerRectangle::BuildSimplePhysicalEvent()
+{
+}
+
+
+
+void GaspardTrackerRectangle::AddModule(TVector3 C_X1_Y1,
+                                        TVector3 C_X128_Y1,
+                                        TVector3 C_X1_Y128,
+                                        TVector3 C_X128_Y128)
+{
+   m_NumberOfModule++;
+
+   // remove warning using C_X128_Y128
+   C_X128_Y128.Unit();
+
+   // Definition of vectors U and V are *identical* with definition
+   // in NPS.
+   // Vector U parallel to BaseLarge
+   TVector3 U = C_X128_Y1 - C_X1_Y1;
+   U = U.Unit();
+
+   // Vector V parallel to height
+   TVector3 V = C_X1_Y128 - C_X1_Y1;
+   V = V.Unit();
+
+   // Position Vector of Strip Center
+   TVector3 StripCenter = TVector3(0,0,0);
+   // Position Vector of X=1 Y=1 Strip 
+   TVector3 Strip_1_1;
+
+   // Buffer object to fill Position Array
+   vector<double> lineX;
+   vector<double> lineY;
+   vector<double> lineZ;
+
+   vector< vector< double > >   OneModuleStripPositionX;
+   vector< vector< double > >   OneModuleStripPositionY;
+   vector< vector< double > >   OneModuleStripPositionZ;
+
+   // Moving StripCenter to 1.1 corner:
+   Strip_1_1 = C_X1_Y1 + m_StripPitchX/2*U + m_StripPitchY/2*V;
+
+   for (int i = 0; i < m_NumberOfStrips; i++) {
+      lineX.clear();
+      lineY.clear();
+      lineZ.clear();
+
+      for (int j = 0; j < m_NumberOfStrips; j++) {
+         StripCenter = Strip_1_1 + i*m_StripPitchX*U + j*m_StripPitchY*V;
+
+         lineX.push_back( StripCenter.X() );
+         lineY.push_back( StripCenter.Y() );
+         lineZ.push_back( StripCenter.Z() );
+      }
+
+      OneModuleStripPositionX.push_back(lineX);
+      OneModuleStripPositionY.push_back(lineY);
+      OneModuleStripPositionZ.push_back(lineZ);
+   }
+
+   m_StripPositionX.push_back( OneModuleStripPositionX );
+   m_StripPositionY.push_back( OneModuleStripPositionY );
+   m_StripPositionZ.push_back( OneModuleStripPositionZ );
+}
+
+
+
+void GaspardTrackerRectangle::AddModule(double theta,
+                                        double phi,
+                                        double distance,
+                                        double beta_u,
+                                        double beta_v,
+                                        double beta_w)
+{
+   m_NumberOfModule++;
+
+   // convert from degree to radian:
+   theta *= M_PI/180;
+   phi   *= M_PI/180;
+
+   // Vector U on Module Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis)
+   TVector3 U ;
+   // Vector V on Module Face (parallele to X Strip)
+   TVector3 V ;
+   // Vector W normal to Module Face (pointing CsI)
+   TVector3 W ;
+   // Vector position of Module Face center
+   TVector3 C ;
+
+   C = TVector3(distance * sin(theta) * cos(phi),
+                distance * sin(theta) * sin(phi),
+                distance * cos(theta));
+
+  TVector3 YperpW = TVector3( cos(theta) * cos(phi),
+                              cos(theta) * sin(phi),
+                             -sin(theta));
+
+   W = C.Unit();
+   U = W.Cross(YperpW);
+   V = W.Cross(U);
+
+   U = U.Unit();
+   V = V.Unit();
+
+   U.Rotate( beta_u * M_PI/180. , U ) ;
+   V.Rotate( beta_u * M_PI/180. , U ) ;
+
+   U.Rotate( beta_v * M_PI/180. , V ) ;
+   V.Rotate( beta_v * M_PI/180. , V ) ;
+
+   U.Rotate( beta_w * M_PI/180. , W ) ;
+   V.Rotate( beta_w * M_PI/180. , W ) ;
+
+   double Face = 50; // mm
+   double NumberOfStrip = 100;
+   double StripPitch = Face/NumberOfStrip; // mm
+
+   vector<double> lineX;
+   vector<double> lineY;
+   vector<double> lineZ;
+
+   vector< vector< double > >   OneModuleStripPositionX;
+   vector< vector< double > >   OneModuleStripPositionY;
+   vector< vector< double > >   OneModuleStripPositionZ;
+
+   double X, Y, Z;
+
+   // Moving C to the 1.1 corner:
+   C.SetX( C.X() - ( Face/2 - StripPitch/2 ) * ( V.X() + U.X() ) )  ;
+   C.SetY( C.Y() - ( Face/2 - StripPitch/2 ) * ( V.Y() + U.Y() ) )  ;
+   C.SetZ( C.Z() - ( Face/2 - StripPitch/2 ) * ( V.Z() + U.Z() ) )  ;
+
+   for (int i = 0; i < NumberOfStrip; i++) {
+      lineX.clear();
+      lineY.clear();
+      lineZ.clear();
+
+      for (int j = 0; j < NumberOfStrip; j++) {
+         X = C.X() + StripPitch * ( U.X()*i + V.X()*j );
+         Y = C.Y() + StripPitch * ( U.Y()*i + V.Y()*j );
+         Z = C.Z() + StripPitch * ( U.Z()*i + V.Z()*j );
+
+         lineX.push_back(X);
+         lineY.push_back(Y);
+         lineZ.push_back(Z);
+      }
+
+      OneModuleStripPositionX.push_back(lineX);
+      OneModuleStripPositionY.push_back(lineY);
+      OneModuleStripPositionZ.push_back(lineZ);
+   }
+
+   m_StripPositionX.push_back( OneModuleStripPositionX );
+   m_StripPositionY.push_back( OneModuleStripPositionY );
+   m_StripPositionZ.push_back( OneModuleStripPositionZ );
+}
diff --git a/NPLib/GASPARD/GaspardTrackerRectangle.h b/NPLib/GASPARD/GaspardTrackerRectangle.h
new file mode 100644
index 000000000..5abf984e1
--- /dev/null
+++ b/NPLib/GASPARD/GaspardTrackerRectangle.h
@@ -0,0 +1,119 @@
+#ifndef GaspardTrackerRectangle_h
+#define GaspardTrackerRectangle_h 1
+/*****************************************************************************
+ * Copyright (C) 2009-2014    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:    contact address:                                      *
+ *                                                                           *
+ * Creation Date  :                                                          *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *                                                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *****************************************************************************/
+// C++ headers
+#include <string>
+#include <map>
+#include <vector>
+
+// ROOT headers
+#include "TVector3.h"
+
+// Gaspard headers
+#include "TGaspardTrackerData.h"
+#include "TGaspardTrackerPhysics.h"
+#include "GaspardTrackerModule.h"
+
+using namespace std;
+
+
+
+class GaspardTrackerRectangle : public GaspardTrackerModule
+{
+public:
+   ////////////////////////////////////////////////////
+   /////// Default Constructor and Destructor /////////
+   ////////////////////////////////////////////////////
+   GaspardTrackerRectangle(map<int, GaspardTrackerModule*> &Module, TGaspardTrackerPhysics* &EventPhysics);
+   virtual ~GaspardTrackerRectangle();
+
+public:
+   ////////////////////////////////////////////////////
+   ////  Inherite from GaspardTrackerModule class /////
+   ////////////////////////////////////////////////////
+   // Read stream at Configfile to pick-up parameters of detector (Position,...)
+   void ReadConfiguration(string Path);
+
+   // The goal of this method is to extract physical parameters from raw data
+   // Method called at each event read from the Input Tree
+   void BuildPhysicalEvent();
+
+   // Same as before but with a simpler treatment
+   void BuildSimplePhysicalEvent();
+
+private:
+   map<int, GaspardTrackerModule*> &m_ModuleTest;
+   TGaspardTrackerPhysics*         &m_EventPhysics;
+
+public:
+   void SetGaspardDataPointer(TGaspardTrackerData* gaspardData) {m_EventData = gaspardData;};
+   void PreTreat();
+
+private:
+   // Gaspard data coming from TGaspardTrackerPhysics through the 
+   // SetGaspardDataPointer method
+   TGaspardTrackerData* m_EventData;
+   TGaspardTrackerData* m_PreTreatData;
+
+public:
+   ////////////////////////////////
+   // Specific to GaspardTracker //
+   ////////////////////////////////
+   // Add a Module using Corner Coordinate information
+   void AddModule(TVector3 C_X1_Y1,
+                  TVector3 C_X128_Y1,
+                  TVector3 C_X1_Y128,
+                  TVector3 C_X128_Y128);
+
+   // Add a Module using R Theta Phi of Si center information
+   void AddModule(double theta,
+                  double phi,
+                  double distance,
+                  double beta_u,
+                  double beta_v,
+                  double beta_w);
+
+   // Getters to retrieve the (X,Y,Z) coordinates of a pixel defined by strips (X,Y)
+   double GetStripPositionX(int N ,int X ,int Y)        { return m_StripPositionX[N-1-m_index["Rectangle"]][X-1][Y-1]; }
+   double GetStripPositionY(int N ,int X ,int Y)        { return m_StripPositionY[N-1-m_index["Rectangle"]][X-1][Y-1]; }
+   double GetStripPositionZ(int N ,int X ,int Y)        { return m_StripPositionZ[N-1-m_index["Rectangle"]][X-1][Y-1]; }
+   double GetNumberOfModule()                           { return m_NumberOfModule; }
+
+private:
+   // Spatial Position of Strip Calculated on basis of detector position
+   int m_NumberOfModule;
+   vector< vector < vector < double > > >       m_StripPositionX;
+   vector< vector < vector < double > > >       m_StripPositionY;
+   vector< vector < vector < double > > >       m_StripPositionZ;
+
+private:
+   //////////////////////////////
+   // Geometry and stip number //
+   //////////////////////////////
+   double m_FirstStageLength;   // mm
+   double m_FirstStageWidth;      // mm
+   int    m_NumberOfStrips;
+   double m_StripPitchX;      // mm
+   double m_StripPitchY;      // mm
+};
+
+#endif
diff --git a/NPLib/GASPARD/GaspardTrackerRectangle.o b/NPLib/GASPARD/GaspardTrackerRectangle.o
new file mode 100644
index 0000000000000000000000000000000000000000..af156dc3d708f33496dbb6b958dc4a3118683d90
GIT binary patch
literal 76576
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
R5gh%C?ng)8!_nqC{0|PUj(h+B

literal 0
HcmV?d00001

diff --git a/NPLib/GASPARD/GaspardTrackerTrapezoid.cxx b/NPLib/GASPARD/GaspardTrackerTrapezoid.cxx
index 6fb4980ca..f8208749e 100644
--- a/NPLib/GASPARD/GaspardTrackerTrapezoid.cxx
+++ b/NPLib/GASPARD/GaspardTrackerTrapezoid.cxx
@@ -42,11 +42,11 @@ GaspardTrackerTrapezoid::GaspardTrackerTrapezoid(map<int, GaspardTrackerModule*>
           m_PreTreatData(new TGaspardTrackerData),
           m_NumberOfModule(0),
           // gaspHyde
-          m_FirstStageBaseLarge(97.5),   // mm
-          m_FirstStageHeight(113.5),   // mm
+//          m_FirstStageBaseLarge(97.5),   // mm
+//          m_FirstStageHeight(113.5),   // mm
           // mugast
-//          m_FirstStageBaseLarge(92.326),   // mm
-//          m_FirstStageHeight(105),   // mm
+          m_FirstStageBaseLarge(92.326),   // mm
+          m_FirstStageHeight(105),   // mm
           m_NumberOfStripsX(128),
           m_NumberOfStripsY(128)
 {
diff --git a/NPLib/GASPARD/Makefile b/NPLib/GASPARD/Makefile
index 4dabe0481..c291681ba 100644
--- a/NPLib/GASPARD/Makefile
+++ b/NPLib/GASPARD/Makefile
@@ -7,8 +7,7 @@ all:            $(SHARELIB)
 ############### Detector ##############
 
 ## Gaspard ##
-libGaspard.so:	TGaspardTrackerData.o TGaspardTrackerDataDict.o GaspardTracker.o TGaspardTrackerPhysics.o TGaspardTrackerPhysicsDict.o GaspardTrackerModule.o GaspardTrackerDummyShape.o GaspardTrackerTrapezoid.o	GaspardTrackerAnnular.o GaspardTrackerSquare.o
-
+libGaspard.so:	TGaspardTrackerData.o TGaspardTrackerDataDict.o GaspardTracker.o TGaspardTrackerPhysics.o TGaspardTrackerPhysicsDict.o GaspardTrackerModule.o GaspardTrackerDummyShape.o GaspardTrackerTrapezoid.o	GaspardTrackerAnnular.o GaspardTrackerSquare.o GaspardTrackerRectangle.o
 			$(LD) $(SOFLAGS) $^ $(OutPutOpt) $@
 
 TGaspardTrackerDataDict.cxx:	TGaspardTrackerData.h
@@ -28,6 +27,7 @@ GaspardTrackerDummyShape.o: GaspardTrackerDummyShape.cxx GaspardTrackerDummyShap
 GaspardTrackerTrapezoid.o: GaspardTrackerTrapezoid.cxx GaspardTrackerTrapezoid.h
 GaspardTrackerAnnular.o: GaspardTrackerAnnular.cxx GaspardTrackerAnnular.h
 GaspardTrackerSquare.o: GaspardTrackerSquare.cxx GaspardTrackerSquare.h
+GaspardTrackerRectangle.o: GaspardTrackerRectangle.cxx GaspardTrackerRectangle.h
 #######################################
 
 ############# Clean and More ##########
diff --git a/NPSimulation/GASPARD/GaspardTracker.cc b/NPSimulation/GASPARD/GaspardTracker.cc
index 3130225d0..b993cf0d9 100644
--- a/NPSimulation/GASPARD/GaspardTracker.cc
+++ b/NPSimulation/GASPARD/GaspardTracker.cc
@@ -29,6 +29,7 @@
 // NPTool headers
 #include "GaspardTracker.hh"
 #include "GaspardTrackerSquare.hh"
+#include "GaspardTrackerRectangle.hh"
 #include "GaspardTrackerTrapezoid.hh"
 #include "GaspardTrackerAnnular.hh"
 #include "GaspardTrackerDummyShape.hh"
@@ -57,6 +58,7 @@ void GaspardTracker::ReadConfiguration(string Path)
    ConfigFile.open(Path.c_str());
 
    bool GPDTrkSquare     = false;
+   bool GPDTrkRectangle  = false;
    bool GPDTrkTrapezoid  = false;
    bool GPDTrkAnnular    = false;
    bool GPDTrkDummyShape = false;
@@ -81,6 +83,23 @@ void GaspardTracker::ReadConfiguration(string Path)
          // store GaspardTrackerSquare "detector"
          m_Modules.push_back(myDetector);
       }
+      else if (LineBuffer.compare(0, 12, "GPDRectangle") == 0  &&  GPDTrkRectangle == false) {
+         GPDTrkRectangle = true;
+
+         // instantiate a new "detector" corresponding to the Square elements
+         GaspardTrackerModule* myDetector = new GaspardTrackerRectangle();
+
+         // read part of the configuration file corresponding to square elements
+         ConfigFile.close();
+         myDetector->ReadConfiguration(Path);
+         ConfigFile.open(Path.c_str());
+
+         // ms_InterCoord comes from VDetector
+         myDetector->SetInterCoordPointer(ms_InterCoord);
+
+         // store GaspardTrackerSquare "detector"
+         m_Modules.push_back(myDetector);
+      }
       else if (LineBuffer.compare(0, 12, "GPDTrapezoid") == 0  &&  GPDTrkTrapezoid == false) {
          GPDTrkTrapezoid = true;
 
diff --git a/NPSimulation/GASPARD/GaspardTrackerAnnular.hh b/NPSimulation/GASPARD/GaspardTrackerAnnular.hh
index 68f162721..bb2abde4f 100644
--- a/NPSimulation/GASPARD/GaspardTrackerAnnular.hh
+++ b/NPSimulation/GASPARD/GaspardTrackerAnnular.hh
@@ -142,9 +142,9 @@ namespace GPDANNULAR
    const G4double FirstStageThickness = 300*micrometer;
    const G4double FirstStageRmin = 16*mm;
    // MUGAST
-//   const G4double FirstStageRmax = 45*mm;
+   const G4double FirstStageRmax = 45*mm;
    // gaspHyde
-   const G4double FirstStageRmax = 52*mm;
+//   const G4double FirstStageRmax = 52*mm;
 //   const G4double VacBoxThickness   = 3*cm           ;
    const G4double VacBoxThickness     = 0.4*cm;
 
diff --git a/NPSimulation/GASPARD/GaspardTrackerModule.cc b/NPSimulation/GASPARD/GaspardTrackerModule.cc
index 0907c7508..6d460fb4e 100644
--- a/NPSimulation/GASPARD/GaspardTrackerModule.cc
+++ b/NPSimulation/GASPARD/GaspardTrackerModule.cc
@@ -61,6 +61,7 @@ void GaspardTrackerModule::InitializeRootOutput()
 void GaspardTrackerModule::InitializeIndex()
 {
    m_index["Square"]     =    0;
+   m_index["Rectangle"]  =    0;
    m_index["Trapezoid"]  =  100;
    m_index["Annular"]    =  200;
    m_index["DummyShape"] = 1000;
diff --git a/NPSimulation/GASPARD/GaspardTrackerRectangle.cc b/NPSimulation/GASPARD/GaspardTrackerRectangle.cc
new file mode 100644
index 000000000..c2bf95fd0
--- /dev/null
+++ b/NPSimulation/GASPARD/GaspardTrackerRectangle.cc
@@ -0,0 +1,821 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2013   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: N. de Sereville  contact address: deserevi@ipno.in2p3.fr *
+ *                                                                           *
+ * Creation Date  : 15/07/09                                                 *
+ * Last update    : 12/10/09                                                 *
+ *---------------------------------------------------------------------------*
+ * Decription: Define a module of trapezoidal shape for the Gaspard tracker  *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *    + 12/10/09: Change scorer scheme (N. de Sereville)                     *
+ *    + 01/10/10: Fix bug with TInteractionCoordinate map size in Read       *
+ *                Sensitive (N. de Sereville)                                *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+
+// C++ headers
+#include <sstream>
+#include <string>
+#include <cmath>
+
+// G4 Geometry headers
+#include "G4Box.hh"
+
+// G4 various headers
+#include "G4MaterialTable.hh"
+#include "G4Element.hh"
+#include "G4ElementTable.hh"
+#include "G4VisAttributes.hh"
+#include "G4Colour.hh"
+#include "G4RotationMatrix.hh"
+#include "G4Transform3D.hh"
+#include "G4PVPlacement.hh"
+#include "G4PVDivision.hh"
+
+// G4 sensitive
+#include "G4SDManager.hh"
+#include "G4MultiFunctionalDetector.hh"
+
+// NPTool headers
+#include "GaspardTrackerRectangle.hh"
+#include "ObsoleteGeneralScorers.hh"
+#include "GaspardScorers.hh"
+#include "SiliconScorers.hh"
+#include "MaterialManager.hh"
+#include "RootOutput.h"
+#include "VDetector.hh"
+// CLHEP
+#include "CLHEP/Random/RandGauss.h"
+
+using namespace std;
+using namespace CLHEP;
+
+using namespace GPDRECT;
+using namespace GPDSCORERS;
+
+
+
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+GaspardTrackerRectangle::GaspardTrackerRectangle()
+{
+   ms_InterCoord = 0;
+}
+
+
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+GaspardTrackerRectangle::~GaspardTrackerRectangle()
+{
+}
+
+
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void GaspardTrackerRectangle::AddModule(G4ThreeVector X1_Y1     ,
+      G4ThreeVector X128_Y1   ,
+      G4ThreeVector X1_Y128   ,
+      G4ThreeVector X128_Y128 ,
+      bool wFirstStage        ,
+      bool wSecondStage       ,
+      bool wThirdStage)
+{
+   m_DefinitionType.push_back(true) ;
+
+   m_X1_Y1.push_back(X1_Y1)               ;
+   m_X128_Y1.push_back(X128_Y1)           ;
+   m_X1_Y128.push_back(X1_Y128)           ;
+   m_X128_Y128.push_back(X128_Y128)       ;
+   m_wFirstStage.push_back(wFirstStage)   ;
+   m_wSecondStage.push_back(wSecondStage) ;
+   m_wThirdStage.push_back(wThirdStage)   ;
+
+   m_R.push_back(0)      ;
+   m_Theta.push_back(0)  ;
+   m_Phi.push_back(0)    ;
+   m_beta_u.push_back(0) ;
+   m_beta_v.push_back(0) ;
+   m_beta_w.push_back(0) ;
+}
+
+
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void GaspardTrackerRectangle::AddModule(G4double R        ,
+      G4double Theta    ,
+      G4double Phi      ,
+      G4double beta_u   ,
+      G4double beta_v   ,
+      G4double beta_w   ,
+      bool wFirstStage  ,
+      bool wSecondStage ,
+      bool wThirdStage)
+{
+   G4ThreeVector empty = G4ThreeVector(0, 0, 0);
+
+   m_DefinitionType.push_back(false);
+
+   m_R.push_back(R)                       ;
+   m_Theta.push_back(Theta)               ;
+   m_Phi.push_back(Phi)                   ;
+   m_beta_u.push_back(beta_u)             ;
+   m_beta_v.push_back(beta_v)             ;
+   m_beta_w.push_back(beta_w)             ;
+   m_wFirstStage.push_back(wFirstStage)   ;
+   m_wSecondStage.push_back(wSecondStage) ;
+   m_wThirdStage.push_back(wThirdStage)   ;
+
+   m_X1_Y1.push_back(empty)     ;
+   m_X128_Y1.push_back(empty)   ;
+   m_X1_Y128.push_back(empty)   ;
+   m_X128_Y128.push_back(empty) ;
+}
+
+
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void GaspardTrackerRectangle::VolumeMaker(G4int DetectorNumber,
+                                          G4ThreeVector MMpos,
+                                          G4RotationMatrix* MMrot,
+                                          bool wFirstStage,
+                                          bool wSecondStage,
+                                          bool wThirdStage,
+                                          G4LogicalVolume* world)
+{
+   G4double NbrTelescopes = DetectorNumber  ;
+   G4String DetNumber                   ;
+   ostringstream Number                      ;
+   Number << NbrTelescopes                   ;
+   DetNumber = Number.str()             ;
+
+   ////////////////////////////////////////////////////////////////
+   ////////////// Starting Volume Definition //////////////////////
+   ////////////////////////////////////////////////////////////////
+   G4String Name = "GPDRectangle" + DetNumber ;
+
+   // Definition of the volume containing the sensitive detector
+   G4Box*           solidGPDRectangle = new G4Box(Name, 0.5*Width, 0.5*Length, Depth/2);
+   G4LogicalVolume* logicGPDRectangle = new G4LogicalVolume(solidGPDRectangle, m_MaterialVacuum, Name, 0, 0, 0);
+
+   new G4PVPlacement(G4Transform3D(*MMrot, MMpos), logicGPDRectangle, Name, world, false, DetectorNumber);
+
+   G4VisAttributes* RectangleeVisAtt = new G4VisAttributes(G4Colour(0.90, 0.90, 0.90));
+   RectangleeVisAtt->SetForceWireframe(true); 
+   logicGPDRectangle->SetVisAttributes(RectangleeVisAtt);
+
+   //Place two marker to identify the u and v axis on silicon face:
+   //marker are placed a bit before the silicon itself so they don't perturbate simulation
+   //Uncomment to help debugging or if you want to understand the way the code work.
+   //I should recommand to Comment it during simulation to avoid perturbation of simulation
+   //Remember G4 is limitationg step on geometry constraints.
+  /* 
+         G4ThreeVector positionMarkerU = CT*0.98 + MMu*SiliconFace/4;
+         G4Box*          solidMarkerU = new G4Box( "solidMarkerU" , SiliconFace/4 , 1*mm , 1*mm )              ;
+         G4LogicalVolume* logicMarkerU = new G4LogicalVolume( solidMarkerU , m_MaterialVacuum , "logicMarkerU",0,0,0)       ;
+         PVPBuffer = new G4PVPlacement(G4Transform3D(*MMrot,positionMarkerU),logicMarkerU,"MarkerU",world,false,0) ;
+
+         G4VisAttributes* MarkerUVisAtt= new G4VisAttributes(G4Colour(0.,0.,0.5));//blue
+         logicMarkerU->SetVisAttributes(MarkerUVisAtt);
+
+         G4ThreeVector positionMarkerV = CT*0.98 + MMv*SiliconFace/4;
+         G4Box*          solidMarkerV = new G4Box( "solidMarkerU" , 1*mm , SiliconFace/4 , 1*mm )              ;
+         G4LogicalVolume* logicMarkerV = new G4LogicalVolume( solidMarkerV , m_MaterialVacuum , "logicMarkerV",0,0,0)       ;
+         PVPBuffer = new G4PVPlacement(G4Transform3D(*MMrot,positionMarkerV),logicMarkerV,"MarkerV",world,false,0) ;
+
+         G4VisAttributes* MarkerVVisAtt= new G4VisAttributes(G4Colour(0.,0.5,0.5));//green
+         logicMarkerV->SetVisAttributes(MarkerVVisAtt);
+   */
+
+   ////////////////////////////////////////////////////////////////
+   /////////////////// First Stage Construction////////////////////
+   ////////////////////////////////////////////////////////////////
+   if (wFirstStage) {
+      // Silicon detector itself
+      G4ThreeVector  positionFirstStage = G4ThreeVector(0, 0, FirstStage_PosZ);
+
+      G4Box*           solidFirstStage = new G4Box("solidFirstStage", 0.5*FirstStageWidth, 0.5*FirstStageLength, 0.5*FirstStageThickness);
+      G4LogicalVolume* logicFirstStage = new G4LogicalVolume(solidFirstStage, m_MaterialSilicon, "logicFirstStage", 0, 0, 0);
+
+      new G4PVPlacement(0,
+                        positionFirstStage,
+                        logicFirstStage,
+                        Name + "_FirstStage",
+                        logicGPDRectangle,
+                        false,
+                        DetectorNumber);
+
+      // Set First Stage sensible
+      logicFirstStage->SetSensitiveDetector(m_FirstStageScorer);
+
+      ///Visualisation of FirstStage Strip
+      G4VisAttributes* FirstStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3));   // blue
+      logicFirstStage->SetVisAttributes(FirstStageVisAtt);
+   }
+
+   ////////////////////////////////////////////////////////////////
+   //////////////// Second Stage  Construction ////////////////////
+   ////////////////////////////////////////////////////////////////
+   if (wSecondStage) {
+      // Second stage silicon detector
+      G4ThreeVector  positionSecondStage = G4ThreeVector(0, 0, SecondStage_PosZ);
+
+      G4Box*           solidSecondStage = new G4Box("solidSecondStage", 0.5*SecondStageWidth, 0.5*SecondStageLength, 0.5*SecondStageThickness);
+      G4LogicalVolume* logicSecondStage = new G4LogicalVolume(solidSecondStage, m_MaterialSilicon, "logicSecondStage", 0, 0, 0);
+
+      new G4PVPlacement(0,
+                        positionSecondStage,
+                        logicSecondStage,
+                        Name + "_SecondStage",
+                        logicGPDRectangle,
+                        false,
+                        DetectorNumber);
+
+      // Set Second Stage sensible
+      logicSecondStage->SetSensitiveDetector(m_SecondStageScorer);
+
+      ///Visualisation of SecondStage Strip
+      G4VisAttributes* SecondStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3));
+      logicSecondStage->SetVisAttributes(SecondStageVisAtt);
+   }
+
+   ////////////////////////////////////////////////////////////////
+   ///////////////// Third Stage Construction /////////////////////
+   ////////////////////////////////////////////////////////////////
+   if (wThirdStage) {
+      // Third stage silicon detector
+      G4ThreeVector  positionThirdStage = G4ThreeVector(0, 0, ThirdStage_PosZ);
+
+      G4Box*           solidThirdStage = new G4Box("solidThirdStage", 0.5*ThirdStageWidth, 0.5*ThirdStageLength, 0.5*ThirdStageThickness);
+      G4LogicalVolume* logicThirdStage = new G4LogicalVolume(solidThirdStage, m_MaterialSilicon, "logicThirdStage", 0, 0, 0);
+
+      new G4PVPlacement(0,
+                        positionThirdStage,
+                        logicThirdStage,
+                        Name + "_ThirdStage",
+                        logicGPDRectangle,
+                        false,
+                        DetectorNumber);
+
+      // Set Third Stage sensible
+      logicThirdStage->SetSensitiveDetector(m_ThirdStageScorer);
+
+      ///Visualisation of Third Stage
+      G4VisAttributes* ThirdStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3));   // red
+      logicThirdStage->SetVisAttributes(ThirdStageVisAtt);
+   }
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Virtual Method of VDetector class
+
+// Read stream at Configfile to pick-up parameters of detector (Position,...)
+// Called in DetecorConstruction::ReadDetextorConfiguration Method
+void GaspardTrackerRectangle::ReadConfiguration(string Path)
+{
+   ifstream ConfigFile           ;
+   ConfigFile.open(Path.c_str()) ;
+   string LineBuffer          ;
+   string DataBuffer          ;
+
+   // A:X1_Y1     --> X:1    Y:1
+   // B:X128_Y1   --> X:128  Y:1
+   // C:X1_Y128   --> X:1    Y:128
+   // D:X128_Y128    --> X:128  Y:128
+
+   G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz          ;
+   G4ThreeVector A , B , C , D                                                 ;
+   G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ;
+   int FIRSTSTAGE = 0 , SECONDSTAGE = 0 , THIRDSTAGE = 0                       ;
+
+   bool ReadingStatus = false ;
+
+   bool check_A = false ;
+   bool check_C = false ;
+   bool check_B = false ;
+   bool check_D = false ;
+
+   bool check_Theta = false ;
+   bool check_Phi   = false ;
+   bool check_R     = false ;
+   
+   bool check_FirstStage = false ;
+   bool check_SecondStage = false ;
+   bool check_ThirdStage = false ;
+   bool checkVis = false ;
+
+   while (!ConfigFile.eof()) {
+      getline(ConfigFile, LineBuffer);
+      if (LineBuffer.compare(0, 12, "GPDRectangle") == 0) {
+         G4cout << "///" << G4endl           ;
+         G4cout << "Rectangle element found: " << G4endl   ;
+         ReadingStatus = true ;
+         }
+         
+   while(ReadingStatus){      
+
+         ConfigFile >> DataBuffer;
+         //   Comment Line 
+      if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;}
+      
+         // Position method
+         else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) {
+            check_A = true;
+            ConfigFile >> DataBuffer ;
+            Ax = atof(DataBuffer.c_str()) ;
+            Ax = Ax * mm ;
+            ConfigFile >> DataBuffer ;
+            Ay = atof(DataBuffer.c_str()) ;
+            Ay = Ay * mm ;
+            ConfigFile >> DataBuffer ;
+            Az = atof(DataBuffer.c_str()) ;
+            Az = Az * mm ;
+
+            A = G4ThreeVector(Ax, Ay, Az);
+            G4cout << "X1 Y1 corner position : " << A << G4endl;
+         }
+        
+         else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) {
+            check_B = true;
+            ConfigFile >> DataBuffer ;
+            Bx = atof(DataBuffer.c_str()) ;
+            Bx = Bx * mm ;
+            ConfigFile >> DataBuffer ;
+            By = atof(DataBuffer.c_str()) ;
+            By = By * mm ;
+            ConfigFile >> DataBuffer ;
+            Bz = atof(DataBuffer.c_str()) ;
+            Bz = Bz * mm ;
+
+            B = G4ThreeVector(Bx, By, Bz);
+            G4cout << "X128 Y1 corner position : " << B << G4endl;
+         }
+         
+         else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) {
+            check_C = true;
+            ConfigFile >> DataBuffer ;
+            Cx = atof(DataBuffer.c_str()) ;
+            Cx = Cx * mm ;
+            ConfigFile >> DataBuffer ;
+            Cy = atof(DataBuffer.c_str()) ;
+            Cy = Cy * mm ;
+            ConfigFile >> DataBuffer ;
+            Cz = atof(DataBuffer.c_str()) ;
+            Cz = Cz * mm ;
+
+            C = G4ThreeVector(Cx, Cy, Cz);
+            G4cout << "X1 Y128 corner position : " << C << G4endl;
+         }
+        
+         else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) {
+            check_D = true;
+            ConfigFile >> DataBuffer ;
+            Dx = atof(DataBuffer.c_str()) ;
+            Dx = Dx * mm ;
+            ConfigFile >> DataBuffer ;
+            Dy = atof(DataBuffer.c_str()) ;
+            Dy = Dy * mm ;
+            ConfigFile >> DataBuffer ;
+            Dz = atof(DataBuffer.c_str()) ;
+            Dz = Dz * mm ;
+
+            D = G4ThreeVector(Dx, Dy, Dz);
+            G4cout << "X128 Y128 corner position : " << D << G4endl;
+         }
+         
+
+       // Angle method
+         else if (DataBuffer.compare(0, 6, "THETA=") == 0) {
+            check_Theta = true;
+            ConfigFile >> DataBuffer ;
+            Theta = atof(DataBuffer.c_str()) ;
+            Theta = Theta * deg;
+            G4cout << "Theta:  " << Theta / deg << G4endl;
+         }
+
+         else if (DataBuffer.compare(0, 4, "PHI=") == 0) {
+            check_Phi = true;
+            ConfigFile >> DataBuffer ;
+            Phi = atof(DataBuffer.c_str()) ;
+            Phi = Phi * deg;
+            G4cout << "Phi:  " << Phi / deg << G4endl;
+         }
+
+         else if (DataBuffer.compare(0, 2, "R=") == 0) {
+            check_R = true;
+            ConfigFile >> DataBuffer ;
+            R = atof(DataBuffer.c_str()) ;
+            R = R * mm;
+            G4cout << "R:  " << R / mm << G4endl;
+         }
+
+         else if (DataBuffer.compare(0, 5, "BETA=") == 0) {
+            ConfigFile >> DataBuffer ;
+            beta_u = atof(DataBuffer.c_str()) ;
+            beta_u = beta_u * deg   ;
+            ConfigFile >> DataBuffer ;
+            beta_v = atof(DataBuffer.c_str()) ;
+            beta_v = beta_v * deg   ;
+            ConfigFile >> DataBuffer ;
+            beta_w = atof(DataBuffer.c_str()) ;
+            beta_w = beta_w * deg   ;
+            G4cout << "Beta:  " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl  ;
+         }
+
+         else if (DataBuffer.compare(0, 11, "FIRSTSTAGE=") == 0) {
+            check_FirstStage = true ;
+            ConfigFile >> DataBuffer;
+            FIRSTSTAGE = atof(DataBuffer.c_str()) ;
+         }
+
+         else if (DataBuffer.compare(0, 12, "SECONDSTAGE=") == 0) {
+            check_SecondStage = true ;
+            ConfigFile >> DataBuffer;
+            SECONDSTAGE = atof(DataBuffer.c_str()) ;
+         }
+
+         else if (DataBuffer.compare(0, 11, "THIRDSTAGE=") == 0) {
+            check_ThirdStage = true ;
+            ConfigFile >> DataBuffer;
+            THIRDSTAGE = atof(DataBuffer.c_str()) ;
+         }
+
+         else if (DataBuffer.compare(0, 4, "VIS=") == 0) {
+            checkVis = true ;
+            ConfigFile >> DataBuffer;
+            if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true;
+         }
+         
+         else G4cout << "WARNING: Wrong Token, GaspardTrackerRectangle: Rectangle Element not added" << G4endl;
+
+         //Add The previously define telescope
+         //With position method
+         if ((check_A && check_B && check_C && check_D && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_Theta && check_Phi && check_R)) {
+         
+            ReadingStatus = false ;
+          check_A = false ;
+          check_C = false ;
+          check_B = false ;
+          check_D = false ;
+          check_FirstStage = false ;
+          check_SecondStage = false ;
+          check_ThirdStage = false ;
+          checkVis = false ;
+         
+            AddModule(A                ,
+                      B                ,
+                      C                ,
+                      D                ,
+                      FIRSTSTAGE  == 1 ,
+                      SECONDSTAGE == 1 ,
+                      THIRDSTAGE  == 1);
+         }
+
+         //with angle method
+        if ((check_Theta && check_Phi && check_R && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_A && check_B && check_C && check_D)) {
+            ReadingStatus = false ;
+             check_Theta = false ;
+             check_Phi   = false ;
+             check_R     = false ;
+           check_FirstStage = false ;
+          check_SecondStage = false ;
+           check_ThirdStage = false ;
+           checkVis = false ;
+           
+            AddModule(R                ,
+                      Theta            ,
+                      Phi              ,
+                      beta_u           ,
+                      beta_v           ,
+                      beta_w           ,
+                      FIRSTSTAGE  == 1 ,
+                      SECONDSTAGE == 1 ,
+                      THIRDSTAGE  == 1);
+         }
+
+         
+      }
+   }
+}
+
+// Construct detector and inialise sensitive part.
+// Called After DetecorConstruction::AddDetector Method
+void GaspardTrackerRectangle::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     MMCenter = G4ThreeVector(0, 0, 0);
+
+   bool FirstStage  = true ;
+   bool SecondStage = true ;
+   bool ThirdStage  = true ;
+
+   G4int NumberOfModule = m_DefinitionType.size() ;
+
+   for (G4int i = 0; i < NumberOfModule; i++) {
+      // By Point
+      if (m_DefinitionType[i]) {
+         // (u,v,w) unitary vector associated to trapezoidal referencial
+         // (u,v) // to silicon plan
+         //     ------
+         //     |    |           ^
+         //     |    |           |  v
+         //     |    |           |
+         //     ------     <------
+         //                         u
+         // w perpendicular to (u,v) plan and pointing ThirdStage
+         G4cout << "XXXXXXXXXXXX Rectangle " << i << " XXXXXXXXXXXXX" << G4endl;
+         MMu = m_X128_Y1[i] - m_X1_Y1[i];
+         MMu = MMu.unit();
+         G4cout << "MMu: " << MMu << G4endl;
+
+         MMv = 0.5 * (m_X1_Y128[i] + m_X128_Y128[i] - m_X1_Y1[i] - m_X128_Y1[i]);
+         MMv = MMv.unit();
+         G4cout << "MMv: " << MMv << G4endl;
+
+         MMw = MMu.cross(MMv);
+         MMw = MMw.unit();
+         G4cout << "MMw: " << MMw << G4endl;
+
+         // Center of the module
+         MMCenter = (m_X1_Y1[i] + m_X1_Y128[i] + m_X128_Y1[i] + m_X128_Y128[i]) / 4;
+
+         // Passage Matrix from Lab Referential to Module Referential
+         MMrot = new G4RotationMatrix(MMu, MMv, MMw);
+         // translation to place Module
+         MMpos = MMw * Depth * 0.5 + MMCenter;
+      }
+
+      // By Angle
+      else {
+         G4double Theta = m_Theta[i];
+         G4double Phi   = m_Phi[i];
+
+         // (u,v,w) unitary vector associated to telescope referencial
+         // (u,v) // to silicon plan
+         //      -------
+         //     /       \              ^
+         //    /         \             |  v
+         //   /           \            |
+         //  ---------------     <------
+         //                         u
+         // w perpendicular to (u,v) plan and pointing ThirdStage
+         // Phi is angle between X axis and projection in (X,Y) plan
+         // Theta is angle between  position vector and z axis
+         G4double wX = m_R[i] * sin(Theta / rad) * cos(Phi / rad);
+         G4double wY = m_R[i] * sin(Theta / rad) * sin(Phi / rad);
+         G4double wZ = m_R[i] * cos(Theta / rad);
+         MMw = G4ThreeVector(wX, wY, wZ);
+
+         // vector corresponding to the center of the module
+         MMCenter = MMw;
+
+         // vector parallel to one axis of silicon plane
+         // in fact, this is vector u
+         G4double ii = cos(Theta / rad) * cos(Phi / rad);
+         G4double jj = cos(Theta / rad) * sin(Phi / rad);
+         G4double kk = -sin(Theta / rad);
+         G4ThreeVector Y = G4ThreeVector(ii, jj, kk);
+
+         MMw = MMw.unit();
+         MMv = MMw.cross(Y);
+         MMu = MMv.cross(MMw);
+         MMv = MMv.unit();
+         MMu = MMu.unit();
+
+         G4cout << "XXXXXXXXXXXX Rectangle " << i << " XXXXXXXXXXXXX" << G4endl;
+         G4cout << "MMu: " << MMu << G4endl;
+         G4cout << "MMv: " << MMv << G4endl;
+         G4cout << "MMw: " << MMw << G4endl;
+
+         // Passage Matrix from Lab Referential to Telescope Referential
+         MMrot = new G4RotationMatrix(MMu, MMv, MMw);
+         // Telescope is rotate of Beta angle around MMv axis.
+         MMrot->rotate(m_beta_u[i], MMu);
+         MMrot->rotate(m_beta_v[i], MMv);
+         MMrot->rotate(m_beta_w[i], MMw);
+         // translation to place Telescope
+         MMpos = MMw * Depth * 0.5 + MMCenter;
+      }
+
+      FirstStage  = m_wFirstStage[i];
+      SecondStage = m_wSecondStage[i];
+      ThirdStage  = m_wThirdStage[i];
+
+      VolumeMaker(i + 1, MMpos, MMrot, FirstStage, SecondStage, ThirdStage, world);
+   }
+
+   delete MMrot;
+}
+
+
+
+// Connect the GaspardTrackingData class to the output TTree
+// of the simulation
+void GaspardTrackerRectangle::InitializeRootOutput()
+{
+}
+
+
+
+// Set the TinteractionCoordinates object from VDetector to the present class
+void GaspardTrackerRectangle::SetInterCoordPointer(TInteractionCoordinates* interCoord)
+{
+   ms_InterCoord = interCoord;
+}
+
+
+
+// Read sensitive part and fill the Root tree.
+// Called at in the EventAction::EndOfEventAvtion
+void GaspardTrackerRectangle::ReadSensitive(const G4Event* event)
+{
+   //////////////
+   // First stage
+   G4THitsMap<G4double*>* GPD1HitMap;
+   std::map<G4int, G4double**>::iterator GPD1_itr;
+
+   G4int GPD1CollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("FirstStageScorerGPDRectangle/GPDRectangleFirstStage");
+   GPD1HitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(GPD1CollectionID));
+
+   // Loop on the GPD map
+   for (GPD1_itr = GPD1HitMap->GetMap()->begin(); GPD1_itr != GPD1HitMap->GetMap()->end(); GPD1_itr++) {
+      G4double* Info = *(GPD1_itr->second);
+
+      double Energy = Info[0];
+      if (Energy > EnergyThreshold) {
+         double Time       = Info[1];
+         int DetNbr        = (int) Info[7];
+         int StripFront    = (int) Info[8];
+         int StripBack     = (int) Info[9];
+
+         // detector number
+         ms_Event->SetGPDTrkFirstStageFrontEDetectorNbr(m_index["Rectangle"] + DetNbr);
+         ms_Event->SetGPDTrkFirstStageFrontTDetectorNbr(m_index["Rectangle"] + DetNbr);
+         ms_Event->SetGPDTrkFirstStageBackEDetectorNbr(m_index["Rectangle"] + DetNbr);
+         ms_Event->SetGPDTrkFirstStageBackTDetectorNbr(m_index["Rectangle"] + DetNbr);
+
+         // energy
+         ms_Event->SetGPDTrkFirstStageFrontEEnergy(RandGauss::shoot(Energy, ResoFirstStage));
+         ms_Event->SetGPDTrkFirstStageBackEEnergy(RandGauss::shoot(Energy, ResoFirstStage));
+
+         // time
+         Time = RandGauss::shoot(Time, ResoTimePPAC);
+         ms_Event->SetGPDTrkFirstStageFrontTTime(RandGauss::shoot(Time, ResoTimeGpd));
+         ms_Event->SetGPDTrkFirstStageBackTTime(RandGauss::shoot(Time, ResoTimeGpd));
+
+         // strips X and Y
+         ms_Event->SetGPDTrkFirstStageFrontEStripNbr(StripFront);
+         ms_Event->SetGPDTrkFirstStageFrontTStripNbr(StripFront);
+         ms_Event->SetGPDTrkFirstStageBackEStripNbr(StripBack);
+         ms_Event->SetGPDTrkFirstStageBackTStripNbr(StripBack);
+
+         // Interaction Coordinates
+         ms_InterCoord->SetDetectedPositionX(Info[2]);
+         ms_InterCoord->SetDetectedPositionY(Info[3]);
+         ms_InterCoord->SetDetectedPositionZ(Info[4]);
+         ms_InterCoord->SetDetectedAngleTheta(Info[5]/deg);
+         ms_InterCoord->SetDetectedAnglePhi(Info[6]/deg);
+      }
+   }
+   // clear map for next event
+   GPD1HitMap->clear();
+
+
+   //////////////
+   // Second stage
+   G4THitsMap<G4double*>* GPD2HitMap;
+   std::map<G4int, G4double**>::iterator GPD2_itr;
+
+   G4int GPD2CollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("SecondStageScorerGPDRectangle/GPDRectangleSecondStage");
+   GPD2HitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(GPD2CollectionID));
+
+   // Loop on the GPD map
+   for (GPD2_itr = GPD2HitMap->GetMap()->begin(); GPD2_itr != GPD2HitMap->GetMap()->end(); GPD2_itr++) {
+      G4double* Info = *(GPD2_itr->second);
+
+      double Energy = Info[0];
+      if (Energy > EnergyThreshold) {
+         double Time       = Info[1];
+         int DetNbr        = (int) Info[7];
+         int StripFront    = (int) Info[8];
+
+         // detector number
+         ms_Event->SetGPDTrkSecondStageEDetectorNbr(m_index["Rectangle"] + DetNbr);
+         ms_Event->SetGPDTrkSecondStageTDetectorNbr(m_index["Rectangle"] + DetNbr);
+
+         // energy
+         ms_Event->SetGPDTrkSecondStageEEnergy(RandGauss::shoot(Energy, ResoSecondStage));
+
+         // time
+         Time = RandGauss::shoot(Time, ResoTimePPAC);
+         ms_Event->SetGPDTrkSecondStageTTime(RandGauss::shoot(Time, ResoTimeGpd));
+
+         // strips X and Y
+         ms_Event->SetGPDTrkSecondStageEPadNbr(StripFront);
+         ms_Event->SetGPDTrkSecondStageTPadNbr(StripFront);
+      }
+   }
+   // clear map for next event
+   GPD2HitMap->clear();
+
+
+   //////////////
+   // Third stage
+   G4THitsMap<G4double*>* GPD3HitMap;
+   std::map<G4int, G4double**>::iterator GPD3_itr;
+
+   G4int GPD3CollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThirdStageScorerGPDRectangle/GPDRectangleThirdStage");
+   GPD3HitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(GPD3CollectionID));
+
+   // Loop on the GPD map
+   for (GPD3_itr = GPD3HitMap->GetMap()->begin(); GPD3_itr != GPD3HitMap->GetMap()->end(); GPD3_itr++) {
+      G4double* Info = *(GPD3_itr->second);
+
+      double Energy = Info[0];
+      if (Energy > EnergyThreshold) {
+         double Time       = Info[1];
+         int DetNbr        = (int) Info[7];
+         int StripFront    = (int) Info[8];
+
+         // detector number
+         ms_Event->SetGPDTrkThirdStageEDetectorNbr(m_index["Rectangle"] + DetNbr);
+         ms_Event->SetGPDTrkThirdStageTDetectorNbr(m_index["Rectangle"] + DetNbr);
+
+         // energy
+         ms_Event->SetGPDTrkThirdStageEEnergy(RandGauss::shoot(Energy, ResoThirdStage));
+
+         // time
+         Time = RandGauss::shoot(Time, ResoTimePPAC);
+         ms_Event->SetGPDTrkThirdStageTTime(RandGauss::shoot(Time, ResoTimeGpd));
+
+         // strips X and Y
+         ms_Event->SetGPDTrkThirdStageEPadNbr(StripFront);
+         ms_Event->SetGPDTrkThirdStageTPadNbr(StripFront);
+      }
+   }
+   // clear map for next event
+   GPD3HitMap->clear();
+}
+
+
+
+void GaspardTrackerRectangle::InitializeScorers()
+{
+   // check whether scorers are already defined
+   bool already_exist  = false;
+   m_FirstStageScorer  = VDetector::CheckScorer("FirstStageScorerGPDRectangle",  already_exist);
+   m_SecondStageScorer = VDetector::CheckScorer("SecondStageScorerGPDRectangle", already_exist);
+   m_ThirdStageScorer  = VDetector::CheckScorer("ThirdStageScorerGPDRectangle",  already_exist);
+   if (already_exist) return;
+
+   // First stage scorer
+   G4VPrimitiveScorer* GPDScorerFirstStage =
+      new SILICONSCORERS::PS_Silicon_Rectangle("GPDRectangleFirstStage",
+                                               0,
+                                               FirstStageWidth,
+                                               FirstStageLength,
+                                               NumberOfStrips,
+                                               NumberOfStrips);
+
+   // Second stage scorer
+   G4VPrimitiveScorer* GPDScorerSecondStage =
+      new SILICONSCORERS::PS_Silicon_Rectangle("GPDRectangleSecondStage",
+                                               0,
+                                               SecondStageWidth,
+                                               SecondStageLength,
+                                               1,
+                                               1);
+
+   // Third stage scorer
+   G4VPrimitiveScorer* GPDScorerThirdStage =
+      new SILICONSCORERS::PS_Silicon_Rectangle("GPDRectangleThirdStage",
+                                               0,
+                                               ThirdStageWidth,
+                                               ThirdStageLength,
+                                               1,
+                                               1);
+
+   // register scorers to the multifunctionnal detector
+   m_FirstStageScorer  ->RegisterPrimitive(GPDScorerFirstStage);
+   m_SecondStageScorer ->RegisterPrimitive(GPDScorerSecondStage);
+   m_ThirdStageScorer  ->RegisterPrimitive(GPDScorerThirdStage);
+
+   //  Add All Scorer to the Global Scorer Manager
+   G4SDManager::GetSDMpointer()->AddNewDetector(m_FirstStageScorer);
+   G4SDManager::GetSDMpointer()->AddNewDetector(m_SecondStageScorer);
+   G4SDManager::GetSDMpointer()->AddNewDetector(m_ThirdStageScorer);
+}
diff --git a/NPSimulation/GASPARD/GaspardTrackerRectangle.hh b/NPSimulation/GASPARD/GaspardTrackerRectangle.hh
new file mode 100644
index 000000000..51f160cb8
--- /dev/null
+++ b/NPSimulation/GASPARD/GaspardTrackerRectangle.hh
@@ -0,0 +1,182 @@
+#ifndef GaspardTrackerRectangle_h
+#define GaspardTrackerRectangle_h 1
+/*****************************************************************************
+ * Copyright (C) 2009-2013   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: N. de Sereville  contact address: deserevi@ipno.in2p3.fr *
+ *                                                                           *
+ * Creation Date  : 15/07/09                                                 *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription: Define a module of trapezoidal shape for the Gaspard tracker  *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+
+
+
+// C++ headers
+#include <vector>
+
+// NPTool header
+#include "GaspardTrackerModule.hh"
+#include "TInteractionCoordinates.h"
+
+using namespace std;
+
using namespace CLHEP;
+
+
+
+class GaspardTrackerRectangle : public GaspardTrackerModule
+{
+   ////////////////////////////////////////////////////
+   /////// Default Constructor and Destructor /////////
+   ////////////////////////////////////////////////////
+public:
+   GaspardTrackerRectangle();
+   virtual ~GaspardTrackerRectangle();
+
+   ////////////////////////////////////////////////////
+   //////// Specific Function of this Class ///////////
+   ////////////////////////////////////////////////////
+public:
+   // By Position Method
+   void AddModule(G4ThreeVector TL           ,
+                  G4ThreeVector BL           ,
+                  G4ThreeVector BR           ,
+                  G4ThreeVector CT           ,
+                  bool          wFirstStage  ,
+                  bool          wSecondStage ,
+                  bool          wThirdStage);
+
+   // By Angle Method
+   void AddModule(G4double R            ,
+                  G4double Theta        ,
+                  G4double Phi          ,
+                  G4double beta_u       ,
+                  G4double beta_v       ,
+                  G4double beta_w       ,
+                  bool     wFirstStage  ,
+                  bool     wSecondStage ,
+                  bool     wThirdStage);
+
+   // Effectively construct Volume
+   // Avoid to have two time same code for Angle and Point definition
+   void VolumeMaker(G4int             DetectorNumber,
+                    G4ThreeVector     MMpos,
+                    G4RotationMatrix* MMrot,
+                    bool              wFirstStage,
+                    bool              wSecondStage,
+                    bool              wThirdStage,
+                    G4LogicalVolume*  world);
+
+
+   ////////////////////////////////////////////////////
+   ////  Inherite from GaspardTrackerModule class /////
+   ////////////////////////////////////////////////////
+public:
+   // Read stream at Configfile to pick-up parameters of detector (Position,...)
+   // Called in DetecorConstruction::ReadDetextorConfiguration Method
+   void ReadConfiguration(string Path);
+
+   // Construct detector and inialise sensitive part.
+   // Called After DetecorConstruction::AddDetector Method
+   void ConstructDetector(G4LogicalVolume* world);
+
+   // Add Detector branch to the EventTree.
+   // Called After DetecorConstruction::AddDetector Method
+   void InitializeRootOutput();
+
+   // Initialize all scorers necessary for the detector
+   void InitializeScorers();
+
+   // Read sensitive part and fill the Root tree.
+   // Called at in the EventAction::EndOfEventAvtion
+   void ReadSensitive(const G4Event* event);
+
+   // Give the static TInteractionCoordinates from VDetector to the classes
+   // deriving from GaspardTrackerModule
+   // This is mandatory since the GaspardTracker*** does not derive from VDetector
+   void SetInterCoordPointer(TInteractionCoordinates* interCoord);
+   TInteractionCoordinates* GetInterCoordPointer()      {return ms_InterCoord;};
+
+
+   ////////////////////////////////////////////////////
+   ///////////////Private intern Data//////////////////
+   ////////////////////////////////////////////////////
+private:
+   // Interaction Coordinates coming from VDetector through the 
+   // SetInteractionCoordinatesPointer method
+   TInteractionCoordinates* ms_InterCoord;
+
+   // True if Define by Position, False is Define by angle
+   vector<bool>   m_DefinitionType  ;
+
+   // Used for "By Point Definition"
+   vector<G4ThreeVector>   m_X1_Y1     ; // Top Left Corner Position Vector
+   vector<G4ThreeVector>   m_X1_Y128   ; // Bottom Left Corner Position Vector
+   vector<G4ThreeVector>   m_X128_Y1   ; // Bottom Right Corner Position Vector
+   vector<G4ThreeVector>   m_X128_Y128 ; // Center Corner Position Vector
+
+   // Used for "By Angle Definition"
+   vector<G4double>  m_R      ; //  |
+   vector<G4double>  m_Theta  ; //  > Spherical coordinate of Strips Silicium Plate
+   vector<G4double>  m_Phi    ; //  |
+
+   vector<G4double>  m_beta_u ; //  |
+   vector<G4double>  m_beta_v ; //  > Tilt angle of the Telescope
+   vector<G4double>  m_beta_w ; //  |
+};
+
+
+
+namespace GPDRECT
+{
+   // Energy/Time resolutions for the different layers
+   const G4double ResoFirstStage  = 0.021          ;// = 52keV of Resolution   //   Unit is MeV/2.35
+   const G4double ResoSecondStage = 0.043          ;// = 130 keV of resolution //   Unit is MeV/2.35
+   const G4double ResoThirdStage  = 0.043          ;// = 100 kev of resolution //   Unit is MeV/2.35
+   const G4double ResoTimeGpd     = 0.212765957    ;// = 500ps                 //   Unit is  ns/2.35
+   const G4double ResoTimePPAC    = 0.106382979    ;// = 250ps                 //   Unit is  ns/2.35
+
+
+   // Threshold
+   const G4double EnergyThreshold = 0.2*MeV;
+
+   // Geometry
+   const G4double Length    = 115*mm;
+   const G4double Width     = 101*mm;
+   const G4double Depth     =  20*mm;
+   const G4double InterStageDistance = 7*mm;
+
+   // First stage
+   const G4double FirstStageLength    = 112.0*mm;
+   const G4double FirstStageWidth     =  99.6*mm;
+   const G4double FirstStageThickness = 500*micrometer;
+   const G4int    NumberOfStrips      = 128;
+
+   // Second stage
+   const G4double SecondStageLength    = FirstStageLength;
+   const G4double SecondStageWidth     = FirstStageWidth;
+   const G4double SecondStageThickness = 1.5*mm;
+
+   // Third stage
+   const G4double ThirdStageLength    = FirstStageLength;
+   const G4double ThirdStageWidth     = FirstStageWidth;
+   const G4double ThirdStageThickness = 1.5*mm;
+
+   // Starting at the front of the first stage and pointing to the third stage 
+   const G4double FirstStage_PosZ  = Depth* -0.5 + 0.5*FirstStageThickness;
+   const G4double SecondStage_PosZ = Depth* -0.5 + 0.5*SecondStageThickness + 1*InterStageDistance;
+   const G4double ThirdStage_PosZ  = Depth* -0.5 + 0.5*ThirdStageThickness  + 2*InterStageDistance;
+}
+
+#endif
diff --git a/NPSimulation/GASPARD/GaspardTrackerTrapezoid.hh b/NPSimulation/GASPARD/GaspardTrackerTrapezoid.hh
index f6993c11c..5e564cf44 100644
--- a/NPSimulation/GASPARD/GaspardTrackerTrapezoid.hh
+++ b/NPSimulation/GASPARD/GaspardTrackerTrapezoid.hh
@@ -154,17 +154,17 @@ namespace GPDTRAP
 //   const G4double BaseSmall = 35*mm;
 //   const G4double Length    = 20*mm;
    // gaspHyde
-   const G4double Height    = 115*mm;
-   const G4double BaseLarge =  98*mm;
-   const G4double BaseSmall =  30*mm;
-   const G4double Length    =  20*mm;
-   const G4double InterStageDistance = 7*mm;
-   // mugast 
-//   const G4double Height    = 106*mm;
-//   const G4double BaseLarge =  93*mm;
-//   const G4double BaseSmall =  26*mm;
+//   const G4double Height    = 115*mm;
+//   const G4double BaseLarge =  98*mm;
+//   const G4double BaseSmall =  30*mm;
 //   const G4double Length    =  20*mm;
 //   const G4double InterStageDistance = 7*mm;
+   // mugast 
+   const G4double Height    = 106*mm;
+   const G4double BaseLarge =  93*mm;
+   const G4double BaseSmall =  26*mm;
+   const G4double Length    =  20*mm;
+   const G4double InterStageDistance = 7*mm;
 
    // First stage
 //   const G4double FirstStageThickness = 300*micrometer;
@@ -177,13 +177,13 @@ namespace GPDTRAP
 //   const G4double FirstStageBaseLarge = 78*mm;
 //   const G4double FirstStageBaseSmall = 29*mm;
    // gaspHyde
-   const G4double FirstStageHeight    = 113.5*mm;
-   const G4double FirstStageBaseLarge =  97.5*mm;
-   const G4double FirstStageBaseSmall =  28.5*mm;
+//   const G4double FirstStageHeight    = 113.5*mm;
+//   const G4double FirstStageBaseLarge =  97.5*mm;
+//   const G4double FirstStageBaseSmall =  28.5*mm;
    // mugast
-//   const G4double FirstStageHeight    = 105*mm;
-//   const G4double FirstStageBaseLarge =  92.326*mm;
-//   const G4double FirstStageBaseSmall =  25.77*mm;
+   const G4double FirstStageHeight    = 105*mm;
+   const G4double FirstStageBaseLarge =  92.326*mm;
+   const G4double FirstStageBaseSmall =  25.77*mm;
 
    // Second stage
    const G4double SecondStageHeight    = FirstStageHeight;
-- 
GitLab