From f45eb379b62e1e88ed5134c6177d2802a6786403 Mon Sep 17 00:00:00 2001
From: Xythere <xytherex@gmail.com>
Date: Tue, 14 Jan 2025 19:19:10 +0100
Subject: [PATCH] Added Plastic_BEDO and Coaxial_Germanium detectors relevant
 for experiments @ ALTO

---
 .../Coaxial_Germanium/CMakeLists.txt          |   6 +
 .../TCoaxial_GermaniumData.cxx                |  79 ++++
 .../TCoaxial_GermaniumData.h                  | 104 ++++++
 .../TCoaxial_GermaniumPhysics.cxx             | 344 ++++++++++++++++++
 .../TCoaxial_GermaniumPhysics.h               | 180 +++++++++
 .../TCoaxial_GermaniumSpectra.cxx             | 174 +++++++++
 .../TCoaxial_GermaniumSpectra.h               |  62 ++++
 NPLib/Detectors/Plastic_BEDO/CMakeLists.txt   |   6 +
 .../Plastic_BEDO/TPlastic_BEDOData.cxx        |  79 ++++
 .../Plastic_BEDO/TPlastic_BEDOData.h          | 104 ++++++
 .../Plastic_BEDO/TPlastic_BEDOPhysics.cxx     | 344 ++++++++++++++++++
 .../Plastic_BEDO/TPlastic_BEDOPhysics.h       | 180 +++++++++
 .../Plastic_BEDO/TPlastic_BEDOSpectra.cxx     | 174 +++++++++
 .../Plastic_BEDO/TPlastic_BEDOSpectra.h       |  62 ++++
 .../Coaxial_Germanium/CMakeLists.txt          |   2 +
 .../Coaxial_Germanium/Coaxial_Germanium.cc    | 281 ++++++++++++++
 .../Coaxial_Germanium/Coaxial_Germanium.hh    | 108 ++++++
 .../Detectors/Plastic_BEDO/CMakeLists.txt     |   2 +
 .../Detectors/Plastic_BEDO/Plastic_BEDO.cc    | 267 ++++++++++++++
 .../Detectors/Plastic_BEDO/Plastic_BEDO.hh    | 117 ++++++
 20 files changed, 2675 insertions(+)
 create mode 100644 NPLib/Detectors/Coaxial_Germanium/CMakeLists.txt
 create mode 100644 NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumData.cxx
 create mode 100644 NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumData.h
 create mode 100644 NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumPhysics.cxx
 create mode 100644 NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumPhysics.h
 create mode 100644 NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumSpectra.cxx
 create mode 100644 NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumSpectra.h
 create mode 100644 NPLib/Detectors/Plastic_BEDO/CMakeLists.txt
 create mode 100644 NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOData.cxx
 create mode 100644 NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOData.h
 create mode 100644 NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOPhysics.cxx
 create mode 100644 NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOPhysics.h
 create mode 100644 NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOSpectra.cxx
 create mode 100644 NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOSpectra.h
 create mode 100644 NPSimulation/Detectors/Coaxial_Germanium/CMakeLists.txt
 create mode 100644 NPSimulation/Detectors/Coaxial_Germanium/Coaxial_Germanium.cc
 create mode 100644 NPSimulation/Detectors/Coaxial_Germanium/Coaxial_Germanium.hh
 create mode 100644 NPSimulation/Detectors/Plastic_BEDO/CMakeLists.txt
 create mode 100644 NPSimulation/Detectors/Plastic_BEDO/Plastic_BEDO.cc
 create mode 100644 NPSimulation/Detectors/Plastic_BEDO/Plastic_BEDO.hh

