diff --git a/NPLib/Detectors/Actar/TActarPhysics.cxx b/NPLib/Detectors/Actar/TActarPhysics.cxx
index 463ac59dfd7275ccb3bfaafef2a3ecff464e0a1f..ddf0d8a1e7767834a121946162b41b520f5332bf 100644
--- a/NPLib/Detectors/Actar/TActarPhysics.cxx
+++ b/NPLib/Detectors/Actar/TActarPhysics.cxx
@@ -70,6 +70,7 @@ fPadSizeY(2),
 fDriftVelocity(40),
 fPressure(100),
 fGas("iC4H10"),
+m_NumberOfPadSilicon(20),
 m_NumberOfDetectors(0) {
 }
 
@@ -99,33 +100,36 @@ void TActarPhysics::BuildSimplePhysicalEvent() {
 
 ///////////////////////////////////////////////////////////////////////////
 void TActarPhysics::BuildPhysicalEvent() {
-    
+
     PreTreat();
-    
+
     //unsigned int mysize = m_PreTreatedData->GetPadMult();
-    
+
     /*for (unsigned int e = 0; e < mysize; e++) {
         PadX.push_back(m_PreTreatedData->GetPadX(e));
         PadY.push_back(m_PreTreatedData->GetPadY(e));
         PadZ.push_back(m_PreTreatedData->GetPadZ(e));
         PadCharge.push_back(m_PreTreatedData->GetPadCharge(e));
     }*/
-    
     if(fRecoRansac && PadX.size()>fHitThreshold){
         m_Ransac->Init(PadX, PadY, PadZ, PadCharge);
         m_Track = m_Ransac->SimpleRansac();
     }
-    
-    else if(fRecoCluster && PadX.size()>fHitThreshold){
+
+    else if(fRecoCluster){
+      if(PadX.size()>fHitThreshold){
         m_Cluster->Init(PadX, PadY, PadZ, PadCharge);
         m_Cluster->FindTracks();
-        
+      }
+
+      if(BeamPadX.size()>fHitThreshold){
         m_Cluster->Init(BeamPadX, BeamPadY, BeamPadZ, BeamPadCharge);
         m_Cluster->FindTracks();
-        
-        m_Track = m_Cluster->GetTracks();
-        
-        m_Cluster->Clear();
+      }
+
+      m_Track = m_Cluster->GetTracks();
+
+      m_Cluster->Clear();
     }
 
     TrackMult = m_Track.size();
@@ -135,25 +139,25 @@ void TActarPhysics::BuildPhysicalEvent() {
 void TActarPhysics::PreTreat() {
     // This method typically applies thresholds and calibrations
     // Might test for disabled channels for more complex detector
-    
+
     // clear pre-treated object
     ClearPreTreatedData();
-    
+
     CleanPads();
-    
+
     // instantiate CalibrationManager
     static CalibrationManager* Cal = CalibrationManager::getInstance();
-    
-    
+
+
     unsigned int mysize = m_EventReduced->CoboAsad.size();
-    
+
     for (unsigned int it = 0; it < mysize ; ++it) {
         int co=m_EventReduced->CoboAsad[it].globalchannelid>>11;
         int as=(m_EventReduced->CoboAsad[it].globalchannelid - (co<<11))>>9;
         int ag=(m_EventReduced->CoboAsad[it].globalchannelid - (co<<11)-(as<<9))>>7;
         int ch=m_EventReduced->CoboAsad[it].globalchannelid - (co<<11)-(as<<9)-(ag<<7);
         int where=co*NumberOfASAD*NumberOfAGET*NumberOfChannel + as*NumberOfAGET*NumberOfChannel + ag*NumberOfChannel + ch;
-        
+
         if(co!=31){
             unsigned int vector_size = m_EventReduced->CoboAsad[it].peakheight.size();
             for(unsigned int hh=0; hh<vector_size; hh++){
@@ -173,7 +177,7 @@ void TActarPhysics::PreTreat() {
                                 PadY.push_back(TABLE[5][where]);
                                 PadZ.push_back(m_EventReduced->CoboAsad[it].peaktime[hh]);
                             }
-                            
+
                         }
                         else if(fRecoRansac){
                             PadCharge.push_back(m_EventReduced->CoboAsad[it].peakheight[hh]);
@@ -189,14 +193,25 @@ void TActarPhysics::PreTreat() {
         else if(co==31){
             unsigned int vector_size = m_EventReduced->CoboAsad[it].peakheight.size();
             for(unsigned int hit=0;hit<vector_size;hit++){
-                
-                Si_Number.push_back(m_EventReduced->CoboAsad[it].peaktime[hit]);
-                Si_E.push_back(m_EventReduced->CoboAsad[it].peakheight[hit]);
-                
-                int vxi_parameter = m_EventReduced->CoboAsad[it].peaktime[hit];
-                if(Si_map[vxi_parameter]<21 && Si_map[vxi_parameter]>0){
-                    m_PreTreatedData->SetSiliconEnergy(m_EventReduced->CoboAsad[it].peakheight[hit]);
-                    m_PreTreatedData->SetSiliconDetectorNumber(Si_map[vxi_parameter]);
+                if(fInputTreeName=="ACTAR_TTree"){
+                  int vxi_parameter = m_EventReduced->CoboAsad[it].peaktime[hit];
+
+                  if(Si_map[vxi_parameter]<21 && Si_map[vxi_parameter]>0){
+                    double RawEnergy = m_EventReduced->CoboAsad[it].peakheight[hit];
+
+                    static string name;
+                    name = "ActarSi/D" ;
+                    name+= NPL::itoa( Si_map[vxi_parameter] - 1) ;
+                    name+= "_E" ;
+                    double CalEnergy = CalibrationManager::getInstance()->ApplyCalibration( name, RawEnergy );
+
+                    Si_Number.push_back(Si_map[vxi_parameter]);
+                    Si_E.push_back(CalEnergy);
+                  }
+                }
+                else{
+                  Si_Number.push_back(m_EventReduced->CoboAsad[it].peaktime[hit]);
+                  Si_E.push_back(m_EventReduced->CoboAsad[it].peakheight[hit]);
                 }
             }
         }
@@ -210,7 +225,7 @@ bool TActarPhysics::IsBeamZone(int X, int Y)
     if( (X>=fXBeamMin && X<=fXBeamMax) && (Y>=fYBeamMin && Y<=fYBeamMax) ){
         isBeam=true;
     }
-    
+
     return isBeam;
 }
 
@@ -225,7 +240,7 @@ bool TActarPhysics::GoodHit(int iX, int iY)
             }
         }
     }
-    
+
     return bHit;
 }
 
@@ -241,8 +256,8 @@ void TActarPhysics::CleanPads()
         int ag=(m_EventReduced->CoboAsad[it].globalchannelid - (co<<11)-(as<<9))>>7;
         int ch=m_EventReduced->CoboAsad[it].globalchannelid - (co<<11)-(as<<9)-(ag<<7);
         int where=co*NumberOfASAD*NumberOfAGET*NumberOfChannel + as*NumberOfAGET*NumberOfChannel + ag*NumberOfChannel + ch;
-        
-        
+
+
         if(co!=31){
             unsigned int vector_size = m_EventReduced->CoboAsad[it].peakheight.size();
             for(unsigned int hh=0; hh < vector_size; hh++){
@@ -279,7 +294,7 @@ void TActarPhysics::ReadAnalysisConfig() {
         }
     }
     VXIConfigFile.close();
-    
+
     // Lookup table //
     bool ReadingLookupTable = false;
     string LT_FileName = "./configs/LT.dat";
@@ -297,23 +312,23 @@ void TActarPhysics::ReadAnalysisConfig() {
         ReadingLookupTable = true;
     }
     LTConfigFile.close();
-    
-    
+
+
     bool ReadingStatus = false;
-    
+
     // ACTAR config file //
     string FileName = "./configs/ConfigActar.dat";
-    
+
     // open analysis config file
     ifstream AnalysisConfigFile;
     AnalysisConfigFile.open(FileName.c_str());
-    
+
     if (!AnalysisConfigFile.is_open()) {
         cout << " No ConfigActar.dat found: Default parameter loaded for Analayis " << FileName << endl;
         return;
     }
     cout << "/// Loading user parameter for Analysis from ConfigActar.dat ///" << endl;
-    
+
     // Save it in a TAsciiFile
     TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig();
     asciiConfig->AppendLine("%%% ConfigActar.dat %%%");
@@ -324,54 +339,54 @@ void TActarPhysics::ReadAnalysisConfig() {
     while (!AnalysisConfigFile.eof()) {
         // Pick-up next line
         getline(AnalysisConfigFile, LineBuffer);
-        
+
         // search for "header"
         string name = "ConfigActar";
         if (LineBuffer.compare(0, name.length(), name) == 0){
             ReadingStatus = true;
             cout << "**** ConfigActar found" << endl;
         }
-        
+
         // 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.compare(0,11,"RecoRansac=") == 0) {
                 AnalysisConfigFile >> DataBuffer;
                 fRecoRansac = atoi(DataBuffer.c_str());
                 cout << "/// Reco using Ransac= " << " " << fRecoRansac << " ///" << endl;
             }
-            
+
             else if (whatToDo.compare(0,12,"RecoCluster=") == 0) {
                 AnalysisConfigFile >> DataBuffer;
                 fRecoCluster = atoi(DataBuffer.c_str());
                 cout << "/// Reco using Cluster= " << " " << fRecoCluster << " ///" << endl;
             }
-            
+
             else if (whatToDo.compare(0,9,"RecoVisu=") == 0) {
                 AnalysisConfigFile >> DataBuffer;
                 fRecoVisu = atoi(DataBuffer.c_str());
                 cout << "/// Visualisation= " << " " << fRecoVisu << " ///" << endl;
             }
-            
+
             else if (whatToDo.compare(0,14,"HIT_THRESHOLD=") == 0) {
                 AnalysisConfigFile >> DataBuffer;
                 fHitThreshold = atoi(DataBuffer.c_str());
                 cout << "/// Hit Threshold= " << " " << fHitThreshold << " ///" << endl;
             }
-            
+
             else if (whatToDo.compare(0,12,"Q_THRESHOLD=") == 0) {
                 AnalysisConfigFile >> DataBuffer;
                 fQ_Threshold = atof(DataBuffer.c_str());
                 cout << "/// Q Threshold= " << " " << fQ_Threshold << " ///" << endl;
             }
-            
+
             else if (whatToDo.compare(0,12,"T_THRESHOLD=") == 0) {
                 AnalysisConfigFile >> DataBuffer;
                 fT_Threshold = atof(DataBuffer.c_str());
@@ -383,79 +398,86 @@ void TActarPhysics::ReadAnalysisConfig() {
                 //check_padsX=true;
                 cout << "/// Number Of Pads X= " << fNumberOfPadsX << " ///" << endl;
             }
-            
+
             else if(whatToDo.compare(0,14,"NumberOfPadsY=")==0){
                 AnalysisConfigFile >> DataBuffer;
                 fNumberOfPadsY = atoi(DataBuffer.c_str());
                 //check_padsY=true;
                 cout << "/// Number Of Pads Y= " << fNumberOfPadsY << " ///" << endl;
             }
-            
+
             else if(whatToDo.compare(0,9,"PadSizeX=")==0){
                 AnalysisConfigFile >> DataBuffer;
                 fPadSizeX = atof(DataBuffer.c_str());
                 //check_sizeX=true;
                 cout << "/// Pad Size X= " << fPadSizeX << " ///" << endl;
             }
-            
+
             else if(whatToDo.compare(0,9,"PadSizeY=")==0){
                 AnalysisConfigFile >> DataBuffer;
                 fPadSizeY = atof(DataBuffer.c_str());
                 //check_sizeY=true;
                 cout << "/// Pad Size Y= " << fPadSizeY << " ///" << endl;
             }
-            
+
             else if(whatToDo.compare(0,9,"XBeamMin=")==0){
                 AnalysisConfigFile >> DataBuffer;
                 fXBeamMin = atof(DataBuffer.c_str());
                 cout << "/// X Beam Min= " << fXBeamMin << " ///" << endl;
             }
-            
+
             else if(whatToDo.compare(0,9,"XBeamMax=")==0){
                 AnalysisConfigFile >> DataBuffer;
                 fXBeamMax = atof(DataBuffer.c_str());
                 cout << "/// X Beam Max= " << fXBeamMax << " ///" << endl;
             }
-            
+
             else if(whatToDo.compare(0,9,"YBeamMin=")==0){
                 AnalysisConfigFile >> DataBuffer;
                 fYBeamMin = atof(DataBuffer.c_str());
                 cout << "/// Y Beam Min= " << fYBeamMin << " ///" << endl;
             }
-            
+
             else if(whatToDo.compare(0,9,"YBeamMax=")==0){
                 AnalysisConfigFile >> DataBuffer;
                 fYBeamMax = atof(DataBuffer.c_str());
                 cout << "/// Y Beam Max= " << fYBeamMax << " ///" << endl;
             }
-            
+
+            else if(whatToDo.compare(0,19,"NumberOfPadSilicon=")==0){
+                AnalysisConfigFile >> DataBuffer;
+                m_NumberOfPadSilicon = atof(DataBuffer.c_str());
+                //check_pressure=true;
+                cout << "/// Number of Silicons= " << m_NumberOfPadSilicon << " ///" << endl;
+            }
+
             else if(whatToDo.compare(0,9,"Pressure=")==0){
                 AnalysisConfigFile >> DataBuffer;
                 fPressure = atof(DataBuffer.c_str());
                 //check_pressure=true;
                 cout << "/// Pressure= " << fPressure << " ///" << endl;
             }
-            
+
             else if(whatToDo.compare(0,14,"DriftVelocity=")==0){
                 AnalysisConfigFile >> DataBuffer;
                 fDriftVelocity = atof(DataBuffer.c_str());
                 //check_driftvelocity=true;
                 cout << "/// Drift Velocity= " << fDriftVelocity << " ///" << endl;
             }
-            
+
             else if(whatToDo.compare(0,4,"Gas=")==0){
                 AnalysisConfigFile >> DataBuffer;
                 fGas = DataBuffer.c_str();
                 //check_gas=true;
                 cout << "/// Gas Type= " << fGas << " ///" << endl;
             }
-            
+
             else {
                 ReadingStatus = false;
             }
         }
     }
-    
+
     if(fRecoRansac){
         m_Ransac = new NPL::Ransac(fNumberOfPadsX,fNumberOfPadsY,fRecoVisu);
     }
@@ -484,7 +506,7 @@ void TActarPhysics::Clear() {
     BeamPadY.clear();
     BeamPadZ.clear();
     BeamPadCharge.clear();
-    
+
     PadX.clear();
     PadY.clear();
     PadZ.clear();
@@ -492,7 +514,7 @@ void TActarPhysics::Clear() {
     m_Track.clear();
     Si_Number.clear();
     Si_E.clear();
-    
+
     for(int i=0; i<fNumberOfPadsX; i++){
         for(int j=0; j<fNumberOfPadsY; j++){
             Hit[i][j] = 0;
@@ -507,15 +529,15 @@ void TActarPhysics::ReadConfiguration(NPL::InputParser parser) {
     vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Actar");
     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 << "////  Actar " << i+1 <<  endl;
-            
+
             TVector3 Pos = blocks[i]->GetTVector3("POS","mm");
             string Shape = blocks[i]->GetString("Shape");
             AddDetector(Pos,Shape);
@@ -604,6 +626,10 @@ void TActarPhysics::AddParameterToCalibrationManager() {
         Cal->AddParameter("Actar", "D"+ NPL::itoa(i+1)+"_CHARGE","Actar_D"+ NPL::itoa(i+1)+"_CHARGE");
         Cal->AddParameter("Actar", "D"+ NPL::itoa(i+1)+"_TIME","Actar_D"+ NPL::itoa(i+1)+"_TIME");
     }
+
+    for(int i=0; i<m_NumberOfPadSilicon; i++){
+      Cal->AddParameter("ActarSi","D"+NPL::itoa(i)+"_E","ActarSi_D"+NPL::itoa(i)+"_E");
+    }
 }
 
 
@@ -621,6 +647,8 @@ void TActarPhysics::InitializeRootInputRaw() {
     inputChain->SetBranchStatus("data",  true );
     inputChain->SetBranchStatus("ACTAR_TTree",  true );
     inputChain->SetBranchAddress("data", &m_EventReduced );
+
+    fInputTreeName = inputChain->GetTree()->GetName();
 }
 
 
@@ -661,6 +689,6 @@ extern "C"{
             NPL::DetectorFactory::getInstance()->AddDetector("Actar",TActarPhysics::Construct);
         }
     };
-    
+
     proxy_Actar p_Actar;
 }
diff --git a/NPLib/Detectors/Actar/TActarPhysics.h b/NPLib/Detectors/Actar/TActarPhysics.h
index a80f629d5f91973d61d8d54a7e6b6e236bc6fbc3..505fbd367072f302b70fb3829fc2b077f910041a 100644
--- a/NPLib/Detectors/Actar/TActarPhysics.h
+++ b/NPLib/Detectors/Actar/TActarPhysics.h
@@ -58,15 +58,15 @@ class TActarPhysics : public TObject, public NPL::VDetector {
 public:
     TActarPhysics();
     ~TActarPhysics() {};
-    
-    
+
+
     //////////////////////////////////////////////////////////////
     // 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
@@ -82,94 +82,94 @@ public:
     vector<double> Si_E;
     vector<int> Si_Number;
     int TrackMult;
-    
+
     /// 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);
-    
+
 public:
     int GetTrackMult() {return m_Track.size();}
     vector<NPL::Track> GetTracks() {return m_Track;}
-    
-    
+
+
     //////////////////////////////////////////////////////////////
     // 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 TActarSpectra class
     // instantiate the TActarSpectra 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 Actar 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();
-    
+
     void CleanPads();
-    
+
     bool GoodHit(int iX, int iY);
-    
+
     bool IsBeamZone(int X, int Y);
-    
+
     // give and external TActarData object to TActarPhysics.
     // needed for online analysis for example
     void SetRawDataPointer(TActarData* rawDataPointer) {m_EventData = rawDataPointer;}
-        
+
     // objects are not written in the TTree
 private:
     TActarData*         m_EventData;        //!
@@ -179,12 +179,12 @@ private:
     NPL::Ransac*        m_Ransac;           //!
     NPL::Cluster*       m_Cluster;          //!
     vector<NPL::Track>  m_Track;            //!
-    
+
     // getters for raw and pre-treated data object
 public:
     TActarData* GetRawData()        const {return m_EventData;}
     TActarData* GetPreTreatedData() const {return m_PreTreatedData;}
-    
+
     double GetDriftVelocity() {return fDriftVelocity;}
     double GetPadSizeX() {return fPadSizeX;}
     double GetPadSizeY() {return fPadSizeY;}
@@ -192,7 +192,7 @@ public:
     int GetNumberOfPadsY() {return fNumberOfPadsY;}
     double GetPRessure() {return fPressure;}
     string GetGasName() {return fGas;}
-    
+
     // parameters used in the analysis
 private:
     // thresholds
@@ -214,19 +214,21 @@ private:
     bool fRecoCluster;      //!
     bool fRecoVisu;         //!
     map<int, int> Si_map;   //!
-    
+    string fInputTreeName;  //!
+
     int TABLE[6][NumberOfCobo*NumberOfASAD*NumberOfAGET*NumberOfChannel]; //!
     int Hit[128][128];  //!
 
-    
+
     // number of detectors
 private:
     int m_NumberOfDetectors;  //!
-    
+    int m_NumberOfPadSilicon; //!
+
     // spectra class
 private:
     TActarSpectra* m_Spectra; //!
-    
+
     //spme getters and setters
 public:
     void SetRansacParameter(string filename);
@@ -235,17 +237,17 @@ public:
     bool GetRansacStatus() {return fRecoRansac;}
     NPL::Cluster* GetClusterObject() {return m_Cluster;}
     bool GetClusterStatus() {return fRecoCluster;}
-    
+
 
     // spectra getter
 public:
     map<string, TH1*>   GetSpectra();
     vector<TCanvas*>    GetCanvas();
-    
+
     // Static constructor to be passed to the Detector Factory
 public:
     static NPL::VDetector* Construct();
-    
+
     ClassDef(TActarPhysics,1)  // ActarPhysics structure
 };
 #endif
diff --git a/NPLib/TrackReconstruction/NPCluster.cxx b/NPLib/TrackReconstruction/NPCluster.cxx
index 3739e30332667dc4efa8fbddd7ba38301cf0de1a..77421d2d4210a99b1bfbdda2ceb4fb7aae532fef 100644
--- a/NPLib/TrackReconstruction/NPCluster.cxx
+++ b/NPLib/TrackReconstruction/NPCluster.cxx
@@ -34,7 +34,7 @@ Cluster::Cluster()
     fClusterThreshold = 15;
 
     fVisu= 0;
-    
+
     LocBigVoxels = new int[BigVoxelSize];
 }
 
@@ -47,11 +47,11 @@ Cluster::Cluster(int NumberOfPadsX, int NumberOfPadsY, bool Visu)
     fNumberOfTracksMax = 20;
     fClusterDistance = 5;
     fClusterThreshold = 15;
-    
+
     fVisu = 0;
-    
+
     LocBigVoxels = new int[BigVoxelSize];
-    
+
     if(fVisu==1){
         m_ServerSocket = new TServerSocket(9092,true,100);
         //pl		= new TGraph2D();
@@ -63,17 +63,17 @@ Cluster::Cluster(int NumberOfPadsX, int NumberOfPadsY, bool Visu)
         cout << endl;
         cout << "/// ServerSocket valid ///" << endl;
         m_ServerSocket->SetCompressionSettings(1);
-        
+
         // Add server socket to monitor so we are notified when a client needs to be
         // accepted
         m_Monitor  = new TMonitor();
         m_Monitor->Add(m_ServerSocket,TMonitor::kRead|TMonitor::kWrite);
         // Create a list to contain all client connections
         m_Sockets = new TList;
-        
+
         // Create a list to contain all client connections
         m_Histo = new TList;
-        
+
     }
 }
 
@@ -87,10 +87,10 @@ Cluster::~Cluster()
 void Cluster::ReadParameterValue(string filename)
 {
     bool ReadingStatus = false;
-    
+
     ifstream ClusterParamFile;
     ClusterParamFile.open(filename.c_str());
-    
+
     if(!ClusterParamFile.is_open()){
         cout << "/// No Paramter File found for Cluster parameters ///" << endl;
         cout << "/// Using the default parameter:" << endl;
@@ -113,7 +113,7 @@ void Cluster::ReadParameterValue(string filename)
                 if (whatToDo.compare(0, 1, "%") == 0) {
                     ClusterParamFile.ignore(numeric_limits<streamsize>::max(), '\n' );
                 }
-                
+
                 else if (whatToDo.compare(0,18,"NumberOfTracksMax=") == 0) {
                     ClusterParamFile >> DataBuffer;
                     fNumberOfTracksMax = atoi(DataBuffer.c_str());
@@ -141,15 +141,17 @@ void Cluster::ReadParameterValue(string filename)
 void Cluster::FindTracks()
 {
     for(unsigned int i=0; i<fOriginalCloudSize; i++){
+      if(vX[i]>=0 && vX[i]<fNumberOfPadsX && vY[i]>=0 && vY[i]<fNumberOfPadsY){
         FillBigVoxels(vX[i],vY[i],(int)vZ[i],(int)vQ[i]);
+      }
     }
-    
+
     RegroupZone();
-    
+
     FitZone();
-    
+
     RegroupTrack();
-    
+
     FitTrack();
 }
 
@@ -163,76 +165,86 @@ void Cluster::FillBigVoxels(int x, int y, int t, int q)
 {
     BigVoxels[int(x/4 + y/4*fNumberOfPadsX/4 + t/8*fNumberOfPadsX/4*fNumberOfPadsY/4)].push_back(q);
     IDBigVoxels[int(x/4 + y/4*fNumberOfPadsX/4 + t/8*fNumberOfPadsX/4*fNumberOfPadsY/4)].push_back(x + y*fNumberOfPadsX + t*fNumberOfPadsX*fNumberOfPadsY);
-    
+
     for(int tB=TMath::Max(t/8-1.,0.);tB<=TMath::Min(t/8+1.,510/8.);tB++){
         for(int yB=TMath::Max(y/4-1.,0.);yB<=TMath::Min(y/4+1.,(fNumberOfPadsY-1)/4.);yB++){
             for(int xB=TMath::Max(x/4-1.,0.);xB<=TMath::Min(x/4+1.,(fNumberOfPadsX-1)/4.);xB++){
                 if(BigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4].size()>0 && (xB!=x/4||yB!=y/4||tB!=t/8) && LocBigVoxels[x/4+y/4*fNumberOfPadsX/4+t/8*fNumberOfPadsX/4*fNumberOfPadsY/4]==-1 && LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]==-1){
                     //(yB+y!=fNumberOfPadsY/4-1) corresponds to the differentiation between each side of the pad plane
                     // Case where neither the current box nor the neighbour studied are associated to any track zone yet
+                    //cout << 1 << endl;
                     it++;
-                    
-                    
+
                     NPL::Track BigTrack;
                     BigTrack.SetPointX(x/4);
                     BigTrack.SetPointY(y/4);
                     BigTrack.SetPointZ(t/8);
-                    
+
                     BigTrack.SetPointX(xB);
                     BigTrack.SetPointY(yB);
                     BigTrack.SetPointZ(tB);
-                    
+
                     LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]=it;
                     LocBigVoxels[x/4+y/4*fNumberOfPadsX/4+t/8*fNumberOfPadsX/4*fNumberOfPadsY/4]=it;
                     TrackZone.push_back(BigTrack);
                     BigTrack.Clear();
+
+
                 }
                 else if(BigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4].size()>0 && (xB!=x/4||yB!=y/4||tB!=t/8) && LocBigVoxels[x/4+y/4*fNumberOfPadsX/4+t/8*fNumberOfPadsX/4*fNumberOfPadsY/4]==-1 && LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]>-1){
                     // Case where the neighbour is already associated with a track zone but not the current box
+                    //cout << 2 << endl;
                     LocBigVoxels[x/4+y/4*fNumberOfPadsX/4+t/8*fNumberOfPadsX/4*fNumberOfPadsY/4]=LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4];
 
                     TrackZone.at(LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]).SetPointX(x/4);
                     TrackZone.at(LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]).SetPointY(y/4);
                     TrackZone.at(LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]).SetPointZ(t/8);
+
+
                 }
                 else if(BigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4].size()>0 && (xB!=x/4||yB!=y/4||tB!=t/8) && LocBigVoxels[x/4+y/4*fNumberOfPadsX/4+t/8*fNumberOfPadsX/4*fNumberOfPadsY/4]>-1 && LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]==-1){
                     // Case where the current box is already associated with a track zone but not the neighbour
+                    //cout << 3 << endl;
                     LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]=LocBigVoxels[x/4+y/4*fNumberOfPadsX/4+t/8*fNumberOfPadsX/4*fNumberOfPadsY/4];
 
                     TrackZone.at(LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]).SetPointX(xB);
                     TrackZone.at(LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]).SetPointY(yB);
                     TrackZone.at(LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]).SetPointZ(tB);
