diff --git a/Projects/T40/Analysis.cxx b/Projects/T40/Analysis.cxx
index 77d2e4fbf08f3d11518c6ed910a4926eaed8ba0c..c64c6e8644ab594664930a49046a35455641f155 100644
--- a/Projects/T40/Analysis.cxx
+++ b/Projects/T40/Analysis.cxx
@@ -19,11 +19,13 @@
  *                                                                           *
  *                                                                           *
  *****************************************************************************/
-#include<cassert>
-#include<iostream>
+#include <cassert>
+#include <iostream>
 
 using namespace std;
 
+#include "TSystem.h"
+
 #include "Analysis.h"
 #include "NPAnalysisFactory.h"
 #include "NPDetectorManager.h"
@@ -65,9 +67,9 @@ double calculate_fit_slope(int len, double* Aw_X, double* Aw_Z, double& R2)
 	/// TODO::: R2 doesn't seem to make sense... look into it!
 
 	return slope;
-} }
-
+}
 
+}
 ////////////////////////////////////////////////////////////////////////////////
 Analysis::Analysis(){
 }
@@ -75,21 +77,76 @@ Analysis::Analysis(){
 Analysis::~Analysis(){
 }
 
-////////////////////////////////////////////////////////////////////////////////
-void Analysis::Init(){
+namespace {
 
-  TH  = (TTiaraHyballPhysics*) m_DetectorManager -> GetDetector("HyballWedge");
-  TB  = (TTiaraBarrelPhysics*) m_DetectorManager -> GetDetector("Tiara");
-  TF  = (TFPDTamuPhysics*) m_DetectorManager -> GetDetector("FPDTamu");
-  TG  = (TGeTAMUPhysics*) m_DetectorManager -> GetDetector("GeTAMU");
+NPL::EnergyLoss check_energy_loss(const string& particle, const string& target){
+  string globalPath = getenv("NPTOOL");
+  string standardPath = globalPath + "/Inputs/EnergyLoss/";
+	string srimPath = particle+"_"+target+".SRIM";
+	string geantPath = particle+"_"+target+".G4table";
+
+	string pathList[4] = {
+		srimPath,                // SRIM in PWD
+		standardPath + srimPath, // SRIM in standard location
+		geantPath,               // GEANT in PWD
+		standardPath + geantPath // GEANT in standard location
+	};
+
+	int i=0;
+	for(;i<4;++i){
+		std::ifstream ifs(pathList[i].c_str());
+		if(ifs.good()) { break; }
+	}
 
+	int nstep;
+	string type;
+	switch(i){
+	case 0:
+		cout << "Using SRIM energy loss file in \"Projects/T40\"\n";
+		nstep = 10;
+		type = "SRIM";
+		break;
+	case 1:
+		cout << "Using SRIM energy loss file in \"Inputs/EnergyLoss\"\n";
+		nstep = 10;
+		type = "SRIM";
+		break;
+	case 2:
+		cout << "Using GEANT energy loss file in \"Projects/T40\"\n";
+		nstep = 100;
+		type = "G4table";
+		break;
+	case 3:
+		cout << "Using GEANT energy loss file in \"Inputs/EnergyLoss\"\n";
+		nstep = 100;
+		type = "G4table";
+		break;
+	default:
+		cerr << "FATAL ERROR:: Energy Loss file not found for particle: \"" << particle
+				 << "\", and material: \"" << target << "\" (neither SRIM nor GEANT)\n";
+		exit(1);
+		break;
+	}
+	
+	return NPL::EnergyLoss(pathList[i], type.c_str(), nstep);			
+} }
+
+
+////////////////////////////////////////////////////////////////////////////////
+void Analysis::Init(){
+	TH  = (TTiaraHyballPhysics*) m_DetectorManager -> GetDetector("HyballWedge");	assert(TH);
+	TB  = (TTiaraBarrelPhysics*) m_DetectorManager -> GetDetector("Tiara"); assert(TB);
+	TF  = (TFPDTamuPhysics*) m_DetectorManager -> GetDetector("FPDTamu"); assert(TF);
+	TG  = (TGeTAMUPhysics*) m_DetectorManager -> GetDetector("GeTAMU"); assert(TG);
+	MDM = (TMDMPhysics*) m_DetectorManager -> GetDetector("MDM"); assert(MDM);
 
-  // get reaction information
+	// get reaction information
   myReaction = new NPL::Reaction();
   myReaction->ReadConfigurationFile(NPOptionManager::getInstance()->GetReactionFile());
   OriginalBeamEnergy = myReaction->GetBeamEnergy();
   cout << "Original Beam energy (entrance of target): " << OriginalBeamEnergy << endl ;
-
+	if(MDM) { 	MDM->SetReaction(myReaction);  }
+	
   // target thickness
   TargetThickness = m_DetectorManager->GetTargetThickness();
   string TargetMaterial = m_DetectorManager->GetTargetMaterial();
@@ -109,20 +166,27 @@ void Analysis::Init(){
 */
 
 //Copied from Momo's Slack 170222.
+//GAC 171003 - check for existence of SRIM file, use that if available; if not,
+//default to G4table
+//
   string light=NPL::ChangeNameToG4Standard(myReaction->GetNucleus3().GetName());
   string beam=NPL::ChangeNameToG4Standard(myReaction->GetNucleus1().GetName());
-  LightTarget = NPL::EnergyLoss(light+"_"+TargetMaterial+".SRIM","SRIM",10 );
+	
+  LightTarget = check_energy_loss(light,TargetMaterial);
+	
 //by Shuya 170505
 //Note when you analyze the triple alpha calibration run, use He4_Al and He4_Si
-  LightAl = NPL::EnergyLoss(light+"_Al.SRIM","SRIM",10);
+  LightAl = check_energy_loss(light,"Al");
+		
   //LightAl = NPL::EnergyLoss("He4_Al.SRIM","SRIM",10);
-  LightSi = NPL::EnergyLoss(light+"_Si.SRIM","SRIM",10);
+  LightSi = check_energy_loss(light,"Si");
   //LightSi = NPL::EnergyLoss("He4_Si.SRIM","SRIM",10);
 
 //by Shuya 170530
   //LightCBacking = NPL::EnergyLoss(light+"_C.SRIM","SRIM",10);
 
-  BeamTarget = NPL::EnergyLoss(beam+"_"+TargetMaterial+".SRIM","SRIM",10);
+  BeamTarget = check_energy_loss(beam,TargetMaterial);
+	
   FinalBeamEnergy = BeamTarget.Slow(OriginalBeamEnergy, TargetThickness*0.5, 0);
   myReaction->SetBeamEnergy(FinalBeamEnergy);
   cout << "Final Beam energy (middle of target): " << FinalBeamEnergy << endl;
@@ -141,8 +205,8 @@ void Analysis::Init(){
 
   //Original_ELab=0;
   //Original_ThetaLab=0;
-  XTarget =-1.026126;
-  YTarget =-2.3589;
+  XTarget =0;
+  YTarget =0;
   BeamDirection = TVector3(0,0,1);
   InitOutputBranch();
   InitInputBranch();
@@ -228,15 +292,9 @@ void Analysis::TreatEvent(){
     ThetaTHSurface = 0;
     ThetaNormalTarget = 0;
     if(XTarget>-1000 && YTarget>-1000){
-      //TVector3 BeamImpact(XTarget,YTarget,0);
-	//by Shuya 171020 from 22Ne(d,d) IB7,8 5 degrees adjustment
-      //TVector3 BeamImpact(0.173098, 2.67341, 4.07383);
-	//by Shuya 171020 from 22Ne(d,d) IB7,8 5 degrees adjustment, but X, Y=0
-      TVector3 BeamImpact(XTarget, YTarget, 4.07383);
+      TVector3 BeamImpact(XTarget,YTarget,0);
 
-	//by Shuya 171218 (because of T40 meeting's discussion)
-      //TVector3 HitDirection = TH -> GetRandomisedPositionOfInteraction(countTiaraHyball) - BeamImpact ;
-      TVector3 HitDirection = TH -> GetPositionOfInteraction(countTiaraHyball) - BeamImpact ;
+      TVector3 HitDirection = TH -> GetRandomisedPositionOfInteraction(countTiaraHyball) - BeamImpact ;
 
       ThetaLab = HitDirection.Angle( BeamDirection );
       ThetaTHSurface = HitDirection.Angle(TVector3(0,0,-1)); // vector Normal on Hyball
@@ -245,8 +303,14 @@ void Analysis::TreatEvent(){
 	//by Shuya 171019
       PhiLab = HitDirection.Phi();
       PhiLab = PhiLab/(TMath::Pi())*180.0;
-	//by Shuya 171208
-      PhiLab_Hyball = PhiLab;
+
+	// GAC 171020
+			{
+				TVector3 v;
+				v.SetMagThetaPhi(1,ThetaLab*deg,PhiLab*deg);
+				ThetaXLab = atan(v.X()/v.Z()) / deg;
+				ThetaYLab = atan(v.Y()/v.z()) / deg;
+			}
     }
     else{
       BeamDirection = TVector3(-1000,-1000,-1000);
@@ -257,9 +321,6 @@ void Analysis::TreatEvent(){
     /////////////////////////////
     // Part 2 : Impact Energy
     Energy = ELab = 0;
-//by Shuya 171206
-    ELab_Hyball = 0;
-
     Si_E_TH = TH->Strip_E[countTiaraHyball];
     Energy = Si_E_TH; // calibration for hyball is in MeV
     // Correct for energy loss using the thickness of the target and the dead layer
@@ -281,9 +342,6 @@ void Analysis::TreatEvent(){
     ThetaCM  = myReaction -> EnergyLabToThetaCM( ELab , ThetaLab)/deg;
     ThetaLab=ThetaLab/deg;
 
-//by Shuya 171206
-    ELab_Hyball = ELab;
-    ThetaLab_Hyball = ThetaLab;
 //by Shuya 170703
     Ex_Hyball = Ex;
 
@@ -303,16 +361,9 @@ void Analysis::TreatEvent(){
     ThetaTBSurface = 0;
     ThetaNormalTarget = 0;
     if(XTarget>-1000 && YTarget>-1000){
-      //TVector3 BeamImpact(XTarget,YTarget,0);
-	//by Shuya 171020 from 22Ne(d,d) IB7,8 5 degrees adjustment
-      //TVector3 BeamImpact(0.173098, 2.67341, 4.07383);
-	//by Shuya 171020 from 22Ne(d,d) IB7,8 5 degrees adjustment, but X, Y=0
-      TVector3 BeamImpact(XTarget, YTarget, 4.07383);
-
-	//by Shuya 171218 (because of T40 meeting's discussion)
-      //TVector3 HitDirection = TB -> GetRandomisedPositionOfInteraction(countTiaraBarrel) - BeamImpact ;
-      TVector3 HitDirection = TB -> GetPositionOfInteraction(countTiaraBarrel) - BeamImpact ;
+      TVector3 BeamImpact(XTarget,YTarget,0);
 
+      TVector3 HitDirection = TB -> GetRandomisedPositionOfInteraction(countTiaraBarrel) - BeamImpact ;
       //Angle of emission wrt to beam
       ThetaLab = HitDirection.Angle( BeamDirection );
       ThetaNormalTarget = HitDirection.Angle( TVector3(0,0,1) ) ;
@@ -325,8 +376,14 @@ void Analysis::TreatEvent(){
 	//by Shuya 171019
       PhiLab = HitDirection.Phi();
       PhiLab = PhiLab/(TMath::Pi())*180.0;
-	//by Shuya 171208
-      PhiLab_Barrel = PhiLab;
+	//GAC 171020
+			{
+				TVector3 v;
+				v.SetMagThetaPhi(1,ThetaLab*deg,PhiLab*deg);
+				ThetaXLab = atan(v.X()/v.Z()) / deg;
+				ThetaYLab = atan(v.Y()/v.z()) / deg;
+			}
+
     }
     else{
       BeamDirection = TVector3(-1000,-1000,-1000);
@@ -337,9 +394,6 @@ void Analysis::TreatEvent(){
     /////////////////////////////
     // Part 2 : Impact Energy
     Energy = ELab = 0;
-//by Shuya 171206
-    ELab_Barrel = 0;
-
     Si_E_InnerTB = TB->Strip_E[countTiaraBarrel];
     Energy = Si_E_InnerTB*keV;// calibration for barrel is in keV
     
@@ -350,14 +404,6 @@ void Analysis::TreatEvent(){
 	      Energy = Si_E_InnerTB*keV + Si_E_OuterTB*keV;
 	    }
 
-	//by Shuya 171208. If you need E+dE for Barrel.
-    for(unsigned int countTiaraOuterBarrel = 0 ; countTiaraOuterBarrel < TB->Outer_Strip_E.size() ; countTiaraOuterBarrel++){
-	    if(TB->Outer_Detector_N[countTiaraOuterBarrel]==TB->Detector_N[countTiaraBarrel] && TB->Outer_Strip_E[countTiaraOuterBarrel]>0){
-	      	Si_E_OuterTB = TB->Outer_Strip_E[countTiaraOuterBarrel];
-	        Energy = Si_E_InnerTB*keV + Si_E_OuterTB*keV;
-		}
-	}
-
     // Evaluate energy using the thickness, Target and Si dead layer Correction
 		if(Energy > 0){
 			ELab = LightSi.EvaluateInitialEnergy( Energy ,0.3*micrometer, ThetaTBSurface);
@@ -379,10 +425,6 @@ void Analysis::TreatEvent(){
     ThetaCM  = myReaction -> EnergyLabToThetaCM( ELab , ThetaLab)/deg;
     ThetaLab=ThetaLab/deg;
 
-//by Shuya 171206
-    ELab_Barrel = ELab;
-    ThetaLab_Barrel = ThetaLab;
-
     /////////////////////////////
     // Part 5 : Implementing randomised position impact matrix for both the entire Barrel (all 8 strips) and each strip making up the octagonal Barrel individually
     TVector3 BarrelRandomImpactPosition = TB -> GetRandomisedPositionOfInteraction(countTiaraBarrel);
@@ -516,6 +558,16 @@ void Analysis::TreatEvent(){
 		if(detNumber >=0 && detNumber< 4) {
 			Aw_X[detNumber] = TF->AWirePositionX[iw];
 			Aw_Z[detNumber] = TF->AWirePositionZ[iw];
+
+			// Fill MDM class with FPD data
+			// Only do this if it's not there already
+			// (e.g. data files, not similation)
+			if(MDM && RootInput::getInstance()->GetChain()->GetBranch("MDM") == 0) {
+				MDM->DetectorNumber.push_back(detNumber);
+				MDM->Xpos.push_back(Aw_X[detNumber]);
+				MDM->Ypos.push_back(0);
+				MDM->Zpos.push_back(Aw_Z[detNumber]);
+			}
 		}
 		else {
 			cerr << "WARNING:: Wire number not bewtween 0 and 4!\n";
@@ -596,6 +648,19 @@ void Analysis::TreatEvent(){
   else
     TacSiGeOR = -999;
 
+	/////////////////////////////////////////////////////////////
+	// MDM RECONSTRUCTION OF TARGET PARAMETERS //////////////////
+	/////////////////////////////////////////////////////////////
+	if(MDM){
+		if(Ex != -1000) MDM->SetEx4(Ex);
+		else            MDM->SetEx4(0);
+		MDM->SetLightParticleAngles(ThetaLab, PhiLab);
+
+		// do target parameter minimization
+		MDM->MinimizeTarget();
+	}
+	
+	
   //by Shuya 170524
  	//RunNumber = RootInput::getInstance()->GetChain()->GetFileNumber() + 1;
 	if(currentfilename != RootInput::getInstance()->GetChain()->GetCurrentFile()->GetName())
@@ -620,12 +685,6 @@ void Analysis::ReInitValue(){
   //Silicon
   Ex = -1000 ;
   ELab = -1000;
-//by Shuya 171206
-  ELab_Hyball = -1000;
-  ELab_Barrel = -1000;
-  ThetaLab_Hyball = -1000;
-  ThetaLab_Barrel = -1000;
-
   ThetaLab = -1000;
   ThetaCM = -1000;
   LightParticleDetected = false ;
@@ -634,9 +693,7 @@ void Analysis::ReInitValue(){
   Ex_Barrel = -1000 ;
 //by Shuya 171019
   PhiLab = -1000;
-//by Shuya 171208
-  PhiLab_Hyball = -1000;
-  PhiLab_Barrel = -1000;
+	ThetaXLab = ThetaYLab = -1000;
 
   //Simu
   //Original_ELab = -1000;
@@ -714,20 +771,13 @@ void Analysis::InitOutputBranch() {
   RootOutput::getInstance()->GetTree()->Branch("Ex_Barrel",&Ex_Barrel,"Ex_Barrel/D");
 
   RootOutput::getInstance()->GetTree()->Branch("ELab",&ELab,"ELab/D");
-//by Shuya 171206
-  RootOutput::getInstance()->GetTree()->Branch("ELab_Hyball",&ELab_Hyball,"ELab_Hyball/D");
-  RootOutput::getInstance()->GetTree()->Branch("ELab_Barrel",&ELab_Barrel,"ELab_Barrel/D");
-
   RootOutput::getInstance()->GetTree()->Branch("ThetaLab",&ThetaLab,"ThetaLab/D");
-//by Shuya 171206
-  RootOutput::getInstance()->GetTree()->Branch("ThetaLab_Hyball",&ThetaLab_Hyball,"ThetaLab_Hyball/D");
-  RootOutput::getInstance()->GetTree()->Branch("ThetaLab_Barrel",&ThetaLab_Barrel,"ThetaLab_Barrel/D");
-
   RootOutput::getInstance()->GetTree()->Branch("ThetaCM",&ThetaCM,"ThetaCM/D");
 //by Shuya 171019
   RootOutput::getInstance()->GetTree()->Branch("PhiLab",&PhiLab,"PhiLab/D");
-  RootOutput::getInstance()->GetTree()->Branch("PhiLab_Hyball",&PhiLab_Hyball,"PhiLab_Hyball/D");
-  RootOutput::getInstance()->GetTree()->Branch("PhiLab_Barrel",&PhiLab_Barrel,"PhiLab_Barrel/D");
+  RootOutput::getInstance()->GetTree()->Branch("ThetaXLab",&ThetaXLab,"ThetaXLab/D");
+  RootOutput::getInstance()->GetTree()->Branch("ThetaYLab",&ThetaYLab,"ThetaYLab/D");
+	
 
   RootOutput::getInstance()->GetTree()->Branch("TiaraImpactMatrixX",&TiaraIMX,"TiaraImpactMatrixX/D");
   RootOutput::getInstance()->GetTree()->Branch("TiaraImpactMatrixY",&TiaraIMY,"TiaraImpactMatrixY/D");
@@ -792,8 +842,7 @@ void Analysis::InitOutputBranch() {
 	RootOutput::getInstance()->GetTree()->Branch("TacSiMicro_dE",&TacSiMicro_dE,"TacSiMicro_dE/D");
 
 	RootOutput::getInstance()->GetTree()->Branch("TacSiPlastLeft",&TacSiPlastLeft,"TacSiPlastLeft/D");
-  	RootOutput::getInstance()->GetTree()->Branch("TacSiPlastRight",&TacSiPlastRight,"TacSiPlastRight/D");
-
+  RootOutput::getInstance()->GetTree()->Branch("TacSiPlastRight",&TacSiPlastRight,"TacSiPlastRight/D");
 
 // Other
 	RootOutput::getInstance()->GetTree()->Branch("RunNumber", &RunNumber,"RunNumber/I");
diff --git a/Projects/T40/Analysis.h b/Projects/T40/Analysis.h
index aae93b6640c5ae6dc882405d4c0846c5e3936c00..938e3fffcaf5d740e2ebfe36e8a2d2f1334d30a0 100644
--- a/Projects/T40/Analysis.h
+++ b/Projects/T40/Analysis.h
@@ -27,7 +27,7 @@
 #include "TTiaraBarrelPhysics.h"
 #include "TFPDTamuPhysics.h"
 #include "TGeTAMUPhysics.h"
-//#include "TMDMPhysics.h"
+#include "TMDMPhysics.h"
 #include "TInitialConditions.h"
 #include "NPEnergyLoss.h"
 #include "NPReaction.h"
@@ -61,15 +61,7 @@ class Analysis: public NPL::VAnalysis{
   double Ex_Barrel;
 
   double ELab;
-//by Shuya 171206
-  double ELab_Hyball;
-  double ELab_Barrel;
-
   double ThetaLab;
-//by Shuya 171206
-  double ThetaLab_Hyball;
-  double ThetaLab_Barrel;
-
   double ThetaCM;
   double TiaraIMX;
   double TiaraIMY;
@@ -79,10 +71,6 @@ class Analysis: public NPL::VAnalysis{
   bool LightParticleDetected;
 //by Shuya 171019
   double PhiLab;
-//by Shuya 171206
-  double PhiLab_Hyball;
-  double PhiLab_Barrel;
-
 // GAC 171020
 	double ThetaXLab;
 	double ThetaYLab;
@@ -103,8 +91,8 @@ class Analysis: public NPL::VAnalysis{
   TTiaraBarrelPhysics* TB;  
   TFPDTamuPhysics* TF;
   TGeTAMUPhysics* TG;
-	//TMDMPhysics* MDM;
-	//bool MDM_in_file; //!
+	TMDMPhysics* MDM;
+	bool MDM_in_file; //!
 
   TRandom *Rand ;
 	double ThetaNormalTarget  ;