diff --git a/Projects/ComptonTelescope/online/src/DecodeD.cpp b/Projects/ComptonTelescope/online/src/DecodeD.cpp
index 2235c1981776c0f874c145c1a05099b2d84bb4ed..9f351966b390cc0236bad1c62beb034b04bb7d35 100644
--- a/Projects/ComptonTelescope/online/src/DecodeD.cpp
+++ b/Projects/ComptonTelescope/online/src/DecodeD.cpp
@@ -3,9 +3,119 @@
 DecodeD::DecodeD(bool v)
 {
   verbose = v;
+  cursor = 0;
+  datatype = D_NONE;
+  t1 = 0;
+  length = 0;
 }
 
 DecodeD::~DecodeD()
-{ }
+{
+  switch (datatype) {
+    case D_ROOT:
+      delete t1;
+      break;
+    case D_MFM:
+      break;//TBR
+  }
+}
+
+void DecodeD::setTree(const char* filename)
+{
+  datatype = D_ROOT;
+  cursor = 0;
+  TFile* f = new TFile(filename);
+  t1 = (TTree*)f->Get("Events");
+  length = t1 -> GetEntries();
+  if (verbose) { cout << "Length of loaded tree: " << length << endl; }
+  t1->SetBranchAddress("chip_data", &event.chip_data);
+  t1->SetBranchAddress("analog_trigger", &event.analog_trigger);
+  t1->SetBranchAddress("seu", &event.seu);
+  t1->SetBranchAddress("ch_status", &event.ch_status);
+  t1->SetBranchAddress("ref_channel", &event.ref_channel);
+  t1->SetBranchAddress("sample", &event.sample);
+  t1->SetBranchAddress("cm_data", &event.cm_data);
+  t1->SetBranchAddress("timestamp", &event.timestamp);
+}
+
+void DecodeD::setRaw()
+{
+  datatype = D_MFM;
+}
+
+long int DecodeD::getCursor()
+{
+  return cursor;
+}
+
+long int DecodeD::getLength()
+{
+  return length;
+}
+
+newframe_t* DecodeD::getEvent()
+{
+  return &event;
+}
+
+void DecodeD::decodeEvent()
+{
+  switch (datatype) {
+    case D_ROOT:
+      if (cursor < length) {
+        t1->GetEntry(cursor);
+//        for (int i = 0; i < 3; i++) {
+  //        for (int j = 0; i < 8; j++) {
+/*  int i = 0; int j = 0;
+            event.chip_data[i][j] = chip_data[i][j];
+            event.analog_trigger[i][j] = analog_trigger[i][j];
+            event.seu[i][j] = seu[i][j];
+            event.ch_status[i][j] = ch_status[i][j];
+            event.ref_channel[i][j] = ref_channel[i][j];
+            event.cm_data[i][j] = cm_data[i][j];
+            for (int k = 0; k<32; k++) {
+              event.sample[i][j][k] = sample[i][j][k];
+            }
+//          }
+  //      }
+        event.timestamp = *timestamp;*/
+        cursor++;
+      }
+      break;
+    case D_MFM:
+      break;
+    case D_NONE:
+      cout << "No data has been set to decode" << endl;
+  }
+}
+
+void DecodeD::Dump()
+{
+  cout << "Datatype: " << datatype << " means ";
+  switch (datatype) {
+    case D_ROOT:
+      cout << "ROOT" << endl;
+      break;
+    case D_MFM:
+      cout << "MFM" <<  endl;
+      break;
+    case D_NONE:
+      cout << "no data has been set" << endl;
+      return;
+  }
+  cout << "Timestamp: " << event.timestamp << endl;
+  cout << "Chip data\tanalog trigger\tseu\tchannel status\tref channel\tcm data" << endl;
+  for (int i = 0; i < 2; i++) {
+    for (int j = 0; j < 8; j++) {
+      cout << (int)event.chip_data[i][j] << "\t" << (int)event.analog_trigger[i][j] << "\t" << (int)event.seu[i][j] << "\t" << (int)event.ch_status[i][j] << "\t" << (int)event.ref_channel[i][j] << "\t" << (int)event.cm_data[i][j] << endl;
+      cout << "Samples: ";
+      for (int k = 0; k<32; k++) {
+        cout << event.sample[i][j][k] << " ";
+      }
+      cout << endl;
+    }
+  }
+}
+
+
 