+
+
                 }
                 else if(LocBigVoxels[x/4+y/4*fNumberOfPadsX/4+t/8*fNumberOfPadsX/4*fNumberOfPadsY/4]!=LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4] && (xB!=x/4||yB!=y/4||tB!=t/8) && LocBigVoxels[x/4+y/4*fNumberOfPadsX/4+t/8*fNumberOfPadsX/4*fNumberOfPadsY/4]>-1 && LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]>-1){
                     // Case where both boxes are associated to a track zone, we keep the smallest possible id.
-                    
+                    //cout << 4 << endl;
                     unsigned int maxid=TMath::Max(LocBigVoxels[x/4+y/4*fNumberOfPadsX/4+t/8*fNumberOfPadsX/4*fNumberOfPadsY/4],LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]);
-                    
+
                     unsigned int minid=TMath::Min(LocBigVoxels[x/4+y/4*fNumberOfPadsX/4+t/8*fNumberOfPadsX/4*fNumberOfPadsY/4],LocBigVoxels[xB+yB*fNumberOfPadsX/4+tB*fNumberOfPadsX/4*fNumberOfPadsY/4]);
-                    
+
                     unsigned int mysize=TrackZone.at(maxid).GetXPoints().size();
-                    
+
                     int element = TrackZone.at(maxid).GetXPoints().at(0) + fNumberOfPadsX/4*TrackZone.at(maxid).GetYPoints().at(0) + fNumberOfPadsX/4*fNumberOfPadsY/4*TrackZone.at(maxid).GetZPoints().at(0);
                     int Loc=LocBigVoxels[element];
