diff --git a/Inputs/CrossSection/sofia.txt b/Inputs/CrossSection/sofia.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f746adbf9d162c0542da29ded000378c368537be
--- /dev/null
+++ b/Inputs/CrossSection/sofia.txt
@@ -0,0 +1,53 @@
+0	1
+0.1	1
+0.2	1
+0.3	1
+0.4	1
+0.5	1
+0.6	1
+0.7	1
+0.8	1
+0.9	1
+1	1
+1.1	1
+1.2	1
+1.3	1
+1.4	1
+1.5	1
+1.6	1
+1.7	1
+1.8	1
+1.9	1
+2	1
+2.1	1
+2.2	1
+2.3	1
+2.4	1
+2.5	1
+2.6	1
+2.7	1
+2.8	1
+2.9	1
+3	1
+3.1	1
+3.2	1
+3.3	1
+3.4	1
+3.5	1
+3.6	1
+3.7	1
+3.8	1
+3.9	1
+4	1
+4.1	0
+4.2	0
+4.3	0
+4.4	0
+4.5	0
+4.6	0
+4.7	0
+4.8	0
+4.9	0
+5	0
+5.1	0
+180	0
diff --git a/Inputs/EventGenerator/sofia.reaction b/Inputs/EventGenerator/sofia.reaction
new file mode 100644
index 0000000000000000000000000000000000000000..c7c54e908a5cb9fcbf3d7f3663008c2222908f54
--- /dev/null
+++ b/Inputs/EventGenerator/sofia.reaction
@@ -0,0 +1,34 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%  Reaction file for 238U transfer reaction  %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%Beam energy given in MeV ; Excitation in MeV ; emmitance in rad
+Beam
+ Particle= 238U
+ Energy= 166000
+ SigmaEnergy= 2
+ SigmaX= 1 cm
+ SigmaY= 1 cm
+ SigmaThetaX= 0 
+ SigmaPhiY= 0
+ MeanThetaX= 0
+ MeanPhiY= 0
+ MeanX= 0
+ MeanY= 0
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+TwoBodyReaction
+ Beam= 238U
+ Target= 208Pb
+ Light= 208Pb
+ Heavy= 238U
+ ExcitationEnergyLight= 0.0
+ ExcitationEnergyHeavy= 15.0
+ CrossSectionPath= sofia.txt CS
+ ShootLight= 1
+ ShootHeavy= 1
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+FissionDecay 
+ CompoundNucleus= 238U
+ FissionModel= GEF
+ Shoot_FF= 1
+ Shoot_neutron= 0
+ Shoot_gamma= 0
diff --git a/NPLib/Detectors/Sofia/CMakeLists.txt b/NPLib/Detectors/Sofia/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5669724d43fb231d151c6d86c7fa75fe33187cc8
--- /dev/null
+++ b/NPLib/Detectors/Sofia/CMakeLists.txt
@@ -0,0 +1,6 @@
+add_custom_command(OUTPUT TSofiaPhysicsDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TSofiaPhysics.h TSofiaPhysicsDict.cxx TSofiaPhysics.rootmap libNPSofia.dylib DEPENDS TSofiaPhysics.h)
+add_custom_command(OUTPUT TSofiaDataDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TSofiaData.h TSofiaDataDict.cxx TSofiaData.rootmap libNPSofia.dylib DEPENDS TSofiaData.h)
+add_library(NPSofia SHARED TSofiaSpectra.cxx TSofiaData.cxx TSofiaPhysics.cxx TSofiaDataDict.cxx TSofiaPhysicsDict.cxx )
+target_link_libraries(NPSofia ${ROOT_LIBRARIES} NPCore) 
+install(FILES TSofiaData.h TSofiaPhysics.h TSofiaSpectra.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY})
+
diff --git a/NPLib/Detectors/Sofia/TSofiaData.cxx b/NPLib/Detectors/Sofia/TSofiaData.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..b49f65f4a716d95bea17e53030ca19ecc1a025f7
--- /dev/null
+++ b/NPLib/Detectors/Sofia/TSofiaData.cxx
@@ -0,0 +1,65 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2020   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: Pierre Morfouace  contact address: pierre.morfouace2@cea.fr                        *
+ *                                                                           *
+ * Creation Date  : November 2020                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Sofia Raw data                                    *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+#include "TSofiaData.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
+using namespace std; 
+
+ClassImp(TSofiaData)
+
+
+//////////////////////////////////////////////////////////////////////
+TSofiaData::TSofiaData() {
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+TSofiaData::~TSofiaData() {
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+void TSofiaData::Clear() {
+  // Energy
+  fTOF_DetectorNbr.clear();
+  fTOF_PlasticNbr.clear();
+  fTOF_Energy.clear();
+  fTOF_Time.clear();
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+void TSofiaData::Dump() const {
+  // This method is very useful for debuging and worth the dev.
+  cout << "XXXXXXXXXXXXXXXXXXXXXXXX New Event [TSofiaData::Dump()] XXXXXXXXXXXXXXXXX" << endl;
+
+  // Energy
+  size_t mysize = fTOF_DetectorNbr.size();
+  cout << "TOF_Mult: " << mysize << endl;
+ 
+}
diff --git a/NPLib/Detectors/Sofia/TSofiaData.h b/NPLib/Detectors/Sofia/TSofiaData.h
new file mode 100644
index 0000000000000000000000000000000000000000..492ae08bf288edc27a33c4b9e9e2dd065c5cd899
--- /dev/null
+++ b/NPLib/Detectors/Sofia/TSofiaData.h
@@ -0,0 +1,87 @@
+#ifndef __SofiaDATA__
+#define __SofiaDATA__
+/*****************************************************************************
+ * Copyright (C) 2009-2020   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: Pierre Morfouace  contact address: pierre.morfouace2@cea.fr                        *
+ *                                                                           *
+ * Creation Date  : November 2020                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Sofia Raw data                                    *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// STL
+#include <vector>
+using namespace std;
+
+// ROOT
+#include "TObject.h"
+
+class TSofiaData : public TObject {
+  //////////////////////////////////////////////////////////////
+  // data members are hold into vectors in order 
+  // to allow multiplicity treatment
+  private: 
+    vector<int>      fTOF_DetectorNbr;
+    vector<int>      fTOF_PlasticNbr;
+    vector<double>   fTOF_Energy;
+    vector<double>   fTOF_Time;
+
+
+
+  //////////////////////////////////////////////////////////////
+  // Constructor and destructor
+  public: 
+    TSofiaData();
+    ~TSofiaData();
+    
+
+  //////////////////////////////////////////////////////////////
+  // Inherited from TObject and overriden to avoid warnings
+  public:
+    void Clear();
+    void Clear(const Option_t*) {};
+    void Dump() const;
+
+
+  //////////////////////////////////////////////////////////////
+  // Getters and Setters
+  // Prefer inline declaration to avoid unnecessary called of 
+  // frequently used methods
+  // add //! to avoid ROOT creating dictionnary for the methods
+  public:
+    //////////////////////    SETTERS    ////////////////////////
+    inline void SetDetectorNbr(int det){fTOF_DetectorNbr.push_back(det);};//!
+    inline void SetPlasticNbr(int plastic){fTOF_PlasticNbr.push_back(plastic);};//!
+    inline void SetEnergy(double Energy){fTOF_Energy.push_back(Energy);};//!
+    inline void SetTime(double Time){fTOF_Time.push_back(Time);};//!
+
+
+
+    //////////////////////    GETTERS    ////////////////////////
+    // Energy
+    inline int GetMultiplicity() const {return fTOF_PlasticNbr.size();}
+    inline int GetDetectorNbr(const unsigned int &i) const {return fTOF_DetectorNbr[i];}//! 
+    inline int GetPlasticNbr(const unsigned int &i) const {return fTOF_PlasticNbr[i];}//!     
+    inline double GetEnergy(const unsigned int &i) const {return fTOF_Energy[i];}//!     
+    inline double GetTime(const unsigned int &i) const {return fTOF_Time[i];}//!     
+
+
+  //////////////////////////////////////////////////////////////
+  // Required for ROOT dictionnary
+  ClassDef(TSofiaData,1)  // SofiaData structure
+};
+
+#endif
diff --git a/NPLib/Detectors/Sofia/TSofiaPhysics.cxx b/NPLib/Detectors/Sofia/TSofiaPhysics.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..ce6f5fc40da0551fc4dac3fbd078d0f01c74eeff
--- /dev/null
+++ b/NPLib/Detectors/Sofia/TSofiaPhysics.cxx
@@ -0,0 +1,337 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2020   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: Pierre Morfouace  contact address: pierre.morfouace2@cea.fr                        *
+ *                                                                           *
+ * Creation Date  : November 2020                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Sofia Treated  data                               *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+#include "TSofiaPhysics.h"
+
+//   STL
+#include <sstream>
+#include <iostream>
+#include <cmath>
+#include <stdlib.h>
+#include <limits>
+using namespace std;
+
+//   NPL
+#include "RootInput.h"
+#include "RootOutput.h"
+#include "NPDetectorFactory.h"
+#include "NPOptionManager.h"
+
+//   ROOT
+#include "TChain.h"
+
+ClassImp(TSofiaPhysics)
+
+
+///////////////////////////////////////////////////////////////////////////
+TSofiaPhysics::TSofiaPhysics()
+   : m_EventData(new TSofiaData),
+     m_PreTreatedData(new TSofiaData),
+     m_EventPhysics(this),
+     m_Spectra(0),
+     m_E_RAW_Threshold(0), // adc channels
+     m_E_Threshold(0),     // MeV
+     m_NumberOfDetectors(0) {
+}
+
+///////////////////////////////////////////////////////////////////////////
+/// A usefull method to bundle all operation to add a detector
+void TSofiaPhysics::AddDetector(TVector3 , string ){
+  // In That simple case nothing is done
+  // Typically for more complex detector one would calculate the relevant 
+  // positions (stripped silicon) or angles (gamma array)
+  m_NumberOfDetectors++;
+} 
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::AddDetector(double R, double Theta, double Phi, string shape){
+  // Compute the TVector3 corresponding
+  TVector3 Pos(R*sin(Theta)*cos(Phi),R*sin(Theta)*sin(Phi),R*cos(Theta));
+  // Call the cartesian method
+  AddDetector(Pos,shape);
+} 
+  
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::BuildSimplePhysicalEvent() {
+  BuildPhysicalEvent();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::BuildPhysicalEvent() {
+  // apply thresholds and calibration
+  PreTreat();
+
+  // match energy and time together
+  unsigned int mysizeE = m_PreTreatedData->GetMultiplicity();
+  for (UShort_t e = 0; e < mysizeE ; e++) {
+    DetectorNumber.push_back(m_PreTreatedData->GetDetectorNbr(e));
+    PlasticNumber.push_back(m_PreTreatedData->GetPlasticNbr(e));
+    Energy.push_back(m_PreTreatedData->GetEnergy(e));
+    Time.push_back(m_PreTreatedData->GetTime(e));
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::PreTreat() {
+  // This method typically applies thresholds and calibrations
+  // Might test for disabled channels for more complex detector
+
+  // clear pre-treated object
+  ClearPreTreatedData();
+
+  // instantiate CalibrationManager
+  static CalibrationManager* Cal = CalibrationManager::getInstance();
+
+  // Energy
+  unsigned int mysize = m_EventData->GetMultiplicity();
+  for (UShort_t i = 0; i < mysize ; ++i) {
+    if (m_EventData->GetEnergy(i) > m_E_RAW_Threshold) {
+      Double_t Energy = Cal->ApplyCalibration("Sofia/ENERGY"+NPL::itoa(m_EventData->GetPlasticNbr(i)),m_EventData->GetEnergy(i));
+      if (Energy > m_E_Threshold) {
+        m_PreTreatedData->SetDetectorNbr(m_EventData->GetDetectorNbr(i));
+        m_PreTreatedData->SetPlasticNbr(m_EventData->GetPlasticNbr(i));
+        m_PreTreatedData->SetTime(m_EventData->GetTime(i));
+        m_PreTreatedData->SetEnergy(Energy);
+      }
+    }
+  }
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::ReadAnalysisConfig() {
+  bool ReadingStatus = false;
+
+  // path to file
+  string FileName = "./configs/ConfigSofia.dat";
+
+  // open analysis config file
+  ifstream AnalysisConfigFile;
+  AnalysisConfigFile.open(FileName.c_str());
+
+  if (!AnalysisConfigFile.is_open()) {
+    cout << " No ConfigSofia.dat found: Default parameter loaded for Analayis " << FileName << endl;
+    return;
+  }
+  cout << " Loading user parameter for Analysis from ConfigSofia.dat " << endl;
+
+  // Save it in a TAsciiFile
+  TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig();
+  asciiConfig->AppendLine("%%% ConfigSofia.dat %%%");
+  asciiConfig->Append(FileName.c_str());
+  asciiConfig->AppendLine("");
+  // read analysis config file
+  string LineBuffer,DataBuffer,whatToDo;
+  while (!AnalysisConfigFile.eof()) {
+    // Pick-up next line
+    getline(AnalysisConfigFile, LineBuffer);
+
+    // search for "header"
+    string name = "ConfigSofia";
+    if (LineBuffer.compare(0, name.length(), name) == 0) 
+      ReadingStatus = true;
+
+    // loop on tokens and data
+    while (ReadingStatus ) {
+      whatToDo="";
+      AnalysisConfigFile >> whatToDo;
+
+      // Search for comment symbol (%)
+      if (whatToDo.compare(0, 1, "%") == 0) {
+        AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' );
+      }
+
+      else if (whatToDo=="E_RAW_THRESHOLD") {
+        AnalysisConfigFile >> DataBuffer;
+        m_E_RAW_Threshold = atof(DataBuffer.c_str());
+        cout << whatToDo << " " << m_E_RAW_Threshold << endl;
+      }
+
+      else if (whatToDo=="E_THRESHOLD") {
+        AnalysisConfigFile >> DataBuffer;
+        m_E_Threshold = atof(DataBuffer.c_str());
+        cout << whatToDo << " " << m_E_Threshold << endl;
+      }
+
+      else {
+        ReadingStatus = false;
+      }
+    }
+  }
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::Clear() {
+  DetectorNumber.clear();
+  PlasticNumber.clear();
+  Energy.clear();
+  Time.clear();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::ReadConfiguration(NPL::InputParser parser) {
+  vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Sofia");
+  if(NPOptionManager::getInstance()->GetVerboseLevel())
+    cout << "//// " << blocks.size() << " detectors found " << endl; 
+
+  vector<string> cart = {"POS","Shape"};
+  vector<string> sphe = {"R","Theta","Phi","Shape"};
+
+  for(unsigned int i = 0 ; i < blocks.size() ; i++){
+    if(blocks[i]->HasTokenList(cart)){
+      if(NPOptionManager::getInstance()->GetVerboseLevel())
+        cout << endl << "////  Sofia " << i+1 <<  endl;
+    
+      TVector3 Pos = blocks[i]->GetTVector3("POS","mm");
+      string Shape = blocks[i]->GetString("Shape");
+      AddDetector(Pos,Shape);
+    }
+    else if(blocks[i]->HasTokenList(sphe)){
+      if(NPOptionManager::getInstance()->GetVerboseLevel())
+        cout << endl << "////  Sofia " << i+1 <<  endl;
+      double R = blocks[i]->GetDouble("R","mm");
+      double Theta = blocks[i]->GetDouble("Theta","deg");
+      double Phi = blocks[i]->GetDouble("Phi","deg");
+      string Shape = blocks[i]->GetString("Shape");
+      AddDetector(R,Theta,Phi,Shape);
+    }
+    else{
+      cout << "ERROR: check your input file formatting " << endl;
+      exit(1);
+    }
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::InitSpectra() {
+  m_Spectra = new TSofiaSpectra(m_NumberOfDetectors);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::FillSpectra() {
+  m_Spectra -> FillRawSpectra(m_EventData);
+  m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData);
+  m_Spectra -> FillPhysicsSpectra(m_EventPhysics);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::CheckSpectra() {
+  m_Spectra->CheckSpectra();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::ClearSpectra() {
+  // To be done
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+map< string , TH1*> TSofiaPhysics::GetSpectra() {
+  if(m_Spectra)
+    return m_Spectra->GetMapHisto();
+  else{
+    map< string , TH1*> empty;
+    return empty;
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::WriteSpectra() {
+  m_Spectra->WriteSpectra();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::AddParameterToCalibrationManager() {
+  CalibrationManager* Cal = CalibrationManager::getInstance();
+  for (int i = 0; i < m_NumberOfDetectors; ++i) {
+    Cal->AddParameter("Sofia", "D"+ NPL::itoa(i+1)+"_ENERGY","Sofia_D"+ NPL::itoa(i+1)+"_ENERGY");
+    Cal->AddParameter("Sofia", "D"+ NPL::itoa(i+1)+"_TIME","Sofia_D"+ NPL::itoa(i+1)+"_TIME");
+  }
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::InitializeRootInputRaw() {
+  TChain* inputChain = RootInput::getInstance()->GetChain();
+  inputChain->SetBranchStatus("Sofia",  true );
+  inputChain->SetBranchAddress("Sofia", &m_EventData );
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::InitializeRootInputPhysics() {
+  TChain* inputChain = RootInput::getInstance()->GetChain();
+  inputChain->SetBranchAddress("Sofia", &m_EventPhysics);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TSofiaPhysics::InitializeRootOutput() {
+  TTree* outputTree = RootOutput::getInstance()->GetTree();
+  outputTree->Branch("Sofia", "TSofiaPhysics", &m_EventPhysics);
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+//            Construct Method to be pass to the DetectorFactory              //
+////////////////////////////////////////////////////////////////////////////////
+NPL::VDetector* TSofiaPhysics::Construct() {
+  return (NPL::VDetector*) new TSofiaPhysics();
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+//            Registering the construct method to the factory                 //
+////////////////////////////////////////////////////////////////////////////////
+extern "C"{
+class proxy_Sofia{
+  public:
+    proxy_Sofia(){
+      NPL::DetectorFactory::getInstance()->AddToken("Sofia","Sofia");
+      NPL::DetectorFactory::getInstance()->AddDetector("Sofia",TSofiaPhysics::Construct);
+    }
+};
+
+proxy_Sofia p_Sofia;
+}
+
diff --git a/NPLib/Detectors/Sofia/TSofiaPhysics.h b/NPLib/Detectors/Sofia/TSofiaPhysics.h
new file mode 100644
index 0000000000000000000000000000000000000000..984de993ee33784ace9fc9629592713dfe768b1c
--- /dev/null
+++ b/NPLib/Detectors/Sofia/TSofiaPhysics.h
@@ -0,0 +1,181 @@
+#ifndef TSofiaPHYSICS_H
+#define TSofiaPHYSICS_H
+/*****************************************************************************
+ * Copyright (C) 2009-2020   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: Pierre Morfouace  contact address: pierre.morfouace2@cea.fr                        *
+ *                                                                           *
+ * Creation Date  : November 2020                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Sofia Treated data                                *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// C++ headers 
+#include <vector>
+#include <map>
+#include <string>
+using namespace std;
+
+// ROOT headers
+#include "TObject.h"
+#include "TH1.h"
+#include "TVector3.h"
+// NPTool headers
+#include "TSofiaData.h"
+#include "TSofiaSpectra.h"
+#include "NPCalibrationManager.h"
+#include "NPVDetector.h"
+#include "NPInputParser.h"
+// forward declaration
+class TSofiaSpectra;
+
+
+
+class TSofiaPhysics : public TObject, public NPL::VDetector {
+  //////////////////////////////////////////////////////////////
+  // constructor and destructor
+  public:
+    TSofiaPhysics();
+    ~TSofiaPhysics() {};
+
+
+  //////////////////////////////////////////////////////////////
+  // Inherited from TObject and overriden to avoid warnings
+  public: 
+    void Clear();   
+    void Clear(const Option_t*) {};
+
+
+  //////////////////////////////////////////////////////////////
+  // data obtained after BuildPhysicalEvent() and stored in
+  // output ROOT file
+  public:
+    vector<int>      DetectorNumber;
+    vector<int>      PlasticNumber;
+    vector<double>   Energy;
+    vector<double>   Time;
+
+  /// A usefull method to bundle all operation to add a detector
+  void AddDetector(TVector3 POS, string shape); 
+  void AddDetector(double R, double Theta, double Phi, string shape); 
+  
+  //////////////////////////////////////////////////////////////
+  // methods inherited from the VDetector ABC class
+  public:
+    // read stream from ConfigFile to pick-up detector parameters
+    void ReadConfiguration(NPL::InputParser);
+
+    // add parameters to the CalibrationManger
+    void AddParameterToCalibrationManager();
+
+    // method called event by event, aiming at extracting the 
+    // physical information from detector
+    void BuildPhysicalEvent();
+
+    // same as BuildPhysicalEvent() method but with a simpler
+    // treatment
+    void BuildSimplePhysicalEvent();
+
+    // same as above but for online analysis
+    void BuildOnlinePhysicalEvent()  {BuildPhysicalEvent();};
+
+    // activate raw data object and branches from input TChain
+    // in this method mother branches (Detector) AND daughter leaves 
+    // (fDetector_parameter) have to be activated
+    void InitializeRootInputRaw();
+
+    // activate physics data object and branches from input TChain
+    // in this method mother branches (Detector) AND daughter leaves 
+    // (fDetector_parameter) have to be activated
+    void InitializeRootInputPhysics();
+
+    // create branches of output ROOT file
+    void InitializeRootOutput();
+
+    // clear the raw and physical data objects event by event
+    void ClearEventPhysics() {Clear();}      
+    void ClearEventData()    {m_EventData->Clear();}   
+
+    // methods related to the TSofiaSpectra class
+    // instantiate the TSofiaSpectra class and 
+    // declare list of histograms
+    void InitSpectra();
+
+    // fill the spectra
+    void FillSpectra();
+
+    // used for Online mainly, sanity check for histograms and 
+    // change their color if issues are found, for example
+    void CheckSpectra();
+
+    // used for Online only, clear all the spectra
+    void ClearSpectra();
+
+    // write spectra to ROOT output file
+    void WriteSpectra();
+
+
+  //////////////////////////////////////////////////////////////
+  // specific methods to Sofia array
+  public:
+    // remove bad channels, calibrate the data and apply thresholds
+    void PreTreat();
+
+    // clear the pre-treated object
+    void ClearPreTreatedData()   {m_PreTreatedData->Clear();}
+
+    // read the user configuration file. If no file is found, load standard one
+    void ReadAnalysisConfig();
+
+    // give and external TSofiaData object to TSofiaPhysics. 
+    // needed for online analysis for example
+    void SetRawDataPointer(TSofiaData* rawDataPointer) {m_EventData = rawDataPointer;}
+    
+  // objects are not written in the TTree
+  private:
+    TSofiaData*         m_EventData;        //!
+    TSofiaData*         m_PreTreatedData;   //!
+    TSofiaPhysics*      m_EventPhysics;     //!
+
+  // getters for raw and pre-treated data object
+  public:
+    TSofiaData* GetRawData()        const {return m_EventData;}
+    TSofiaData* GetPreTreatedData() const {return m_PreTreatedData;}
+
+  // parameters used in the analysis
+  private:
+    // thresholds
+    double m_E_RAW_Threshold; //!
+    double m_E_Threshold;     //!
+
+  // number of detectors
+  private:
+    int m_NumberOfDetectors;  //!
+
+  // spectra class
+  private:
+    TSofiaSpectra* m_Spectra; // !
+
+  // spectra getter
+  public:
+    map<string, TH1*>   GetSpectra(); 
+
+  // Static constructor to be passed to the Detector Factory
+  public:
+    static NPL::VDetector* Construct();
+
+    ClassDef(TSofiaPhysics,1)  // SofiaPhysics structure
+};
+#endif
diff --git a/NPLib/Detectors/Sofia/TSofiaSpectra.cxx b/NPLib/Detectors/Sofia/TSofiaSpectra.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..2cd43574b09af67e0a3ec8d84e78ed050c157df8
--- /dev/null
+++ b/NPLib/Detectors/Sofia/TSofiaSpectra.cxx
@@ -0,0 +1,156 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2020   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: Pierre Morfouace  contact address: pierre.morfouace2@cea.fr                        *
+ *                                                                           *
+ * Creation Date  : November 2020                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Sofia Spectra                                     *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// class header 
+#include "TSofiaSpectra.h"
+
+// STL
+#include <iostream>  
+#include <string>
+using namespace std;
+
+// NPTool header
+#include "NPOptionManager.h"
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TSofiaSpectra::TSofiaSpectra() 
+   : fNumberOfDetectors(0) {
+  SetName("Sofia");
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TSofiaSpectra::TSofiaSpectra(unsigned int NumberOfDetectors) {
+  if(NPOptionManager::getInstance()->GetVerboseLevel()>0)
+    cout << "************************************************" << endl
+      << "TSofiaSpectra : Initalizing control spectra for " 
+      << NumberOfDetectors << " Detectors" << endl
+      << "************************************************" << endl ;
+  SetName("Sofia");
+  fNumberOfDetectors = NumberOfDetectors;
+
+  InitRawSpectra();
+  InitPreTreatedSpectra();
+  InitPhysicsSpectra();
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TSofiaSpectra::~TSofiaSpectra() {
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TSofiaSpectra::InitRawSpectra() {
+  static string name;
+  for (unsigned int i = 0; i < fNumberOfDetectors; i++) { // loop on number of detectors
+    // Energy 
+    name = "Sofia"+NPL::itoa(i+1)+"_ENERGY_RAW";
+    AddHisto1D(name, name, 4096, 0, 16384, "Sofia/RAW");
+    // Time 
+    name = "Sofia"+NPL::itoa(i+1)+"_TIME_RAW";
+    AddHisto1D(name, name, 4096, 0, 16384, "Sofia/RAW");
+  } // end loop on number of detectors
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TSofiaSpectra::InitPreTreatedSpectra() {
+  static string name;
+  for (unsigned int i = 0; i < fNumberOfDetectors; i++) { // loop on number of detectors
+    // Energy 
+    name = "Sofia"+NPL::itoa(i+1)+"_ENERGY_CAL";
+    AddHisto1D(name, name, 500, 0, 25, "Sofia/CAL");
+    // Time
+    name = "Sofia"+NPL::itoa(i+1)+"_TIME_CAL";
+    AddHisto1D(name, name, 500, 0, 25, "Sofia/CAL");
+
+  
+  }  // end loop on number of detectors
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TSofiaSpectra::InitPhysicsSpectra() {
+  static string name;
+  // Kinematic Plot 
+  name = "Sofia_ENERGY_TIME";
+  AddHisto2D(name, name, 500, 0, 500, 500, 0, 50, "Sofia/PHY");
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TSofiaSpectra::FillRawSpectra(TSofiaData* RawData) {
+  static string name;
+  static string family;
+
+  // Energy 
+  unsigned int sizeE = RawData->GetMultiplicity();
+  for (unsigned int i = 0; i < sizeE; i++) {
+    name = "Sofia"+NPL::itoa(RawData->GetPlasticNbr(i))+"_ENERGY_RAW";
+    family = "Sofia/RAW";
+
+    FillSpectra(family,name,RawData->GetEnergy(i));
+  }
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TSofiaSpectra::FillPreTreatedSpectra(TSofiaData* PreTreatedData) {
+  static string name;
+  static string family;
+  
+  // Energy 
+  unsigned int sizeE = PreTreatedData->GetMultiplicity();
+  for (unsigned int i = 0; i < sizeE; i++) {
+    name = "Sofia"+NPL::itoa(PreTreatedData->GetPlasticNbr(i))+"_ENERGY_CAL";
+    family = "Sofia/CAL";
+
+    FillSpectra(family,name,PreTreatedData->GetEnergy(i));
+  }
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TSofiaSpectra::FillPhysicsSpectra(TSofiaPhysics* Physics) {
+  static string name;
+  static string family;
+  family= "Sofia/PHY";
+
+  // Energy vs time
+  unsigned int sizeE = Physics->Energy.size();
+  for(unsigned int i = 0 ; i < sizeE ; i++){
+    name = "Sofia_ENERGY_TIME";
+    FillSpectra(family,name,Physics->Energy[i],Physics->Time[i]);
+  }
+}
+
diff --git a/NPLib/Detectors/Sofia/TSofiaSpectra.h b/NPLib/Detectors/Sofia/TSofiaSpectra.h
new file mode 100644
index 0000000000000000000000000000000000000000..ce0fef524a259cec57699f30c84c00dbcae12ee6
--- /dev/null
+++ b/NPLib/Detectors/Sofia/TSofiaSpectra.h
@@ -0,0 +1,62 @@
+#ifndef TSofiaSPECTRA_H
+#define TSofiaSPECTRA_H
+/*****************************************************************************
+ * Copyright (C) 2009-2020   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: Pierre Morfouace  contact address: pierre.morfouace2@cea.fr                        *
+ *                                                                           *
+ * Creation Date  : November 2020                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Sofia Spectra                                     *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// NPLib headers
+#include "NPVSpectra.h"
+#include "TSofiaData.h"
+#include "TSofiaPhysics.h"
+
+// Forward Declaration
+class TSofiaPhysics;
+
+
+class TSofiaSpectra : public VSpectra {
+  //////////////////////////////////////////////////////////////
+  // constructor and destructor
+  public:
+    TSofiaSpectra();
+    TSofiaSpectra(unsigned int NumberOfDetectors);
+    ~TSofiaSpectra();
+
+  //////////////////////////////////////////////////////////////
+  // Initialization methods
+  private:
+    void InitRawSpectra();
+    void InitPreTreatedSpectra();
+    void InitPhysicsSpectra();
+
+  //////////////////////////////////////////////////////////////
+  // Filling methods
+  public:
+    void FillRawSpectra(TSofiaData*);
+    void FillPreTreatedSpectra(TSofiaData*);
+    void FillPhysicsSpectra(TSofiaPhysics*);
+
+  //////////////////////////////////////////////////////////////
+  // Detector parameters 
+  private:
+    unsigned int fNumberOfDetectors;
+};
+
+#endif
diff --git a/NPLib/Physics/GEF.cxx b/NPLib/Physics/GEF.cxx
index e4b4ec5ca2b2c1fa40692fbd542159d6e004330b..91fe62db97e6fc50f6da7d2fb091cc5eaa605099 100644
--- a/NPLib/Physics/GEF.cxx
+++ b/NPLib/Physics/GEF.cxx
@@ -553,9 +553,10 @@ void GEF::FissionGENERAL()
 {
   float ZsqrA_fis;
 
-  //ZsqrA_fis = Csng(I_Z_CN^2) / Csng(I_A_CN);
-  ZsqrA_fis = pow(I_Z_CN,2)/I_A_CN;
-  Escission_lim = 0;//900.0 * exp(-ZsqrA_fis/13.0); // from PRC 86 (2012) 034605
+  ZsqrA_fis = Csng(I_Z_CN^2) / Csng(I_A_CN);
+  //ZsqrA_fis = pow(I_Z_CN,2)/I_A_CN;
+  //Escission_lim = 0;//900.0 * exp(-ZsqrA_fis/13.0); // from PRC 86 (2012) 034605
+  Escission_lim = 900.0 * exp(-ZsqrA_fis/13.0); // from PRC 86 (2012) 034605
   CentralZ_FM();
   I_N_CN = I_A_CN - I_Z_CN;
   MeanDefScission();
diff --git a/NPLib/include/NPXmlParser.cxx b/NPLib/include/NPXmlParser.cxx
deleted file mode 100644
index 55ad5f5917930b0335c59f225580ddf95728e53f..0000000000000000000000000000000000000000
--- a/NPLib/include/NPXmlParser.cxx
+++ /dev/null
@@ -1,144 +0,0 @@
-#include "NPXmlParser.h"
-#include <stdio.h>
-#include <iostream>
-using namespace NPL;
-
-////////////////////////////////////////////////////////////////////////////////
-block::block(){};
-block::~block(){};
-int block::AsInt(std::string name){
-  parameter p(name,"void");  
-  auto it = m_parameters.find(p);
-  if(it!=m_parameters.end()){
-    std::string s = it->GetValue(); 
-    return atoi(s.c_str());
-    }
-  else
-    return -1000;
-}
-
-double block::AsDouble(std::string name){
-  parameter p(name,"void");  
-  auto it = m_parameters.find(p);
-  if(it!=m_parameters.end()){
-    std::string s = it->GetValue(); 
-    return atof(s.c_str());
-    }
-  else
-    return -1000;
-}
-std::string block::AsString(std::string name){
-  parameter p(name,"void");  
-  auto it = m_parameters.find(p);
-  if(it!=m_parameters.end()){
-    std::string s = it->GetValue(); 
-    return s;
-    }
-  else
-    return "void";
-}
- 
-
-////////////////////////////////////////////////////////////////////////////////
-parameter::parameter(){};
-parameter::~parameter(){};
-
-////////////////////////////////////////////////////////////////////////////////
-Channel::Channel(){};
-Channel::~Channel(){};
-
-////////////////////////////////////////////////////////////////////////////////
-void XmlParser::LoadFile(std::string file){
-     // First create engine
-   TXMLEngine* xml = new TXMLEngine;
-   // Now try to parse xml file
-   // Only file with restricted xml syntax are supported
-   XMLDocPointer_t xmldoc = xml->ParseFile(file.c_str());
-   if (xmldoc==0) {
-      delete xml;
-      return;
-   }
-   // take access to main node
-   XMLNodePointer_t mainnode = xml->DocGetRootElement(xmldoc);
-   // display recursively all nodes and subnodes
-   LoadNode(xml, mainnode, 1);
-
-   // Release memory before exit
-   xml->FreeDoc(xmldoc);
-   delete xml;
-  }
-
-//////////////////////////////////////////////////////////////////////////////////
-void XmlParser::DisplayNode(TXMLEngine* xml, XMLNodePointer_t node, Int_t level){
-   // this function display all accessible information about xml node and its children
-   printf("%*c node: %s\n",level,' ', xml->GetNodeName(node));
-   // display namespace
-   XMLNsPointer_t ns = xml->GetNS(node);
-   if (ns!=0)
-      printf("%*c namespace: %s refer: %s\n",level+2,' ', xml->GetNSName(ns), xml->GetNSReference(ns));
-   // display attributes
-   XMLAttrPointer_t attr = xml->GetFirstAttr(node);
-   while (attr!=0) {
-       printf("%*c attr: %s value: %s\n",level+2,' ', xml->GetAttrName(attr), xml->GetAttrValue(attr));
-       attr = xml->GetNextAttr(attr);
-   }
-   // display content (if exists)
-   const char* content = xml->GetNodeContent(node);
-   if (content!=0)
-      printf("%*c cont: %s\n",level+2,' ', content);
-   // display all child nodes
-   XMLNodePointer_t child = xml->GetChild(node);
-   while (child!=0) {
-      DisplayNode(xml, child, level+2);
-      child = xml->GetNext(child);
-   }
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-void XmlParser::LoadNode(TXMLEngine* xml, XMLNodePointer_t node, Int_t level){
-   // namespace
-   XMLNsPointer_t ns = xml->GetNS(node);
-   XMLNodePointer_t child = xml->GetChild(node);
-   if(xml->GetNodeName(child)=="dataroot"){// main node
-      std::cout <<" Loading XML file" << std::endl;
-     }
-   else{
-    while(child!=0) {
-      block b;
-      // getting attribute:
-      XMLNodePointer_t param = xml->GetChild(child);
-      while (param!=0) {
-        parameter p(xml->GetNodeName(param),xml->GetNodeContent(param));
-        b.AddParameter(p); 
-        param=xml->GetNext(param);
-      }
-      std::string name = xml->GetNodeName(child);
-      m_blocks[name].push_back(b);
-      child = xml->GetNext(child);
-    }  
-    std::cout << " XML file loaded for " <<m_blocks.size() << " detectors" << std::endl;
-  }
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-std::vector<NPL::block*> XmlParser::GetAllBlocksWithName(std::string name){
-   std::vector<NPL::block*> res;
-   auto it=m_blocks.find(name);
-
-    if(it!=m_blocks.end()){
-      unsigned int size = it->second.size();
-      for(unsigned int i = 0 ; i < size ; i++){
-          res.push_back(&(it->second[i])); 
-        }
-      }
-  
-   return res;
-  }
-/////////////////////////////////////////////////////////////////////////////////
-std::vector<std::string> XmlParser::GetAllBlocksName(){
-  std::vector<std::string> res;
- for(auto it=m_blocks.begin(); it!= m_blocks.end();++it){
-     res.push_back(it->first);
-   } 
-   return res;
-  }
diff --git a/NPSimulation/Detectors/Sofia/CMakeLists.txt b/NPSimulation/Detectors/Sofia/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..57854b49ed30d7b99868c71c28384e9b166f801b
--- /dev/null
+++ b/NPSimulation/Detectors/Sofia/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_library(NPSSofia SHARED  Sofia.cc)
+target_link_libraries(NPSSofia NPSCore ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPSofia)
diff --git a/NPSimulation/Detectors/Sofia/Sofia.cc b/NPSimulation/Detectors/Sofia/Sofia.cc
new file mode 100644
index 0000000000000000000000000000000000000000..437b3b60797ccae004eb6a08f19c37264b320ddb
--- /dev/null
+++ b/NPSimulation/Detectors/Sofia/Sofia.cc
@@ -0,0 +1,333 @@
+/******************************************************************************
+ * Copyright (C) 2009-2020   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: Pierre Morfouace contact address: pierre.morfouace2@cea.fr*
+ *                                                                            *
+ * Creation Date  : November 2020                                             *
+ * Last update    :                                                           *
+ *----------------------------------------------------------------------------*
+ * Decription:                                                                *
+ *  This class describe a simple Sofia setup for simulation                   *
+ *                                                                            *
+ *----------------------------------------------------------------------------*
+ * Comment:                                                                   *
+ *                                                                            *
+ ******************************************************************************/
+
+// C++ headers
+#include <sstream>
+#include <cmath>
+#include <limits>
+//G4 Geometry object
+#include "G4Tubs.hh"
+#include "G4Box.hh"
+
+//G4 sensitive
+#include "G4SDManager.hh"
+#include "G4MultiFunctionalDetector.hh"
+
+//G4 various object
+#include "G4Material.hh"
+#include "G4Transform3D.hh"
+#include "G4PVPlacement.hh"
+#include "G4VisAttributes.hh"
+#include "G4Colour.hh"
+#include "G4FieldManager.hh"
+#include "G4UniformMagField.hh"
+#include "G4TransportationManager.hh"
+
+// NPTool header
+#include "Sofia.hh"
+#include "CalorimeterScorers.hh"
+#include "InteractionScorers.hh"
+#include "RootOutput.h"
+#include "MaterialManager.hh"
+#include "NPSDetectorFactory.hh"
+#include "NPOptionManager.h"
+#include "NPSHitsMap.hh"
+// CLHEP header
+#include "CLHEP/Random/RandGauss.h"
+
+using namespace std;
+using namespace CLHEP;
+
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+namespace Sofia_NS{
+  // Energy and time Resolution
+  const double EnergyThreshold       = 0.1*MeV;
+  const double ResoTime              = 0.007*ns;
+  const double ResoEnergy            = 1.0*MeV;
+  const double tof_plastic_height    = 660*mm;
+  const double tof_plastic_width     = 32*mm;
+  const double tof_plastic_thickness = 0.5*mm;
+  const string Material              = "BC400";
+
+  const double GLAD_height           = 3*m;
+  const double GLAD_width            = 5*m;
+  const double GLAD_length           = 2*m;
+
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Sofia Specific Method
+Sofia::Sofia(){
+  m_Event = new TSofiaData() ;
+  m_TofScorer = 0;
+  m_PlasticTof = 0;
+  m_TofWall = 0;
+    
+  m_GLAD_MagField = 0;
+  m_GLAD_DistanceFromTarget = 0;
+  // RGB Color + Transparency
+  m_VisSquare = new G4VisAttributes(G4Colour(0.3, 0.8, 0.2, 0.5));   
+  m_VisGLAD = new G4VisAttributes(G4Colour(0.5, 0.5, 0.5, 0.5));   
+}
+
+Sofia::~Sofia(){
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void Sofia::AddDetector(G4ThreeVector POS){
+  // Convert the POS value to R theta Phi as Spherical coordinate is easier in G4 
+  m_R.push_back(POS.mag());
+  m_Theta.push_back(POS.theta());
+  m_Phi.push_back(POS.phi());
+}
+
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void Sofia::AddDetector(double  R, double  Theta, double  Phi){
+  m_R.push_back(R);
+  m_Theta.push_back(Theta);
+  m_Phi.push_back(Phi);
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+G4AssemblyVolume* Sofia::BuildTOFDetector(){
+  m_TofWall = new G4AssemblyVolume();
+
+  if(!m_PlasticTof){
+    G4Box* box = new G4Box("Sofia_Box",Sofia_NS::tof_plastic_height*0.5,
+        Sofia_NS::tof_plastic_width*0.5,Sofia_NS::tof_plastic_thickness*0.5);
+
+    G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Sofia_NS::Material);
+    m_PlasticTof = new G4LogicalVolume(box,DetectorMaterial,"logic_Sofia_Box",0,0,0);
+    m_PlasticTof->SetVisAttributes(m_VisSquare);
+    m_PlasticTof->SetSensitiveDetector(m_TofScorer);
+
+    G4RotationMatrix* Rv = new G4RotationMatrix(0,0,0);
+    G4ThreeVector Tv;
+    Tv.setX(0);
+    Tv.setY(0);
+    Tv.setZ(0);
+    for(unsigned int i=0; i<28; i++){
+      int k = -14+i;
+      Tv.setY(k*(Sofia_NS::tof_plastic_width+0.5));
+      m_TofWall->AddPlacedVolume(m_PlasticTof, Tv, Rv);
+    }
+
+  }
+  return m_TofWall;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+G4LogicalVolume* Sofia::BuildGLAD()
+{
+  G4Box* box = new G4Box("glad_Box",Sofia_NS::GLAD_width*0.5,
+      Sofia_NS::GLAD_height*0.5,Sofia_NS::GLAD_length*0.5);
+
+  G4Material* GLADMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary("Vaccuum");
+  m_GLAD = new G4LogicalVolume(box,GLADMaterial,"logic_GLAD_Box",0,0,0);
+  m_GLAD->SetVisAttributes(m_VisGLAD);
+
+  
+  G4UniformMagField* magField = new G4UniformMagField(G4ThreeVector(0,m_GLAD_MagField,0));
+  //G4FieldManager* fieldMgr = G4TransportationManager::GetTransportationManager()->GetFieldManager();
+  G4FieldManager* fieldMgr = new G4FieldManager(magField);
+  
+  //fieldMgr->SetDetectorField(magField);
+
+  fieldMgr->CreateChordFinder(magField);
+  
+  m_GLAD->SetFieldManager(fieldMgr,true);
+
+  return m_GLAD;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Virtual Method of NPS::VDetector class
+
+// Read stream at Configfile to pick-up parameters of detector (Position,...)
+// Called in DetecorConstruction::ReadDetextorConfiguration Method
+void Sofia::ReadConfiguration(NPL::InputParser parser){
+  vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Sofia");
+  if(NPOptionManager::getInstance()->GetVerboseLevel())
+    cout << "//// " << blocks.size() << " detectors found " << endl; 
+
+  vector<string> cart = {"POS","Build_GLAD"};
+  vector<string> sphe = {"R","Theta","Phi","Build_GLAD"};
+
+  for(unsigned int i = 0 ; i < blocks.size() ; i++){
+    if(blocks[i]->HasTokenList(cart)){
+      if(NPOptionManager::getInstance()->GetVerboseLevel())
+        cout << endl << "////  Sofia " << i+1 <<  endl;
+
+      G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm"));
+      m_Build_GLAD = blocks[i]->GetInt("Build_GLAD");
+      AddDetector(Pos);
+    }
+    else if(blocks[i]->HasTokenList(sphe)){
+      if(NPOptionManager::getInstance()->GetVerboseLevel())
+        cout << endl << "////  Sofia " << i+1 <<  endl;
+      double R = blocks[i]->GetDouble("R","mm");
+      double Theta = blocks[i]->GetDouble("Theta","deg");
+      double Phi = blocks[i]->GetDouble("Phi","deg");
+      m_Build_GLAD = blocks[i]->GetInt("Build_GLAD");
+      m_GLAD_MagField = blocks[i]->GetDouble("GLAD_MagField","T");
+      m_GLAD_DistanceFromTarget = blocks[i]->GetDouble("GLAD_DistanceFromTarget", "m");
+      AddDetector(R,Theta,Phi);
+    }
+    else{
+      cout << "ERROR: check your input file formatting " << endl;
+      exit(1);
+    }
+  }
+}
+
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+
+// Construct detector and inialise sensitive part.
+// Called After DetecorConstruction::AddDetector Method
+void Sofia::ConstructDetector(G4LogicalVolume* world){
+  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] ) ;
+    G4ThreeVector Det_pos = G4ThreeVector(wX, wY, wZ) ;
+    // So the face of the detector is at R instead of the middle
+    Det_pos+=Det_pos.unit()*Sofia_NS::tof_plastic_thickness*0.5;
+    // Building Detector reference frame
+    G4double ii = cos(m_Theta[i]) * cos(m_Phi[i]);
+    G4double jj = cos(m_Theta[i]) * sin(m_Phi[i]);
+    G4double kk = -sin(m_Theta[i]);
+
+    G4ThreeVector Y(ii,jj,kk);
+    G4ThreeVector w = Det_pos.unit();
+    G4ThreeVector u = w.cross(Y);
+    G4ThreeVector v = w.cross(u);
+    v = v.unit();
+    u = u.unit();
+
+    G4RotationMatrix* Rot = new G4RotationMatrix(u,v,w);
+
+    BuildTOFDetector()->MakeImprint(world,Det_pos,Rot);
+
+    if(m_Build_GLAD==1){
+      G4ThreeVector GLAD_pos = G4ThreeVector(0,0,m_GLAD_DistanceFromTarget+0.5*Sofia_NS::GLAD_length);
+      new G4PVPlacement(0, GLAD_pos,
+          BuildGLAD(),
+          "GLAD",
+          world, false, 0);
+    }
+
+
+  }
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Add Detector branch to the EventTree.
+// Called After DetecorConstruction::AddDetector Method
+void Sofia::InitializeRootOutput(){
+  RootOutput *pAnalysis = RootOutput::getInstance();
+  TTree *pTree = pAnalysis->GetTree();
+  if(!pTree->FindBranch("Sofia")){
+    pTree->Branch("Sofia", "TSofiaData", &m_Event) ;
+  }
+  pTree->SetBranchAddress("Sofia", &m_Event) ;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Read sensitive part and fill the Root tree.
+// Called at in the EventAction::EndOfEventAvtion
+void Sofia::ReadSensitive(const G4Event* ){
+  m_Event->Clear();
+
+  ///////////
+  // Calorimeter scorer
+  CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_TofScorer->GetPrimitive(0);
+
+  unsigned int size = Scorer->GetMult(); 
+  for(unsigned int i = 0 ; i < size ; i++){
+    vector<unsigned int> level = Scorer->GetLevel(i); 
+    double Energy = RandGauss::shoot(Scorer->GetEnergy(i),Sofia_NS::ResoEnergy);
+    if(Energy>Sofia_NS::EnergyThreshold){
+      double Time = RandGauss::shoot(Scorer->GetTime(i),Sofia_NS::ResoTime);
+      int DetectorNbr = level[0];
+      int PlasticNbr = level[1]-1;
+      m_Event->SetDetectorNbr(DetectorNbr);
+      m_Event->SetPlasticNbr(PlasticNbr);
+      m_Event->SetEnergy(Energy);
+      m_Event->SetTime(Time); 
+      //cout << DetectorNbr << " " << PlasticNbr << " " << Energy << " " << Time << endl;
+    }
+  }
+  //m_Event->Dump();
+  Scorer->clear();
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+////////////////////////////////////////////////////////////////   
+void Sofia::InitializeScorers() { 
+  // This check is necessary in case the geometry is reloaded
+  bool already_exist = false; 
+  m_TofScorer = CheckScorer("SofiaScorer",already_exist) ;
+
+  if(already_exist) 
+    return ;
+
+  // Otherwise the scorer is initialised
+  vector<int> level; 
+  level.push_back(1);
+  level.push_back(0);
+  G4VPrimitiveScorer* Calorimeter= new CalorimeterScorers::PS_Calorimeter("Calorimeter",level, 0) ;
+  G4VPrimitiveScorer* Interaction= new InteractionScorers::PS_Interactions("Interaction",ms_InterCoord, 0) ;
+  //and register it to the multifunctionnal detector
+  m_TofScorer->RegisterPrimitive(Calorimeter);
+  m_TofScorer->RegisterPrimitive(Interaction);
+  G4SDManager::GetSDMpointer()->AddNewDetector(m_TofScorer) ;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+////////////////////////////////////////////////////////////////////////////////
+//            Construct Method to be pass to the DetectorFactory              //
+////////////////////////////////////////////////////////////////////////////////
+NPS::VDetector* Sofia::Construct(){
+  return  (NPS::VDetector*) new Sofia();
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+////////////////////////////////////////////////////////////////////////////////
+//            Registering the construct method to the factory                 //
+////////////////////////////////////////////////////////////////////////////////
+extern"C" {
+  class proxy_nps_Sofia{
+    public:
+      proxy_nps_Sofia(){
+        NPS::DetectorFactory::getInstance()->AddToken("Sofia","Sofia");
+        NPS::DetectorFactory::getInstance()->AddDetector("Sofia",Sofia::Construct);
+      }
+  };
+
+  proxy_nps_Sofia p_nps_Sofia;
+}
diff --git a/NPSimulation/Detectors/Sofia/Sofia.hh b/NPSimulation/Detectors/Sofia/Sofia.hh
new file mode 100644
index 0000000000000000000000000000000000000000..0aa87f7a10c1b6d38284187a81729958f9cd54b2
--- /dev/null
+++ b/NPSimulation/Detectors/Sofia/Sofia.hh
@@ -0,0 +1,120 @@
+#ifndef Sofia_h
+#define Sofia_h 1
+/*****************************************************************************
+ * Copyright (C) 2009-2020   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: Pierre Morfouace  contact address: pierre.morfouace2@cea.fr                        *
+ *                                                                           *
+ * Creation Date  : November 2020                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class describe  Sofia simulation                             *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *****************************************************************************/
+
+// C++ header
+#include <string>
+#include <vector>
+using namespace std;
+
+// G4 headers
+#include "G4ThreeVector.hh"
+#include "G4RotationMatrix.hh"
+#include "G4LogicalVolume.hh"
+#include "G4MultiFunctionalDetector.hh"
+#include "G4AssemblyVolume.hh"
+
+// NPTool header
+#include "NPSVDetector.hh"
+#include "TSofiaData.h"
+#include "NPInputParser.h"
+
+class Sofia : public NPS::VDetector{
+  ////////////////////////////////////////////////////
+  /////// Default Constructor and Destructor /////////
+  ////////////////////////////////////////////////////
+  public:
+    Sofia() ;
+    virtual ~Sofia() ;
+
+    ////////////////////////////////////////////////////
+    /////// Specific Function of this Class ///////////
+    ////////////////////////////////////////////////////
+  public:
+    // Cartesian
+    void AddDetector(G4ThreeVector POS);
+    // Spherical
+    void AddDetector(double R,double Theta,double Phi);  
+
+
+    G4AssemblyVolume* BuildTOFDetector();
+    G4LogicalVolume* BuildGLAD();
+  
+  private:
+    G4LogicalVolume* m_PlasticTof;
+    G4LogicalVolume* m_GLAD;
+    G4AssemblyVolume* m_TofWall;
+    
+    ////////////////////////////////////////////////////
+    //////  Inherite from NPS::VDetector class /////////
+    ////////////////////////////////////////////////////
+  public:
+    // Read stream at Configfile to pick-up parameters of detector (Position,...)
+    // Called in DetecorConstruction::ReadDetextorConfiguration Method
+    void ReadConfiguration(NPL::InputParser) ;
+
+    // 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:   // Scorer
+    //   Initialize all Scorer used by the MUST2Array
+    void InitializeScorers() ;
+
+    //   Associated Scorer
+    G4MultiFunctionalDetector* m_TofScorer ;
+    ////////////////////////////////////////////////////
+    ///////////Event class to store Data////////////////
+    ////////////////////////////////////////////////////
+  private:
+    TSofiaData* m_Event ;
+
+    ////////////////////////////////////////////////////
+    ///////////////Private intern Data//////////////////
+    ////////////////////////////////////////////////////
+  private: // Geometry
+    // Detector Coordinate 
+    vector<double>  m_R; 
+    vector<double>  m_Theta;
+    vector<double>  m_Phi; 
+    
+    int m_Build_GLAD;
+    double m_GLAD_MagField;
+    double m_GLAD_DistanceFromTarget;
+   
+    // Visualisation Attribute
+    G4VisAttributes* m_VisSquare;
+    G4VisAttributes* m_VisGLAD;
+
+  // Needed for dynamic loading of the library
+  public:
+    static NPS::VDetector* Construct();
+};
+#endif
diff --git a/Projects/Sofia/.gitignore b/Projects/Sofia/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3ed1a0bc5543756a8eec83cda3a6483250aa8556
--- /dev/null
+++ b/Projects/Sofia/.gitignore
@@ -0,0 +1 @@
+*.detector
diff --git a/Projects/Sofia/Analysis.cxx b/Projects/Sofia/Analysis.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..362615c9f7b31a4c867142ec975d6604901f9c8a
--- /dev/null
+++ b/Projects/Sofia/Analysis.cxx
@@ -0,0 +1,68 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2016    this file is part of the NPTool Project        *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: XAUTHORX  contact address: XMAILX                        *
+ *                                                                           *
+ * Creation Date  : XMONTHX XYEARX                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class describe  Sofia analysis project                       *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *****************************************************************************/
+
+#include<iostream>
+using namespace std;
+#include"Analysis.h"
+#include"NPAnalysisFactory.h"
+#include"NPDetectorManager.h"
+////////////////////////////////////////////////////////////////////////////////
+Analysis::Analysis(){
+}
+////////////////////////////////////////////////////////////////////////////////
+Analysis::~Analysis(){
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void Analysis::Init(){
+   Sofia= (TSofiaPhysicsPhysics*) m_DetectorManager->GetDetector("Sofia");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void Analysis::TreatEvent(){
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void Analysis::End(){
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//            Construct Method to be pass to the DetectorFactory              //
+////////////////////////////////////////////////////////////////////////////////
+NPL::VAnalysis* Analysis::Construct(){
+  return (NPL::VAnalysis*) new Analysis();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//            Registering the construct method to the factory                 //
+////////////////////////////////////////////////////////////////////////////////
+extern "C"{
+class proxy{
+  public:
+    proxy(){
+      NPL::AnalysisFactory::getInstance()->SetConstructor(Analysis::Construct);
+    }
+};
+
+proxy p;
+}
+
diff --git a/Projects/Sofia/Analysis.h b/Projects/Sofia/Analysis.h
new file mode 100644
index 0000000000000000000000000000000000000000..a4f50f8fa6873e70fd1fe525307f3aab84a684b2
--- /dev/null
+++ b/Projects/Sofia/Analysis.h
@@ -0,0 +1,42 @@
+#ifndef Analysis_h 
+#define Analysis_h
+/*****************************************************************************
+ * Copyright (C) 2009-2016    this file is part of the NPTool Project        *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: XAUTHORX  contact address: XMAILX                        *
+ *                                                                           *
+ * Creation Date  : XMONTHX XYEARX                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class describe  Sofia analysis project                       *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *****************************************************************************/
+
+#include"NPVAnalysis.h"
+#include"TSofiaPhysics.h"
+class Analysis: public NPL::VAnalysis{
+  public:
+    Analysis();
+    ~Analysis();
+
+  public: 
+    void Init();
+    void TreatEvent();
+    void End();
+
+   static NPL::VAnalysis* Construct();
+
+  private:
+   TSofiaPhysics* Sofia;
+
+};
+#endif
diff --git a/Projects/Sofia/CMakeLists.txt b/Projects/Sofia/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..22c74affdfc45019bdda2594f8439c52d4ab97ec
--- /dev/null
+++ b/Projects/Sofia/CMakeLists.txt
@@ -0,0 +1,5 @@
+cmake_minimum_required (VERSION 2.8) 
+# Setting the policy to match Cmake version
+cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
+# include the default NPAnalysis cmake file
+include("../../NPLib/ressources/CMake/NPAnalysis.cmake")
diff --git a/Projects/Sofia/PhysicsListOption.txt b/Projects/Sofia/PhysicsListOption.txt
new file mode 100644
index 0000000000000000000000000000000000000000..997b53714ff05b3378f2f0c0dd6837202358990a
--- /dev/null
+++ b/Projects/Sofia/PhysicsListOption.txt
@@ -0,0 +1,11 @@
+EmPhysicsList Option4
+DefaultCutOff 100
+IonBinaryCascadePhysics 0
+NPIonInelasticPhysics 0
+EmExtraPhysics 0
+HadronElasticPhysics 0
+StoppingPhysics 0
+OpticalPhysics 0
+HadronPhysicsINCLXX 0
+HadronPhysicsQGSP_BIC_HP 0
+Decay 0
diff --git a/Projects/Sofia/sofia.detector b/Projects/Sofia/sofia.detector
new file mode 100644
index 0000000000000000000000000000000000000000..2169ee897754ad40039862d6a07d1404ee009b4a
--- /dev/null
+++ b/Projects/Sofia/sofia.detector
@@ -0,0 +1,19 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+Target
+ THICKNESS= 2 mm
+ RADIUS=	40 mm
+ MATERIAL= Pb
+ ANGLE= 0 deg
+ X= 0 mm
+ Y= 0 mm
+ Z= 0 m
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+Sofia
+ R= 8 m
+ THETA= -9 deg
+ PHI= 0 deg
+ Build_GLAD= 1
+ GLAD_DistanceFromTarget= 3.5 m
+ GLAD_MagField= 1.8 T 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+