diff --git a/NPLib/Detectors/Coaxial_Germanium/CMakeLists.txt b/NPLib/Detectors/Coaxial_Germanium/CMakeLists.txt
new file mode 100644
index 000000000..e32a0aa86
--- /dev/null
+++ b/NPLib/Detectors/Coaxial_Germanium/CMakeLists.txt
@@ -0,0 +1,6 @@
+add_custom_command(OUTPUT TCoaxial_GermaniumPhysicsDict.cxx COMMAND ../../scripts/build_dict.sh TCoaxial_GermaniumPhysics.h TCoaxial_GermaniumPhysicsDict.cxx TCoaxial_GermaniumPhysics.rootmap libNPCoaxial_Germanium.dylib DEPENDS TCoaxial_GermaniumPhysics.h)
+add_custom_command(OUTPUT TCoaxial_GermaniumDataDict.cxx COMMAND ../../scripts/build_dict.sh TCoaxial_GermaniumData.h TCoaxial_GermaniumDataDict.cxx TCoaxial_GermaniumData.rootmap libNPCoaxial_Germanium.dylib DEPENDS TCoaxial_GermaniumData.h)
+add_library(NPCoaxial_Germanium SHARED TCoaxial_GermaniumSpectra.cxx TCoaxial_GermaniumData.cxx TCoaxial_GermaniumPhysics.cxx TCoaxial_GermaniumDataDict.cxx TCoaxial_GermaniumPhysicsDict.cxx )
+target_link_libraries(NPCoaxial_Germanium ${ROOT_LIBRARIES} NPCore) 
+install(FILES TCoaxial_GermaniumData.h TCoaxial_GermaniumPhysics.h TCoaxial_GermaniumSpectra.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY})
+
diff --git a/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumData.cxx b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumData.cxx
new file mode 100644
index 000000000..428e900ee
--- /dev/null
+++ b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumData.cxx
@@ -0,0 +1,79 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Coaxial_Germanium Raw data                                    *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+#include "TCoaxial_GermaniumData.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
+using namespace std; 
+
+ClassImp(TCoaxial_GermaniumData)
+
+
+//////////////////////////////////////////////////////////////////////
+TCoaxial_GermaniumData::TCoaxial_GermaniumData() {
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+TCoaxial_GermaniumData::~TCoaxial_GermaniumData() {
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumData::Clear() {
+  // Energy
+  fCoaxial_Germanium_E_DetectorNbr.clear();
+  fCoaxial_Germanium_Energy.clear();
+  // Time
+  fCoaxial_Germanium_T_DetectorNbr.clear();
+  fCoaxial_Germanium_Time.clear();
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumData::Dump() const {
+  // This method is very useful for debuging and worth the dev.
+  cout << "XXXXXXXXXXXXXXXXXXXXXXXX New Event [TCoaxial_GermaniumData::Dump()] XXXXXXXXXXXXXXXXX" << endl;
+
+  // Energy
+  size_t mysize = fCoaxial_Germanium_E_DetectorNbr.size();
+  cout << "Coaxial_Germanium_E_Mult: " << mysize << endl;
+ 
+  for (size_t i = 0 ; i < mysize ; i++){
+    cout << "DetNbr: " << fCoaxial_Germanium_E_DetectorNbr[i]
+         << " Energy: " << fCoaxial_Germanium_Energy[i];
+  }
+  
+  // Time
+  mysize = fCoaxial_Germanium_T_DetectorNbr.size();
+  cout << "Coaxial_Germanium_T_Mult: " << mysize << endl;
+ 
+  for (size_t i = 0 ; i < mysize ; i++){
+    cout << "DetNbr: " << fCoaxial_Germanium_T_DetectorNbr[i]
+         << " Time: " << fCoaxial_Germanium_Time[i];
+  }
+}
diff --git a/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumData.h b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumData.h
new file mode 100644
index 000000000..e7b08cff5
--- /dev/null
+++ b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumData.h
@@ -0,0 +1,104 @@
+#ifndef __Coaxial_GermaniumDATA__
+#define __Coaxial_GermaniumDATA__
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Coaxial_Germanium Raw data                                    *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// STL
+#include <vector>
+using namespace std;
+
+// ROOT
+#include "TObject.h"
+
+class TCoaxial_GermaniumData : public TObject {
+  //////////////////////////////////////////////////////////////
+  // data members are hold into vectors in order 
+  // to allow multiplicity treatment
+  private: 
+    // Energy
+    vector<UShort_t>   fCoaxial_Germanium_E_DetectorNbr;
+    vector<Double_t>   fCoaxial_Germanium_Energy;
+
+    // Time
+    vector<UShort_t>   fCoaxial_Germanium_T_DetectorNbr;
+    vector<Double_t>   fCoaxial_Germanium_Time;
+
+
+  //////////////////////////////////////////////////////////////
+  // Constructor and destructor
+  public: 
+    TCoaxial_GermaniumData();
+    ~TCoaxial_GermaniumData();
+    
+
+  //////////////////////////////////////////////////////////////
+  // 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    ////////////////////////
+    // Energy
+    inline void SetEnergy(const UShort_t& DetNbr,const Double_t& Energy){
+      fCoaxial_Germanium_E_DetectorNbr.push_back(DetNbr);
+      fCoaxial_Germanium_Energy.push_back(Energy);
+    };//!
+
+    // Time
+    inline void SetTime(const UShort_t& DetNbr,const Double_t& Time)	{
+      fCoaxial_Germanium_T_DetectorNbr.push_back(DetNbr);     
+      fCoaxial_Germanium_Time.push_back(Time);
+    };//!
+
+
+    //////////////////////    GETTERS    ////////////////////////
+    // Energy
+    inline UShort_t GetMultEnergy() const
+      {return fCoaxial_Germanium_E_DetectorNbr.size();}
+    inline UShort_t GetE_DetectorNbr(const unsigned int &i) const 
+      {return fCoaxial_Germanium_E_DetectorNbr[i];}//!
+    inline Double_t Get_Energy(const unsigned int &i) const 
+      {return fCoaxial_Germanium_Energy[i];}//!
+
+    // Time
+    inline UShort_t GetMultTime() const
+      {return fCoaxial_Germanium_T_DetectorNbr.size();}
+    inline UShort_t GetT_DetectorNbr(const unsigned int &i) const 
+      {return fCoaxial_Germanium_T_DetectorNbr[i];}//!
+    inline Double_t Get_Time(const unsigned int &i) const 
+      {return fCoaxial_Germanium_Time[i];}//!
+
+
+  //////////////////////////////////////////////////////////////
+  // Required for ROOT dictionnary
+  ClassDef(TCoaxial_GermaniumData,1)  // Coaxial_GermaniumData structure
+};
+
+#endif
diff --git a/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumPhysics.cxx b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumPhysics.cxx
new file mode 100644
index 000000000..139dfedbf
--- /dev/null
+++ b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumPhysics.cxx
@@ -0,0 +1,344 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Coaxial_Germanium Treated  data                               *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+#include "TCoaxial_GermaniumPhysics.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(TCoaxial_GermaniumPhysics)
+
+
+///////////////////////////////////////////////////////////////////////////
+TCoaxial_GermaniumPhysics::TCoaxial_GermaniumPhysics()
+   : m_EventData(new TCoaxial_GermaniumData),
+     m_PreTreatedData(new TCoaxial_GermaniumData),
+     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 TCoaxial_GermaniumPhysics::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 TCoaxial_GermaniumPhysics::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 TCoaxial_GermaniumPhysics::BuildSimplePhysicalEvent() {
+  BuildPhysicalEvent();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::BuildPhysicalEvent() {
+  // apply thresholds and calibration
+  PreTreat();
+
+  // match energy and time together
+  unsigned int mysizeE = m_PreTreatedData->GetMultEnergy();
+  unsigned int mysizeT = m_PreTreatedData->GetMultTime();
+  for (UShort_t e = 0; e < mysizeE ; e++) {
+    for (UShort_t t = 0; t < mysizeT ; t++) {
+      if (m_PreTreatedData->GetE_DetectorNbr(e) == m_PreTreatedData->GetT_DetectorNbr(t)) {
+        DetectorNumber.push_back(m_PreTreatedData->GetE_DetectorNbr(e));
+        Energy.push_back(m_PreTreatedData->Get_Energy(e));
+        Time.push_back(m_PreTreatedData->Get_Time(t));
+      }
+    }
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::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->GetMultEnergy();
+  for (UShort_t i = 0; i < mysize ; ++i) {
+    if (m_EventData->Get_Energy(i) > m_E_RAW_Threshold) {
+      Double_t Energy = Cal->ApplyCalibration("Coaxial_Germanium/ENERGY"+NPL::itoa(m_EventData->GetE_DetectorNbr(i)),m_EventData->Get_Energy(i));
+      if (Energy > m_E_Threshold) {
+        m_PreTreatedData->SetEnergy(m_EventData->GetE_DetectorNbr(i), Energy);
+      }
+    }
+  }
+
+  // Time 
+  mysize = m_EventData->GetMultTime();
+  for (UShort_t i = 0; i < mysize; ++i) {
+    Double_t Time= Cal->ApplyCalibration("Coaxial_Germanium/TIME"+NPL::itoa(m_EventData->GetT_DetectorNbr(i)),m_EventData->Get_Time(i));
+    m_PreTreatedData->SetTime(m_EventData->GetT_DetectorNbr(i), Time);
+  }
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::ReadAnalysisConfig() {
+  bool ReadingStatus = false;
+
+  // path to file
+  string FileName = "./configs/ConfigCoaxial_Germanium.dat";
+
+  // open analysis config file
+  ifstream AnalysisConfigFile;
+  AnalysisConfigFile.open(FileName.c_str());
+
+  if (!AnalysisConfigFile.is_open()) {
+    cout << " No ConfigCoaxial_Germanium.dat found: Default parameter loaded for Analayis " << FileName << endl;
+    return;
+  }
+  cout << " Loading user parameter for Analysis from ConfigCoaxial_Germanium.dat " << endl;
+
+  // Save it in a TAsciiFile
+  TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig();
+  asciiConfig->AppendLine("%%% ConfigCoaxial_Germanium.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 = "ConfigCoaxial_Germanium";
+    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 TCoaxial_GermaniumPhysics::Clear() {
+  DetectorNumber.clear();
+  Energy.clear();
+  Time.clear();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::ReadConfiguration(NPL::InputParser parser) {
+  vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Coaxial_Germanium");
+  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 << "////  Coaxial_Germanium " << 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 << "////  Coaxial_Germanium " << 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 TCoaxial_GermaniumPhysics::InitSpectra() {
+  m_Spectra = new TCoaxial_GermaniumSpectra(m_NumberOfDetectors);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::FillSpectra() {
+  m_Spectra -> FillRawSpectra(m_EventData);
+  m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData);
+  m_Spectra -> FillPhysicsSpectra(m_EventPhysics);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::CheckSpectra() {
+  m_Spectra->CheckSpectra();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::ClearSpectra() {
+  // To be done
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+map< string , TH1*> TCoaxial_GermaniumPhysics::GetSpectra() {
+  if(m_Spectra)
+    return m_Spectra->GetMapHisto();
+  else{
+    map< string , TH1*> empty;
+    return empty;
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::WriteSpectra() {
+  m_Spectra->WriteSpectra();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::AddParameterToCalibrationManager() {
+  CalibrationManager* Cal = CalibrationManager::getInstance();
+  for (int i = 0; i < m_NumberOfDetectors; ++i) {
+    Cal->AddParameter("Coaxial_Germanium", "D"+ NPL::itoa(i+1)+"_ENERGY","Coaxial_Germanium_D"+ NPL::itoa(i+1)+"_ENERGY");
+    Cal->AddParameter("Coaxial_Germanium", "D"+ NPL::itoa(i+1)+"_TIME","Coaxial_Germanium_D"+ NPL::itoa(i+1)+"_TIME");
+  }
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::InitializeRootInputRaw() {
+  TChain* inputChain = RootInput::getInstance()->GetChain();
+  inputChain->SetBranchStatus("Coaxial_Germanium",  true );
+  inputChain->SetBranchAddress("Coaxial_Germanium", &m_EventData );
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::InitializeRootInputPhysics() {
+  TChain* inputChain = RootInput::getInstance()->GetChain();
+  inputChain->SetBranchAddress("Coaxial_Germanium", &m_EventPhysics);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumPhysics::InitializeRootOutput() {
+  TTree* outputTree = RootOutput::getInstance()->GetTree();
+  outputTree->Branch("Coaxial_Germanium", "TCoaxial_GermaniumPhysics", &m_EventPhysics);
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+//            Construct Method to be pass to the DetectorFactory              //
+////////////////////////////////////////////////////////////////////////////////
+NPL::VDetector* TCoaxial_GermaniumPhysics::Construct() {
+  return (NPL::VDetector*) new TCoaxial_GermaniumPhysics();
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+//            Registering the construct method to the factory                 //
+////////////////////////////////////////////////////////////////////////////////
+extern "C"{
+class proxy_Coaxial_Germanium{
+  public:
+    proxy_Coaxial_Germanium(){
+      NPL::DetectorFactory::getInstance()->AddToken("Coaxial_Germanium","Coaxial_Germanium");
+      NPL::DetectorFactory::getInstance()->AddDetector("Coaxial_Germanium",TCoaxial_GermaniumPhysics::Construct);
+    }
+};
+
+proxy_Coaxial_Germanium p_Coaxial_Germanium;
+}
+
diff --git a/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumPhysics.h b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumPhysics.h
new file mode 100644
index 000000000..0fa850d59
--- /dev/null
+++ b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumPhysics.h
@@ -0,0 +1,180 @@
+#ifndef TCoaxial_GermaniumPHYSICS_H
+#define TCoaxial_GermaniumPHYSICS_H
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Coaxial_Germanium 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 "TCoaxial_GermaniumData.h"
+#include "TCoaxial_GermaniumSpectra.h"
+#include "NPCalibrationManager.h"
+#include "NPVDetector.h"
+#include "NPInputParser.h"
+// forward declaration
+class TCoaxial_GermaniumSpectra;
+
+
+
+class TCoaxial_GermaniumPhysics : public TObject, public NPL::VDetector {
+  //////////////////////////////////////////////////////////////
+  // constructor and destructor
+  public:
+    TCoaxial_GermaniumPhysics();
+    ~TCoaxial_GermaniumPhysics() {};
+
+
+  //////////////////////////////////////////////////////////////
+  // 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<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 TCoaxial_GermaniumSpectra class
+    // instantiate the TCoaxial_GermaniumSpectra 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 Coaxial_Germanium 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 TCoaxial_GermaniumData object to TCoaxial_GermaniumPhysics. 
+    // needed for online analysis for example
+    void SetRawDataPointer(TCoaxial_GermaniumData* rawDataPointer) {m_EventData = rawDataPointer;}
+    
+  // objects are not written in the TTree
+  private:
+    TCoaxial_GermaniumData*         m_EventData;        //!
+    TCoaxial_GermaniumData*         m_PreTreatedData;   //!
+    TCoaxial_GermaniumPhysics*      m_EventPhysics;     //!
+
+  // getters for raw and pre-treated data object
+  public:
+    TCoaxial_GermaniumData* GetRawData()        const {return m_EventData;}
+    TCoaxial_GermaniumData* 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:
+    TCoaxial_GermaniumSpectra* m_Spectra; // !
+
+  // spectra getter
+  public:
+    map<string, TH1*>   GetSpectra(); 
+
+  // Static constructor to be passed to the Detector Factory
+  public:
+    static NPL::VDetector* Construct();
+
+    ClassDef(TCoaxial_GermaniumPhysics,1)  // Coaxial_GermaniumPhysics structure
+};
+#endif
diff --git a/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumSpectra.cxx b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumSpectra.cxx
new file mode 100644
index 000000000..10cb641cc
--- /dev/null
+++ b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumSpectra.cxx
@@ -0,0 +1,174 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Coaxial_Germanium Spectra                                     *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// class header 
+#include "TCoaxial_GermaniumSpectra.h"
+
+// STL
+#include <iostream>  
+#include <string>
+using namespace std;
+
+// NPTool header
+#include "NPOptionManager.h"
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TCoaxial_GermaniumSpectra::TCoaxial_GermaniumSpectra() 
+   : fNumberOfDetectors(0) {
+  SetName("Coaxial_Germanium");
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TCoaxial_GermaniumSpectra::TCoaxial_GermaniumSpectra(unsigned int NumberOfDetectors) {
+  if(NPOptionManager::getInstance()->GetVerboseLevel()>0)
+    cout << "************************************************" << endl
+      << "TCoaxial_GermaniumSpectra : Initalizing control spectra for " 
+      << NumberOfDetectors << " Detectors" << endl
+      << "************************************************" << endl ;
+  SetName("Coaxial_Germanium");
+  fNumberOfDetectors = NumberOfDetectors;
+
+  InitRawSpectra();
+  InitPreTreatedSpectra();
+  InitPhysicsSpectra();
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TCoaxial_GermaniumSpectra::~TCoaxial_GermaniumSpectra() {
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumSpectra::InitRawSpectra() {
+  static string name;
+  for (unsigned int i = 0; i < fNumberOfDetectors; i++) { // loop on number of detectors
+    // Energy 
+    name = "Coaxial_Germanium"+NPL::itoa(i+1)+"_ENERGY_RAW";
+    AddHisto1D(name, name, 4096, 0, 16384, "Coaxial_Germanium/RAW");
+    // Time 
+    name = "Coaxial_Germanium"+NPL::itoa(i+1)+"_TIME_RAW";
+    AddHisto1D(name, name, 4096, 0, 16384, "Coaxial_Germanium/RAW");
+  } // end loop on number of detectors
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumSpectra::InitPreTreatedSpectra() {
+  static string name;
+  for (unsigned int i = 0; i < fNumberOfDetectors; i++) { // loop on number of detectors
+    // Energy 
+    name = "Coaxial_Germanium"+NPL::itoa(i+1)+"_ENERGY_CAL";
+    AddHisto1D(name, name, 500, 0, 25, "Coaxial_Germanium/CAL");
+    // Time
+    name = "Coaxial_Germanium"+NPL::itoa(i+1)+"_TIME_CAL";
+    AddHisto1D(name, name, 500, 0, 25, "Coaxial_Germanium/CAL");
+
+  
+  }  // end loop on number of detectors
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumSpectra::InitPhysicsSpectra() {
+  static string name;
+  // Kinematic Plot 
+  name = "Coaxial_Germanium_ENERGY_TIME";
+  AddHisto2D(name, name, 500, 0, 500, 500, 0, 50, "Coaxial_Germanium/PHY");
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumSpectra::FillRawSpectra(TCoaxial_GermaniumData* RawData) {
+  static string name;
+  static string family;
+
+  // Energy 
+  unsigned int sizeE = RawData->GetMultEnergy();
+  for (unsigned int i = 0; i < sizeE; i++) {
+    name = "Coaxial_Germanium"+NPL::itoa(RawData->GetE_DetectorNbr(i))+"_ENERGY_RAW";
+    family = "Coaxial_Germanium/RAW";
+
+    FillSpectra(family,name,RawData->Get_Energy(i));
+  }
+
+  // Time
+  unsigned int sizeT = RawData->GetMultTime();
+  for (unsigned int i = 0; i < sizeT; i++) {
+    name = "Coaxial_Germanium"+NPL::itoa(RawData->GetT_DetectorNbr(i))+"_TIME_RAW";
+    family = "Coaxial_Germanium/RAW";
+
+    FillSpectra(family,name,RawData->Get_Time(i));
+  }
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumSpectra::FillPreTreatedSpectra(TCoaxial_GermaniumData* PreTreatedData) {
+  static string name;
+  static string family;
+  
+  // Energy 
+  unsigned int sizeE = PreTreatedData->GetMultEnergy();
+  for (unsigned int i = 0; i < sizeE; i++) {
+    name = "Coaxial_Germanium"+NPL::itoa(PreTreatedData->GetE_DetectorNbr(i))+"_ENERGY_CAL";
+    family = "Coaxial_Germanium/CAL";
+
+    FillSpectra(family,name,PreTreatedData->Get_Energy(i));
+  }
+
+  // Time
+  unsigned int sizeT = PreTreatedData->GetMultTime();
+  for (unsigned int i = 0; i < sizeT; i++) {
+    name = "Coaxial_Germanium"+NPL::itoa(PreTreatedData->GetT_DetectorNbr(i))+"_TIME_CAL";
+    family = "Coaxial_Germanium/CAL";
+
+    FillSpectra(family,name,PreTreatedData->Get_Time(i));
+  }
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TCoaxial_GermaniumSpectra::FillPhysicsSpectra(TCoaxial_GermaniumPhysics* Physics) {
+  static string name;
+  static string family;
+  family= "Coaxial_Germanium/PHY";
+
+  // Energy vs time
+  unsigned int sizeE = Physics->Energy.size();
+  for(unsigned int i = 0 ; i < sizeE ; i++){
+    name = "Coaxial_Germanium_ENERGY_TIME";
+    FillSpectra(family,name,Physics->Energy[i],Physics->Time[i]);
+  }
+}
+
diff --git a/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumSpectra.h b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumSpectra.h
new file mode 100644
index 000000000..d358cabca
--- /dev/null
+++ b/NPLib/Detectors/Coaxial_Germanium/TCoaxial_GermaniumSpectra.h
@@ -0,0 +1,62 @@
+#ifndef TCoaxial_GermaniumSPECTRA_H
+#define TCoaxial_GermaniumSPECTRA_H
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Coaxial_Germanium Spectra                                     *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// NPLib headers
+#include "NPVSpectra.h"
+#include "TCoaxial_GermaniumData.h"
+#include "TCoaxial_GermaniumPhysics.h"
+
+// Forward Declaration
+class TCoaxial_GermaniumPhysics;
+
+
+class TCoaxial_GermaniumSpectra : public VSpectra {
+  //////////////////////////////////////////////////////////////
+  // constructor and destructor
+  public:
+    TCoaxial_GermaniumSpectra();
+    TCoaxial_GermaniumSpectra(unsigned int NumberOfDetectors);
+    ~TCoaxial_GermaniumSpectra();
+
+  //////////////////////////////////////////////////////////////
+  // Initialization methods
+  private:
+    void InitRawSpectra();
+    void InitPreTreatedSpectra();
+    void InitPhysicsSpectra();
+
+  //////////////////////////////////////////////////////////////
+  // Filling methods
+  public:
+    void FillRawSpectra(TCoaxial_GermaniumData*);
+    void FillPreTreatedSpectra(TCoaxial_GermaniumData*);
+    void FillPhysicsSpectra(TCoaxial_GermaniumPhysics*);
+
+  //////////////////////////////////////////////////////////////
+  // Detector parameters 
+  private:
+    unsigned int fNumberOfDetectors;
+};
+
+#endif
diff --git a/NPLib/Detectors/Plastic_BEDO/CMakeLists.txt b/NPLib/Detectors/Plastic_BEDO/CMakeLists.txt
new file mode 100644
index 000000000..74dc69b16
--- /dev/null
+++ b/NPLib/Detectors/Plastic_BEDO/CMakeLists.txt
@@ -0,0 +1,6 @@
+add_custom_command(OUTPUT TPlastic_BEDOPhysicsDict.cxx COMMAND ../../scripts/build_dict.sh TPlastic_BEDOPhysics.h TPlastic_BEDOPhysicsDict.cxx TPlastic_BEDOPhysics.rootmap libNPPlastic_BEDO.dylib DEPENDS TPlastic_BEDOPhysics.h)
+add_custom_command(OUTPUT TPlastic_BEDODataDict.cxx COMMAND ../../scripts/build_dict.sh TPlastic_BEDOData.h TPlastic_BEDODataDict.cxx TPlastic_BEDOData.rootmap libNPPlastic_BEDO.dylib DEPENDS TPlastic_BEDOData.h)
+add_library(NPPlastic_BEDO SHARED TPlastic_BEDOSpectra.cxx TPlastic_BEDOData.cxx TPlastic_BEDOPhysics.cxx TPlastic_BEDODataDict.cxx TPlastic_BEDOPhysicsDict.cxx )
+target_link_libraries(NPPlastic_BEDO ${ROOT_LIBRARIES} NPCore) 
+install(FILES TPlastic_BEDOData.h TPlastic_BEDOPhysics.h TPlastic_BEDOSpectra.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY})
+
diff --git a/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOData.cxx b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOData.cxx
new file mode 100644
index 000000000..ee01235f2
--- /dev/null
+++ b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOData.cxx
@@ -0,0 +1,79 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Plastic_BEDO Raw data                                    *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+#include "TPlastic_BEDOData.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
+using namespace std; 
+
+ClassImp(TPlastic_BEDOData)
+
+
+//////////////////////////////////////////////////////////////////////
+TPlastic_BEDOData::TPlastic_BEDOData() {
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+TPlastic_BEDOData::~TPlastic_BEDOData() {
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOData::Clear() {
+  // Energy
+  fPlastic_BEDO_E_DetectorNbr.clear();
+  fPlastic_BEDO_Energy.clear();
+  // Time
+  fPlastic_BEDO_T_DetectorNbr.clear();
+  fPlastic_BEDO_Time.clear();
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOData::Dump() const {
+  // This method is very useful for debuging and worth the dev.
+  cout << "XXXXXXXXXXXXXXXXXXXXXXXX New Event [TPlastic_BEDOData::Dump()] XXXXXXXXXXXXXXXXX" << endl;
+
+  // Energy
+  size_t mysize = fPlastic_BEDO_E_DetectorNbr.size();
+  cout << "Plastic_BEDO_E_Mult: " << mysize << endl;
+ 
+  for (size_t i = 0 ; i < mysize ; i++){
+    cout << "DetNbr: " << fPlastic_BEDO_E_DetectorNbr[i]
+         << " Energy: " << fPlastic_BEDO_Energy[i];
+  }
+  
+  // Time
+  mysize = fPlastic_BEDO_T_DetectorNbr.size();
+  cout << "Plastic_BEDO_T_Mult: " << mysize << endl;
+ 
+  for (size_t i = 0 ; i < mysize ; i++){
+    cout << "DetNbr: " << fPlastic_BEDO_T_DetectorNbr[i]
+         << " Time: " << fPlastic_BEDO_Time[i];
+  }
+}
diff --git a/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOData.h b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOData.h
new file mode 100644
index 000000000..1a6b7fb29
--- /dev/null
+++ b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOData.h
@@ -0,0 +1,104 @@
+#ifndef __Plastic_BEDODATA__
+#define __Plastic_BEDODATA__
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Plastic_BEDO Raw data                                    *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// STL
+#include <vector>
+using namespace std;
+
+// ROOT
+#include "TObject.h"
+
+class TPlastic_BEDOData : public TObject {
+  //////////////////////////////////////////////////////////////
+  // data members are hold into vectors in order 
+  // to allow multiplicity treatment
+  private: 
+    // Energy
+    vector<UShort_t>   fPlastic_BEDO_E_DetectorNbr;
+    vector<Double_t>   fPlastic_BEDO_Energy;
+
+    // Time
+    vector<UShort_t>   fPlastic_BEDO_T_DetectorNbr;
+    vector<Double_t>   fPlastic_BEDO_Time;
+
+
+  //////////////////////////////////////////////////////////////
+  // Constructor and destructor
+  public: 
+    TPlastic_BEDOData();
+    ~TPlastic_BEDOData();
+    
+
+  //////////////////////////////////////////////////////////////
+  // 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    ////////////////////////
+    // Energy
+    inline void SetEnergy(const UShort_t& DetNbr,const Double_t& Energy){
+      fPlastic_BEDO_E_DetectorNbr.push_back(DetNbr);
+      fPlastic_BEDO_Energy.push_back(Energy);
+    };//!
+
+    // Time
+    inline void SetTime(const UShort_t& DetNbr,const Double_t& Time)	{
+      fPlastic_BEDO_T_DetectorNbr.push_back(DetNbr);     
+      fPlastic_BEDO_Time.push_back(Time);
+    };//!
+
+
+    //////////////////////    GETTERS    ////////////////////////
+    // Energy
+    inline UShort_t GetMultEnergy() const
+      {return fPlastic_BEDO_E_DetectorNbr.size();}
+    inline UShort_t GetE_DetectorNbr(const unsigned int &i) const 
+      {return fPlastic_BEDO_E_DetectorNbr[i];}//!
+    inline Double_t Get_Energy(const unsigned int &i) const 
+      {return fPlastic_BEDO_Energy[i];}//!
+
+    // Time
+    inline UShort_t GetMultTime() const
+      {return fPlastic_BEDO_T_DetectorNbr.size();}
+    inline UShort_t GetT_DetectorNbr(const unsigned int &i) const 
+      {return fPlastic_BEDO_T_DetectorNbr[i];}//!
+    inline Double_t Get_Time(const unsigned int &i) const 
+      {return fPlastic_BEDO_Time[i];}//!
+
+
+  //////////////////////////////////////////////////////////////
+  // Required for ROOT dictionnary
+  ClassDef(TPlastic_BEDOData,1)  // Plastic_BEDOData structure
+};
+
+#endif
diff --git a/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOPhysics.cxx b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOPhysics.cxx
new file mode 100644
index 000000000..284a1b257
--- /dev/null
+++ b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOPhysics.cxx
@@ -0,0 +1,344 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Plastic_BEDO Treated  data                               *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+#include "TPlastic_BEDOPhysics.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(TPlastic_BEDOPhysics)
+
+
+///////////////////////////////////////////////////////////////////////////
+TPlastic_BEDOPhysics::TPlastic_BEDOPhysics()
+   : m_EventData(new TPlastic_BEDOData),
+     m_PreTreatedData(new TPlastic_BEDOData),
+     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 TPlastic_BEDOPhysics::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 TPlastic_BEDOPhysics::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 TPlastic_BEDOPhysics::BuildSimplePhysicalEvent() {
+  BuildPhysicalEvent();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::BuildPhysicalEvent() {
+  // apply thresholds and calibration
+  PreTreat();
+
+  // match energy and time together
+  unsigned int mysizeE = m_PreTreatedData->GetMultEnergy();
+  unsigned int mysizeT = m_PreTreatedData->GetMultTime();
+  for (UShort_t e = 0; e < mysizeE ; e++) {
+    for (UShort_t t = 0; t < mysizeT ; t++) {
+      if (m_PreTreatedData->GetE_DetectorNbr(e) == m_PreTreatedData->GetT_DetectorNbr(t)) {
+        DetectorNumber.push_back(m_PreTreatedData->GetE_DetectorNbr(e));
+        Energy.push_back(m_PreTreatedData->Get_Energy(e));
+        Time.push_back(m_PreTreatedData->Get_Time(t));
+      }
+    }
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::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->GetMultEnergy();
+  for (UShort_t i = 0; i < mysize ; ++i) {
+    if (m_EventData->Get_Energy(i) > m_E_RAW_Threshold) {
+      Double_t Energy = Cal->ApplyCalibration("Plastic_BEDO/ENERGY"+NPL::itoa(m_EventData->GetE_DetectorNbr(i)),m_EventData->Get_Energy(i));
+      if (Energy > m_E_Threshold) {
+        m_PreTreatedData->SetEnergy(m_EventData->GetE_DetectorNbr(i), Energy);
+      }
+    }
+  }
+
+  // Time 
+  mysize = m_EventData->GetMultTime();
+  for (UShort_t i = 0; i < mysize; ++i) {
+    Double_t Time= Cal->ApplyCalibration("Plastic_BEDO/TIME"+NPL::itoa(m_EventData->GetT_DetectorNbr(i)),m_EventData->Get_Time(i));
+    m_PreTreatedData->SetTime(m_EventData->GetT_DetectorNbr(i), Time);
+  }
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::ReadAnalysisConfig() {
+  bool ReadingStatus = false;
+
+  // path to file
+  string FileName = "./configs/ConfigPlastic_BEDO.dat";
+
+  // open analysis config file
+  ifstream AnalysisConfigFile;
+  AnalysisConfigFile.open(FileName.c_str());
+
+  if (!AnalysisConfigFile.is_open()) {
+    cout << " No ConfigPlastic_BEDO.dat found: Default parameter loaded for Analayis " << FileName << endl;
+    return;
+  }
+  cout << " Loading user parameter for Analysis from ConfigPlastic_BEDO.dat " << endl;
+
+  // Save it in a TAsciiFile
+  TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig();
+  asciiConfig->AppendLine("%%% ConfigPlastic_BEDO.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 = "ConfigPlastic_BEDO";
+    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 TPlastic_BEDOPhysics::Clear() {
+  DetectorNumber.clear();
+  Energy.clear();
+  Time.clear();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::ReadConfiguration(NPL::InputParser parser) {
+  vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Plastic_BEDO");
+  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 << "////  Plastic_BEDO " << 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 << "////  Plastic_BEDO " << 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 TPlastic_BEDOPhysics::InitSpectra() {
+  m_Spectra = new TPlastic_BEDOSpectra(m_NumberOfDetectors);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::FillSpectra() {
+  m_Spectra -> FillRawSpectra(m_EventData);
+  m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData);
+  m_Spectra -> FillPhysicsSpectra(m_EventPhysics);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::CheckSpectra() {
+  m_Spectra->CheckSpectra();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::ClearSpectra() {
+  // To be done
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+map< string , TH1*> TPlastic_BEDOPhysics::GetSpectra() {
+  if(m_Spectra)
+    return m_Spectra->GetMapHisto();
+  else{
+    map< string , TH1*> empty;
+    return empty;
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::WriteSpectra() {
+  m_Spectra->WriteSpectra();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::AddParameterToCalibrationManager() {
+  CalibrationManager* Cal = CalibrationManager::getInstance();
+  for (int i = 0; i < m_NumberOfDetectors; ++i) {
+    Cal->AddParameter("Plastic_BEDO", "D"+ NPL::itoa(i+1)+"_ENERGY","Plastic_BEDO_D"+ NPL::itoa(i+1)+"_ENERGY");
+    Cal->AddParameter("Plastic_BEDO", "D"+ NPL::itoa(i+1)+"_TIME","Plastic_BEDO_D"+ NPL::itoa(i+1)+"_TIME");
+  }
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::InitializeRootInputRaw() {
+  TChain* inputChain = RootInput::getInstance()->GetChain();
+  inputChain->SetBranchStatus("Plastic_BEDO",  true );
+  inputChain->SetBranchAddress("Plastic_BEDO", &m_EventData );
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::InitializeRootInputPhysics() {
+  TChain* inputChain = RootInput::getInstance()->GetChain();
+  inputChain->SetBranchAddress("Plastic_BEDO", &m_EventPhysics);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOPhysics::InitializeRootOutput() {
+  TTree* outputTree = RootOutput::getInstance()->GetTree();
+  outputTree->Branch("Plastic_BEDO", "TPlastic_BEDOPhysics", &m_EventPhysics);
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+//            Construct Method to be pass to the DetectorFactory              //
+////////////////////////////////////////////////////////////////////////////////
+NPL::VDetector* TPlastic_BEDOPhysics::Construct() {
+  return (NPL::VDetector*) new TPlastic_BEDOPhysics();
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+//            Registering the construct method to the factory                 //
+////////////////////////////////////////////////////////////////////////////////
+extern "C"{
+class proxy_Plastic_BEDO{
+  public:
+    proxy_Plastic_BEDO(){
+      NPL::DetectorFactory::getInstance()->AddToken("Plastic_BEDO","Plastic_BEDO");
+      NPL::DetectorFactory::getInstance()->AddDetector("Plastic_BEDO",TPlastic_BEDOPhysics::Construct);
+    }
+};
+
+proxy_Plastic_BEDO p_Plastic_BEDO;
+}
+
diff --git a/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOPhysics.h b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOPhysics.h
new file mode 100644
index 000000000..0a12fd1da
--- /dev/null
+++ b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOPhysics.h
@@ -0,0 +1,180 @@
+#ifndef TPlastic_BEDOPHYSICS_H
+#define TPlastic_BEDOPHYSICS_H
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Plastic_BEDO 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 "TPlastic_BEDOData.h"
+#include "TPlastic_BEDOSpectra.h"
+#include "NPCalibrationManager.h"
+#include "NPVDetector.h"
+#include "NPInputParser.h"
+// forward declaration
+class TPlastic_BEDOSpectra;
+
+
+
+class TPlastic_BEDOPhysics : public TObject, public NPL::VDetector {
+  //////////////////////////////////////////////////////////////
+  // constructor and destructor
+  public:
+    TPlastic_BEDOPhysics();
+    ~TPlastic_BEDOPhysics() {};
+
+
+  //////////////////////////////////////////////////////////////
+  // 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<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 TPlastic_BEDOSpectra class
+    // instantiate the TPlastic_BEDOSpectra 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 Plastic_BEDO 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 TPlastic_BEDOData object to TPlastic_BEDOPhysics. 
+    // needed for online analysis for example
+    void SetRawDataPointer(TPlastic_BEDOData* rawDataPointer) {m_EventData = rawDataPointer;}
+    
+  // objects are not written in the TTree
+  private:
+    TPlastic_BEDOData*         m_EventData;        //!
+    TPlastic_BEDOData*         m_PreTreatedData;   //!
+    TPlastic_BEDOPhysics*      m_EventPhysics;     //!
+
+  // getters for raw and pre-treated data object
+  public:
+    TPlastic_BEDOData* GetRawData()        const {return m_EventData;}
+    TPlastic_BEDOData* 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:
+    TPlastic_BEDOSpectra* m_Spectra; // !
+
+  // spectra getter
+  public:
+    map<string, TH1*>   GetSpectra(); 
+
+  // Static constructor to be passed to the Detector Factory
+  public:
+    static NPL::VDetector* Construct();
+
+    ClassDef(TPlastic_BEDOPhysics,1)  // Plastic_BEDOPhysics structure
+};
+#endif
diff --git a/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOSpectra.cxx b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOSpectra.cxx
new file mode 100644
index 000000000..546538022
--- /dev/null
+++ b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOSpectra.cxx
@@ -0,0 +1,174 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Plastic_BEDO Spectra                                     *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// class header 
+#include "TPlastic_BEDOSpectra.h"
+
+// STL
+#include <iostream>  
+#include <string>
+using namespace std;
+
+// NPTool header
+#include "NPOptionManager.h"
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TPlastic_BEDOSpectra::TPlastic_BEDOSpectra() 
+   : fNumberOfDetectors(0) {
+  SetName("Plastic_BEDO");
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TPlastic_BEDOSpectra::TPlastic_BEDOSpectra(unsigned int NumberOfDetectors) {
+  if(NPOptionManager::getInstance()->GetVerboseLevel()>0)
+    cout << "************************************************" << endl
+      << "TPlastic_BEDOSpectra : Initalizing control spectra for " 
+      << NumberOfDetectors << " Detectors" << endl
+      << "************************************************" << endl ;
+  SetName("Plastic_BEDO");
+  fNumberOfDetectors = NumberOfDetectors;
+
+  InitRawSpectra();
+  InitPreTreatedSpectra();
+  InitPhysicsSpectra();
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+TPlastic_BEDOSpectra::~TPlastic_BEDOSpectra() {
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOSpectra::InitRawSpectra() {
+  static string name;
+  for (unsigned int i = 0; i < fNumberOfDetectors; i++) { // loop on number of detectors
+    // Energy 
+    name = "Plastic_BEDO"+NPL::itoa(i+1)+"_ENERGY_RAW";
+    AddHisto1D(name, name, 4096, 0, 16384, "Plastic_BEDO/RAW");
+    // Time 
+    name = "Plastic_BEDO"+NPL::itoa(i+1)+"_TIME_RAW";
+    AddHisto1D(name, name, 4096, 0, 16384, "Plastic_BEDO/RAW");
+  } // end loop on number of detectors
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOSpectra::InitPreTreatedSpectra() {
+  static string name;
+  for (unsigned int i = 0; i < fNumberOfDetectors; i++) { // loop on number of detectors
+    // Energy 
+    name = "Plastic_BEDO"+NPL::itoa(i+1)+"_ENERGY_CAL";
+    AddHisto1D(name, name, 500, 0, 25, "Plastic_BEDO/CAL");
+    // Time
+    name = "Plastic_BEDO"+NPL::itoa(i+1)+"_TIME_CAL";
+    AddHisto1D(name, name, 500, 0, 25, "Plastic_BEDO/CAL");
+
+  
+  }  // end loop on number of detectors
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOSpectra::InitPhysicsSpectra() {
+  static string name;
+  // Kinematic Plot 
+  name = "Plastic_BEDO_ENERGY_TIME";
+  AddHisto2D(name, name, 500, 0, 500, 500, 0, 50, "Plastic_BEDO/PHY");
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOSpectra::FillRawSpectra(TPlastic_BEDOData* RawData) {
+  static string name;
+  static string family;
+
+  // Energy 
+  unsigned int sizeE = RawData->GetMultEnergy();
+  for (unsigned int i = 0; i < sizeE; i++) {
+    name = "Plastic_BEDO"+NPL::itoa(RawData->GetE_DetectorNbr(i))+"_ENERGY_RAW";
+    family = "Plastic_BEDO/RAW";
+
+    FillSpectra(family,name,RawData->Get_Energy(i));
+  }
+
+  // Time
+  unsigned int sizeT = RawData->GetMultTime();
+  for (unsigned int i = 0; i < sizeT; i++) {
+    name = "Plastic_BEDO"+NPL::itoa(RawData->GetT_DetectorNbr(i))+"_TIME_RAW";
+    family = "Plastic_BEDO/RAW";
+
+    FillSpectra(family,name,RawData->Get_Time(i));
+  }
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOSpectra::FillPreTreatedSpectra(TPlastic_BEDOData* PreTreatedData) {
+  static string name;
+  static string family;
+  
+  // Energy 
+  unsigned int sizeE = PreTreatedData->GetMultEnergy();
+  for (unsigned int i = 0; i < sizeE; i++) {
+    name = "Plastic_BEDO"+NPL::itoa(PreTreatedData->GetE_DetectorNbr(i))+"_ENERGY_CAL";
+    family = "Plastic_BEDO/CAL";
+
+    FillSpectra(family,name,PreTreatedData->Get_Energy(i));
+  }
+
+  // Time
+  unsigned int sizeT = PreTreatedData->GetMultTime();
+  for (unsigned int i = 0; i < sizeT; i++) {
+    name = "Plastic_BEDO"+NPL::itoa(PreTreatedData->GetT_DetectorNbr(i))+"_TIME_CAL";
+    family = "Plastic_BEDO/CAL";
+
+    FillSpectra(family,name,PreTreatedData->Get_Time(i));
+  }
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void TPlastic_BEDOSpectra::FillPhysicsSpectra(TPlastic_BEDOPhysics* Physics) {
+  static string name;
+  static string family;
+  family= "Plastic_BEDO/PHY";
+
+  // Energy vs time
+  unsigned int sizeE = Physics->Energy.size();
+  for(unsigned int i = 0 ; i < sizeE ; i++){
+    name = "Plastic_BEDO_ENERGY_TIME";
+    FillSpectra(family,name,Physics->Energy[i],Physics->Time[i]);
+  }
+}
+
diff --git a/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOSpectra.h b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOSpectra.h
new file mode 100644
index 000000000..ab507af14
--- /dev/null
+++ b/NPLib/Detectors/Plastic_BEDO/TPlastic_BEDOSpectra.h
@@ -0,0 +1,62 @@
+#ifndef TPlastic_BEDOSPECTRA_H
+#define TPlastic_BEDOSPECTRA_H
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class hold Plastic_BEDO Spectra                                     *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *   
+ *                                                                           *
+ *****************************************************************************/
+
+// NPLib headers
+#include "NPVSpectra.h"
+#include "TPlastic_BEDOData.h"
+#include "TPlastic_BEDOPhysics.h"
+
+// Forward Declaration
+class TPlastic_BEDOPhysics;
+
+
+class TPlastic_BEDOSpectra : public VSpectra {
+  //////////////////////////////////////////////////////////////
+  // constructor and destructor
+  public:
+    TPlastic_BEDOSpectra();
+    TPlastic_BEDOSpectra(unsigned int NumberOfDetectors);
+    ~TPlastic_BEDOSpectra();
+
+  //////////////////////////////////////////////////////////////
+  // Initialization methods
+  private:
+    void InitRawSpectra();
+    void InitPreTreatedSpectra();
+    void InitPhysicsSpectra();
+
+  //////////////////////////////////////////////////////////////
+  // Filling methods
+  public:
+    void FillRawSpectra(TPlastic_BEDOData*);
+    void FillPreTreatedSpectra(TPlastic_BEDOData*);
+    void FillPhysicsSpectra(TPlastic_BEDOPhysics*);
+
+  //////////////////////////////////////////////////////////////
+  // Detector parameters 
+  private:
+    unsigned int fNumberOfDetectors;
+};
+
+#endif
diff --git a/NPSimulation/Detectors/Coaxial_Germanium/CMakeLists.txt b/NPSimulation/Detectors/Coaxial_Germanium/CMakeLists.txt
new file mode 100644
index 000000000..b227a7a55
--- /dev/null
+++ b/NPSimulation/Detectors/Coaxial_Germanium/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_library(NPSCoaxial_Germanium SHARED  Coaxial_Germanium.cc)
+target_link_libraries(NPSCoaxial_Germanium NPSCore ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPCoaxial_Germanium)
diff --git a/NPSimulation/Detectors/Coaxial_Germanium/Coaxial_Germanium.cc b/NPSimulation/Detectors/Coaxial_Germanium/Coaxial_Germanium.cc
new file mode 100644
index 000000000..c3c46abed
--- /dev/null
+++ b/NPSimulation/Detectors/Coaxial_Germanium/Coaxial_Germanium.cc
@@ -0,0 +1,281 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class describe  Coaxial_Germanium simulation                             *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ *                                                                           *
+ *****************************************************************************/
+
+// C++ headers
+#include <sstream>
+#include <cmath>
+#include <limits>
+//G4 Geometry object
+#include "G4Tubs.hh"
+#include "G4Box.hh"
+#include "G4Polycone.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"
+
+// NPTool header
+#include "Coaxial_Germanium.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 Coaxial_Germanium_NS{
+  // Energy and time Resolution
+  const double EnergyThreshold = 0.01*MeV;
+  const double ResoTime = 0*ns ;
+  const double ResoEnergy = 1e-9*keV ; 
+  const string Material_Shell = "Al";
+  const double radii_internal[7] =  {0       , 65/2.*mm-1*mm, 90/2*mm-1*mm, 90/2*mm-1*mm, 90/2*mm-1*mm, 222/2.*mm-1*mm, 0.            };
+  const double radii_external[7] =  {65/2.*mm, 65/2.*mm     , 90/2.*mm    , 90/2.*mm    , 222/2.*mm     , 222/2.*mm     , 222/2.*mm     };
+  const double length_external[7] = {0       , 0            , 100*mm      , 450*mm      , 450*mm        , 700*mm        , 700*mm        };
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Coaxial_Germanium Specific Method
+Coaxial_Germanium::Coaxial_Germanium(){
+  m_Event = new TCoaxial_GermaniumData() ;
+  m_Coaxial_GermaniumScorer = 0;
+}
+
+Coaxial_Germanium::~Coaxial_Germanium(){
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void Coaxial_Germanium::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 Coaxial_Germanium::AddDetector(double  R, double  Theta, double  Phi){
+  m_R.push_back(R);
+  m_Theta.push_back(Theta);
+  m_Phi.push_back(Phi);
+}
+
+
+G4LogicalVolume* Coaxial_Germanium::BuildDetector(G4int DetNumber, G4ThreeVector Det_pos, G4RotationMatrix* Det_rot, G4LogicalVolume* world){
+  // Materials
+  G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Coaxial_Germanium_NS::Material_Shell);
+  G4Material* m_MaterialVacuum = MaterialManager::getInstance()->GetMaterialFromLibrary("Vacuum");
+  G4Material* m_MaterialCarbon = MaterialManager::getInstance()->GetMaterialFromLibrary("C");
+  G4Material* m_MaterialGermanium = MaterialManager::getInstance()->GetMaterialFromLibrary("Germanium");
+
+  G4VisAttributes* light_GreyAtt = new G4VisAttributes(G4Colour(0.5, 0.5, 0.5, 0.7));
+  G4VisAttributes* RedAtt = new G4VisAttributes(G4Colour(1.0, 0.0, 0.0, 0.6));
+  G4VisAttributes* GreenAtt = new G4VisAttributes(G4Colour(0.0, 1.0, 0.0, 0.6));
+
+  // Global volume
+  // Origin axis at the front of detector
+  G4Tubs* solidCoaxial_Germanium = new G4Tubs("solidCoaxial_Germanium", 0, 25, 720*0.5*mm, 0, 360*deg);
+  G4LogicalVolume* logicCoaxial_Germanium = new G4LogicalVolume(solidCoaxial_Germanium, m_MaterialVacuum, "logicCoaxial_Germanium", 0, 0);
+  new G4PVPlacement(G4Transform3D(*Det_rot, Det_pos), logicCoaxial_Germanium, "Coaxial_Germanium", world, false, DetNumber);
+  logicCoaxial_Germanium->SetVisAttributes(G4VisAttributes::GetInvisible());
+
+  // Enveloppe
+  G4Polycone* Coaxial_Germanium_Cyl = new G4Polycone("Coaxial_Germanium_Cyl", 0, 360*deg, 7, Coaxial_Germanium_NS::length_external, Coaxial_Germanium_NS::radii_internal, Coaxial_Germanium_NS::radii_external);
+  G4LogicalVolume* vol_Coaxial_Germanium = new G4LogicalVolume(Coaxial_Germanium_Cyl, DetectorMaterial, "logic_Coaxial_Germanium_Cyl", 0, 0, 0);
+  G4ThreeVector Coaxial_Germanium_cyl_Pos = G4ThreeVector(0, 0, 0);
+  new G4PVPlacement(0, Coaxial_Germanium_cyl_Pos, vol_Coaxial_Germanium, "Coaxial_Germanium_cyl", logicCoaxial_Germanium, false, DetNumber);
+  vol_Coaxial_Germanium->SetVisAttributes(light_GreyAtt);
+
+  // Germanium crystal
+  G4Tubs* Coaxial_Germanium_crys = new G4Tubs("Coaxial_Germanium_crys",0 , 13*mm, 10.2*0.5*mm, 0, 360*deg);
+  G4LogicalVolume* vol_crys = new G4LogicalVolume(Coaxial_Germanium_crys, m_MaterialGermanium, "logic_Coaxial_Germanium_crys", 0, 0, 0);
+  G4ThreeVector crys_Pos = G4ThreeVector(0, 0, 0.6*1.5*mm+11*0.5*mm);
+  new G4PVPlacement(0, crys_Pos, vol_crys, "Coaxial_Germanium_crys", logicCoaxial_Germanium, false, DetNumber);
+  vol_crys->SetVisAttributes(RedAtt);
+
+  vol_crys->SetSensitiveDetector(m_Coaxial_GermaniumScorer);
+  
+  return vol_Coaxial_Germanium;
+}
+
+//....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 Coaxial_Germanium::ReadConfiguration(NPL::InputParser parser){
+  vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Coaxial_Germanium");
+  if(NPOptionManager::getInstance()->GetVerboseLevel())
+    cout << "//// " << blocks.size() << " detectors found " << endl; 
+
+  vector<string> cart = {"POS"};
+  vector<string> sphe = {"R","Theta","Phi"};
+
+  for(unsigned int i = 0 ; i < blocks.size() ; i++){
+    if(blocks[i]->HasTokenList(cart)){
+      if(NPOptionManager::getInstance()->GetVerboseLevel())
+        cout << endl << "////  Coaxial_Germanium " << i+1 <<  endl;
+    
+      G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm"));
+      AddDetector(Pos);
+    }
+    else if(blocks[i]->HasTokenList(sphe)){
+      if(NPOptionManager::getInstance()->GetVerboseLevel())
+        cout << endl << "////  Coaxial_Germanium " << i+1 <<  endl;
+      double R = blocks[i]->GetDouble("R","mm");
+      double Theta = blocks[i]->GetDouble("Theta","deg");
+      double Phi = blocks[i]->GetDouble("Phi","deg");
+      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 Coaxial_Germanium::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()*Coaxial_Germanium_NS::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);
+
+    BuildDetector(i+1, Det_pos, Rot, world);
+  }
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Add Detector branch to the EventTree.
+// Called After DetecorConstruction::AddDetector Method
+void Coaxial_Germanium::InitializeRootOutput(){
+  RootOutput *pAnalysis = RootOutput::getInstance();
+  TTree *pTree = pAnalysis->GetTree();
+  if(!pTree->FindBranch("Coaxial_Germanium")){
+    pTree->Branch("Coaxial_Germanium", "TCoaxial_GermaniumData", &m_Event) ;
+  }
+  pTree->SetBranchAddress("Coaxial_Germanium", &m_Event) ;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Read sensitive part and fill the Root tree.
+// Called at in the EventAction::EndOfEventAvtion
+void Coaxial_Germanium::ReadSensitive(const G4Event* ){
+  m_Event->Clear();
+
+  ///////////
+  // Calorimeter scorer
+  CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_Coaxial_GermaniumScorer->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),Coaxial_Germanium_NS::ResoEnergy);
+    if(Energy>Coaxial_Germanium_NS::EnergyThreshold){
+      double Time = RandGauss::shoot(Scorer->GetTime(i),Coaxial_Germanium_NS::ResoTime);
+      int DetectorNbr = level[0];
+      m_Event->SetEnergy(DetectorNbr,Energy);
+      m_Event->SetTime(DetectorNbr,Time); 
+    }
+  }
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+////////////////////////////////////////////////////////////////   
+void Coaxial_Germanium::InitializeScorers() { 
+  // This check is necessary in case the geometry is reloaded
+  bool already_exist = false; 
+  m_Coaxial_GermaniumScorer = CheckScorer("Coaxial_GermaniumScorer",already_exist) ;
+
+  if(already_exist) 
+    return ;
+
+  // Otherwise the scorer is initialised
+  vector<int> level; 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_Coaxial_GermaniumScorer->RegisterPrimitive(Calorimeter);
+  m_Coaxial_GermaniumScorer->RegisterPrimitive(Interaction);
+  G4SDManager::GetSDMpointer()->AddNewDetector(m_Coaxial_GermaniumScorer) ;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+////////////////////////////////////////////////////////////////////////////////
+//            Construct Method to be pass to the DetectorFactory              //
+////////////////////////////////////////////////////////////////////////////////
+NPS::VDetector* Coaxial_Germanium::Construct(){
+  return  (NPS::VDetector*) new Coaxial_Germanium();
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+////////////////////////////////////////////////////////////////////////////////
+//            Registering the construct method to the factory                 //
+////////////////////////////////////////////////////////////////////////////////
+extern"C" {
+  class proxy_nps_Coaxial_Germanium{
+    public:
+      proxy_nps_Coaxial_Germanium(){
+        NPS::DetectorFactory::getInstance()->AddToken("Coaxial_Germanium","Coaxial_Germanium");
+        NPS::DetectorFactory::getInstance()->AddDetector("Coaxial_Germanium",Coaxial_Germanium::Construct);
+      }
+  };
+
+  proxy_nps_Coaxial_Germanium p_nps_Coaxial_Germanium;
+}
diff --git a/NPSimulation/Detectors/Coaxial_Germanium/Coaxial_Germanium.hh b/NPSimulation/Detectors/Coaxial_Germanium/Coaxial_Germanium.hh
new file mode 100644
index 000000000..252f8311f
--- /dev/null
+++ b/NPSimulation/Detectors/Coaxial_Germanium/Coaxial_Germanium.hh
@@ -0,0 +1,108 @@
+#ifndef Coaxial_Germanium_h
+#define Coaxial_Germanium_h 1
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class describe  Coaxial_Germanium 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"
+
+// NPTool header
+#include "NPSVDetector.hh"
+#include "TCoaxial_GermaniumData.h"
+#include "NPInputParser.h"
+
+class Coaxial_Germanium : public NPS::VDetector{
+  ////////////////////////////////////////////////////
+  /////// Default Constructor and Destructor /////////
+  ////////////////////////////////////////////////////
+  public:
+    Coaxial_Germanium() ;
+    virtual ~Coaxial_Germanium() ;
+
+    ////////////////////////////////////////////////////
+    /////// Specific Function of this Class ///////////
+    ////////////////////////////////////////////////////
+  public:
+    // Cartesian
+    void AddDetector(G4ThreeVector POS);
+    // Spherical
+    void AddDetector(double R,double Theta,double Phi);  
+
+
+    G4LogicalVolume* BuildDetector(G4int, G4ThreeVector, G4RotationMatrix*, G4LogicalVolume*);
+  
+  private:
+    
+    ////////////////////////////////////////////////////
+    //////  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_Coaxial_GermaniumScorer ;
+    ////////////////////////////////////////////////////
+    ///////////Event class to store Data////////////////
+    ////////////////////////////////////////////////////
+  private:
+    TCoaxial_GermaniumData* m_Event ;
+
+    ////////////////////////////////////////////////////
+    ///////////////Private intern Data//////////////////
+    ////////////////////////////////////////////////////
+  private: // Geometry
+    // Detector Coordinate 
+    vector<double>  m_R; 
+    vector<double>  m_Theta;
+    vector<double>  m_Phi; 
+    
+   
+  // Needed for dynamic loading of the library
+  public:
+    static NPS::VDetector* Construct();
+};
+#endif
diff --git a/NPSimulation/Detectors/Plastic_BEDO/CMakeLists.txt b/NPSimulation/Detectors/Plastic_BEDO/CMakeLists.txt
new file mode 100644
index 000000000..61b575df8
--- /dev/null
+++ b/NPSimulation/Detectors/Plastic_BEDO/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_library(NPSPlastic_BEDO SHARED  Plastic_BEDO.cc)
+target_link_libraries(NPSPlastic_BEDO NPSCore ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPPlastic_BEDO)
diff --git a/NPSimulation/Detectors/Plastic_BEDO/Plastic_BEDO.cc b/NPSimulation/Detectors/Plastic_BEDO/Plastic_BEDO.cc
new file mode 100644
index 000000000..89e70d6d8
--- /dev/null
+++ b/NPSimulation/Detectors/Plastic_BEDO/Plastic_BEDO.cc
@@ -0,0 +1,267 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class describe  Plastic_BEDO 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"
+
+// NPTool header
+#include "Plastic_BEDO.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 Plastic_BEDO_NS{
+  // Energy and time Resolution
+  const double EnergyThreshold = 0.1*MeV;
+  const double ResoTime = 4.5*ns ;
+  const double ResoEnergy = 1.0*MeV ;
+  const double Radius = 30*mm ; 
+  const double Thickness = 2*mm ;
+  const double Length = 100*mm ;
+  const string Material = "BC400";
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Plastic_BEDO Specific Method
+Plastic_BEDO::Plastic_BEDO(){
+  m_Event = new TPlastic_BEDOData() ;
+  m_Plastic_BEDOScorer = 0;
+  m_SquareDetector = 0;
+  m_CylindricalDetector = 0;
+
+
+  // RGB Color + Transparency
+  m_VisSquare = new G4VisAttributes(G4Colour(0, 1, 0, 0.5));   
+  m_VisCylinder = new G4VisAttributes(G4Colour(0, 0, 1, 0.5));   
+
+}
+
+Plastic_BEDO::~Plastic_BEDO(){
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void Plastic_BEDO::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 Plastic_BEDO::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......
+G4LogicalVolume* Plastic_BEDO::BuildCylindricalDetector(){
+  if(!m_CylindricalDetector){
+    G4Tubs* tub = new G4Tubs("Plastic_BEDO",Plastic_BEDO_NS::Radius-Plastic_BEDO_NS::Thickness,Plastic_BEDO_NS::Radius,Plastic_BEDO_NS::Length*0.5,0,360*deg);
+
+    G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(Plastic_BEDO_NS::Material);
+    m_CylindricalDetector = new G4LogicalVolume(tub,DetectorMaterial,"logic_Plastic_BEDO_tub",0,0,0);
+    m_CylindricalDetector->SetVisAttributes(m_VisSquare);
+    m_CylindricalDetector->SetSensitiveDetector(m_Plastic_BEDOScorer);
+
+  }
+  return m_CylindricalDetector;
+}
+
+//....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 Plastic_BEDO::ReadConfiguration(NPL::InputParser parser){
+  vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Plastic_BEDO");
+  if(NPOptionManager::getInstance()->GetVerboseLevel())
+    cout << "//// " << blocks.size() << " detectors found " << endl; 
+
+  vector<string> cart = {"POS"};
+  vector<string> sphe = {"R","Theta","Phi"};
+
+  for(unsigned int i = 0 ; i < blocks.size() ; i++){
+    if(blocks[i]->HasTokenList(cart)){
+      if(NPOptionManager::getInstance()->GetVerboseLevel())
+        cout << endl << "////  Plastic_BEDO " << i+1 <<  endl;
+
+      G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm"));
+      AddDetector(Pos);
+    }
+    else if(blocks[i]->HasTokenList(sphe)){
+      if(NPOptionManager::getInstance()->GetVerboseLevel())
+        cout << endl << "////  Plastic_BEDO " << i+1 <<  endl;
+      double R = blocks[i]->GetDouble("R","mm");
+      double Theta = blocks[i]->GetDouble("Theta","deg");
+      double Phi = blocks[i]->GetDouble("Phi","deg");
+      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 Plastic_BEDO::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()*Plastic_BEDO_NS::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);
+
+    new G4PVPlacement(G4Transform3D(*Rot,Det_pos),
+        BuildCylindricalDetector(),
+        "Plastic_BEDO",world,false,i+1);
+    
+  }
+}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Add Detector branch to the EventTree.
+// Called After DetecorConstruction::AddDetector Method
+void Plastic_BEDO::InitializeRootOutput(){
+  RootOutput *pAnalysis = RootOutput::getInstance();
+  TTree *pTree = pAnalysis->GetTree();
+  if(!pTree->FindBranch("Plastic_BEDO")){
+    pTree->Branch("Plastic_BEDO", "TPlastic_BEDOData", &m_Event) ;
+  }
+  pTree->SetBranchAddress("Plastic_BEDO", &m_Event) ;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+// Read sensitive part and fill the Root tree.
+// Called at in the EventAction::EndOfEventAvtion
+void Plastic_BEDO::ReadSensitive(const G4Event* ){
+  m_Event->Clear();
+
+  ///////////
+  // Calorimeter scorer
+  CalorimeterScorers::PS_Calorimeter* Scorer= (CalorimeterScorers::PS_Calorimeter*) m_Plastic_BEDOScorer->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),Plastic_BEDO_NS::ResoEnergy);
+    if(Energy>Plastic_BEDO_NS::EnergyThreshold){
+      double Time = RandGauss::shoot(Scorer->GetTime(i),Plastic_BEDO_NS::ResoTime);
+      int DetectorNbr = level[0];
+      m_Event->SetEnergy(DetectorNbr,Energy);
+      m_Event->SetTime(DetectorNbr,Time); 
+    }
+  }
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+////////////////////////////////////////////////////////////////   
+void Plastic_BEDO::InitializeScorers() { 
+  // This check is necessary in case the geometry is reloaded
+  bool already_exist = false; 
+  m_Plastic_BEDOScorer = CheckScorer("Plastic_BEDOScorer",already_exist) ;
+
+  if(already_exist) 
+    return ;
+
+  // Otherwise the scorer is initialised
+  vector<int> level; 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_Plastic_BEDOScorer->RegisterPrimitive(Calorimeter);
+  m_Plastic_BEDOScorer->RegisterPrimitive(Interaction);
+  G4SDManager::GetSDMpointer()->AddNewDetector(m_Plastic_BEDOScorer) ;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+////////////////////////////////////////////////////////////////////////////////
+//            Construct Method to be pass to the DetectorFactory              //
+////////////////////////////////////////////////////////////////////////////////
+NPS::VDetector* Plastic_BEDO::Construct(){
+  return  (NPS::VDetector*) new Plastic_BEDO();
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+////////////////////////////////////////////////////////////////////////////////
+//            Registering the construct method to the factory                 //
+////////////////////////////////////////////////////////////////////////////////
+extern"C" {
+  class proxy_nps_Plastic_BEDO{
+    public:
+      proxy_nps_Plastic_BEDO(){
+        NPS::DetectorFactory::getInstance()->AddToken("Plastic_BEDO","Plastic_BEDO");
+        NPS::DetectorFactory::getInstance()->AddDetector("Plastic_BEDO",Plastic_BEDO::Construct);
+      }
+  };
+
+  proxy_nps_Plastic_BEDO p_nps_Plastic_BEDO;
+}
diff --git a/NPSimulation/Detectors/Plastic_BEDO/Plastic_BEDO.hh b/NPSimulation/Detectors/Plastic_BEDO/Plastic_BEDO.hh
new file mode 100644
index 000000000..eb62c3027
--- /dev/null
+++ b/NPSimulation/Detectors/Plastic_BEDO/Plastic_BEDO.hh
@@ -0,0 +1,117 @@
+#ifndef Plastic_BEDO_h
+#define Plastic_BEDO_h 1
+/*****************************************************************************
+ * Copyright (C) 2009-2025   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: Léo Plagnol  contact address: leo.plagnol@ijclab.in2p3.fr                        *
+ *                                                                           *
+ * Creation Date  : January 2025                                           *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class describe  Plastic_BEDO 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"
+
+// NPTool header
+#include "NPSVDetector.hh"
+#include "TPlastic_BEDOData.h"
+#include "NPInputParser.h"
+
+class Plastic_BEDO : public NPS::VDetector{
+  ////////////////////////////////////////////////////
+  /////// Default Constructor and Destructor /////////
+  ////////////////////////////////////////////////////
+  public:
+    Plastic_BEDO() ;
+    virtual ~Plastic_BEDO() ;
+
+    ////////////////////////////////////////////////////
+    /////// Specific Function of this Class ///////////
+    ////////////////////////////////////////////////////
+  public:
+    // Cartesian
+    void AddDetector(G4ThreeVector POS);
+    // Spherical
+    void AddDetector(double R,double Theta,double Phi);  
+
+
+    G4LogicalVolume* BuildSquareDetector();
+    G4LogicalVolume* BuildCylindricalDetector();
+  
+  private:
+    G4LogicalVolume* m_SquareDetector;
+    G4LogicalVolume* m_CylindricalDetector;
+    
+    ////////////////////////////////////////////////////
+    //////  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_Plastic_BEDOScorer ;
+    ////////////////////////////////////////////////////
+    ///////////Event class to store Data////////////////
+    ////////////////////////////////////////////////////
+  private:
+    TPlastic_BEDOData* m_Event ;
+
+    ////////////////////////////////////////////////////
+    ///////////////Private intern Data//////////////////
+    ////////////////////////////////////////////////////
+  private: // Geometry
+    // Detector Coordinate 
+    vector<double>  m_R; 
+    vector<double>  m_Theta;
+    vector<double>  m_Phi; 
+    
+    //   Shape type
+    vector<string> m_Shape ;
+   
+    // Visualisation Attribute
+    G4VisAttributes* m_VisSquare;
+    G4VisAttributes* m_VisCylinder;
+
+  // Needed for dynamic loading of the library
+  public:
+    static NPS::VDetector* Construct();
+};
+#endif
-- 
GitLab