-                    
+
                     for(unsigned int i=0;i<mysize;i++){
                         int element_max = TrackZone.at(maxid).GetXPoints().at(mysize-i-1) + fNumberOfPadsX/4*TrackZone.at(maxid).GetYPoints().at(mysize-i-1) + fNumberOfPadsX/4*fNumberOfPadsY/4*TrackZone.at(maxid).GetZPoints().at(mysize-i-1);
-                        
+
                         int element_min = TrackZone.at(minid).GetXPoints().at(0) + fNumberOfPadsX/4*TrackZone.at(minid).GetYPoints().at(0) + fNumberOfPadsX/4*fNumberOfPadsY/4*TrackZone.at(minid).GetZPoints().at(0);
-                        
+
                         LocBigVoxels[element_max]=LocBigVoxels[element_min];
-                        
-                        TrackZone.at(minid).GetXPoints().push_back(TrackZone.at(maxid).GetXPoints().at(mysize-i-1));
-                        TrackZone.at(minid).GetYPoints().push_back(TrackZone.at(maxid).GetYPoints().at(mysize-i-1));
-                        TrackZone.at(minid).GetZPoints().push_back(TrackZone.at(maxid).GetZPoints().at(mysize-i-1));
-                        
+
+                        TrackZone.at(minid).SetPointX(TrackZone.at(maxid).GetXPoints().at(mysize-i-1));
+                        TrackZone.at(minid).SetPointY(TrackZone.at(maxid).GetYPoints().at(mysize-i-1));
+                        TrackZone.at(minid).SetPointZ(TrackZone.at(maxid).GetZPoints().at(mysize-i-1));
+
                         TrackZone.at(maxid).GetXPoints().pop_back();
                         TrackZone.at(maxid).GetYPoints().pop_back();
                         TrackZone.at(maxid).GetZPoints().pop_back();
+
                     }