-//DecodeD::
diff --git a/Projects/ComptonTelescope/online/src/DecodeD.h b/Projects/ComptonTelescope/online/src/DecodeD.h
index 1f7e767638a86b784096eeb5de01ca327ec82844..2f2014e4c1da631dc7f7c7d931f64fcedfae9977 100644
--- a/Projects/ComptonTelescope/online/src/DecodeD.h
+++ b/Projects/ComptonTelescope/online/src/DecodeD.h
@@ -11,15 +11,71 @@ using namespace std;
 #include "TFile.h"
 #include "TTree.h"
 
+enum Datatype {D_NONE = 0, D_ROOT, D_MFM};
+
+typedef struct {
+  uint8_t chain;            // Chain Number (0 or 1)
+  uint8_t nb_asic;          // ASIC Number
+  uint8_t chip_data;        // 0=Empty Frame;
+  uint8_t analog_trigger;
+  uint8_t seu;
+  uint32_t ch_status;
+  uint16_t ref_channel;
+  uint16_t sample[32];
+  uint16_t cm_data;
+  uint32_t timestamp;
+} frame_t;
+
+typedef struct
+{
+  uint8_t chip_data[3][8];
+  uint8_t analog_trigger[3][8];
+  uint8_t seu[3][8];
+  uint32_t ch_status[3][8];
+  uint16_t ref_channel[3][8];
+  uint16_t sample[3][8][32];
+  uint16_t cm_data[3][8];
+  uint32_t timestamp;
+} newframe_t;
 
 class DecodeD
 {
   private:
     bool verbose;
+    Datatype datatype;
+    long int cursor;
+    newframe_t event;
+
+    // For root data
+    TTree* t1;
+    long int length;
+    uint8_t** chip_data;
+    uint8_t** analog_trigger;
+    uint8_t** seu;
+    uint32_t** ch_status;
+    uint16_t** ref_channel;
+    uint16_t*** sample;
+    uint16_t** cm_data;
+    uint32_t* timestamp;
+
+    // For online data
 
   public:
     DecodeD(bool v);
     ~DecodeD();
+
+    void setTree(const char* filename);
+    void setRaw();
+
+    long int getCursor();
+    long int getLength();
+    newframe_t* getEvent();
+    // One may add a few getters here and deprecate getEvent to avoid requiring the class user to know the newframe_t struct
+    
+    void decodeEvent();
+
+    void Dump();
 };
 
 #endif
+
diff --git a/Projects/ComptonTelescope/online/src/online.cpp b/Projects/ComptonTelescope/online/src/online.cpp
index 33248e241fca012e399a89c307bf674ccda88a13..29a1dac79ac7dd81ba7da9d080e797cabe32d607 100644
--- a/Projects/ComptonTelescope/online/src/online.cpp
+++ b/Projects/ComptonTelescope/online/src/online.cpp
@@ -79,7 +79,20 @@ int main()
     is.close();
     i++;
   
-    // Read from file(s)
+    // Read from file
+    DD -> setTree("20200128_10h44_bi207_conv.root");
+//  DD -> decodeEvent();
+//  DD -> Dump();
+    int dlength = DD -> getLength();
+    newframe_t* event;
+    while (DD -> getCursor() < dlength)
+    {
+      DD -> decodeEvent();
+      event = DD -> getEvent();
+      //Fill TComptonTelescopeData here (if possible)
+    }
+
+    // Read from file
     D -> setRaw(buffer);
 
     D -> decodeRawMFM(); // get rid of the first two (empty) events