diff --git a/INSTALL b/INSTALL
index 2235f0b7d40d65a52d7522f02be5d73ed5a06aa4..5f4fa705f21ec3375cb06ba952f17382b93c083a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -28,9 +28,10 @@ I) REQUIREMENTS
 
 II) WORKING CONFIGURATIONS
 	The NPTool package has been mainly tested (and developped) with 
-	the two following configurations:
+	the following configurations:
 	1) Mac OS X (10.5.7) + G4 (4.9.2 and 4.9.3.b1) + CLHEP (2.0.4.2) + ROOT (5.22/00 and 5.24/00) + GSL ()
 	2) Linux Fedora (kernel 2.6.29) + G4 (4.9.1p3) + CLHEP (2.0.4.2) + ROOT (5.22/00) + GSL (1.12)
+	3) Linux Fedora (kernel 2.6.29) + G4 (4.9.2p2) + CLHEP (2.0.4.2) + ROOT (5.25/02) + GSL (1.12)
 	Please, report any working or non-working configuration.
 
 III) INSTALLATION
diff --git a/Inputs/DetectorConfiguration/DUMMYDetector.detector b/Inputs/DetectorConfiguration/DUMMYDetector.detector
new file mode 100755
index 0000000000000000000000000000000000000000..135a20792d276c041a2fee553bd6cab2a53039a3
--- /dev/null
+++ b/Inputs/DetectorConfiguration/DUMMYDetector.detector
@@ -0,0 +1,25 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+TheDUMMYDetector
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+DUMMYDetector
+	THETA= 0
+	PHI= 0
+	R= 150
+	Thickness= 20
+	Radius= 50
+	Material= material1
+	LeadThickness= 0
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+DUMMYDetector
+	THETA= 90
+	PHI= 0
+	R= 175
+	Thickness= 100
+	Radius= 50
+	Material= material2
+	LeadThickness= 0
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Avaible material:
+% material1
+% material2
diff --git a/Inputs/DetectorConfiguration/Riken_30mm.detector b/Inputs/DetectorConfiguration/Riken_30mm.detector
deleted file mode 100644
index 9b4ab4aec4e3b209c26c16fe6df7bf8603191609..0000000000000000000000000000000000000000
--- a/Inputs/DetectorConfiguration/Riken_30mm.detector
+++ /dev/null
@@ -1,121 +0,0 @@
-%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1
-%Thickness in micrometer
-%Radius in mm
-%Temperature in K, Pressure in bar
-%Material name according to the target library
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-GeneralTarget
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%Target
-	THICKNESS= 1
-	RADIUS=	45
-	MATERIAL= CD2
-	X= 0
-	Y= 0
-	Z= 0
-	
-CryoTarget
-	THICKNESS= 3
-	RADIUS=	45
-	TEMPERATURE= 26
-	PRESSURE= 1
-	MATERIAL= D2	
-	WINDOWSTHICKNESS= 0
-	WINDOWSMATERIAL= Mylar
-	X= 0
-	Y= 0
-	Z= 0			
-			
-			
-%%%%%%%%%%%%%%%%%%%%%			
-MUST2Array			
-%%%%%%% Telescope 1 %%%%%%%			
-M2Telescope 			
-X1_Y1=	10.85	105.03	146.16
-X1_Y128=	22.8	9.84	175.95
-X128_Y1=	104.09	105.03	108.76
-X128_Y128=	116.04	9.84	138.55
-SI=	1		
-SILI=	0		
-CSI=	1		
-VIS=	all		
-			
-%%%%%%% Telescope 2 %%%%%%%			
-M2Telescope 			
-X1_Y1=	-116.04	9.84	138.55
-X1_Y128=	-22.8	9.84	175.95
-X128_Y1=	-104.09	105.03	108.76
-X128_Y128=	-10.85	105.03	146.16
-SI=	1		
-SILI=	0		
-CSI=	1		
-VIS=	all		
-			
-%%%%%%% Telescope 3 %%%%%%%			
-M2Telescope 			
-X1_Y1=	-10.85	-105.03	146.16
-X1_Y128=	-22.8	-9.84	175.95
-X128_Y1=	-104.09	-105.03	108.76
-X128_Y128=	-116.04	-9.84	138.55
-SI=	1		
-SILI=	0		
-CSI=	1		
-VIS=	all		
-			
-%%%%%%% Telescope 4 %%%%%%%			
-M2Telescope 			
-X1_Y1=	116.04	-9.84	138.55
-X1_Y128=	22.8	-9.84	175.95
-X128_Y1=	104.09	-105.03	108.76
-X128_Y128=	10.85	-105.03	146.16
-SI=	1		
-SILI=	0		
-CSI=	1		
-VIS=	all		
-			
-%%%%%%% Telescope 5 %%%%%%%			
-M2Telescope 			
-X1_Y1=	-50.23	-50.23	325
-X1_Y128=	50.23	-50.23	325
-X128_Y1=	-50.23	50.23	325
-X128_Y128=	50.23	50.23	325
-SI=	1		
-SILI=	0		
-CSI=	1		
-VIS=	all		
-			
-%%%%%%%%%%%%%%%%%%%%			
-AddThinSi			
-%%%%%%%%% Det 1 %%%%%%%%			
-ThinSi			
-A=	18.39	9.66	143.67
-B=	65.26	9.66	124.87
-C=	59.44	56.09	110.34
-D=	12.57	56.09	129.14
-			
-%%%%%%%%% Det 2 %%%%%%%%			
-ThinSi			
-A=	-12.57	56.09	129.14
-B=	-59.44	56.09	110.34
-C=	-65.26	9.66	124.87
-D=	-18.39	9.66	143.67
-			
-%%%%%%%%% Det 3 %%%%%%%%			
-ThinSi			
-A=	-18.39	-9.66	143.67
-B=	-65.26	-9.66	124.87
-C=	-59.44	-56.09	110.34
-D=	-12.57	-56.09	129.14
-			
-%%%%%%%%% Det 4 %%%%%%%%			
-ThinSi			
-A=	12.57	-56.09	129.14
-B=	59.44	-56.09	110.34
-C=	65.26	-9.66	124.87
-D=	18.39	-9.66	143.67
-			
-
-			
-
-
diff --git a/Inputs/DetectorConfiguration/Riken_65mm.detector b/Inputs/DetectorConfiguration/Riken_65mm.detector
index eb0d0456e9db69bcc2f21e1d8c2fc78f82962e35..31d9cbda56cb74ee9702fc462440060d3930e6b1 100644
--- a/Inputs/DetectorConfiguration/Riken_65mm.detector
+++ b/Inputs/DetectorConfiguration/Riken_65mm.detector
@@ -153,7 +153,7 @@ Plastic
 	R= 318
 	Thickness= 20
 	Radius= 20
-	Scintillator= BC452_10
+	Scintillator= BC400
 	LeadThickness= 0
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 Plastic
@@ -162,7 +162,7 @@ Plastic
 	R= 343
 	Thickness= 30
 	Radius= 20
-	Scintillator= BC452_10
+	Scintillator= BC400
 	LeadThickness= 2
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
diff --git a/Inputs/EventGenerator/10He.reaction b/Inputs/EventGenerator/10He.reaction
index 18dd9fe54efe5206f74414810dbe5d8c3fceda18..2c89aa85c0eaa4890c09a387316198103333f977 100644
--- a/Inputs/EventGenerator/10He.reaction
+++ b/Inputs/EventGenerator/10He.reaction
@@ -7,7 +7,7 @@ TransfertToResonance
 	Target= 2H
 	Light= 3He
 	Heavy= 10He
-	ExcitationEnergy= 4.0
+	ExcitationEnergy= 2.0
 	BeamEnergy= 550
 	BeamEnergySpread= 0
 	SigmaThetaX= 0.6921330164
@@ -16,10 +16,10 @@ TransfertToResonance
 	SigmaY= 9.069
 	ResonanceWidth= 0
 	ResonanceDecayZ= 2
-	ResonanceDecayA= 6
+	ResonanceDecayA= 8
 	CrossSectionPath= 11Li(d,3He)10He.txt	
 	ShootLight= 1
-	ShootHeavy= 1
+	ShootHeavy= 0
 	ShootDecayProduct= 0
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
diff --git a/Inputs/EventGenerator/10Li-dp.reaction b/Inputs/EventGenerator/10Li-dp.reaction
deleted file mode 100644
index 7da31ea77506542ce763e9ef0b220c5510c64763..0000000000000000000000000000000000000000
--- a/Inputs/EventGenerator/10Li-dp.reaction
+++ /dev/null
@@ -1,21 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%% Reaction file for 11Li(d,3He)10He reaction %%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Beam energy given in MeV ; Excitation in MeV ; SigmaXY in mm
-%  SigmaThetaX/PhiY in deg
-Transfert
-	Beam= 9Li
-	Target= 2H
-	Light= 1H
-	Heavy= 10Li
-	ExcitationEnergy= 0.0
-	BeamEnergy= 450
-	BeamEnergySpread= 0
-	SigmaThetaX= 0.6921330164
-	SigmaPhiY= 0.963142053
-	SigmaX= 6.232
-	SigmaY= 9.069
-	CrossSectionPath= 9Li(d,p).txt
-	ShootLight= 1
-	ShootHeavy= 0
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/Inputs/EventGenerator/11Li.reaction b/Inputs/EventGenerator/11Li.reaction
deleted file mode 100644
index 61c6bc4d4090ca126a27d674352baab481d20a98..0000000000000000000000000000000000000000
--- a/Inputs/EventGenerator/11Li.reaction
+++ /dev/null
@@ -1,21 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%% Reaction file for 11Li(d,3He)10He reaction %%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Beam energy given in MeV ; Excitation in MeV ; SigmaXY in mm
-%  SigmaThetaX/PhiY in deg
-Transfert
-	Beam= 11Li
-	Target= 2H
-	Light= 2H
-	Heavy= 11Li
-	ExcitationEnergy= 1.0
-	BeamEnergy= 550
-	BeamEnergySpread= 0
-	SigmaThetaX= 0.6921330164
-	SigmaPhiY= 0.963142053
-	SigmaX= 6.232
-	SigmaY= 9.069
-	CrossSectionPath= flat.txt
-	ShootLight= 1
-	ShootHeavy= 0
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/Inputs/EventGenerator/3He.source b/Inputs/EventGenerator/3He.source
index 744bfb7ca322df2fce1c38886fa6bef29aff5d90..8fa0b8698412b53f993a685d44e12862aabcb8ff 100644
--- a/Inputs/EventGenerator/3He.source
+++ b/Inputs/EventGenerator/3He.source
@@ -5,9 +5,9 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 Isotropic
 	EnergyLow=  0	
-	EnergyHigh= 300
+	EnergyHigh= 21.6
 	HalfOpenAngleMin= 0
-	HalfOpenAngleMax= 180
+	HalfOpenAngleMax= 90
 	x0= 0	
 	y0= 0	
 	z0= 0	
diff --git a/Inputs/EventGenerator/alpha.source b/Inputs/EventGenerator/alpha.source
index 17aa3c77eb3bcab6df72835193c70dcc7b6dbcac..fd5f19e5259addc2b6bbccaeb2e2bcb97b08b3e1 100644
--- a/Inputs/EventGenerator/alpha.source
+++ b/Inputs/EventGenerator/alpha.source
@@ -5,9 +5,9 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 Isotropic
 	EnergyLow= 0
-	EnergyHigh= 300
-	HalfOpenAngleMin= 90
-	HalfOpenAngleMax= 180
+	EnergyHigh= 21.6
+	HalfOpenAngleMin= 0
+	HalfOpenAngleMax= 90
 	x0= 0	
 	y0= 0	
 	z0= 0	
diff --git a/NPAnalysis/10He_Riken/Analysis b/NPAnalysis/10He_Riken/Analysis
index e0e3b14b288fb653c9e27f5969bf5190118bab1c..b768b4a077d09084adc810427cf9d75063298eb6 100755
Binary files a/NPAnalysis/10He_Riken/Analysis and b/NPAnalysis/10He_Riken/Analysis differ
diff --git a/NPAnalysis/10He_Riken/include/ObjectManager.hh b/NPAnalysis/10He_Riken/include/ObjectManager.hh
index bc9b0684a7361b53b5700a7bcb330281ffaefa54..a574b5198d434aee3dd43eb5d14532eb53345557 100644
--- a/NPAnalysis/10He_Riken/include/ObjectManager.hh
+++ b/NPAnalysis/10He_Riken/include/ObjectManager.hh
@@ -7,7 +7,6 @@
 
 // NPA
 #include "DetectorManager.hh"
-#include "Must2Array.h"
 
 // STL C++
 #include <iostream>
@@ -27,13 +26,14 @@
 #include <TRandom.h>
 
 // NPL
-#include "TMust2Data.h"
-#include "TMust2Physics.h"
 #include "TPlasticData.h"
 #include "NPReaction.h"
 #include "RootInput.h"
 #include "RootOutput.h"
 #include "TInitialConditions.h"
+#include "TMust2Physics.h"
+#include "TSSSDPhysics.h"
+#include "TPlasticPhysics.h"
 
 // Use CLHEP System of unit and Physical Constant
 #include "CLHEP/Units/GlobalSystemOfUnits.h"
@@ -109,39 +109,39 @@ namespace ENERGYLOSS
 		//	3He Energy Loss
 			EnergyLoss He3TargetWind = EnergyLoss 	(	"3He_Mylar.txt" 		,
 														1000	 				,
-														1						,
+														3					,
 														3						);
 		
-			EnergyLoss He3TargetGaz = EnergyLoss 	(	"3He_D2gaz_1b_26K.txt" 	,
+			EnergyLoss He3TargetGaz = EnergyLoss 	(	"3He_D2solid_1b_26K.txt" 	,
 														1000	 				,
-														1						,
+														3						,
 														3						);
 			
 			EnergyLoss He3StripAl   = EnergyLoss 	(	"3He_Al.txt" 			,
 														1000						,
-														1						,
+														3						,
 														3						);
 														
 			EnergyLoss He3StripSi   = EnergyLoss 	(	"3He_Si.txt" 			,
 														1000						,
-														1						,
+														3					,
 														3						);
 														
 														
 		//	proton Energy Loss
 			EnergyLoss protonTargetWind = EnergyLoss 	(	"proton_Mylar.txt"	 		,
 															1000		 				,
-															1							,
+															3						,
 															1							);
 		
 			EnergyLoss protonTargetGaz = EnergyLoss 	(	"proton_D2gaz_1b_26K.txt" 	,
 															1000		 				,
-															1							,
+															3						,
 															1							);
 			
 			EnergyLoss protonStripAl   = EnergyLoss 	(	"proton_Al.txt" 			,
 															100							,
-															1							,
+															3							,
 															1							);
 														
 	
diff --git a/NPAnalysis/10He_Riken/src/Analysis.cc b/NPAnalysis/10He_Riken/src/Analysis.cc
index ca47ae0997ea8a394215e43e50beec12a41c549a..fff2be80b9eface95fc334174485f0490c498e9a 100644
--- a/NPAnalysis/10He_Riken/src/Analysis.cc
+++ b/NPAnalysis/10He_Riken/src/Analysis.cc
@@ -13,67 +13,61 @@ int main(int argc,char** argv)
 			return 0;
 		} 
 	
-	string reactionfileName 	= argv[1]	;
-	string detectorfileName 	= argv[2]	;
-	string runToReadfileName 	= argv[3]	;
+	string detectorfileName 		= argv[1]	;
+	string calibrationfileName 	= argv[2]	;
+	string runToReadfileName 		= argv[3]	;
 	
 	//	First of All instantiate RootInput and Output
 	//	Detector will be attached later
 	RootInput:: getInstance(runToReadfileName)	;
 	RootOutput::getInstance("Analysis/10HeRiken_AnalyzedData", "AnalyzedTree")					;
 	
-	//	Instantiate a Reaction
-	NPL::Reaction* myReaction = new Reaction					;
-	myReaction	->	ReadConfigurationFile(reactionfileName)		;
+	//	Instantiate some Reaction
+	NPL::Reaction*  He10Reaction = new Reaction								;
+	He10Reaction	->	ReadConfigurationFile("10He.reaction")	;
 
-		//	Instantiate the detector using a file 
-	DetectorManager* myDetector = new DetectorManager 			;
+	NPL::Reaction*  Li10Reaction = new Reaction								;
+	Li10Reaction	->	ReadConfigurationFile("9Li-dp-10Li.reaction")		;
+
+	//	Instantiate the detector using a file 
+	DetectorManager* myDetector = new DetectorManager 			  ;
 	myDetector	->	ReadConfigurationFile(detectorfileName)		;
+
+	//	Instantiate the Calibration Manger using a file
+	CalibrationManager* myCalibration = new CalibrationManager(calibrationfileName) ;
 	
 	//	Attach more branch to the output
 	
 	double ELab[2], ExcitationEnergy[2]	;
-	double ThetaLab[2]	, ThetaCM[2]	;
-	double X[2] , Y[2] 					;
-	double EPl1[2], EPl2[2] 			;
-	double ThinSi_E						;
+	double ThetaLab[2]	, ThetaCM[2]		;
+	double X[2] , Y[2] 									;
+
 	// Exitation Energy
 	RootOutput::getInstance()->GetTree()->Branch("ExcitationEnergy",ExcitationEnergy,"ExcitationEnergy[2]/D") ;
 
 	//E lab et Theta lab
-	RootOutput::getInstance()->GetTree()->Branch("ELab",ELab,"ELab[2]/D") ;
-	RootOutput::getInstance()->GetTree()->Branch("ThetaLab",ThetaLab,"ThetaLab[2]/D") ;
-	RootOutput::getInstance()->GetTree()->Branch("ThinSi_E",&ThinSi_E,"ThinSi_E/D") ;
-	
-	RootOutput::getInstance()->GetTree()->Branch("X",X,"X/D[2]") ;
-	RootOutput::getInstance()->GetTree()->Branch("Y",Y,"Y/D[2]") ;
+	RootOutput::getInstance()->GetTree()->Branch("ThetaCM",ThetaCM,"ThetaCM[2]/D") 	;
+	RootOutput::getInstance()->GetTree()->Branch("ELab",ELab,"ELab[2]/D") 					;
+	RootOutput::getInstance()->GetTree()->Branch("X",X,"X/D[2]") 										;
+	RootOutput::getInstance()->GetTree()->Branch("Y",Y,"Y/D[2]")									 	;
 	
-	RootOutput::getInstance()->GetTree()->Branch("ThetaCM",ThetaCM,"ThetaCM[2]/D") ;
-	
-	RootOutput::getInstance()->GetTree()->Branch("Plastic1_Energy",EPl1,"EPl[2]/D") ;
-	RootOutput::getInstance()->GetTree()->Branch("Plastic2_Energy",EPl2,"DEPl[2]/D") ;
 	
 	//	Get the formed Chained Tree and Treat it
 	TChain* Chain = RootInput:: getInstance() -> GetChain()	;
- 	   
+
 	// Open the ThinSi Branch
-	Chain->SetBranchStatus("ThinSiEnergy",true)	;
 	Chain->SetBranchStatus("InitialConditions",true)	;
 	Chain->SetBranchStatus("fIC_*",true)	; 
- 	Chain->SetBranchStatus("fPlastic_*",true);
  		
 	TInitialConditions* Init = new TInitialConditions();
-	Chain->SetBranchAddress("ThinSiEnergy"		,&ThinSi_E	);
 	Chain->SetBranchAddress("InitialConditions"	,&Init		);
 	
-	TPlasticData* Plastic = new TPlasticData() ;
-	Chain->SetBranchAddress("Plastic",&Plastic	);
-	
  	double XTarget=0 ; double YTarget=0; double BeamTheta = 0 ; double BeamPhi = 0 ; double E=-1000;
 
-	// Get Must2 Pointer:
-	MUST2Array* M2 = (MUST2Array*) myDetector -> m_Detector["MUST2"] ;
-	
+	// Get Detector Pointer:
+	TMust2Physics* M2 		= (TMust2Physics*) 			myDetector -> m_Detector["MUST2"] 	;
+	TPlasticPhysics* Pl 	= (TPlasticPhysics*) 		myDetector -> m_Detector["Plastic"] ;
+	TSSSDPhysics* ThinSi 	= (TSSSDPhysics*) 			myDetector -> m_Detector["SSSD"] 		;
 	cout <<  " ///////// Starting Analysis ///////// "<< endl << endl ;
 	
 	int i ,N=Chain -> GetEntries();
@@ -89,8 +83,6 @@ int main(int argc,char** argv)
 				{
 					ELab[hh] = -1 	; ExcitationEnergy[hh] = -1 ; ThetaLab[hh] = -1 ;	
 					X[hh]	 = -1000	; Y[hh]					= -1000 ; ThetaCM[hh]  = -1 ;
-					EPl1[hh] = 0	; EPl2[hh]				= 0 ;
-					ThinSi_E = -1 	;
 				}
 
 			// Minimum code
@@ -115,7 +107,7 @@ int main(int argc,char** argv)
 			myDetector -> BuildPhysicalEvent()				;
 			////
 			
-			// Target (from initial condition)
+/*			// Target (from initial condition)
 			XTarget = Init->GetICPositionX(0);
 			YTarget = Init->GetICPositionY(0);
 			//	XTarget = RandomEngine.Gaus(Init->GetICPositionX(0),1);
@@ -127,7 +119,7 @@ int main(int argc,char** argv)
 			// Must 2 And ThinSi //
 			for(int hit = 0; hit < M2 -> GetEventMultiplicity() ; hit ++)
 				{
-					ELab[hit] = M2 -> GetEnergyDeposit(hit);
+				//	ELab[hit] = M2 -> GetEnergyDeposit(hit);
 					TVector3 HitDirection  = M2 -> GetPositionOfInteraction(hit) - TVector3(XTarget,YTarget,0);
 					
 					// Angle between beam and particle
@@ -140,38 +132,42 @@ int main(int argc,char** argv)
 					if(M2 -> GetPositionOfInteraction(hit).Z()>0)
 						{
 							if(ELab[hit]>-1000 && ThinSi_E>0 )	
+							if(M2Physics.CsI.size)
 								{
-										ELab[hit]= He3StripAl.EvaluateInitialEnergy(	ELab[hit] 			, // Energy of the detected particle
-																						2*0.4*micrometer	, // Target Thickness at 0 degree
-																						ThetaMM2Surface		);
+										ELab[hit]= He3StripAl.EvaluateInitialEnergy(	ELab[hit] 				, // Energy of the detected particle
+																																	2*0.4*micrometer	, // Target Thickness at 0 degree
+																																	ThetaMM2Surface		);
+
 																				
-										ELab[hit]= He3StripSi.EvaluateInitialEnergy(	ELab[hit] 			, // Energy of the detected particle
-																						20*micrometer		, // Target Thickness at 0 degree
-																						ThetaMM2Surface		);																
+										ELab[hit]= He3StripSi.EvaluateInitialEnergy(	ELab[hit] 				, // Energy of the detected particle
+																																	20*micrometer			, // Target Thickness at 0 degree
+																																	ThetaMM2Surface		);																
 										
 
-										ELab[hit]= He3StripAl.EvaluateInitialEnergy(	ELab[hit] 			, // Energy of the detected particle
-																					0.4*micrometer		, // Target Thickness at 0 degree
-																						ThetaMM2Surface		);
+										ELab[hit]= He3StripAl.EvaluateInitialEnergy(	ELab[hit] 				, // Energy of the detected particle
+																																	0.4*micrometer		, // Target Thickness at 0 degree
+																																	ThetaMM2Surface		);
 
 										ELab[hit]= He3TargetWind.EvaluateInitialEnergy( ELab[hit] 			, // Energy of the detected particle
-																						15*micrometer		, // Target Thickness at 0 degree
-																						ThetaN				);
+																																		15*micrometer		, // Target Thickness at 0 degree
+																																		ThetaN					);
 																			
 										ELab[hit]= He3TargetGaz.EvaluateInitialEnergy(	ELab[hit] 			, // Energy of the detected particle
-																						1.5*mm				, // Target Thickness at 0 degree
-																						ThetaN				);
+																																		1.5*mm					, // Target Thickness at 0 degree
+																																		ThetaN					);
 																						
-									ThetaCM[hit] = myReaction -> EnergyLabToThetaCM( ELab[hit] , 1 ) /deg 	;
+									ThetaCM[hit] = myReaction -> EnergyLabToThetaCM( ELab[hit] ) /deg 	;
 									ExcitationEnergy[hit] = myReaction -> ReconstructRelativistic( ELab[hit] , ThetaLab[hit] ) 		;	
 									X[hit] = HitDirection . X();
+									X[hit] = HitDirection . X();
 									Y[hit] = HitDirection . Y();	
 									ThetaLab[hit] = ThetaLab[hit] / deg ;
 								}
 
 							else if(ELab[hit]>-1000 )
 								{
-									if(ELab[hit]>21.66)//CsI are inside a Mylar foil, plus rear alu strip
+					
+								if(ELab[hit]>21.66)//CsI are inside a Mylar foil, plus rear alu strip
 										{
 											ELab[hit]= He3TargetWind.EvaluateInitialEnergy( ELab[hit] 		, // Energy of the detected particle
 																						3*micrometer		, // Target Thickness at 0 degree
@@ -179,8 +175,7 @@ int main(int argc,char** argv)
 											ELab[hit]= He3StripAl.EvaluateInitialEnergy(	ELab[hit] 		, // Energy of the detected particle
 																						0.4*micrometer		, // Target Thickness at 0 degree
 																						ThetaMM2Surface		);
-										}
-								
+										}							
 									ELab[hit]= He3StripAl.EvaluateInitialEnergy(	ELab[hit] 		, // Energy of the detected particle
 																				0.4*micrometer		, // Target Thickness at 0 degree
 																				ThetaMM2Surface		);
@@ -244,10 +239,10 @@ int main(int argc,char** argv)
 			// Plastic
 			for(int yy = 0 ; yy < Plastic->GetEnergySize() ; yy++)
 				{
-						 if(Plastic->GetPlasticNumber(yy)==1) EPl1[yy]=Plastic->GetEnergy(yy);
+						   if(Plastic->GetPlasticNumber(yy)==1) EPl1[yy]=Plastic->GetEnergy(yy);
 					else if(Plastic->GetPlasticNumber(yy)==2) EPl2[yy]=Plastic->GetEnergy(yy);
 					
-				}
+				}*/
 			
 			RootOutput::getInstance()->GetTree()->Fill()	;
 		}
@@ -258,7 +253,6 @@ int main(int argc,char** argv)
 	return 0	;
 }
 
-
 double ThetaCalculation (TVector3 A , TVector3 B)
 	{
 		double Theta = acos( (A.Dot(B)) / (A.Mag()*B.Mag()) ) ;
diff --git a/NPAnalysis/10He_Riken/src/DetectorManager.cc b/NPAnalysis/10He_Riken/src/DetectorManager.cc
index 000d61fe3827077359d77aa4c4f2af460364fbfd..49447f19abc5453ebf3dbf3898089d01e681ca37 100644
--- a/NPAnalysis/10He_Riken/src/DetectorManager.cc
+++ b/NPAnalysis/10He_Riken/src/DetectorManager.cc
@@ -6,8 +6,9 @@
 #include <cstdlib>
 
 //	Detector	
-#include "Must2Array.h"
-
+#include "TMust2Physics.h"
+#include "TSSSDPhysics.h"
+#include "TPlasticPhysics.h"
 /////////////////////////////////////////////////////////////////////////////////////////////////
 //	Default Constructor and Destructor
 DetectorManager::DetectorManager()	
@@ -27,10 +28,11 @@ void	DetectorManager::ReadConfigurationFile(string Path)
 	   string DataBuffer;
 
 	   /////////Boolean////////////////////
-	   bool MUST2           = false  ;
-	   bool AddThinSi       = false  ;
-	   bool GeneralTarget   = false  ;
-	   bool GPDTracker      = false  ;	// Gaspard Tracker
+	   bool MUST2           		= false  ;
+	   bool AddThinSi       		= false  ;
+	   bool ScintillatorPlastic	= false  ;
+	   bool GeneralTarget   		= false  ;
+	   bool GPDTracker      		= false  ;	// Gaspard Tracker
 	   //////////////////////////////////////////////////////////////////////////////////////////
 	   // added by Nicolas [07/05/09]
 	   string GlobalPath = getenv("NPTOOL");
@@ -53,7 +55,7 @@ void	DetectorManager::ReadConfigurationFile(string Path)
 
 	   while (!ConfigFile.eof()) {
 	      //Pick-up next line
-	      getline(ConfigFile, LineBuffer);
+	      getline(ConfigFile, LineBuffer);cout << LineBuffer<<endl;
 	      //Search for comment Symbol: %
 	      if (LineBuffer.compare(0, 1, "%") == 0) {   /*Do  Nothing*/ ;}
 
@@ -84,7 +86,7 @@ void	DetectorManager::ReadConfigurationFile(string Path)
 	         cout << "//////// MUST2 Array ////////" << endl   << endl   ;
 
 	         // Instantiate the new array as a VDetector Object
-	         VDetector* myDetector = new MUST2Array()                 ;
+	         VDetector* myDetector = new TMust2Physics()                 ;
 
 	         // Read Position of Telescope
 	         ConfigFile.close()                                    ;
@@ -95,15 +97,15 @@ void	DetectorManager::ReadConfigurationFile(string Path)
 	         AddDetector("MUST2" , myDetector)                               ;
 	      }
 
-	/*      ////////////////////////////////////////////
-	      ////////// Search for Add.ThinSi ///////////
+	    	////////////////////////////////////////////
+	      ////////// Search for ThinSi (SSSD)/////////
 	      ////////////////////////////////////////////
 	      else if (LineBuffer.compare(0, 9, "AddThinSi") == 0 && AddThinSi == false) {
 	         AddThinSi = true ;
 	         cout << "//////// Thin Si ////////" << endl << endl   ;
 
 	         // Instantiate the new array as a VDetector Object
-	         VDetector* myDetector = new ThinSi()                  ;
+	         VDetector* myDetector = new TSSSDPhysics()                  ;
 
 	         // Read Position of Telescope
 	         ConfigFile.close()                                 ;
@@ -111,10 +113,29 @@ void	DetectorManager::ReadConfigurationFile(string Path)
 	         ConfigFile.open(Path.c_str())                      ;
 
 	         // Add array to the VDetector Vector
-	         AddDetector(myDetector)                            ;
+	         AddDetector("SSSD",myDetector)                            ;
 	      }
-
+	      
+	      
 	      ////////////////////////////////////////////
+	      ///////////// Search for Plastic ///////////
+	      ////////////////////////////////////////////
+	      else if (LineBuffer.compare(0, 19, "ScintillatorPlastic") == 0 && ScintillatorPlastic == false) {
+	         ScintillatorPlastic = true 														;
+	         cout << "//////// Plastic ////////" << endl << endl   	;
+
+	         // Instantiate the new array as a VDetector Object
+	         VDetector* myDetector = new TPlasticPhysics()          ;
+	         // Read Position of Telescope
+	         ConfigFile.close()                                 		;
+	         myDetector->ReadConfiguration(Path)                   	;
+	         ConfigFile.open(Path.c_str())                      		;
+
+	         // Add array to the VDetector Vector
+	         AddDetector("Plastic",myDetector)                      ;
+	      }
+
+	 /*     ////////////////////////////////////////////
 	      //////////// Search for Target /////////////
 	      ////////////////////////////////////////////
 
@@ -201,7 +222,7 @@ void	DetectorManager::InitializeRootOutput()
 	
 void	DetectorManager::AddDetector(string DetectorName , VDetector* newDetector)	
 	{
-		m_Detector["MUST2"] = newDetector ;
+		m_Detector[DetectorName] = newDetector ;
 	}
 /////////////////////////////////////////////////////////////////////////////////////////////////
 void	DetectorManager::ClearEventPhysics()	
diff --git a/NPAnalysis/10He_Riken/src/GNUmakefile b/NPAnalysis/10He_Riken/src/GNUmakefile
index bf3890ce84f41ccf1398ac342084e30310d475f2..8241a5d3adecbc7f45413fd8667f6645dac119e0 100644
--- a/NPAnalysis/10He_Riken/src/GNUmakefile
+++ b/NPAnalysis/10He_Riken/src/GNUmakefile
@@ -16,9 +16,11 @@ CXXFLAGS += -I$(NPAINCLUDES)
 CXXFLAGS += -I$(NPLIB)/include
 
 LDFLAGS  = `root-config --libs` -lMathMore
-LDFLAGS+= -L$(NPLIB)/lib -lVDetector -lIORoot -lReaction -lEnergyLoss \
+LDFLAGS+= -L$(NPLIB)/lib -lCalibrationManager -lVDetector -lIORoot -lReaction -lEnergyLoss \
 			-lMust2Data -lMust2Physics \
-			-lAnnularS1Data -lGaspardData -lPlasticData\
+			-lAnnularS1Data -lGaspardData \
+			-lPlasticData -lPlasticPhysics \
+			-lSSSDData -lSSSDPhysics \
 			-lInitialConditions -lInteractionCoordinates
 LDFLAGS+= -L$(CLHEP_LIB_DIR) -l$(CLHEP_LIB) 
 
diff --git a/NPDocumentation/NPTool_UserGuide.tex b/NPDocumentation/NPTool_UserGuide.tex
index b0827546f28c025e5f471629f014820464d8adeb..5de778589ad18ba5aaceed155d4044b2a7486748 100755
--- a/NPDocumentation/NPTool_UserGuide.tex
+++ b/NPDocumentation/NPTool_UserGuide.tex
@@ -44,13 +44,13 @@ In NPTool analysis and simulation are linked together. The proposed way of worki
 
 				\begin{figure}[!htbp]
 					\centering
-					\includegraphics[width=1\textwidth]{./pictures/nptool_scheme_Sim.png}
+					\includegraphics[width=0.5\textwidth]{./pictures/nptool_scheme_Sim.png}
 					\caption{ \emph{Phase 1: Preparing an experiment} }
 				\end{figure}
 
 				\begin{figure}[!htbp]
 					\centering
-					\includegraphics[width=1\textwidth]{./pictures/nptool_scheme_Ana.png}
+					\includegraphics[width=0.5\textwidth]{./pictures/nptool_scheme_Ana.png}
 					\caption{ \emph{Phase 2: Analysing an experiment} }
 				\end{figure}	
 				
@@ -75,7 +75,7 @@ In NPTool analysis and simulation are linked together. The proposed way of worki
 				
 \chapter[NPSimulation]{NPSimulation}
 
-\section{NPSimulation}
+\section{Introduction}
 
 NPSimulation is build on top of Geant4. It's provide a coherent and modular sets of classes that can be easily modified for your purpose.
 
@@ -89,22 +89,15 @@ Because NPS is build on top of Geant4, you need C++ knowledge and Geant4 skills
 NPTool
 NPS used two input files, one for the EventGenerator, and one for the Detectors Geometry. Those file are regroup in the \$NPT/Input directory wher you can find the EventGenerator and the DetectorConfiguration folder. If you want to add a new case you just have to create a new file in those directory. Note that files in the input directory are token readable file. It mean that they are not compile with the code, just read at each programm lauch. This way you can change the position of your detector or the energy of your beam for example without recompile the code. You can also quickly exchange your file with collaborators.
 
-\subsection{ Running a simulation with existing detectors and event generator }
+\section{ Running a simulation with existing detectors and event generator }
 
 Running a NPSimulation is quite simple, first, start a console terminal (shell) and put your self in the NPS directory. If you have add the environment variable correctly you can use the \emph{NPS} short cut that open the NPSimulation directory.
 	
-	\begin{footnotesize}
-	\begin{center}
-	\begin{tabular}{|p{\textwidth}|}
-		\hline
-			[myName@myDomain$\sim$ ]\${} NPS
+	\begin{verbatim}
+			[myName@myDomain ~]$ NPS
 			
-			[myName@myDomain$\sim$NPSimulation]\${} Simulation myReaction myDetector
-		\\
-		\hline
-	\end{tabular}
-	\end{center}
-	\end{footnotesize}
+			[myName@myDomain NPSimulation]$ Simulation myReaction myDetector
+	\end{verbatim}
 	
 \emph{NB: order of arguments is essential. Both file need to be in the associated directory (see previous section).}
 
@@ -135,7 +128,9 @@ Idle> tracking/verbose 1
 
 The simulation will use the configured EventGenerator describe in your input file to generate events. Geant4 will deal with the particle tracking, energy loss, decay,... and the NPS framework generate an output ROOT file in the \$NPT/Output/Simulation directory. Default name for this file is mySimul.root. Since the file is regenerated at each execution, one need to rename it in order to keep it.
 
-\subsection{ Adding a detector to NPS }
+\section{ Adding a detector to NPS }
+
+\subsection{ the VDetector class}
 
 First you can have a look to the VDetector.hh file in the \$NPS/include directory. All the detector inherited from this Virtual class (V in VDetector stand for that, following the Geant4 naming convention). A virtual class described what should be the standard features of the inherited object. In this case their is 5 methods: Note thats those method are virtual, wich mean they are not implemented within this virtual class but in the daughter class. That allow to have the same method implemented differently for each detector. The " = 0 " following the class header mean that compilation failed if the daugter class do not have its own method definition (wich can be eventually empty). A Vector of VDetector is manage by the DetectorConstruction file (see DetectorConstruction.hh and .cc) wich call those method automatically.
 
@@ -151,11 +146,113 @@ The two last methods are followed by a "{}" wich mean you are free to implemente
 		\item[] InitializeScorers(): Initialize the scorer (see GeneralScorer.hh and Geant4 Documentation)
 	\end{itemize}
 
+\section{ Step by Step from the DUMMYDetector class}
+	The DUMMYDetector is a simple example of detector class manage in NPSimulation. We will use this class as a starting point for adding your new detector
+
+	\subsection{Step 1 : copying}
+		An easy step, just copy the file DummyDetector.cc and DummyDetector.hh in the NPSimulation/src and NPSimulation/include directory. Then rename them after your detector name, let say WonderfulDetector for the rest of the exemple. Open them with your favorite editor and use the replace function to replace all the DUMMYDetector occurence by your detector name, WondenfulDetector. You almost have finnish...
+
+	\subsection{Step 2 : adding your detector to the Detector Construction}
+		In order to allow the detector construction ton instantiate detector of yours you have to "tell him" to search for such detector. Open the DetectorConstruction.cc file in the NPSimulation/src directory. Have a look at the preprocessor includes, their is a list of all the detector avaible, just add a line with your file :
+	\begin{verbatim}
+	#include "WinderfulDetector.hh"
+	\end{verbatim}
+
+		Now DetectorConstruction know the WonderfulDetector class, but do not know how to find it in an input file. Have look to the DetectorConstruction::ReadConfigurationFile method. In this method Detector construction is reading the detector input file and looking for what kind of detector are presents. Every time a new kind of detector is detected, a new array of this kind is instantiate and inialize via is own ReadConfiguration method. For that, every class need an "array starting" token, wich should be different of the "module starting" token. In our case we will choose "WonderfulArray" as an array starting token. In order to avoid infinite loop of adding and adding the same detector again and again we need a boolean check, that simply check this kind of array is not already instantiate. First, add one of this boolean, lets called it cWonderful, your code should look like that
+
+	\begin{verbatim}
+		/////////Checking Boolean////////////////////
+		bool cMUST2           = false;
+		bool cAddThinSi       = false;
+		bool cGeneralTarget   = false;
+		bool cGPDTracker      = false;	// Gaspard Tracker
+		bool cS1              = false;
+		bool cPlastic         = false;
+		bool cDummy         	= false;
+		bool cWonderful				= false;
+	\end{verbatim}
+
+
+	Then add the small searching sequence right after the Dummy Detector Sequence:
+			
+	\begin{verbatim}
+					////////////////////////////////////////////
+					/////// Search for a Dummy Detector ////////
+					////////////////////////////////////////////
+					else if (LineBuffer.compare(0, 16, "TheDUMMYDetector") == 0 && cDummy == false) {
+						cDummy = true ;
+						G4cout << "//////// DUMMY DETECTOR ////////" << G4endl << G4endl;
+
+						// Instantiate the new array as a VDetector Object
+						VDetector* myDetector = new DUMMYDetector();
+
+						// Read Position of detector
+						ConfigFile.close();
+						myDetector->ReadConfiguration(Path);
+						ConfigFile.open(Path.c_str());
+
+						// Add array to the VDetector Vector
+						AddDetector(myDetector);
+					}
+
+					////////////////////////////////////////////
+					//// Search for a Wonderful Detector //////
+					////////////////////////////////////////////
+					else if (LineBuffer.compare(0, 15, "WonderfulArray") == 0 && cWonderful == false) {
+						cWonderful = true ;
+						G4cout << "//////// wonderful ARRAY ////////" << G4endl << G4endl;
+
+						// Instantiate the new array as a VDetector Object
+						VDetector* myDetector = new WonderfulDetector();
+
+						// Read Position of detector
+						ConfigFile.close();
+						myDetector->ReadConfiguration(Path);
+						ConfigFile.open(Path.c_str());
+
+						// Add array to the VDetector Vector
+						AddDetector(myDetector);
+		      }
+	\end{verbatim}
+
+	\subsection{Step 3 : Data output}
+
+	Lets have look to your Detector code. Open the WonderfulDetector.hh file and look at the private member, you should find the following line
+
+	\begin{verbatim}
+		////////////////////////////////////////////////////
+		///////////Event class to store Data////////////////
+		////////////////////////////////////////////////////
+		private:
+			TWonderfulDetectorData* m_Event ;
+
+	\end{verbatim}
+
+	The TWonderfulDetectorData class probably do not exist yet. So you will have to create one, for that, follow the tutorial in the NPLib chapter. If this class do not exist and you do not want to create one right now, simply use the TDUMMYDetectorData class instead (do not forget to change also the preprocessort include as well).
+
+	\subsection{Step 4 : Token definition}
+		NPS use input file with token detection. For each detector there is at least two token, we already see one in the previous part, the array starting token. You will need a second one, the module starting one, let choose "WonderfulModule". So have a look at the WonderfulDetector::ReadCOnfiguration method. In this method a loop over the config file is made, once the module starting bloc is fine, the ReadingStatus is set to true, wich mean we toggle to a module token search mode. Generally speaking the "\%" simbole is used as a comment symbole and every caracter after this symbole will be skipped until the end of line. This is the first token search. Then come the search for another module starting search, here a security to avoid wrong token sequence. Then come the list of all token. You can add as many token as you need following the same model. Just add one for exercise your self,
+
+		\begin{description}
+			\item[1:] Copying the THETA token bloc
+			\item[2:] We want to add a Token associate to the number of stage in our detector. At the beginning of the function let create an integer name NumberOfStage and set it to 0. We also need a boolean to check the token as been found, just create a boolean named check\_NumberOfStage, and set it to false (have a look to the other variable such as Theta and check\_Theta).
+			\item[3:] Change THETA to your new token, for instance "HOW\_MANY\_STAGE=" (note that token can't have space and always finnish by =). This new token have 15 caracter, so change the second argument of the compare method from 6 to 15.
+			\item[4:] Change check\_Theta to check\_NumberOfStage and \emph{Theta = atof(DataBuffer.c\_str())} to \emph{NumberOfStage = atof(DataBuffer.c\_str())}. Remove the \emph{Theta=Theta*deg} and change the cout to display a corrected message.
+		\end{description}
+
+		
+		\subsection{Step 5 : Material definition}
+
+		Just have a look at the InitializeMaterial function. You can here define as many as needed material after adding a private G4Material* object member to your classe. Remember to delete those new object in the detector destructor. Those material can then be used in the volume definition. This way each material are defined only one time per array, assuring a low number of material and therefor a low time running.
+
+		\subsection{Step 6 : Scorer definition}
+	
+	Let's define a Scorer as class object allowing you to perform any kind of measurement.NPSimulation used G4VPScorer (see the G4 documentation for more detail), understand Virtual Primitive Scorer. This virtual class allow Geant4 user to define the kind of scorer they want. Initially scorer were design to allow user to monitor some physical value inside a logical volume without using the ReadSensitive class and ReadOutGeometry. However, dure to their conception, those object was slow and running time quickly increased with the number of scorer... In NPSimulation we improve this system, using a new way of indexing data in scorer and delete them when they are not needed anymore and the running time is acceptable. Moreover, the Scorer simplify the code reading and allow user to come with their own set of scorer file dedicate to their detector. We implement some General Purpose scorer that you can use as well.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter[NPAnalysis]{NPAnalysis}
 
-
+\chapter[NPLib]{NPLib}
 
 \end{document}
 
diff --git a/NPLib/CalibrationManager/CalibrationManager.cxx b/NPLib/CalibrationManager/CalibrationManager.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..ce505789028b51cb6de3c04bedc679ecebe3c43d
--- /dev/null
+++ b/NPLib/CalibrationManager/CalibrationManager.cxx
@@ -0,0 +1,174 @@
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : october 2009                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ * This class manage the calibration coefficient of the detector in NPA      *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *   This class is a singleton                                               *
+ *                                                                           *
+ *****************************************************************************/
+#include "CalibrationManager.h"
+
+//	STL
+#include <cstdlib>
+#include <limits>
+#include <cmath>
+
+//////////////////////////////////////////////////////////////////
+CalibrationManager* CalibrationManager::instance = 0;
+
+CalibrationManager* CalibrationManager::getInstance(string configFileName)
+	{
+	   // A new instance of CalibrationManager is created if it does not exist:
+	   if (instance == 0) {
+	      instance = new CalibrationManager(configFileName);
+	   }
+
+	   // The instance of CalibrationManager is returned:
+	   return instance;
+	}
+	
+//////////////////////////////////////////////////////////////////
+CalibrationManager::CalibrationManager(string configFileName)
+	{
+   // Read configuration file Buffer
+   string lineBuffer, dataBuffer;
+
+   // Open file
+   ifstream inputConfigFile;
+   inputConfigFile.open(configFileName.c_str());
+	
+   cout << "/////////////////////////////////" << endl;
+   cout << "Getting list of Calibration File" << endl;
+
+   if (!inputConfigFile) {
+      cout << "Calibration Path file :" << configFileName << " not found " << endl; 
+      return;
+   }
+   
+   else {
+      while (!inputConfigFile.eof()) {
+         getline(inputConfigFile, lineBuffer);
+			      
+         // search for token giving the list of Root files to treat
+         if ( lineBuffer.compare(0, 12, "CalibrationFilePath") == 0 ) {
+             while (!inputConfigFile.eof()) {
+               inputConfigFile >> dataBuffer;
+
+               // ignore comment Line 
+               if (dataBuffer.compare(0, 1, "%") == 0) {
+                  inputConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+               }
+
+               else if (!inputConfigFile.eof()) {
+                  AddFile(dataBuffer);
+                  cout << "Adding file " << dataBuffer << " to Calibration" << endl;
+               }
+            }
+         }
+      }
+   }
+   cout << "/////////////////////////////////" << endl;}
+	
+//////////////////////////////////////////////////////////////////
+CalibrationManager::~CalibrationManager()
+	{}
+	
+//////////////////////////////////////////////////////////////////
+bool CalibrationManager::AddParameter(string DetectorName , string ParameterName , string Token )
+	{
+		string ParameterPath = DetectorName + "/" + ParameterName ;
+		fToken[Token] = ParameterPath ;
+	}
+
+//////////////////////////////////////////////////////////////////
+void CalibrationManager::LoadParameterFromFile()
+	{
+		ifstream CalibFile 	;
+		string	 DataBuffer	;
+		
+		for(unsigned int i = 0 ; i < fFileList.size() ; i++)
+			{
+				CalibFile.open( fFileList[i].c_str() );
+				vector<double> Coeff ;
+				map<string,string>::iterator it ;
+				
+				if(!CalibFile)
+					{
+						cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ;
+						cout << " WARNING: FILE " << fFileList[i] << " IS MISSING " 																  	<< endl ;
+						cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ;
+					
+					}
+					
+				else while( !CalibFile.eof() )
+							{
+								CalibFile >> DataBuffer ;
+								
+								//	Search word in the token list
+								it=fToken.find(DataBuffer);
+								
+								//	if the word is find, values are read
+								if( it!=fToken.end() )
+									{
+										
+										Coeff.clear();
+										while(DataBuffer!="\n")
+											{
+												CalibFile >> DataBuffer ; Coeff.push_back( atof(DataBuffer.c_str()) ) ;
+											}
+									
+										//	Check this parameter is not already define
+										if( fCalibrationCoeff.find(it->second) != fCalibrationCoeff.end() ) cout << "WARNING: Parameter " << it->second << " Already found. It will be rewritted " << endl;
+										
+										//	Add the list of Coeff to the Coeff map using Parameter Path as index
+										fCalibrationCoeff[ it->second ] = Coeff ;
+									}
+								
+							}
+					CalibFile.close() ;
+			}
+		
+	}
+
+//////////////////////////////////////////////////////////////////
+double CalibrationManager::ApplyCalibration(string ParameterPath , double RawValue)
+	{
+		double CalibratedValue = 0 ;
+		map< string , vector<double> >::iterator it ;
+		it = fCalibrationCoeff.find(ParameterPath)  ;
+		
+		if(it == fCalibrationCoeff.end() )
+			{
+			/*	cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ;
+				cout << " ERROR: PARAMETER " << ParameterPath << " IS NOT FOUND IN THE CALIBRATION DATA BASE  " << endl ;
+				cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ;*/
+				
+				return RawValue ;
+			}
+		
+		vector<double> Coeff = it->second  ;
+		
+		for(unsigned int i = 0 ; i < Coeff.size() ; i++)
+			{
+				CalibratedValue += Coeff[i]*pow(RawValue,i);
+			}
+			
+		return CalibratedValue ;
+		
+	}
+//////////////////////////////////////////////////////////////////
+
+
diff --git a/NPLib/CalibrationManager/CalibrationManager.h b/NPLib/CalibrationManager/CalibrationManager.h
new file mode 100644
index 0000000000000000000000000000000000000000..69df3a9f7f5e1ed8ee4519c1dbeaaa488cdd128d
--- /dev/null
+++ b/NPLib/CalibrationManager/CalibrationManager.h
@@ -0,0 +1,81 @@
+#ifndef ConfigManager_h 
+#define ConfigManager_h 1
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : october 2009                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ * This class manage the calibration coefficient of the detector in NPA      *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *   This class is a singleton                                               *
+ *                                                                           *
+ *****************************************************************************/
+//	STL
+#include<fstream>
+#include<iostream>
+#include<string>
+#include<vector>
+#include<map>
+
+using namespace std ;
+
+class CalibrationManager
+	{
+	
+		public:	//	Constructor and Destructor
+			CalibrationManager(string configFileName);
+			~CalibrationManager();
+	
+		public: // Accessor
+			//	return a pointer to the calibration manager instance.
+			//	if the instance does not exist it is created.
+			static CalibrationManager* getInstance(string configFileName="XXX");
+	
+		private: // the instance
+			//	Hold a pointer on itself
+			static CalibrationManager* instance ;
+	
+		public:	//	File Management
+			inline void AddFile(string Path) { fFileList.push_back(Path) ;} ;
+			
+			
+		public:	//	Declaration of Calibration
+		
+			// call like : myCalibrationManager->AddParameter( "MUST2" ,"Telescope5_Si_X38_E", "T5_Si_X38_E" )
+			// return false if the token is not found in the file list
+			bool AddParameter(string DetectorName , string ParameterName , string Token ) 		;		
+			
+			// call like : myCalibrationManager->ApplyCalibration( "MUST2/Telescope5_Si_X38_E" , RawEnergy )
+			// return the Calibrated value
+			double ApplyCalibration(string ParameterPath , double RawValue);
+		
+		
+			public:	//	To be called after initialisation
+				//	Loop over the file list and catch the file used for calibration
+				void LoadParameterFromFile();
+				
+		
+		private:
+			//	This map hold a vector of the calibration coefficient. Index is the Parameter path, like "MUST2/Telescope5_Si_X38_E"
+			map< string , vector<double> >	fCalibrationCoeff ;
+			
+			//	Hold the path of all the registered file of coeff
+			vector<string>	fFileList	;
+			
+			//	Hold The list of Token. Index is the Token, value the parameter path.
+			map< string , string >	fToken		;
+		
+	};
+	
+#endif
diff --git a/NPLib/CalibrationManager/Makefile b/NPLib/CalibrationManager/Makefile
new file mode 100755
index 0000000000000000000000000000000000000000..3b8a94b26d7f41761459dc181d3bf4f53badc91c
--- /dev/null
+++ b/NPLib/CalibrationManager/Makefile
@@ -0,0 +1,299 @@
+# Makefile for the ROOT test programs.
+# This Makefile shows nicely how to compile and link applications
+# using the ROOT libraries on all supported platforms.
+#
+# Copyright (c) 2000 Rene Brun and Fons Rademakers
+#
+# Author: Fons Rademakers, 29/2/2000
+
+ROOTCONFIG   := root-config
+
+ARCH         := $(shell $(ROOTCONFIG) --arch)
+PLATFORM     := $(shell $(ROOTCONFIG) --platform)
+ALTCC        := $(shell $(ROOTCONFIG) --cc)
+ALTCXX       := $(shell $(ROOTCONFIG) --cxx)
+ALTF77       := $(shell $(ROOTCONFIG) --f77)
+ALTLD        := $(shell $(ROOTCONFIG) --ld)
+
+#CXX           =
+ObjSuf        = o
+SrcSuf        = cxx
+ExeSuf        =
+DllSuf        = so
+OutPutOpt     = -o # keep whitespace after "-o"
+
+ifeq (debug,$(findstring debug,$(ROOTBUILD)))
+OPT           = -g
+OPT2          = -g
+else
+ifneq ($(findstring debug, $(strip $(shell $(ROOTCONFIG) --config))),)
+OPT           = -g
+OPT2          = -g
+else
+OPT           = -O
+OPT2          = -O2
+endif
+endif
+
+ROOTCFLAGS   := $(shell $(ROOTCONFIG) --cflags)
+ROOTLDFLAGS  := $(shell $(ROOTCONFIG) --ldflags)
+ROOTLIBS     := $(shell $(ROOTCONFIG) --libs)
+ROOTGLIBS    := $(shell $(ROOTCONFIG) --glibs)
+HASTHREAD    := $(shell $(ROOTCONFIG) --has-thread)
+ROOTDICTTYPE := $(shell $(ROOTCONFIG) --dicttype)
+NOSTUBS      := $(shell $(ROOTCONFIG) --nostubs)
+ROOTCINT     := rootcint
+
+ifeq ($(ARCH),linux)
+# Linux with egcs, gcc 2.9x, gcc 3.x
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxkcc)
+# Linux with the KAI compiler
+CXX           = KCC --one_instantiation_per_object
+CXXFLAGS      = $(OPT) -fPIC +K0
+LD            = KCC
+LDFLAGS       = $(OPT) $(shell $(ROOTCONFIG) --cflags)
+SOFLAGS       =
+endif
+
+ifeq ($(ARCH),linuxicc)
+# Linux with Intel icc compiler
+ICC_MAJOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f1)
+ICC_MINOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f2)
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476
+LD            = icpc
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxppcgcc)
+# PPC Linux with gcc and glibc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxia64gcc)
+# Itanium Linux with gcc 2.9x
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxia64sgi)
+# Itanium Linux with sgiCC
+CXX           = sgiCC
+CXXFLAGS      = $(OPT) -Wall -fPIC
+LD            = gsgiCC
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxia64ecc)
+# Itanium Linux with Intel icc (was ecc)
+ICC_MAJOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f1)
+ICC_MINOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f2)
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476 -ftz
+LD            = icpc
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxx8664gcc)
+# AMD Opteron and Intel EM64T (64 bit mode) Linux with gcc 3.x
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxppc64gcc)
+# PPC64 Linux with gcc 3.x
+CXX           = g++
+CXXFLAGS      = $(OPT) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxx8664icc)
+# AMD Opteron and Intel EM64T (64 bit mode) Linux with Intel icc compiler
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476 -wd1572
+LD            = icpc
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxalphagcc)
+# Alpha Linux with gcc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxmips)
+# GNU/Linux on mips (BE/LE, O32/N32/N64) with gcc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxhppa)
+# GNU/Linux on hppa with gcc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxarm)
+# ARM Linux with egcs
+CXX           = g++
+CXXFLAGS      = $(OPT) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),macosx)
+# MacOS X with cc (GNU cc 2.95.2 and gcc 3.3)
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+CXX           = g++
+CXXFLAGS      = $(OPT2) -pipe -Wall -W -Woverloaded-virtual
+LD            = $(MACOSXTARGET) g++
+LDFLAGS       = $(OPT2) -bind_at_load
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+ifeq ($(subst $(MACOSX_MINOR),,1234),1234)
+DllSuf        = so
+else
+DllSuf        = dylib
+endif
+UNDEFOPT      = dynamic_lookup
+ifneq ($(subst $(MACOSX_MINOR),,12),12)
+UNDEFOPT      = suppress
+LD            = g++
+endif
+SOFLAGS       = -dynamiclib -single_module -undefined $(UNDEFOPT)
+endif
+
+ifeq ($(ARCH),macosxicc)
+# MacOS X with Intel icc compiler
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+ifeq ($(MACOSX_MINOR),5)
+MACOSX_MINOR := 4
+endif
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476
+LD            = $(MACOSXTARGET) icpc
+LDFLAGS       = $(OPT)
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+ifeq ($(subst $(MACOSX_MINOR),,1234),1234)
+DllSuf        = so
+else
+DllSuf        = dylib
+endif
+SOFLAGS       = -dynamiclib -single_module -undefined dynamic_lookup
+endif
+
+ifeq ($(ARCH),macosx64)
+# MacOS X >= 10.4 with gcc 64 bit mode (GNU gcc 4.*)
+# Only specific option (-m64) comes from root-config
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+CXX           = g++
+CXXFLAGS      = $(OPT2) -pipe -Wall -W -Woverloaded-virtual
+LD            = $(MACOSXTARGET) g++ -m64
+LDFLAGS       = $(OPT2) -bind_at_load
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+ifeq ($(subst $(MACOSX_MINOR),,1234),1234)
+DllSuf        = so
+else
+DllSuf        = dylib
+endif
+SOFLAGS       = -m64 -dynamiclib -single_module -undefined dynamic_lookup
+endif
+
+ifeq ($(ARCH),macosxxlc)
+# MacOS X with IBM xlC compiler
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+CXX           = xlC
+CXXFLAGS      = $(OPT)
+LD            = $(MACOSXTARGET) xlC
+LDFLAGS       = $(OPT) -Wl,-bind_at_load
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+DllSuf        = dylib
+UNDEFOPT      = dynamic_lookup
+ifneq ($(subst $(MACOSX_MINOR),,12),12)
+UNDEFOPT      = suppress
+LD            = xlC
+endif
+SOFLAGS       = -qmkshrobj -single_module -undefined $(UNDEFOPT)
+endif
+
+CXXFLAGS     += $(ROOTCFLAGS)
+LDFLAGS      += $(ROOTLDFLAGS)
+LIBS          = $(ROOTLIBS) $(SYSLIBS)
+GLIBS         = $(ROOTGLIBS) $(SYSLIBS)
+
+INCLUDE		= -I$(CLHEP_BASE_DIR)/include
+ 
+#------------------------------------------------------------------------------
+SHARELIB      =  libCalibrationManager.so 
+
+all:            $(SHARELIB)
+#------------------------------------------------------------------------------
+############### Detector ##############
+
+## MUST2 ##
+libCalibrationManager.so:	CalibrationManager.o
+		$(LD) $(SOFLAGS) $^ $(OutPutOpt) $@
+		
+# dependances
+CalibrationManager.o:		CalibrationManager.cxx	CalibrationManager.h
+#######################################
+
+############# Clean and More ##########
+clean:
+	@rm -f core *~ *.o *Dict*
+
+distclean:
+	  make clean; rm -f *.so
+
+.SUFFIXES: .$(SrcSuf)
+
+###
+
+.$(SrcSuf).$(ObjSuf):
+	$(CXX) $(CXXFLAGS) $(INCLUDE) -c $<
+
+
diff --git a/NPLib/DummyDetector/Makefile b/NPLib/DummyDetector/Makefile
new file mode 100755
index 0000000000000000000000000000000000000000..1d864a05a5312e340ec75ed81070789f66fa289f
--- /dev/null
+++ b/NPLib/DummyDetector/Makefile
@@ -0,0 +1,302 @@
+# Makefile for the ROOT test programs.
+# This Makefile shows nicely how to compile and link applications
+# using the ROOT libraries on all supported platforms.
+#
+# Copyright (c) 2000 Rene Brun and Fons Rademakers
+#
+# Author: Fons Rademakers, 29/2/2000
+
+ROOTCONFIG   := root-config
+
+ARCH         := $(shell $(ROOTCONFIG) --arch)
+PLATFORM     := $(shell $(ROOTCONFIG) --platform)
+ALTCC        := $(shell $(ROOTCONFIG) --cc)
+ALTCXX       := $(shell $(ROOTCONFIG) --cxx)
+ALTF77       := $(shell $(ROOTCONFIG) --f77)
+ALTLD        := $(shell $(ROOTCONFIG) --ld)
+
+#CXX           =
+ObjSuf        = o
+SrcSuf        = cxx
+ExeSuf        =
+DllSuf        = so
+OutPutOpt     = -o # keep whitespace after "-o"
+
+ifeq (debug,$(findstring debug,$(ROOTBUILD)))
+OPT           = -g
+OPT2          = -g
+else
+ifneq ($(findstring debug, $(strip $(shell $(ROOTCONFIG) --config))),)
+OPT           = -g
+OPT2          = -g
+else
+OPT           = -O
+OPT2          = -O2
+endif
+endif
+
+ROOTCFLAGS   := $(shell $(ROOTCONFIG) --cflags)
+ROOTLDFLAGS  := $(shell $(ROOTCONFIG) --ldflags)
+ROOTLIBS     := $(shell $(ROOTCONFIG) --libs)
+ROOTGLIBS    := $(shell $(ROOTCONFIG) --glibs)
+HASTHREAD    := $(shell $(ROOTCONFIG) --has-thread)
+ROOTDICTTYPE := $(shell $(ROOTCONFIG) --dicttype)
+NOSTUBS      := $(shell $(ROOTCONFIG) --nostubs)
+ROOTCINT     := rootcint
+
+ifeq ($(ARCH),linux)
+# Linux with egcs, gcc 2.9x, gcc 3.x
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxkcc)
+# Linux with the KAI compiler
+CXX           = KCC --one_instantiation_per_object
+CXXFLAGS      = $(OPT) -fPIC +K0
+LD            = KCC
+LDFLAGS       = $(OPT) $(shell $(ROOTCONFIG) --cflags)
+SOFLAGS       =
+endif
+
+ifeq ($(ARCH),linuxicc)
+# Linux with Intel icc compiler
+ICC_MAJOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f1)
+ICC_MINOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f2)
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476
+LD            = icpc
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxppcgcc)
+# PPC Linux with gcc and glibc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxia64gcc)
+# Itanium Linux with gcc 2.9x
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxia64sgi)
+# Itanium Linux with sgiCC
+CXX           = sgiCC
+CXXFLAGS      = $(OPT) -Wall -fPIC
+LD            = gsgiCC
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxia64ecc)
+# Itanium Linux with Intel icc (was ecc)
+ICC_MAJOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f1)
+ICC_MINOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f2)
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476 -ftz
+LD            = icpc
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxx8664gcc)
+# AMD Opteron and Intel EM64T (64 bit mode) Linux with gcc 3.x
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxppc64gcc)
+# PPC64 Linux with gcc 3.x
+CXX           = g++
+CXXFLAGS      = $(OPT) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxx8664icc)
+# AMD Opteron and Intel EM64T (64 bit mode) Linux with Intel icc compiler
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476 -wd1572
+LD            = icpc
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxalphagcc)
+# Alpha Linux with gcc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxmips)
+# GNU/Linux on mips (BE/LE, O32/N32/N64) with gcc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxhppa)
+# GNU/Linux on hppa with gcc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxarm)
+# ARM Linux with egcs
+CXX           = g++
+CXXFLAGS      = $(OPT) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),macosx)
+# MacOS X with cc (GNU cc 2.95.2 and gcc 3.3)
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+CXX           = g++
+CXXFLAGS      = $(OPT2) -pipe -Wall -W -Woverloaded-virtual
+LD            = $(MACOSXTARGET) g++
+LDFLAGS       = $(OPT2) -bind_at_load
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+ifeq ($(subst $(MACOSX_MINOR),,1234),1234)
+DllSuf        = so
+else
+DllSuf        = dylib
+endif
+UNDEFOPT      = dynamic_lookup
+ifneq ($(subst $(MACOSX_MINOR),,12),12)
+UNDEFOPT      = suppress
+LD            = g++
+endif
+SOFLAGS       = -dynamiclib -single_module -undefined $(UNDEFOPT)
+endif
+
+ifeq ($(ARCH),macosxicc)
+# MacOS X with Intel icc compiler
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+ifeq ($(MACOSX_MINOR),5)
+MACOSX_MINOR := 4
+endif
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476
+LD            = $(MACOSXTARGET) icpc
+LDFLAGS       = $(OPT)
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+ifeq ($(subst $(MACOSX_MINOR),,1234),1234)
+DllSuf        = so
+else
+DllSuf        = dylib
+endif
+SOFLAGS       = -dynamiclib -single_module -undefined dynamic_lookup
+endif
+
+ifeq ($(ARCH),macosx64)
+# MacOS X >= 10.4 with gcc 64 bit mode (GNU gcc 4.*)
+# Only specific option (-m64) comes from root-config
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+CXX           = g++
+CXXFLAGS      = $(OPT2) -pipe -Wall -W -Woverloaded-virtual
+LD            = $(MACOSXTARGET) g++ -m64
+LDFLAGS       = $(OPT2) -bind_at_load
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+ifeq ($(subst $(MACOSX_MINOR),,1234),1234)
+DllSuf        = so
+else
+DllSuf        = dylib
+endif
+SOFLAGS       = -m64 -dynamiclib -single_module -undefined dynamic_lookup
+endif
+
+ifeq ($(ARCH),macosxxlc)
+# MacOS X with IBM xlC compiler
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+CXX           = xlC
+CXXFLAGS      = $(OPT)
+LD            = $(MACOSXTARGET) xlC
+LDFLAGS       = $(OPT) -Wl,-bind_at_load
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+DllSuf        = dylib
+UNDEFOPT      = dynamic_lookup
+ifneq ($(subst $(MACOSX_MINOR),,12),12)
+UNDEFOPT      = suppress
+LD            = xlC
+endif
+SOFLAGS       = -qmkshrobj -single_module -undefined $(UNDEFOPT)
+endif
+
+CXXFLAGS     += $(ROOTCFLAGS)
+LDFLAGS      += $(ROOTLDFLAGS)
+LIBS          = $(ROOTLIBS) $(SYSLIBS)
+GLIBS         = $(ROOTGLIBS) $(SYSLIBS)
+
+INCLUDE		= -I$(CLHEP_BASE_DIR)/include
+ 
+#------------------------------------------------------------------------------
+SHARELIB      =  libDUMMYDetectorData.so 
+
+all:            $(SHARELIB)
+#------------------------------------------------------------------------------
+############### Detector ##############
+
+## DUMMYDetector ##
+libDUMMYDetectorData.so:	TDUMMYDetectorData.o	TDUMMYDetectorDataDict.o
+			$(LD) $(SOFLAGS) $^ $(OutPutOpt) $@
+
+TDUMMYDetectorDataDict.cxx:	TDUMMYDetectorData.h
+			rootcint -f $@ -c $^
+
+# dependances
+TDUMMYDetectorData.o:	TDUMMYDetectorData.cxx	TDUMMYDetectorData.h
+#######################################
+
+############# Clean and More ##########
+clean:
+	@rm -f core *~ *.o *Dict*
+
+distclean:
+	  make clean; rm -f *.so
+
+.SUFFIXES: .$(SrcSuf)
+
+###
+
+.$(SrcSuf).$(ObjSuf):
+	$(CXX) $(CXXFLAGS) $(INCLUDE) -c $<
+
+
diff --git a/NPLib/DummyDetector/TDUMMYDetectorData.cxx b/NPLib/DummyDetector/TDUMMYDetectorData.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..1c15b58bdaa04b846a331cac3de2a18b26d11ee0
--- /dev/null
+++ b/NPLib/DummyDetector/TDUMMYDetectorData.cxx
@@ -0,0 +1,59 @@
+#include <iostream>
+#include "TDUMMYDetectorData.h"
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : October 2009                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class described the raw data of a very simple DUMMYDetector         *
+ *	Use it as a template for your own detector!                              *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+
+ClassImp(TDUMMYDetectorData)
+
+TDUMMYDetectorData::TDUMMYDetectorData()
+{
+}
+
+
+
+TDUMMYDetectorData::~TDUMMYDetectorData()
+{
+}
+
+
+
+void TDUMMYDetectorData::Clear()
+{
+    fDUMMYDetector_Energy.clear();
+    fDUMMYDetector_Number.clear();
+    fDUMMYDetector_Time.clear();
+}
+
+
+
+void TDUMMYDetectorData::Dump() const
+{
+   cout << "XXXXXXXXXXXXXXXXXXXXXXXX New Event XXXXXXXXXXXXXXXXX" << endl;
+
+	for(unsigned short i = 0 ; i<fDUMMYDetector_Energy.size() ; i ++)
+		{
+			cout << "DUMMYDetector Number " << fDUMMYDetector_Number[i] << " Energy: " << fDUMMYDetector_Energy[i]  << " Time: "<< fDUMMYDetector_Time[i] << endl;
+		
+		}
+   
+}
diff --git a/NPLib/DummyDetector/TDUMMYDetectorData.h b/NPLib/DummyDetector/TDUMMYDetectorData.h
new file mode 100755
index 0000000000000000000000000000000000000000..cc5c29fa18c8300f629b2c221e06e6d60d6e5d0e
--- /dev/null
+++ b/NPLib/DummyDetector/TDUMMYDetectorData.h
@@ -0,0 +1,72 @@
+#ifndef __DUMMYDetectorDATA__
+#define __DUMMYDetectorDATA__
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : October 2009                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class described the raw data of a very simple DUMMY detector        *
+ *	Use it as a template for your own detector!                              *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+#include <vector>
+
+#include "TObject.h"
+using namespace std ;
+
+
+class TDUMMYDetectorData : public TObject {
+ private:
+   // ADC
+   vector<double>	  fDUMMYDetector_Energy	;	
+   vector<double>	  fDUMMYDetector_Time		;
+   vector<short>    fDUMMYDetector_Number	;
+   
+ public:
+   TDUMMYDetectorData();
+   virtual ~TDUMMYDetectorData();
+
+   void	Clear();
+   void	Clear(const Option_t*) {};
+   void	Dump() const;
+
+   /////////////////////           GETTERS           ////////////////////////
+   // (E)
+   double	GetEnergy(int i)			{return fDUMMYDetector_Energy[i];}
+   // (T)
+   double	GetTime(int i)				{return fDUMMYDetector_Time[i];}
+   // (N)
+   int      GetDUMMYDetectorNumber(int i)		{return fDUMMYDetector_Number[i];}
+   
+   
+   double	GetEnergySize()			{return fDUMMYDetector_Energy.size();}
+   // (T)
+   double	GetTimeSize()				{return fDUMMYDetector_Time.size();}
+   // (N)
+   int      GetDUMMYDetectorNumberSize()		{return fDUMMYDetector_Number.size();}
+   
+   
+   /////////////////////           SETTERS           ////////////////////////
+   // (E)
+   void	SetEnergy(double E)			{fDUMMYDetector_Energy.push_back(E);}
+   void	SetTime(double T)			{fDUMMYDetector_Time.push_back(T);}
+   void	SetDUMMYDetectorNumber(int N)		{fDUMMYDetector_Number.push_back(N);}
+   
+   //
+   ClassDef(TDUMMYDetectorData,1)  // DUMMYDetectorData structure
+};
+
+#endif
diff --git a/NPLib/InitialConditions/TInitialConditions.h b/NPLib/InitialConditions/TInitialConditions.h
index 96d8e9cec26be5fa2b1a2b918fd80e2ac7d31c01..468e941d2ea92152d55524ceccf0cda2e1089a47 100644
--- a/NPLib/InitialConditions/TInitialConditions.h
+++ b/NPLib/InitialConditions/TInitialConditions.h
@@ -28,7 +28,6 @@
 
 #include <vector>
 #include "TObject.h"
-
 using namespace std ;
 
 
diff --git a/NPLib/MUST2/Makefile b/NPLib/MUST2/Makefile
index e2438f2ea3c42877c75421393f1c85bd48911819..483202615d51fcbee2e1ed164a130262ccad451b 100644
--- a/NPLib/MUST2/Makefile
+++ b/NPLib/MUST2/Makefile
@@ -281,14 +281,13 @@ libMust2Data.so:	TMust2Data.o	TMust2DataDict.o
 TMust2DataDict.cxx:	TMust2Data.h
 			rootcint -f $@ -c $^
 
-libMust2Physics.so:	Must2Array.o	TMust2Physics.o	TMust2PhysicsDict.o
+libMust2Physics.so:	TMust2Physics.o	TMust2PhysicsDict.o
 		$(LD) $(SOFLAGS) $^ $(OutPutOpt) $@
 
 TMust2PhysicsDict.cxx: TMust2Physics.h
 			rootcint -f $@ -c $^
 
 # dependances
-Must2Array.o:		Must2Array.cxx	Must2Array.h
 TMust2Data.o:		TMust2Data.cxx	TMust2Data.h
 TMust2Physics.o:	TMust2Physics.cxx	TMust2Physics.h
 #######################################
diff --git a/NPLib/MUST2/Must2Array.cxx b/NPLib/MUST2/Must2Array.cxx
deleted file mode 100644
index 846632eb029aac817d473758a8512f2196edd07c..0000000000000000000000000000000000000000
--- a/NPLib/MUST2/Must2Array.cxx
+++ /dev/null
@@ -1,610 +0,0 @@
-#include "Must2Array.h"
-/*****************************************************************************
- * Copyright (C) 2009   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@ipno.in2p3.fr       *
- *                                                                           *
- * Creation Date  : febuary 2009                                             *
- * Last update    :                                                          *
- *---------------------------------------------------------------------------*
- * Decription:                                                               *
- *  This class manage the geometry of an array of MUST2 Telescope            *
- * 	It is used in NPAnalysis Programm                                        *
- *	It also meant to manage calibration file (to be done)                    *
- *                                                                           *
- *---------------------------------------------------------------------------*
- * Comment:                                                                  *
- *   Calibration need to be done                                             *
- *                                                                           *
- *****************************************************************************/
-//	STL
-#include <cmath>
-#include <iostream>	
-#include <fstream>
-#include <string>
-#include <stdlib.h>
-
-//	NPL
-#include "RootInput.h"
-#include "RootOutput.h"
-
-//	Root
-#include "TChain.h"
-
-using namespace std ;	
-	
-//	Default Constructor
-
-MUST2Array::MUST2Array()
-	{
-		NumberOfTelescope = 0				;
-		EventData = new TMust2Data 			;
-		EventPhysics = new TMust2Physics 	;
-	}	
-
-MUST2Array::~MUST2Array()
-	{
-		NumberOfTelescope = 0				;
-		delete EventData 			;
-		delete EventPhysics 	;
-	}	
-	
-				
-////	Innherited from VDetector Class	////				
-				
-//	Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token
-void MUST2Array::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 Start Up Must2 bloc, Reading toggle to true      
-      	if (LineBuffer.compare(0, 11, "M2Telescope") == 0) 
-	      	{
-	        	 cout << "///" << endl           		;
-	       		  cout << "Telescope found: " << endl   ;        
-	        	 ReadingStatus = true 					;
-	        	
-		   	}
-		
-		//	Else don't toggle to Reading Block Status
-		else ReadingStatus = false ;
-		
-		//	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, 11, "M2Telescope") == 0) {
-						cout << "WARNING: Another Telescope 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;
-		            
-		         }
-
-		         //Angle method
-		         else if (DataBuffer.compare(0, 4, "PHI=") == 0) {
-		            check_Phi = true;
-		            ConfigFile >> DataBuffer ;
-		            Phi = atof(DataBuffer.c_str()) ;
-		            Phi = Phi ;
-		            cout << "Phi:  " << Phi << endl;
-		          
-		         }
-
-		         //Angle method
-		         else if (DataBuffer.compare(0, 2, "R=") == 0) {
-		            check_R = true;
-		            ConfigFile >> DataBuffer ;
-		            R = atof(DataBuffer.c_str()) ;
-		            R = R ;
-		            cout << "R:  " << R << endl;
-		          
-		         }
-
-		         //Angle method
-		         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 ) 
-		         		{
-				            AddTelescope(	A   ,
-				                  			B   ,
-				                 			C   ,
-				                  			D   ) ;
-				         }
-		         	
-		         	    //with angle method
-       				  else if ( check_Theta && check_Phi && check_R && check_beta ) 
-       				  	{
-				            AddTelescope(	Theta   ,
-				                  			Phi   	,
-				                  			R       ,
-				                  			beta_u  ,
-				                  			beta_v  ,
-				                  			beta_w  );
-      					}
-								
-			        	check_A = false 	;
-						check_B = false 	;
-		  				check_C = false  	;
-		  				check_D = false  	;
-
-		   				check_Theta = false   	;
-		   				check_Phi  = false  	;
-		   				check_R    = false   	;
-		   				check_beta = false  	;
-					
-		         	}
-		         
-		}
-		        
-		        
-		    
-		         	
-	}
-	
-	cout << endl << "/////////////////////////////" << endl<<endl;
-
-}
-
-
-//	Read stream at Path and pick-up calibration parameter using Token
-//	If argument is "Simulation" no change calibration is loaded
-void MUST2Array::ReadCalibrationFile(string Path)	
-	{
-		
-		//	Order of Polynom function used for calibration
-		int Calibration_Si_E_Order 		;
-		int Calibration_Si_T_Order 		;
-		int Calibration_SiLi_E_Order 	;
-		int Calibration_CsI_E_Order 	;
-		
-		//	Calibration_Si_X_E[DetectorNumber][StripNumber][Order of Coeff]
-		vector< vector< vector< double > > >	Calibration_Si_X_E	;
-		vector< vector< vector< double > > >	Calibration_Si_X_T	;
-		
-		vector< vector< vector< double > > >	Calibration_Si_Y_E	;
-		vector< vector< vector< double > > >	Calibration_Si_Y_T	;
-	
-		//	Calibration_SiLi_E[DetectorNumber][PadNumber][Order of Coeff]
-		vector< vector< vector< double > > >	Calibration_SiLi_E	;
-		
-		//	Calibration_SiLi_E[DetectorNumber][CrystalNumber][Order of Coeff]
-		vector< vector< vector< double > > >	Calibration_CsI_E	;
-	
-		if(Path == "Simulation")	//	Simulation case: data already calibrated
-			{
-				Calibration_Si_E_Order		=	1 		;
-				Calibration_Si_T_Order 		=	1		;
-				Calibration_SiLi_E_Order 	=	1		;
-				Calibration_CsI_E_Order 	=	1		;
-				
-				vector<double> Coef;
-				//	Order 0				Order 1
-				Coef.push_back(0) ; Coef.push_back(1) 	;
-				
-				vector< vector<double> > StripLine 		;
-				StripLine.resize( 128 , Coef)			;
-				
-				Calibration_Si_X_E.resize( NumberOfTelescope , StripLine)	;
-				Calibration_Si_X_T.resize( NumberOfTelescope , StripLine)	;
-				
-				Calibration_Si_Y_E.resize( NumberOfTelescope , StripLine)	;
-				Calibration_Si_Y_T.resize( NumberOfTelescope , StripLine)	;
-				
-				Calibration_SiLi_E.resize( NumberOfTelescope , StripLine)	;
-				Calibration_CsI_E .resize( NumberOfTelescope , StripLine)	;
-			}
-			
-		else
-			{
-				
-			
-			}
-	}		
-	
-
-//	Activated associated Branches and link it to the private member DetectorData address
-//	In this method mother Branches (Detector) AND daughter leaf (fDetector_parameter) have to be activated
-void MUST2Array::InitializeRootInput() 		
-	{
-		TChain* inputChain = RootInput::getInstance()->GetChain()	;
-		inputChain->SetBranchStatus( "MUST2" , true )				;
-		inputChain->SetBranchStatus( "fMM_*" , true )				;
-		inputChain->SetBranchAddress( "MUST2" , &EventData )		;
-	}
-
-
-//	Create associated branches and associated private member DetectorPhysics address
-void MUST2Array::InitializeRootOutput() 	
-	{
-		TTree* outputTree = RootOutput::getInstance()->GetTree()		;
-		outputTree->Branch( "MUST2" , "TMust2Physics" , &EventPhysics )	;
-	}
-
-
-//	This method is called at each event read from the Input Tree. Aime is to build treat Raw dat in order to extract physical parameter. 
-void MUST2Array::BuildPhysicalEvent()		
-	{
-		EventPhysics -> BuildPhysicalEvent(EventData)	;
-	}
-
-
-//	Same as above, but only the simplest event and/or simple method are used (low multiplicity, faster algorythm but less efficient ...).
-//	This method aimed to be used for analysis performed during experiment, when speed is requiered.
-//	NB: This method can eventually be the same as BuildPhysicalEvent.
-void MUST2Array::BuildSimplePhysicalEvent()	
-	{
-		EventPhysics -> BuildSimplePhysicalEvent(EventData)	;
-	}
-
-
-
-/////	Specific to MUST2Array	////
-
-void MUST2Array::AddTelescope(	TVector3 C_X1_Y1 		,
-			 					TVector3 C_X128_Y1 		, 
-			 					TVector3 C_X1_Y128 		, 
-			 					TVector3 C_X128_Y128	)
-	{
-		// To avoid warning
-		C_X1_Y128 *= 1;
-
-		NumberOfTelescope++;
-	
-		//	Vector U on Telescope Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis)
-		TVector3 U = C_X1_Y1 - C_X128_Y1 				;	
-		U = U.Unit()									;
-		//	Vector V on Telescope Face (parallele to X Strip)
-		TVector3 V = C_X128_Y128 - C_X128_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 								;		
-
-		//	Geometry Parameter
-		double Face = 98 					  	; //mm
-		double NumberOfStrip = 128 				; 
-		double StripPitch = Face/NumberOfStrip	; //mm
-
-		//	Buffer object to fill Position Array
-		vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ;
-
-		vector< vector< double > >	OneTelescopeStripPositionX	;
-		vector< vector< double > >	OneTelescopeStripPositionY	;
-		vector< vector< double > >	OneTelescopeStripPositionZ	;
-		
-		//	Moving StripCenter to 1.1 corner:
-		Strip_1_1 = C_X128_Y1 + (U+V) * (StripPitch/2.) 	;
-
-		for( int i = 0 ; i < 128 ; i++ )
-			{
-				lineX.clear()	;
-				lineY.clear()	;
-				lineZ.clear()	;
-				
-				for( int j = 0 ; j < 128 ; j++ )
-					{
-						StripCenter  = Strip_1_1 + StripPitch*( i*U + j*V  )	;
-						//StripCenter += -TargetPosition		;
-						
-						lineX.push_back( StripCenter.X() )	;
-						lineY.push_back( StripCenter.Y() )	;
-						lineZ.push_back( StripCenter.Z() )	;	
-					}
-					
-				OneTelescopeStripPositionX.push_back(lineX)	;
-				OneTelescopeStripPositionY.push_back(lineY)	;
-				OneTelescopeStripPositionZ.push_back(lineZ)	;
-			 	
-			}
-	
-		
-		StripPositionX.push_back( OneTelescopeStripPositionX ) ;
-		StripPositionY.push_back( OneTelescopeStripPositionY ) ;
-		StripPositionZ.push_back( OneTelescopeStripPositionZ ) ;	
-
-	}
-				
-				
-void MUST2Array::AddTelescope(	double theta 	, 
-								double phi 		, 
-								double distance , 
-								double beta_u 	, 
-								double beta_v 	, 
-								double beta_w	)
-	{
-	
-		NumberOfTelescope++;
-	
-		double Pi = 3.141592654 ;
-
-		// convert from degree to radian:
-		theta = theta * Pi/180. ; 
-		phi   = phi   * Pi/180. ;
-
-		//Vector U on Telescope Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis)
-		TVector3 U ;	
-		//Vector V on Telescope Face (parallele to X Strip)
-		TVector3 V ;
-		//Vector W normal to Telescope Face (pointing CsI)
-		TVector3 W ;
-		//Vector position of Telescope Face center
-		TVector3 C ;
-			
-		C = TVector3 (	distance * sin(theta) * cos(phi) ,
-						distance * sin(theta) * sin(phi) ,
-						distance * cos(theta)			 );
-		
-    	TVector3 P = TVector3(	cos(theta ) * cos(phi)	, 
-    							cos(theta ) * sin(phi)	,
-    							-sin(theta)				);
-		
-		W = C.Unit() ;
-		U = W .Cross ( P ) ;
-	    V = W .Cross ( U );
-		
-		U = U.Unit();
-		V = V.Unit();
-		
-		U.Rotate( beta_u * Pi/180. , U ) ;
-		V.Rotate( beta_u * Pi/180. , U ) ;
-		
-		U.Rotate( beta_v * Pi/180. , V ) ;
-		V.Rotate( beta_v * Pi/180. , V ) ;
-		
-		U.Rotate( beta_w * Pi/180. , W ) ;
-		V.Rotate( beta_w * Pi/180. , W ) ;
-		
-		double Face = 98 					  	; //mm
-		double NumberOfStrip = 128 				;
-		double StripPitch = Face/NumberOfStrip	; //mm
-
-		vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ;
-		
-		vector< vector< double > >	OneTelescopeStripPositionX	;
-		vector< vector< double > >	OneTelescopeStripPositionY	;
-		vector< vector< double > >	OneTelescopeStripPositionZ	;
-		
-		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 < 128 ; i++ )
-			{
-				
-				lineX.clear()	;
-				lineY.clear()	;
-				lineZ.clear()	;
-				
-				for( int j = 0 ; j < 128 ; 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)	;		
-						
-					}
-				
-				OneTelescopeStripPositionX.push_back(lineX)	;
-				OneTelescopeStripPositionY.push_back(lineY)	;
-				OneTelescopeStripPositionZ.push_back(lineZ)	;
-			 	
-			}
-		StripPositionX.push_back( OneTelescopeStripPositionX ) ;
-		StripPositionY.push_back( OneTelescopeStripPositionY ) ;
-		StripPositionZ.push_back( OneTelescopeStripPositionZ ) ;
-	}
-	
-	
-TVector3 MUST2Array::GetPositionOfInteraction(int i)
-	{
-		TVector3 Position = TVector3 (	GetStripPositionX( EventPhysics->TelescopeNumber[i] , EventPhysics->Si_X[i] , EventPhysics->Si_Y[i] ) 	,
-										GetStripPositionY( EventPhysics->TelescopeNumber[i] , EventPhysics->Si_X[i] , EventPhysics->Si_Y[i] )	,
-										GetStripPositionZ( EventPhysics->TelescopeNumber[i] , EventPhysics->Si_X[i] , EventPhysics->Si_Y[i] )	) ;
-		
-		return(Position) ;	
-	
-	}
-	
-TVector3 MUST2Array::GetTelescopeNormal( int i)
-	{
-				TVector3 U = TVector3 (		GetStripPositionX( EventPhysics->TelescopeNumber[i] , 128 , 1 ) 	,
-											GetStripPositionY( EventPhysics->TelescopeNumber[i] , 128 , 1 )		,
-											GetStripPositionZ( EventPhysics->TelescopeNumber[i] , 128 , 1 )		)
-											
-							- TVector3 (	GetStripPositionX( EventPhysics->TelescopeNumber[i] , 1 , 1 ) 		,
-											GetStripPositionY( EventPhysics->TelescopeNumber[i] , 1 , 1 )		,
-											GetStripPositionZ( EventPhysics->TelescopeNumber[i] , 1 , 1 )		);
-										
-				TVector3 V = TVector3 (		GetStripPositionX( EventPhysics->TelescopeNumber[i] , 128 , 128 ) 	,
-											GetStripPositionY( EventPhysics->TelescopeNumber[i] , 128 , 128 )	,
-											GetStripPositionZ( EventPhysics->TelescopeNumber[i] , 128 , 128 )	)
-											
-							- TVector3 (	GetStripPositionX( EventPhysics->TelescopeNumber[i] , 128 , 1 ) 	,
-											GetStripPositionY( EventPhysics->TelescopeNumber[i] , 128 , 1 )		,
-											GetStripPositionZ( EventPhysics->TelescopeNumber[i] , 128 , 1 )		);
-											
-				TVector3 Normal = U.Cross(V);
-		
-		return(Normal.Unit()) ;	
-	
-	}	
-	
-	
-void MUST2Array::Print()
-	{
-		cout << "Number of telescope : " << NumberOfTelescope << endl ;
-		for( int f = 0 ; f < NumberOfTelescope ; f++)
-			{
-				cout << "Telescope " << f+1 << endl ;
-			
-				for( int i = 0 ; i < 128 ; i++ )
-					{
-			
-						for( int j = 0 ; j < 128 ; j++ )
-							{
-							cout << i+1 << "  "<< j+1 << "  " 
-							<< StripPositionX[f][i][j]   << "  " 
-							<< StripPositionY[f][i][j]   << "  "
-							<< StripPositionZ[f][i][j]   << "  " 
-							<< endl ;
-							}	
-					}
-
-			}
-	}
-									
-
diff --git a/NPLib/MUST2/Must2Array.h b/NPLib/MUST2/Must2Array.h
deleted file mode 100644
index 6e91fcab2b40baec023f74e9321dd3c0eeef18ab..0000000000000000000000000000000000000000
--- a/NPLib/MUST2/Must2Array.h
+++ /dev/null
@@ -1,119 +0,0 @@
-#ifndef MUST2Array_H
-/*****************************************************************************
- * Copyright (C) 2009   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@ipno.in2p3.fr       *
- *                                                                           *
- * Creation Date  : febuary 2009                                             *
- * Last update    :                                                          *
- *---------------------------------------------------------------------------*
- * Decription:                                                               *
- *  This class manage the geometry of an array of MUST2 Telescope            *
- * 	It is used in NPAnalysis Programm                                        *
- *	It also meant to manage calibration file (to be done)                    *
- *                                                                           *
- *---------------------------------------------------------------------------*
- * Comment:                                                                  *
- *   Calibration need to be done                                             *
- *                                                                           *
- *****************************************************************************/
-// NPL
-#include "../include/VDetector.h"
-#include "TMust2Data.h"
-#include "TMust2Physics.h"
-
-// Root
-#include "TVector3.h"
-
-class MUST2Array : public NPA::VDetector
-	{
-			public:	//	Default Constructor
-				MUST2Array()	;
-				~MUST2Array()	;
-	
-			public:		//	Innherited from VDetector Class
-			
-				//	Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token
-				void ReadConfiguration(string) 				;
-				
-
-				//	Read stream at CalibFile and pick-up calibration parameter using Token
-				//	If argument is "Simulation" no change calibration is loaded
-				void ReadCalibrationFile(string)	 		;		
-					
-				
-				//	Activated associated Branches and link it to the private member DetectorData address
-				//	In this method mother Branches (Detector) AND daughter leaf (fDetector_parameter) have to be activated
-				void InitializeRootInput() 					;
-
-
-				//	Create associated branches and associated private member DetectorPhysics address
-				void InitializeRootOutput() 		 		;
-				
-				
-				//	This method is called at each event read from the Input Tree. Aime is to build treat Raw dat in order to extract physical parameter. 
-				void BuildPhysicalEvent()					;
-				
-				
-				//	Same as above, but only the simplest event and/or simple method are used (low multiplicity, faster algorythm but less efficient ...).
-				//	This method aimed to be used for analysis performed during experiment, when speed is requiered.
-				//	NB: This method can eventually be the same as BuildPhysicalEvent.
-				void BuildSimplePhysicalEvent()				;
-
-				//	Those two method all to clear the Event Physics or Data
-				void ClearEventPhysics()		{EventPhysics->Clear();}		
-				void ClearEventData()			{EventData->Clear();}		
-
-
-			public:		//	Specific to MUST2Array
-				//	Add a Telescope using Corner Coordinate information
-				void AddTelescope(	TVector3 C_X1_Y1 		,
-			 						TVector3 C_X128_Y1 		, 
-			 						TVector3 C_X1_Y128 		, 
-			 						TVector3 C_X128_Y128	);
-				
-				//	Add a Telescope using R Theta Phi of Si center information
-				void AddTelescope(	double theta 	, 
-									double phi 		, 
-									double distance , 
-									double beta_u 	, 
-									double beta_v 	, 
-									double beta_w	);
-									
-				double GetStripPositionX( int N , int X , int Y )	{ return StripPositionX[N-1][X-1][Y-1] ; };
-				double GetStripPositionY( int N , int X , int Y )	{ return StripPositionY[N-1][X-1][Y-1] ; };
-				double GetStripPositionZ( int N , int X , int Y )	{ return StripPositionZ[N-1][X-1][Y-1] ; };
-
-				double GetNumberOfTelescope() 	{ return NumberOfTelescope ; }			;
-
-				// To be called after a build Physical Event 
-				int GetEventMultiplicity()	{ return  EventPhysics->EventMultiplicity; };
-				
-				double GetEnergyDeposit(int i) { return EventPhysics->TotalEnergy[i] ;};
-				
-				TVector3 GetPositionOfInteraction(int i)	 ;	
-				TVector3 GetTelescopeNormal(int i)		;
-				void Print()	;
-
-			private:	//	Root Input and Output tree classes
-				
-				TMust2Data* 	EventData		;
-				TMust2Physics* 	EventPhysics	;
-
-
-			private:	//	Spatial Position of Strip Calculated on bases of detector position
-			
-				int NumberOfTelescope	;
-			
-				vector< vector < vector < double > > >	StripPositionX			;
-				vector< vector < vector < double > > >	StripPositionY			;
-				vector< vector < vector < double > > >	StripPositionZ			;
-
-	};
-
-#endif
diff --git a/NPLib/MUST2/TMust2Data.h b/NPLib/MUST2/TMust2Data.h
index 04393789731e33d124dab9a8bdb698438b1f35cf..654e999cdb441c7e62ae992f3b80cef83acd05fd 100644
--- a/NPLib/MUST2/TMust2Data.h
+++ b/NPLib/MUST2/TMust2Data.h
@@ -139,12 +139,12 @@ class TMust2Data : public TObject {
 
 		// SiLi
 		//(E)
-		UShort_t	GetMMSiLiEMult()				{return fMM_SiLiE_DetectorNbr.size();}
+		UShort_t	GetMMSiLiEMult()								{return fMM_SiLiE_DetectorNbr.size();}
 		UShort_t	GetMMSiLiEDetectorNbr(Int_t i)  {return fMM_SiLiE_DetectorNbr.at(i);}
 		UShort_t	GetMMSiLiEPadNbr(Int_t i)       {return fMM_SiLiE_PadNbr.at(i);}
 		Double_t	GetMMSiLiEEnergy(Int_t i)       {return fMM_SiLiE_Energy.at(i);}
 		//(T)
-		UShort_t	GetMMSiLiTMult()				{return fMM_SiLiT_DetectorNbr.size();}
+		UShort_t	GetMMSiLiTMult()								{return fMM_SiLiT_DetectorNbr.size();}
 		UShort_t	GetMMSiLiTDetectorNbr(Int_t i)  {return fMM_SiLiT_DetectorNbr.at(i);}
 		UShort_t	GetMMSiLiTPadNbr(Int_t i)       {return fMM_SiLiT_PadNbr.at(i);}
 		Double_t	GetMMSiLiTTime(Int_t i)         {return fMM_SiLiT_Time.at(i);}
diff --git a/NPLib/MUST2/TMust2Physics.cxx b/NPLib/MUST2/TMust2Physics.cxx
index 137e8a86a7293f5063e8c45048785a6744ad6244..70b6fcf02de0c1652595e3302fd5f1e19a151a8c 100644
--- a/NPLib/MUST2/TMust2Physics.cxx
+++ b/NPLib/MUST2/TMust2Physics.cxx
@@ -21,276 +21,383 @@
  *                                                                           *
  *****************************************************************************/
 #include "TMust2Physics.h"
+using namespace LOCAL;
+	
+//	STL
+#include <sstream>
 #include <iostream>
 #include <cmath>
+#include <stdlib.h>
 
-ClassImp(TMust2Physics)
-
-TMust2Physics::TMust2Physics() 
-	{ EventMultiplicity = 0 ;}
+//	NPL
+#include "RootInput.h"
+#include "RootOutput.h"
 
-TMust2Physics::~TMust2Physics() {Clear();}
+//	ROOT
+#include "TChain.h"
+///////////////////////////////////////////////////////////////////////////
 
-void TMust2Physics::BuildSimplePhysicalEvent(TMust2Data* Data)
-	{
-		BuildPhysicalEvent(Data);
-	}
-void TMust2Physics::BuildPhysicalEvent(TMust2Data* Data)
+ClassImp(TMust2Physics)
+///////////////////////////////////////////////////////////////////////////
+TMust2Physics::TMust2Physics() 
 	{ 
-		//	Check
-		bool Check_Si = false ;bool Check_SiLi = false ; bool Check_CsI = false ;
-		
-		// Threshold
-		double Si_X_E_Threshold = 0		;	double Si_X_T_Threshold = 0 	;
-		double Si_Y_E_Threshold = 0		;	double Si_Y_T_Threshold = 0		;
-		double SiLi_E_Threshold = 0		;	double SiLi_T_Threshold = 0		;
-		double CsI_E_Threshold	= 0 	;	double CsI_T_Threshold	= 0		;
-		
-		// To avoid warnings
-		Si_X_E_Threshold *= 1;		Si_X_T_Threshold *= 1;
-		Si_Y_E_Threshold *= 1;		Si_Y_T_Threshold *= 1;
-		SiLi_E_Threshold *= 1;		SiLi_T_Threshold *= 1;
-		CsI_E_Threshold  *= 1;		CsI_T_Threshold  *= 1;
+		EventMultiplicity = 0 			;
+		EventData = new TMust2Data	;
+		EventPhysics = this					;
+	}
 		
-		//	Multiplicity 1
-		if( Data->GetMMStripXEMult()==1 && Data->GetMMStripYEMult()==1 && Data->GetMMStripXTMult()==1 && Data->GetMMStripXTMult()==1 )
+///////////////////////////////////////////////////////////////////////////
+void TMust2Physics::BuildSimplePhysicalEvent()
+	{ 
+		BuildPhysicalEvent(); 
+	
+	}
+	
+///////////////////////////////////////////////////////////////////////////
+	
+void TMust2Physics::BuildPhysicalEvent()
+	{ 
+		if( CheckEvent() == 1 )
 			{
+				vector< TVector2 > couple = Match_X_Y() ;
 				
-				if( //Same detector
-						Data->GetMMStripXEDetectorNbr(0) == Data->GetMMStripXTDetectorNbr(0)
-					&&	Data->GetMMStripXTDetectorNbr(0) == Data->GetMMStripYTDetectorNbr(0)
-					&&	Data->GetMMStripYTDetectorNbr(0) == Data->GetMMStripYEDetectorNbr(0) 
-					
-					// Same strip
-					&&	Data->GetMMStripXEStripNbr(0) == Data->GetMMStripXTStripNbr(0)
-					&&	Data->GetMMStripYEStripNbr(0) == Data->GetMMStripYTStripNbr(0)      )
+				for(unsigned int i = 0 ; i < couple.size() ; i++)
 					{
-					
-						EventMultiplicity = 1;
-					
-						TelescopeNumber.push_back(Data->GetMMStripXEDetectorNbr(0))	;
-					
-						//	Data->Get Max Energy
-						if(Data->GetMMStripXEEnergy(0) > Data->GetMMStripYEEnergy(0))	Si_E.push_back( Data->GetMMStripXEEnergy(0) ) ;
-						else															Si_E.push_back( Data->GetMMStripYEEnergy(0) ) ;
+						int N = EventData->GetMMStripXEDetectorNbr(couple[i].X())		;
+						int X = EventData->GetMMStripXEStripNbr(couple[i].X())				;
+						int Y = EventData->GetMMStripXEStripNbr(couple[i].Y())				;
 						
-						//	Data->Get Min Time
-						if(Data->GetMMStripXTTime(0) < Data->GetMMStripYTTime(0))		Si_T.push_back( Data->GetMMStripXTTime(0) ) ;
-						else															Si_T.push_back( Data->GetMMStripYTTime(0) ) ;
+						double Si_X_E = fSi_X_E(EventData , couple[i].X())	;
+						double Si_Y_E = fSi_Y_E(EventData , couple[i].Y())	;
+
+						double Si_X_T = fSi_X_T(EventData , couple[i].X())		;
+						double Si_Y_T = fSi_Y_T(EventData , couple[i].Y())		;
+					
+						Si_X.push_back(X) ; Si_Y.push_back(Y) ; TelescopeNumber.push_back(N) ;
 						
-						Si_X.push_back( Data->GetMMStripXEStripNbr(0) )	;
-						Si_Y.push_back( Data->GetMMStripYEStripNbr(0) )	;	
+						// Take maximum Energy
+						if(Si_X_E >= Si_Y_E) Si_E.push_back(Si_X_E)	;
+						else								 Si_E.push_back(Si_Y_E)	;
 						
-						Check_Si = true ;			
-								
-					}
-					
-				
-				// FIXME we have to resolve case where SiLi/CsI mult > Si mult by looking time? and Si XY vs Pad/crystal Nbr
-				if (Check_Si)
-					{
+						// Take minimum Time
+						if(Si_X_T >= Si_Y_T) Si_T.push_back(Si_Y_T)	;
+						else								 Si_T.push_back(Si_X_T)	;
 						
-						//	Si(Li)
-						for (int i = 0 ; i < Data->GetMMSiLiEMult() ; i++)
+						for(unsigned int j = 0 ; j < EventData->GetMMSiLiEMult() ; j++)
 							{
-								if (	Data->GetMMSiLiEDetectorNbr(i) == Data->GetMMStripXEDetectorNbr(0)
-									&&	Data->GetMMSiLiEEnergy(i) > SiLi_E_Threshold	)
+								if(EventData->GetMMSiLiEDetectorNbr(j)==N)
 									{
-										SiLi_E.push_back(Data->GetMMSiLiEEnergy(i))	;
-										SiLi_N.push_back(Data->GetMMSiLiEPadNbr(i))	;
-										
-										if ( Data->GetMMSiLiTDetectorNbr(i) == Data->GetMMStripXEDetectorNbr(0) )
+										//	if SiLi energy is above threshold check the compatibility
+										if( fSiLi_E(EventData , j)>SiLi_E_Threshold )
 											{
-											SiLi_T.push_back(Data->GetMMSiLiTTime(i))	;
-											Check_SiLi = true ;
+												if( Match_Si_SiLi( X, Y , EventData->GetMMSiLiEPadNbr(j) ) )
+												{
+													SiLi_N.push_back(EventData->GetMMSiLiEPadNbr(j))	;
+													SiLi_E.push_back(fSiLi_E(EventData , j))	;
+													SiLi_T.push_back(fSiLi_T(EventData , j))		;
+												}
 											}
-									}				
+									}
 							}
-						
-						//	CsI
-						for (int i = 0 ; i < Data->GetMMCsIEMult() ; i++)
+							
+						 for( int j = 0 ; j < EventData->GetMMCsIEMult() ; j++)
 							{
-								if (	Data->GetMMCsIEDetectorNbr(i) == Data->GetMMStripXEDetectorNbr(0)
-									&&	Data->GetMMCsIEEnergy(i) > CsI_E_Threshold	)
+								if(EventData->GetMMCsIEDetectorNbr(j)==N)
 									{
-										CsI_E.push_back(Data->GetMMCsIEEnergy(i))		;
-										CsI_N.push_back(Data->GetMMCsIECristalNbr(i))	;
-										
-										if ( Data->GetMMCsITDetectorNbr(i) == Data->GetMMStripXEDetectorNbr(0) )
+										//	ifCsI energy is above threshold check the compatibility
+										if( fCsI_T(EventData , j)>CsI_E_Threshold )
 											{
-											CsI_T.push_back(Data->GetMMCsITTime(i))		;
-											Check_CsI = true ;
+												if( Match_Si_CsI( X, Y , EventData->GetMMCsIECristalNbr(j) ) )
+													{
+														CsI_N.push_back(EventData->GetMMCsIECristalNbr(j))	;
+														CsI_E.push_back(fCsI_E(EventData , j))			;
+														CsI_T.push_back(fCsI_T(EventData , j))				;
+													}
 											}
 									}
 							}
-							
-					 
-					 if      (!Check_SiLi && !Check_CsI ) TotalEnergy.push_back(   			     Si_E.at(0)					);
-					 else if (Check_SiLi  && !Check_CsI ) TotalEnergy.push_back(               + Si_E.at(0) + SiLi_E.at(0)	);
-					 else if (Check_CsI   && !Check_SiLi) TotalEnergy.push_back( CsI_E .at(0)  + Si_E.at(0)					);
-					 else if (Check_CsI   &&  Check_SiLi) TotalEnergy.push_back( CsI_E .at(0)  + Si_E.at(0) + SiLi_E.at(0)	);
-					 
-					 return;
 					}
-
-				//FIXME: should built a pseudo event and then Check if particle could be identified with EDE method
-				// Dump	
 			}
 		
-		//	Multiplicity 2
-		if( Data->GetMMStripXEMult()==2 && Data->GetMMStripYEMult()==2 && Data->GetMMStripXTMult()==2 && Data->GetMMStripXTMult()==2 )
+		return;
+	
+	}	
+
+///////////////////////////////////////////////////////////////////////////
+int TMust2Physics :: CheckEvent()
+	{
+		// Check the size of the different elements
+				 if(			EventData->GetMMStripXEMult() == EventData->GetMMStripYEMult() && EventData->GetMMStripYEMult() == EventData->GetMMStripXTMult() &&  EventData->GetMMStripXTMult() == EventData->GetMMStripYTMult()  )
+	
+					return 1 ; // Regular Event
+	
+		else if(			EventData->GetMMStripXEMult() == EventData->GetMMStripYEMult()+1 || EventData->GetMMStripXEMult() == EventData->GetMMStripYEMult()-1  )
+	
+					return 2 ; // Pseudo Event, potentially interstrip
+		
+		else 	return -1 ; // Rejected Event
+
+	}
+
+///////////////////////////////////////////////////////////////////////////
+bool TMust2Physics :: ResolvePseudoEvent()
+	{
+		return false;
+	}
+
+///////////////////////////////////////////////////////////////////////////
+vector < TVector2 > TMust2Physics :: Match_X_Y()
+	{
+		vector < TVector2 > ArrayOfGoodCouple ;
+		
+		for(int i = 0 ; i < EventData->GetMMStripXEMult(); i++)
 			{
-				// Different telescope case
-				if (	Data->GetMMStripXEDetectorNbr(0) != Data->GetMMStripXEDetectorNbr(1)
-					&&	Data->GetMMStripYEDetectorNbr(0) != Data->GetMMStripYEDetectorNbr(1) )
+				//	if X value is above threshold, look at Y value
+				if( fSi_X_E(EventData , i) > Si_X_E_Threshold )
 					{
-						EventMultiplicity = 2 ;
-						double EY, EX, TX, TY = 0;
-						// loop on both event
-						for (int jj = 0 ; jj < 2 ; jj++)
+					
+						for(int j = 0 ; j < EventData->GetMMStripYEMult(); j++)
 							{
-								Check_Si = false ;Check_SiLi = false ;Check_CsI = false ;
-							
-								TelescopeNumber.push_back( Data->GetMMStripXEDetectorNbr(jj) )	;
-								EX = Data->GetMMStripXEEnergy(jj) 				;
-								Si_X.push_back( Data->GetMMStripXEStripNbr(jj))	;
-								
-								// Get Corresponding time
-								for(int i = 0 ; i < 2 ; i++)
-									{ 
-										if(		Data->GetMMStripXTDetectorNbr(i) == Data->GetMMStripXEDetectorNbr(jj) 
-											&&	Data->GetMMStripXTStripNbr(i)    == Data->GetMMStripXEStripNbr(jj)   )
-											{ TX = Data->GetMMStripXTTime(jj)	; }
-									}
-								
-								// Get Corresponding Y strip
-								for(int i = 0 ; i < 2 ; i++)
+								//	if Y value is above threshold look if detector match
+								if( fSi_Y_E(EventData , j) > Si_Y_E_Threshold )							
 									{
-										if(	Data->GetMMStripYEDetectorNbr(i) == Data->GetMMStripXEDetectorNbr(jj) )
+										//	if same detector check energy
+										if ( EventData->GetMMStripXEDetectorNbr(i) == EventData->GetMMStripYEDetectorNbr(j) )
 											{
-												Si_Y.push_back( Data->GetMMStripYEStripNbr(i))	;
-												EY = Data->GetMMStripXEEnergy(i) 				;
-												TY = Data->GetMMStripXTTime(i) 					;
-												
-												if (EX>EY)	Si_E.push_back(EX)	;
-												else	  	Si_E.push_back(EY)	;
-												
-												
-												if (TX>TY)	Si_T.push_back(TY)	;
-												else	  	Si_T.push_back(TX)	; 
-												Check_Si = true ;
+													//	Look if energy match
+													if( ( fSi_X_E(EventData , i) - fSi_Y_E(EventData , j) ) / fSi_X_E(EventData , i) < 0.1	)
+														ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ;	
 											}
 									}
-							
-								if (Check_Si)
-									{ 
-										//	Si(Li)
-										for (int i = 0 ; i < Data->GetMMSiLiEMult() ; i++)
-											{ 
-												if (	Data->GetMMSiLiEDetectorNbr(i) == Data->GetMMStripXEDetectorNbr(jj)
-													&&	Data->GetMMSiLiEEnergy(i) > SiLi_E_Threshold	)
-													{
-														Check_SiLi = true ;
-														SiLi_E.push_back(Data->GetMMSiLiEEnergy(i))	;
-														SiLi_N.push_back(Data->GetMMSiLiEPadNbr(i))	;
-														
-														if (	Data->GetMMSiLiTDetectorNbr(i) == Data->GetMMStripXEDetectorNbr(jj)
-															&&	Data->GetMMSiLiTPadNbr(i)      == Data->GetMMSiLiEPadNbr(i) )
-																{
-																	SiLi_T.push_back(Data->GetMMSiLiTTime(i))	;
-																}
-													}
-													
-											}
-											
-										if(!Check_SiLi)
-											{
-												SiLi_E.push_back(-1)	;
-												SiLi_T.push_back(-1)	;
-												SiLi_N.push_back(-1)	;
-											}
-								
-										//	CsI
-										for (int i = 0 ; i < Data->GetMMCsIEMult() ; i++)
-											{
-												if (	Data->GetMMCsIEDetectorNbr(i) == Data->GetMMStripXEDetectorNbr(jj)
-													&&	Data->GetMMCsIEEnergy(i) > CsI_E_Threshold	)
-													{
-														Check_CsI = true ;
-														CsI_E.push_back(Data->GetMMCsIEEnergy(i))		;
-//														cout << Data->GetMMCsIEEnergy(i) << endl;
-														CsI_N.push_back(Data->GetMMCsIECristalNbr(i))	;
-														CsI_T.push_back(Data->GetMMCsITTime(i))			;
-													}
-													
-											}
-										
-										if(!Check_CsI)
-											{
-												CsI_E.push_back(-200)	;
-												CsI_T.push_back(-2)	;
-												CsI_N.push_back(-2)	;
-											}
-										
-										TotalEnergy.push_back(Si_E.at(jj)) ;
-										if (Check_SiLi) TotalEnergy.at(jj) += SiLi_E.at(jj)	;
-										if (Check_CsI)  TotalEnergy.at(jj) += CsI_E.at(jj)	;
-									}	
-							}
-						return;	
-					}
-					
-				//	Same detector case :
-				if(		Data->GetMMStripXEDetectorNbr(0) == Data->GetMMStripXEDetectorNbr(1)
-					&&	Data->GetMMStripYEDetectorNbr(0) == Data->GetMMStripYEDetectorNbr(1))
-					{
-					
-						EventMultiplicity = -1 ;
-				
-						double EY1, EX1, TX1, TY1 = 0;
-						double EY2, EX2, TX2, TY2 = 0;
-						
-						double Delta01, Delta00 = 0;
-						Delta01 = fabs( Data->GetMMStripXEEnergy(0) - Data->GetMMStripYEEnergy(1) ) ;
-						Delta00 = fabs( Data->GetMMStripXEEnergy(0) - Data->GetMMStripYEEnergy(0) ) ;
-						
-						if( Delta01 < Delta00 ) 
-							{
-								EX1 = Data->GetMMStripXEEnergy(0) 	;	 EY1 =  Data->GetMMStripYEEnergy(1) ;
-								EX2 = Data->GetMMStripXEEnergy(1) 	;	 EY2 =  Data->GetMMStripYEEnergy(0) ;
-								
-								TX1 = Data->GetMMStripXTTime(0)		; 	TY1 =  Data->GetMMStripYTTime(1) ;
-								TX2 = Data->GetMMStripXTTime(1) 	; 	TY2 =  Data->GetMMStripYTTime(0) ;
-							}
-							
-						else
-							{
-								EX1 = Data->GetMMStripXEEnergy(0) 	;	 EY1 =  Data->GetMMStripYEEnergy(0) ;
-								EX2 = Data->GetMMStripXEEnergy(1) 	;	 EY2 =  Data->GetMMStripYEEnergy(1) ;
-								
-								TX1 = Data->GetMMStripXTTime(0) 	;	 TY1 =  Data->GetMMStripYTTime(0) ;
-								TX2 = Data->GetMMStripXTTime(1) 	;	 TY2 =  Data->GetMMStripYTTime(1) ;
 							}
-							
-												
-					
-					
-					
-					
-					
-					return;
 					}
 			}
-			
+	
+		if( ArrayOfGoodCouple.size() > EventData->GetMMStripXEMult() ) ArrayOfGoodCouple.clear() ;
+		
+		return ArrayOfGoodCouple;	
+	}
+	
+	
+///////////////////////////////////////////////////////////////////////////
+bool TMust2Physics :: Match_Si_SiLi(int X, int Y , int PadNbr)
+	{
+							if( 	 PadNbr == 1 
+									&& X<=121 && X>=93
+									&& Y<=128 && Y>=95 ) 
+
+						return true ;
+
+
+				else	if( 	 PadNbr == 2 
+									&& X<=121 && X>=93 
+									&& Y<=100 && Y>=65 ) 
+
+						return true ;
+
+
+				else	if( 	 PadNbr == 3 
+									&& X<=96 && X>=61 
+									&& Y<=128 && Y>=95 ) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 4 
+									&& X<=96 && X>=61
+									&& Y<=100 && Y>=65 ) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 5 
+									&& X<=67 && X>=30 
+									&& Y<=100 && Y>=65) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 6 
+									&& X<=67 && X>=30 
+									&& Y<=128 && Y>=95 ) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 7 
+									&& X<=35 && X>=6 
+									&& Y<=100 && Y>=65 ) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 8 
+									&& X<=35 && X>=6 
+									&& Y<=128 && Y>=95 ) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 9 
+									&& X<=121 && X>=93 
+									&& Y<=31 && Y>=1 ) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 10 
+									&& X<=121 && X>=93 
+									&& Y<=60 && Y>=26 ) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 11 
+									&& X<=96 && X>=61
+									&& Y<=31 && Y>=1 ) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 12 
+									&& X<=96 && X>=61
+									&& Y<=60 && Y>=26) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 13 
+									&& X<=67 && X>=30 
+									&& Y<=60 && Y>=26 ) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 14 
+									&& X<=67 && X>=30 
+									&& Y<=31 && Y>=1 ) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 15 
+									&& X<=35 && X>=6
+									&& Y<=60 && Y>=26 ) 
+
+						return true ;
+
+				else	if( 	 PadNbr == 16 
+									&& X<=35 && X>=6
+									&& Y<=31 && Y>=1 ) 
+
+						return true ;		
+
+				else
+						return false;
 	}
 
 
+///////////////////////////////////////////////////////////////////////////
+bool TMust2Physics :: Match_Si_CsI(int X, int Y , int CristalNbr)
+	{
+							if( 	 CristalNbr == 1 
+									&& X<=71 && X>=27 
+									&& Y<=101 && Y>=59 ) 
+
+						return true ;
+
+
+				else	if( 	 CristalNbr == 2 
+									&& X<=71 && X>=27 
+									&& Y<=128 && Y>=90 ) 
+
+						return true ;
+
+
+				else	if( 	 CristalNbr == 3 
+									&& X<=35 && X>=1 
+									&& Y<=101 && Y>=59 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 4 
+									&& X<=35 && X>=1 
+									&& Y<=128 && Y>=90 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 5 
+									&& X<=104 && X>=60 
+									&& Y<=71 && Y>=30 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 6 
+									&& X<=104 && X>=60 
+									&& Y<=41 && Y>=1 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 7 
+									&& X<=128 && X>=90 
+									&& Y<=71 && Y>=30 )
+
+						return true ;
+
+				else	if( 	 CristalNbr == 8 
+									&& X<=128 && X>=90 
+									&& Y<=41 && Y>=1 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 9 
+									&& X<=71 && X>=27 
+									&& Y<=71 && Y>=40 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 10 
+									&& X<=71 && X>=27 
+									&& Y<=41 && Y>=1 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 11 
+									&& X<=35 && X>=1 
+									&& Y<=71 && Y>=30 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 12 
+									&& X<=35 && X>=1 
+									&& Y<=41 && Y>=1 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 13 
+									&& X<=104 && X>=60 
+									&& Y<=101 && Y>=59 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 14 
+									&& X<=104 && X>=60 
+									&& Y<=128 && Y>=90 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 15 
+									&& X<=128 && X>=90 
+									&& Y<=101 && Y>=59 ) 
+
+						return true ;
+
+				else	if( 	 CristalNbr == 16 
+									&& X<=128 && X>=90 
+									&& Y<=128 && Y>=90 ) 
+
+						return true ;
+
+				else
+						return false;
+	}
+
+///////////////////////////////////////////////////////////////////////////
 void TMust2Physics::Clear()
 	{
 		EventMultiplicity= 0		;
+		
 		TelescopeNumber	.clear()	;
-		EventType		.clear()	;
-		TotalEnergy		.clear()	;
+		EventType				.clear()	;
+		TotalEnergy			.clear()	;
 		
 		// Si X
 		Si_E.clear()	;
@@ -308,4 +415,563 @@ void TMust2Physics::Clear()
 		CsI_T.clear()	;
 		CsI_N.clear()	;
 	}
+///////////////////////////////////////////////////////////////////////////
+
+////	Innherited from VDetector Class	////				
+				
+//	Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token
+void TMust2Physics::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 Start Up Must2 bloc, Reading toggle to true      
+      	if (LineBuffer.compare(0, 11, "M2Telescope") == 0) 
+	      	{
+	        	 cout << "///" << endl           		;
+	       		  cout << "Telescope found: " << endl   ;        
+	        	 ReadingStatus = true 					;
+	        	
+		   	}
+		
+		//	Else don't toggle to Reading Block Status
+		else ReadingStatus = false ;
+		
+		//	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, 11, "M2Telescope") == 0) {
+						cout << "WARNING: Another Telescope 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;
+		            
+		         }
+
+		         //Angle method
+		         else if (DataBuffer.compare(0, 4, "PHI=") == 0) {
+		            check_Phi = true;
+		            ConfigFile >> DataBuffer ;
+		            Phi = atof(DataBuffer.c_str()) ;
+		            Phi = Phi ;
+		            cout << "Phi:  " << Phi << endl;
+		          
+		         }
+
+		         //Angle method
+		         else if (DataBuffer.compare(0, 2, "R=") == 0) {
+		            check_R = true;
+		            ConfigFile >> DataBuffer ;
+		            R = atof(DataBuffer.c_str()) ;
+		            R = R ;
+		            cout << "R:  " << R << endl;
+		          
+		         }
+
+		         //Angle method
+		         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 ) 
+		         		{
+				            AddTelescope(	A   ,
+				                  				B   ,
+				                 					C   ,
+				                  				D   ) ;
+				         }
+		         	
+		         	    //with angle method
+       				  else if ( check_Theta && check_Phi && check_R && check_beta ) 
+       				  	{
+				            AddTelescope(	Theta   ,
+				                  				Phi   	,
+				                  				R       ,
+				                  				beta_u  ,
+				                  				beta_v  ,
+				                  				beta_w  );
+      					}
+								
+			        check_A = false 	;
+							check_B = false 	;
+		  				check_C = false  	;
+		  				check_D = false  	;
+
+		   				check_Theta = false   	;
+		   				check_Phi  = false  	;
+		   				check_R    = false   	;
+		   				check_beta = false  	;
+					
+		         	}
+		         
+		}
+		        
+		        
+		    
+		         	
+	}
+	
+	cout << endl << "/////////////////////////////" << endl<<endl;
+
+}
+
+//	Add Parameter to the CalibrationManger
+void TMust2Physics::AddParameterToCalibrationManager()	
+	{
+		CalibrationManager* Cal = CalibrationManager::getInstance();
+		
+		for(int i = 0 ; i < NumberOfTelescope ; i++)
+			{
+			
+				for( int j = 0 ; j < 128 ; j++)
+					{
+						Cal->AddParameter("MUST2", "T"+itoa(i+1)+"_Si_X"+itoa(j+1)+"_E","MUST2_T"+itoa(i+1)+"_Si_X"+itoa(j+1)+"_E")	;
+						Cal->AddParameter("MUST2", "T"+itoa(i+1)+"_Si_Y"+itoa(j+1)+"_E","MUST2_T"+itoa(i+1)+"_Si_Y"+itoa(j+1)+"_E")	;
+						Cal->AddParameter("MUST2", "T"+itoa(i+1)+"_Si_X"+itoa(j+1)+"_T","MUST2_T"+itoa(i+1)+"_Si_X"+itoa(j+1)+"_T")	;
+						Cal->AddParameter("MUST2", "T"+itoa(i+1)+"_Si_Y"+itoa(j+1)+"_T","MUST2_T"+itoa(i+1)+"_Si_Y"+itoa(j+1)+"_T")	;	
+					}
+		
+				for( int j = 0 ; j < 16 ; j++)
+					{
+						Cal->AddParameter("MUST2", "T"+itoa(i+1)+"_SiLi"+itoa(j+1)+"_E","MUST2_T"+itoa(i+1)+"_SiLi"+itoa(j+1)+"_E")	;
+						Cal->AddParameter("MUST2", "T"+itoa(i+1)+"_SiLi"+itoa(j+1)+"_T","MUST2_T"+itoa(i+1)+"_SiLi"+itoa(j+1)+"_T")	;
+					}
+			
+				for( int j = 0 ; j < 16 ; j++)
+					{
+						Cal->AddParameter("MUST2", "T"+itoa(i+1)+"_CsI"+itoa(j+1)+"_E","MUST2_T"+itoa(i+1)+"_CsI"+itoa(j+1)+"_E")		;
+						Cal->AddParameter("MUST2", "T"+itoa(i+1)+"_CsI"+itoa(j+1)+"_T","MUST2_T"+itoa(i+1)+"_CsI"+itoa(j+1)+"_T")		;
+					}
+			}
+	
+	
+	}
+
+//	Activated associated Branches and link it to the private member DetectorData address
+//	In this method mother Branches (Detector) AND daughter leaf (fDetector_parameter) have to be activated
+void TMust2Physics::InitializeRootInput() 		
+	{
+		TChain* inputChain = RootInput::getInstance()->GetChain()	;
+		inputChain->SetBranchStatus( "MUST2" , true )				;
+		inputChain->SetBranchStatus( "fMM_*" , true )				;
+		inputChain->SetBranchAddress( "MUST2" , &EventData )		;
+	}
+
+
+//	Create associated branches and associated private member DetectorPhysics address
+void TMust2Physics::InitializeRootOutput() 	
+	{
+		TTree* outputTree = RootOutput::getInstance()->GetTree()		;
+		outputTree->Branch( "MUST2" , "TMust2Physics" , &EventPhysics )	;
+	}
+
+
+/////	Specific to MUST2Array	////
+
+void TMust2Physics::AddTelescope(	TVector3 C_X1_Y1 		,
+			 					TVector3 C_X128_Y1 		, 
+			 					TVector3 C_X1_Y128 		, 
+			 					TVector3 C_X128_Y128	)
+	{
+		// To avoid warning
+		C_X1_Y128 *= 1;
+
+		NumberOfTelescope++;
+	
+		//	Vector U on Telescope Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis)
+		TVector3 U = C_X1_Y1 - C_X128_Y1 				;	
+		U = U.Unit()									;
+		//	Vector V on Telescope Face (parallele to X Strip)
+		TVector3 V = C_X128_Y128 - C_X128_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 								;		
+
+		//	Geometry Parameter
+		double Face = 98 					  	; //mm
+		double NumberOfStrip = 128 				; 
+		double StripPitch = Face/NumberOfStrip	; //mm
+
+		//	Buffer object to fill Position Array
+		vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ;
+
+		vector< vector< double > >	OneTelescopeStripPositionX	;
+		vector< vector< double > >	OneTelescopeStripPositionY	;
+		vector< vector< double > >	OneTelescopeStripPositionZ	;
+		
+		//	Moving StripCenter to 1.1 corner:
+		Strip_1_1 = C_X128_Y1 + (U+V) * (StripPitch/2.) 	;
+
+		for( int i = 0 ; i < 128 ; i++ )
+			{
+				lineX.clear()	;
+				lineY.clear()	;
+				lineZ.clear()	;
+				
+				for( int j = 0 ; j < 128 ; j++ )
+					{
+						StripCenter  = Strip_1_1 + StripPitch*( i*U + j*V  )	;
+						//StripCenter += -TargetPosition		;
+						
+						lineX.push_back( StripCenter.X() )	;
+						lineY.push_back( StripCenter.Y() )	;
+						lineZ.push_back( StripCenter.Z() )	;	
+					}
+					
+				OneTelescopeStripPositionX.push_back(lineX)	;
+				OneTelescopeStripPositionY.push_back(lineY)	;
+				OneTelescopeStripPositionZ.push_back(lineZ)	;
+			 	
+			}
+	
+		
+		StripPositionX.push_back( OneTelescopeStripPositionX ) ;
+		StripPositionY.push_back( OneTelescopeStripPositionY ) ;
+		StripPositionZ.push_back( OneTelescopeStripPositionZ ) ;	
+
+	}
+				
+				
+void TMust2Physics::AddTelescope(	double theta 	, 
+								double phi 		, 
+								double distance , 
+								double beta_u 	, 
+								double beta_v 	, 
+								double beta_w	)
+	{
+	
+		NumberOfTelescope++;
+	
+		double Pi = 3.141592654 ;
+
+		// convert from degree to radian:
+		theta = theta * Pi/180. ; 
+		phi   = phi   * Pi/180. ;
+
+		//Vector U on Telescope Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis)
+		TVector3 U ;	
+		//Vector V on Telescope Face (parallele to X Strip)
+		TVector3 V ;
+		//Vector W normal to Telescope Face (pointing CsI)
+		TVector3 W ;
+		//Vector position of Telescope Face center
+		TVector3 C ;
+			
+		C = TVector3 (	distance * sin(theta) * cos(phi) ,
+						distance * sin(theta) * sin(phi) ,
+						distance * cos(theta)			 );
+		
+    	TVector3 P = TVector3(	cos(theta ) * cos(phi)	, 
+    							cos(theta ) * sin(phi)	,
+    							-sin(theta)				);
+		
+		W = C.Unit() ;
+		U = W .Cross ( P ) ;
+	    V = W .Cross ( U );
+		
+		U = U.Unit();
+		V = V.Unit();
+		
+		U.Rotate( beta_u * Pi/180. , U ) ;
+		V.Rotate( beta_u * Pi/180. , U ) ;
+		
+		U.Rotate( beta_v * Pi/180. , V ) ;
+		V.Rotate( beta_v * Pi/180. , V ) ;
+		
+		U.Rotate( beta_w * Pi/180. , W ) ;
+		V.Rotate( beta_w * Pi/180. , W ) ;
+		
+		double Face = 98 					  	; //mm
+		double NumberOfStrip = 128 				;
+		double StripPitch = Face/NumberOfStrip	; //mm
+
+		vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ;
+		
+		vector< vector< double > >	OneTelescopeStripPositionX	;
+		vector< vector< double > >	OneTelescopeStripPositionY	;
+		vector< vector< double > >	OneTelescopeStripPositionZ	;
+		
+		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 < 128 ; i++ )
+			{
+				
+				lineX.clear()	;
+				lineY.clear()	;
+				lineZ.clear()	;
+				
+				for( int j = 0 ; j < 128 ; 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)	;		
+						
+					}
+				
+				OneTelescopeStripPositionX.push_back(lineX)	;
+				OneTelescopeStripPositionY.push_back(lineY)	;
+				OneTelescopeStripPositionZ.push_back(lineZ)	;
+			 	
+			}
+		StripPositionX.push_back( OneTelescopeStripPositionX ) ;
+		StripPositionY.push_back( OneTelescopeStripPositionY ) ;
+		StripPositionZ.push_back( OneTelescopeStripPositionZ ) ;
+	}
+	
+	
+TVector3 TMust2Physics::GetPositionOfInteraction(int i)
+	{
+		TVector3 Position = TVector3 (	GetStripPositionX( TelescopeNumber[i] , Si_X[i] , Si_Y[i] ) 	,
+										GetStripPositionY( TelescopeNumber[i] , Si_X[i] , Si_Y[i] )	,
+										GetStripPositionZ( TelescopeNumber[i] , Si_X[i] , Si_Y[i] )	) ;
+		
+		return(Position) ;	
+	
+	}
+	
+TVector3 TMust2Physics::GetTelescopeNormal( int i)
+	{
+				TVector3 U = TVector3 (		GetStripPositionX( TelescopeNumber[i] , 128 , 1 ) 	,
+											GetStripPositionY( TelescopeNumber[i] , 128 , 1 )		,
+											GetStripPositionZ( TelescopeNumber[i] , 128 , 1 )		)
+											
+							- TVector3 (	GetStripPositionX( TelescopeNumber[i] , 1 , 1 ) 		,
+											GetStripPositionY( TelescopeNumber[i] , 1 , 1 )		,
+											GetStripPositionZ( TelescopeNumber[i] , 1 , 1 )		);
+										
+				TVector3 V = TVector3 (		GetStripPositionX( TelescopeNumber[i] , 128 , 128 ) 	,
+											GetStripPositionY( TelescopeNumber[i] , 128 , 128 )	,
+											GetStripPositionZ( TelescopeNumber[i] , 128 , 128 )	)
+											
+							- TVector3 (	GetStripPositionX( TelescopeNumber[i] , 128 , 1 ) 	,
+											GetStripPositionY( TelescopeNumber[i] , 128 , 1 )		,
+											GetStripPositionZ( TelescopeNumber[i] , 128 , 1 )		);
+											
+				TVector3 Normal = U.Cross(V);
+		
+		return(Normal.Unit()) ;	
+	
+	}	
+
+///////////////////////////////////////////////////////////////////////////
+namespace LOCAL
+	{
+		
+		//	tranform an integer to a string
+		string itoa(int value)
+			{
+			  std::ostringstream o;
+			
+			  if (!(o << value))
+			    return ""	;
+			    
+			  return o.str();
+			}
+			
+		//	DSSD
+		//	X
+		double fSi_X_E(TMust2Data* EventData , int i)
+			{
+				return CalibrationManager::getInstance()->ApplyCalibration(	"MUST2/" + itoa( EventData->GetMMStripXEDetectorNbr(i) ) + "Si_X" + itoa( EventData->GetMMStripXEStripNbr(i) ) + "_E",	
+																																		EventData->GetMMStripXEEnergy(i) );
+																																	
+			}
+			
+		double fSi_X_T(TMust2Data* EventData , int i)
+			{
+				return CalibrationManager::getInstance()->ApplyCalibration(	"MUST2/T" + itoa( EventData->GetMMStripXTDetectorNbr(i) ) + "Si_X" + itoa( EventData->GetMMStripXTStripNbr(i) ) +"_T",	
+																																		EventData->GetMMStripXTTime(i) );
+			}
+		
+		//	Y	
+		double fSi_Y_E(TMust2Data* EventData , int i)
+			{
+				return CalibrationManager::getInstance()->ApplyCalibration(	"MUST2/T" + itoa( EventData->GetMMStripYEDetectorNbr(i) ) + "Si_Y" + itoa( EventData->GetMMStripYEStripNbr(i) ) +"_E",	
+																																		EventData->GetMMStripYEEnergy(i) );
+			}
+			
+		double fSi_Y_T(TMust2Data* EventData , int i)
+			{
+				return CalibrationManager::getInstance()->ApplyCalibration(	"MUST2/T" + itoa( EventData->GetMMStripYTDetectorNbr(i) ) + "Si_Y" + itoa( EventData->GetMMStripYTStripNbr(i) ) +"_T",	
+																																		EventData->GetMMStripYTTime(i) );
+			}
+			
+			
+		//	SiLi
+		double fSiLi_E(TMust2Data* EventData , int i)
+			{
+				return CalibrationManager::getInstance()->ApplyCalibration(	"MUST2/T" + itoa( EventData->GetMMSiLiEDetectorNbr(i) ) + "SiLi" + itoa( EventData->GetMMSiLiEPadNbr(i) ) +"_E",	
+																																		EventData->GetMMSiLiEEnergy(i) );
+			}
+			
+		double fSiLi_T(TMust2Data* EventData , int i)
+			{
+				return CalibrationManager::getInstance()->ApplyCalibration(	"MUST2/T" + itoa( EventData->GetMMSiLiTDetectorNbr(i) ) + "SiLi" + itoa( EventData->GetMMSiLiTPadNbr(i) )+"_T",	
+																																		EventData->GetMMSiLiTTime(i) );
+			}
+			
+		//	CsI
+		double fCsI_E(TMust2Data* EventData , int i)
+			{
+				return CalibrationManager::getInstance()->ApplyCalibration(	"MUST2/T" + itoa( EventData->GetMMCsIEDetectorNbr(i) ) + "SiLi" + itoa( EventData->GetMMCsIECristalNbr(i) ) +"_E",	
+																																		EventData->GetMMCsIEEnergy(i) );
+			}
+			
+		double fCsI_T(TMust2Data* EventData , int i)
+			{
+				return CalibrationManager::getInstance()->ApplyCalibration(	"MUST2/T" + itoa( EventData->GetMMCsITDetectorNbr(i) ) + "SiLi" + itoa( EventData->GetMMCsITCristalNbr(i) ) +"_T",	
+																																		EventData->GetMMCsITTime(i) );
+			}
+	
+	}
 
diff --git a/NPLib/MUST2/TMust2Physics.h b/NPLib/MUST2/TMust2Physics.h
index 22bd7b3b518042138485d27d55fb8e14b2925728..1f649c60c2ae4298b4a44380e7fdb5bf7a9d903e 100644
--- a/NPLib/MUST2/TMust2Physics.h
+++ b/NPLib/MUST2/TMust2Physics.h
@@ -22,25 +22,39 @@
  *  Improvment needed                                                        *
  *                                                                           *
  *****************************************************************************/
+// STL
 #include <vector>
-#include "TObject.h"
+
+// NPL
 #include "TMust2Data.h"
+#include "../include/CalibrationManager.h"
+#include "../include/VDetector.h"
+// ROOT 
+#include "TVector2.h" 
+#include "TVector3.h" 
+#include "TObject.h"
 
 using namespace std ;
 
-class TMust2Physics : public TObject
+class TMust2Physics : public TObject, public NPA::VDetector
 {
 	public:
 		TMust2Physics()	;
-		~TMust2Physics();
+		~TMust2Physics() {};
 
 	public: 
 	void Clear()									;	
-        void Clear(const Option_t*) {};
-	void BuildPhysicalEvent(TMust2Data* Data)		;
-	void BuildSimplePhysicalEvent(TMust2Data* Data)	;
-		
+  void Clear(const Option_t*) {};
+
+	public: 
+	vector < TVector2 > Match_X_Y() ;
+	bool Match_Si_CsI(int X, int Y , int CristalNbr);
+	bool Match_Si_SiLi(int X, int Y , int PadNbr);
+	bool ResolvePseudoEvent();
+	int  CheckEvent();
+	
 	public:
+	
 	//	Provide Physical Multiplicity
 	Int_t			EventMultiplicity	;
 				
@@ -53,23 +67,129 @@ class TMust2Physics : public TObject
 	//	Si X
 	vector<double>	Si_E				;
 	vector<double>	Si_T				;
-	vector<int>		Si_X				;
-	vector<int>		Si_Y				;
+	vector<int>			Si_X				;
+	vector<int>			Si_Y				;
 	
 	//	Si(Li)
 	vector<double>	SiLi_E				;
 	vector<double>	SiLi_T				;
-	vector<int>		SiLi_N				;
+	vector<int>			SiLi_N				;
 	
 	//	CsI
 	vector<double>	CsI_E				;
 	vector<double>	CsI_T				;
-	vector<int>		CsI_N				;	
+	vector<int>			CsI_N				;	
 	
 	// Physical Value  
 	vector<double>	TotalEnergy			;
 	
-	ClassDef(TMust2Physics,1)  // Must2Data structure
+	
+	public:		//	Innherited from VDetector Class
+			
+		//	Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token
+		void ReadConfiguration(string) 				;
+		
+
+		//	Add Parameter to the CalibrationManger
+		void AddParameterToCalibrationManager()	;		
+			
+		
+		//	Activated associated Branches and link it to the private member DetectorData address
+		//	In this method mother Branches (Detector) AND daughter leaf (fDetector_parameter) have to be activated
+		void InitializeRootInput() 					;
+
+
+		//	Create associated branches and associated private member DetectorPhysics address
+		void InitializeRootOutput() 		 		;
+		
+		
+		//	This method is called at each event read from the Input Tree. Aime is to build treat Raw dat in order to extract physical parameter. 
+		void BuildPhysicalEvent()					;
+		
+		
+		//	Same as above, but only the simplest event and/or simple method are used (low multiplicity, faster algorythm but less efficient ...).
+		//	This method aimed to be used for analysis performed during experiment, when speed is requiered.
+		//	NB: This method can eventually be the same as BuildPhysicalEvent.
+		void BuildSimplePhysicalEvent()				;
+
+		//	Those two method all to clear the Event Physics or Data
+		void ClearEventPhysics()		{Clear();}		
+		void ClearEventData()				{EventData->Clear();}		
+	
+	public:		//	Specific to MUST2 Array
+		//	Add a Telescope using Corner Coordinate information
+		void AddTelescope(	TVector3 C_X1_Y1 		,
+	 						TVector3 C_X128_Y1 		, 
+	 						TVector3 C_X1_Y128 		, 
+	 						TVector3 C_X128_Y128	);
+		
+		//	Add a Telescope using R Theta Phi of Si center information
+		void AddTelescope(	double theta 	, 
+							double phi 		, 
+							double distance , 
+							double beta_u 	, 
+							double beta_v 	, 
+							double beta_w	);
+							
+		double GetStripPositionX( int N , int X , int Y )	{ return StripPositionX[N-1][X-1][Y-1] ; };
+		double GetStripPositionY( int N , int X , int Y )	{ return StripPositionY[N-1][X-1][Y-1] ; };
+		double GetStripPositionZ( int N , int X , int Y )	{ return StripPositionZ[N-1][X-1][Y-1] ; };
+
+		double GetNumberOfTelescope() 	{ return NumberOfTelescope ; }			;
+
+		// To be called after a build Physical Event 
+		int GetEventMultiplicity()	{ return EventMultiplicity; };
+		
+		double GetEnergyDeposit(int i) { return TotalEnergy[i] ;};
+		
+		TVector3 GetPositionOfInteraction(int i)	 ;	
+		TVector3 GetTelescopeNormal(int i)		;
+
+	 	private:	//	Root Input and Output tree classes
+				
+				TMust2Data* 	  	EventData				;//!
+				TMust2Physics* 	  EventPhysics		;//!
+
+
+		private:	//	Spatial Position of Strip Calculated on bases of detector position
+	
+			int NumberOfTelescope	;//!
+		
+			vector< vector < vector < double > > >	StripPositionX			;//!
+			vector< vector < vector < double > > >	StripPositionY			;//!
+			vector< vector < vector < double > > >	StripPositionZ			;//!
+			
+	ClassDef(TMust2Physics,1)  // Must2Physics structure
 };
 
+namespace LOCAL
+	{
+		// Threshold
+		const double Si_X_E_Threshold = 0	;	const double Si_X_T_Threshold = 0 ;
+		const double Si_Y_E_Threshold = 0	;	const double Si_Y_T_Threshold = 0	;
+		const double SiLi_E_Threshold = 0	;	const double SiLi_T_Threshold = 0	;
+		const double CsI_E_Threshold	= 0 ;	const double CsI_T_Threshold	= 0	;
+		
+		//	tranform an integer to a string
+		string itoa(int value);
+		//	DSSD
+		//	X
+		double fSi_X_E(TMust2Data* Data , int i);
+		double fSi_X_T(TMust2Data* Data, int i);
+		
+		//	Y	
+		double fSi_Y_E(TMust2Data* Data, int i);
+		double fSi_Y_T(TMust2Data* Data, int i);
+			
+		//	SiLi
+		double fSiLi_E(TMust2Data* Data, int i);
+		double fSiLi_T(TMust2Data* Data, int i);
+			
+		//	CsI
+		double fCsI_E(TMust2Data* Data, int i);
+		double fCsI_T(TMust2Data* Data, int i);
+	
+	}
+
+
 #endif
diff --git a/NPLib/Makefile b/NPLib/Makefile
index bdfaaf6e1e7a68e22d56a00385b0a2753ce40bb8..635fcccef1480d0c6bccae9064891e15c71323be 100644
--- a/NPLib/Makefile
+++ b/NPLib/Makefile
@@ -268,13 +268,23 @@ GLIBS         = $(ROOTGLIBS) $(SYSLIBS)
 INCLUDE		= -I$(CLHEP_BASE_DIR)/include
  
 #------------------------------------------------------------------------------
-SHARELIB      =	Vdetec	InputOutputRoot InitCond	InterCoord \
-		Must2All	GaspardData	AnnularS1Data PlasticData\
+SHARELIB      =	CalibManager Vdetec	InputOutputRoot InitCond	InterCoord \
+		Must2All	GaspardData	AnnularS1Data PlasticData DummyDetectorData SSSDData\
 		Reaction	EnergyLoss
 
 all:         $(SHARELIB)
 	rm -f ./include/*Dict.h
 #------------------------------------------------------------------------------
+############### Calibration ##############
+
+## CalibrationManager ##
+CalibManager:
+		make -C ./CalibrationManager
+		cp ./CalibrationManager/*.so ./lib ; cp ./CalibrationManager/*.h ./include
+ifeq ($(ARCH),macosx)
+		cd lib; ln -sf libCalibrationManager.so libCalibrationManager.dylib
+endif
+
 ############### Detector ##############
 
 ## VDetector ##
@@ -294,6 +304,14 @@ ifeq ($(ARCH),macosx)
 		cd lib; ln -sf libMust2Physics.so libMust2Physics.dylib
 endif
 
+## SSSD ##
+SSSDData:
+		make -C ./SSSD
+		cp ./SSSD/*.so ./lib ; cp ./SSSD/*.h ./include
+ifeq ($(ARCH),macosx)
+		cd lib; ln -sf libSSSDData.so libSSSDData.dylib
+endif
+
 ## AnnularS1 ##
 AnnularS1Data:
 		make -C ./AnnularS1
@@ -308,19 +326,26 @@ GaspardData:
 		cp ./GASPARD/*.so ./lib ; cp ./GASPARD/*.h ./include
 ifeq ($(ARCH),macosx)
 		cd lib; ln -sf libGaspardData.so libGaspardData.dylib
-		cd lib; ln -sf libGaspardPyysics.so libGaspardPhysics.dylib
+		cd lib; ln -sf libGaspardPhysics.so libGaspardPhysics.dylib
 endif
 
-## Gaspard ##
+## Plastic ##
 PlasticData:
 		make -C ./Plastic
 		cp ./Plastic/*.so ./lib ; cp ./Plastic/*.h ./include
 ifeq ($(ARCH),macosx)
 		cd lib; ln -sf libPlasticData.so libPlasticData.dylib
-		cd lib; ln -sf libPlasticPyysics.so libPlasticPhysics.dylib
+		cd lib; ln -sf libPlasticPhysics.so libPlasticPhysics.dylib
 endif
 
-
+## DUMMY Detector ##
+DummyDetectorData:
+		make -C ./DummyDetector
+		cp ./DummyDetector/*.so ./lib ; cp ./DummyDetector/*.h ./include
+ifeq ($(ARCH),macosx)
+		cd lib; ln -sf libDummyDetectorData.so libPlasticData.dylib
+		cd lib; ln -sf libPlasticPhysics.so libPlasticPhysics.dylib
+endif
 ############# Simulation ##############
 
 ## InitialConditions ##
@@ -373,11 +398,14 @@ clean:
 	make clean -C ./Tools
 	make clean -C ./IORoot
 	make clean -C ./VDetector
+	make clean -C ./CalibrationManager
 	make clean -C ./MUST2
+	make clean -C ./SSSD
 	make clean -C ./AnnularS1
 	make clean -C ./GASPARD
 	make clean -C ./InteractionCoordinates
 	make clean -C ./InitialConditions
+	make clean -C ./DummyDetector
 	
 distclean:
 	rm -f ./lib/*.so
@@ -388,12 +416,14 @@ endif
 	make distclean -C ./Tools
 	make distclean -C ./IORoot
 	make distclean -C ./VDetector
+	make distclean -C ./CalibrationManager
 	make distclean -C ./MUST2
+	make distclean -C ./SSSD
 	make distclean -C ./AnnularS1
 	make distclean -C ./GASPARD
 	make distclean -C ./InteractionCoordinates
 	make distclean -C ./InitialConditions
-
+	make distclean -C ./DummyDetector
 .SUFFIXES: .$(SrcSuf)
 
 ###
diff --git a/NPLib/Plastic/Makefile b/NPLib/Plastic/Makefile
index e5373baed1a56beac4a2ecd424d8ed5a91a45d6d..06fc2ee6055f821118bbba183e20029e06d11969 100644
--- a/NPLib/Plastic/Makefile
+++ b/NPLib/Plastic/Makefile
@@ -268,7 +268,7 @@ GLIBS         = $(ROOTGLIBS) $(SYSLIBS)
 INCLUDE		= -I$(CLHEP_BASE_DIR)/include
  
 #------------------------------------------------------------------------------
-SHARELIB      =  libPlasticData.so 
+SHARELIB      =  libPlasticData.so libPlasticPhysics.so
 
 all:            $(SHARELIB)
 #------------------------------------------------------------------------------
@@ -281,8 +281,15 @@ libPlasticData.so:	TPlasticData.o	TPlasticDataDict.o
 TPlasticDataDict.cxx:	TPlasticData.h
 			rootcint -f $@ -c $^
 
+libPlasticPhysics.so:	TPlasticPhysics.o	TPlasticPhysicsDict.o
+			$(LD) $(SOFLAGS) $^ $(OutPutOpt) $@
+
+TPlasticPhysicsDict.cxx:	TPlasticPhysics.h
+			rootcint -f $@ -c $^
+
 # dependances
 TPlasticData.o:	TPlasticData.cxx	TPlasticData.h
+TPlasticPhysics.o:	TPlasticPhysics.cxx	TPlasticPhysics.h
 #######################################
 
 ############# Clean and More ##########
diff --git a/NPLib/Plastic/TPlasticData.cxx b/NPLib/Plastic/TPlasticData.cxx
index 8b4f51ecef036ffa7b599ffc82323ec7238c14cf..f7d677090215f65d3d7c578849f53d9ee9b5703d 100644
--- a/NPLib/Plastic/TPlasticData.cxx
+++ b/NPLib/Plastic/TPlasticData.cxx
@@ -1,6 +1,4 @@
 #include <iostream>
-using namespace std;
-
 #include "TPlasticData.h"
 
 
diff --git a/NPLib/Plastic/TPlasticData.h b/NPLib/Plastic/TPlasticData.h
index 253213c861471f1fdeb210cce2b46ec0f9265370..ebd2eb3f79c1ca83b7710a75c8f26ac949d7bb1e 100644
--- a/NPLib/Plastic/TPlasticData.h
+++ b/NPLib/Plastic/TPlasticData.h
@@ -4,7 +4,7 @@
 #include <vector>
 
 #include "TObject.h"
-
+using namespace std ;
 
 
 class TPlasticData : public TObject {
@@ -12,7 +12,7 @@ class TPlasticData : public TObject {
    // ADC
    vector<double>	  fPlastic_Energy	;	
    vector<double>	  fPlastic_Time		;
-   vector<short>      fPlastic_Number	;
+   vector<short>    fPlastic_Number	;
    
  public:
    TPlasticData();
@@ -24,25 +24,25 @@ class TPlasticData : public TObject {
 
    /////////////////////           GETTERS           ////////////////////////
    // (E)
-   double	GetEnergy(int i)			{return fPlastic_Energy[i];}
+   double	GetEnergy(int i)					{	return fPlastic_Energy[i]			;}
    // (T)
-   double	GetTime(int i)				{return fPlastic_Time[i];}
+   double	GetTime(int i)						{	return fPlastic_Time[i]				;}
    // (N)
-   int      GetPlasticNumber(int i)		{return fPlastic_Number[i];}
-   
+   int    GetPlasticNumber(int i)		{	return fPlastic_Number[i]			;}
    
-     double	GetEnergySize()			{return fPlastic_Energy.size();}
+   //Mult
+   // E
+   double	GetEnergyMult()						{	return fPlastic_Energy.size()	;}
    // (T)
-   double	GetTimeSize()				{return fPlastic_Time.size();}
+   double	GetTimeMult()							{	return fPlastic_Time.size()		;}
    // (N)
-   int      GetPlasticNumberSize()		{return fPlastic_Number.size();}
-   
+   int    GetPlasticNumberMult()		{	return fPlastic_Number.size()	;}
    
    /////////////////////           SETTERS           ////////////////////////
    // (E)
-   void	SetEnergy(double E)			{fPlastic_Energy.push_back(E);}
-   void	SetTime(double T)			{fPlastic_Time.push_back(T);}
-   void	SetPlasticNumber(int N)		{fPlastic_Number.push_back(N);}
+   void	SetEnergy(double E)					{	fPlastic_Energy.push_back(E)	;}
+   void	SetTime(double T)						{	fPlastic_Time.push_back(T)		;}
+   void	SetPlasticNumber(int N)			{	fPlastic_Number.push_back(N)	;}
    
    //
    ClassDef(TPlasticData,1)  // PlasticData structure
diff --git a/NPLib/Plastic/TPlasticPhysics.cxx b/NPLib/Plastic/TPlasticPhysics.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..00ddd0bcf7cb5a0efefb39ca6cacb2004ab44119
--- /dev/null
+++ b/NPLib/Plastic/TPlasticPhysics.cxx
@@ -0,0 +1,257 @@
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : november 2009                                            *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Plastic  Physics                                         *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+
+//	NPL
+#include "TPlasticPhysics.h"
+#include "../include/RootOutput.h"
+#include "../include/RootInput.h"
+
+//	STL
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <limits>
+#include <stdlib.h>
+using namespace std;
+
+//	ROOT
+#include "TChain.h"
+
+//	tranform an integer to a string
+		string itoa(int value)
+			{
+			  std::ostringstream o;
+			
+			  if (!(o << value))
+			    return ""	;
+			    
+			  return o.str();
+			}
+
+ClassImp(TPlasticPhysics)
+///////////////////////////////////////////////////////////////////////////
+TPlasticPhysics::TPlasticPhysics()
+	{		
+		NumberOfDetector = 0 					;
+		EventData = new TPlasticData	;
+		EventPhysics = this						;
+	}
+	
+///////////////////////////////////////////////////////////////////////////
+TPlasticPhysics::~TPlasticPhysics()
+	{}
+	
+///////////////////////////////////////////////////////////////////////////
+void TPlasticPhysics::Clear()
+	{
+		DetectorNumber	.clear()	;
+		StripNumber			.clear()	;
+		Energy					.clear()	;
+		Time						.clear()	;
+	}
+	
+///////////////////////////////////////////////////////////////////////////
+void TPlasticPhysics::ReadConfiguration(string Path) 
+	{
+		ifstream ConfigFile           ;
+		ConfigFile.open(Path.c_str()) ;
+		string LineBuffer          ;
+		string DataBuffer          ;
+
+		double Theta = 0 , Phi = 0 , R = 0 , Thickness = 0 , Radius = 0 , LeadThickness = 0;
+		string Scintillator ;
+
+		bool check_Theta = false   ;
+		bool check_Phi  = false  ;
+		bool check_R     = false   ;
+		bool check_Thickness = false  		;
+		bool check_Radius = false  			;
+		bool check_LeadThickness = false		;
+		bool check_Scintillator = false		;
+		bool ReadingStatus = false ;
+		
+
+	 while (!ConfigFile.eof()) 
+	 	{
+	      
+		      	getline(ConfigFile, LineBuffer);
+
+				//	If line is a Start Up Plastic bloc, Reading toggle to true      
+		      	if (LineBuffer.compare(0, 7, "Plastic") == 0) 
+			      	{
+			        	 cout << "///" << endl           ;
+			       		  cout << "Platic found: " << endl   ;        
+			        	 ReadingStatus = true ;
+			        	
+				   	}
+				
+				//	Else don't toggle to Reading Block Status
+				else ReadingStatus = false ;
+				
+				//	Reading Block
+				while(ReadingStatus)
+					{
+							// Pickup Next Word 
+						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, 6, "Plastic") == 0) {
+							cout << "WARNING: Another Telescope is find before standard sequence of Token, Error may occured in Telecope definition" << endl ;
+							ReadingStatus = false ;
+						}
+											
+						//Angle method
+						else if (DataBuffer.compare(0, 6, "THETA=") == 0) {
+							check_Theta = true;
+							ConfigFile >> DataBuffer ;
+							Theta = atof(DataBuffer.c_str()) ;
+						}
+
+						else if (DataBuffer.compare(0, 4, "PHI=") == 0) {
+							check_Phi = true;
+							ConfigFile >> DataBuffer ;
+							Phi = atof(DataBuffer.c_str()) ;
+						}
+
+						else if (DataBuffer.compare(0, 2, "R=") == 0) {
+							check_R = true;
+							ConfigFile >> DataBuffer ;
+							R = atof(DataBuffer.c_str()) ;
+						}
+						
+						else if (DataBuffer.compare(0, 7, "Radius=") == 0) {
+							check_Radius = true;
+							ConfigFile >> DataBuffer ;
+							Radius = atof(DataBuffer.c_str()) ;
+						}
+						
+						else if (DataBuffer.compare(0, 10, "Thickness=") == 0) {
+							check_Thickness = true;
+							ConfigFile >> DataBuffer ;
+							Thickness = atof(DataBuffer.c_str()) ;
+						}
+						
+						else if (DataBuffer.compare(0, 13, "Scintillator=") == 0) {
+							check_Scintillator = true ;
+							ConfigFile >> DataBuffer ;
+							Scintillator = DataBuffer ;
+						}
+						
+						else if (DataBuffer.compare(0, 14, "LeadThickness=") == 0) {
+							check_LeadThickness = true;
+							ConfigFile >> DataBuffer ;
+							LeadThickness = atof(DataBuffer.c_str()) ;
+						}
+				      
+				         	///////////////////////////////////////////////////
+							//	If no Detector Token and no comment, toggle out
+				         else 
+				         	{ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ;}
+				         
+				         	/////////////////////////////////////////////////
+				         	//	If All necessary information there, toggle out
+				         
+				         if ( check_Theta && check_Phi && check_R && check_Thickness && check_Radius && check_LeadThickness && check_Scintillator) 
+				         	{ 
+			         		  NumberOfDetector++;
+						         
+						        //	Reinitialisation of Check Boolean 
+						        
+								check_Theta = false   			;
+								check_Phi  = false  			;
+								check_R     = false   			;
+								check_Thickness = false  		;
+								check_Radius = false  			;
+								check_LeadThickness = false		;
+								check_Scintillator = false 		;
+								ReadingStatus = false 			;	
+								cout << "///"<< endl ;	         
+				         	}
+				         	
+					}
+		}
+	}
+
+
+///////////////////////////////////////////////////////////////////////////
+void TPlasticPhysics::AddParameterToCalibrationManager()
+	{
+		CalibrationManager* Cal = CalibrationManager::getInstance();
+		
+		for(int i = 0 ; i < NumberOfDetector ; i++)
+			{
+				for( int j = 0 ; j < 16 ; j++)
+					{
+						Cal->AddParameter("Plastic", "Detector"+itoa(i+1)+"_E","Plastic_Detector"+itoa(i+1)+"_E")	;
+						Cal->AddParameter("Plastic", "Detector"+itoa(i+1)+"_T","Plastic_Detector"+itoa(i+1)+"_T")	;	
+					}
+		
+			}
+	}
+	
+///////////////////////////////////////////////////////////////////////////
+void TPlasticPhysics::InitializeRootInput()
+	{
+		TChain* inputChain = RootInput::getInstance()->GetChain()			;
+		inputChain->SetBranchStatus ( "Plastic" 		, true )					;
+		inputChain->SetBranchStatus ( "fPlastic_*" 	, true )					;
+		inputChain->SetBranchAddress( "Plastic" 		, &EventData )		;
+	}	
+
+///////////////////////////////////////////////////////////////////////////
+void TPlasticPhysics::InitializeRootOutput()
+	{
+		TTree* outputTree = RootOutput::getInstance()->GetTree()						;
+		outputTree->Branch( "Plastic" , "TPlasticPhysics" , &EventPhysics )	;
+	}
+
+///////////////////////////////////////////////////////////////////////////
+void TPlasticPhysics::BuildPhysicalEvent()
+	{
+		BuildSimplePhysicalEvent()	;
+	}
+
+///////////////////////////////////////////////////////////////////////////
+void TPlasticPhysics::BuildSimplePhysicalEvent()
+	{
+				for(unsigned int i = 0 ; i < EventData->GetEnergyMult() ; i++)
+					{
+					
+						DetectorNumber	.push_back( EventData->GetPlasticNumber(i) )	;
+						StripNumber			.push_back( EventData->GetPlasticNumber(i)    )	;
+						
+						Energy					.push_back(
+							CalibrationManager::getInstance()->ApplyCalibration(	"Plastic/Detector" + itoa( EventData->GetPlasticNumber(i) ) +"_E",	
+																																		EventData->GetEnergy(i) )
+																			)	;
+																			
+						Time						.push_back(
+							CalibrationManager::getInstance()->ApplyCalibration(	"Plastic/Detector" + itoa( EventData->GetPlasticNumber(i) ) +"_T",	
+																																		EventData->GetTime(i) )
+																			)	;
+					}
+
+	}
+
diff --git a/NPLib/Plastic/TPlasticPhysics.h b/NPLib/Plastic/TPlasticPhysics.h
new file mode 100644
index 0000000000000000000000000000000000000000..f1eedb765f96dee90100814473df8c6993fbc5fe
--- /dev/null
+++ b/NPLib/Plastic/TPlasticPhysics.h
@@ -0,0 +1,92 @@
+#ifndef __PlasticPhysics__
+#define __PlasticPhysics__
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : November 2009                                            *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold thePlastic Detector  Physics                             *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+ 
+//	STL
+#include <vector>
+using namespace std ;
+
+//	ROOT
+#include "TObject.h"
+
+//	NPL
+#include "TPlasticData.h"
+#include "../include/VDetector.h"
+#include "../include/CalibrationManager.h"
+
+class TPlasticPhysics : public TObject, public NPA::VDetector
+{
+	public:	//	Constructor and Destructor
+		TPlasticPhysics();
+		~TPlasticPhysics();
+
+	public:	//	Calibrated Data
+
+		vector<UShort_t>	DetectorNumber	;
+		vector<UShort_t>	StripNumber			;
+		vector<Double_t>	Energy					;
+		vector<Double_t>	Time						;
+
+	public:	//	inherrited from VDetector
+		//	Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token
+		void ReadConfiguration(string) 				;
+		
+
+		//	Add Parameter to the CalibrationManger
+		void AddParameterToCalibrationManager()	;		
+			
+		
+		//	Activated associated Branches and link it to the private member DetectorData address
+		//	In this method mother Branches (Detector) AND daughter leaf (fDetector_parameter) have to be activated
+		void InitializeRootInput() 					;
+
+
+		//	Create associated branches and associated private member DetectorPhysics address
+		void InitializeRootOutput() 		 		;
+		
+		
+		//	This method is called at each event read from the Input Tree. Aime is to build treat Raw dat in order to extract physical parameter. 
+		void BuildPhysicalEvent()					;
+		
+		
+		//	Same as above, but only the simplest event and/or simple method are used (low multiplicity, faster algorythm but less efficient ...).
+		//	This method aimed to be used for analysis performed during experiment, when speed is requiered.
+		//	NB: This method can eventually be the same as BuildPhysicalEvent.
+		void BuildSimplePhysicalEvent()				;
+
+		//	Those two method all to clear the Event Physics or Data
+		void ClearEventPhysics()		{Clear();}		
+		void ClearEventData()				{EventData->Clear();}		
+
+	private:	// Data not writted in the tree
+				int									NumberOfDetector	;//!
+				TPlasticData* 	  	EventData					;//!
+				TPlasticPhysics* 	  EventPhysics			;//!
+
+		void	Clear();
+    void  Clear(const Option_t*) {};
+	
+		ClassDef(TPlasticPhysics,1)  // PlasticPhysics structure
+};
+
+#endif
diff --git a/NPLib/SSSD/Makefile b/NPLib/SSSD/Makefile
new file mode 100755
index 0000000000000000000000000000000000000000..f9b71f05d93a9c1fdf589d168fb97e6b1d691bc6
--- /dev/null
+++ b/NPLib/SSSD/Makefile
@@ -0,0 +1,309 @@
+# Makefile for the ROOT test programs.
+# This Makefile shows nicely how to compile and link applications
+# using the ROOT libraries on all supported platforms.
+#
+# Copyright (c) 2000 Rene Brun and Fons Rademakers
+#
+# Author: Fons Rademakers, 29/2/2000
+
+ROOTCONFIG   := root-config
+
+ARCH         := $(shell $(ROOTCONFIG) --arch)
+PLATFORM     := $(shell $(ROOTCONFIG) --platform)
+ALTCC        := $(shell $(ROOTCONFIG) --cc)
+ALTCXX       := $(shell $(ROOTCONFIG) --cxx)
+ALTF77       := $(shell $(ROOTCONFIG) --f77)
+ALTLD        := $(shell $(ROOTCONFIG) --ld)
+
+#CXX           =
+ObjSuf        = o
+SrcSuf        = cxx
+ExeSuf        =
+DllSuf        = so
+OutPutOpt     = -o # keep whitespace after "-o"
+
+ifeq (debug,$(findstring debug,$(ROOTBUILD)))
+OPT           = -g
+OPT2          = -g
+else
+ifneq ($(findstring debug, $(strip $(shell $(ROOTCONFIG) --config))),)
+OPT           = -g
+OPT2          = -g
+else
+OPT           = -O
+OPT2          = -O2
+endif
+endif
+
+ROOTCFLAGS   := $(shell $(ROOTCONFIG) --cflags)
+ROOTLDFLAGS  := $(shell $(ROOTCONFIG) --ldflags)
+ROOTLIBS     := $(shell $(ROOTCONFIG) --libs)
+ROOTGLIBS    := $(shell $(ROOTCONFIG) --glibs)
+HASTHREAD    := $(shell $(ROOTCONFIG) --has-thread)
+ROOTDICTTYPE := $(shell $(ROOTCONFIG) --dicttype)
+NOSTUBS      := $(shell $(ROOTCONFIG) --nostubs)
+ROOTCINT     := rootcint
+
+ifeq ($(ARCH),linux)
+# Linux with egcs, gcc 2.9x, gcc 3.x
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxkcc)
+# Linux with the KAI compiler
+CXX           = KCC --one_instantiation_per_object
+CXXFLAGS      = $(OPT) -fPIC +K0
+LD            = KCC
+LDFLAGS       = $(OPT) $(shell $(ROOTCONFIG) --cflags)
+SOFLAGS       =
+endif
+
+ifeq ($(ARCH),linuxicc)
+# Linux with Intel icc compiler
+ICC_MAJOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f1)
+ICC_MINOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f2)
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476
+LD            = icpc
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxppcgcc)
+# PPC Linux with gcc and glibc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxia64gcc)
+# Itanium Linux with gcc 2.9x
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxia64sgi)
+# Itanium Linux with sgiCC
+CXX           = sgiCC
+CXXFLAGS      = $(OPT) -Wall -fPIC
+LD            = gsgiCC
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxia64ecc)
+# Itanium Linux with Intel icc (was ecc)
+ICC_MAJOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f1)
+ICC_MINOR    := $(shell icc -v 2>&1 | awk '{ if (NR==1) print $$2 }' | \
+                cut -d'.' -f2)
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476 -ftz
+LD            = icpc
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxx8664gcc)
+# AMD Opteron and Intel EM64T (64 bit mode) Linux with gcc 3.x
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxppc64gcc)
+# PPC64 Linux with gcc 3.x
+CXX           = g++
+CXXFLAGS      = $(OPT) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxx8664icc)
+# AMD Opteron and Intel EM64T (64 bit mode) Linux with Intel icc compiler
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476 -wd1572
+LD            = icpc
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxalphagcc)
+# Alpha Linux with gcc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxmips)
+# GNU/Linux on mips (BE/LE, O32/N32/N64) with gcc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxhppa)
+# GNU/Linux on hppa with gcc
+CXX           = g++
+CXXFLAGS      = $(OPT2) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT2)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),linuxarm)
+# ARM Linux with egcs
+CXX           = g++
+CXXFLAGS      = $(OPT) -Wall -fPIC
+LD            = g++
+LDFLAGS       = $(OPT)
+SOFLAGS       = -shared
+endif
+
+ifeq ($(ARCH),macosx)
+# MacOS X with cc (GNU cc 2.95.2 and gcc 3.3)
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+CXX           = g++
+CXXFLAGS      = $(OPT2) -pipe -Wall -W -Woverloaded-virtual
+LD            = $(MACOSXTARGET) g++
+LDFLAGS       = $(OPT2) -bind_at_load
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+ifeq ($(subst $(MACOSX_MINOR),,1234),1234)
+DllSuf        = so
+else
+DllSuf        = dylib
+endif
+UNDEFOPT      = dynamic_lookup
+ifneq ($(subst $(MACOSX_MINOR),,12),12)
+UNDEFOPT      = suppress
+LD            = g++
+endif
+SOFLAGS       = -dynamiclib -single_module -undefined $(UNDEFOPT)
+endif
+
+ifeq ($(ARCH),macosxicc)
+# MacOS X with Intel icc compiler
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+ifeq ($(MACOSX_MINOR),5)
+MACOSX_MINOR := 4
+endif
+CXX           = icc
+CXXFLAGS      = $(OPT) -fPIC -wd1476
+LD            = $(MACOSXTARGET) icpc
+LDFLAGS       = $(OPT)
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+ifeq ($(subst $(MACOSX_MINOR),,1234),1234)
+DllSuf        = so
+else
+DllSuf        = dylib
+endif
+SOFLAGS       = -dynamiclib -single_module -undefined dynamic_lookup
+endif
+
+ifeq ($(ARCH),macosx64)
+# MacOS X >= 10.4 with gcc 64 bit mode (GNU gcc 4.*)
+# Only specific option (-m64) comes from root-config
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+CXX           = g++
+CXXFLAGS      = $(OPT2) -pipe -Wall -W -Woverloaded-virtual
+LD            = $(MACOSXTARGET) g++ -m64
+LDFLAGS       = $(OPT2) -bind_at_load
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+ifeq ($(subst $(MACOSX_MINOR),,1234),1234)
+DllSuf        = so
+else
+DllSuf        = dylib
+endif
+SOFLAGS       = -m64 -dynamiclib -single_module -undefined dynamic_lookup
+endif
+
+ifeq ($(ARCH),macosxxlc)
+# MacOS X with IBM xlC compiler
+MACOSX_MINOR := $(shell sw_vers | sed -n 's/ProductVersion://p' | cut -d . -f 2)
+MACOSXTARGET := MACOSX_DEPLOYMENT_TARGET=10.$(MACOSX_MINOR)
+CXX           = xlC
+CXXFLAGS      = $(OPT)
+LD            = $(MACOSXTARGET) xlC
+LDFLAGS       = $(OPT) -Wl,-bind_at_load
+# The SOFLAGS will be used to create the .dylib,
+# the .so will be created separately
+DllSuf        = dylib
+UNDEFOPT      = dynamic_lookup
+ifneq ($(subst $(MACOSX_MINOR),,12),12)
+UNDEFOPT      = suppress
+LD            = xlC
+endif
+SOFLAGS       = -qmkshrobj -single_module -undefined $(UNDEFOPT)
+endif
+
+CXXFLAGS     += $(ROOTCFLAGS)
+LDFLAGS      += $(ROOTLDFLAGS)
+LIBS          = $(ROOTLIBS) $(SYSLIBS)
+GLIBS         = $(ROOTGLIBS) $(SYSLIBS)
+
+INCLUDE		= -I$(CLHEP_BASE_DIR)/include -I$(NPLIB)/include
+ 
+#------------------------------------------------------------------------------
+SHARELIB      =  libSSSDData.so libSSSDPhysics.so
+
+all:            $(SHARELIB)
+#------------------------------------------------------------------------------
+############### Detector ##############
+
+## SSSD ##
+libSSSDData.so:	TSSSDData.o	TSSSDDataDict.o
+		$(LD) $(SOFLAGS) $^ $(OutPutOpt) $@
+
+TSSSDDataDict.cxx:	TSSSDData.h
+			rootcint -f $@ -c $^
+
+libSSSDPhysics.so:	TSSSDPhysics.o	TSSSDPhysicsDict.o
+		$(LD) $(SOFLAGS) $^ $(OutPutOpt) $@
+
+TSSSDPhysicsDict.cxx:	TSSSDPhysics.h
+			rootcint -f $@ -c $^
+			
+# dependances
+TSSSDData.o:		TSSSDData.cxx	TSSSDData.h
+TSSSDPhysics.o:	TSSSDPhysics.cxx	TSSSDPhysics.h
+#######################################
+
+############# Clean and More ##########
+clean:
+	@rm -f core *~ *.o *Dict*
+
+distclean:
+	  make clean; rm -f *.so
+
+.SUFFIXES: .$(SrcSuf)
+
+###
+
+.$(SrcSuf).$(ObjSuf):
+	$(CXX) $(CXXFLAGS) $(INCLUDE) -c $<
+
+
diff --git a/NPLib/SSSD/TSSSDData.cxx b/NPLib/SSSD/TSSSDData.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..66d7b22393986cb749027650c8e7f102f822905d
--- /dev/null
+++ b/NPLib/SSSD/TSSSDData.cxx
@@ -0,0 +1,77 @@
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : febuary 2009                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold SSSD Raw data                                           *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+#include <iostream>
+using namespace std;
+
+#include "TSSSDData.h"
+
+ClassImp(TSSSDData)
+
+TSSSDData::TSSSDData()
+{
+	// Default constructor
+
+	// SSSD
+	// Energy
+	fSSSD_StripE_DetectorNbr.clear()	;
+	fSSSD_StripE_StripNbr.clear()	;
+	fSSSD_StripE_Energy.clear()		;
+	// Time
+	fSSSD_StripT_DetectorNbr.clear()	;
+	fSSSD_StripT_StripNbr.clear()	;
+	fSSSD_StripT_Time.clear()		;
+
+}
+
+TSSSDData::~TSSSDData()
+{}
+
+void TSSSDData::Clear()
+{
+	// DSSD
+	// Energy
+	fSSSD_StripE_DetectorNbr.clear()	;
+	fSSSD_StripE_StripNbr.clear()	;
+	fSSSD_StripE_Energy.clear()		; 
+	// Time
+	fSSSD_StripT_DetectorNbr.clear()	;
+	fSSSD_StripT_StripNbr.clear()	;
+	fSSSD_StripT_Time.clear()		;
+}
+
+
+
+void TSSSDData::Dump() const
+{
+   cout << "XXXXXXXXXXXXXXXXXXXXXXXX New Event XXXXXXXXXXXXXXXXX" << endl;
+
+   // SSSD
+   // Energy
+   cout << "SSSD_StripE_Mult = " << fSSSD_StripE_DetectorNbr.size() << endl;
+   for (UShort_t i = 0; i < fSSSD_StripE_DetectorNbr.size(); i++)
+      cout << "DetNbr: " << fSSSD_StripE_DetectorNbr[i] << " Strip: " << fSSSD_StripE_StripNbr[i] << " Energy: " << fSSSD_StripE_Energy[i] << endl;
+   // Time
+   cout << "SSSD_StripXT_Mult = " << fSSSD_StripT_DetectorNbr.size() << endl;
+   for (UShort_t i = 0; i < fSSSD_StripT_DetectorNbr.size(); i++)
+      cout << "DetNbr: " << fSSSD_StripT_DetectorNbr[i] << " Strip: " << fSSSD_StripT_StripNbr[i] << " Time: " << fSSSD_StripT_Time[i] << endl;
+  
+}
diff --git a/NPLib/SSSD/TSSSDData.h b/NPLib/SSSD/TSSSDData.h
new file mode 100644
index 0000000000000000000000000000000000000000..7e90e7f0515b029ea4799ac39516cd4d5c6980c5
--- /dev/null
+++ b/NPLib/SSSD/TSSSDData.h
@@ -0,0 +1,76 @@
+#ifndef __SSSDDATA__
+#define __SSSDDATA__
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : febuary 2009                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold the Single Side Striped Detector raw data                *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+#include <vector>
+#include "TObject.h"
+
+using namespace std ;
+class TSSSDData : public TObject {
+	private:
+		// SSSD
+		// Energy
+		vector<UShort_t>	fSSSD_StripE_DetectorNbr;
+		vector<UShort_t>	fSSSD_StripE_StripNbr;
+		vector<Double_t>	fSSSD_StripE_Energy;
+		// Time
+		vector<UShort_t>	fSSSD_StripT_DetectorNbr;
+		vector<UShort_t>	fSSSD_StripT_StripNbr;
+		vector<Double_t>	fSSSD_StripT_Time;
+
+
+	public:
+		TSSSDData();
+		virtual ~TSSSDData();
+
+		void	Clear();
+                void    Clear(const Option_t*) {};
+		void	Dump() const;
+
+		/////////////////////           SETTERS           ////////////////////////
+		// DSSD
+		// (X,E)
+		void	SetEnergyDetectorNbr	(UShort_t DetNbr) 	{ fSSSD_StripE_DetectorNbr.push_back(DetNbr)	;}
+		void	SetEnergyStripNbr			(UShort_t StripNbr) { fSSSD_StripE_StripNbr.push_back(StripNbr)		;}
+		void	SetEnergy							(Double_t Energy)   { fSSSD_StripE_Energy.push_back(Energy)				;}
+		// (X,T)
+		void	SetTimeDetectorNbr		(UShort_t DetNbr) 	{ fSSSD_StripT_DetectorNbr.push_back(DetNbr)	;}
+		void	SetTimeStripNbr				(UShort_t StripNbr) { fSSSD_StripT_StripNbr.push_back(StripNbr)		;}
+		void	SetTime								(Double_t Time)     { fSSSD_StripT_Time.push_back(Time)						;}
+
+		/////////////////////           GETTERS           ////////////////////////
+		// DSSD
+		// (X,E)
+		UShort_t	GetEnergyMult					()           	{	return fSSSD_StripE_DetectorNbr.size()	;}
+		UShort_t	GetEnergyDetectorNbr	(Int_t i) 		{	return fSSSD_StripE_DetectorNbr.at(i)		;}
+		UShort_t	GetEnergyStripNbr			(Int_t i)    	{	return fSSSD_StripE_StripNbr.at(i)			;}
+		Double_t	GetEnergy							(Int_t i)     {	return fSSSD_StripE_Energy.at(i)				;}
+		// (X,T)
+		UShort_t	GetTimeMult						()            {	return fSSSD_StripT_DetectorNbr.size()	;}
+		UShort_t	GetTimeDetectorNbr		(Int_t i) 		{	return fSSSD_StripT_DetectorNbr.at(i)		;}
+		UShort_t	GetTimeStripNbr				(Int_t i)   	{	return fSSSD_StripT_StripNbr.at(i)			;}
+		Double_t	GetTime								(Int_t i)     {	return fSSSD_StripT_Time.at(i)					;}
+	
+		ClassDef(TSSSDData,1)  // SSSDData structure
+};
+
+#endif
diff --git a/NPLib/SSSD/TSSSDPhysics.cxx b/NPLib/SSSD/TSSSDPhysics.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..63be1855e636503767ddc451f875d8821984c922
--- /dev/null
+++ b/NPLib/SSSD/TSSSDPhysics.cxx
@@ -0,0 +1,304 @@
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : november 2009                                            *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold SSSD  Physics                                            *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+//	NPL
+#include "TSSSDPhysics.h"
+#include "RootOutput.h"
+#include "RootInput.h"
+
+//	STL
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <limits>
+#include <stdlib.h>
+using namespace std;
+
+//	ROOT
+#include "TChain.h"
+
+//	tranform an integer to a string
+		string itoa(int value)
+			{
+			  std::ostringstream o;
+			
+			  if (!(o << value))
+			    return ""	;
+			    
+			  return o.str();
+			}
+
+ClassImp(TSSSDPhysics)
+///////////////////////////////////////////////////////////////////////////
+TSSSDPhysics::TSSSDPhysics()
+	{		
+		NumberOfDetector = 0 				;
+		EventData = new TSSSDData		;
+		EventPhysics = this					;
+	}
+///////////////////////////////////////////////////////////////////////////
+TSSSDPhysics::~TSSSDPhysics()
+	{}
+///////////////////////////////////////////////////////////////////////////
+void TSSSDPhysics::Clear()
+	{
+		DetectorNumber	.clear()	;
+		StripNumber			.clear()	;
+		Energy					.clear()	;
+		Time						.clear()	;
+	}
+///////////////////////////////////////////////////////////////////////////
+void TSSSDPhysics::ReadConfiguration(string Path) 
+	{
+   ifstream ConfigFile           ;
+   ConfigFile.open(Path.c_str()) ;
+   string LineBuffer          ;
+   string DataBuffer          ;
+
+   double TLX , BLX , BRX , TRX , TLY , BLY , BRY , TRY , TLZ , BLZ , BRZ , TRZ   ;
+   double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0      ;
+   bool check_A = false   ;
+   bool check_B = false ;
+   bool check_C = 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 Start Up ThinSi bloc, Reading toggle to true      
+		  	if (LineBuffer.compare(0, 6, "ThinSi") == 0) 
+		    	{
+		      	cout << "Detector found: " << endl   ;        
+		      	ReadingStatus = true ;
+		    	}
+
+		//	Else don't toggle to Reading Block Status
+		else ReadingStatus = false ;
+
+		//	Reading Block
+		while(ReadingStatus)
+			{
+					// Pickup Next Word 
+				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, 6, "ThinSi") == 0) {
+					cout << "WARNING: Another Telescope is find before standard sequence of Token, Error may occured in Telecope definition" << endl ;
+					ReadingStatus = false ;
+				}
+
+					 //Position method
+		         else if (DataBuffer.compare(0, 3, "A=") == 0) {
+		            check_A = true;
+		            ConfigFile >> DataBuffer ;
+		            TLX = atof(DataBuffer.c_str()) ;
+		            ConfigFile >> DataBuffer ;
+		            TLY = atof(DataBuffer.c_str()) ;
+		            ConfigFile >> DataBuffer ;
+		            TLZ = atof(DataBuffer.c_str()) ;
+
+		         }
+				
+				else if (DataBuffer.compare(0, 3, "B=") == 0) {
+					check_B = true;
+					ConfigFile >> DataBuffer ;
+					BLX = atof(DataBuffer.c_str()) ;
+					ConfigFile >> DataBuffer ;
+					BLY = atof(DataBuffer.c_str()) ;
+					ConfigFile >> DataBuffer ;
+					BLZ = atof(DataBuffer.c_str()) ;
+
+				}
+
+				else if (DataBuffer.compare(0, 3, "C=") == 0) {
+					check_C = true;
+					ConfigFile >> DataBuffer ;
+					BRX = atof(DataBuffer.c_str()) ;
+					ConfigFile >> DataBuffer ;
+					BRY = atof(DataBuffer.c_str()) ;
+					ConfigFile >> DataBuffer ;
+					BRZ = atof(DataBuffer.c_str()) ;
+
+				}
+
+				else if (DataBuffer.compare(0, 3, "D=") == 0) {
+					check_D = true;
+					ConfigFile >> DataBuffer ;
+					TRX = atof(DataBuffer.c_str()) ;
+					ConfigFile >> DataBuffer ;
+					TRY = atof(DataBuffer.c_str()) ;
+					ConfigFile >> DataBuffer ;
+					TRZ = atof(DataBuffer.c_str()) ;
+
+				}
+
+									
+				//Angle method
+				else if (DataBuffer.compare(0, 6, "THETA=") == 0) {
+					check_Theta = true;
+					ConfigFile >> DataBuffer ;
+					Theta = atof(DataBuffer.c_str()) ;
+				}
+
+				else if (DataBuffer.compare(0, 4, "PHI=") == 0) {
+					check_Phi = true;
+					ConfigFile >> DataBuffer ;
+					Phi = atof(DataBuffer.c_str()) ;
+				}
+
+				else if (DataBuffer.compare(0, 2, "R=") == 0) {
+					check_R = true;
+					ConfigFile >> DataBuffer ;
+					R = atof(DataBuffer.c_str()) ;
+				}
+
+
+				else if (DataBuffer.compare(0, 5, "BETA=") == 0) {
+					check_beta = true;
+					ConfigFile >> DataBuffer ;
+					beta_u = atof(DataBuffer.c_str()) ;
+					ConfigFile >> DataBuffer ;
+					beta_v = atof(DataBuffer.c_str()) ;
+					ConfigFile >> DataBuffer ;
+					beta_w = atof(DataBuffer.c_str()) ;
+				}
+		      
+		         	///////////////////////////////////////////////////
+					//	If no Detector Token and no comment, toggle out
+		         else 
+		         	{ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << 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) || !(check_Theta && check_Phi && check_R)) {
+						            	 NumberOfDetector++;
+						         }
+
+					         //with angle method
+					         else if ((check_Theta && check_Phi && check_R) || !(check_A && check_B && check_C && check_D)) {
+						         		  NumberOfDetector++;
+						         }
+						         
+						        //	Reinitialisation of Check Boolean 
+						        
+								check_A = false   ;
+								check_B = false ;
+								check_C = false   ;
+								check_D = false ;
+
+								check_Theta = false   ;
+								check_Phi  = false  ;
+								check_R     = false   ;
+								check_beta = false  ;
+								ReadingStatus = false ;
+							         
+		         	}
+		         	
+						}
+					}
+
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSSSDPhysics::AddParameterToCalibrationManager()
+	{
+		CalibrationManager* Cal = CalibrationManager::getInstance();
+		
+		for(int i = 0 ; i < NumberOfDetector ; i++)
+			{
+			
+				for( int j = 0 ; j < 16 ; j++)
+					{
+						Cal->AddParameter("SSSD", "Detector"+itoa(i+1)+"_Strip"+itoa(j+1)+"_E","SSSD_Detector"+itoa(i+1)+"_Strip"+itoa(j+1)+"_E")	;
+						Cal->AddParameter("SSSD", "Detector"+itoa(i+1)+"_Strip"+itoa(j+1)+"_T","SSSD_Detector"+itoa(i+1)+"_Strip"+itoa(j+1)+"_T")	;	
+					}
+		
+			}
+	}
+	
+///////////////////////////////////////////////////////////////////////////
+void TSSSDPhysics::InitializeRootInput()
+	{
+		TChain* inputChain = RootInput::getInstance()->GetChain()	;
+		inputChain->SetBranchStatus ( "ThinSi" 		, true )					;
+		inputChain->SetBranchStatus ( "fSSSD_*" 	, true )					;
+		inputChain->SetBranchAddress( "ThinSi" 		, &EventData )		;
+	}	
+
+///////////////////////////////////////////////////////////////////////////
+void TSSSDPhysics::InitializeRootOutput()
+	{
+		TTree* outputTree = RootOutput::getInstance()->GetTree()			;
+		outputTree->Branch( "SSSD" , "TSSSDPhysics" , &EventPhysics )	;
+	}
+
+///////////////////////////////////////////////////////////////////////////
+void TSSSDPhysics::BuildPhysicalEvent()
+	{
+		BuildSimplePhysicalEvent()	;
+	}
+
+///////////////////////////////////////////////////////////////////////////
+void TSSSDPhysics::BuildSimplePhysicalEvent()
+	{
+		if( EventData->GetEnergyMult() == EventData->GetTimeMult() )
+			{
+				for(unsigned int i = 0 ; i < EventData->GetEnergyMult() ; i++)
+					{
+					
+						DetectorNumber	.push_back( EventData->GetEnergyDetectorNbr(i) )	;
+						StripNumber			.push_back( EventData->GetEnergyStripNbr(i)    )	;
+						
+						Energy					.push_back(
+							CalibrationManager::getInstance()->ApplyCalibration(	"SSSD/Detector" + itoa( EventData->GetEnergyDetectorNbr(i) ) + "_Strip" + itoa( EventData->GetEnergyStripNbr(i) ) +"_E",	
+																																		EventData->GetEnergy(i) )
+																			)	;
+																			
+						Time						.push_back(
+							CalibrationManager::getInstance()->ApplyCalibration(	"SSSD/Detector" + itoa( EventData->GetEnergyDetectorNbr(i) ) + "_Strip" + itoa( EventData->GetEnergyStripNbr(i) ) +"_T",	
+																																		EventData->GetTime(i) )
+																			)	;
+					}
+			}
+		
+		else return ;
+		
+	}
+
diff --git a/NPLib/SSSD/TSSSDPhysics.h b/NPLib/SSSD/TSSSDPhysics.h
new file mode 100644
index 0000000000000000000000000000000000000000..21bc790fb7067a44b6beef2e3f1da94890a10b97
--- /dev/null
+++ b/NPLib/SSSD/TSSSDPhysics.h
@@ -0,0 +1,92 @@
+#ifndef __SSSDPhysics__
+#define __SSSDPhysics__
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : November 2009                                            *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold the Single Side Striped Detector  Physics                *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************/
+//	STL
+#include <vector>
+using namespace std ;
+
+//	ROOT
+#include "TObject.h"
+
+//	NPL
+#include "TSSSDData.h"
+#include "../include/VDetector.h"
+#include "../include/CalibrationManager.h"
+
+class TSSSDPhysics : public TObject, public NPA::VDetector
+{
+	public:	//	Constructor and Destructor
+		TSSSDPhysics();
+		~TSSSDPhysics();
+
+
+	public:	//	Calibrated Data
+
+		vector<UShort_t>	DetectorNumber	;
+		vector<UShort_t>	StripNumber			;
+		vector<Double_t>	Energy					;
+		vector<Double_t>	Time						;
+
+	public:	//	inherrited from VDetector
+		//	Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token
+		void ReadConfiguration(string) 				;
+		
+
+		//	Add Parameter to the CalibrationManger
+		void AddParameterToCalibrationManager()	;		
+			
+		
+		//	Activated associated Branches and link it to the private member DetectorData address
+		//	In this method mother Branches (Detector) AND daughter leaf (fDetector_parameter) have to be activated
+		void InitializeRootInput() 					;
+
+
+		//	Create associated branches and associated private member DetectorPhysics address
+		void InitializeRootOutput() 		 		;
+		
+		
+		//	This method is called at each event read from the Input Tree. Aime is to build treat Raw dat in order to extract physical parameter. 
+		void BuildPhysicalEvent()					;
+		
+		
+		//	Same as above, but only the simplest event and/or simple method are used (low multiplicity, faster algorythm but less efficient ...).
+		//	This method aimed to be used for analysis performed during experiment, when speed is requiered.
+		//	NB: This method can eventually be the same as BuildPhysicalEvent.
+		void BuildSimplePhysicalEvent()				;
+
+		//	Those two method all to clear the Event Physics or Data
+		void ClearEventPhysics()		{Clear();}		
+		void ClearEventData()				{EventData->Clear();}		
+
+	private:	// Data not writted in the tree
+				int								NumberOfDetector	;//!
+				TSSSDData* 	  	EventData					;//!
+				TSSSDPhysics* 	  EventPhysics			;//!
+
+		void	Clear();
+    void  Clear(const Option_t*) {};
+	
+		ClassDef(TSSSDPhysics,1)  // SSSDPhysics structure
+};
+
+#endif
diff --git a/NPLib/Tools/NPReaction.cxx b/NPLib/Tools/NPReaction.cxx
index b2cc194c06a2e9cc08fc15b9ff54110c91cad8b3..1eaec349f49062837ab76ddcebbb9574127b1d14 100644
--- a/NPLib/Tools/NPReaction.cxx
+++ b/NPLib/Tools/NPReaction.cxx
@@ -231,7 +231,7 @@ double Reaction::ReconstructRelativistic(double EnergyLab, double ThetaLab) cons
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 
 //Return ThetaCM									
-double  Reaction::EnergyLabToThetaCM( double EnergyLab , double ExcitationEnergy = -500) const
+double  Reaction::EnergyLabToThetaCM( double EnergyLab , double ExcitationEnergy ) const
 	{
 		if(ExcitationEnergy == -500) ExcitationEnergy = fExcitation; 
 	
diff --git a/NPLib/Tools/NPReaction.h b/NPLib/Tools/NPReaction.h
index 3ab556da14523e1786fd56ccfe701af5d0af30a5..d8d638aea81d5107513ad4d008a428af8e34bf3b 100644
--- a/NPLib/Tools/NPReaction.h
+++ b/NPLib/Tools/NPReaction.h
@@ -94,7 +94,7 @@ namespace NPL
 													double ThetaLab) const;
 			//	Return ThetaCM									
 			double 		EnergyLabToThetaCM( 	double EnergyLab 		,	//	Energy Measured in lab ref
-											   	double ExcitationEnergy ) 	//	Excitation Energy previously calculated. If no argument given, fExcitation is used
+											   	double ExcitationEnergy = -500) 	//	Excitation Energy previously calculated. If no argument given, fExcitation is used
 												const;
 			
 			//	Other	//
diff --git a/NPLib/VDetector/Makefile b/NPLib/VDetector/Makefile
index 9d3b706c81399fafc17c777d6036acb310fbb3d5..22ae9d129fec0e265679f9ebce86304c5ea14ee5 100644
--- a/NPLib/VDetector/Makefile
+++ b/NPLib/VDetector/Makefile
@@ -276,8 +276,8 @@ all:            $(SHARELIB)
 
 ## MUST2 ##
 libVDetector.so:	VDetector.o
-		$(LD) $(SOFLAGS) $^ $(OutPutOpt) $@
-		
+		$(LD) $(SOFLAGS) $^ $(OutPutOpt) $@	
+			
 # dependances
 VDetector.o:		VDetector.cxx	VDetector.h
 #######################################
diff --git a/NPLib/VDetector/VDetector.h b/NPLib/VDetector/VDetector.h
index 20fd8d3f933a49aa75ecfd55a9bcb9a25152ca08..c83f3b7d454a00a1088c00594e94a7fcb44a5ced 100644
--- a/NPLib/VDetector/VDetector.h
+++ b/NPLib/VDetector/VDetector.h
@@ -24,9 +24,8 @@
  *   See MUST2 array for exemple of VDetector derived class                  *
  *                                                                           *
  *****************************************************************************/
-// STL header
+//	STL header
 #include <string>
-
 using namespace std;
 
 namespace NPA 
@@ -39,11 +38,14 @@ namespace NPA
 				//	Default Constructor and destructor
 				VDetector()   ;
 				virtual ~VDetector()   ;
-
-
+			
 				//	Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token
 				virtual void ReadConfiguration(string) 		{}		;
+		
+				//	Add Parameter to the CalibrationManger
+				virtual void AddParameterToCalibrationManager()	{} ;		
 
+				//	XXX To be DUMPED XXX
 				//	Read stream at CalibFile and pick-up calibration parameter using Token
 				//	If argument is "Simulation" no change calibration is loaded
 				virtual void ReadCalibrationFile(string)	{} ;		
@@ -94,6 +96,7 @@ namespace NPA
 				nothing	noCalibration	;
 				
 			*/
+			
 		};
 
 	}
diff --git a/NPSimulation/GNUmakefile b/NPSimulation/GNUmakefile
index ef3b50375f8063460248194e4042809ab9385514..3d960a57eaa84261926d4b2d940602785eed134b 100644
--- a/NPSimulation/GNUmakefile
+++ b/NPSimulation/GNUmakefile
@@ -19,7 +19,7 @@ G4WORKDIR = ./
 CPPFLAGS += $(shell root-config --cflags) 
 CPPFLAGS += -I$(NPLIB)/include
 EXTRALIBS = $(shell root-config --glibs) 
-EXTRALIBS += -L$(NPLIB)/lib -lMust2Data -lAnnularS1Data -lGaspardData -lPlasticData\
+EXTRALIBS += -L$(NPLIB)/lib -lMust2Data -lAnnularS1Data -lGaspardData -lPlasticData -lDUMMYDetectorData -lSSSDData\
 		-lInitialConditions -lInteractionCoordinates \
 		-lReaction -lIORoot
 .PHONY: all
diff --git a/NPSimulation/include/DummyDetector.hh b/NPSimulation/include/DummyDetector.hh
new file mode 100755
index 0000000000000000000000000000000000000000..700cec3a1a6302d36d641aa99178eb9d128f8f49
--- /dev/null
+++ b/NPSimulation/include/DummyDetector.hh
@@ -0,0 +1,128 @@
+#ifndef DUMMYDetector_h
+#define DUMMYDetector_h 1
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : October 2009                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class describe a simple Dummy Detector :                            *
+ *	a simple cylinder of predifined material. user can choose to place it    *
+ *  where he want using spherical coordinate and choose between two naterial *
+ *	                                                                         *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *  This detector respect all the NPTool convention in naming volume,        * 
+ *  reading scorers and file. Use it as a basis for your own detector        *
+ *****************************************************************************/
+// C++ header
+#include <string>
+#include <vector>
+
+// G4 header defining G4 types
+#include "globals.hh"
+
+// G4 headers
+#include "G4ThreeVector.hh"
+#include "G4RotationMatrix.hh"
+#include "G4LogicalVolume.hh"
+#include "G4SDManager.hh"
+#include "G4MultiFunctionalDetector.hh"
+
+// NPTool header
+#include "VDetector.hh"
+#include "TDUMMYDetectorData.h"
+
+using namespace std;
+
+class DUMMYDetector : public VDetector
+{
+   ////////////////////////////////////////////////////
+   /////// Default Constructor and Destructor /////////
+   ////////////////////////////////////////////////////
+public:
+   DUMMYDetector() ;
+   virtual ~DUMMYDetector() ;
+
+   ////////////////////////////////////////////////////
+   //////// Specific Function of this Class ///////////
+   ////////////////////////////////////////////////////
+public:
+   // By Angle Method
+   void AddDUMMYDetector(	 G4double    R        							,
+        									 G4double    Theta    							,
+         									 G4double    Phi         						,
+						         			 G4double	 DUMMYDetectorThickness		,
+						         			 G4double	 DUMMYDetectorRadius			,
+						         			 G4String 	Scintillator						 );  
+		
+	void VolumeMaker(G4ThreeVector Det_pos, int DetNumber,G4LogicalVolume* world) ;
+   ////////////////////////////////////////////////////
+   /////////  Inherite from VDetector 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()            ;
+
+   // Read sensitive part and fill the Root tree.
+   // Called at in the EventAction::EndOfEventAvtion
+   void ReadSensitive(const G4Event* event)     ;
+
+public: // Material 
+	void InitializeMaterial() 		;
+	// The dummy materials
+	G4Material* m_MaterialDUMMYDetector_material1		; //the dummy material 2
+	G4Material* m_MaterialDUMMYDetector_material2		; //the dummy material 2
+
+	
+public:	//	Scorer
+	//	Initialize all Scorer used by the MUST2Array
+	void InitializeScorers() ;
+
+	//	Silicon Associate Scorer
+	G4MultiFunctionalDetector* m_DUMMYDetectorScorer				 ;
+
+
+   ////////////////////////////////////////////////////
+   ///////////Event class to store Data////////////////
+   ////////////////////////////////////////////////////
+private:
+   TDUMMYDetectorData* m_Event ;
+
+   ////////////////////////////////////////////////////
+   ///////////////Private intern Data//////////////////
+   ////////////////////////////////////////////////////
+private:
+   
+   vector<double>		m_DUMMYDetectorThickness	;
+   vector<double>		m_DUMMYDetectorRadius		;
+      
+   // Used for "By Angle Definition"
+   vector<G4double>  m_R         ; //  |
+   vector<G4double>  m_Theta     ; //  > Spherical coordinate DUMMYDetector volume center
+   vector<G4double>  m_Phi    	 ; //  |
+
+	//	Scintillator type
+	vector<G4String> m_Scintillator ;
+
+
+};
+#endif
diff --git a/NPSimulation/include/GeneralScorers.hh b/NPSimulation/include/GeneralScorers.hh
index 1591fbab1b1e76036b5dc39acbb7d2b20c1ddc40..70dcc65e51c9bfd69172aa7eb0e40f22a49492f0 100644
--- a/NPSimulation/include/GeneralScorers.hh
+++ b/NPSimulation/include/GeneralScorers.hh
@@ -27,183 +27,217 @@
 #include "G4VPrimitiveScorer.hh"
 #include "G4THitsMap.hh"
 
-class PSEnergy : public G4VPrimitiveScorer
+namespace GENERALSCORERS
 	{
+			//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+			//	This Threshold is used in the above scorer. Any energy deposit under this threshold will not create an entry.
+			const double TriggerThreshold = 100*keV ;
+
+			//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+			//	The following function is used in many scorer. following the Detector Volume Nomenclature
+			//	DetectorNameX_SubPart_SubPart
+			//  where X stand for the detector number.
+
+			int PickUpDetectorNumber(G4Step* aStep, std::string DetName);
+
+
+
+			//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+			class PSDetectorNumber : public G4VPrimitiveScorer
+				{
+
+				public: // with description
+				   PSDetectorNumber(G4String name, G4String VolumeName = "xxx", G4int depth = 0 );
+				   virtual ~PSDetectorNumber();
+
+				protected: // with description
+				   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+				public:
+				   virtual void Initialize(G4HCofThisEvent*);
+				   virtual void EndOfEvent(G4HCofThisEvent*);
+				   virtual void clear();
+				   virtual void DrawAll();
+				   virtual void PrintAll();
+
+				private:
+					 G4String m_VolumeName; 
+				   G4int HCID;
+				   G4THitsMap<G4int>* EvtMap;
+				   
+				};
+
+			//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......			
+			class PSEnergy : public G4VPrimitiveScorer
+					{
+
+						public: // with description
+						   PSEnergy(G4String name, G4String VolumeName, G4int depth);
+						   virtual ~PSEnergy();
+
+						protected: // with description
+						   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+						public:
+						   virtual void Initialize(G4HCofThisEvent*);
+						   virtual void EndOfEvent(G4HCofThisEvent*);
+						   virtual void clear();
+						   virtual void DrawAll();
+						   virtual void PrintAll();
+
+						private:
+								G4String m_VolumeName;
+						   G4int HCID;
+						   G4THitsMap<G4double>* EvtMap;
+					};
+
+			//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+			class PSTOF : public G4VPrimitiveScorer
+					{
+
+						public: // with description
+						   PSTOF(G4String name, G4String VolumeName, G4int depth);
+						   virtual ~PSTOF();
+
+						protected: // with description
+						   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+						public:
+						   virtual void Initialize(G4HCofThisEvent*);
+						   virtual void EndOfEvent(G4HCofThisEvent*);
+						   virtual void clear();
+						   virtual void DrawAll();
+						   virtual void PrintAll();
+
+						private:
+								G4String m_VolumeName;
+						   	G4int HCID;
+						   	G4THitsMap<G4double>* EvtMap;
+					};
+
+			//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+			class PSInteractionCoordinatesX : public G4VPrimitiveScorer
+				{
+				public: // with description
+				   PSInteractionCoordinatesX(G4String name, G4String VolumeName, G4int depth);
+				   virtual ~PSInteractionCoordinatesX();
+
+				protected: // with description
+				   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+				public:
+				   virtual void Initialize(G4HCofThisEvent*);
+				   virtual void EndOfEvent(G4HCofThisEvent*);
+				   virtual void clear();
+				   virtual void DrawAll();
+				   virtual void PrintAll();
+
+				private:
+						G4String m_VolumeName;
+				   G4int HCID;
+				   G4THitsMap<G4double>* EvtMap;
+				};
+
+
+			//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+			class PSInteractionCoordinatesY : public G4VPrimitiveScorer
+				{
+				public: // with description
+				   PSInteractionCoordinatesY(G4String name, G4String VolumeName, G4int depth);
+				   virtual ~PSInteractionCoordinatesY();
+
+				protected: // with description
+				   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+				public:
+				   virtual void Initialize(G4HCofThisEvent*);
+				   virtual void EndOfEvent(G4HCofThisEvent*);
+				   virtual void clear();
+				   virtual void DrawAll();
+				   virtual void PrintAll();
+
+				private:
+						G4String m_VolumeName;
+				   G4int HCID;
+				   G4THitsMap<G4double>* EvtMap;
+				};
+
+
+			//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+			class PSInteractionCoordinatesZ : public G4VPrimitiveScorer
+				{
+				public: // with description
+				   PSInteractionCoordinatesZ(G4String name, G4String VolumeName, G4int depth);
+				   virtual ~PSInteractionCoordinatesZ();
+
+				protected: // with description
+				   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+				public:
+				   virtual void Initialize(G4HCofThisEvent*);
+				   virtual void EndOfEvent(G4HCofThisEvent*);
+				   virtual void clear();
+				   virtual void DrawAll();
+				   virtual void PrintAll();
+
+				private:
+						G4String m_VolumeName;
+				   G4int HCID;
+				   G4THitsMap<G4double>* EvtMap;
+				};
+
+
+			//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+			class PSInteractionCoordinatesAngleTheta : public G4VPrimitiveScorer
+				{
+					public: // with description
+					   PSInteractionCoordinatesAngleTheta(G4String name, G4String VolumeName, G4int depth);
+					   virtual ~PSInteractionCoordinatesAngleTheta();
+
+					protected: // with description
+					   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+					public:
+					   virtual void Initialize(G4HCofThisEvent*);
+					   virtual void EndOfEvent(G4HCofThisEvent*);
+					   virtual void clear();
+					   virtual void DrawAll();
+					   virtual void PrintAll();
+
+					private:
+								G4String m_VolumeName;
+					   G4int HCID;
+					   G4THitsMap<G4double>* EvtMap;
+				};
+
+
+			//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+			class PSInteractionCoordinatesAnglePhi : public G4VPrimitiveScorer
+				{
+					public: // with description
+					   PSInteractionCoordinatesAnglePhi(G4String name, G4String VolumeName, G4int depth);
+					   virtual ~PSInteractionCoordinatesAnglePhi();
+
+					protected: // with description
+					   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+
+					public:
+					   virtual void Initialize(G4HCofThisEvent*);
+					   virtual void EndOfEvent(G4HCofThisEvent*);
+					   virtual void clear();
+					   virtual void DrawAll();
+					   virtual void PrintAll();
+
+					private:
+						 G4String m_VolumeName;
+					   G4int HCID;
+					   G4THitsMap<G4double>* EvtMap;
+				};
+
+			
+
+	}
 
-	public: // with description
-	   PSEnergy(G4String name, G4int depth = 0);
-	   virtual ~PSEnergy();
 
-	protected: // with description
-	   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
 
-	public:
-	   virtual void Initialize(G4HCofThisEvent*);
-	   virtual void EndOfEvent(G4HCofThisEvent*);
-	   virtual void clear();
-	   virtual void DrawAll();
-	   virtual void PrintAll();
-
-	private:
-	   G4int HCID;
-	   G4THitsMap<G4double>* EvtMap;
-	};
-
-class PSTOF : public G4VPrimitiveScorer
-{
-
-	public: // with description
-	   PSTOF(G4String name, G4int depth = 0);
-	   virtual ~PSTOF();
-
-	protected: // with description
-	   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-
-	public:
-	   virtual void Initialize(G4HCofThisEvent*);
-	   virtual void EndOfEvent(G4HCofThisEvent*);
-	   virtual void clear();
-	   virtual void DrawAll();
-	   virtual void PrintAll();
-
-	private:
-	   G4int HCID;
-	   G4THitsMap<G4double>* EvtMap;
-};
-
-
-class PSInteractionCoordinatesX : public G4VPrimitiveScorer
-	{
-	public: // with description
-	   PSInteractionCoordinatesX(G4String name, G4int depth = 0);
-	   virtual ~PSInteractionCoordinatesX();
-
-	protected: // with description
-	   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-
-	public:
-	   virtual void Initialize(G4HCofThisEvent*);
-	   virtual void EndOfEvent(G4HCofThisEvent*);
-	   virtual void clear();
-	   virtual void DrawAll();
-	   virtual void PrintAll();
-
-	private:
-	   G4int HCID;
-	   G4THitsMap<G4double>* EvtMap;
-	};
-
-class PSInteractionCoordinatesY : public G4VPrimitiveScorer
-	{
-	public: // with description
-	   PSInteractionCoordinatesY(G4String name, G4int depth = 0);
-	   virtual ~PSInteractionCoordinatesY();
-
-	protected: // with description
-	   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-
-	public:
-	   virtual void Initialize(G4HCofThisEvent*);
-	   virtual void EndOfEvent(G4HCofThisEvent*);
-	   virtual void clear();
-	   virtual void DrawAll();
-	   virtual void PrintAll();
-
-	private:
-	   G4int HCID;
-	   G4THitsMap<G4double>* EvtMap;
-	};
-
-
-
-class PSInteractionCoordinatesZ : public G4VPrimitiveScorer
-	{
-	public: // with description
-	   PSInteractionCoordinatesZ(G4String name, G4int depth = 0);
-	   virtual ~PSInteractionCoordinatesZ();
-
-	protected: // with description
-	   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-
-	public:
-	   virtual void Initialize(G4HCofThisEvent*);
-	   virtual void EndOfEvent(G4HCofThisEvent*);
-	   virtual void clear();
-	   virtual void DrawAll();
-	   virtual void PrintAll();
-
-	private:
-	   G4int HCID;
-	   G4THitsMap<G4double>* EvtMap;
-	};
-
-
-
-class PSInteractionCoordinatesAngleTheta : public G4VPrimitiveScorer
-{
-public: // with description
-   PSInteractionCoordinatesAngleTheta(G4String name, G4int depth = 0);
-   virtual ~PSInteractionCoordinatesAngleTheta();
-
-protected: // with description
-   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-
-public:
-   virtual void Initialize(G4HCofThisEvent*);
-   virtual void EndOfEvent(G4HCofThisEvent*);
-   virtual void clear();
-   virtual void DrawAll();
-   virtual void PrintAll();
-
-private:
-   G4int HCID;
-   G4THitsMap<G4double>* EvtMap;
-};
-
-
-
-class PSInteractionCoordinatesAnglePhi : public G4VPrimitiveScorer
-{
-public: // with description
-   PSInteractionCoordinatesAnglePhi(G4String name, G4int depth = 0);
-   virtual ~PSInteractionCoordinatesAnglePhi();
-
-protected: // with description
-   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-
-public:
-   virtual void Initialize(G4HCofThisEvent*);
-   virtual void EndOfEvent(G4HCofThisEvent*);
-   virtual void clear();
-   virtual void DrawAll();
-   virtual void PrintAll();
-
-private:
-   G4int HCID;
-   G4THitsMap<G4double>* EvtMap;
-};
-
-
-class PSDetectorNumber : public G4VPrimitiveScorer
-	{
-
-	public: // with description
-	   PSDetectorNumber(G4String name, G4int depth = 0 , G4String VolumeName = "xxx");
-	   virtual ~PSDetectorNumber();
-
-	protected: // with description
-	   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-
-	public:
-	   virtual void Initialize(G4HCofThisEvent*);
-	   virtual void EndOfEvent(G4HCofThisEvent*);
-	   virtual void clear();
-	   virtual void DrawAll();
-	   virtual void PrintAll();
-
-	private:
-	   G4int HCID;
-	   G4THitsMap<G4int>* EvtMap;
-	   G4String m_VolumeName ;
-	};
 #endif
diff --git a/NPSimulation/include/Must2Scorers.hh b/NPSimulation/include/Must2Scorers.hh
index 2240f81dc57def10ae7bb61a090da905dc0f25df..f5867f6ad489637d7873d74f84b84cfcd55c66df 100644
--- a/NPSimulation/include/Must2Scorers.hh
+++ b/NPSimulation/include/Must2Scorers.hh
@@ -27,28 +27,6 @@
 #include "G4VPrimitiveScorer.hh"
 #include "G4THitsMap.hh"
 namespace MUST2 {
-	class PSStripE : public G4VPrimitiveScorer
-	{
-
-	public: // with description
-	   PSStripE(G4String name, G4int depth = 0);
-	   virtual ~PSStripE();
-
-	protected: // with description
-	   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-
-	public:
-	   virtual void Initialize(G4HCofThisEvent*);
-	   virtual void EndOfEvent(G4HCofThisEvent*);
-	   virtual void clear();
-	   virtual void DrawAll();
-	   virtual void PrintAll();
-
-	private:
-	   G4int HCID;
-	   G4THitsMap<G4double>* EvtMap;
-	};
-	
 	
 	class PSStripNumberX : public G4VPrimitiveScorer
 	{
@@ -70,8 +48,9 @@ namespace MUST2 {
 	private:
 	   G4double  m_StripPlaneSize;
 	   G4int     m_NumberOfStrip ;
+	   G4double  m_StripPitch		 ;
 	   G4int HCID;
-	   G4THitsMap<G4double>* EvtMap;
+	   G4THitsMap<G4int>* EvtMap;
 	};
 
 
@@ -96,16 +75,18 @@ namespace MUST2 {
 	private:
 	   G4double  m_StripPlaneSize;
 	   G4int     m_NumberOfStrip ;
+	   G4double  m_StripPitch		 ;
 	   G4int HCID;
-	   G4THitsMap<G4double>* EvtMap;
+	   G4THitsMap<G4int>* EvtMap;
 	};
 	
-	class PSDetectorNumber : public G4VPrimitiveScorer
+	
+		class PSPadOrCristalNumber : public G4VPrimitiveScorer
 	{
 
 	public: // with description
-	   PSDetectorNumber(G4String name, G4int depth = 0 , G4String VolumeName = "xxx");
-	   virtual ~PSDetectorNumber();
+	   PSPadOrCristalNumber(G4String name, G4int depth = 0);
+	   virtual ~PSPadOrCristalNumber();
 
 	protected: // with description
 	   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
@@ -120,7 +101,6 @@ namespace MUST2 {
 	private:
 	   G4int HCID;
 	   G4THitsMap<G4int>* EvtMap;
-	   G4String m_VolumeName ;
 	};
 	
 }
diff --git a/NPSimulation/include/Plastic.hh b/NPSimulation/include/Plastic.hh
index 6646719c163a4847539afd28f1f023af317bf014..46f3b24fa967e0deed01cfe842a230783326a32f 100644
--- a/NPSimulation/include/Plastic.hh
+++ b/NPSimulation/include/Plastic.hh
@@ -10,16 +10,19 @@
 /*****************************************************************************
  * Original Author: Adrien MATTA  contact address: matta@ipno.in2p3.fr       *
  *                                                                           *
- * Creation Date  : september 2009                                           *
+ * Creation Date  : September 2009                                           *
  * Last update    :                                                          *
  *---------------------------------------------------------------------------*
  * Decription:                                                               *
- *  This class describe a modular plastic array                              *
+ *  This class describe a Modular cylindrical Plastic Scintillator           *
+ *	Few Material are instantiate and user can choose position and dimension	 * 
+ *  but also the adding of a lead plate on the rear side of the detector     *
  *                                                                           *
  *---------------------------------------------------------------------------*
  * Comment:                                                                  *
  *                                                                           *
  *****************************************************************************/
+
 // C++ header
 #include <string>
 #include <vector>
@@ -84,9 +87,9 @@ public:
 public: // Material 
 	void InitializeMaterial() 		;
 	// Platic
-	G4Material* m_MaterialPlastic_BC400		; //BC-400 type plastic
-	G4Material* m_MaterialPlastic_BC452_2	; //BC452:BC-400 loaded with 2%Pb type plastic
-	G4Material* m_MaterialPlastic_BC452_5	; //BC452:BC-400 loaded with 5%Pb type plastic
+	G4Material* m_MaterialPlastic_BC400			; //BC-400 type plastic
+	G4Material* m_MaterialPlastic_BC452_2		; //BC452:BC-400 loaded with 2%Pb type plastic
+	G4Material* m_MaterialPlastic_BC452_5		; //BC452:BC-400 loaded with 5%Pb type plastic
 	G4Material* m_MaterialPlastic_BC452_10	; //BC452:BC-400 loaded with 10%Pb type plastic
 	// Lead
 	G4Material* m_MaterialLead		;
@@ -109,7 +112,7 @@ private:
 private:
    
    // if true a Lead plate is added in front or back of the detector
-   vector<double>	  	m_LeadThickness	;
+   vector<double>	  m_LeadThickness	;
    
    vector<double>		m_PlasticThickness	;
    vector<double>		m_PlasticRadius		;
diff --git a/NPSimulation/include/ThinSi.hh b/NPSimulation/include/ThinSi.hh
index 86d5f7fbbfcbc0796ca208ba75619ee9719d5787..48febf6c21ae00357bf7ab0ddbe10d0ca78a48f3 100644
--- a/NPSimulation/include/ThinSi.hh
+++ b/NPSimulation/include/ThinSi.hh
@@ -32,9 +32,11 @@
 #include "G4RotationMatrix.hh"
 #include "G4LogicalVolume.hh"
 
-// NPTool header
+// NPSimulation header
 #include "VDetector.hh"
 
+// NPLib 
+#include "TSSSDData.h"
 using namespace std;
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -42,7 +44,7 @@ namespace THINSI
 {
    // Energy and time Resolution
    const G4double ResoTime    = 0      ;
-   const G4double ResoEnergy  = 0.042  ;// = 100keV of Resolution   //   Unit is MeV/2.35
+   const G4double ResoEnergy  = 0.064  ;// = 150keV of Resolution   //   Unit is MeV/2.35
 
    // Geometry
    const G4double DetectorSize   	= 68*mm           ;
@@ -50,7 +52,7 @@ namespace THINSI
    const G4double FrameThickness    = 3*mm            ;
    const G4double SiliconSize    	= 50*mm           ;
    const G4double AluThickness      = 0.4*micrometer  ;
-   const G4int  NumberOfStrip    	= 32       		  ;
+   const G4int  NumberOfStrip    	= 16       		  ;
 
    const G4double AluStripFront_PosZ 	= -0.5*SiliconThickness - 0.5*AluThickness ;
    const G4double Si_PosZ        		= 0                                 ;
@@ -119,7 +121,29 @@ public:
    ///////////Event class to store Data////////////////
    ////////////////////////////////////////////////////
 private:
-   G4double    m_Energy ;
+   TSSSDData*    m_Event ;
+
+	 ////////////////////////////////////////////////////
+   ///////////////// Scorer Related ///////////////////
+   ////////////////////////////////////////////////////
+
+private:
+		//	Initialize all Scorer used by the MUST2Array
+		void InitializeScorers() ;
+	 
+		//	Scorer Associate to the 20um Silicon stage
+		G4MultiFunctionalDetector*	m_StripScorer ; 
+
+
+
+private:
+		// 	Initialize mmaterial used in detector definition
+		void InitializeMaterial();
+
+		//	List of material
+		G4Material* m_MaterialSilicon 	;
+   	G4Material* m_MaterialAl 				;
+   	G4Material* m_MaterialVacuum 		;
 
    ////////////////////////////////////////////////////
    ///////////////Private intern Data//////////////////
diff --git a/NPSimulation/include/PlasticScorers.hh b/NPSimulation/include/ThinSiScorers.hh
similarity index 55%
rename from NPSimulation/include/PlasticScorers.hh
rename to NPSimulation/include/ThinSiScorers.hh
index 7490280c3720dd6720ce4d6fd3b9ebce74adf293..9449cffa80c1396dc988e3899c951de766a70bba 100644
--- a/NPSimulation/include/PlasticScorers.hh
+++ b/NPSimulation/include/ThinSiScorers.hh
@@ -1,5 +1,5 @@
-#ifndef GeneralScorers_h
-#define GeneralScorers_h 1
+#ifndef ThinSiScorers_h
+#define ThinSiScorers_h 1
 /*****************************************************************************
  * Copyright (C) 2009   this file is part of the NPTool Project              *
  *                                                                           *
@@ -10,68 +10,31 @@
 /*****************************************************************************
  * Original Author: Adrien MATTA  contact address: matta@ipno.in2p3.fr       *
  *                                                                           *
- * Creation Date  : September 2009                                           *
+ * Creation Date  : October 2009                                             *
  * Last update    :                                                          *
  *---------------------------------------------------------------------------*
  * Decription:                                                               *
- *  This class old some of the Platic Scorer, shared by different detector.  *
+ *  File old the scorer specific to the ThinSi Detector                       *
+ *                                                                           *
  *---------------------------------------------------------------------------*
  * Comment:                                                                  *
+ * Those Scorer use TrackID as map index. This way ones can rebuild energy   *
+ *  deposit, time of flight or position,... particle by particle for each    *
+ *  event.Because standard scorer provide by G4 don't work this way but using* 
+ *  a global ID for each event you should not use those scorer with some G4  *
+ *  provided ones or being very carefull doing so.                           *
  *****************************************************************************/
 #include "G4VPrimitiveScorer.hh"
 #include "G4THitsMap.hh"
-namespace PLASTIC {
-class PSEnergy : public G4VPrimitiveScorer
-	{
-
-	public: // with description
-	   PSEnergy(G4String name, G4int depth = 0);
-	   virtual ~PSEnergy();
-
-	protected: // with description
-	   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-
-	public:
-	   virtual void Initialize(G4HCofThisEvent*);
-	   virtual void EndOfEvent(G4HCofThisEvent*);
-	   virtual void clear();
-	   virtual void DrawAll();
-	   virtual void PrintAll();
-
-	private:
-	   G4int HCID;
-	   G4THitsMap<G4double>* EvtMap;
-	};
 
-class PSTOF : public G4VPrimitiveScorer
-{
-
-	public: // with description
-	   PSTOF(G4String name, G4int depth = 0);
-	   virtual ~PSTOF();
-
-	protected: // with description
-	   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
-
-	public:
-	   virtual void Initialize(G4HCofThisEvent*);
-	   virtual void EndOfEvent(G4HCofThisEvent*);
-	   virtual void clear();
-	   virtual void DrawAll();
-	   virtual void PrintAll();
-
-	private:
-	   G4int HCID;
-	   G4THitsMap<G4double>* EvtMap;
-};
-
-
-class PSDetectorNumber : public G4VPrimitiveScorer
+namespace THINSI {
+	
+	class PSStripNumber : public G4VPrimitiveScorer
 	{
 
 	public: // with description
-	   PSDetectorNumber(G4String name, G4int depth = 0 );
-	   virtual ~PSDetectorNumber();
+	   PSStripNumber(G4String name, G4int depth = 0, G4double StripPlaneSize = 50*mm, G4int NumberOfStrip = 16);
+	   virtual ~PSStripNumber();
 
 	protected: // with description
 	   virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
@@ -84,11 +47,13 @@ class PSDetectorNumber : public G4VPrimitiveScorer
 	   virtual void PrintAll();
 
 	private:
+	   G4double  m_StripPlaneSize;
+	   G4int     m_NumberOfStrip ;
+	   G4double  m_StripPitch    ;
 	   G4int HCID;
 	   G4THitsMap<G4int>* EvtMap;
 	};
 
-
 }
 
 #endif
diff --git a/NPSimulation/include/VDetector.hh b/NPSimulation/include/VDetector.hh
index 9d07073d9f4818f7b1229feffbd884b8778926c1..dd98b31e4954b4c0f6a82c41319822d163db637d 100644
--- a/NPSimulation/include/VDetector.hh
+++ b/NPSimulation/include/VDetector.hh
@@ -22,6 +22,18 @@
  *                                                                           *
  *---------------------------------------------------------------------------*
  * Comment:                                                                  *
+ *	Detector inheriting from VDetector should follow this Naming convention  *
+ *    for logical volume:                                                    *
+ *		DetectorNameX_SubPart                                                  *
+ *		                                                                       *
+ *		-DetectorName is the name of the detector, like "MUST2Array",          * 
+ *		note that use of _ within the name is prohibitted.                     *
+ *                                                                           *
+ *		-X is the detector Number, for example if you have two plastic then you*
+ *		will have Plastic1 and Plastic2                                        *
+ *                                                                           *
+ *		-SubPart is the optionnal sub part, like for examples Si and CsI in    *
+ *      MUST2. Note that you can add as many as _SubPart you need            *
  *                                                                           *
  *****************************************************************************/
 // C++ header
diff --git a/NPSimulation/src/AnnularS1.cc b/NPSimulation/src/AnnularS1.cc
index 2a908614d6c5bbf1898b04bc23d741cdf1e2ec5b..9b39717d9147a9ead892a2219f1561f626f6a453 100644
--- a/NPSimulation/src/AnnularS1.cc
+++ b/NPSimulation/src/AnnularS1.cc
@@ -9,7 +9,7 @@
  * Original Author: N. de Sereville  contact address: deserevi@ipno.in2p3.fr *
  *                                                                           *
  * Creation Date  : 21/07/09                                                 *
- * Last update    : 11/10/09                                                 *
+ * Last update    : 16/10/09                                                 *
  *---------------------------------------------------------------------------*
  * Decription: Define the S1 detector from Micron                            *
  *                                                                           *
@@ -169,7 +169,7 @@ void AnnularS1::VolumeMaker(G4int             DetecNumber,
    G4PVPlacement* PVPBuffer ;
 
    // Name of the module
-   G4String Name = "AnnularS1_" + DetectorNumber;
+   G4String Name = "S1Annular" + DetectorNumber;
 
    // Definition of the volume containing the sensitive detector
    G4Tubs* solidAnnularS1 = new G4Tubs(Name, 
@@ -251,39 +251,63 @@ void AnnularS1::ReadConfiguration(string Path)
    string LineBuffer, DataBuffer;
 
    G4double Z = 0;
-   bool check_Z = false;
+   bool check_Z = false , check_VIS=false,ReadingStatus = false ;
 
    while (!ConfigFile.eof()) {
       getline(ConfigFile, LineBuffer);
-      if (LineBuffer.compare(0, 9, "AnnularS1") == 0) {
-         G4cout << "///" << G4endl           ;
-         G4cout << "Annular element found: " << G4endl   ;
 
-         ConfigFile >> DataBuffer;
-         //Position method
-         if (DataBuffer.compare(0, 2, "Z=") == 0) {
-            check_Z = true;
-            ConfigFile >> DataBuffer ;
-            Z = atof(DataBuffer.c_str()) ;
-            Z = Z * mm;
-            cout << "Z:  " << Z / mm << endl;
-         }
-
-         ConfigFile >> DataBuffer;
-         if (DataBuffer.compare(0, 4, "VIS=") == 0) {
-            ConfigFile >> DataBuffer;
-            if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true;
-         }
 
-         //Add The previously define telescope
-         //With position method
-         if (check_Z) {
-            AddModule(Z);
-         }
-         else {
-            G4cout << "Wrong Token, AnnularS1 Annular Element not added" << G4endl;
-         }
-      }
+		if (LineBuffer.compare(0, 9, "AnnularS1") == 0) {
+         G4cout << "///" << G4endl           ;
+         G4cout << "Annular element found: " << G4endl   ;
+					ReadingStatus = true ;
+			}
+	
+		else ReadingStatus = false ;
+
+		while(ReadingStatus)
+			{
+				ConfigFile >> DataBuffer;
+
+				//Search for comment Symbol %
+	      if (DataBuffer.compare(0, 1, "%") == 0) {	ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );}
+
+	      //Position method
+	      else if (DataBuffer.compare(0, 2, "Z=") == 0) {
+	            check_Z = true;
+	            ConfigFile >> DataBuffer ;
+	            Z = atof(DataBuffer.c_str()) ;
+	            Z = Z * mm;
+	            cout << "Z:  " << Z / mm << endl;
+	         }
+
+	       else if (DataBuffer.compare(0, 4, "VIS=") == 0) {
+							check_VIS = true ;
+	            ConfigFile >> DataBuffer;
+	            if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true;
+	         }
+
+
+					///////////////////////////////////////////////////
+					//	If no Detector Token and no comment, toggle out
+					else 
+						{ReadingStatus = false; G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ;}
+
+
+	         //Add The previously define telescope
+	         //With position method
+	         if (check_Z&&check_VIS) {
+	            AddModule(Z);
+							check_Z = false ;
+							check_VIS=false	;
+							ReadingStatus = false 			;	
+							cout << "///"<< endl ;	    
+	         }
+
+			}
+
+			
+      
    }
 }
 
@@ -572,11 +596,11 @@ void AnnularS1::InitializeScorers()
    G4VPrimitiveScorer* TOF                              = new AnnularS1ScorerTime("StripTime", 0);
    G4VPrimitiveScorer* ThetaStripPosition               = new AnnularS1ScorerThetaStripNumber("ThetaStripNumber", 0);
    G4VPrimitiveScorer* PhiStripPosition                 = new AnnularS1ScorerPhiStripNumber("PhiStripNumber", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesX          = new PSInteractionCoordinatesX("InterCoordX", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesY          = new PSInteractionCoordinatesY("InterCoordY", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesZ          = new PSInteractionCoordinatesZ("InterCoordZ", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new PSInteractionCoordinatesAngleTheta("InterCoordAngTheta", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesAnglePhi   = new PSInteractionCoordinatesAnglePhi("InterCoordAngPhi", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesX          = new GENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","S1Annular", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesY          = new GENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","S1Annular", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesZ          = new GENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","S1Annular", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new GENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordAngTheta","S1Annular", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesAnglePhi   = new GENERALSCORERS::PSInteractionCoordinatesAnglePhi("InterCoordAngPhi","S1Annular", 0);
 
    //and register it to the multifunctionnal detector
    m_Scorer->RegisterPrimitive(DetNbr);
diff --git a/NPSimulation/src/AnnularS1Scorers.cc b/NPSimulation/src/AnnularS1Scorers.cc
index 514b615890f70e206f5f8c0ab428c009f24262cb..bc76aa72b282fa13a387bba0eea6e903bcc124e6 100644
--- a/NPSimulation/src/AnnularS1Scorers.cc
+++ b/NPSimulation/src/AnnularS1Scorers.cc
@@ -51,8 +51,8 @@ G4bool AnnularS1ScorerDetectorNumber::ProcessHits(G4Step* aStep, G4TouchableHist
    std::string name = aStep->GetTrack()->GetVolume()->GetName();
    std::string nbr;
    size_t found;
-   found = name.find("AnnularS1_");
-   found = found + 10;
+   found = name.find("S1Annular");
+   found = found + 9;
   
    int numberOfCharacterInDetectorNumber = name.length() - (int)found;
 
@@ -126,8 +126,8 @@ G4bool AnnularS1ScorerEnergy::ProcessHits(G4Step* aStep, G4TouchableHistory*)
    std::string name = aStep->GetTrack()->GetVolume()->GetName();
    std::string nbr;
    size_t found;
-   found = name.find("AnnularS1_");
-   found = found + 10;
+   found = name.find("S1Annular");
+   found = found + 9;
 
    int numberOfCharacterInDetectorNumber = name.length() - (int)found;
 
@@ -201,8 +201,8 @@ G4bool AnnularS1ScorerTime::ProcessHits(G4Step* aStep, G4TouchableHistory*)
    std::string name = aStep->GetTrack()->GetVolume()->GetName();
    std::string nbr;
    size_t found;
-   found = name.find("AnnularS1_");
-   found = found + 10;
+   found = name.find("S1Annular");
+   found = found + 9;
 
    int numberOfCharacterInDetectorNumber = name.length() - (int)found;
 
@@ -270,8 +270,8 @@ G4bool AnnularS1ScorerThetaStripNumber::ProcessHits(G4Step* aStep, G4TouchableHi
    std::string name = aStep->GetTrack()->GetVolume()->GetName();
    std::string nbr;
    size_t found;
-   found = name.find("AnnularS1_");
-   found = found + 10;
+   found = name.find("S1Annular");
+   found = found + 9;
 
    int numberOfCharacterInDetectorNumber = name.length() - (int)found;
 
@@ -367,8 +367,8 @@ G4bool AnnularS1ScorerPhiStripNumber::ProcessHits(G4Step* aStep, G4TouchableHist
    std::string name = aStep->GetTrack()->GetVolume()->GetName();
    std::string nbr;
    size_t found;
-   found = name.find("AnnularS1_");
-   found = found + 10;
+   found = name.find("S1Annular");
+   found = found + 9;
 
    int numberOfCharacterInDetectorNumber = name.length() - (int)found;
 
diff --git a/NPSimulation/src/DetectorConstruction.cc b/NPSimulation/src/DetectorConstruction.cc
index ce6dc5f98124a86efa96c57ca12645ebded0ad88..391bf2f7e364e189107955159c93a9c5b73312d9 100644
--- a/NPSimulation/src/DetectorConstruction.cc
+++ b/NPSimulation/src/DetectorConstruction.cc
@@ -37,12 +37,14 @@
 #include "G4RotationMatrix.hh"
 
 // Detector class
+#include "DummyDetector.hh"
 #include "MUST2Array.hh"
 #include "GaspardTracker.hh"
 #include "AnnularS1.hh"
 #include "Target.hh"
 #include "ThinSi.hh"
 #include "Plastic.hh"
+
 //Not G4
 #include <cstdlib>
 #include<fstream>
@@ -121,13 +123,14 @@ void DetectorConstruction::ReadConfigurationFile(string Path)
    string LineBuffer;
    string DataBuffer;
 
-   /////////Boolean////////////////////
-   bool MUST2           = false;
-   bool AddThinSi       = false;
-   bool GeneralTarget   = false;
-   bool GPDTracker      = false;	// Gaspard Tracker
-   bool S1              = false;
+   /////////Checking Boolean////////////////////
+   bool cMUST2           = false;
+   bool cAddThinSi       = false;
+   bool cGeneralTarget   = false;
+   bool cGPDTracker      = false;	// Gaspard Tracker
+   bool cS1              = false;
    bool cPlastic         = false;
+   bool cDummy         = false;
    //////////////////////////////////////////////////////////////////////////////////////////
    // added by Nicolas [07/05/09]
    string GlobalPath = getenv("NPTOOL");
@@ -149,11 +152,31 @@ void DetectorConstruction::ReadConfigurationFile(string Path)
       //Search for comment Symbol: %
       if (LineBuffer.compare(0, 1, "%") == 0) {   /*Do  Nothing*/;}
 
+			////////////////////////////////////////////
+      /////// Search for a Dummy Detector ////////
+      ////////////////////////////////////////////
+      else if (LineBuffer.compare(0, 16, "TheDUMMYDetector") == 0 && cDummy == false) {
+         cDummy = true ;
+         G4cout << "//////// DUMMY DETECTOR ////////" << G4endl << G4endl   ;
+
+         // Instantiate the new array as a VDetector Object
+         VDetector* myDetector = new DUMMYDetector()                  ;
+
+         // Read Position of detector
+         ConfigFile.close()                                 ;
+         myDetector->ReadConfiguration(Path)                   ;
+         ConfigFile.open(Path.c_str())                      ;
+
+         // Add array to the VDetector Vector
+         AddDetector(myDetector)                            ;
+      }
+
+
       ////////////////////////////////////////////
       //////////// Search for Gaspard ////////////
       ////////////////////////////////////////////
-      else if (LineBuffer.compare(0, 14, "GaspardTracker") == 0 && GPDTracker == false) {
-         GPDTracker = true ;
+      else if (LineBuffer.compare(0, 14, "GaspardTracker") == 0 && cGPDTracker == false) {
+         cGPDTracker = true ;
          G4cout << "//////// Gaspard Tracker ////////" << G4endl   ;
 
          // Instantiate the new array as a VDetector Object
@@ -171,8 +194,8 @@ void DetectorConstruction::ReadConfigurationFile(string Path)
       ////////////////////////////////////////////
       ///// Search for S1 Annular detector  //////
       ////////////////////////////////////////////
-      else if (LineBuffer.compare(0, 9, "AnnularS1") == 0 && S1 == false) {
-         S1 = true ;
+      else if (LineBuffer.compare(0, 9, "AnnularS1") == 0 && cS1 == false) {
+         cS1 = true ;
          G4cout << "//////// S1 Annular detector ////////" << G4endl   << G4endl   ;
 
          // Instantiate the new array as a VDetector Object
@@ -190,8 +213,8 @@ void DetectorConstruction::ReadConfigurationFile(string Path)
       ////////////////////////////////////////////
       //////// Search for MUST2 Array  ////////
       ////////////////////////////////////////////
-      else if (LineBuffer.compare(0, 10, "MUST2Array") == 0 && MUST2 == false) {
-         MUST2 = true ;
+      else if (LineBuffer.compare(0, 10, "MUST2Array") == 0 && cMUST2 == false) {
+         cMUST2 = true ;
          G4cout << "//////// MUST2 Array ////////" << G4endl   << G4endl   ;
 
          // Instantiate the new array as a VDetector Object
@@ -209,8 +232,8 @@ void DetectorConstruction::ReadConfigurationFile(string Path)
       ////////////////////////////////////////////
       ////////// Search for     ThinSi ///////////
       ////////////////////////////////////////////
-      else if (LineBuffer.compare(0, 9, "AddThinSi") == 0 && AddThinSi == false) {
-         AddThinSi = true ;
+      else if (LineBuffer.compare(0, 9, "AddThinSi") == 0 && cAddThinSi == false) {
+         cAddThinSi = true ;
          G4cout << "//////// Thin Si ////////" << G4endl << G4endl   ;
 
          // Instantiate the new array as a VDetector Object
@@ -248,8 +271,8 @@ void DetectorConstruction::ReadConfigurationFile(string Path)
       //////////// Search for Target /////////////
       ////////////////////////////////////////////
 
-      else if (LineBuffer.compare(0, 13, "GeneralTarget") == 0 && GeneralTarget == false) {
-         GeneralTarget = true ;
+      else if (LineBuffer.compare(0, 13, "GeneralTarget") == 0 && cGeneralTarget == false) {
+         cGeneralTarget = true ;
          G4cout << "////////// Target ///////////" << G4endl   << G4endl   ;
 
          // Instantiate the new array as a VDetector Objects
diff --git a/NPSimulation/src/DummyDetector.cc b/NPSimulation/src/DummyDetector.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0e4e17d8586e596d56a245c48bd8055fb29c3140
--- /dev/null
+++ b/NPSimulation/src/DummyDetector.cc
@@ -0,0 +1,473 @@
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : October 2009                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class describe a simple Dummy Detector :                            *
+ *	a simple cylinder of predifined material. user can choose to place it    *
+ *  where he want using spherical coordinate and choose between two naterial *
+ *	                                                                         *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *  This detector respect all the NPTool convention in naming volume,        * 
+ *  reading scorers and file. Use it as a basis for your own detector        *
+ *****************************************************************************/
+
+// C++ headers
+#include <sstream>
+#include <cmath>
+#include <limits>
+//G4 Geometry object
+#include "G4Tubs.hh"
+
+//G4 sensitive
+#include "G4SDManager.hh"
+#include "G4MultiFunctionalDetector.hh"
+
+//G4 various object
+#include "G4MaterialTable.hh"
+#include "G4Element.hh"
+#include "G4ElementTable.hh"
+#include "G4Transform3D.hh"
+#include "G4PVPlacement.hh"
+#include "G4VisAttributes.hh"
+#include "G4Colour.hh"
+
+// NPTool header
+#include "DummyDetector.hh"
+#include "GeneralScorers.hh"
+#include "RootOutput.h"
+using namespace GENERALSCORERS ;
+// CLHEP header
+#include "CLHEP/Random/RandGauss.h"
+
+using namespace std;
+using namespace CLHEP;
+
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+namespace DUMMYDETECTOR
+{
+   // Energy and time Resolution
+   const G4double ResoTime    = 4.2      	;// = 10ns of Resolution   //   Unit is MeV/2.35
+   const G4double ResoEnergy  = 5.0   		;// Resolution in %
+
+}
+
+using namespace DUMMYDETECTOR ;
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// DUMMYDetector Specific Method
+DUMMYDetector::DUMMYDetector()
+{
+	InitializeMaterial();
+	m_Event = new TDUMMYDetectorData() ;
+}
+
+DUMMYDetector::~DUMMYDetector()
+{
+	delete m_MaterialDUMMYDetector_material1		; 
+	delete m_MaterialDUMMYDetector_material2	;
+	delete m_DUMMYDetectorScorer						;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void DUMMYDetector::AddDUMMYDetector(	G4double  R        					,
+				        					G4double  Theta    					,
+				         			 		G4double  Phi         			,
+				         			 		G4double	DUMMYDetectorThickness	,
+				         			 		G4double	DUMMYDetectorRadius			,
+				         			 		G4String 	Scintillator			)
+{
+
+  m_R.push_back(R)              									;
+  m_Theta.push_back(Theta)        								;
+  m_Phi.push_back(Phi)          									;
+  m_DUMMYDetectorThickness.push_back(DUMMYDetectorThickness)	;
+ 	m_DUMMYDetectorRadius.push_back(DUMMYDetectorRadius)				;
+ 	m_Scintillator.push_back(Scintillator)					;
+}
+
+//....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 DUMMYDetector::ReadConfiguration(string Path)
+{
+	ifstream ConfigFile           ;
+	ConfigFile.open(Path.c_str()) ;
+	string LineBuffer          ;
+	string DataBuffer          ;
+
+	G4double Theta = 0 , Phi = 0 , R = 0 , Thickness = 0 , Radius = 0 ;
+	G4String Scintillator ;
+
+	bool check_Theta = false   ;
+	bool check_Phi  = false  ;
+	bool check_R     = false   ;
+	bool check_Thickness = false  		;
+	bool check_Radius = false  			;\
+	bool check_Scintillator = false		;
+	bool ReadingStatus = false ;
+	
+
+ while (!ConfigFile.eof()) 
+ 	{
+      
+	      	getline(ConfigFile, LineBuffer);
+
+			//	If line is a Start Up DUMMYDetector bloc, Reading toggle to true      
+	      	if (LineBuffer.compare(0, 13, "DUMMYDetector") == 0) 
+		      	{
+		        	 G4cout << "///" << G4endl           ;
+		       		  G4cout << "Dummy Module found: " << G4endl   ;        
+		        	 ReadingStatus = true ;
+		        	
+			   	}
+			
+			//	Else don't toggle to Reading Block Status
+			else ReadingStatus = false ;
+			
+			//	Reading Block
+			while(ReadingStatus)
+				{
+						// Pickup Next Word 
+					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, 13, "DUMMYDetector") == 0) {
+						cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << endl ;
+						ReadingStatus = false ;
+					}
+										
+					//Angle method
+					else if (DataBuffer.compare(0, 6, "THETA=") == 0) {
+						check_Theta = true;
+						ConfigFile >> DataBuffer ;
+						Theta = atof(DataBuffer.c_str()) ;
+						Theta = Theta * deg;
+						cout << "Theta:  " << Theta / deg << endl;
+					}
+
+					else if (DataBuffer.compare(0, 4, "PHI=") == 0) {
+						check_Phi = true;
+						ConfigFile >> DataBuffer ;
+						Phi = atof(DataBuffer.c_str()) ;
+						Phi = Phi * deg;
+						cout << "Phi:  " << Phi / deg << endl;
+					}
+
+					else if (DataBuffer.compare(0, 2, "R=") == 0) {
+						check_R = true;
+						ConfigFile >> DataBuffer ;
+						R = atof(DataBuffer.c_str()) ;
+						R = R * mm;
+						cout << "R:  " << R/mm << endl;
+					}
+					
+					else if (DataBuffer.compare(0, 7, "Radius=") == 0) {
+						check_Radius = true;
+						ConfigFile >> DataBuffer ;
+						Radius = atof(DataBuffer.c_str()) ;
+						Radius = Radius * mm;
+						cout << "DUMMYDetector Radius:  " << Radius/mm << endl;
+					}
+					
+					else if (DataBuffer.compare(0, 10, "Thickness=") == 0) {
+						check_Thickness = true;
+						ConfigFile >> DataBuffer ;
+						Thickness = atof(DataBuffer.c_str()) ;
+						Thickness = Thickness * mm;
+						cout << "DUMMYDetector Thickness:  " << Thickness/mm << endl;
+					}
+					
+					else if (DataBuffer.compare(0, 13, "Material=") == 0) {
+						check_Scintillator = true ;
+						ConfigFile >> DataBuffer ;
+						Scintillator = DataBuffer ;
+						cout << "DUMMYDetector material type:  " << Scintillator << endl;
+					}
+			      
+			     			///////////////////////////////////////////////////
+								//	If no Detector Token and no comment, toggle out
+			         else 
+			         	{ReadingStatus = false; G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ;}
+			         
+			         	/////////////////////////////////////////////////
+			         	//	If All necessary information there, toggle out
+			         
+			         if ( check_Theta && check_Phi && check_R && check_Thickness && check_Radius && check_Scintillator) 
+			         	{ 
+		         		  AddDUMMYDetector(	R       		,
+		                  				Theta    		,
+		                  				Phi   			,
+		                  				Thickness		,
+		                  				Radius			,
+		                  				Scintillator		);
+					         
+					        //	Reinitialisation of Check Boolean 
+					        
+							check_Theta = false   			;
+							check_Phi  = false  			;
+							check_R     = false   			;
+							check_Thickness = false  		;
+							check_Radius = false  			;
+							check_Scintillator = false 		;
+							ReadingStatus = false 			;	
+							cout << "///"<< endl ;	         
+			         	}
+			         	
+				}
+	}
+
+}
+
+// Construct detector and inialise sensitive part.
+// Called After DetecorConstruction::AddDetector Method
+void DUMMYDetector::ConstructDetector(G4LogicalVolume* world)
+{
+   	G4ThreeVector Det_pos = G4ThreeVector(0, 0, 0)  ;
+	
+   for (unsigned short i = 0 ; i < m_R.size() ; i++) 
+   	{
+         G4double wX = m_R[i] * sin(m_Theta[i] ) * cos(m_Phi[i] )   ;
+         G4double wY = m_R[i] * sin(m_Theta[i] ) * sin(m_Phi[i] )   ;
+         G4double wZ = m_R[i] * cos(m_Theta[i] )             		;
+
+         Det_pos = G4ThreeVector(wX, wY, wZ)                 ;
+//         G4LogicalVolume* logicDUMMYDetector = NULL ;
+			
+		VolumeMaker(Det_pos , i+1, world) ;
+    }
+
+}
+
+void DUMMYDetector::VolumeMaker(G4ThreeVector Det_pos, int DetNumber, G4LogicalVolume* world)
+	{
+		////////////////////////////////////////////////////////////////
+		////////////// Starting Volume Definition //////////////////////
+		////////////////////////////////////////////////////////////////		
+		G4PVPlacement* PVPBuffer ;
+		
+		// Name of the module
+   		std::ostringstream DetectorNumber         			;
+   		DetectorNumber << DetNumber                 	  	;
+		G4String Name = "DUMMYDetector" + DetectorNumber.str()	;
+		
+		int i = DetNumber-1;
+
+		G4Material* DUMMYDetectorMaterial ;
+		
+			 if(m_Scintillator[i] == "material1"    ) DUMMYDetectorMaterial = m_MaterialDUMMYDetector_material1 	;
+		else if(m_Scintillator[i] == "material2"  ) DUMMYDetectorMaterial = m_MaterialDUMMYDetector_material2 	;
+		else {	
+				G4cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << endl ;
+				G4cout << "WARNING: Material Not found, default material set : material1" << endl ; 
+				G4cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << endl ;
+				DUMMYDetectorMaterial = m_MaterialDUMMYDetector_material1;
+			}
+		
+		
+		// Definition of the volume containing the sensitive detector
+		if(m_DUMMYDetectorThickness[i]>0 && m_DUMMYDetectorRadius[i]>0)
+			{ 
+				G4Tubs* solidDUMMYDetector = new G4Tubs(	Name					, 
+			                            								0						,
+			                            								m_DUMMYDetectorRadius[i]		,
+			                            								m_DUMMYDetectorThickness[i]/2	,
+			                            								0*deg					, 
+			                            								360*deg					);
+		                            		
+				G4LogicalVolume* logicDUMMYDetector = new G4LogicalVolume(solidDUMMYDetector, DUMMYDetectorMaterial, Name+ "_Scintillator", 0, 0, 0);
+				logicDUMMYDetector->SetSensitiveDetector(m_DUMMYDetectorScorer);
+				
+				G4VisAttributes* PlastVisAtt = new G4VisAttributes(G4Colour(0.0, 0.0, 0.9)) ;
+   				logicDUMMYDetector->SetVisAttributes(PlastVisAtt) ;
+ 				
+ 				
+			  
+				PVPBuffer = new G4PVPlacement(	0				,
+												Det_pos			,
+		                                     	logicDUMMYDetector    ,
+		                                     	Name  + "_Scintillator"          ,
+		                                     	world           ,
+		                                     	false           ,
+		                                     	0				);	
+		                                     	
+		       
+		                                     	
+			}
+	}
+
+// Add Detector branch to the EventTree.
+// Called After DetecorConstruction::AddDetector Method
+void DUMMYDetector::InitializeRootOutput()
+{
+   RootOutput *pAnalysis = RootOutput::getInstance();
+   TTree *pTree = pAnalysis->GetTree();
+   pTree->Branch("DUMMYDetector", "TDUMMYDetectorData", &m_Event) ;
+}
+
+// Read sensitive part and fill the Root tree.
+// Called at in the EventAction::EndOfEventAvtion
+void DUMMYDetector::ReadSensitive(const G4Event* event)
+{
+   G4String DetectorNumber 	;
+   m_Event->Clear()			;
+   
+//////////////////////////////////////////////////////////////////////////////////////
+//////////////////////// Used to Read Event Map of detector //////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////
+  
+	std::map<G4int, G4int*>::iterator DetectorNumber_itr    ;
+	std::map<G4int, G4double*>::iterator Energy_itr     	;
+	std::map<G4int, G4double*>::iterator Time_itr    		;
+	
+	G4THitsMap<G4int>*	  DetectorNumberHitMap				;      
+	G4THitsMap<G4double>* EnergyHitMap              		;
+	G4THitsMap<G4double>* TimeHitMap             			;
+	
+//////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////
+
+    // Read the Scorer associate to the Silicon Strip
+    
+	//Detector Number
+	G4int StripDetCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("DUMMYDetectorScorer/DUMMYDetectorNumber")  	;
+	DetectorNumberHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripDetCollectionID))       	;
+	DetectorNumber_itr =  DetectorNumberHitMap->GetMap()->begin()                                               ;
+
+	//Energy
+	G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("DUMMYDetectorScorer/Energy")   	;
+	EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID))           ;
+	Energy_itr = EnergyHitMap->GetMap()->begin()                                                          		;
+
+	//Time of Flight
+	G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("DUMMYDetectorScorer/Time")    		;
+	TimeHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID))               ;
+	Time_itr = TimeHitMap->GetMap()->begin()                                                              		;
+
+  	G4int sizeN = DetectorNumberHitMap->entries() 	;
+    G4int sizeE = EnergyHitMap->entries() 			;
+    G4int sizeT = TimeHitMap->entries() 			;
+
+    // Loop on DUMMYDetector Number
+    for (G4int l = 0 ; l < sizeN ; l++) {
+        G4int N     =      *(DetectorNumber_itr->second)    ;
+        G4int NTrackID  =   DetectorNumber_itr->first - N  ;
+        
+      
+        if (N > 0) {
+        
+	        m_Event->SetDUMMYDetectorNumber(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->SetEnergy(RandGauss::shoot(E, E*ResoEnergy/100./2.35))    ;
+	            }
+	            
+	            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->SetTime(RandGauss::shoot(T, ResoTime)) ;
+	            }
+	            
+	            Time_itr++;
+	        }
+
+        }
+
+        DetectorNumber_itr++;
+    }
+    
+    // clear map for next event
+    TimeHitMap				->clear()	;    
+    DetectorNumberHitMap    ->clear()	;
+    EnergyHitMap   			->clear() 	; 
+   
+}
+
+////////////////////////////////////////////////////////////////
+void DUMMYDetector::InitializeMaterial()
+	{
+	
+		////////////////////////////////////////////////////////////////
+		/////////////////Element  Definition ///////////////////////////
+		////////////////////////////////////////////////////////////////
+		   G4String symbol               						;
+		   G4double density = 0. , a = 0, z = 0   				;
+		   G4int ncomponents = 0, natoms = 0, fractionmass = 0	;
+
+			// for DUMMYDetector
+		   	G4Element* H   = new G4Element("Hydrogen" 	, symbol = "H"  	, z = 1  , a = 1.01   * g / mole);
+		   	G4Element* C   = new G4Element("Carbon"   	, symbol = "C"  	, z = 6  , a = 12.011 * g / mole);
+		 		G4Element* Pb  = new G4Element("Lead"   	, symbol = "Pb"  	, z = 82 , a = 207.2  * g / mole);
+		////////////////////////////////////////////////////////////////
+		/////////////////Material Definition ///////////////////////////
+		////////////////////////////////////////////////////////////////
+
+
+		   // DUMMYDetector BC-400
+		   density = 1.032 * g / cm3;
+		   m_MaterialDUMMYDetector_material1 = new G4Material("DUMMYDetector_material1", density, ncomponents = 2);
+		   m_MaterialDUMMYDetector_material1->AddElement(H , natoms = 10);
+		   m_MaterialDUMMYDetector_material1->AddElement(C  , natoms = 9);
+		   
+		   // DUMMYDetector BC-452 Pb 2%
+		   density = 1.05 * g / cm3;
+		   m_MaterialDUMMYDetector_material2 = new G4Material("DUMMYDetector_material2", density, ncomponents = 3);
+		   m_MaterialDUMMYDetector_material2->AddElement(H  , natoms = 10);
+		   m_MaterialDUMMYDetector_material2->AddElement(C  , natoms = 9);
+		   m_MaterialDUMMYDetector_material2->AddElement(Pb , fractionmass=2*perCent);
+
+	}
+
+////////////////////////////////////////////////////////////////	
+void DUMMYDetector::InitializeScorers() 
+	{ 
+		m_DUMMYDetectorScorer = new G4MultiFunctionalDetector("DUMMYDetectorScorer") ;
+		G4SDManager::GetSDMpointer()->AddNewDetector(m_DUMMYDetectorScorer);
+		
+		G4VPrimitiveScorer* DetNbr = new PSDetectorNumber("DUMMYDetectorNumber","DUMMYDetector", 0) ;
+		G4VPrimitiveScorer* Energy = new PSEnergy("Energy","DUMMYDetector", 0)             		;
+		G4VPrimitiveScorer* Time   = new PSTOF("Time","DUMMYDetector", 0)             				;
+		 
+		//and register it to the multifunctionnal detector
+		m_DUMMYDetectorScorer->RegisterPrimitive(DetNbr)             				;
+		m_DUMMYDetectorScorer->RegisterPrimitive(Energy)             				;
+		m_DUMMYDetectorScorer->RegisterPrimitive(Time)             					;		
+		
+		
+	}
+////////////////////////////////////////////////////////////////
diff --git a/NPSimulation/src/EventGeneratorBeam.cc b/NPSimulation/src/EventGeneratorBeam.cc
index c0418d7222318e0ebe0ad748b7bca500a01e806d..7388505fabf6f3011e1b8d8e6d0b67fccca868b7 100644
--- a/NPSimulation/src/EventGeneratorBeam.cc
+++ b/NPSimulation/src/EventGeneratorBeam.cc
@@ -19,6 +19,10 @@
  *                                                                           *
  *                                                                           *
  *****************************************************************************/
+
+// C++
+#include <limits>
+
 // G4 header
 #include "G4ParticleTable.hh"
 
@@ -91,7 +95,7 @@ void EventGeneratorBeam::ReadConfiguration(string Path)
 			 ReactionFile >> DataBuffer;
 	
       		//Search for comment Symbol %
-      		if (DataBuffer.compare(0, 1, "%") == 0) {/*Do Nothing*/;}
+      		if (DataBuffer.compare(0, 1, "%") == 0) {	ReactionFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );}
 
 	        else if (DataBuffer.compare(0, 10, "ParticleZ=") == 0) {
 	         	check_Z = true ;
diff --git a/NPSimulation/src/EventGeneratorIsotropic.cc b/NPSimulation/src/EventGeneratorIsotropic.cc
index c60482c0471de284466993cd5090327195323136..b2814747a18ab3633cd2e20d5b7071001c05f624 100644
--- a/NPSimulation/src/EventGeneratorIsotropic.cc
+++ b/NPSimulation/src/EventGeneratorIsotropic.cc
@@ -19,6 +19,9 @@
  *                                                                           *
  *                                                                           *
  *****************************************************************************/
+// C++
+#include<limits>
+
 // G4 headers
 #include "G4ParticleTable.hh"
 
@@ -99,7 +102,7 @@ void EventGeneratorIsotropic::ReadConfiguration(string Path)
 	    		 ReactionFile >> DataBuffer;
 	    	
 	    		 //Search for comment Symbol %
-			     if (DataBuffer.compare(0, 1, "%") == 0) {/*Do Nothing*/;}
+			     if (DataBuffer.compare(0, 1, "%") == 0) {	ReactionFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );}
 
 		         else if (DataBuffer.compare(0, 10, "EnergyLow=") == 0) {
 		         	check_EnergyLow = true ;
diff --git a/NPSimulation/src/EventGeneratorTransfert.cc b/NPSimulation/src/EventGeneratorTransfert.cc
index 2f4d422519761efdd20a1b0516112803aa16dddb..19de24764c26b9b507f39a4f369e9296a43a91ca 100644
--- a/NPSimulation/src/EventGeneratorTransfert.cc
+++ b/NPSimulation/src/EventGeneratorTransfert.cc
@@ -24,6 +24,7 @@
 // C++ headers
 #include <iostream>
 #include <fstream>
+#include <limits>
 
 // G4 header defining G4 types
 #include "globals.hh"
@@ -175,7 +176,7 @@ while(ReadingStatus){
  			 ReactionFile >> DataBuffer;
  			 
  			 //Search for comment Symbol %
-	      	 if (DataBuffer.compare(0, 1, "%") == 0) {/* Do Nothing */;}
+	      	 if (DataBuffer.compare(0, 1, "%") == 0) {	ReactionFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );}
  			 
 	         else if (DataBuffer.compare(0, 5, "Beam=") == 0) {
 	         	check_Beam = true ;
@@ -359,9 +360,9 @@ void EventGeneratorTransfert::GenerateEvent(G4Event* anEvent , G4ParticleGun* pa
    G4double x0 = InterCoord.x();
    G4double y0 = InterCoord.y();
    G4double z0 = InterCoord.z();
-   m_InitConditions->SetICPositionX(x0);
-   m_InitConditions->SetICPositionY(y0);
-   m_InitConditions->SetICPositionZ(z0);
+   m_InitConditions->SetICPositionX(x0);//
+   m_InitConditions->SetICPositionY(y0);//
+   m_InitConditions->SetICPositionZ(z0);//
 
    // write emittance angles to ROOT file
    m_InitConditions->SetICIncidentEmittanceTheta(Beam_thetaX / deg);
diff --git a/NPSimulation/src/EventGeneratorTransfertToResonance.cc b/NPSimulation/src/EventGeneratorTransfertToResonance.cc
index 790eb932209a63fd01b80b775f41bb0b2c633931..f513b2cb0351bdf2a47c2320220699975dc71631 100644
--- a/NPSimulation/src/EventGeneratorTransfertToResonance.cc
+++ b/NPSimulation/src/EventGeneratorTransfertToResonance.cc
@@ -25,6 +25,7 @@
 // C++ headers
 #include <iostream>
 #include <fstream>
+#include <limits>
 
 // G4 header defining G4 types
 #include "globals.hh"
@@ -190,7 +191,7 @@ while(ReadingStatus){
  			 ReactionFile >> DataBuffer;
  			 
  			 //Search for comment Symbol %
-	      	 if (DataBuffer.compare(0, 1, "%") == 0) {/* Do Nothing */;}
+	      	 if (DataBuffer.compare(0, 1, "%") == 0) {	ReactionFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );}
  			 
 	         else if (DataBuffer.compare(0, 5, "Beam=") == 0) {
 	         	check_Beam = true ;
@@ -479,18 +480,6 @@ void EventGeneratorTransfertToResonance::GenerateEvent(G4Event* anEvent , G4Part
                                          sin(ThetaHeavy) * sin(phi),
                                          cos(ThetaHeavy));
 
-
-
-   // Move to the target
-   x0 += m_Target->GetTargetX() ;
-   y0 += m_Target->GetTargetY() ;
-   z0 += m_Target->GetTargetZ() ;
-
-   // write vertex position to ROOT file
-   m_InitConditions->SetICPositionX(x0);
-   m_InitConditions->SetICPositionY(y0);
-   m_InitConditions->SetICPositionZ(z0);
-
    //////////////////////////////////////////////////
    ///////// Set up everything for shooting /////////
    //////////////////////////////////////////////////
diff --git a/NPSimulation/src/GaspardScorers.cc b/NPSimulation/src/GaspardScorers.cc
index 48389994eccb8d95feb85d3aa800016727f2c87c..5fc5b695d1252f2dce29a5184d8257bdd3dafc2a 100644
--- a/NPSimulation/src/GaspardScorers.cc
+++ b/NPSimulation/src/GaspardScorers.cc
@@ -39,7 +39,6 @@ using namespace GPDDUMMYSHAPE;
 // scorer provide by G4 don't work this way but using a global ID for each event you should
 // not use those scorer with some G4 provided ones or being very carefull doing so.
 
-
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 // FirstStage Energy Scorer (deal with multiple particle hit)
 GPDScorerFirstStageEnergy::GPDScorerFirstStageEnergy(G4String name, G4int depth)
diff --git a/NPSimulation/src/GaspardTrackerAnnular.cc b/NPSimulation/src/GaspardTrackerAnnular.cc
index d00337e57da423849cfa909c7213adaf9cafacf2..3964142e5922524883e2cd837327e5bd1b0edcb4 100644
--- a/NPSimulation/src/GaspardTrackerAnnular.cc
+++ b/NPSimulation/src/GaspardTrackerAnnular.cc
@@ -768,14 +768,14 @@ void GaspardTrackerAnnular::InitializeScorers()
    m_FirstStageScorer = new G4MultiFunctionalDetector("FirstStageScorerGPDAnnular");
    G4VPrimitiveScorer* DetNbr                           = new GPDScorerDetectorNumber("DetectorNumber", 0, "G");
    G4VPrimitiveScorer* Energy                           = new GPDScorerFirstStageEnergy("StripEnergy", 0);
-   G4VPrimitiveScorer* TOF                              = new PSTOF("StripTime", 0);
+   G4VPrimitiveScorer* TOF                              = new GENERALSCORERS::PSTOF("StripTime","GPDAnnular", 0);
    G4VPrimitiveScorer* StripPositionX                   = new GPDScorerFirstStageFrontStripAnnular("StripNumberX", 0, FirstStageRmax, 128);
    G4VPrimitiveScorer* StripPositionY                   = new GPDScorerFirstStageBackStripAnnular("StripNumberY", 0, FirstStageRmax, 128);
-   G4VPrimitiveScorer* InteractionCoordinatesX          = new PSInteractionCoordinatesX("InterCoordX", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesY          = new PSInteractionCoordinatesY("InterCoordY", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesZ          = new PSInteractionCoordinatesZ("InterCoordZ", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new PSInteractionCoordinatesAngleTheta("InterCoordAngTheta", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesAnglePhi   = new PSInteractionCoordinatesAnglePhi("InterCoordAngPhi", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesX          = new GENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","GPDAnnular", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesY          = new GENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","GPDAnnular", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesZ          = new GENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","GPDAnnular", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new GENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordAngTheta","GPDAnnular", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesAnglePhi   = new GENERALSCORERS::PSInteractionCoordinatesAnglePhi("InterCoordAngPhi","GPDAnnular", 0);
 
    //and register it to the multifunctionnal detector
    m_FirstStageScorer->RegisterPrimitive(DetNbr);
diff --git a/NPSimulation/src/GaspardTrackerDummyShape.cc b/NPSimulation/src/GaspardTrackerDummyShape.cc
index a92f216967fcb4ae8b54ad30666527b4b67154b3..f354f242234b2185dda2640117da92548746fd11 100644
--- a/NPSimulation/src/GaspardTrackerDummyShape.cc
+++ b/NPSimulation/src/GaspardTrackerDummyShape.cc
@@ -934,14 +934,14 @@ void GaspardTrackerDummyShape::InitializeScorers()
    m_FirstStageScorer                                   = new G4MultiFunctionalDetector("FirstStageScorerGPDDummyShape");
    G4VPrimitiveScorer* DetNbr                           = new GPDScorerDetectorNumber("DetectorNumber", 0, "G");
    G4VPrimitiveScorer* Energy                           = new GPDScorerFirstStageEnergy("StripEnergy", 0);
-   G4VPrimitiveScorer* TOF                              = new PSTOF("StripTime", 0);
+   G4VPrimitiveScorer* TOF                              = new GENERALSCORERS::PSTOF("StripTime","GPDDummyShape", 0);
    G4VPrimitiveScorer* StripPositionX                   = new GPDScorerFirstStageFrontStripDummyShape("StripIDFront", 0, NumberOfStrips);
    G4VPrimitiveScorer* StripPositionY                   = new GPDScorerFirstStageBackStripDummyShape("StripIDBack", 0, NumberOfStrips);
-   G4VPrimitiveScorer* InteractionCoordinatesX          = new PSInteractionCoordinatesX("InterCoordX", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesY          = new PSInteractionCoordinatesY("InterCoordY", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesZ          = new PSInteractionCoordinatesZ("InterCoordZ", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new PSInteractionCoordinatesAngleTheta("InterCoordAngTheta", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesAnglePhi   = new PSInteractionCoordinatesAnglePhi("InterCoordAngPhi", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesX          = new GENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","GPDDummyShape", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesY          = new GENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","GPDDummyShape", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesZ          = new GENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","GPDDummyShape", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new GENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordAngTheta","GPDDummyShape", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesAnglePhi   = new GENERALSCORERS::PSInteractionCoordinatesAnglePhi("InterCoordAngPhi","GPDDummyShape", 0);
 
    //and register it to the multifunctionnal detector
    m_FirstStageScorer->RegisterPrimitive(DetNbr);
diff --git a/NPSimulation/src/GaspardTrackerSquare.cc b/NPSimulation/src/GaspardTrackerSquare.cc
index a907495f0dcef05b8af062eecec934da2cb85774..6e0c05ca9f5b2563726fc7392a3a20a129b44e28 100644
--- a/NPSimulation/src/GaspardTrackerSquare.cc
+++ b/NPSimulation/src/GaspardTrackerSquare.cc
@@ -1123,14 +1123,14 @@ void GaspardTrackerSquare::InitializeScorers()
    m_FirstStageScorer = new G4MultiFunctionalDetector("FirstStageScorerGPDSquare");
    G4VPrimitiveScorer* DetNbr                           = new GPDScorerDetectorNumber("DetectorNumber", 0, "G");
    G4VPrimitiveScorer* Energy                           = new GPDScorerFirstStageEnergy("StripEnergy", 0);
-   G4VPrimitiveScorer* TOF                              = new PSTOF("StripTime", 0);
+   G4VPrimitiveScorer* TOF                              = new GENERALSCORERS::PSTOF("StripTime","GPDSquare", 0);
    G4VPrimitiveScorer* StripPositionX                   = new GPDScorerFirstStageFrontStripSquare("StripNumberX", 0, NumberOfStrips);
    G4VPrimitiveScorer* StripPositionY                   = new GPDScorerFirstStageBackStripSquare("StripNumberY", 0, NumberOfStrips);
-   G4VPrimitiveScorer* InteractionCoordinatesX          = new PSInteractionCoordinatesX("InterCoordX", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesY          = new PSInteractionCoordinatesY("InterCoordY", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesZ          = new PSInteractionCoordinatesZ("InterCoordZ", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new PSInteractionCoordinatesAngleTheta("InterCoordAngTheta", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesAnglePhi   = new PSInteractionCoordinatesAnglePhi("InterCoordAngPhi", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesX          = new GENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","GPDSquare", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesY          = new GENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","GPDSquare", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesZ          = new GENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","GPDSquare", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new GENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordAngTheta","GPDSquare", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesAnglePhi   = new GENERALSCORERS::PSInteractionCoordinatesAnglePhi("InterCoordAngPhi","GPDSquare", 0);
 
    //and register it to the multifunctionnal detector
    m_FirstStageScorer->RegisterPrimitive(DetNbr);
diff --git a/NPSimulation/src/GaspardTrackerTrapezoid.cc b/NPSimulation/src/GaspardTrackerTrapezoid.cc
index 6529b628676844f15d90bd92fbc6532387ebe27b..1ecceb4f9d228b54fb45a2805a8f05ca69c64c49 100644
--- a/NPSimulation/src/GaspardTrackerTrapezoid.cc
+++ b/NPSimulation/src/GaspardTrackerTrapezoid.cc
@@ -990,14 +990,14 @@ void GaspardTrackerTrapezoid::InitializeScorers()
    m_FirstStageScorer = new G4MultiFunctionalDetector("FirstStageScorerGPDTrapezoid");
    G4VPrimitiveScorer* DetNbr                           = new GPDScorerDetectorNumber("DetectorNumber", 0, "G");
    G4VPrimitiveScorer* Energy                           = new GPDScorerFirstStageEnergy("StripEnergy", 0);
-   G4VPrimitiveScorer* TOF                              = new PSTOF("StripTime", 0);
+   G4VPrimitiveScorer* TOF                              = new GENERALSCORERS::PSTOF("StripTime","GPDTrapezoid", 0);
    G4VPrimitiveScorer* StripPositionX                   = new GPDScorerFirstStageFrontStripTrapezoid("StripNumberX", 0, NumberOfStripsX);
    G4VPrimitiveScorer* StripPositionY                   = new GPDScorerFirstStageBackStripTrapezoid("StripNumberY",  0, NumberOfStripsY);
-   G4VPrimitiveScorer* InteractionCoordinatesX          = new PSInteractionCoordinatesX("InterCoordX", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesY          = new PSInteractionCoordinatesY("InterCoordY", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesZ          = new PSInteractionCoordinatesZ("InterCoordZ", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new PSInteractionCoordinatesAngleTheta("InterCoordAngTheta", 0);
-   G4VPrimitiveScorer* InteractionCoordinatesAnglePhi   = new PSInteractionCoordinatesAnglePhi("InterCoordAngPhi", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesX          = new GENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","GPDTrapezoid", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesY          = new GENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","GPDTrapezoid", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesZ          = new GENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","GPDTrapezoid", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new GENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordAngTheta","GPDTrapezoid", 0);
+   G4VPrimitiveScorer* InteractionCoordinatesAnglePhi   = new GENERALSCORERS::PSInteractionCoordinatesAnglePhi("InterCoordAngPhi","GPDTrapezoid", 0);
 
    //and register it to the multifunctionnal detector
    m_FirstStageScorer->RegisterPrimitive(DetNbr);
diff --git a/NPSimulation/src/GeneralScorers.cc b/NPSimulation/src/GeneralScorers.cc
index f532c4495eed51466aeebf4dfc251be0173c9c90..38c9e6e23ebbb33c881f919aa5db9b5f7a8c3702 100644
--- a/NPSimulation/src/GeneralScorers.cc
+++ b/NPSimulation/src/GeneralScorers.cc
@@ -24,15 +24,107 @@
  *****************************************************************************/
 #include "GeneralScorers.hh"
 #include "G4UnitsTable.hh"
+using namespace GENERALSCORERS ;
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+
+//	The following function is used in many scorer. following the Detector Volume Nomenclature
+//	DetectorNameX_SubPart_SubPart
+//  where X stand for the detector number.
+
+int GENERALSCORERS::PickUpDetectorNumber(G4Step* aStep, std::string DetName)
+	{
+		std::string name = aStep->GetTrack()->GetVolume()->GetName();
+  	std::string nbr ;
+		size_t start, end ;
+    start = name.find(DetName) + DetName.length();
+		end   = name.find("_");
+
+		int numberOfCharacterInDetectorNumber = (int)end - (int)start  ;
+
+		for(unsigned int i = start ; i < start + numberOfCharacterInDetectorNumber ; i++ )
+			nbr += name[i] ; 
+
+		return (atoi( nbr.c_str() ));
+
+	}
+ 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+		//Detector Number Scorer
+PSDetectorNumber::PSDetectorNumber(G4String name, G4String VolumeName, G4int depth )
+      : G4VPrimitiveScorer(name, depth), HCID(-1)
+{
+   m_VolumeName = VolumeName;
+}
+
+PSDetectorNumber::~PSDetectorNumber()
+{
+   ;
+}
+
+G4bool PSDetectorNumber::ProcessHits(G4Step* aStep, G4TouchableHistory*)
+	{
+	int DetNumber = PickUpDetectorNumber(aStep, m_VolumeName) ; 
+
+   G4double edep = aStep->GetTotalEnergyDeposit();
+   
+   if (edep < TriggerThreshold) return FALSE;
+   
+   G4int  index = aStep->GetTrack()->GetTrackID();
+   EvtMap->set(index+DetNumber, DetNumber);
+   return TRUE;
+}
+
+void PSDetectorNumber::Initialize(G4HCofThisEvent* HCE)
+{ 
+   EvtMap = new G4THitsMap<G4int>(GetMultiFunctionalDetector()->GetName(), GetName());
+   if (HCID < 0) {
+      HCID = GetCollectionID(0);
+   }
+   HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap);
+}
+
+void PSDetectorNumber::EndOfEvent(G4HCofThisEvent*)
+{
+   ;
+}
+
+void PSDetectorNumber::clear()
+{
+   EvtMap->clear();
+}
+
+void PSDetectorNumber::DrawAll()
+{
+   ;
+}
+
+void PSDetectorNumber::PrintAll()
+{
+   G4cout << " MultiFunctionalDet  " << detector->GetName() << G4endl;
+   G4cout << " PrimitiveScorer " << GetName() << G4endl;
+   G4cout << " Number of entries " << EvtMap->entries() << G4endl;
+   std::map<G4int, G4int*>::iterator itr = EvtMap->GetMap()->begin();
+   for (; itr != EvtMap->GetMap()->end(); itr++) {
+      G4cout << "  copy no.: " << itr->first
+      << "  energy deposit: " << G4BestUnit(*(itr->second), "Energy")
+      << G4endl;
+   }
+}
+
+
+
+
 // Energy Scorer (deal with multiple particle hit)
 
-PSEnergy::PSEnergy(G4String name, G4int depth)
+PSEnergy::PSEnergy(G4String name, G4String VolumeName, G4int depth)
       : G4VPrimitiveScorer(name, depth), HCID(-1)
 {
+	m_VolumeName = VolumeName;
 }
 
 PSEnergy::~PSEnergy()
@@ -41,12 +133,14 @@ PSEnergy::~PSEnergy()
 
 G4bool PSEnergy::ProcessHits(G4Step* aStep, G4TouchableHistory*)
 {
+	 int DetNumber = PickUpDetectorNumber(aStep, m_VolumeName) ; 
+
    G4double edep = aStep->GetTotalEnergyDeposit();
-   if (edep < 100*keV) return FALSE;
+   if (edep < TriggerThreshold) return FALSE;
    
    G4int  index = aStep->GetTrack()->GetTrackID();
    
-   EvtMap->add(index, edep);
+   EvtMap->add(index+DetNumber, edep);
    return TRUE;
 }
 
@@ -89,10 +183,10 @@ void PSEnergy::PrintAll()
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 //TOF Scorer//
-PSTOF::PSTOF(G4String name, G4int depth)
+PSTOF::PSTOF(G4String name, G4String VolumeName, G4int depth)
       : G4VPrimitiveScorer(name, depth), HCID(-1)
 {
-   ;
+   m_VolumeName = VolumeName;
 }
 
 PSTOF::~PSTOF()
@@ -102,11 +196,13 @@ PSTOF::~PSTOF()
 
 G4bool PSTOF::ProcessHits(G4Step* aStep, G4TouchableHistory*)
 {
+	int DetNumber = PickUpDetectorNumber(aStep, m_VolumeName) ; 
+
    G4double TOF  = aStep->GetPreStepPoint()->GetGlobalTime();
    G4double edep = aStep->GetTotalEnergyDeposit();
-   if (edep < 100*keV) return FALSE;
+   if (edep < TriggerThreshold) return FALSE;
    G4int  index = aStep->GetTrack()->GetTrackID();
-   EvtMap->set(index, TOF);
+   EvtMap->set(index+DetNumber, TOF);
    return TRUE;
 }
 
@@ -144,9 +240,10 @@ void PSTOF::PrintAll()
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 // Interaction coordinates X
-PSInteractionCoordinatesX::PSInteractionCoordinatesX(G4String name, G4int depth)
+PSInteractionCoordinatesX::PSInteractionCoordinatesX(G4String name, G4String VolumeName, G4int depth)
       : G4VPrimitiveScorer(name, depth), HCID(-1)
 {
+	 m_VolumeName = VolumeName;
 }
 
 PSInteractionCoordinatesX::~PSInteractionCoordinatesX()
@@ -155,11 +252,13 @@ PSInteractionCoordinatesX::~PSInteractionCoordinatesX()
 
 G4bool PSInteractionCoordinatesX::ProcessHits(G4Step* aStep, G4TouchableHistory*)
 {
+	int DetNumber = PickUpDetectorNumber(aStep, m_VolumeName) ; 
+
    G4ThreeVector POS  = aStep->GetPreStepPoint()->GetPosition();
    G4double pos_x = POS.x() / mm;
 
    G4int  index =  aStep->GetTrack()->GetTrackID();
-   EvtMap->set(index, pos_x);
+   EvtMap->set(index+DetNumber, pos_x);
    return TRUE;
 }
 
@@ -196,9 +295,10 @@ void PSInteractionCoordinatesX::PrintAll()
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 // Interaction coordinates Y
-PSInteractionCoordinatesY::PSInteractionCoordinatesY(G4String name, G4int depth)
+PSInteractionCoordinatesY::PSInteractionCoordinatesY(G4String name, G4String VolumeName, G4int depth)
       : G4VPrimitiveScorer(name, depth), HCID(-1)
 {
+	 m_VolumeName = VolumeName;
 }
 
 PSInteractionCoordinatesY::~PSInteractionCoordinatesY()
@@ -207,16 +307,19 @@ PSInteractionCoordinatesY::~PSInteractionCoordinatesY()
 
 G4bool PSInteractionCoordinatesY::ProcessHits(G4Step* aStep, G4TouchableHistory*)
 {
+	int DetNumber = PickUpDetectorNumber(aStep, m_VolumeName) ; 
+
    G4ThreeVector POS  = aStep->GetPreStepPoint()->GetPosition();
    G4double pos_y = POS.y() / mm;
 
    G4int  index =  aStep->GetTrack()->GetTrackID();
-   EvtMap->set(index, pos_y);
+   EvtMap->set(index+DetNumber, pos_y);
    return TRUE;
 }
 
 void PSInteractionCoordinatesY::Initialize(G4HCofThisEvent* HCE)
 {
+
    EvtMap = new G4THitsMap<G4double>(GetMultiFunctionalDetector()->GetName(), GetName());
    if (HCID < 0) {
       HCID = GetCollectionID(0);
@@ -248,9 +351,10 @@ void PSInteractionCoordinatesY::PrintAll()
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 // Interaction coordinates Z
-PSInteractionCoordinatesZ::PSInteractionCoordinatesZ(G4String name, G4int depth)
+PSInteractionCoordinatesZ::PSInteractionCoordinatesZ(G4String name, G4String VolumeName, G4int depth)
       : G4VPrimitiveScorer(name, depth), HCID(-1)
 {
+	 m_VolumeName = VolumeName;
 }
 
 PSInteractionCoordinatesZ::~PSInteractionCoordinatesZ()
@@ -259,11 +363,13 @@ PSInteractionCoordinatesZ::~PSInteractionCoordinatesZ()
 
 G4bool PSInteractionCoordinatesZ::ProcessHits(G4Step* aStep, G4TouchableHistory*)
 {
+	int DetNumber = PickUpDetectorNumber(aStep, m_VolumeName) ; 
+
    G4ThreeVector POS  = aStep->GetPreStepPoint()->GetPosition();
    G4double pos_z = POS.z() / mm;
 
    G4int  index =  aStep->GetTrack()->GetTrackID();
-   EvtMap->set(index, pos_z);
+   EvtMap->set(index+DetNumber, pos_z);
    return TRUE;
 }
 
@@ -301,9 +407,10 @@ void PSInteractionCoordinatesZ::PrintAll()
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 // Interaction coordinates Angle Theta
-PSInteractionCoordinatesAngleTheta::PSInteractionCoordinatesAngleTheta(G4String name, G4int depth)
+PSInteractionCoordinatesAngleTheta::PSInteractionCoordinatesAngleTheta(G4String name, G4String VolumeName, G4int depth)
       : G4VPrimitiveScorer(name, depth), HCID(-1)
 {
+	 m_VolumeName = VolumeName;
 }
 
 PSInteractionCoordinatesAngleTheta::~PSInteractionCoordinatesAngleTheta()
@@ -312,11 +419,13 @@ PSInteractionCoordinatesAngleTheta::~PSInteractionCoordinatesAngleTheta()
 
 G4bool PSInteractionCoordinatesAngleTheta::ProcessHits(G4Step* aStep, G4TouchableHistory*)
 {
+	int DetNumber = PickUpDetectorNumber(aStep, m_VolumeName) ; 
+
    G4ThreeVector POS  = aStep->GetPreStepPoint()->GetPosition();
    G4double angle_theta = POS.theta() / deg;
 
    G4int  index =  aStep->GetTrack()->GetTrackID();
-   EvtMap->set(index, angle_theta);
+   EvtMap->set(index+DetNumber, angle_theta);
    return TRUE;
 }
 
@@ -354,9 +463,10 @@ void PSInteractionCoordinatesAngleTheta::PrintAll()
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 // Interaction coordinates Angle Phi
-PSInteractionCoordinatesAnglePhi::PSInteractionCoordinatesAnglePhi(G4String name, G4int depth)
+PSInteractionCoordinatesAnglePhi::PSInteractionCoordinatesAnglePhi(G4String name, G4String VolumeName, G4int depth)
       : G4VPrimitiveScorer(name, depth), HCID(-1)
 {
+	 m_VolumeName = VolumeName;
 }
 
 PSInteractionCoordinatesAnglePhi::~PSInteractionCoordinatesAnglePhi()
@@ -365,12 +475,14 @@ PSInteractionCoordinatesAnglePhi::~PSInteractionCoordinatesAnglePhi()
 
 G4bool PSInteractionCoordinatesAnglePhi::ProcessHits(G4Step* aStep, G4TouchableHistory*)
 {
+	int DetNumber = PickUpDetectorNumber(aStep, m_VolumeName) ; 
+
    G4ThreeVector POS  = aStep->GetPreStepPoint()->GetPosition();
    G4double angle_phi = POS.phi() / deg;
    if (angle_phi < 0) angle_phi += 360;
 
    G4int  index =  aStep->GetTrack()->GetTrackID();
-   EvtMap->set(index, angle_phi);
+   EvtMap->set(index+DetNumber, angle_phi);
    return TRUE;
 }
 
@@ -405,77 +517,4 @@ void PSInteractionCoordinatesAnglePhi::PrintAll()
    G4cout << " Number of entries " << EvtMap->entries() << G4endl     ;
 }
 
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-		//Detector Number Scorer
-PSDetectorNumber::PSDetectorNumber(G4String name, G4int depth, G4String VolumeName )
-      : G4VPrimitiveScorer(name, depth), HCID(-1)
-{
-   m_VolumeName = VolumeName;
-}
-
-PSDetectorNumber::~PSDetectorNumber()
-{
-   ;
-}
-
-G4bool PSDetectorNumber::ProcessHits(G4Step* aStep, G4TouchableHistory*)
-{
-   std::string name = aStep->GetTrack()->GetVolume()->GetName();
-   std::string nbr ;
-   size_t found;
-   found=name.find(m_VolumeName);
-   found = found + m_VolumeName.length();
-   
-   int numberOfCharacterInDetectorNumber = name.length() - (int)found  ;
-
-	for(unsigned int i = found ; i < found + numberOfCharacterInDetectorNumber ; i++ )
-			nbr += name[i] ; 
-		
-   G4int DetNbr = atoi( nbr.c_str() ) ;
-   G4double edep = aStep->GetTotalEnergyDeposit();
-   
-   if (edep < 100*keV) return FALSE;
-   
-   G4int  index = aStep->GetTrack()->GetTrackID();
-   
-   EvtMap->set(index, DetNbr);
-   return TRUE;
-}
-
-void PSDetectorNumber::Initialize(G4HCofThisEvent* HCE)
-{ 
-   EvtMap = new G4THitsMap<G4int>(GetMultiFunctionalDetector()->GetName(), GetName());
-   if (HCID < 0) {
-      HCID = GetCollectionID(0);
-   }
-   HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap);
-}
-
-void PSDetectorNumber::EndOfEvent(G4HCofThisEvent*)
-{
-   ;
-}
-
-void PSDetectorNumber::clear()
-{
-   EvtMap->clear();
-}
 
-void PSDetectorNumber::DrawAll()
-{
-   ;
-}
-
-void PSDetectorNumber::PrintAll()
-{
-   G4cout << " MultiFunctionalDet  " << detector->GetName() << G4endl;
-   G4cout << " PrimitiveScorer " << GetName() << G4endl;
-   G4cout << " Number of entries " << EvtMap->entries() << G4endl;
-   std::map<G4int, G4int*>::iterator itr = EvtMap->GetMap()->begin();
-   for (; itr != EvtMap->GetMap()->end(); itr++) {
-      G4cout << "  copy no.: " << itr->first
-      << "  energy deposit: " << G4BestUnit(*(itr->second), "Energy")
-      << G4endl;
-   }
-}
diff --git a/NPSimulation/src/MUST2Array.cc b/NPSimulation/src/MUST2Array.cc
index 846505d6404ba10515d16d3069d5e652940b9400..8b18d4b053b8d28e568af766f7d27e05afb65bbd 100644
--- a/NPSimulation/src/MUST2Array.cc
+++ b/NPSimulation/src/MUST2Array.cc
@@ -9,7 +9,7 @@
  * Original Author: Adrien MATTA  contact address: matta@ipno.in2p3.fr       *
  *                                                                           *
  * Creation Date  : January 2009                                             *
- * Last update    :                                                          *
+ * Last update    : October 2009                                             *
  *---------------------------------------------------------------------------*
  * Decription:                                                               *
  *  This file describe the MUST2 charge particle Detector                    *
@@ -157,10 +157,10 @@ void MUST2Array::VolumeMaker(G4int TelescopeNumber ,
    G4PVPlacement* PVPBuffer ;
 
 
-   G4Trd*           solidMM = new G4Trd("MM" + DetectorNumber, 0.5*FaceFront, 0.5*FaceBack, 0.5*FaceFront, 0.5*FaceBack, 0.5*Length);
-   G4LogicalVolume* logicMM = new G4LogicalVolume(solidMM, m_MaterialIron, "MM" + DetectorNumber, 0, 0, 0)                                ;
+   G4Trd*           solidMM = new G4Trd("MUST2Telescope" + DetectorNumber, 0.5*FaceFront, 0.5*FaceBack, 0.5*FaceFront, 0.5*FaceBack, 0.5*Length);
+   G4LogicalVolume* logicMM = new G4LogicalVolume(solidMM, m_MaterialIron, "MUST2Telescope" + DetectorNumber, 0, 0, 0)                                ;
 
-   G4String Name = "MM" + DetectorNumber ;
+   G4String Name = "MUST2Telescope" + DetectorNumber ;
 
 
    PVPBuffer =    new G4PVPlacement(G4Transform3D(*MMrot, MMpos)      ,
@@ -180,41 +180,10 @@ void MUST2Array::VolumeMaker(G4int TelescopeNumber ,
    G4Trd*           solidVacBox = new G4Trd("solidVacBox", 0.5*SiliconFace, 0.5*CsIFaceFront, 0.5*SiliconFace, 0.5*CsIFaceFront, 0.5*VacBoxThickness);
    G4LogicalVolume* logicVacBox = new G4LogicalVolume(solidVacBox, m_MaterialVacuum, "logicVacBox", 0, 0, 0);
 
-   PVPBuffer = new G4PVPlacement(0, positionVacBox, logicVacBox, "M" + DetectorNumber + "VacBox", logicMM, false, 0);
+   PVPBuffer = new G4PVPlacement(0, positionVacBox, logicVacBox, Name + "_VacBox", logicMM, false, 0);
 
    logicVacBox->SetVisAttributes(G4VisAttributes::Invisible);
 
-// Add a degrader plate between Si and CsI:
-
-   /*
-   G4Box*                   Degrader = new G4Box("Degrader" , 50*mm , 50*mm , 0.1*mm );
-   G4LogicalVolume*     logicDegrader = new G4LogicalVolume( Degrader , Harvar, "logicDegrader",0,0,0)         ;
-     PVPBuffer = new G4PVPlacement(0,G4ThreeVector(0,0,0),logicDegrader,"Degrader",logicVacBox,false,0) ;
-
-
-      //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 , Vacuum , "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 , Vacuum , "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); */
-
 ////////////////////////////////////////////////////////////////
 /////////////////Si Strip Construction//////////////////////////
 ////////////////////////////////////////////////////////////////
@@ -226,8 +195,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);
 
-      PVPBuffer = new G4PVPlacement(0, positionAluStripFront, logicAluStrip, "M" + DetectorNumber + "AluStripFront", logicMM, false, 0);
-      PVPBuffer = new G4PVPlacement(0, positionAluStripBack, logicAluStrip, "M" + DetectorNumber + "AluStripBack", logicMM, false, 0);
+      PVPBuffer = new G4PVPlacement(0, positionAluStripFront, logicAluStrip, Name + "_AluStripFront", logicMM, false, 0);
+      PVPBuffer = new G4PVPlacement(0, positionAluStripBack, logicAluStrip, Name + "_AluStripBack", logicMM, false, 0);
 
       logicAluStrip->SetVisAttributes(G4VisAttributes::Invisible);
 
@@ -236,7 +205,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);
 
-      PVPBuffer = new G4PVPlacement(0, positionSilicon, logicSilicon, "M" + DetectorNumber + "Silicon", logicMM, false, 0);
+      PVPBuffer = new G4PVPlacement(0, positionSilicon, logicSilicon, Name + "_Silicon", logicMM, false, 0);
 
 
       ///Set Silicon strip sensible
@@ -254,38 +223,33 @@ void MUST2Array::VolumeMaker(G4int TelescopeNumber ,
    if (wSiLi) {
       G4double SiLiSpace = 8 * mm;
 
-      G4RotationMatrix* rotSiLi = Rotation(0., 0., 0.);
-
-      G4ThreeVector positionSiLi = G4ThreeVector(-0.25 * SiliconFace - 0.5 * SiLiSpace, 0, 0);
-      G4ThreeVector positionSiLi2 = G4ThreeVector(0.25 * SiliconFace + 0.5 * SiLiSpace, 0, 0);
-
-      G4Box* solidSiLi = new G4Box("SiLi", 0.5*SiLiFaceX, 0.5*SiLiFaceY, 0.5*SiLiThickness);
+      G4RotationMatrix* rotSiLi = new G4RotationMatrix(0,0,-90*deg); //Rotation(0., 0., 0.);
 
-      G4LogicalVolume* logicSiLi = new G4LogicalVolume(solidSiLi, m_MaterialAluminium, "SiLi" + DetectorNumber, 0, 0, 0);
-
-      // First Si(Li) 2 time 4 detectore
-      PVPBuffer =  new G4PVPlacement(G4Transform3D(*rotSiLi, positionSiLi)  ,
-            logicSiLi                        ,
-            "SiLi" + DetectorNumber               ,
-            logicVacBox                      ,
-            false                         ,
-            0);
+     // G4Box* solidSiLi = new G4Box("SiLi", 0.5*SiLiFaceX, 0.5*SiLiFaceY, 0.5*SiLiThickness);
+     
+			G4Box* solidSiLi = new G4Box("SiLi", 0.5*SiliconFace+0.5*SiLiSpace, 0.5*SiliconFace, 0.5*SiLiThickness);
+			
+      G4LogicalVolume* logicSiLi = new G4LogicalVolume(solidSiLi, m_MaterialAluminium, Name + "_SiLi" , 0, 0, 0);
 
-      // Second Si(Li) 2 time 4 detectore
-      PVPBuffer =  new G4PVPlacement(G4Transform3D(*rotSiLi, positionSiLi2) ,
-            logicSiLi                        ,
-            "SiLi" + DetectorNumber               ,
-            logicVacBox                      ,
-            false                         ,
-            1);
+			PVPBuffer =  new G4PVPlacement( G4Transform3D(*rotSiLi, G4ThreeVector(0,0,0) ) 	,
+													            logicSiLi               												,
+													            Name + "_SiLi"           												,
+													            logicVacBox              												,
+													            false                    												,
+													            0												 												);
 
       // SiLi are placed inside of the VacBox...
       // Left/Right define when looking to detector from Si to CsI
-      G4double SiLi_HighY_Upper = 19.86 * mm;
-      G4double SiLi_HighY_Center = 25.39 * mm ;
-      G4double SiLi_WidthX_Left  = 22.85 * mm;
-      G4double SiLi_WidthX_Right = 24.9 * mm  ;
-      G4double SiLi_ShiftX    = 0.775 * mm ;
+      G4double SiLi_HighY_Upper 	= 19.86 * mm	;
+      G4double SiLi_HighY_Center 	= 25.39 * mm 	;
+      G4double SiLi_WidthX_Left  	= 22.85 * mm	;
+      G4double SiLi_WidthX_Right 	= 24.9	* mm  ;
+      G4double SiLi_ShiftX    		= 0.775 * mm 	;
+
+
+			//	SiLi are organized by two group of 8 Up(9 to 15) and Down(1 to 8).
+			G4ThreeVector ShiftSiLiUp 	 = G4ThreeVector(-0.25 * SiliconFace - 0.5 * SiLiSpace, 0, 0)	;
+      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);
@@ -299,58 +263,139 @@ void MUST2Array::VolumeMaker(G4int TelescopeNumber ,
 
       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_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);
+      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 = G4ThreeVector(-0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX            ,
+      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_RT = G4ThreeVector(0.5 * SiLi_WidthX_Right - SiLi_ShiftX                     ,
+			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_LC1 = G4ThreeVector(-0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX           ,
+			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_RC1 = G4ThreeVector(0.5 * SiLi_WidthX_Right - SiLi_ShiftX                     ,
+			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);
 
-      // Bottom
-      G4ThreeVector positionSiLi_LB = G4ThreeVector(-0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX            ,
+			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_RB = G4ThreeVector(0.5 * SiLi_WidthX_Right - SiLi_ShiftX                     ,
+			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_LC2 = G4ThreeVector(-0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX           ,
+			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_RC2 = G4ThreeVector(0.5 * SiLi_WidthX_Right - SiLi_ShiftX                    ,
+			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);
+  
+			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);
+
+			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);
+
+			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);
+
+			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);
+
+			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);
+
+			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);
+
+			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);
+
+			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);
+            
+			positionSiLi_RC2_down += ShiftSiLiDown ;
+            
+			
+			// up
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LT_up  , logicSiLi_LT  , Name + "_SiLi_Pad16"   , logicSiLi , false , 0)  ;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RT_up  , logicSiLi_RT  , Name + "_SiLi_Pad15"  , logicSiLi , false , 0)  ;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LC1_up , logicSiLi_LC1 , Name + "_SiLi_Pad14" 	, logicSiLi , false , 0)  ;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RC1_up , logicSiLi_RC1 , Name + "_SiLi_Pad13" 	, logicSiLi , false , 0)  ;
+
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LB_up  , logicSiLi_LB  , Name + "_SiLi_Pad9"  , logicSiLi , false , 0)  ;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RB_up  , logicSiLi_RB  , Name + "_SiLi_Pad10"  , logicSiLi , false , 0)  ;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LC2_up , logicSiLi_LC2 , Name + "_SiLi_Pad11" 	, logicSiLi , false , 0) 	;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RC2_up , logicSiLi_RC2 , Name + "_SiLi_Pad12" 	, logicSiLi , false , 0)	;
+
+			
+			// down
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LT_down  , logicSiLi_LT  , Name + "_SiLi_Pad7"  , logicSiLi , false , 0)  ;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RT_down  , logicSiLi_RT  , Name + "_SiLi_Pad8"  , logicSiLi , false , 0)  ;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LC1_down , logicSiLi_LC1 , Name + "_SiLi_Pad5" 	, logicSiLi , false , 0)  ;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RC1_down , logicSiLi_RC1 , Name + "_SiLi_Pad6" 	, logicSiLi , false , 0)  ;
+
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LB_down  , logicSiLi_LB  , Name + "_SiLi_Pad2"  , logicSiLi , false , 0)  ;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RB_down  , logicSiLi_RB  , Name + "_SiLi_Pad1"  , logicSiLi , false , 0)  ;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LC2_down , logicSiLi_LC2 , Name + "_SiLi_Pad4" 	, logicSiLi , false , 0) 	;
+      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RC2_down , logicSiLi_RC2 , Name + "_SiLi_Pad3" 	, logicSiLi , false , 0)	;
 
-      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LT  , logicSiLi_LT  , "M" + DetectorNumber + "SiLi_LT"  , logicSiLi , false , 0)  ;
-      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RT  , logicSiLi_RT  , "M" + DetectorNumber + "SiLi_RT"  , logicSiLi , false , 0)  ;
-      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LC1 , logicSiLi_LC1 , "M" + DetectorNumber + "SiLi_LC1" , logicSiLi , false , 0)   ;
-      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RC1 , logicSiLi_RC1 , "M" + DetectorNumber + "SiLi_RC1" , logicSiLi , false , 0)   ;
 
-      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LB  , logicSiLi_LB  , "M" + DetectorNumber + "SiLi_LB"  , logicSiLi , false , 0)   ;
-      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RB  , logicSiLi_RB  , "M" + DetectorNumber + "SiLi_RB"  , logicSiLi , false , 0)   ;
-      PVPBuffer = new G4PVPlacement(0 , positionSiLi_LC2 , logicSiLi_LC2 , "M" + DetectorNumber + "SiLi_LC2" , logicSiLi , false , 0) ;
-      PVPBuffer = new G4PVPlacement(0 , positionSiLi_RC2 , logicSiLi_RC2 , "M" + DetectorNumber + "SiLi_RC2" , logicSiLi , false , 0) ;
 
       logicSiLi->SetVisAttributes(G4VisAttributes(G4Colour(1, 1., 1.)));
 
@@ -366,15 +411,18 @@ void MUST2Array::VolumeMaker(G4int TelescopeNumber ,
       logicSiLi_RC2->SetSensitiveDetector(m_SiLiScorer);
 
       // Mark blue a SiLi to see telescope orientation
-      logicSiLi_LT->SetVisAttributes(G4VisAttributes(G4Colour(0, 0., 1.)));
+      logicSiLi_LT->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0)));
       logicSiLi_RT->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0)));
       logicSiLi_LC1->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0)));
       logicSiLi_RC1->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0)));
 
-      logicSiLi_LB->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0)));
+      logicSiLi_LB->SetVisAttributes(G4VisAttributes(G4Colour(0, 0, 1.)));
       logicSiLi_RB->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0)));
       logicSiLi_LC2->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0)));
       logicSiLi_RC2->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0)));
+      
+      
+      delete rotSiLi;
    }
 
 ////////////////////////////////////////////////////////////////
@@ -386,15 +434,15 @@ void MUST2Array::VolumeMaker(G4int TelescopeNumber ,
       G4ThreeVector positionCsI = G4ThreeVector(0, 0, CsI_PosZ);
       G4Trd* solidCsI = new G4Trd("csI", 0.5*CsIFaceFront, 0.5*CsIFaceBack, 0.5*CsIFaceFront, 0.5*CsIFaceBack, 0.5*CsIThickness);
 
-      G4LogicalVolume* logicCsI = new G4LogicalVolume(solidCsI, m_MaterialAluminium, "CsI" + DetectorNumber, 0, 0, 0);
-      PVPBuffer = new G4PVPlacement(0, positionCsI, logicCsI, "CsI" + DetectorNumber, logicMM, false, 0);
+      G4LogicalVolume* logicCsI = new G4LogicalVolume(solidCsI, m_MaterialAluminium, Name + "_CsI_Mylar", 0, 0, 0);
+      PVPBuffer = new G4PVPlacement(0, positionCsI, logicCsI, Name + "_CsI_Mylar", logicMM, false, 0);
 
       G4ThreeVector   positionMylarCsI = G4ThreeVector(0, 0, MylarCsIThickness * 0.5 - CsIThickness * 0.5);
 
       G4Box*           solidMylarCsI = new G4Box("MylarCsIBox", 0.5*CsIFaceFront, 0.5*CsIFaceFront, 0.5*MylarCsIThickness);
-      G4LogicalVolume* logicMylarCsI = new G4LogicalVolume(solidMylarCsI, m_MaterialMyl, "logicMylarCsI", 0, 0, 0);
+      G4LogicalVolume* logicMylarCsI = new G4LogicalVolume(solidMylarCsI, m_MaterialMyl, Name + "_CsI_Mylar", 0, 0, 0);
 
-      PVPBuffer = new G4PVPlacement(0, positionMylarCsI, logicMylarCsI, "M" + DetectorNumber + "MylarCsI", logicCsI, false, 0);
+      PVPBuffer = new G4PVPlacement(0, positionMylarCsI, logicMylarCsI, Name + "_CsI_Mylar", logicCsI, false, 0);
 
 
       logicCsI->SetVisAttributes(G4VisAttributes::Invisible);
@@ -402,43 +450,43 @@ void MUST2Array::VolumeMaker(G4int TelescopeNumber ,
 
       // Cristal1
       G4Trap* solidCristal1 = new G4Trap("Cristal1", 40.*mm / 2., 6.693896*deg, 41.97814*deg, 33.1*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 26.9*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg);
-      G4LogicalVolume* logicCristal1 = new G4LogicalVolume(solidCristal1, m_MaterialCsI, "Cristal1", 0, 0, 0);
+      G4LogicalVolume* logicCristal1 = new G4LogicalVolume(solidCristal1, m_MaterialCsI, Name + "_CsI_Cristal1", 0, 0, 0);
 
       // Cristal2
       G4Trap* solidCristal2 = new G4Trap("Cristal2", 40.*mm / 2., 17.8836*deg, (74.3122 + 180)*deg, 43.49*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 31.0377*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg);
-      G4LogicalVolume* logicCristal2 = new G4LogicalVolume(solidCristal2, m_MaterialCsI, "Cristal2", 0, 0, 0);
+      G4LogicalVolume* logicCristal2 = new G4LogicalVolume(solidCristal2, m_MaterialCsI, Name + "_CsI_Cristal2", 0, 0, 0);
 
       // Cristal3
       G4Trap* solidCristal3 = new G4Trap("Cristal3", 40.*mm / 2., 18.243*deg, 13.5988*deg, 33.11*mm / 2., 39.25*mm / 2., 39.25*mm / 2., 0.*deg, 26.91*mm / 2., 27.58*mm / 2., 27.58*mm / 2., 0.*deg);
-      G4LogicalVolume* logicCristal3 = new G4LogicalVolume(solidCristal3, m_MaterialCsI, "Cristal3", 0, 0, 0);
+      G4LogicalVolume* logicCristal3 = new G4LogicalVolume(solidCristal3, m_MaterialCsI, Name + "_CsI_Cristal3", 0, 0, 0);
 
       // Cristal4
 
       G4Trap* solidCristal4 = new G4Trap("Cristal4", 40.*mm / 2., 24.0482*deg, 44.1148*deg, 43.49*mm / 2., 39.19*mm / 2., 39.19*mm / 2., 0.*deg, 31.04*mm / 2., 27.52*mm / 2., 27.52*mm / 2., 0.*deg);
-      G4LogicalVolume* logicCristal4 = new G4LogicalVolume(solidCristal4, m_MaterialCsI, "Cristal4", 0, 0, 0);
+      G4LogicalVolume* logicCristal4 = new G4LogicalVolume(solidCristal4, m_MaterialCsI, Name + "_CsI_Cristal4", 0, 0, 0);
 
 
       // Cristal1s
 
       G4Trap* solidCristal1s = new G4Trap("Cristal1s", 40.*mm / 2., 6.693896*deg, -41.97814*deg, 33.1*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 26.9*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg);
-      G4LogicalVolume* logicCristal1s = new G4LogicalVolume(solidCristal1s, m_MaterialCsI, "Cristal1s", 0, 0, 0);
+      G4LogicalVolume* logicCristal1s = new G4LogicalVolume(solidCristal1s, m_MaterialCsI, Name + "_CsI_Cristal1s", 0, 0, 0);
 
       // Cristal2s
 
       G4Trap* solidCristal2s = new G4Trap("Cristal2s", 40.*mm / 2., 17.8836*deg, -(74.3122 + 180)*deg, 43.49*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 31.0377*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg);
-      G4LogicalVolume* logicCristal2s = new G4LogicalVolume(solidCristal2s, m_MaterialCsI, "Cristal2s", 0, 0, 0);
+      G4LogicalVolume* logicCristal2s = new G4LogicalVolume(solidCristal2s, m_MaterialCsI, Name + "_CsI_Cristal2s", 0, 0, 0);
 
       // Cristal3s
 
       G4Trap* solidCristal3s = new G4Trap("Cristal3s", 40.*mm / 2., 18.243*deg, -13.5988*deg, 33.11*mm / 2., 39.25*mm / 2., 39.25*mm / 2., 0.*deg, 26.91*mm / 2., 27.58*mm / 2., 27.58*mm / 2., 0.*deg);
-      G4LogicalVolume* logicCristal3s = new G4LogicalVolume(solidCristal3s, m_MaterialCsI, "Cristal3s", 0, 0, 0);
+      G4LogicalVolume* logicCristal3s = new G4LogicalVolume(solidCristal3s, m_MaterialCsI, Name + "_CsI_Cristal3s", 0, 0, 0);
 
       // Cristal4s
 
       G4Trap* solidCristal4s = new G4Trap("Cristal4s", 40.*mm / 2., 24.0482*deg, -44.1148*deg, 43.49*mm / 2., 39.19*mm / 2., 39.19*mm / 2., 0.*deg, 31.04*mm / 2., 27.52*mm / 2., 27.52*mm / 2., 0.*deg);
-      G4LogicalVolume* logicCristal4s = new G4LogicalVolume(solidCristal4s, m_MaterialCsI, "Cristal4s", 0, 0, 0);
+      G4LogicalVolume* logicCristal4s = new G4LogicalVolume(solidCristal4s, m_MaterialCsI, Name + "_CsI_Cristal4s", 0, 0, 0);
       //to see telescope orientation
-      G4LogicalVolume* logicCristal4sbis = new G4LogicalVolume(solidCristal4s, m_MaterialCsI, "Cristal4s", 0, 0, 0);
+      G4LogicalVolume* logicCristal4sbis = new G4LogicalVolume(solidCristal4s, m_MaterialCsI, Name + "_CsI_Cristal4s", 0, 0, 0);
 
 
       G4double XEdge1 = 16.96 * mm + DistInterCsI * 0.5;
@@ -451,10 +499,10 @@ void MUST2Array::VolumeMaker(G4int TelescopeNumber ,
       G4ThreeVector positionCristal3 = G4ThreeVector(-XEdge2, YEdge1, 0);
       G4ThreeVector positionCristal4 = G4ThreeVector(-XEdge2, YEdge2, 0);
 
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal1, logicCristal1, "M" + DetectorNumber + "Cristal1", logicCsI, false, 1);
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal2, logicCristal2, "M" + DetectorNumber + "Cristal2", logicCsI, false, 2);
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal3, logicCristal3, "M" + DetectorNumber + "Cristal3", logicCsI, false, 3);
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal4, logicCristal4, "M" + DetectorNumber + "Cristal4", logicCsI, false, 4);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal1, logicCristal1, Name + "_CsI_Cristal1", logicCsI, false, 1);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal2, logicCristal2, Name + "_CsI_Cristal2", logicCsI, false, 2);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal3, logicCristal3, Name + "_CsI_Cristal3", logicCsI, false, 3);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal4, logicCristal4, Name + "_CsI_Cristal4", logicCsI, false, 4);
 
 
       G4ThreeVector positionCristal1b = G4ThreeVector(XEdge1, -YEdge1, 0 * mm);
@@ -462,30 +510,30 @@ void MUST2Array::VolumeMaker(G4int TelescopeNumber ,
       G4ThreeVector positionCristal3b = G4ThreeVector(XEdge2, -YEdge1, 0);
       G4ThreeVector positionCristal4b = G4ThreeVector(XEdge2, -YEdge2, 0);
 
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal1b, logicCristal1, "M" + DetectorNumber + "Cristal5", logicCsI, false, 5);
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal2b, logicCristal2, "M" + DetectorNumber + "Cristal6", logicCsI, false, 6);
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal3b, logicCristal3, "M" + DetectorNumber + "Cristal7", logicCsI, false, 7);
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal4b, logicCristal4, "M" + DetectorNumber + "Cristal8", logicCsI, false, 8);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal1b, logicCristal1, Name + "_CsI_Cristal5", logicCsI, false, 5);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal2b, logicCristal2, Name + "_CsI_Cristal6", logicCsI, false, 6);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal3b, logicCristal3, Name + "_CsI_Cristal7", logicCsI, false, 7);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal4b, logicCristal4, Name + "_CsI_Cristal8", logicCsI, false, 8);
 
       G4ThreeVector positionCristal1s = G4ThreeVector(-XEdge1, -YEdge1, 0 * mm);
       G4ThreeVector positionCristal2s = G4ThreeVector(-XEdge1, -YEdge2, 0);
       G4ThreeVector positionCristal3s = G4ThreeVector(-XEdge2, -YEdge1, 0);
       G4ThreeVector positionCristal4s = G4ThreeVector(-XEdge2, -YEdge2, 0);
 
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal1s, logicCristal1s, "M" + DetectorNumber + "Cristal9", logicCsI, false, 9);
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal2s, logicCristal2s, "M" + DetectorNumber + "Cristal10", logicCsI, false, 10);
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal3s, logicCristal3s, "M" + DetectorNumber + "Cristal11", logicCsI, false, 11);
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal4s, logicCristal4sbis, "M" + DetectorNumber + "Cristal12", logicCsI, false, 12);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal1s, logicCristal1s, Name + "_CsI_Cristal9", logicCsI, false, 9);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal2s, logicCristal2s, Name + "_CsI_Cristal10", logicCsI, false, 10);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal3s, logicCristal3s, Name + "_CsI_Cristal11", logicCsI, false, 11);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 0.), positionCristal4s, logicCristal4sbis, Name + "_CsI_Cristal12", logicCsI, false, 12);
 
       G4ThreeVector positionCristal1sb = G4ThreeVector(XEdge1, YEdge1, 0 * mm);
       G4ThreeVector positionCristal2sb = G4ThreeVector(XEdge1, YEdge2, 0);
       G4ThreeVector positionCristal3sb = G4ThreeVector(XEdge2, YEdge1, 0);
       G4ThreeVector positionCristal4sb = G4ThreeVector(XEdge2, YEdge2, 0);
 
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal1sb, logicCristal1s, "M" + DetectorNumber + "Cristal13", logicCsI, false, 13);
-      PVPBuffer = new G4PVPlacement(Rotation(180, 0, 0), positionCristal2sb, logicCristal2s, "M" + DetectorNumber + "Cristal14", logicCsI, false, 14);
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal3sb, logicCristal3s, "M" + DetectorNumber + "Cristal15", logicCsI, false, 15);
-      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal4sb, logicCristal4s, "M" + DetectorNumber + "Cristal16", logicCsI, false, 16);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal1sb, logicCristal1s, Name + "_CsI_Cristal13", logicCsI, false, 13);
+      PVPBuffer = new G4PVPlacement(Rotation(180, 0, 0), positionCristal2sb, logicCristal2s, Name + "_CsI_Cristal14", logicCsI, false, 14);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal3sb, logicCristal3s, Name + "_CsI_Cristal15", logicCsI, false, 15);
+      PVPBuffer = new G4PVPlacement(Rotation(180., 0., 180.), positionCristal4sb, logicCristal4s, Name + "_CsI_Cristal16", logicCsI, false, 16);
 
       ///Set CsI sensible
       logicCristal1->SetSensitiveDetector(m_CsIScorer);
@@ -812,15 +860,15 @@ void MUST2Array::ReadConfiguration(string Path)
 // Called After DetecorConstruction::AddDetector Method
 void MUST2Array::ConstructDetector(G4LogicalVolume* world)
 {
-   G4RotationMatrix* MMrot  	= NULL              		;
-   G4ThreeVector     MMpos  	= G4ThreeVector(0, 0, 0) 	;
+   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           	 Si     	= true           			;
-   bool          	 SiLi   	= true           			;
-   bool           	 CsI    	= true           			;
+   G4ThreeVector     MMCenter 	= G4ThreeVector(0, 0, 0)  ;
+   bool           	 Si     		= true           					;
+   bool          	 	 SiLi   		= true           					;
+   bool           	 CsI    		= true           					;
 
    G4int             NumberOfTelescope = m_DefinitionType.size() ;
 
@@ -923,102 +971,115 @@ void MUST2Array::ReadSensitive(const G4Event* event)
 
 // 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, G4double*>::iterator X_itr       		;
-	std::map<G4int, G4double*>::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 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       	;
 	
-	G4THitsMap<G4int>*	  DetectorNumberHitMap				;      
-	G4THitsMap<G4double>* EnergyHitMap              		;
-	G4THitsMap<G4double>* TimeHitMap             			;
-	G4THitsMap<G4double>* XHitMap                			;	
-	G4THitsMap<G4double>* YHitMap               			;
-	G4THitsMap<G4double>* PosXHitMap                		;
-	G4THitsMap<G4double>* PosYHitMap                		;
-	G4THitsMap<G4double>* PosZHitMap                		;
-	G4THitsMap<G4double>* AngThetaHitMap                	;
-	G4THitsMap<G4double>* AngPhiHitMap                		;
-
-// NULL pointer are given to avoid warning at compilation
+	G4THitsMap<G4int>*	  DetectorNumberHitMap							;      
+	G4THitsMap<G4double>* EnergyHitMap              				;
+	G4THitsMap<G4double>* TimeHitMap             						;
+	G4THitsMap<G4int>* XHitMap                						;	
+	G4THitsMap<G4int>* YHitMap               						;
+	G4THitsMap<G4double>* PosXHitMap                				;
+	G4THitsMap<G4double>* PosYHitMap                				;
+	G4THitsMap<G4double>* PosZHitMap                				;
+	G4THitsMap<G4double>* AngThetaHitMap               			;
+	G4THitsMap<G4double>* AngPhiHitMap                			;
 
 // Si(Li)
    std::map<G4int, G4double*>::iterator SiLiEnergy_itr 		;
-   G4THitsMap<G4double>* 				SiLiEnergyHitMap	;
+   std::map<G4int, G4int*>::iterator SiLiPadNbr_itr 		;
+   G4THitsMap<G4double>* 				SiLiEnergyHitMap					;
+   G4THitsMap<G4int>* 				SiLiPadNbrHitMap					;
+   
 // CsI
    std::map<G4int, G4double*>::iterator CsIEnergy_itr  		;
-   G4THitsMap<G4double>* 				CsIEnergyHitMap 	;
+   std::map<G4int, G4int*>::iterator CsICristalNbr_itr ;
+   G4THitsMap<G4double>* 				CsIEnergyHitMap 					;
+   G4THitsMap<G4int>* 				CsICristalNbrHitMap 			;
 //////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////
 
     // Read the Scorer associate to the Silicon Strip
     
 	    //Detector Number
-	    G4int StripDetCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("StripScorer/DetectorNumber")  	;
-	    DetectorNumberHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripDetCollectionID))       	;
-	    DetectorNumber_itr =  DetectorNumberHitMap->GetMap()->begin()                                               ;
+	    G4int StripDetCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/DetectorNumber") 		;
+	    DetectorNumberHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripDetCollectionID))       				;
+	    DetectorNumber_itr =  DetectorNumberHitMap->GetMap()->begin()                                               			;
 	    
 	    //Energy
-	    G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("StripScorer/StripEnergy")   ;
-	    EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID))           ;
-	    Energy_itr = EnergyHitMap->GetMap()->begin()                                                          		;
+	    G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripEnergy") 		;
+	    EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID))           			;
+	    Energy_itr = EnergyHitMap->GetMap()->begin()                                                          						;
 
 	    //Time of Flight
-	    G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("StripScorer/StripTime")    	;
-	    TimeHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID))               ;
-	    Time_itr = TimeHitMap->GetMap()->begin()                                                              		;
+	    G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripTime")    		;
+	    TimeHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID))               			;
+	    Time_itr = TimeHitMap->GetMap()->begin()                                                              						;
 
 	    //Strip Number X
-	    G4int StripXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("StripScorer/StripNumberX")    	;
-	    XHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripXCollectionID))                     ;
-	    X_itr = XHitMap->GetMap()->begin()                                                                    		;
+	    G4int StripXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripNumberX")    		;
+	    XHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripXCollectionID))                     			;
+	    X_itr = XHitMap->GetMap()->begin()                                                                    						;
 
 	    //Strip Number Y
-	    G4int StripYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("StripScorer/StripNumberY")    	;
-	    YHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripYCollectionID))                     ;
-	    Y_itr = YHitMap->GetMap()->begin()                                                                    		;
+	    G4int StripYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripNumberY")    		;
+	    YHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripYCollectionID))                     			;
+	    Y_itr = YHitMap->GetMap()->begin()                                                                    						;
 
 	    //Interaction Coordinate X
-	    G4int InterCoordXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("StripScorer/InterCoordX")    ;
-	    PosXHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordXCollectionID))              ;
-	    Pos_X_itr = PosXHitMap->GetMap()->begin()                                                                    ;
+	    G4int InterCoordXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordX")    ;
+	    PosXHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordXCollectionID))              			;
+	    Pos_X_itr = PosXHitMap->GetMap()->begin()                                                                   			;
 
 	    //Interaction Coordinate Y
-	    G4int InterCoordYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("StripScorer/InterCoordY")    ;
-	    PosYHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordYCollectionID))              ;
-	    Pos_Y_itr = PosYHitMap->GetMap()->begin()                                                                    ;
+	    G4int InterCoordYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordY")    ;
+	    PosYHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordYCollectionID))             		 	;
+	    Pos_Y_itr = PosYHitMap->GetMap()->begin()                                                                  			  ;
 
 	    //Interaction Coordinate Z
-	    G4int InterCoordZCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("StripScorer/InterCoordZ")    ;
-	    PosZHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordZCollectionID))              ;
-	    Pos_Z_itr = PosXHitMap->GetMap()->begin()                                                                    ;
+	    G4int InterCoordZCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordZ")    ;
+	    PosZHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordZCollectionID))              			;
+	    Pos_Z_itr = PosXHitMap->GetMap()->begin()                                                                    			;
 
 	    //Interaction Coordinate Angle Theta
-	    G4int InterCoordAngThetaCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("StripScorer/InterCoordAngTheta")    	;
+	    G4int InterCoordAngThetaCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordAngTheta");
 	    AngThetaHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordAngThetaCollectionID))                 	;
-	    Ang_Theta_itr = AngThetaHitMap->GetMap()->begin()                                                                    		;
+	    Ang_Theta_itr = AngThetaHitMap->GetMap()->begin()                                                                    				;
 
 	    //Interaction Coordinate Angle Phi
-	    G4int InterCoordAngPhiCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("StripScorer/InterCoordAngPhi")    		;	
-	    AngPhiHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordAngPhiCollectionID))						;
-	    Ang_Phi_itr = AngPhiHitMap->GetMap()->begin()																				;			
+	    G4int InterCoordAngPhiCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordAngPhi")   	;	
+	    AngPhiHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordAngPhiCollectionID))											;
+	    Ang_Phi_itr = AngPhiHitMap->GetMap()->begin()																																								;			
 
     // Read the Scorer associate to the SiLi
         //Energy
-        G4int SiLiEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("SiLiScorer/SiLiEnergy")   ;
-        SiLiEnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(SiLiEnergyCollectionID))     ;
-        SiLiEnergy_itr = SiLiEnergyHitMap->GetMap()->begin()                                                     ;
-
+        G4int SiLiEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiEnergy")   						;
+        SiLiEnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(SiLiEnergyCollectionID))    		 							;
+        SiLiEnergy_itr = SiLiEnergyHitMap->GetMap()->begin()                                                     									;
 
+        G4int SiLiPadNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiPadNbr")   						;
+        SiLiPadNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(SiLiPadNbrCollectionID))    		 							;
+        SiLiPadNbr_itr = SiLiPadNbrHitMap->GetMap()->begin()                                                     									;
+        
     // Read the Scorer associate to the CsI crystal
         //Energy
-        G4int CsIEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("CsIScorer/CsIEnergy")      ;
-        CsIEnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(CsIEnergyCollectionID))       ;
-        CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin()                                                       ;
+        G4int CsIEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsIEnergy")     		  				;
+        CsIEnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(CsIEnergyCollectionID))      									;
+        CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin()                                                       									;
+        
+        G4int CsICristalNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsICristalNbr")     		 	;
+        CsICristalNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(CsICristalNbrCollectionID))      					;
+        CsICristalNbr_itr = CsICristalNbrHitMap->GetMap()->begin()                                                       					;
+
+
+/////////////////////
 
   	G4int sizeN = DetectorNumberHitMap->entries() 	;
     G4int sizeE = EnergyHitMap->entries() 			;
@@ -1026,55 +1087,55 @@ void MUST2Array::ReadSensitive(const G4Event* event)
     G4int sizeX = XHitMap->entries()      			;
     G4int sizeY = YHitMap->entries()    			;
 
-    // Loop on Strip energy
-    for (G4int l = 0 ; l < sizeE ; l++) {
-        G4int ETrackID  =   Energy_itr->first     ;
-        G4double E     = *(Energy_itr->second)    ;
-        G4int N = 0								  ;
+ // Loop on Telescope Number entry
+    for (G4int l = 0 ; l < sizeN ; l++) {
+        G4int N     =      *(DetectorNumber_itr->second)    ;
+        G4int NTrackID  =   DetectorNumber_itr->first - N  ;
         
-        if (E > 0) {
+      
+        if (N > 0) {
         
-	        m_Event->SetMMStripXEEnergy(RandGauss::shoot(E, ResoStrip))    ;
-	        m_Event->SetMMStripYEEnergy(RandGauss::shoot(E, ResoStrip))    ;
-
-			//  Detector Number
-	        DetectorNumber_itr = DetectorNumberHitMap->GetMap()->begin();
-	        for (G4int h = 0 ; h < sizeN ; h++) {
-	            G4int NTrackID  =   DetectorNumber_itr->first       ;
-	            G4double Nl     = *(DetectorNumber_itr->second)      ;
-
-	            if (NTrackID == ETrackID) {
-	            	N = Nl ;
-	                m_Event->SetMMStripXEDetectorNbr(N) ;
-	                m_Event->SetMMStripYEDetectorNbr(N) ;
-	                m_Event->SetMMStripXTDetectorNbr(N) ;
-	                m_Event->SetMMStripYTDetectorNbr(N) ;
+	         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))    ;
 	            }
 	            
-	            else { N = 0 ;}
-	            DetectorNumber_itr++;
-	        }
+	            Energy_itr++;
+	        	}
 
 
 	        //  Time
 	        Time_itr = TimeHitMap->GetMap()->begin();
 	        for (G4int h = 0 ; h < sizeT ; h++) {
-	            G4int TTrackID  =   Time_itr->first       ;
+	            G4int TTrackID  =   Time_itr->first   - N    ;
 	            G4double T     = *(Time_itr->second)      ;
 
-	            if (TTrackID == ETrackID) {
+	            if (TTrackID == NTrackID) {
 	                m_Event->SetMMStripXTTime(RandGauss::shoot(T, ResoTimeMust)) ;
 	                m_Event->SetMMStripYTTime(RandGauss::shoot(T, ResoTimeMust)) ;
 	            }
+	            
 	            Time_itr++;
 	        }
 
-	        // X
+
+					// X
 	        X_itr = XHitMap->GetMap()->begin();
 	        for (G4int h = 0 ; h < sizeX ; h++) {
-	            G4int XTrackID  =   X_itr->first     ;
-	            G4double X     = *(X_itr->second)      ;
-	            if (XTrackID == ETrackID) {
+	            G4int XTrackID  =   X_itr->first  - N   ;
+	            G4int X     = *(X_itr->second)      ;
+	            if (XTrackID == NTrackID) {
 	                m_Event->SetMMStripXEStripNbr(X)   ;
 	                m_Event->SetMMStripXTStripNbr(X)   ;
 	            }
@@ -1085,9 +1146,9 @@ void MUST2Array::ReadSensitive(const G4Event* event)
 	        // Y
 	        Y_itr = YHitMap->GetMap()->begin()  ;
 	        for (G4int h = 0 ; h < sizeY ; h++) {
-	            G4int YTrackID  =   Y_itr->first    ;
-	            G4double Y     = *(Y_itr->second)      ;
-	            if (YTrackID == ETrackID) {
+	            G4int YTrackID  =   Y_itr->first  - N  ;
+	            G4int Y     = *(Y_itr->second)      ;
+	            if (YTrackID == NTrackID) {
 	                m_Event->SetMMStripYEStripNbr(Y)   ;
 	                m_Event->SetMMStripYTStripNbr(Y)   ;
 	            }
@@ -1098,9 +1159,9 @@ void MUST2Array::ReadSensitive(const G4Event* event)
 	        // Pos X
 	        Pos_X_itr = PosXHitMap->GetMap()->begin();
 	        for (G4int h = 0 ; h < sizeX ; h++) {
-	            G4int PosXTrackID =   Pos_X_itr->first     ;
+	            G4int PosXTrackID =   Pos_X_itr->first  - N   ;
 	            G4double PosX     = *(Pos_X_itr->second)      ;
-	            if (PosXTrackID == ETrackID) {
+	            if (PosXTrackID == NTrackID) {
 	                ms_InterCoord->SetDetectedPositionX(PosX) ;
 	            }
 	            Pos_X_itr++;
@@ -1109,9 +1170,9 @@ void MUST2Array::ReadSensitive(const G4Event* event)
 	        // Pos Y
 	        Pos_Y_itr = PosYHitMap->GetMap()->begin();
 	        for (G4int h = 0 ; h < sizeX ; h++) {
-	            G4int PosYTrackID =   Pos_Y_itr->first     ;
+	            G4int PosYTrackID =   Pos_Y_itr->first  - N   ;
 	            G4double PosY     = *(Pos_Y_itr->second)      ;
-	            if (PosYTrackID == ETrackID) {
+	            if (PosYTrackID == NTrackID) {
 	                ms_InterCoord->SetDetectedPositionY(PosY) ;
 	            }
 	            Pos_Y_itr++;
@@ -1120,9 +1181,9 @@ void MUST2Array::ReadSensitive(const G4Event* event)
 	        // Pos Z
 	        Pos_Z_itr = PosZHitMap->GetMap()->begin();
 	        for (G4int h = 0 ; h < sizeX ; h++) {
-	            G4int PosZTrackID =   Pos_Z_itr->first     ;
+	            G4int PosZTrackID =   Pos_Z_itr->first   - N  ;
 	            G4double PosZ     = *(Pos_Z_itr->second)      ;
-	            if (PosZTrackID == ETrackID) {
+	            if (PosZTrackID == NTrackID) {
 	                ms_InterCoord->SetDetectedPositionZ(PosZ) ;
 	            }
 	            Pos_Z_itr++;
@@ -1131,9 +1192,9 @@ void MUST2Array::ReadSensitive(const G4Event* event)
 	        // Angle Theta
 	        Ang_Theta_itr = AngThetaHitMap->GetMap()->begin();
 	        for (G4int h = 0 ; h < sizeX ; h++) {
-	            G4int AngThetaTrackID =   Ang_Theta_itr->first     ;
+	            G4int AngThetaTrackID =   Ang_Theta_itr->first  - N   ;
 	            G4double AngTheta     = *(Ang_Theta_itr->second)      ;
-	            if (AngThetaTrackID == ETrackID) {
+	            if (AngThetaTrackID == NTrackID) {
 	                ms_InterCoord->SetDetectedAngleTheta(AngTheta) ;
 	            }
 	            Ang_Theta_itr++;
@@ -1142,72 +1203,83 @@ void MUST2Array::ReadSensitive(const G4Event* event)
 	        // Angle Phi
 	        Ang_Phi_itr = AngPhiHitMap->GetMap()->begin();
 	        for (G4int h = 0 ; h < sizeX ; h++) {
-	            G4int AngPhiTrackID =   Ang_Phi_itr->first     ;
+	            G4int AngPhiTrackID =   Ang_Phi_itr->first  - N   ;
 	            G4double AngPhi     = *(Ang_Phi_itr->second)      ;
-	            if (AngPhiTrackID == ETrackID) {
+	            if (AngPhiTrackID == NTrackID) {
 	                ms_InterCoord->SetDetectedAnglePhi(AngPhi) ;
 	            }
 	            Ang_Phi_itr++;
 	        }
 
-	        // Si(Li)
 
+					// 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  ;
+	            G4int SiLiEnergyTrackID =   SiLiEnergy_itr->first  -N ;
 	            G4double SiLiEnergy     = *(SiLiEnergy_itr->second)   ;
 
-	            if (SiLiEnergyTrackID == ETrackID) {
+							G4int PadNbr = *(SiLiPadNbr_itr->second)   ;
+
+	            if (SiLiEnergyTrackID == NTrackID) {
 	                m_Event->SetMMSiLiEEnergy(RandGauss::shoot(SiLiEnergy, ResoSiLi)) ;
-	                m_Event->SetMMSiLiEPadNbr(1);
-	                m_Event->SetMMSiLiTPadNbr(1);
+	                m_Event->SetMMSiLiEPadNbr(PadNbr);
+	                m_Event->SetMMSiLiTPadNbr(PadNbr);
 	                m_Event->SetMMSiLiTTime(1);
 	                m_Event->SetMMSiLiTDetectorNbr(N);
 	                m_Event->SetMMSiLiEDetectorNbr(N);
 	            }
 
-	            SiLiEnergy_itr++;
+	            SiLiEnergy_itr++	;
+	            SiLiPadNbr_itr++	;
 	        }
 	        
 
-	        // CsI
-	      
-	        CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin()  ;
+	        // CsI    
+	        CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin()  				;
+	        CsICristalNbr_itr = CsICristalNbrHitMap->GetMap()->begin()  ;
+	        
 	        for (G4int h = 0 ; h < CsIEnergyHitMap->entries() ; h++) {
-	            G4int CsIEnergyTrackID  =   CsIEnergy_itr->first      ;
-	            G4double CsIEnergy      = *(CsIEnergy_itr->second)    ;
-
-	            if (CsIEnergyTrackID == ETrackID) {
+	            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(1);
-	                m_Event->SetMMCsITCristalNbr(1);
+	                m_Event->SetMMCsIECristalNbr(CristalNumber);
+	                m_Event->SetMMCsITCristalNbr(CristalNumber);
 	                m_Event->SetMMCsITTime(1);
 	                m_Event->SetMMCsITDetectorNbr(N);
 	                m_Event->SetMMCsIEDetectorNbr(N);
 	            }
 
-	            CsIEnergy_itr++;
+	            CsIEnergy_itr++			;
+	            CsICristalNbr_itr++	;
 	        }
-	        
+
+
 
         }
 
-        Energy_itr++;
+        DetectorNumber_itr++;
     }
     
     // clear map for next event
-    DetectorNumberHitMap              ->clear();
-    EnergyHitMap   		->clear() ;
-    TimeHitMap     		->clear() ;
-    XHitMap        		->clear() ;
-    YHitMap        		->clear() ;
-    CsIEnergyHitMap		->clear() ;
-    SiLiEnergyHitMap	->clear() ;
-    PosXHitMap			->clear() ; 
-    PosYHitMap			->clear() ;
-    PosZHitMap			->clear() ;
-    AngThetaHitMap		->clear() ;
-    AngPhiHitMap		->clear() ;
+    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() ;
      
 }
 
@@ -1216,19 +1288,21 @@ void MUST2Array::ReadSensitive(const G4Event* event)
 void MUST2Array::InitializeScorers() 
 	{ 
 		//	Silicon Associate Scorer
-		m_StripScorer = new G4MultiFunctionalDetector("StripScorer");
+		m_StripScorer = new G4MultiFunctionalDetector("MUST2_StripScorer");
+		
+		G4VPrimitiveScorer* DetNbr 														= new GENERALSCORERS::PSDetectorNumber("DetectorNumber","MUST2Telescope", 0)             						;
+		G4VPrimitiveScorer* Energy 														= new GENERALSCORERS::PSEnergy("StripEnergy","MUST2Telescope", 0)             											;			
+		G4VPrimitiveScorer* TOF 															= new GENERALSCORERS::PSTOF("StripTime","MUST2Telescope", 0)                  											;          					 		 
+		
+		G4VPrimitiveScorer* StripPositionX										= new PSStripNumberX("StripNumberX", 0, SiliconFace, 128)  																					;
+		G4VPrimitiveScorer* StripPositionY										= new PSStripNumberY("StripNumberY", 0, SiliconFace, 128)   																				;  		
+
+		G4VPrimitiveScorer* InteractionCoordinatesX 					= new GENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","MUST2Telescope", 0) 									;
+		G4VPrimitiveScorer* InteractionCoordinatesY						= new GENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","MUST2Telescope", 0) 									;
+		G4VPrimitiveScorer* InteractionCoordinatesZ  					= new GENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","MUST2Telescope", 0) 									;	 		 
+		G4VPrimitiveScorer* InteractionCoordinatesAngleTheta	= new GENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordAngTheta","MUST2Telescope", 0) 	;
+		G4VPrimitiveScorer* InteractionCoordinatesAnglePhi    = new GENERALSCORERS::PSInteractionCoordinatesAnglePhi("InterCoordAngPhi","MUST2Telescope", 0) 			;	    
 		
-		G4VPrimitiveScorer* DetNbr 								= new MUST2::PSDetectorNumber("DetectorNumber", 0, "Silicon")             	;
-		G4VPrimitiveScorer* Energy 								= new PSStripE("StripEnergy", 0)             						;
-		G4VPrimitiveScorer* TOF 								= new PSTOF("StripTime", 0)                  						;          					 
-		G4VPrimitiveScorer* StripPositionX						= new PSStripNumberX("StripNumberX", 0, SiliconFace, 128)  			;
-		G4VPrimitiveScorer* StripPositionY						= new PSStripNumberY("StripNumberY", 0, SiliconFace, 128)   		;  				 
-		G4VPrimitiveScorer* InteractionCoordinatesX 			= new PSInteractionCoordinatesX("InterCoordX", 0) 					;
-		G4VPrimitiveScorer* InteractionCoordinatesY				= new PSInteractionCoordinatesY("InterCoordY", 0) 					;
-		G4VPrimitiveScorer* InteractionCoordinatesZ  			= new PSInteractionCoordinatesZ("InterCoordZ", 0) 					;	 		 
-		G4VPrimitiveScorer* InteractionCoordinatesAngleTheta	= new PSInteractionCoordinatesAngleTheta("InterCoordAngTheta", 0) 	;
-		G4VPrimitiveScorer* InteractionCoordinatesAnglePhi    	= new PSInteractionCoordinatesAnglePhi("InterCoordAngPhi", 0) 		;	    
-	  	
 	  	
 		//and register it to the multifunctionnal detector
 		m_StripScorer->RegisterPrimitive(DetNbr)             				;
@@ -1243,14 +1317,18 @@ void MUST2Array::InitializeScorers()
 		m_StripScorer->RegisterPrimitive(InteractionCoordinatesAnglePhi) 	;
 	  	
 	  	//	SiLi Associate Scorer
-	  	m_SiLiScorer	= new G4MultiFunctionalDetector("SiLiScorer")			;
-	    G4VPrimitiveScorer* SiLiEnergy 			= new PSStripE("SiLiEnergy", 0) ;
-		m_SiLiScorer->RegisterPrimitive(SiLiEnergy) 							;
+	  	m_SiLiScorer	= new G4MultiFunctionalDetector("MUST2_SiLiScorer")			;
+	    G4VPrimitiveScorer* SiLiEnergy 			= new GENERALSCORERS::PSEnergy("SiLiEnergy","MUST2Telescope", 0) ;
+	    G4VPrimitiveScorer* SiLiPadNbr 			= new PSPadOrCristalNumber("SiLiPadNbr",0) ;
+			m_SiLiScorer->RegisterPrimitive(SiLiEnergy) 							;
+			m_SiLiScorer->RegisterPrimitive(SiLiPadNbr) 							;
 	   
 	    //	CsI Associate Scorer 
-	    m_CsIScorer	= new G4MultiFunctionalDetector("CsIScorer")				;
-	    G4VPrimitiveScorer* CsIEnergy 			= new PSStripE("CsIEnergy", 0) 	;
+	    m_CsIScorer	= new G4MultiFunctionalDetector("MUST2_CsIScorer")				;
+	    G4VPrimitiveScorer* CsIEnergy 			= new GENERALSCORERS::PSEnergy("CsIEnergy","MUST2Telescope", 0) 	;
+	    G4VPrimitiveScorer* CsICristalNbr 	= new PSPadOrCristalNumber("CsICristalNbr",0) ;
 	    m_CsIScorer->RegisterPrimitive(CsIEnergy)								;
+	    m_CsIScorer->RegisterPrimitive(CsICristalNbr)						;
 	    
 	    //	Add All Scorer to the Global Scorer Manager
 	    G4SDManager::GetSDMpointer()->AddNewDetector(m_StripScorer) ;
diff --git a/NPSimulation/src/Must2Scorers.cc b/NPSimulation/src/Must2Scorers.cc
index 685781f4d40152b13c6470a36c4ac7ba11500f0c..2b057adf11486a6508e9239bc808b555e870b688 100644
--- a/NPSimulation/src/Must2Scorers.cc
+++ b/NPSimulation/src/Must2Scorers.cc
@@ -24,78 +24,10 @@
  *****************************************************************************/
 #include "Must2Scorers.hh"
 #include "G4UnitsTable.hh"
+#include "GeneralScorers.hh"
 #include <string>
 using namespace MUST2 ;
 
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-// Added by Adrien MATTA:
-// Those Scorer use TrackID as map index. This way ones can rebuild energy deposit,
-// time of flight or position,... particle by particle for each event. Because standard
-// scorer provide by G4 don't work this way but using a global ID for each event you should
-// not use those scorer with some G4 provided ones or being very carefull doing so.
-
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-//Strip Energy Scorer (deal with multiple particle hit)
-
-PSStripE::PSStripE(G4String name, G4int depth)
-      : G4VPrimitiveScorer(name, depth), HCID(-1)
-{
-   ;
-}
-
-PSStripE::~PSStripE()
-{
-   ;
-}
-
-G4bool PSStripE::ProcessHits(G4Step* aStep, G4TouchableHistory*)
-{
-   G4double edep = aStep->GetTotalEnergyDeposit();
-   if (edep < 100*keV) return FALSE;
-   G4int  index = aStep->GetTrack()->GetTrackID();
-   EvtMap->add(index, edep);
-   return TRUE;
-}
-
-void PSStripE::Initialize(G4HCofThisEvent* HCE)
-{
-   EvtMap = new G4THitsMap<G4double>(GetMultiFunctionalDetector()->GetName(), GetName());
-   if (HCID < 0) {
-      HCID = GetCollectionID(0);
-   }
-   HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap);
-}
-
-void PSStripE::EndOfEvent(G4HCofThisEvent*)
-{
-   ;
-}
-
-void PSStripE::clear()
-{
-   EvtMap->clear();
-}
-
-void PSStripE::DrawAll()
-{
-   ;
-}
-
-void PSStripE::PrintAll()
-{
-   G4cout << " MultiFunctionalDet  " << detector->GetName() << G4endl;
-   G4cout << " PrimitiveScorer " << GetName() << G4endl;
-   G4cout << " Number of entries " << EvtMap->entries() << G4endl;
-   std::map<G4int, G4double*>::iterator itr = EvtMap->GetMap()->begin();
-   for (; itr != EvtMap->GetMap()->end(); itr++) {
-      G4cout << "  copy no.: " << itr->first
-      << "  energy deposit: " << G4BestUnit(*(itr->second), "Energy")
-      << G4endl;
-   }
-}
-
-
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 //Strip position Scorer
@@ -103,8 +35,9 @@ void PSStripE::PrintAll()
 PSStripNumberX::PSStripNumberX(G4String name, G4int depth, G4double StripPlaneSize, G4int NumberOfStrip)
       : G4VPrimitiveScorer(name, depth), HCID(-1)
 {
-   m_StripPlaneSize =   StripPlaneSize ;
-   m_NumberOfStrip    = NumberOfStrip  ;
+   m_StripPlaneSize = StripPlaneSize ;
+   m_NumberOfStrip  = NumberOfStrip  ;
+	 m_StripPitch			= m_StripPlaneSize / m_NumberOfStrip;
 }
 
 PSStripNumberX::~PSStripNumberX()
@@ -114,25 +47,25 @@ PSStripNumberX::~PSStripNumberX()
 
 G4bool PSStripNumberX::ProcessHits(G4Step* aStep, G4TouchableHistory*)
 {
+	 int DetNbr = GENERALSCORERS::PickUpDetectorNumber(aStep, "MUST2Telescope");
+
    G4ThreeVector POS  = aStep->GetPreStepPoint()->GetPosition();
    POS = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(POS);
 
-   G4double StripPitch = m_StripPlaneSize / m_NumberOfStrip;
-
-   G4double temp = (POS(0) + m_StripPlaneSize / 2.) / StripPitch   ;
-   G4double X = int(temp) + 1 ;
+   G4double temp = (POS(0) + m_StripPlaneSize / 2.) / m_StripPitch   ;
+   G4int X = int(temp) + 1 ;
    //Rare case where particle is close to edge of silicon plan
-   if (X == 129) X = 128;
+   if (X == m_NumberOfStrip+1) X = m_NumberOfStrip;
    G4double edep = aStep->GetTotalEnergyDeposit();
    if (edep < 100*keV) return FALSE;
    G4int  index =  aStep->GetTrack()->GetTrackID();
-   EvtMap->set(index, X);
+   EvtMap->set(index+DetNbr, X);
    return TRUE;
 }
 
 void PSStripNumberX::Initialize(G4HCofThisEvent* HCE)
 {
-   EvtMap = new G4THitsMap<G4double>(GetMultiFunctionalDetector()->GetName(), GetName());
+   EvtMap = new G4THitsMap<G4int>(GetMultiFunctionalDetector()->GetName(), GetName());
    if (HCID < 0) {
       HCID = GetCollectionID(0);
    }
@@ -169,6 +102,7 @@ PSStripNumberY::PSStripNumberY(G4String name, G4int depth, G4double StripPlaneSi
 {
    m_StripPlaneSize =   StripPlaneSize ;
    m_NumberOfStrip    = NumberOfStrip  ;
+	 m_StripPitch			= m_StripPlaneSize / m_NumberOfStrip;
 }
 
 PSStripNumberY::~PSStripNumberY()
@@ -178,27 +112,28 @@ PSStripNumberY::~PSStripNumberY()
 
 G4bool PSStripNumberY::ProcessHits(G4Step* aStep, G4TouchableHistory*)
 {
+	 int DetNbr = GENERALSCORERS::PickUpDetectorNumber(aStep, "MUST2Telescope");
+
+
    G4ThreeVector POS  = aStep->GetPreStepPoint()->GetPosition();
    POS = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(POS);
 
-   G4double StripPitch = m_StripPlaneSize / m_NumberOfStrip;
-
-   G4double temp = (POS(1) + m_StripPlaneSize / 2.) / StripPitch   ;
+   G4double temp = (POS(1) + m_StripPlaneSize / 2.) / m_StripPitch   ;
    G4int temp2 = temp ;
-   G4double Y = temp2 + 1                    ;
+   G4int Y = temp2 + 1                    ;
    //Rare case where particle is close to edge of silicon plan
-   if (Y == 129) Y = 128;
+   if (Y == m_NumberOfStrip+1) Y = m_NumberOfStrip;
 
    G4double edep = aStep->GetTotalEnergyDeposit();
    if (edep < 100*keV) return FALSE;
    G4int  index =  aStep->GetTrack()->GetTrackID();
-   EvtMap->set(index, Y);
+   EvtMap->set(index+DetNbr, Y);
    return TRUE;
 }
 
 void PSStripNumberY::Initialize(G4HCofThisEvent* HCE)
 {
-   EvtMap = new G4THitsMap<G4double>(GetMultiFunctionalDetector()->GetName(), GetName());
+   EvtMap = new G4THitsMap<G4int>(GetMultiFunctionalDetector()->GetName(), GetName());
    if (HCID < 0) {
       HCID = GetCollectionID(0);
    }
@@ -227,42 +162,51 @@ void PSStripNumberY::PrintAll()
    G4cout << " Number of entries " << EvtMap->entries() << G4endl     ;
 }
 
+
+
+
+
+
+
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-		//Detector Number Scorer
-PSDetectorNumber::PSDetectorNumber(G4String name, G4int depth, G4String VolumeName )
+//CsI Cristal / SiLi Pad Number Scorer
+//
+PSPadOrCristalNumber::PSPadOrCristalNumber(G4String name, G4int depth)
       : G4VPrimitiveScorer(name, depth), HCID(-1)
-{
-   m_VolumeName = VolumeName;
-}
+{}
 
-PSDetectorNumber::~PSDetectorNumber()
-{
-   ;
-}
+PSPadOrCristalNumber::~PSPadOrCristalNumber()
+{}
 
-G4bool PSDetectorNumber::ProcessHits(G4Step* aStep, G4TouchableHistory*)
-{
-   std::string name = aStep->GetTrack()->GetVolume()->GetName();
-   std::string nbr ;
-   size_t found;
-   found=name.find(m_VolumeName);
-   
-   int numberOfCharacterInTelescopeNumber = (int)found - 1 ;
-   
-
-	for( int i = 0 ; i < numberOfCharacterInTelescopeNumber ; i++ )
-		nbr += name[i+1] ;
-
-   G4int DetNbr = atof( nbr.c_str() ) ;
-   G4double edep = aStep->GetTotalEnergyDeposit();
-   if (edep < 100*keV) return FALSE;
-   G4int  index = aStep->GetTrack()->GetTrackID();
-   EvtMap->set(index, DetNbr);
-   return TRUE;
+G4bool PSPadOrCristalNumber::ProcessHits(G4Step* aStep, G4TouchableHistory*)
+{   
+		std::string name = aStep->GetTrack()->GetVolume()->GetName();
+		std::string nbr ;
+
+		G4int temp1,temp2 ;
+		G4int VolumeNumber;
+		nbr = name[name.length()-1]	;
+		temp1 = atoi( nbr.c_str() )	;
+		
+		nbr = name[name.length()-2]	;
+		temp2 = atoi( nbr.c_str() )	;
+		
+		nbr.clear();
+		
+		if(temp2!=0) { nbr+= name[name.length()-2]	; nbr+= name[name.length()-1]	; VolumeNumber = atoi( nbr.c_str() )	;}
+		
+		else 				 { nbr= name[name.length()-1]	; VolumeNumber = atoi( nbr.c_str() )	;}
+
+	 	G4int DetNbr = GENERALSCORERS::PickUpDetectorNumber(aStep, "MUST2Telescope");
+
+		G4double edep = aStep->GetTotalEnergyDeposit();
+		if (edep < 100*keV) return FALSE;
+		G4int  index =  aStep->GetTrack()->GetTrackID();
+		EvtMap->set(index+DetNbr, VolumeNumber);
+		return TRUE;
 }
 
-void PSDetectorNumber::Initialize(G4HCofThisEvent* HCE)
+void PSPadOrCristalNumber::Initialize(G4HCofThisEvent* HCE)
 {
    EvtMap = new G4THitsMap<G4int>(GetMultiFunctionalDetector()->GetName(), GetName());
    if (HCID < 0) {
@@ -271,30 +215,39 @@ void PSDetectorNumber::Initialize(G4HCofThisEvent* HCE)
    HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap);
 }
 
-void PSDetectorNumber::EndOfEvent(G4HCofThisEvent*)
+void PSPadOrCristalNumber::EndOfEvent(G4HCofThisEvent*)
 {
    ;
 }
 
-void PSDetectorNumber::clear()
+void PSPadOrCristalNumber::clear()
 {
    EvtMap->clear();
 }
 
-void PSDetectorNumber::DrawAll()
+void PSPadOrCristalNumber::DrawAll()
 {
    ;
 }
 
-void PSDetectorNumber::PrintAll()
+void PSPadOrCristalNumber::PrintAll()
 {
-   G4cout << " MultiFunctionalDet  " << detector->GetName() << G4endl;
-   G4cout << " PrimitiveScorer " << GetName() << G4endl;
-   G4cout << " Number of entries " << EvtMap->entries() << G4endl;
-   std::map<G4int, G4int*>::iterator itr = EvtMap->GetMap()->begin();
-   for (; itr != EvtMap->GetMap()->end(); itr++) {
-      G4cout << "  copy no.: " << itr->first
-      << "  energy deposit: " << G4BestUnit(*(itr->second), "Energy")
-      << G4endl;
-   }
+   G4cout << " MultiFunctionalDet  " << detector->GetName() << G4endl ;
+   G4cout << " PrimitiveScorer " << GetName() << G4endl               ;
+   G4cout << " Number of entries " << EvtMap->entries() << G4endl     ;
 }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/NPSimulation/src/PhysicsList.cc b/NPSimulation/src/PhysicsList.cc
index b2830204201608cb20133a7d78c9670cb21749be..104f0673950be17dba416e4ab23c08eb5a4eef35 100644
--- a/NPSimulation/src/PhysicsList.cc
+++ b/NPSimulation/src/PhysicsList.cc
@@ -70,8 +70,9 @@
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 PhysicsList::PhysicsList()
-{
-   defaultCutValue = 1 * cm;
+{	
+	  // ie: no secondaries
+   defaultCutValue = 1000 * pc;
 }
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 PhysicsList::~PhysicsList()
@@ -211,7 +212,7 @@ void PhysicsList::ConstructEM()
          pmanager->AddProcess(new G4MultipleScattering(), -1, 1, 1)        ;
          G4ionIonisation* iI = new G4ionIonisation                   ;
          // mod by Nicolas [07/05/09]
-//          iI->ActivateNuclearStopping(true)                        ;
+          iI->ActivateNuclearStopping(true)                        ;
          iI->ActivateStoppingData(true)                           ;
          pmanager->AddProcess(iI            , -1, 2, 2)          ;
 
@@ -232,9 +233,9 @@ void PhysicsList::ConstructEM()
    G4EmProcessOptions opt        ;
    opt.SetSubCutoff(true)        ;
    opt.SetMinEnergy(0.001*eV)    ;
-   opt.SetMaxEnergy(600.*MeV)    ;
-   opt.SetDEDXBinning(600)       ;
-   opt.SetLambdaBinning(600)     ;
+   opt.SetMaxEnergy(1000.*MeV)    ;
+   opt.SetDEDXBinning(1000)       ;
+   opt.SetLambdaBinning(1000)     ;
    // mod by Nicolas [07/05/09]
 // opt.SetLinearLossLimit(1.e-3) ;
 
diff --git a/NPSimulation/src/Plastic.cc b/NPSimulation/src/Plastic.cc
index 21005243d7685a9f208fe56267cf1d8f09d6036c..5e1e3fda47083a810e4cbdd617b9808a6d135c24 100644
--- a/NPSimulation/src/Plastic.cc
+++ b/NPSimulation/src/Plastic.cc
@@ -8,11 +8,13 @@
 /*****************************************************************************
  * Original Author: Adrien MATTA  contact address: matta@ipno.in2p3.fr       *
  *                                                                           *
- * Creation Date  : January 2009                                             *
+ * Creation Date  : September 2009                                           *
  * Last update    :                                                          *
  *---------------------------------------------------------------------------*
  * Decription:                                                               *
- *  This class describe a 20um Silicium detector                             *
+ *  This class describe a Modular cylindrical Plastic Scintillator           *
+ *	Few Material are instantiate and user can choose position and dimension	 * 
+ *  but also the adding of a lead plate on the rear side of the detector     *
  *                                                                           *
  *---------------------------------------------------------------------------*
  * Comment:                                                                  *
@@ -22,7 +24,7 @@
 // C++ headers
 #include <sstream>
 #include <cmath>
-
+#include <limits>
 //G4 Geometry object
 #include "G4Tubs.hh"
 
@@ -41,9 +43,9 @@
 
 // NPTool header
 #include "Plastic.hh"
-#include "PlasticScorers.hh"
+#include "GeneralScorers.hh"
 #include "RootOutput.h"
-using namespace PLASTIC;
+using namespace GENERALSCORERS ;
 // CLHEP header
 #include "CLHEP/Random/RandGauss.h"
 
@@ -77,26 +79,27 @@ Plastic::~Plastic()
 	delete m_MaterialPlastic_BC452_2	;
 	delete m_MaterialPlastic_BC452_5	;
 	delete m_MaterialPlastic_BC452_10	;
-	delete m_MaterialLead				;
-	delete m_PlasticScorer				;
+	delete m_MaterialLead							;
+	delete m_PlasticScorer						;
 }
+
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-void Plastic::AddPlastic(	G4double    R        			,
-        					G4double    Theta    			,
-         			 		G4double    Phi         		,
-         			 		G4double	PlasticThickness	,
-         			 		G4double	PlasticRadius		,
-         			 		G4String 	Scintillator		,
-         			 		G4double 	LeadThickness		)
+void Plastic::AddPlastic(	G4double  R        					,
+				        					G4double  Theta    					,
+				         			 		G4double  Phi         			,
+				         			 		G4double	PlasticThickness	,
+				         			 		G4double	PlasticRadius			,
+				         			 		G4String 	Scintillator			,
+				         			 		G4double 	LeadThickness			)
 {
 
-   m_R.push_back(R)              		;
-   m_Theta.push_back(Theta)         	;
-   m_Phi.push_back(Phi)          		;
-   m_PlasticThickness.push_back(PlasticThickness)					;
- 	m_PlasticRadius.push_back(PlasticRadius)						;
- 	m_LeadThickness.push_back(LeadThickness);
- 	m_Scintillator.push_back(Scintillator);
+  m_R.push_back(R)              									;
+  m_Theta.push_back(Theta)        								;
+  m_Phi.push_back(Phi)          									;
+  m_PlasticThickness.push_back(PlasticThickness)	;
+ 	m_PlasticRadius.push_back(PlasticRadius)				;
+ 	m_LeadThickness.push_back(LeadThickness)				;
+ 	m_Scintillator.push_back(Scintillator)					;
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -109,13 +112,13 @@ void Plastic::AddPlastic(	G4double    R        			,
 // Called in DetecorConstruction::ReadDetextorConfiguration Method
 void Plastic::ReadConfiguration(string Path)
 {
-   ifstream ConfigFile           ;
-   ConfigFile.open(Path.c_str()) ;
-   string LineBuffer          ;
-   string DataBuffer          ;
+	ifstream ConfigFile           ;
+	ConfigFile.open(Path.c_str()) ;
+	string LineBuffer          ;
+	string DataBuffer          ;
 
-   G4double Theta = 0 , Phi = 0 , R = 0 , Thickness = 0 , Radius = 0 , LeadThickness = 0;
-   G4String Scintillator ;
+	G4double Theta = 0 , Phi = 0 , R = 0 , Thickness = 0 , Radius = 0 , LeadThickness = 0;
+	G4String Scintillator ;
 
 	bool check_Theta = false   ;
 	bool check_Phi  = false  ;
@@ -132,7 +135,7 @@ void Plastic::ReadConfiguration(string Path)
       
 	      	getline(ConfigFile, LineBuffer);
 
-			//	If line is a Start Up MUST2 bloc, Reading toggle to true      
+			//	If line is a Start Up Plastic bloc, Reading toggle to true      
 	      	if (LineBuffer.compare(0, 7, "Plastic") == 0) 
 		      	{
 		        	 G4cout << "///" << G4endl           ;
@@ -151,7 +154,7 @@ void Plastic::ReadConfiguration(string Path)
 					ConfigFile >> DataBuffer ;
 
 					//	Comment Line 
-					if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;}
+					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, 6, "Plastic") == 0) {
@@ -309,7 +312,7 @@ void Plastic::VolumeMaker(G4ThreeVector Det_pos, int DetNumber, G4LogicalVolume*
 			                            			0*deg					, 
 			                            			360*deg					);
 		                            		
-				G4LogicalVolume* logicPlastic = new G4LogicalVolume(solidPlastic, PlasticMaterial, Name, 0, 0, 0);
+				G4LogicalVolume* logicPlastic = new G4LogicalVolume(solidPlastic, PlasticMaterial, Name+ "_Scintillator", 0, 0, 0);
 				logicPlastic->SetSensitiveDetector(m_PlasticScorer);
 				
 				G4VisAttributes* PlastVisAtt = new G4VisAttributes(G4Colour(0.0, 0.0, 0.9)) ;
@@ -320,7 +323,7 @@ void Plastic::VolumeMaker(G4ThreeVector Det_pos, int DetNumber, G4LogicalVolume*
 				PVPBuffer = new G4PVPlacement(	0				,
 												Det_pos			,
 		                                     	logicPlastic    ,
-		                                     	Name            ,
+		                                     	Name  + "_Scintillator"          ,
 		                                     	world           ,
 		                                     	false           ,
 		                                     	0				);	
@@ -332,21 +335,21 @@ void Plastic::VolumeMaker(G4ThreeVector Det_pos, int DetNumber, G4LogicalVolume*
                                      	
         if(m_LeadThickness[i]>0&& m_PlasticRadius[i]>0)
         	{
-    			G4Tubs* solidLead = new G4Tubs(	Name+"Lead"  			,	 
+    			G4Tubs* solidLead = new G4Tubs(	Name+"_Lead"  			,	 
 		                            			0						,
 		                            			m_PlasticRadius[i]		,
 		                            			m_LeadThickness[i]/2	,
 		                            			0*deg					, 
 		                            			360*deg					);
 		                            		
-				G4LogicalVolume* logicLead = new G4LogicalVolume(solidLead, m_MaterialLead, Name, 0, 0, 0);
+				G4LogicalVolume* logicLead = new G4LogicalVolume(solidLead, m_MaterialLead, Name+"_Lead", 0, 0, 0);
 				G4VisAttributes* LeadVisAtt = new G4VisAttributes(G4Colour(0.1, 0.1, 0.1)) ;
    				logicLead->SetVisAttributes(LeadVisAtt) ;
    				
 				PVPBuffer = new G4PVPlacement(	0																		,
 												Det_pos+(m_PlasticThickness[i]/2+m_LeadThickness[i]/2)*Det_pos.unit()	,
 		                                     	logicLead    															,
-		                                     	Name+"Lead"        														,	
+		                                     	Name+"_Lead"        														,	
 		                                     	world           														,
 		                                     	false           														,
 		                                     	0																		);
@@ -515,14 +518,14 @@ void Plastic::InitializeScorers()
 		m_PlasticScorer = new G4MultiFunctionalDetector("PlasticScorer") ;
 		G4SDManager::GetSDMpointer()->AddNewDetector(m_PlasticScorer);
 		
-		G4VPrimitiveScorer* DetNbr = new PSDetectorNumber("PlasticNumber", 0)  ;
-		G4VPrimitiveScorer* Energy = new PSEnergy("Energy", 0)             					;
-		G4VPrimitiveScorer* Time = new PSTOF("Time", 0)             					;
+		G4VPrimitiveScorer* DetNbr = new PSDetectorNumber("PlasticNumber","Plastic", 0) ;
+		G4VPrimitiveScorer* Energy = new PSEnergy("Energy","Plastic", 0)             		;
+		G4VPrimitiveScorer* Time   = new PSTOF("Time","Plastic", 0)             				;
 		 
 		//and register it to the multifunctionnal detector
 		m_PlasticScorer->RegisterPrimitive(DetNbr)             				;
 		m_PlasticScorer->RegisterPrimitive(Energy)             				;
-		m_PlasticScorer->RegisterPrimitive(Time)             				;		
+		m_PlasticScorer->RegisterPrimitive(Time)             					;		
 		
 		
 	}
diff --git a/NPSimulation/src/PlasticScorer.cc b/NPSimulation/src/PlasticScorer.cc
deleted file mode 100644
index 6e5ab935ceea8b1e1acb6af005e64e734be3c91b..0000000000000000000000000000000000000000
--- a/NPSimulation/src/PlasticScorer.cc
+++ /dev/null
@@ -1,240 +0,0 @@
-/*****************************************************************************
- * Copyright (C) 2009   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@ipno.in2p3.fr       *
- *                                                                           *
- * Creation Date  : September 2009                                           *
- * Last update    :                                                          *
- *---------------------------------------------------------------------------*
- * Decription:                                                               *
- *  This class old some of the Platic Scorer.                                *
- *---------------------------------------------------------------------------*
- * Comment:                                                                  *
- *****************************************************************************/
-#include "PlasticScorers.hh"
-#include "G4UnitsTable.hh"
-using namespace PLASTIC;
-
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-// Energy Scorer (deal with multiple particle hit)
-
-PSEnergy::PSEnergy(G4String name, G4int depth)
-      : G4VPrimitiveScorer(name, depth), HCID(-1)
-{
-}
-
-PSEnergy::~PSEnergy()
-{
-}
-
-G4bool PSEnergy::ProcessHits(G4Step* aStep, G4TouchableHistory*)
-{
-   std::string name = aStep->GetTrack()->GetVolume()->GetName();
-   std::string nbr ;
-   size_t found;
-   found=name.find("Plastic");
-   found = found + 7;
-   
-   int numberOfCharacterInDetectorNumber = name.length() - (int)found  ;
-
-	for(unsigned int i = found ; i < found + numberOfCharacterInDetectorNumber ; i++ )
-			nbr += name[i] ; 
-		
-   G4int DetNbr = atoi( nbr.c_str() ) ;
-
-   G4double edep = aStep->GetTotalEnergyDeposit();
-   if (edep < 100*keV) return FALSE;
-   
-   G4int  index = aStep->GetTrack()->GetTrackID();
-   
-   EvtMap->add(DetNbr+index, edep);
-   return TRUE;
-}
-
-void PSEnergy::Initialize(G4HCofThisEvent* HCE)
-{
-   EvtMap = new G4THitsMap<G4double>(GetMultiFunctionalDetector()->GetName(), GetName());
-   if (HCID < 0) {
-      HCID = GetCollectionID(0);
-   }
-   HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap);
-}
-
-void PSEnergy::EndOfEvent(G4HCofThisEvent*)
-{
-   ;
-}
-
-void PSEnergy::clear()
-{
-   EvtMap->clear();
-}
-
-void PSEnergy::DrawAll()
-{
-   ;
-}
-
-void PSEnergy::PrintAll()
-{
-   G4cout << " MultiFunctionalDet  " << detector->GetName() << G4endl;
-   G4cout << " PrimitiveScorer " << GetName() << G4endl;
-   G4cout << " Number of entries " << EvtMap->entries() << G4endl;
-   std::map<G4int, G4double*>::iterator itr = EvtMap->GetMap()->begin();
-   for (; itr != EvtMap->GetMap()->end(); itr++) {
-      G4cout << "  copy no.: " << itr->first
-      << "  energy deposit: " << G4BestUnit(*(itr->second), "Energy")
-      << G4endl;
-   }
-}
-
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-		//Detector Number Scorer
-PSDetectorNumber::PSDetectorNumber(G4String name, G4int depth)
-      : G4VPrimitiveScorer(name, depth), HCID(-1)
-{
-}
-
-PSDetectorNumber::~PSDetectorNumber()
-{
-   ;
-}
-
-G4bool PSDetectorNumber::ProcessHits(G4Step* aStep, G4TouchableHistory*)
-{
-   std::string name = aStep->GetTrack()->GetVolume()->GetName();
-   std::string nbr ;
-   size_t found;
-   found=name.find("Plastic");
-   found = found + 7;
-   
-   int numberOfCharacterInDetectorNumber = name.length() - (int)found  ;
-
-	for(unsigned int i = found ; i < found + numberOfCharacterInDetectorNumber ; i++ )
-			nbr += name[i] ; 
-		
-   G4int DetNbr = atoi( nbr.c_str() ) ;
-   G4double edep = aStep->GetTotalEnergyDeposit();
-   
-   if (edep < 100*keV) return FALSE;
-   
-   G4int  index = aStep->GetTrack()->GetTrackID();
-   
-   EvtMap->set(DetNbr + index, DetNbr);
-   return TRUE;
-}
-
-void PSDetectorNumber::Initialize(G4HCofThisEvent* HCE)
-{ 
-   EvtMap = new G4THitsMap<G4int>(GetMultiFunctionalDetector()->GetName(), GetName());
-   if (HCID < 0) {
-      HCID = GetCollectionID(0);
-   }
-   HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap);
-}
-
-void PSDetectorNumber::EndOfEvent(G4HCofThisEvent*)
-{
-   ;
-}
-
-void PSDetectorNumber::clear()
-{
-   EvtMap->clear();
-}
-
-void PSDetectorNumber::DrawAll()
-{
-   ;
-}
-
-void PSDetectorNumber::PrintAll()
-{
-   G4cout << " MultiFunctionalDet  " << detector->GetName() << G4endl;
-   G4cout << " PrimitiveScorer " << GetName() << G4endl;
-   G4cout << " Number of entries " << EvtMap->entries() << G4endl;
-   std::map<G4int, G4int*>::iterator itr = EvtMap->GetMap()->begin();
-   for (; itr != EvtMap->GetMap()->end(); itr++) {
-      G4cout << "  copy no.: " << itr->first
-      << "  energy deposit: " << G4BestUnit(*(itr->second), "Energy")
-      << G4endl;
-   }
-}
-
-//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-//TOF Scorer//
-PSTOF::PSTOF(G4String name, G4int depth)
-      : G4VPrimitiveScorer(name, depth), HCID(-1)
-{
-   ;
-}
-
-PSTOF::~PSTOF()
-{
-   ;
-}
-
-G4bool PSTOF::ProcessHits(G4Step* aStep, G4TouchableHistory*)
-{
-   std::string name = aStep->GetTrack()->GetVolume()->GetName();
-   std::string nbr ;
-   size_t found;
-   found=name.find("Plastic");
-   found = found + 7;
-   
-   int numberOfCharacterInDetectorNumber = name.length() - (int)found  ;
-
-	for(unsigned int i = found ; i < found + numberOfCharacterInDetectorNumber ; i++ )
-			nbr += name[i] ; 
-		
-   G4int DetNbr = atoi( nbr.c_str() ) ;
-
-
-   G4double TOF  = aStep->GetPreStepPoint()->GetGlobalTime();
-   G4double edep = aStep->GetTotalEnergyDeposit();
-   if (edep < 100*keV) return FALSE;
-   G4int  index = aStep->GetTrack()->GetTrackID();
-   EvtMap->set(DetNbr + index, TOF);
-   return TRUE;
-}
-
-void PSTOF::Initialize(G4HCofThisEvent* HCE)
-{
-   EvtMap = new G4THitsMap<G4double>(GetMultiFunctionalDetector()->GetName(),
-         GetName());
-   if (HCID < 0) {
-      HCID = GetCollectionID(0);
-   }
-   HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap);
-}
-
-void PSTOF::EndOfEvent(G4HCofThisEvent*)
-{
-   ;
-}
-
-void PSTOF::clear()
-{
-   EvtMap->clear();
-}
-
-void PSTOF::DrawAll()
-{
-   ;
-}
-
-void PSTOF::PrintAll()
-{
-   G4cout << " MultiFunctionalDet  " << detector->GetName() << G4endl ;
-   G4cout << " PrimitiveScorer " << GetName() << G4endl               ;
-   G4cout << " Number of entries " << EvtMap->entries() << G4endl     ;
-}
diff --git a/NPSimulation/src/Target.cc b/NPSimulation/src/Target.cc
index 589f643d40f9e7cac751064cb0bfc545715ca984..e176eae06111165479ac91c3dc1ccff7fc5db651 100644
--- a/NPSimulation/src/Target.cc
+++ b/NPSimulation/src/Target.cc
@@ -25,7 +25,7 @@
  *****************************************************************************/
 // C++ header
 #include <fstream>
-
+#include <limits>
 // G4 geometry header
 #include "G4Tubs.hh"
 
@@ -232,7 +232,7 @@ void Target::ReadConfiguration(string Path)
          ConfigFile >> DataBuffer;
 	
       		//Search for comment Symbol %
-      		if (DataBuffer.compare(0, 1, "%") == 0) {/*Do Nothing*/;}
+      		if (DataBuffer.compare(0, 1, "%") == 0) {	ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );}
       		
 	        else if (DataBuffer.compare(0, 10, "THICKNESS=") == 0) {
 	        	check_Thickness = true ;
diff --git a/NPSimulation/src/ThinSi.cc b/NPSimulation/src/ThinSi.cc
index 94a2313adfa6c5e4e6008f8082177da87fb309cd..3af43f06ac2bb0ff45dc5cae53c8bd7b388273dd 100644
--- a/NPSimulation/src/ThinSi.cc
+++ b/NPSimulation/src/ThinSi.cc
@@ -9,7 +9,7 @@
  * Original Author: Adrien MATTA  contact address: matta@ipno.in2p3.fr       *
  *                                                                           *
  * Creation Date  : January 2009                                             *
- * Last update    :                                                          *
+ * Last update    : October 2009                                             *
  *---------------------------------------------------------------------------*
  * Decription:                                                               *
  *  This class describe a 20um Silicium detector                             *
@@ -22,7 +22,7 @@
 // C++ headers
 #include <sstream>
 #include <cmath>
-
+#include <limits>
 //G4 Geometry object
 #include "G4Trd.hh"
 #include "G4Box.hh"
@@ -46,9 +46,9 @@
 // NPTool header
 #include "ThinSi.hh"
 #include "GeneralScorers.hh"
-#include "Must2Scorers.hh"
-#include "MUST2Array.hh"
+#include "ThinSiScorers.hh"
 #include "RootOutput.h"
+using namespace THINSI;
 
 // CLHEP header
 #include "CLHEP/Random/RandGauss.h"
@@ -62,11 +62,17 @@ using namespace CLHEP;
 // ThinSi Specific Method
 ThinSi::ThinSi()
 {
-
+		InitializeMaterial()			;
+		m_Event = new TSSSDData()	;
 }
 
 ThinSi::~ThinSi()
-{}
+{
+		delete m_MaterialSilicon 		;
+   	delete m_MaterialAl 				;
+   	delete m_MaterialVacuum 		;
+
+}
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void ThinSi::AddTelescope(G4ThreeVector TL         ,
       G4ThreeVector BL        ,
@@ -125,28 +131,6 @@ void ThinSi::VolumeMaker(	G4int            	DetNumber      	,
    Number << NbrTelescopes                   ;
    DetectorNumber = Number.str()             ;
 
-////////////////////////////////////////////////////////////////
-/////////////////Material Definition ///////////////////////////
-////////////////////////////////////////////////////////////////
-   G4Element* N   = new G4Element("Nitrogen" , "N"  , 7  , 14.01  * g / mole);
-   G4Element* O   = new G4Element("Oxigen"   , "O"  , 8  , 16.00  * g / mole);
-
-   G4double a, z, density;
-   // Si
-   a = 28.0855 * g / mole;
-   density = 2.321 * g / cm3;
-   G4Material* Silicon = new G4Material("Si", z = 14., a, density);
-
-   // Al
-   density = 2.702 * g / cm3;
-   a = 26.98 * g / mole;
-   G4Material* Al = new G4Material("Al", z = 13., a, density);
-
-   //  Vacuum
-   density = 0.000000001 * mg / cm3;
-   G4Material* Vacuum = new G4Material("Vacuum", density, 2);
-   Vacuum->AddElement(N, .7);
-   Vacuum->AddElement(O, .3);
 
 ////////////////////////////////////////////////////////////////
 /////////General Geometry Parameter Definition /////////////////
@@ -162,7 +146,7 @@ void ThinSi::VolumeMaker(	G4int            	DetNumber      	,
    G4Box* solidThinSi = new G4Box(Name, 0.5*DetectorSize, 0.5*DetectorSize, 0.5*FrameThickness*mm);
 
    G4LogicalVolume* logicThinSi =
-      new G4LogicalVolume(solidThinSi, Vacuum, Name, 0, 0);
+      new G4LogicalVolume(solidThinSi, m_MaterialVacuum, Name, 0, 0);
 
    PVPBuffer =
       new G4PVPlacement(G4Transform3D(*Det_rot, Det_pos)  ,
@@ -173,14 +157,14 @@ void ThinSi::VolumeMaker(	G4int            	DetNumber      	,
             0);
 
    // Frame is made of 4 thick box (2 Horizontal and 2 Vertical)
-   G4Box* solidFrameHorizontal = new G4Box(Name + "Frame", 0.5*SiliconSize, 0.5*(DetectorSize - SiliconSize) / 2, 0.5*FrameThickness*mm)   ;
-   G4Box* solidFrameVertical  = new G4Box(Name + "Frame", 0.5*(DetectorSize - SiliconSize) / 2, 0.5*DetectorSize, 0.5*FrameThickness*mm)   ;
+   G4Box* solidFrameHorizontal = new G4Box(Name + "_Frame", 0.5*SiliconSize, 0.5*(DetectorSize - SiliconSize) / 2, 0.5*FrameThickness*mm)   ;
+   G4Box* solidFrameVertical  = new G4Box(Name + "_Frame", 0.5*(DetectorSize - SiliconSize) / 2, 0.5*DetectorSize, 0.5*FrameThickness*mm)   ;
 
    G4LogicalVolume* logicFrameHorizontal =
-      new G4LogicalVolume(solidFrameHorizontal, Al, Name, 0, 0);
+      new G4LogicalVolume(solidFrameHorizontal, m_MaterialAl, Name, 0, 0);
 
    G4LogicalVolume* logicFrameVertical =
-      new G4LogicalVolume(solidFrameVertical, Al, Name, 0, 0);
+      new G4LogicalVolume(solidFrameVertical, m_MaterialAl, Name, 0, 0);
 
    G4ThreeVector FrameTopPosition      = G4ThreeVector(0 ,  0.5 * SiliconSize + 0.5 * (DetectorSize - SiliconSize) / 2 , 0) ;
    G4ThreeVector FrameBottomPosition   = G4ThreeVector(0 , -0.5 * SiliconSize - 0.5 * (DetectorSize - SiliconSize) / 2 , 0) ;
@@ -192,7 +176,7 @@ void ThinSi::VolumeMaker(	G4int            	DetNumber      	,
       new G4PVPlacement(0                 ,
             FrameTopPosition     ,
             logicFrameHorizontal ,
-            Name + "Frame"         ,
+            Name + "_Frame"         ,
             logicThinSi          ,
             false             ,
             0);
@@ -201,7 +185,7 @@ void ThinSi::VolumeMaker(	G4int            	DetNumber      	,
       new G4PVPlacement(0                 ,
             FrameBottomPosition     ,
             logicFrameHorizontal ,
-            Name + "Frame"         ,
+            Name + "_Frame"         ,
             logicThinSi          ,
             false             ,
             0);
@@ -210,7 +194,7 @@ void ThinSi::VolumeMaker(	G4int            	DetNumber      	,
       new G4PVPlacement(0                 ,
             FrameLeftPosition    ,
             logicFrameVertical      ,
-            Name + "Frame"         ,
+            Name + "_Frame"         ,
             logicThinSi          ,
             false             ,
             0);
@@ -219,7 +203,7 @@ void ThinSi::VolumeMaker(	G4int            	DetNumber      	,
       new G4PVPlacement(0                 ,
             FrameRightPosition      ,
             logicFrameVertical      ,
-            Name + "Frame"         ,
+            Name + "_Frame"         ,
             logicThinSi          ,
             false             ,
             0);
@@ -233,39 +217,26 @@ void ThinSi::VolumeMaker(	G4int            	DetNumber      	,
       new G4Box("ThinSiAlu", 0.5*SiliconSize, 0.5*SiliconSize, 0.5*AluThickness) ;
 
    G4LogicalVolume* logicAlu  =
-      new G4LogicalVolume(solidAlu, Al, "logicAlu", 0, 0, 0)    ;
+      new G4LogicalVolume(solidAlu, m_MaterialAl, "logicAlu", 0, 0, 0)    ;
 
    PVPBuffer =
-      new G4PVPlacement(0  ,  posAluFront ,  logicAlu ,  Name + "AluFront"   ,  logicThinSi ,  true, 0)  ;
+      new G4PVPlacement(0  ,  posAluFront ,  logicAlu ,  Name + "_AluFront"   ,  logicThinSi ,  true, 0)  ;
 
    PVPBuffer =
-      new G4PVPlacement(0  ,  posAluBack  ,  logicAlu ,  Name + "AluBack"    ,  logicThinSi ,  true, 0)  ;
+      new G4PVPlacement(0  ,  posAluBack  ,  logicAlu ,  Name + "_AluBack"    ,  logicThinSi ,  true, 0)  ;
 
 
    G4Box*   solidSi  =
       new G4Box("ThinSi", 0.5*SiliconSize, 0.5*SiliconSize, 0.5*SiliconThickness)   ;
 
    G4LogicalVolume* logicSi  =
-      new G4LogicalVolume(solidSi, Silicon, "logicSi", 0, 0, 0)           ;
+      new G4LogicalVolume(solidSi, m_MaterialSilicon, "logicSi", 0, 0, 0)           ;
 
    PVPBuffer =
-      new G4PVPlacement(0, posSi, logicSi, Name + "Si", logicThinSi, true, 0)   ;
+      new G4PVPlacement(0, posSi, logicSi, Name + "_Si", logicThinSi, true, 0)   ;
 
-   //Set Add. Silicon strip sensible
-   //instantiate a new scorer
-   G4MultiFunctionalDetector* ThinSiScorer = new G4MultiFunctionalDetector("ThinSi" + DetectorNumber);
    //attach it to the Silicon plate
-   logicSi ->SetSensitiveDetector(ThinSiScorer);
-   //and declare it to the SDManager
-   G4SDManager::GetSDMpointer()->AddNewDetector(ThinSiScorer);
-
-   //instantiate primitive scorer
-   G4VPrimitiveScorer* ThinSiEnergy       ;
-
-   //create primitive scorer
-   ThinSiEnergy = new MUST2::PSStripE("StripEnergy", 0)    ;
-   //and register it to the multifunctionnal detector
-   ThinSiScorer->RegisterPrimitive(ThinSiEnergy)      ;
+   logicSi ->SetSensitiveDetector(m_StripScorer);
 
 }
 
@@ -303,7 +274,7 @@ void ThinSi::ReadConfiguration(string Path)
       
 	      	getline(ConfigFile, LineBuffer);
 
-			//	If line is a Start Up MUST2 bloc, Reading toggle to true      
+			//	If line is a Start Up ThinSi bloc, Reading toggle to true      
 	      	if (LineBuffer.compare(0, 6, "ThinSi") == 0) 
 		      	{
 		        	 G4cout << "///" << G4endl           ;
@@ -322,7 +293,7 @@ void ThinSi::ReadConfiguration(string Path)
 					ConfigFile >> DataBuffer ;
 
 					//	Comment Line 
-					if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;}
+					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, 6, "ThinSi") == 0) {
@@ -583,52 +554,167 @@ void ThinSi::InitializeRootOutput()
 {
    RootOutput *pAnalysis = RootOutput::getInstance();
    TTree *pTree = pAnalysis->GetTree();
-   pTree->Branch("ThinSiEnergy", &m_Energy, "ThinSiEnergy/D") ;
+   pTree->Branch("ThinSi", "TSSSDData", &m_Event) ;
 }
 
 // Read sensitive part and fill the Root tree.
 // Called at in the EventAction::EndOfEventAvtion
 void ThinSi::ReadSensitive(const G4Event* event)
 {
-   G4String DetectorNumber    ;
-   m_Energy = 0 ;
+  	m_Event->Clear();
 //////////////////////////////////////////////////////////////////////////////////////
 //////////////////////// Used to Read Event Map of detector //////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////
 
 // Si
-   std::map<G4int, G4double*>::iterator Energy_itr     ;
-   G4THitsMap<G4double>* EnergyHitMap              ;
-
-
-
+	G4THitsMap<G4int>*	  DetNbrHitMap							;  
+	G4THitsMap<G4int>*	  StripNbrHitMap						;    
+	G4THitsMap<G4double>* EnergyHitMap            	;
+	G4THitsMap<G4double>* TimeHitMap             		;
+
+	std::map<G4int, G4int*>::iterator DetNbr_itr  	;
+	std::map<G4int, G4int*>::iterator StripNbr_itr  ;
+	std::map<G4int, G4double*>::iterator Energy_itr ;
+	std::map<G4int, G4double*>::iterator Time_itr   ;
 //////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////
+      // Read the Scorer associate to the Silicon Strip
 
-   G4int NumberOfDetector = m_DefinitionType.size()  ;
-   for (G4int i = 0 ; i < NumberOfDetector ; i++) {
-      G4int k = i + 1;
-      ostringstream buffer;
-      buffer << k;
-      DetectorNumber = buffer.str();
+			//DetectorNumber	
+      G4int DetNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/DetectorNumber")   	;
+      DetNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(DetNbrCollectionID))                 				;
+      DetNbr_itr = DetNbrHitMap->GetMap()->begin()                                                       								;
+      
+      //StripNumber	
+      G4int StripNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/StripNumber")  			;
+      StripNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripNbrCollectionID))                 			;
 
-      // Read the Scorer associate to the Silicon Strip
       //Energy
-      G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi" + DetectorNumber + "/StripEnergy")   ;
-      EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID))                 ;
-      Energy_itr = EnergyHitMap->GetMap()->begin()                                                       ;
+      G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/StripEnergy")   		;
+      EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID))                 		;
+
+			//Time
+      G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/StripTime")   				;
+      TimeHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID))                 				;
+
+		  G4int sizeN = DetNbrHitMap		->entries() 	;
+		  G4int sizeS = StripNbrHitMap	->entries() ;
+	    G4int sizeE = EnergyHitMap		->entries() 	;
+	    G4int sizeT = TimeHitMap			->entries() 		;
+  
+		// Loop on Det Number
+    for (G4int l = 0 ; l < sizeN ; l++) 
+				{
+	        G4int N     =      *(DetNbr_itr->second)    ;
+	        G4int NTrackID  =   DetNbr_itr->first - N		;
+	      
+	        if (N > 0) 
+						{
+								m_Event->SetEnergyDetectorNbr(N)						;
+								m_Event->SetTimeDetectorNbr(N)						;
+								
+						//  Strip Number
+				        StripNbr_itr = StripNbrHitMap->GetMap()->begin();
+				        for (G4int h = 0 ; h < sizeS ; h++) {
+				            G4int STrackID  =   StripNbr_itr->first  - N    ;
+				            G4int S         = *(StripNbr_itr->second)      	;
+										
+				            if (STrackID == NTrackID) {
+				             	 m_Event->SetEnergyStripNbr(S)		;
+				             	 m_Event->SetTimeStripNbr(S)		;
+				            }
+				            
+				            StripNbr_itr++;
+				        	}
+								
+						//  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->SetEnergy( RandGauss::shoot(E, ResoEnergy ) )    ;
+				            }
+				            
+				            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->SetTime( RandGauss::shoot(T, ResoTime ) )    ;
+				            }
+				            
+				            Time_itr++;
+				        }
+
+	       	 }
+
+	        DetNbr_itr++;
+   		}
+    
+    // clear map for next event
+    
+    DetNbrHitMap    	->clear()	;
+    StripNbrHitMap    ->clear()	;
+    EnergyHitMap   		->clear() ; 
+    TimeHitMap				->clear()	;    
+}
 
-      // Loop on Strip energy
-      for (G4int l = 0 ; l < EnergyHitMap->entries() ; l++) {
-         //G4int ETrackID  =   Energy_itr->first      ;
-         G4double E     = *(Energy_itr->second)    ;
 
-         if (E > 0) {
-            m_Energy = RandGauss::shoot(E, ResoEnergy);
-         }
+void ThinSi::InitializeScorers()
+	{
+
+		//	Silicon Associate Scorer
+			m_StripScorer = new G4MultiFunctionalDetector("ThinSi_StripScorer");
+			
+			G4VPrimitiveScorer* DetNbr 														= new GENERALSCORERS::PSDetectorNumber("DetectorNumber","ThinSi_", 0)  	;
+			G4VPrimitiveScorer* StripNbr 													= new PSStripNumber("StripNumber",0,SiliconSize, NumberOfStrip)		; 
+			G4VPrimitiveScorer* Energy 														= new GENERALSCORERS::PSEnergy("StripEnergy","ThinSi_", 0)             	;			
+			G4VPrimitiveScorer* TOF 															= new GENERALSCORERS::PSTOF("StripTime","ThinSi_", 0)                  	;          					 		 
+			
+
+		//and register it to the multifunctionnal detector
+			m_StripScorer->RegisterPrimitive(DetNbr)             				;
+			m_StripScorer->RegisterPrimitive(StripNbr)             			;
+			m_StripScorer->RegisterPrimitive(Energy)             				;
+			m_StripScorer->RegisterPrimitive(TOF)                				;
+
+	 	//	Add All Scorer to the Global Scorer Manager
+		  G4SDManager::GetSDMpointer()->AddNewDetector(m_StripScorer) ;
+		}
+
+////////////////////////////////////////////////////////////////
+/////////////////Material Definition ///////////////////////////
+////////////////////////////////////////////////////////////////
+void ThinSi::InitializeMaterial()
+	{
+
+		 G4Element* N   = new G4Element("Nitrogen" , "N"  , 7  , 14.01  * g / mole);
+	   G4Element* O   = new G4Element("Oxigen"   , "O"  , 8  , 16.00  * g / mole);
+
+	   G4double a, z, density;
+	   // Si
+	   a = 28.0855 * g / mole;
+	   density = 2.321 * g / cm3;
+	   m_MaterialSilicon = new G4Material("Si", z = 14., a, density);
+
+	   // Al
+	   density = 2.702 * g / cm3;
+	   a = 26.98 * g / mole;
+	   m_MaterialAl = new G4Material("Al", z = 13., a, density);
+
+	   //  Vacuum
+	   density = 0.000000001 * mg / cm3;
+	   m_MaterialVacuum = new G4Material("Vacuum", density, 2);
+	   m_MaterialVacuum->AddElement(N, .7);
+	   m_MaterialVacuum->AddElement(O, .3);
+	}
+
 
-      }
-      // clear map for next event
-      EnergyHitMap   ->clear()   ;
-   }
-}
diff --git a/NPSimulation/src/ThinSiScorers.cc b/NPSimulation/src/ThinSiScorers.cc
new file mode 100644
index 0000000000000000000000000000000000000000..53faa61b07698e34d45c0fd94c3e67aab908c55c
--- /dev/null
+++ b/NPSimulation/src/ThinSiScorers.cc
@@ -0,0 +1,100 @@
+/*****************************************************************************
+ * Copyright (C) 2009   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@ipno.in2p3.fr       *
+ *                                                                           *
+ * Creation Date  : October 2009                                             *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  File holding the scorer specific to the ThinSi Detector                  *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ * Those Scorer use TrackID as map index. This way ones can rebuild energy   *
+ *  deposit, time of flight or position,... particle by particle for each    *
+ *  event.Because standard scorer provide by G4 don't work this way but using* 
+ *  a global ID for each event you should not use those scorer with some G4  *
+ *  provided ones or being very carefull doing so.                           *
+ *****************************************************************************/
+#include "ThinSiScorers.hh"
+#include "G4UnitsTable.hh"
+#include "GeneralScorers.hh"
+#include <string>
+using namespace THINSI ;
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//Strip position Scorer
+//X
+PSStripNumber::PSStripNumber(G4String name, G4int depth, G4double StripPlaneSize, G4int NumberOfStrip)
+      : G4VPrimitiveScorer(name, depth), HCID(-1)
+{
+   m_StripPlaneSize 	= StripPlaneSize 											;
+   m_NumberOfStrip    = NumberOfStrip  											;
+   m_StripPitch 			= m_StripPlaneSize / m_NumberOfStrip	;
+}
+
+PSStripNumber::~PSStripNumber()
+{
+   ;
+}
+
+G4bool PSStripNumber::ProcessHits(G4Step* aStep, G4TouchableHistory*)
+{
+	 int DetNbr = GENERALSCORERS::PickUpDetectorNumber(aStep, "ThinSi");
+
+   G4ThreeVector POS  = aStep->GetPreStepPoint()->GetPosition();
+   POS = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(POS);
+
+   G4double temp = (POS(0) + m_StripPlaneSize / 2.) / m_StripPitch   ;
+   G4double X = int(temp) + 1 ;
+   //Rare case where particle is close to edge of silicon plan
+   if (X == m_NumberOfStrip+1) X = m_NumberOfStrip;
+   G4double edep = aStep->GetTotalEnergyDeposit();
+   if (edep < 100*keV) return FALSE;
+   G4int  index =  aStep->GetTrack()->GetTrackID();
+   G4int S = X ;
+   EvtMap->set(index+DetNbr, S);
+   return TRUE;
+}
+
+void PSStripNumber::Initialize(G4HCofThisEvent* HCE)
+{
+   EvtMap = new G4THitsMap<G4int>(GetMultiFunctionalDetector()->GetName(), GetName());
+   if (HCID < 0) {
+      HCID = GetCollectionID(0);
+   }
+   HCE->AddHitsCollection(HCID, (G4VHitsCollection*)EvtMap);
+}
+
+void PSStripNumber::EndOfEvent(G4HCofThisEvent*)
+{
+   ;
+}
+
+void PSStripNumber::clear()
+{
+   EvtMap->clear();
+}
+
+void PSStripNumber::DrawAll()
+{
+   ;
+}
+
+void PSStripNumber::PrintAll()
+{
+   G4cout << " MultiFunctionalDet  " << detector->GetName() << G4endl ;
+   G4cout << " PrimitiveScorer " << GetName() << G4endl               ;
+   G4cout << " Number of entries " << EvtMap->entries() << G4endl     ;
+}
+
+
+
+
diff --git a/NPSimulation/src/VEventGenerator.cc b/NPSimulation/src/VEventGenerator.cc
index 4dc2aac3db8508daa908d46eeeafbca5bf0a5c86..7f236311fc436bc5622d8976f78cbcc94cdd6558 100644
--- a/NPSimulation/src/VEventGenerator.cc
+++ b/NPSimulation/src/VEventGenerator.cc
@@ -82,38 +82,67 @@ void VEventGenerator::CalculateBeamInteraction(double MeanPosX, double SigmaPosX
       RandomGaussian2D(0, 0, 0, SigmaPosPhi,   y0, AngleEmittancePhi);
    }
 
-   // Calculate incident angle in spherical coordinate, passing by the direction vector dir      
-   double Xdir = sin(AngleEmittanceTheta);
-   double Ydir = sin(AngleEmittancePhi);
-   double Zdir = cos(AngleEmittanceTheta) + cos(AngleEmittancePhi);
-
-   AngleIncidentTheta = acos(Zdir / sqrt(Xdir*Xdir + Ydir*Ydir + Zdir*Zdir)) * rad;
-   AngleIncidentPhi   = atan2(Ydir, Xdir) * rad;
-   if (AngleIncidentPhi   < 0)    AngleIncidentPhi += 2*pi;
-   if (AngleIncidentTheta < 1e-6) AngleIncidentPhi  = 0;
-
-   // Calculation of effective target thickness and z-position of interaction
-   // when the target is tilted wrt the beam axis
-   //   * exact if target is perpendicular to the beam axis (target not tilted)
-   //     in any case of beam emittance
-   //   * exact if target is tilted wrt the beam axis and the beam is parallel
-   //     (no beam divergence)
-   //   * wrong if target is tilted and for general case of beam emittance
-   //     (should be fixed in next release). For small beam divergence this
-   //     should not be such a big problem
-   TargetThickness /= cos(TargetAngle);
-   double uniform = RandFlat::shoot();
-   z0 = dz + (-TargetThickness / 2 + uniform * TargetThickness);
-
-   // Calculate the effective thickness before interaction in target
-   // This is useful to slow down the beam
-   EffectiveTargetThicknessBeforeInteraction = TargetThickness  * uniform / cos(AngleIncidentTheta);
-
-   // Move to the target position
-   x0 += target->GetTargetX();
-   y0 += target->GetTargetY();
-   z0 += target->GetTargetZ();
-   InterCoord = G4ThreeVector(x0, y0, z0);
+	if(target!=0)
+		{
+			 // target parameters
+		   double TargetThickness = target->GetTargetThickness();
+		   double TargetRadius    = target->GetTargetRadius();
+		   double TargetAngle     = target->GetTargetAngle();
+
+		   // beam interaction parameters
+		   double x0 = 1000 * cm;
+		   double y0 = 1000 * cm;
+		   double z0 =    0 * cm;
+		   double dz =    0 * cm;
+
+		   // calculate emittance parameters (x,theta) and (y,phi)
+		   if (TargetRadius != 0) {	// case of finite target dimensions
+		      while (sqrt(x0*x0 + y0*y0) > TargetRadius) {
+		         RandomGaussian2D(MeanPosX, MeanPosTheta, SigmaPosX, SigmaPosTheta, x0, AngleEmittanceTheta);
+		         RandomGaussian2D(MeanPosY, MeanPosPhi,   SigmaPosY, SigmaPosPhi,   y0, AngleEmittancePhi);
+		      }
+		      // in case target is tilted, correct the z-position of interaction
+		      dz = x0 * tan(TargetAngle);
+		   }
+		   else {			// if no target radius is given consider a point-like target
+		      RandomGaussian2D(0, 0, 0, SigmaPosTheta, x0, AngleEmittanceTheta);
+		      RandomGaussian2D(0, 0, 0, SigmaPosPhi,   y0, AngleEmittancePhi);
+		   }
+
+		   // correct for the target angle wrt the beam axis
+		   // this simple correction is only valid if the beam is parallel to the beam axis
+		   // should be improved in a next version
+		   TargetThickness /= cos(TargetAngle);
+		   z0 = dz + (-TargetThickness / 2 + RandFlat::shoot() * TargetThickness);
+
+		   // Move to the target position
+		   x0 += target->GetTargetX();
+		   y0 += target->GetTargetY();
+		   z0 += target->GetTargetZ();
+		   InterCoord = G4ThreeVector(x0, y0, z0);
+
+		   // Calculate incident angle in spherical coordinate, passing by the direction vector dir      
+		   double Xdir = sin(AngleEmittanceTheta);
+		   double Ydir = sin(AngleEmittancePhi);
+		   double Zdir = cos(AngleEmittanceTheta) + cos(AngleEmittancePhi);
+
+		   AngleIncidentTheta = acos(Zdir / sqrt(Xdir*Xdir + Ydir*Ydir + Zdir*Zdir)) * rad;
+		   AngleIncidentPhi   = atan2(Ydir, Xdir) * rad;
+		   if (AngleIncidentPhi   < 0)    AngleIncidentPhi += 2*pi;
+		   if (AngleIncidentTheta < 1e-6) AngleIncidentPhi  = 0;
+	
+		}
+
+	else{
+		InterCoord = G4ThreeVector(0, 0, 0);
+		AngleEmittanceTheta=0;
+		AngleEmittancePhi=0;
+		AngleIncidentTheta=0; 
+		AngleIncidentPhi=0;
+
+		}
+		
+   
 }