-                    
+
                     for(unsigned int i=Loc+1;i<TrackZone.size();i++){
                         for(unsigned int j=0;j<TrackZone.at(i).GetXPoints().size();j++){
+
                             element = TrackZone.at(i).GetXPoints().at(j) + fNumberOfPadsX/4*TrackZone.at(i).GetYPoints().at(j) + fNumberOfPadsX/4*fNumberOfPadsY/4*TrackZone.at(i).GetZPoints().at(j);
                             LocBigVoxels[element]--;
                         }
@@ -267,7 +279,7 @@ void Cluster::RegroupZone()
                         x2 = TrackZone.at(j).GetPointX(k2);
                         y2 = TrackZone.at(j).GetPointY(k2);
                         z2 = TrackZone.at(j).GetPointZ(k2);
-                        
+
                         //if(fabs(x1-x2)+fabs(y1-y2)+fabs(z1-z2)==1 && y1+y2!=fNumberOfPadsY/4-1) it++;
                         if(fabs(x1-x2)+fabs(y1-y2)+fabs(z1-z2)==1) it++;
                     }
@@ -313,14 +325,14 @@ void Cluster::FitZone()
         NPL::Track myTrack;
         for(unsigned int j=0;j<TrackZone.at(i).GetXPoints().size();j++){
             int element = TrackZone.at(i).GetPointX(j) + fNumberOfPadsX/4*TrackZone.at(i).GetPointY(j) + fNumberOfPadsX/4*fNumberOfPadsY/4*TrackZone.at(i).GetPointZ(j);
-            
+
             unsigned int mysize = IDBigVoxels[element].size();
-            
+
             for(unsigned int k=0;k<mysize;k++){
                 int x, y, z, q;
                 q = BigVoxels[element].at(k);
                 ExtractCoordinate(IDBigVoxels[element].at(k), x, y, z);
-                
+
                 myTrack.SetPointX(x);
                 myTrack.SetPointY(y);
                 myTrack.SetPointZ(z);
@@ -329,7 +341,7 @@ void Cluster::FitZone()
         }
         if(myTrack.GetXPoints().size()>0){
             Fit3D(myTrack);
-            
+
             TrackZone[i].SetXm(myTrack.GetXm());
             TrackZone[i].SetYm(myTrack.GetYm());
             TrackZone[i].SetZm(myTrack.GetZm());
@@ -348,14 +360,14 @@ void Cluster::FitZone()
 void Cluster::RegroupTrack()
 {
     ReorderTracks(TrackZone);
-    
+
     unsigned int TrackZoneSize = TrackZone.size();
     int ite=0;
-    
+
     for(unsigned int id=0; id<TrackZoneSize; id++){
         if(TrackZone[id].GetXPoints().size()>0){
             NPL::Track newTrack;
-            
+
             int TrackZoneNumberOfPoints=0;
             int xT, xTZ;
             int yT, yTZ;
@@ -367,7 +379,7 @@ void Cluster::RegroupTrack()
                     int element2 =  TrackZone.at(i).GetPointX(j) + fNumberOfPadsX/4*TrackZone.at(i).GetPointY(j) + fNumberOfPadsX/4*fNumberOfPadsY/4*TrackZone.at(i).GetPointZ(j);
                     ExtractCoordinate(IDBigVoxels[element2].at(0),xTZ,yTZ,zTZ);
 
-                    
+
                     //We verify that we are on the same side.
                     if((yTZ-fNumberOfPadsY/2.)*(yT-fNumberOfPadsY/2.)>=0){
                         if(i==id) TrackZoneNumberOfPoints+= IDBigVoxels[element2].size();
@@ -376,12 +388,12 @@ void Cluster::RegroupTrack()
                                 ExtractCoordinate(IDBigVoxels[element2].at(k),xTZ,yTZ,zTZ);
                                 if(yTZ-fNumberOfPadsY/2.-1) yTZ=fNumberOfPadsY/2.;
                                 if( (i==id && BigVoxels[element2].at(k)>4050) || (((i!=id && (xTZ>=100 || fabs(yTZ-fNumberOfPadsY/2)>=6)) || i==id) && (yTZ-fNumberOfPadsY/2.)*(yT-fNumberOfPadsY/2.+0.1)>=0 && IDBigVoxels[element2].at(k)>0 && Distance3D(TrackZone.at(id),IDBigVoxels[element2].at(k))<fClusterDistance) ){
-                                    
+
                                     ite++;
-                                
+
                                     int x_track, y_track, z_track;
                                     int q_track = BigVoxels[element2].at(k);
-                                    
+
                                     ExtractCoordinate(IDBigVoxels[element2].at(k),x_track,y_track,z_track);
                                     newTrack.SetPointX(x_track);
                                     newTrack.SetPointY(y_track);
@@ -397,7 +409,7 @@ void Cluster::RegroupTrack()
             if((float)ite>=TrackZoneNumberOfPoints*0.9){
                 vTrack.push_back(newTrack);
             }
-            
+
             newTrack.Clear();
         }
     }
@@ -413,7 +425,7 @@ void Cluster::FitTrack()
         }
         else to_erase.push_back(i);
     }
-    
+
     for(int i=to_erase.size()-1; i>=0; i--) vTrack.erase(vTrack.begin()+to_erase[i]);
 }
 
@@ -424,17 +436,17 @@ double Cluster::Distance3D(NPL::Track aTrack, int ID)
     double xf, yf, zf;
     double distance;
     ExtractCoordinate(ID,x,y,z);
-    
+
     TVector3 V1;
     TVector3 V2;
-    
+
     V1.SetXYZ(aTrack.GetXm()-aTrack.GetXh(), aTrack.GetYm()-aTrack.GetYh(), aTrack.GetZm()-aTrack.GetZh());
     V2.SetXYZ(aTrack.GetXm()-x, aTrack.GetYm()-y, aTrack.GetZm()-z);
 
     TVector3 V2CV1 = V2.Cross(V1);
-    
+
     distance = V2CV1.Mag()/V1.Mag();
-    
+
     return distance;
 }
 
@@ -478,12 +490,12 @@ void Cluster::RemoveTrack(vector<NPL::Track> &Ephem, int id)
 void Cluster::Init(vector<int> v1, vector<int> v2, vector<double> v3, vector<double> v4)
 {
     Reset();
-    
+
     vX = v1;
     vY = v2;
     vZ = v3;
     vQ = v4;
-    
+
     fOriginalCloudSize = vX.size();
     double TotalCharge=0;
     for(unsigned int i=0; i< vQ.size(); i++){
@@ -502,7 +514,7 @@ void Cluster::Reset()
     vZ.clear();
     vQ.clear();
     TrackZone.clear();
-    
+
     for(int i=0; i<BigVoxelSize; i++){
         BigVoxels[i].clear();
         IDBigVoxels[i].clear();
@@ -521,16 +533,16 @@ void Cluster::Clear()
 double Cluster::Fit3D(NPL::Track &aTrack)
 {
     // adapted from: http://fr.scribd.com/doc/31477970/Regressions-et-trajectoires-3D
-    
+
     vector<int> X;
     vector<int> Y;
     vector<int> Z;
-    
+
     X = aTrack.GetXPoints();
     Y = aTrack.GetYPoints();
     Z = aTrack.GetZPoints();
-    
-    
+
+
     int R, C;
     double Q;
     double Xm,Ym,Zm;
@@ -542,10 +554,10 @@ double Cluster::Fit3D(NPL::Track &aTrack)
     double c0,c1,c2;
     double p,q,r,dm2;
     double rho,phi;
-    
+
     Q=Xm=Ym=Zm=0.;
     Sxx=Syy=Szz=Sxy=Sxz=Syz=0.;
-    
+
     for (unsigned int i=0; i<X.size(); i++)
     {
         Q++;
@@ -559,7 +571,7 @@ double Cluster::Fit3D(NPL::Track &aTrack)
         Sxz+=X[i]*Z[i];
         Syz+=Y[i]*Z[i];
     }
-    
+
     Xm/=Q;
     Ym/=Q;
     Zm/=Q;
@@ -575,26 +587,26 @@ double Cluster::Fit3D(NPL::Track &aTrack)
     Sxy-=(Xm*Ym);
     Sxz-=(Xm*Zm);
     Syz-=(Ym*Zm);
-    
+
     theta=0.5*atan((2.*Sxy)/(Sxx-Syy));
-    
+
     K11=(Syy+Szz)*pow(cos(theta),2)+(Sxx+Szz)*pow(sin(theta),2)-2.*Sxy*cos(theta)*sin(theta);
     K22=(Syy+Szz)*pow(sin(theta),2)+(Sxx+Szz)*pow(cos(theta),2)+2.*Sxy*cos(theta)*sin(theta);
     K12=-Sxy*(pow(cos(theta),2)-pow(sin(theta),2))+(Sxx-Syy)*cos(theta)*sin(theta);
     K10=Sxz*cos(theta)+Syz*sin(theta);
     K01=-Sxz*sin(theta)+Syz*cos(theta);
     K00=Sxx+Syy;
-    
+
     c2=-K00-K11-K22;
     c1=K00*K11+K00*K22+K11*K22-K01*K01-K10*K10;
     c0=K01*K01*K11+K10*K10*K22-K00*K11*K22;
-    
-    
+
+
     p=c1-pow(c2,2)/3.;
     q=2.*pow(c2,3)/27.-c1*c2/3.+c0;
     r=pow(q/2.,2)+pow(p,3)/27.;
-    
-    
+
+
     if(r>0) dm2=-c2/3.+pow(-q/2.+sqrt(r),1./3.)+pow(-q/2.-sqrt(r),1./3.);
     if(r<0)
     {
@@ -602,14 +614,14 @@ double Cluster::Fit3D(NPL::Track &aTrack)
         phi=acos(-q/(2.*rho));
         dm2=min(-c2/3.+2.*pow(rho,1./3.)*cos(phi/3.),min(-c2/3.+2.*pow(rho,1./3.)*cos((phi+2.*TMath::Pi())/3.),-c2/3.+2.*pow(rho,1./3.)*cos((phi+4.*TMath::Pi())/3.)));
     }
-    
+
     a=-K10*cos(theta)/(K11-dm2)+K01*sin(theta)/(K22-dm2);
     b=-K10*sin(theta)/(K11-dm2)-K01*cos(theta)/(K22-dm2);
-    
+
     Xh=((1.+b*b)*Xm-a*b*Ym+a*Zm)/(1.+a*a+b*b);
     Yh=((1.+a*a)*Ym-a*b*Xm+b*Zm)/(1.+a*a+b*b);
     Zh=((a*a+b*b)*Zm+a*Xm+b*Ym)/(1.+a*a+b*b);
-    
+
     aTrack.SetXm(Xm);
     aTrack.SetYm(Ym);
     aTrack.SetZm(Zm);
@@ -617,36 +629,7 @@ double Cluster::Fit3D(NPL::Track &aTrack)
     aTrack.SetYh(Yh);
     aTrack.SetZh(Zh);
     aTrack.SetSlopesAndOffsets();
-    
-    
-    return(fabs(dm2/Q));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 
 
+    return(fabs(dm2/Q));
+}