diff --git a/NPLib/TrackReconstruction/NPLinearRansac3D.cxx b/NPLib/TrackReconstruction/NPLinearRansac3D.cxx
index 8ef0839a43c82fd5b263a9b10b5351f813b596d1..6b2c17eaa6a38ceed4c138368a892f124bf0c1cb 100644
--- a/NPLib/TrackReconstruction/NPLinearRansac3D.cxx
+++ b/NPLib/TrackReconstruction/NPLinearRansac3D.cxx
@@ -17,8 +17,14 @@
  *****************************************************************************/
 
 #include "NPLinearRansac3D.h"
+#include<iostream>
 using namespace std;
 using namespace NPL;
+
+
+ClassImp(LinearCluster3D);
+
+ClassImp(LinearRansac3D);
 ////////////////////////////////////////////////////////////////////////////////
 void LinearCluster3D::LinearFit() {
 
@@ -36,6 +42,7 @@ void LinearCluster3D::LinearFit() {
   double meanZ = 0;
   double w;
 
+
   for (unsigned int i = 0; i < sizeI; i++) {
     TVector3 Pi((*m_X)[m_index[i]], (*m_Y)[m_index[i]], (*m_Z)[m_index[i]]);
     for (unsigned int j = i + 1; j < sizeI; j++) {
@@ -69,11 +76,200 @@ void LinearCluster3D::LinearFit() {
 
   m_P0 = TVector3(meanX, meanY, meanZ);
   m_Dir = (TVector3(meanDX, meanDY, meanDZ)).Unit();
+  m_isFitted = true;
   // Cluster dir is arbitrary. we choose to always have positive Z dir
   if (m_Dir.Z() < 0)
     m_Dir = -m_Dir;
 };
 
+void LinearCluster3D::FastLinearFit() {
+
+double xx=0, yy=0, zz=0, xx2=0, yy2=0, zz2=0, xy=0, xz=0, yz=0, qq=0;
+unsigned int sizeI = m_index.size();
+	for(unsigned int i = 0; i < sizeI; i++){
+		xx+=(*m_X)[m_index[i]];
+		yy+=(*m_Y)[m_index[i]];
+		zz+=(*m_Z)[m_index[i]];
+		xx2+=(*m_X)[m_index[i]]*(*m_X)[m_index[i]];
+		yy2+=(*m_Y)[m_index[i]]*(*m_Y)[m_index[i]];
+		zz2+=(*m_Z)[m_index[i]]*(*m_Z)[m_index[i]];
+		xy+=(*m_X)[m_index[i]]*(*m_Y)[m_index[i]];
+		xz+=(*m_X)[m_index[i]]*(*m_Z)[m_index[i]];
+		yz+=(*m_Y)[m_index[i]]*(*m_Z)[m_index[i]];
+		qq+=1;
+	}
+
+  double Xm = xx/qq, Ym = yy/qq, Zm = zz/qq;
+  double Sxx = -Xm*Xm+xx2/qq, Syy = -Ym*Ym+yy2/qq, Szz = -Zm*Zm+zz2/qq;
+  double Sxy = -Xm*Ym+xy/qq, Sxz = -Xm*Zm+xz/qq, Syz = -Ym*Zm+yz/qq;
+  double theta = 0.5*atan(2*Sxy/(Sxx-Syy));
+
+  double ct = cos(theta), st = sin(theta), ct2 = ct*ct, st2 = st*st, cst = cos(theta)*sin(theta);
+  double K11 = (Syy+Szz)*ct2+(Sxx+Szz)*st2-2*Sxy*cst;
+  double K22 = (Syy+Szz)*st2+(Sxx+Szz)*ct2+2*Sxy*cst;
+  //double K12 = -Sxy*(ct2-st2)+(Sxx-Syy)*cst; //=0 by construction
+  double K10 = Sxz*ct+Syz*st;
+  double K01 = -Sxz*st+Syz*ct;
+  double K00 = Sxx+Syy;
+
+  double C2 = -K00-K11-K22;
+  double C1 = K00*K11+K00*K22+K11*K22-K01*K01-K10*K10;
+  double C0 = K01*K01*K11+K10*K10*K22-K00*K11*K22;
+
+  double p = C1-C2*C2/3, q = 2*C2*C2*C2/27-C1*C2/3+C0;
+  double R = q*q/4+p*p*p/27;
+  double dm2 = 0;
+  if(R>0)
+  {
+    dm2 = -C2/3+pow(-q/2+sqrt(R), 1./3.)+pow(-q/2-sqrt(R), 1./3.);
+  }
+  else
+  {
+    double rho = sqrt(-p*p*p/27), phi = acos(-q/(2*rho));  double R = q*q/4+p*p*p/27;
+
+    double sqrt3rho = pow(rho, 1./3.);
+    double d1 = -C2/3+2*sqrt3rho*cos(phi/3);
+    double d2 = -C2/3+2*sqrt3rho*cos((phi+2*M_PI)/3);
+    double d3 = -C2/3+2*sqrt3rho*cos((phi+4*M_PI)/3);
+    dm2 = std::min(std::min(d1, d2), d3);
+  }
+  double a = -K10*ct/(K11-dm2)+K01*st/(K22-dm2);
+  double b = -K10*st/(K11-dm2)-K01*ct/(K22-dm2);
+
+  double denom = 1./(1+a*a+b*b);
+  double u = ((1+b*b)*Xm-a*b*Ym+a*Zm)*denom;
+  double v = (-a*b*Xm+(1+a*a)*Ym+b*Zm)*denom;
+  double w = (a*Xm+b*Ym+(a*a+b*b)*Zm)*denom;
+
+  m_P0 = TVector3(Xm, Ym, Zm);
+  m_Dir = (TVector3(Xm-u, Ym-v, Zm-w)).Unit();
+}
+
+void LinearCluster3D::FastLinearFitShort() {
+
+double xx=0, yy=0, zz=0, xx2=0, yy2=0, zz2=0, xy=0, xz=0, yz=0, qq=0;
+unsigned int sizeI = m_index_short.size();
+	for(unsigned int i = 0; i < sizeI; i++){
+		xx+=(*m_X)[m_index_short[i]];
+		yy+=(*m_Y)[m_index_short[i]];
+		zz+=(*m_Z)[m_index_short[i]];
+		xx2+=(*m_X)[m_index_short[i]]*(*m_X)[m_index_short[i]];
+		yy2+=(*m_Y)[m_index_short[i]]*(*m_Y)[m_index_short[i]];
+		zz2+=(*m_Z)[m_index_short[i]]*(*m_Z)[m_index_short[i]];
+		xy+=(*m_X)[m_index_short[i]]*(*m_Y)[m_index_short[i]];
+		xz+=(*m_X)[m_index_short[i]]*(*m_Z)[m_index_short[i]];
+		yz+=(*m_Y)[m_index_short[i]]*(*m_Z)[m_index_short[i]];
+		qq+=1;
+	}
+
+  double Xm = xx/qq, Ym = yy/qq, Zm = zz/qq;
+  double Sxx = -Xm*Xm+xx2/qq, Syy = -Ym*Ym+yy2/qq, Szz = -Zm*Zm+zz2/qq;
+  double Sxy = -Xm*Ym+xy/qq, Sxz = -Xm*Zm+xz/qq, Syz = -Ym*Zm+yz/qq;
+  double theta = 0.5*atan(2*Sxy/(Sxx-Syy));
+
+  double ct = cos(theta), st = sin(theta), ct2 = ct*ct, st2 = st*st, cst = cos(theta)*sin(theta);
+  double K11 = (Syy+Szz)*ct2+(Sxx+Szz)*st2-2*Sxy*cst;
+  double K22 = (Syy+Szz)*st2+(Sxx+Szz)*ct2+2*Sxy*cst;
+  //double K12 = -Sxy*(ct2-st2)+(Sxx-Syy)*cst; //=0 by construction
+  double K10 = Sxz*ct+Syz*st;
+  double K01 = -Sxz*st+Syz*ct;
+  double K00 = Sxx+Syy;
+
+  double C2 = -K00-K11-K22;
+  double C1 = K00*K11+K00*K22+K11*K22-K01*K01-K10*K10;
+  double C0 = K01*K01*K11+K10*K10*K22-K00*K11*K22;
+
+  double p = C1-C2*C2/3, q = 2*C2*C2*C2/27-C1*C2/3+C0;
+  double R = q*q/4+p*p*p/27;
+  double dm2 = 0;
+  if(R>0)
+  {
+    dm2 = -C2/3+pow(-q/2+sqrt(R), 1./3.)+pow(-q/2-sqrt(R), 1./3.);
+  }
+  else
+  {
+    double rho = sqrt(-p*p*p/27), phi = acos(-q/(2*rho));  double R = q*q/4+p*p*p/27;
+
+    double sqrt3rho = pow(rho, 1./3.);
+    double d1 = -C2/3+2*sqrt3rho*cos(phi/3);
+    double d2 = -C2/3+2*sqrt3rho*cos((phi+2*M_PI)/3);
+    double d3 = -C2/3+2*sqrt3rho*cos((phi+4*M_PI)/3);
+    dm2 = std::min(std::min(d1, d2), d3);
+  }
+  double a = -K10*ct/(K11-dm2)+K01*st/(K22-dm2);
+  double b = -K10*st/(K11-dm2)-K01*ct/(K22-dm2);
+
+  double denom = 1./(1+a*a+b*b);
+  double u = ((1+b*b)*Xm-a*b*Ym+a*Zm)*denom;
+  double v = (-a*b*Xm+(1+a*a)*Ym+b*Zm)*denom;
+  double w = (a*Xm+b*Ym+(a*a+b*b)*Zm)*denom;
+
+  m_P0 = TVector3(Xm, Ym, Zm);
+  m_Dir = (TVector3(Xm-u, Ym-v, Zm-w)).Unit();
+}
+
+void LinearCluster3D::CheckDirection(const TVector3 & vertex){
+    if(m_FurthestPoint == TVector3(0, 0, 0)){
+      double max_distance = 0;
+      for(int i = 0; i < m_index.size(); i++)
+      {
+        TVector3 aPoint((*m_X)[m_index[i]], (*m_Y)[m_index[i]], (*m_Z)[m_index[i]]);
+        double distance = (aPoint-vertex).Mag();
+        if(distance > max_distance){
+          max_distance = distance;
+          m_FurthestPoint = aPoint;
+        }
+      }
+    }
+    if((m_FurthestPoint-vertex).X()*m_Dir.X() < 0) this->Inverse();
+}
+
+void LinearCluster3D::CalculateTrackLength(const TVector3 & vertex, const double & percentRange){
+  TH1D* Hrange = new TH1D("Range", "range", 256, 0, 512);
+  TH1D* Hrangecumule = new TH1D("RangeCumulated", "rangecumule", 256, 0, 512);
+
+  double total_charge = 0;
+  double cumulated_charge = 0;
+  double max_distance = 0;
+
+
+  for(int i = 0; i < m_index.size(); i++)
+  {
+    TVector3 aPoint((*m_X)[m_index[i]], (*m_Y)[m_index[i]], (*m_Z)[m_index[i]]);
+    double distance = (aPoint-vertex).Mag();
+    total_charge+=(*m_Q)[m_index[i]];
+    Hrange->Fill(distance, (*m_Q)[m_index[i]]);
+    if(distance > max_distance){
+      max_distance = distance;
+      m_FurthestPoint = aPoint;
+    }
+    if(distance < m_ShortTrackMaxLength){
+      m_index_short.push_back(m_index[i]);
+    }
+  }
+  m_Charge = total_charge;
+  //Inverse the track if it is not going in the good direction
+  if((m_FurthestPoint-vertex).X()*m_Dir.X() < 0) this->Inverse();
+
+  for(int bin = 1; bin < Hrange->GetNbinsX(); bin++)
+  {
+    cumulated_charge+=Hrange->GetBinContent(bin);
+    Hrangecumule->SetBinContent(bin, cumulated_charge/total_charge);
+  }
+  Int_t nbin = 1;
+  while(Hrangecumule->GetBinContent(nbin) < percentRange && nbin < Hrangecumule->GetNbinsX()-1)
+  {
+    nbin++;
+  }
+  Double_t delta, deltabinap, deltabinav;
+  delta = Hrangecumule->GetBinContent(nbin)-Hrangecumule->GetBinContent(nbin-1);
+  deltabinap = Hrangecumule->GetBinContent(nbin)-percentRange;
+  deltabinav = percentRange-Hrangecumule->GetBinContent(nbin-1);
+  m_TrackLength = deltabinap*Hrangecumule->GetBinCenter(nbin-1)/delta+deltabinav*Hrangecumule->GetBinCenter(nbin)/delta;
+  delete Hrange;
+  delete Hrangecumule;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 vector<LinearCluster3D> LinearRansac3D::TreatEvent(vector<double>& X, vector<double>& Y, vector<double>& Z) {
   cluster_id.clear();
@@ -92,7 +288,7 @@ vector<LinearCluster3D> LinearRansac3D::TreatEvent(vector<double>& X, vector<dou
   m_iteration_d = 0;
   m_iteration = 0;
 
-  while (m_iteration++ < m_max_iteration && m_assigned.size() < sizeX) {
+  while (m_iteration++ < m_max_iteration/* && m_assigned.size() < sizeX*/) {
     LinearCluster3D cluster(&X, &Y, &Z);
     // take 2 distant point randomly that has not been match before
     d = 0;
@@ -123,7 +319,7 @@ vector<LinearCluster3D> LinearRansac3D::TreatEvent(vector<double>& X, vector<dou
     }
 
   } // while
-
+	
   // loop over the cluster starting with the biggest
   unsigned int current_cluster = 0;
   unsigned int index;
diff --git a/NPLib/TrackReconstruction/NPLinearRansac3D.h b/NPLib/TrackReconstruction/NPLinearRansac3D.h
index b824e6e21a93cb6d3f27a874165dc8b06217a402..cdbf0b08b9e1952256069dfc4ca0283ddcfd0cab 100644
--- a/NPLib/TrackReconstruction/NPLinearRansac3D.h
+++ b/NPLib/TrackReconstruction/NPLinearRansac3D.h
@@ -24,15 +24,25 @@
 //root
 #include "TVector3.h"
 #include "TRandom2.h"
+#include "TH1.h"
 // nptool
 #include "NPTrackingUtility.h"
 namespace NPL{
   /////////////////////////////////
   class LinearCluster3D{
     public:
-      LinearCluster3D(){};
+      LinearCluster3D(){
+        m_isFitted = false;
+        m_FurthestPoint = TVector3(0, 0, 0);
+      };
+
       LinearCluster3D(std::vector<double>* X, std::vector<double>* Y, std::vector<double>* Z){
-        m_X=X; m_Y=Y; m_Z=Z;
+        m_X=X; m_Y=Y; m_Z=Z; m_isFitted = false;
+        m_FurthestPoint = TVector3(0, 0, 0);
+      }
+      LinearCluster3D(std::vector<double>* X, std::vector<double>* Y, std::vector<double>* Z, std::vector<double>* Q){
+        m_X=X; m_Y=Y; m_Z=Z; m_Q=Q; m_isFitted = false;
+        m_FurthestPoint = TVector3(0, 0, 0);
       }
       ~LinearCluster3D(){};
 
@@ -40,22 +50,48 @@ namespace NPL{
       void AddIndex(const unsigned int& i) {m_index.push_back(i);};
       unsigned int size() const {return m_index.size();};
       unsigned int GetIndex (const unsigned int& i) const {return m_index[i];};
+      void SetShortTrackMaxLength(const double & l) {m_ShortTrackMaxLength = l;}
 
+      //Inverse the direction
+      void Inverse() {m_Dir = -m_Dir;}; //!
       // Fit the cluster
-      void LinearFit();
+      void LinearFit(); //!
+      void FastLinearFit(); //!
+      void FastLinearFitShort(); //!
+
+      //Calculate the track length from the interaction vertex, and for a given percent of charge deposited along the way
+      //It also inverses the track if needed, and regroups the points below a certain distance from the vertex to refit it without the deviation
+      void CalculateTrackLength(const TVector3 & vertex, const double & percentRange = 0.95); //!
+      void CheckDirection(const TVector3 & vertex);
 
     private:
       std::vector<double>* m_X;//!
       std::vector<double>* m_Y;//!
       std::vector<double>* m_Z;//!
+      std::vector<double>* m_Q;//!
+
       std::vector<unsigned int> m_index;//!
-      TVector3 m_P0;// a point on the line
-      TVector3 m_Dir;// direction of the line
+      std::vector<unsigned int> m_index_short;//!
+      TVector3 m_P0; // a point on the line
+      TVector3 m_Dir; // direction of the line
+
+      double m_TrackLength; //!
+      double m_Charge; //!
+      // check if the track has been fitted with the "LinearFit" function
+      bool m_isFitted; //!
+      //Furthest point compared to vertex
+      TVector3 m_FurthestPoint; //!
+      double m_ShortTrackMaxLength; //!
+
 
     public:
       std::vector<unsigned int> GetIndex() const {return m_index;};
       TVector3 GetP0()const {return m_P0;};
       TVector3 GetDir()const {return m_Dir;};
+      double GetTrackLength()const {return m_TrackLength;}
+      bool IsFitted() const {return m_isFitted;}
+      TVector3 GetFurthestPoint()const {return m_FurthestPoint;}
+      double GetCharge()const {return m_Charge;}
 
     public: //operator
       // reversed logic so the cluster are ordered from largest to smallest
@@ -69,6 +105,8 @@ namespace NPL{
       friend bool operator<(const LinearCluster3D& A, const LinearCluster3D& B){
         return (A.size()>B.size());
       } 
+      ClassDef(LinearCluster3D, 0);
+
   };
   /////////////////////////////////
   class LinearRansac3D{
@@ -109,6 +147,8 @@ namespace NPL{
 
     public:
       std::vector<LinearCluster3D> TreatEvent(std::vector<double>& X, std::vector<double>&Y, std::vector<double>&Z);
+
+    ClassDef(LinearRansac3D, 0);
   };
 
 
diff --git a/NPLib/TrackReconstruction/NPRansacACTAR.cxx b/NPLib/TrackReconstruction/NPRansacACTAR.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..d8a9d035f5be393b7d49c2a8413584c793c1b62d
--- /dev/null
+++ b/NPLib/TrackReconstruction/NPRansacACTAR.cxx
@@ -0,0 +1,184 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2016   this file is part of the NPTool Project         *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ *                                                                           *
+ * Original Author :  Damien THISSE contact address: damien.thisse@cea.fr    *
+ *                                                                           *
+ * Creation Date   : October 2024                                            *
+ * Last update     : October 2024                                            *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class deal with finding all the track event by event                *
+ *****************************************************************************/
+
+#include "NPRansacACTAR.h"
+#include "NPLinearRansac3D.h"
+
+using namespace NPL;
+using namespace std;
+
+/////////////////////////////////////////////////
+RansacACTAR::RansacACTAR()
+{
+    fRANSACMaxIteration = 1000;
+    fRANSACThreshold = 16;//100;
+    fRANSACPointThreshold = 0.05;//0.07;
+    fRANSACChargeThreshold = 0.05;//0.07;
+    fRANSACDistance = 7;//7;
+    fMAXBarycenterDistance = 10;
+    fAngleMax = 2;//degree
+    
+    fNumberOfPadsX = 128;
+    fNumberOfPadsY = 128;
+
+    Rand = new TRandom3();
+}
+
+vector<LinearCluster3D> RansacACTAR::SimpleRansac(vector<double> & vX, vector<double> & vY, vector<double> & vZ, vector<double> & vQ){
+    fTotalCharge = 0;
+    fOriginalCloudSize = vX.size();
+    vector<int> index;
+    vector<LinearCluster3D> all_clusters;
+
+    for(int QQ = 0; QQ < vQ.size(); QQ++){
+        fTotalCharge+= vQ.at(QQ);
+        index.push_back(QQ);
+    }
+    double RemainingCharge = fTotalCharge;
+    int loop_counter = 0;
+    // cout << "Total charge is " << fTotalCharge << " ---> Threshold to end RANSAC is thus " <<  fTotalCharge*fRANSACChargeThreshold << endl;
+    // cout << "Total voxels is " << index.size() << " ---> Threshold to end RANSAC is thus " <<  fOriginalCloudSize*fRANSACPointThreshold << endl;
+    do{
+        loop_counter++;
+        //cout << "Loop " << loop_counter << ": remaining charge is " << RemainingCharge << "; number of points remaining : " << index.size() << endl;
+        LinearCluster3D foundCluster(&vX, &vY, &vZ, &vQ);
+        int highest_inliers = 0;
+        vector<int> index_to_remove;
+
+        for(int i = 0; i < fRANSACMaxIteration; i++){
+            LinearCluster3D aCluster(&vX, &vY, &vZ, &vQ);
+            vector<int> pos_index;
+            UInt_t rand1 = Rand->Integer(index.size());
+            UInt_t rand2;
+            do{
+                rand2 = Rand->Integer(index.size());
+            } while(rand2 == rand1);
+
+            TVector3 pt1(vX[index[rand1]], vY[index[rand1]], vZ[index[rand1]]);
+            TVector3 pt2(vX[index[rand2]], vY[index[rand2]], vZ[index[rand2]]);
+            
+            for(int j = 0; j < index.size(); j++){
+                TVector3 pt(vX[index[j]], vY[index[j]], vZ[index[j]]);
+                if(MinimumDistancePointLine(pt1, pt2, pt) < fRANSACDistance){
+                    aCluster.AddIndex(index[j]);
+                    pos_index.push_back(j);
+
+                }
+            }
+            if(aCluster.size() > highest_inliers){
+                foundCluster = aCluster;
+                highest_inliers = aCluster.size();
+                index_to_remove = pos_index;
+            }
+        }
+
+        if(highest_inliers > fRANSACThreshold){
+           all_clusters.push_back(foundCluster);
+           for(int i = index_to_remove.size()-1; i >-1; i--){
+                RemainingCharge-= vQ.at(index[index_to_remove[i]]);
+                index.erase(index.begin()+index_to_remove.at(i));
+           }
+        //    RemainingCharge = 0;
+        //    for(int QQ = 0; QQ < index.size(); QQ++){
+        //         RemainingCharge+= vQ.at(index.at(QQ));
+        //     }
+        }
+        else break;
+
+    } while(RemainingCharge > fTotalCharge*fRANSACChargeThreshold && index.size() > fOriginalCloudSize*fRANSACPointThreshold);
+
+    return all_clusters;
+}
+
+void RansacACTAR::ReadParameterValue(string filename)
+{
+    bool ReadingStatus = false;
+    
+    ifstream RansacParamFile;
+    RansacParamFile.open(filename.c_str());
+    
+    if(!RansacParamFile.is_open()){
+        cout << "No Paramter File found for Ransac parameters" << endl;
+        cout << "Using the default parameter:" << endl;
+        cout << "RANSAC MaxIteration= " << fRANSACMaxIteration << endl;
+        cout << "RANSAC Threshold=" << fRANSACThreshold << endl;
+        cout << "RANSAC ChargeThreshold= " << fRANSACChargeThreshold << endl;
+        cout << "RANSAC Distance= " << fRANSACDistance << endl;
+        cout << "RANSAC PointThreshold= " << fRANSACPointThreshold << endl;
+        cout << "MAX Barycenter Distance= " << fMAXBarycenterDistance << endl;
+        cout << "Angle Max to merge tracks= " << fAngleMax << endl;
+    }
+    else{
+        string LineBuffer, whatToDo, DataBuffer;
+        while(!RansacParamFile.eof()){
+            getline(RansacParamFile,LineBuffer);
+            string name = "ConfigRansac";
+            if(LineBuffer.compare(0, name.length(), name) == 0){
+                cout << endl;
+                cout << "**** ConfigRansac found" << endl;
+                ReadingStatus = true;
+            }
+            while(ReadingStatus){
+                whatToDo="";
+                RansacParamFile >> whatToDo;
+                // Search for comment symbol (%)
+                if (whatToDo.compare(0, 1, "%") == 0) {
+                    RansacParamFile.ignore(numeric_limits<streamsize>::max(), '\n' );
+                }
+                else if (whatToDo.compare(0,19,"RANSACMaxIteration=") == 0) {
+                    RansacParamFile >> DataBuffer;
+                    fRANSACMaxIteration = atoi(DataBuffer.c_str());
+                    cout << "/// RANSAC MaxIteration= " << " " << fRANSACMaxIteration << " ///" << endl;
+                }
+                else if (whatToDo.compare(0,15,"RANSACDistance=") == 0) {
+                    RansacParamFile >> DataBuffer;
+                    fRANSACDistance = atoi(DataBuffer.c_str());
+                    cout << "/// RANSAC Distance= " << " " << fRANSACDistance << " ///" << endl;
+                }
+                else if (whatToDo.compare(0,22,"RANSACChargeThreshold=") == 0) {
+                    RansacParamFile >> DataBuffer;
+                    fRANSACChargeThreshold = atof(DataBuffer.c_str());
+                    cout << "/// RANSAC ChargeThreshold= " << " " << fRANSACChargeThreshold << " ///" << endl;
+                }
+                else if (whatToDo.compare(0,21,"RANSACPointThreshold=") == 0) {
+                    RansacParamFile >> DataBuffer;
+                    fRANSACPointThreshold = atof(DataBuffer.c_str());
+                    cout << "/// RANSAC PointThreshold= " << " " << fRANSACPointThreshold << " ///" << endl;
+                }
+                else if (whatToDo.compare(0,16,"RANSACThreshold=") == 0) {
+                    RansacParamFile >> DataBuffer;
+                    fRANSACThreshold = atoi(DataBuffer.c_str());
+                    cout << "/// RANSAC Threshold= " << " " << fRANSACThreshold << " ///" << endl;
+                }
+                else if (whatToDo.compare(0,22,"MAXBarycenterDistance=") == 0) {
+                    RansacParamFile >> DataBuffer;
+                    fMAXBarycenterDistance = atoi(DataBuffer.c_str());
+                    cout << "/// Max Barycenter Distance= " << " " << fMAXBarycenterDistance << " ///" << endl;
+                }
+                else if (whatToDo.compare(0,16,"AngleMaxToMerge=") == 0) {
+                    RansacParamFile >> DataBuffer;
+                    fAngleMax = atoi(DataBuffer.c_str());
+                    cout << "/// Angle Max to merge tracks= " << " " << fAngleMax << " ///" << endl;
+                }
+                else{
+                    ReadingStatus = false;
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/NPLib/TrackReconstruction/NPRansacACTAR.h b/NPLib/TrackReconstruction/NPRansacACTAR.h
new file mode 100644
index 0000000000000000000000000000000000000000..e7def0bccadce2b27884b245d7cac10d10c3b639
--- /dev/null
+++ b/NPLib/TrackReconstruction/NPRansacACTAR.h
@@ -0,0 +1,79 @@
+#ifndef __RANSACACTAR__
+#define __RANSACACTAR__
+/*****************************************************************************
+ * Copyright (C) 2009-2016   this file is part of the NPTool Project         *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ *                                                                           *
+ * Original Author :  Damien THISSE contact address: damien.thisse@cea.fr    *
+ *                                                                           *
+ * Creation Date   : October 2024                                            *
+ * Last update     : October 2024                                            *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  This class deal with finding all the track event by event                *
+ *****************************************************************************/
+
+//C++ Header
+#include <stdio.h>
+#include <vector>
+#include <sstream>
+#include <iostream>
+#include <fstream>
+#include <cmath>
+#include <stdlib.h>
+#include <limits>
+#include <string>
+#include <algorithm>
+
+//NPL
+#include "NPTrack.h"
+#include "NPLinearRansac3D.h"
+
+using namespace NPL;
+
+// ROOT Headers
+#include <TH2F.h>
+#include <TMath.h>
+#include <TVector3.h>
+#include <TRandom3.h>
+#include <TVector.h>
+
+using namespace std;
+
+namespace NPL{
+    
+    class RansacACTAR
+    {
+    public:
+        RansacACTAR();
+        ~RansacACTAR() {};
+        
+    public:
+        void ReadParameterValue(string filename);
+        vector<NPL::LinearCluster3D> SimpleRansac(vector<double> & vX, vector<double> & vY, vector<double> & vZ, vector<double> & vQ);
+        
+    private:
+        TRandom3* Rand;
+        
+    private:
+        float fRANSACThreshold;
+        float fRANSACPointThreshold;
+        float fRANSACChargeThreshold;
+        float fRANSACDistance;
+        float fRANSACMaxIteration;
+        float fMAXBarycenterDistance;
+        float fAngleMax;
+        int fNumberOfTracksMax;
+        int fOriginalCloudSize;
+        double fTotalCharge;
+        int fNumberOfPadsX;
+        int fNumberOfPadsY;
+        
+    };
+}
+#endif