]> jspc29.x-matter.uni-frankfurt.de Git - mimosis_chain.git/commitdiff
modifications in cpp
authorMaps <maps@ikf>
Thu, 12 Dec 2024 11:13:28 +0000 (12:13 +0100)
committerMaps <maps@ikf>
Thu, 12 Dec 2024 11:13:28 +0000 (12:13 +0100)
scripts/cpp/CMakeLists.txt
scripts/cpp/analysis.cxx
scripts/cpp/mimosis.cxx
scripts/cpp/mimosis.hpp
scripts/cpp/scurve-scan.cxx

index 504b66f01b98798ffff15bff2df6cb82c5ce0919..a7004f7b421a00c84de3866084e47d36dcad7095 100644 (file)
@@ -4,9 +4,10 @@ project(mimosis
   LANGUAGES C CXX
 )
 
+
 set(SCURVE_EXE "scurve-scan")
 set(MIMOSIS_LIB "mimosis")
-
+set(ANALYSIS_LIB "analysis")
 
 if(TRBNETTOOLS_DIR)
   message(${TRBNETTOOLS_DIR})
@@ -23,8 +24,8 @@ set(TRBNET_INCLUDE_DIR ${TRBNETTOOLS_DIR}/libtrbnet/)
 if(DABC_DIR)
   message(${DABC_DIR})
 else()
-  message("DABC_DIR not provided. Using /d/jspc37/soft/trb3/dabc")
-  set(DABC_DIR "/d/jspc37/soft/trb3/dabc")
+  message("DABC_DIR not provided. Using /d/jspc37/soft/trb3/dabc/build")
+  set(DABC_DIR "/d/jspc37/soft/trb3/dabc/build")
 endif()
 
 set(DABC_LIB_DIR ${DABC_DIR}/lib/)
@@ -32,33 +33,108 @@ set(DABC_INCLUDE_DIR ${DABC_DIR}/include/)
 
 
 
+if(ROOT_DIR)
+  message(${ROOT_DIR})
+else()
+  message("ROOT_DIR not provided. Using /d/jspc37/soft/trb3/rootbuild")
+  set(ROOT_DIR "/d/jspc37/soft/trb3/rootbuild")
+endif()
+
+set(ROOT_LIB_DIR ${ROOT_DIR}/lib/)
+set(ROOT_INCLUDE_DIR ${ROOT_DIR}/include/)
+
+
+
 include_directories(
   ${TRBNET_INCLUDE_DIR}
   ${DABC_INCLUDE_DIR}
+  ${ROOT_INCLUDE_DIR}
 )
 
 link_directories(
   ${TRBNET_LIB_DIR}
   ${DABC_LIB_DIR}
+  ${ROOT_LIB_DIR}
 )
 
+
 add_executable(
   ${SCURVE_EXE} ${SCURVE_EXE}.cxx
 )
 
+if(MAKEANALYSIS)
+  message("Build libanalysis.so")
+  add_library(
+    ${ANALYSIS_LIB} SHARED
+    ${ANALYSIS_LIB}.cxx
+  )
+endif()
+
+
 add_library(
   ${MIMOSIS_LIB} SHARED
   ${MIMOSIS_LIB}.cxx
 )
 
+
 target_link_libraries(${SCURVE_EXE}
   PRIVATE trbnet
-  PRIVATE DabcBase
-  PRIVATE DabcHadaq
-  PRIVATE DabcMbs
   PRIVATE ${MIMOSIS_LIB}
 )
 
-target_link_libraries(${MIMOSIS_LIB}
+target_compile_features(${MIMOSIS_LIB} PRIVATE cxx_std_17)
+
+
+target_link_libraries( ${MIMOSIS_LIB}
   PRIVATE trbnet
+  PRIVATE DabcBase
+  PRIVATE DabcHadaq
+  PRIVATE DabcMbs
+  # PRIVATE MathCore
+  # PRIVATE Rint
+  # PRIVATE Core
+  # PRIVATE RIO
+  # PRIVATE Thread
+  # PRIVATE tbb
+  # PRIVATE Cling
+  # PRIVATE Imt
+  # PRIVATE MultiProc
+  # PRIVATE Net
+  # PRIVATE Hist
+  # PRIVATE Matrix
+  # PRIVATE Rint
+  # PRIVATE Cling
+  # PRIVATE Gpad
+  # PRIVATE Graf
 )
+
+
+if(MAKEANALYSIS)
+
+  target_compile_features(${ANALYSIS_LIB} PRIVATE cxx_std_17)
+
+  target_link_libraries( ${ANALYSIS_LIB}
+
+    PRIVATE ${MIMOSIS_LIB}
+    PRIVATE MathCore
+    PRIVATE Rint
+    PRIVATE Core
+    PRIVATE RIO
+    PRIVATE Thread
+    PRIVATE tbb
+    PRIVATE Cling
+    PRIVATE Imt
+    PRIVATE MultiProc
+    PRIVATE Net
+    PRIVATE Hist
+    PRIVATE Matrix
+    PRIVATE Rint
+    PRIVATE Cling
+    PRIVATE Gpad
+    PRIVATE Graf
+    PRIVATE trbnet
+    PRIVATE DabcBase
+    PRIVATE DabcHadaq
+    PRIVATE DabcMbs
+  )
+endif()
index 7613eeec72aff7a91c0ebf3c9d9aa7400a1d2192..3efe099e08f290b26b1121912f503cd96ec62f79 100644 (file)
@@ -643,7 +643,7 @@ pixel_dump(
     TCanvas *t2 = new TCanvas();
     PixelMatrix->Draw();
     
-    PixelMatrix->SaveAs("NoiseHist.pdf","pdf");
+    t2->SaveAs("NoiseHist.png","png");
     
     delete PixelMatrix;
 }
index febeaeb30da1cbd74c6571a46ebf5023cbdc16a7..4dbefcf3a88d01fc94d8a329b8075ef43769c25c 100644 (file)
@@ -1,6 +1,7 @@
 #include <chrono>
 #include <iostream>
 #include <fstream>
+#include <sstream>
 #include <vector>
 #include <unistd.h>
 #include <math.h>
@@ -11,8 +12,8 @@
 #include "hadaq/api.h"
 
 #define MIM_I2C_INSTR (0x11<<1)
-#define MIM_I2C_ADD_LSB (0x12<<1)
-#define MIM_I2C_ADD_MSB (0x13<<1)
+#define MIM_I2C_ADD_MSB (0x12<<1)
+#define MIM_I2C_ADD_LSB (0x13<<1)
 #define MIM_I2C_WR (0x14<<1)
 #define MIM_I2C_RD (0x15<<1)
 
 
 #define I2C_EXEC 0x1
 
-#define GEN_PAYLOAD_WR(r,d) static_cast<uint32_t>(((r&0xff)<<24)+((d&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_LSB)
-#define GEN_PAYLOAD_RD(r) static_cast<uint32_t>(((r&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_LSB)
+#define GEN_PAYLOAD_WR(r,d) static_cast<uint32_t>(((r&0xff)<<24)+((d&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_MSB)
+#define GEN_PAYLOAD_RD(r) static_cast<uint32_t>(((r&0xff)<<16)+(r&0xff00)+MIM_I2C_ADD_MSB)
 
-#define GEN_ADD_LSB(r) static_cast<uint32_t>(((r&0xff00)<<8)+MIM_I2C_ADD_LSB)
-#define GEN_ADD_MSB(r) static_cast<uint32_t>(((r&0xff)<<16)+MIM_I2C_ADD_MSB)
+#define GEN_ADD_MSB(r) static_cast<uint32_t>(((r&0xff00)<<8)+MIM_I2C_ADD_MSB)
+#define GEN_ADD_LSB(r) static_cast<uint32_t>(((r&0xff)<<16)+MIM_I2C_ADD_LSB)
 #define GEN_WR(d) static_cast<uint32_t>(((d&0xff)<<16)+MIM_I2C_WR)
+#define GEN_RD static_cast<uint32_t>(MIM_I2C_RD)
 
 // #define SUPERINDEX(x,y,s) ((y*1024+x)*256+s)
-#define SUPERINDEX(x,xL,y,yL,s) (((y-yL)*xL+(x-xL))*256+s)
+#define SUPERINDEX(x,xL,xS,y,yL,s) (((y-yL)*xS+(x-xL))*256+s)
 
 #ifndef SLEEPVAL
 #define SLEEPVAL 1000
@@ -68,19 +70,17 @@ write_data(
 {
     std::string fileName = "scurve-pulses.csv";
 
-    std::ofstream file(fileName);
+    std::ofstream file(fileName, std::ios::app);
     char buffer[1000000];
     file.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
 
+    int xSpan = xHig - xLow + 1;
+
     for(int y = yLow; y <= yHig; y++) {
         for(int x = xLow; x <= xHig; x++) {
             file << x << '\t' << y << '\t';
             for(int s = 0; s <= 255; s++) {
-
-                // auto v = dataArray[SUPERINDEX(x,xLow,y,yLow,s)];
-                // file << v << '\t';
-
-                file << dataArray[SUPERINDEX(x,xLow,y,yLow,s)] << '\t';
+                file << dataArray[SUPERINDEX(x,xLow,xSpan,y,yLow,s)] << '\t';
             }
             file << '\n';
         }
@@ -90,6 +90,8 @@ write_data(
 
 
 
+
+
 void
 mimosis::
 register_write(
@@ -138,14 +140,16 @@ register_write_sec(
 
     while (readVal!= data)
     {
+        
         mimosis::register_write( fpga, reg, data, sa );
+        // sleep(1);
         readVal = mimosis::register_read( fpga, reg, sa );
-
+        
         cnt++;
 
         if(cnt >= 1000)
         {
-            std::printf("Cannot write 0x%04x to 0x%04x.\nExiting.\n",data, reg);
+            std::printf("Cannot write 0x%04x to 0x%04x.\nExiting.\n", data, reg);
             std::exit(-1);
             break;
         }
@@ -164,8 +168,9 @@ register_read(
     if( singleAccess ) {
 
         std::vector<uint32_t> payload = {
-        GEN_ADD_LSB(mim_reg),
-        GEN_ADD_MSB(mim_reg)};
+          GEN_ADD_MSB(mim_reg),
+          GEN_ADD_LSB(mim_reg)
+       };
 
         for (auto i: payload)
         {
@@ -180,18 +185,13 @@ register_read(
             const uint32_t arr[3] = { 0x0, GEN_PAYLOAD_RD(mim_reg), I2C_EXEC };
             trb_register_write_mem(fpga, TRB_REG_ADDR, 0, arr, 3);
         }
-
-        usleep(SLEEPVAL);
-
-        {
-            const uint32_t arr[3] = { 0x110, MIM_I2C_RD, I2C_EXEC };
-            trb_register_write_mem(fpga, TRB_REG_ADDR, 0, arr, 3);
-        }
-
         usleep(SLEEPVAL);
-
     }
 
+    const uint32_t arr[3] = { 0x110, MIM_I2C_RD, I2C_EXEC };
+    trb_register_write_mem(fpga, TRB_REG_ADDR, 0, arr, 3);
+    usleep(SLEEPVAL);
+
     const int size = 2;
     uint32_t res[size];
 
@@ -199,7 +199,7 @@ register_read(
 
     if (status <= 0) return status;
 
-    return res[1] & 0x00ff;
+    return res[1] & 0xff;
 }
 
 
@@ -248,6 +248,8 @@ find_mod(
 
     uint32_t lastMimFraCnt;
 
+    int cnt = 0;
+
     while(modFound == -1)
     {
         while(true)
@@ -257,100 +259,104 @@ find_mod(
 
             hadaq::RawSubevent* sub = nullptr;
 
-            while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == fpga))
+            // while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == fpga)) // Does not work!!
+            while ((sub = evnt->NextSubevent(sub)) != nullptr)
             {
-                unsigned size = sub->GetNrOfDataWords();
-                int headerNow = 0;
-                uint32_t mimFraCnt;
-                unsigned region = 0, column = 0, row = 0;
+               if (sub->GetId() == fpga)
+               {
+                    unsigned size = sub->GetNrOfDataWords();
+                    int headerNow = 0;
+                    uint32_t mimFraCnt;
+                    unsigned region = 0, column = 0, row = 0;
 
-                for( unsigned i = 0; i<size; i++)
-                {
-                    uint32_t data = static_cast<uint32_t>(sub->Data(i));
+                    for( unsigned i = 0; i<size; i++)
+                    {
+                        uint32_t data = static_cast<uint32_t>(sub->Data(i));
 
-                    if((data & 0xFF000000) == 0xFE000000) {
+                        if((data & 0xFF000000) == 0xFE000000) {
 
-                        ++headerNow;
+                            ++headerNow;
 
-                        if(headerNow == 1) {
+                            if(headerNow == 1) {
 
-                            mimFraCnt  = (data & 0xFF0000) >> 16;
-                            mimFraCnt += (data & 0xFF) << 8;
+                                mimFraCnt  = (data & 0xFF0000) >> 16;
+                                mimFraCnt += (data & 0xFF) << 8;
 
-                        } else if(headerNow == 2) {
+                            } else if(headerNow == 2) {
 
-                            mimFraCnt += data & 0xFF0000;
-                            mimFraCnt += (data & 0xFF) << 24;
+                                mimFraCnt += data & 0xFF0000;
+                                mimFraCnt += (data & 0xFF) << 24;
 
-                        } else if(headerNow == 3) {
-                        } else if(headerNow == 4) {
-                        }
+                            } else if(headerNow == 3) {
+                            } else if(headerNow == 4) {
+                            }
 
-                    } else if((data & 0xFF000000) == 0xFF000000) {
+                        } else if((data & 0xFF000000) == 0xFF000000) {
 
-                        headerNow = 0;
+                            headerNow = 0;
 
-                    } else {
+                        } else {
 
-                        if( (data & 0xFF000000) == 0xFD000000 ) {
+                            if( (data & 0xFF000000) == 0xFD000000 ) {
 
-                            int tmp =  (data>>16) & 0xFF;
-                            if(tmp > 63) continue;
-                            region = tmp;
+                                int tmp =  (data>>16) & 0xFF;
+                                if(tmp > 63) continue;
+                                region = tmp;
 
-                        } else {
+                            } else {
 
-                            decode_pixel(data>>16,column,row,region);
+                                decode_pixel(data>>16,column,row,region);
 
-                            if(column >= xLow &&
-                               column <= xHig &&
-                               row >= yLow &&
-                               row < yHig &&
-                               lastMimFraCnt != mimFraCnt &&
-                               modInd < modN &&
-                               (row == modY || modY == -1) &&
-                               (column == modX || modX == -1)) {
+                                if(column >= xLow &&
+                                   column <= xHig &&
+                                   row >= yLow &&
+                                   row <= yHig &&
+                                   lastMimFraCnt != mimFraCnt &&
+                                   modInd < modN &&
+                                   (row == modY || modY == -1) &&
+                                   (column == modX || modX == -1)) {
 
-                                modY = row;
-                                modX = column;
+                                    modY = row;
+                                    modX = column;
 
-                                modVec[modInd] = mimFraCnt%pulse;
+                                    modVec[modInd] = mimFraCnt%pulse;
 
-                                modInd++;
+                                    modInd++;
 
-                                lastMimFraCnt = mimFraCnt;
+                                    lastMimFraCnt = mimFraCnt;
 
-                                if(modInd == modN) { goto EVALMODS; }
+                                    if(modInd == modN) { goto EVALMODS; }
+                                }
                             }
-                        }
 
-                        if((data & 0x0000FF00) != 0x0000FC00) {
+                            if((data & 0x0000FF00) != 0x0000FC00) {
 
-                            decode_pixel(data&0xFFFF,column,row,region);
+                                decode_pixel(data&0xFFFF,column,row,region);
 
-                            if(column >= xLow &&
-                               column <= xHig &&
-                               row >= yLow &&
-                               row < yHig &&
-                               lastMimFraCnt != mimFraCnt &&
-                               modInd < modN &&
-                               (row == modY || modY == -1) &&
-                               (column == modX || modX == -1)) {
+                                if(column >= xLow &&
+                                   column <= xHig &&
+                                   row >= yLow &&
+                                   row <= yHig &&
+                                   lastMimFraCnt != mimFraCnt &&
+                                   modInd < modN &&
+                                   (row == modY || modY == -1) &&
+                                   (column == modX || modX == -1)) {
 
-                                modY = row;
-                                modX = column;
+                                    modY = row;
+                                    modX = column;
 
-                                modVec[modInd] = mimFraCnt%pulse;
+                                    modVec[modInd] = mimFraCnt%pulse;
 
-                                modInd++;
+                                    modInd++;
 
-                                lastMimFraCnt = mimFraCnt;
+                                    lastMimFraCnt = mimFraCnt;
 
-                                if(modInd == modN) { goto EVALMODS; }
+                                    if(modInd == modN) { goto EVALMODS; }
+                                }
                             }
                         }
-                    }
-                } // End loop over data in sub event
+                    } // End loop over data in sub event
+               }
             } // End loop over sub-events in event
         }
 
@@ -408,10 +414,12 @@ loop_vph(
     int arrSize = ySpan*xSpan*256;
     int* dataArray = new int[arrSize];
 
+    printf("ARRAY SIZE: %d\n", arrSize);
+
     for(int i = 0; i<arrSize; i++)
         dataArray[i] = 0;
 
-    for(int vphfine = vphSta;
+    for(uint32_t vphfine = vphSta;
         vphfine <= vphEnd;
         vphfine += vphTra)
     {
@@ -420,108 +428,213 @@ loop_vph(
 
         //Set VPH_FINE
         mimosis::register_write_sec( fpga, dacs::VPHFINE, vphfine, sa );
+        trb_register_write(fpga, 0x9209, vphfine);
+        usleep(SLEEPVAL);
 
         using namespace std::chrono;
         auto start = high_resolution_clock::now();
         auto stop = high_resolution_clock::now();
         auto duration = duration_cast<microseconds>(stop-start);
 
-        for(int mimTra = 0;
-            mimTra<maxCounts;
-            mimTra++)
-        {
+        int mimTra = 0;
+
+        while( mimTra<maxCounts) {
+
             evnt = ref.NextEvent(1.,-1);
             if (!evnt) continue;
 
             hadaq::RawSubevent* sub = nullptr;
 
-            while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == fpga))
+            // while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == fpga)) // Does not work!!
+            while ((sub = evnt->NextSubevent(sub)) != nullptr)
             {
-                unsigned size = sub->GetNrOfDataWords();
+               if (sub->GetId() == fpga)
+               {
+                    unsigned size = sub->GetNrOfDataWords();
 
-                int headerNow = 0;
+                    int headerNow = 0;
 
-                uint32_t mimFraCnt;
+                    uint32_t mimFraCnt;
+                    uint32_t mimFraCntOpt;
 
-                unsigned region = 0, column = 0, row = 0;
+                    unsigned region = 0, column = 0, row = 0;
 
-                for( unsigned i = 0; i<size; i++)
-                {
-                    uint32_t data = static_cast<uint32_t>(sub->Data(i));
+                    for( unsigned i = 0; i<size; i++) {
 
+                        uint32_t data = static_cast<uint32_t>(sub->Data(i));
 
-                    if((data & 0xFF000000) == 0xFE000000) {
+                        if((data & 0xFF000000) == 0xFE000000) {
 
-                        ++headerNow;
+                            ++headerNow;
 
-                        if(headerNow == 1) {
+                            if(headerNow == 1) {
 
-                            mimFraCnt  = (data & 0xFF0000) >> 16;
-                            mimFraCnt += (data & 0xFF) << 8;
+                                mimFraCnt  = (data & 0xFF0000) >> 16;
+                                mimFraCnt += (data & 0xFF) << 8;
 
-                        } else if(headerNow == 2) {
+                            } else if(headerNow == 2) {
 
-                            mimFraCnt += data & 0xFF0000;
-                            mimFraCnt += (data & 0xFF) << 24;
+                                mimFraCnt += data & 0xFF0000;
+                                mimFraCnt += (data & 0xFF) << 24;
 
-                            // std::printf("%x\n",mimFraCnt);
+                                // std::printf("%x\n",mimFraCnt);
 
-                        } else if(headerNow == 3) {
-                        } else if(headerNow == 4) {
-                        }
+                            } else if(headerNow == 3) {
+                                mimFraCntOpt  = (data & 0xFF0000) >> 16;
+                                mimFraCntOpt += (data & 0xFF) << 8;
+                            } else if(headerNow == 4) {
+                                mimFraCntOpt += data & 0xFF0000;
+                                mimFraCntOpt += (data & 0xFF) << 24;
+                            }    
 
-                    } else if((data & 0xFF000000) == 0xFF000000) {
+                        } else if((data & 0xFF000000) == 0xFF000000) {
 
-                        headerNow = 0;
-                        mimTra++;
+                            headerNow = 0;
+                            if(mimFraCnt%pulse == mod &&
+                               mimFraCntOpt == vphfine) mimTra++;
 
-                    } else {
+                        } else {
 
-                        if( (data & 0xFF000000) == 0xFD000000 ) {
+                            if( (data & 0xFF000000) == 0xFD000000 ) {
 
-                            int tmp =  (data>>16) & 0xFF;
-                            if(tmp > 63) continue;
-                            region = tmp;
+                                int tmp =  (data>>16) & 0xFF;
+                                if(tmp > 63) continue;
+                                region = tmp;
 
-                        } else {
+                            } else {
+
+                                decode_pixel(data>>16,column,row,region);
+        
+                                if(column >= xLow &&
+                                   column <= xHig &&
+                                   row >= yLow &&
+                                   row <= yHig &&
+                                   mimFraCnt%pulse == mod &&
+                                   mimFraCntOpt == vphfine) {
+
+                                    dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+
+                                    // printf("%d %d %d %d %d %d\n",
+                                    //        column, column-xLow, row, row-yLow, vphfine, SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine));
+                                }
+
+                                int code = (data >> 16) & 0b111;
+                                
+                                if ( code & 0b1) {
+
+                                    int codeTmp = 1;
+                                    decode_pixel(((data >> 16) + (codeTmp << 6)), column, row, region);
+
+                                    if(column >= xLow && column <= xHig &&
+                                                    row >= yLow && row <= yHig &&
+                                                    mimFraCnt%pulse == mod &&
+                                                    mimFraCntOpt == vphfine) {
+
+                                    dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+                                    }
+                                }
+
+                                if ( code & 0b10) {
+
+                                    int codeTmp = 2;
+                                    decode_pixel(((data >> 16) + (codeTmp << 6)), column, row, region);
 
-                            decode_pixel(data>>16,column,row,region);
+                                    if(column >= xLow && column <= xHig &&
+                                                    row >= yLow && row <= yHig &&
+                                                    mimFraCnt%pulse == mod &&
+                                                    mimFraCntOpt == vphfine) {
 
-                            if(column >= xLow &&
-                               column <= xHig &&
-                               row >= yLow &&
-                               row < yHig &&
-                               mimFraCnt%pulse == mod) {
+                                    dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+                                    }
+                                }
 
-                                // if (vphfine%vphTra == 0)
-                                dataArray[SUPERINDEX(column,xLow,row,yLow,vphfine)] += 1;
+                                if ( code & 0b100) {
+
+                                    int codeTmp = 3;
+                                    decode_pixel(((data >> 16) + (codeTmp << 6)), column, row, region);
+
+                                    if(column >= xLow && column <= xHig &&
+                                                    row >= yLow && row <= yHig &&
+                                                    mimFraCnt%pulse == mod &&
+                                                    mimFraCntOpt == vphfine) {
+
+                                    dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+                                    }
+                                }
                             }
-                        }
 
-                        if((data & 0x0000FF00) != 0x0000FC00) {
+                            if((data & 0x0000FF00) != 0x0000FC00) {
+
+                                decode_pixel(data&0xFFFF,column,row,region);
+
+                                if(column >= xLow &&
+                                   column <= xHig &&
+                                   row >= yLow &&
+                                   row <= yHig &&
+                                   mimFraCnt%pulse == mod &&
+                                   mimFraCntOpt == vphfine) {
+
+                                    dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+
+                                    // printf("%d %d %d %d %d %d\n",
+                                    //        column, column-xLow, row, row-yLow, vphfine, SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine));
+                                }
+
+                                int code = (data & 0xFFFF) & 0b111;
+                                
+                                if ( code & 0b1) {
+
+                                    int codeTmp = 1;
+                                    decode_pixel(((data & 0xFFFF) + (codeTmp << 6)), column, row, region);
+
+                                    if(column >= xLow && column <= xHig &&
+                                                    row >= yLow && row <= yHig &&
+                                                    mimFraCnt%pulse == mod &&
+                                                    mimFraCntOpt == vphfine) {
+
+                                    dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+                                    }
+                                }
+
+                                if ( code & 0b10) {
+
+                                    int codeTmp = 2;
+                                    decode_pixel(((data & 0xFFFF) + (codeTmp << 6)), column, row, region);
 
-                            decode_pixel(data&0xFFFF,column,row,region);
+                                    if(column >= xLow && column <= xHig &&
+                                                    row >= yLow && row <= yHig &&
+                                                    mimFraCnt%pulse == mod &&
+                                                    mimFraCntOpt == vphfine) {
 
-                            if(column >= xLow &&
-                               column <= xHig &&
-                               row >= yLow &&
-                               row < yHig &&
-                               mimFraCnt%pulse == mod) {
+                                    dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+                                    }
+                                }
 
-                                // if (vphfine%vphTra == 0)
-                                dataArray[SUPERINDEX(column,xLow,row,yLow,vphfine)] += 1;
+                                if ( code & 0b100) {
+
+                                    int codeTmp = 3;
+                                    decode_pixel(((data & 0xFFFF) + (codeTmp << 6)), column, row, region);
+
+                                    if(column >= xLow && column <= xHig &&
+                                                    row >= yLow && row <= yHig &&
+                                                    mimFraCnt%pulse == mod &&
+                                                    mimFraCntOpt == vphfine) {
+
+                                    dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+                                    }
+                                }
                             }
                         }
-                    }
 
-                    if(mimTra >= maxCounts) {
-                        goto MAXCOUNTS;
-                    }
-                } // End loop over data in sub event
+                        if(mimTra >= maxCounts) {
+                            goto MAXCOUNTS;
+                        }
+                    } // End loop over data in sub event
+               }
             } // End loop over sub-events in event
-        } //End while duration
+        }
         MAXCOUNTS:
-        ;
+        trb_register_write(fpga, 0x9209, 0xaaaaaaaa);
     }
     std::printf("\n");
 
@@ -534,6 +647,181 @@ loop_vph(
 
 
 
+
+// void
+// mimosis::
+// loop_vph(
+//     char* source,
+//     int fpga, bool sa,
+//     int yLow, int yHig,
+//     int xLow, int xHig,
+//     int vphSta, int vphEnd, int vphTra,
+//     int maxCounts, int mod, int exp )
+// {
+// #ifdef DEBUG
+//     std::printf("loop_vph(): yLow(%4d) yHig(%4d) xLow(%4d) xHig(%4d) vphSta(%4d) vphEnd(%4d) vphTra(%4d) maxCounts(%4d) mod(%8d)\n",
+//                 yLow,yHig,xLow,xHig,vphSta,vphEnd,vphTra,maxCounts,mod);
+// #endif
+
+//     int pulse = static_cast<int>(std::pow(2.0,static_cast<double>(exp)));
+
+//     hadaq::ReadoutHandle ref = hadaq::ReadoutHandle::Connect(source);
+//     if (ref.null()) return;
+//     hadaq::RawEvent *evnt = nullptr;
+
+//     int ySpan = yHig - yLow + 1;
+//     int xSpan = xHig - xLow + 1;
+
+//     int arrSize = ySpan*xSpan*256;
+//     int* dataArray = new int[arrSize];
+
+//     printf("ARRAY SIZE: %d\n", arrSize);
+
+//     for(int i = 0; i<arrSize; i++)
+//         dataArray[i] = 0;
+
+//     for(uint32_t vphfine = vphSta;
+//         vphfine <= vphEnd;
+//         vphfine += vphTra)
+//     {
+//         std::printf("Scan: %3d\r",vphfine);
+//         fflush(stdout);
+
+//         //Set VPH_FINE
+//         mimosis::register_write_sec( fpga, dacs::VPHFINE, vphfine, sa );
+//         trb_register_write(fpga, 0x9209, vphfine);
+//         usleep(SLEEPVAL);
+
+//         using namespace std::chrono;
+//         auto start = high_resolution_clock::now();
+//         auto stop = high_resolution_clock::now();
+//         auto duration = duration_cast<microseconds>(stop-start);
+
+//         int mimTra = 0;
+
+//         while( mimTra<maxCounts) {
+
+//             evnt = ref.NextEvent(1.,-1);
+//             if (!evnt) continue;
+
+//             hadaq::RawSubevent* sub = nullptr;
+
+//             // while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == fpga)) // Does not work!!
+//             while ((sub = evnt->NextSubevent(sub)) != nullptr)
+//             {
+//             if (sub->GetId() == fpga)
+//             {
+//                     unsigned size = sub->GetNrOfDataWords();
+
+//                     int headerNow = 0;
+
+//                     uint32_t mimFraCnt;
+//                     uint32_t mimFraCntOpt;
+
+//                     unsigned region = 0, column = 0, row = 0;
+
+//                     for( unsigned i = 0; i<size; i++) {
+
+//                         uint32_t data = static_cast<uint32_t>(sub->Data(i));
+
+//                         if((data & 0xFF000000) == 0xFE000000) {
+
+//                             ++headerNow;
+
+//                             if(headerNow == 1) {
+
+//                                 mimFraCnt  = (data & 0xFF0000) >> 16;
+//                                 mimFraCnt += (data & 0xFF) << 8;
+
+//                             } else if(headerNow == 2) {
+
+//                                 mimFraCnt += data & 0xFF0000;
+//                                 mimFraCnt += (data & 0xFF) << 24;
+
+//                                 // std::printf("%x\n",mimFraCnt);
+
+//                             } else if(headerNow == 3) {
+//                                 mimFraCntOpt  = (data & 0xFF0000) >> 16;
+//                                 mimFraCntOpt += (data & 0xFF) << 8;
+//                             } else if(headerNow == 4) {
+//                                 mimFraCntOpt += data & 0xFF0000;
+//                                 mimFraCntOpt += (data & 0xFF) << 24;
+//                             }    
+
+//                         } else if((data & 0xFF000000) == 0xFF000000) {
+
+//                             headerNow = 0;
+//                             if(mimFraCnt%pulse == mod &&
+//                                mimFraCntOpt == vphfine) mimTra++;
+
+//                         } else {
+
+//                             if( (data & 0xFF000000) == 0xFD000000 ) {
+
+//                                 int tmp =  (data>>16) & 0xFF;
+//                                 if(tmp > 63) continue;
+//                                 region = tmp;
+
+//                             } else {
+
+//                                 decode_pixel(data>>16,column,row,region);
+        
+//                                 if(column >= xLow &&
+//                                    column <= xHig &&
+//                                    row >= yLow &&
+//                                    row <= yHig &&
+//                                    mimFraCnt%pulse == mod &&
+//                                    mimFraCntOpt == vphfine) {
+
+//                                     dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+
+//                                     // printf("%d %d %d %d %d %d\n",
+//                                     //        column, column-xLow, row, row-yLow, vphfine, SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine));
+//                                 }
+//                             }
+
+//                             if((data & 0x0000FF00) != 0x0000FC00) {
+
+//                                 decode_pixel(data&0xFFFF,column,row,region);
+
+//                                 if(column >= xLow &&
+//                                    column <= xHig &&
+//                                    row >= yLow &&
+//                                    row <= yHig &&
+//                                    mimFraCnt%pulse == mod &&
+//                                    mimFraCntOpt == vphfine) {
+
+//                                     dataArray[SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine)] += 1;
+
+//                                     // printf("%d %d %d %d %d %d\n",
+//                                     //        column, column-xLow, row, row-yLow, vphfine, SUPERINDEX(column,xLow,xSpan,row,yLow,vphfine));
+//                                 }
+//                             }
+//                         }
+
+//                         if(mimTra >= maxCounts) {
+//                             goto MAXCOUNTS;
+//                         }
+//                     } // End loop over data in sub event
+//             }
+//             } // End loop over sub-events in event
+//         }
+//         MAXCOUNTS:
+//         trb_register_write(fpga, 0x9209, 0xaaaaaaaa);
+//     }
+//     std::printf("\n");
+
+//     ref.Disconnect();
+
+//     write_data(dataArray, xLow, xHig, yLow, yHig);
+
+//     delete [] dataArray;
+// }
+
+
+
+
+
 void
 adc::
 write(
index ed75cfaaaf1c4d6e054025d34aca15da67533b87..aebdd791678313b38579663019c4c45175f5da29 100644 (file)
@@ -24,20 +24,33 @@ IBUFBIAS = 0x004e
 
 namespace mimosis
 {
-    void register_write(int fpga, int mim_reg, int mim_data, bool singleaccess);
-    void register_write_sec(int fpga, int mim_reg, int mim_data, bool singleaccess);
+    void register_write(
+        int fpga,
+        int mim_reg,
+        int mim_data,
+        bool singleaccess );
 
-    int register_read(int fpga, int mim_reg, bool singleaccess);
+    void register_write_sec(
+        int fpga,
+        int mim_reg,
+        int mim_data,
+        bool singleaccess );
 
-    void instr_write(int fpga, int cmd);
+    int register_read(
+        int fpga,
+        int mim_reg,
+        bool singleaccess );
+
+    void instr_write(
+        int fpga,
+        int cmd );
 
     int find_mod(
         char* source,
         int fpga,
         int yLow, int yHig,
         int xLow, int xHig,
-        int modPulse);
-
+        int modPulse );
 
     void loop_vph(
         char* source,
@@ -47,12 +60,12 @@ namespace mimosis
         int vphSta, int vphEnd, int vphTra,
         int maxCounts, int mod, int exp );
 
-
     void loop_rows(
         int ySta, int yEnd, int yTra,
         int xSta, int xEnd,
         int vphSta, int vphEnd, int vphTra,
         int maxCounts, int exp );
+    
 };
 
 
index 7fd8686e95a145f29b4d6e149a76af1ffa88020a..1a0d3b69280d45ac423d9e73b0f3c058632fae31 100644 (file)
-#include <cstdio>
-#include <cstring>
-#include <csignal>
-#include <unistd.h>
-#include <stdio.h>
-#include <math.h>
 #include <iostream>
-#include <fstream>
-#include <vector>
-#include <chrono>
-#include <array>
-#include <sys/stat.h>
-
-#include <stdbool.h>
-
-//Necessary for readout handler
-#include "hadaq/api.h"
-
-//Necessary to control mimosis and trbnet
-#include "trbnet.h"
-
-//Necessary for mimosis specific functions
 #include "mimosis.hpp"
-
-// #define VPHFINE 0x0046
-
-#define SUPERINDEX(x,y,s) ((y*1024+x)*256+s)
-
-using namespace std::chrono;
-
-//Enum to make access to the information vector more clear
-enum params {
-    STATE,
-    YSTA,
-    YEND,
-    YTRA,
-    XLOW,
-    XHIG,
-    VPHSTA,
-    VPHEND,
-    VPHSTEP,
-    COUNTS,
-    MOD,
-    REGION,
-    VCASN,
-    SINGLEACCESS,
-    FPGA
-};
-
-//Collection of data related variables used throughout the programm.
-namespace Data
-{
-    std::string source;
-    //Main data array holds counts of pulses for every pixel and VPH_FINE
-    std::array<unsigned,1024*504*256> dataArray;
-
-    //Current state of the programm.
-    std::string state;
-
-    //Boundaries within pulses were done
-    int yLowMax = 503, yHigMax = 0, xLowMax = 1023, xHigMax = 0;
-
-    //Directory where data and METADATA will be put.
-    std::string dataDir;
-
-    //Keep track of VCASN to put in METADATA later.
-    std::vector<std::string> vcasnVec;
-
-    bool singleAccess = true;
-    //Measure time of execution of the programm and put
-    //information in METADATA
-    decltype(high_resolution_clock::now()) start;
-
-    int fpga;
-
-    int mod = -1;
-};
-
-
-
-namespace Stats
-{
-    int totalFrames = 0;
-    int totalFramesSkipped = 0;
-};
-
-
-//Name of PID file.
-const std::string pidName = "/tmp/hldprint-pid";
-
-
-
-bool symlink_exists(const char* path)
-{
-    struct stat buf;
-    int result;
-    result = lstat(path, &buf);
-    return (result == 0);
-}
-
-
-
-void mimosis_sec_write(uint16_t fpga, uint16_t reg, uint16_t data, bool sa)
-{
-    uint16_t readVal = mimosis::register_read( fpga, reg, sa);
-
-    int cnt = 0;
-
-    while (readVal!= data)
-    {
-        mimosis::register_write( fpga, reg, data, sa );
-        readVal = mimosis::register_read( fpga, reg, sa );
-
-        cnt++;
-
-        if(cnt >= 1000)
-        {
-            std::printf("Cannot write 0x%04x to 0x%04x.\nExiting.\n",data, reg);
-            std::exit(-1);
-            break;
-        }
-    }
-}
-
-
-
-std::vector<uint16_t> backup_dacs()
-{
-    std::vector<uint16_t> vec;
-
-    for(uint16_t reg=dacs::IBIAS;
-        reg<=dacs::IBUFBIAS;
-        reg++) {
-
-        uint16_t readVal = mimosis::register_read(Data::fpga, reg, Data::singleAccess);
-        // printf("VAL: %d\n",readVal);
-        vec.push_back(readVal);
-    }
-    return vec;
-}
-
-
-//Write PID to PID-file
-void write_pid(void)
-{
-    int pid = (int)getpid();
-
-    FILE *pidFile = fopen(pidName.c_str(), "w");
-
-    if(pidFile == nullptr) {
-       std::printf("ERROR: Couldn't open file.\n");
-       std::exit(-1);
-    }
-
-    fprintf(pidFile, "%d",pid);
-
-    fclose(pidFile);
-}
-
-
-
-//Open a pipe and wait for commands and informations
-//from controller script
-std::vector<std::string> await_params()
-{
-    //Receiving pipe for informations from controller
-    std::string pipeName = "/tmp/scurveipipe";
-
-    FILE *iPipe = fopen(pipeName.c_str(), "r");
-
-    if(iPipe == nullptr) {
-       std::printf("ERROR: Couldn't open file.\n");
-       std::exit(-1);
-    }
-
-
-    //Read from pipe char by char until full frame is reached.
-    //Frames start with START and end with END.
-    //Information is delimited by '-' characters.
-    int buf;
-    bool foundFrame = false, foundSta = false, foundEnd = false;
-    std::string word;
-
-    //Staore all informations, without START and END, in values vector.
-    std::vector<std::string> values;
-
-    buf = fgetc(iPipe);
-
-    while(!foundFrame && buf != EOF)
-    {
-        char c = static_cast<char>(buf);
-
-        if(c == '-') {
-            values.push_back(word);
-            word = "";
-        } else {
-            word += c;
-        }
-
-        if(word == "START") { foundSta = true; }
-        if(word == "END") { foundEnd = true; }
-
-        buf = fgetc(iPipe);
-
-        if(foundSta && foundEnd) {
-            foundFrame = true;
-            break;
-        }
-    }
-
-    //Delete "START" from first position
-    values.erase(values.begin());
-
-    // for (const auto& i: values)
-    //     std::cout << i << '\n';
-
-    fclose(iPipe);
-
-    //Return the whole array.
-    return values;
-}
-
-
-
-//Open a pipe to transmit an acknowledgement to the
-//controller script
-int send_ack()
-{
-    //Transmitting pipe to acknowledge receiving and processing of informations
-    //A simple 'ACK' indicates the controller successful operation
-    std::string pipeName = "/tmp/scurveapipe";
-
-    FILE *iPipe = fopen(pipeName.c_str(), "w");
-
-    if(iPipe == nullptr) {
-       std::printf("ERROR: Couldn't open file.\n");
-       std::exit(-1);
-    }
-
-    std::string msg("ACK");
-    fputs(msg.c_str(),iPipe);
-    fclose(iPipe);
-    return 0;
-}
-
-
-
-//Writing contents of Data::dataArr to file.
-void write_data(std::string reg, std::string vcasn)
-{
-    //For each VCASN a new sub dir is created and a csv file with
-    //the same name holds the data.
-    std::string subDir = Data::dataDir + "/" + reg + "-" + vcasn;
-
-    mkdir(subDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
-
-    std::string fileName = subDir + "/" + reg + "-" + vcasn + ".csv";
-
-    //Buffered ofstream increases performance.
-    //One could also dump the whole array as binary file, but this complicates
-    //Post processing a bit.
-    //Another option would be to include root and use TTree's.
-    std::ofstream file(fileName);
-    char buffer[1000000];
-    file.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
-
-    // std::printf("%d %d %d %d\n", Data::yLowMax, Data::yHigMax, Data::xLowMax, Data::xHigMax);
-
-    //Only write relevant data between boundaries of scan.
-    for(int y = Data::yLowMax; y <= Data::yHigMax; y++) {
-
-        for(int x = Data::xLowMax; x <= Data::xHigMax; x++) {
-
-            for(int s = 0; s <= 255; s++) {
-
-                auto v = Data::dataArray[SUPERINDEX(x,y,s)];
-
-                file << v << '\t';
-                // file << s << '\t';
-
-                //Reset data to 0
-                Data::dataArray[SUPERINDEX(x,y,s)] = 0;
-            }
-            file << '\n';
-        }
-    }
-    file.close();
-}
-
-
-
-//Decodeing of mimosis words into pixels
-void decode_pixel(const uint32_t& word, unsigned int& column, unsigned int& row, unsigned int& region)
-{
-    unsigned int pixelcode = (word >> 6) & 0x3ff;
-
-    unsigned int side = 0, topdown = 0;
-
-    if((pixelcode&3) == 0x1 || (pixelcode&3) == 0x2) side = 1;
-    if((pixelcode&3) == 0x3 || (pixelcode&3) == 0x2) topdown = 1;
-
-    row    = (pixelcode>>2)*2 + topdown;
-    column = (((word>>3)&0x7) + region*8)*2 + side;
-}
-
-
-
-//Main data taking procedure.
-void loop_vph(
-    int yLow, int yHig,
-    int xLow, int xHig,
-    int vphSta, int vphEnd, int vphTra,
-    int maxCounts, int mod, int exp)
-{
-#ifdef DEBUG
-    std::printf("loop_vph(): yLow(%4d) yHig(%4d) xLow(%4d) xHig(%4d) vphSta(%4d) vphEnd(%4d) vphTra(%4d) maxCounts(%4d) mod(%8d)\n",
-                yLow,yHig,xLow,xHig,vphSta,vphEnd,vphTra,maxCounts,mod);
-#endif
-
-    int pulse = static_cast<int>(std::pow(2.0,static_cast<double>(exp)));
-
-    hadaq::ReadoutHandle ref = hadaq::ReadoutHandle::Connect(Data::source.c_str());
-    if (ref.null()) return;
-    hadaq::RawEvent *evnt = nullptr;
-
-    for(int vphfine = vphSta;
-        vphfine <= vphEnd;
-        vphfine += vphTra)
-    // for(int vphfine = vphSta;
-    //     vphfine <= vphEnd;
-    //     vphfine++)
-    {
-        std::printf("Scan: %3d\r",vphfine);
-        fflush(stdout);
-
-        //Set VPH_FINE
-        mimosis_sec_write( Data::fpga, dacs::VPHFINE, vphfine, Data::singleAccess );
-
-        auto start = high_resolution_clock::now();
-        auto stop = high_resolution_clock::now();
-        auto duration = duration_cast<microseconds>(stop-start);
-
-        for(int mimTra = 0;
-            mimTra<maxCounts;
-            mimTra++)
-        {
-            evnt = ref.NextEvent(1.,-1);
-            if (!evnt) continue;
-
-            hadaq::RawSubevent* sub = nullptr;
-
-            while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == Data::fpga))
-            {
-                unsigned size = sub->GetNrOfDataWords();
-
-                int headerNow = 0;
-
-                uint32_t mimFraCnt;
-
-                unsigned region = 0, column = 0, row = 0;
-
-                for( unsigned i = 0; i<size; i++)
-                {
-                    uint32_t data = static_cast<uint32_t>(sub->Data(i));
-
-
-                    if((data & 0xFF000000) == 0xFE000000) {
-
-                        ++headerNow;
-
-                        if(headerNow == 1) {
-
-                            mimFraCnt  = (data & 0xFF0000) >> 16;
-                            mimFraCnt += (data & 0xFF) << 8;
-
-                        } else if(headerNow == 2) {
-
-                            mimFraCnt += data & 0xFF0000;
-                            mimFraCnt += (data & 0xFF) << 24;
-
-                            // std::printf("%x\n",mimFraCnt);
-
-                        } else if(headerNow == 3) {
-                        } else if(headerNow == 4) {
-                        }
-
-                    } else if((data & 0xFF000000) == 0xFF000000) {
-
-                        headerNow = 0;
-                        mimTra++;
-
-                    } else {
-
-                        if( (data & 0xFF000000) == 0xFD000000 ) {
-
-                            int tmp =  (data>>16) & 0xFF;
-                            if(tmp > 63) continue;
-                            region = tmp;
-
-                        } else {
-
-                            decode_pixel(data>>16,column,row,region);
-
-                            if(column >= xLow &&
-                               column <= xHig &&
-                               row >= yLow &&
-                               row < yHig &&
-                               mimFraCnt%pulse == mod) {
-
-                                // if (vphfine%vphTra == 0)
-                                Data::dataArray[SUPERINDEX(column,row,vphfine)] += 1;
-                            }
-                        }
-
-                        if((data & 0x0000FF00) != 0x0000FC00) {
-
-                            decode_pixel(data&0xFFFF,column,row,region);
-
-                            if(column >= xLow &&
-                               column <= xHig &&
-                               row >= yLow &&
-                               row < yHig &&
-                               mimFraCnt%pulse == mod) {
-
-                                // if (vphfine%vphTra == 0)
-                                Data::dataArray[SUPERINDEX(column,row,vphfine)] += 1;
-                            }
-                        }
-                    }
-
-                    if(mimTra >= maxCounts) {
-                        goto MAXCOUNTS;
-                    }
-                } // End loop over data in sub event
-            } // End loop over sub-events in event
-        } //End while duration
-        MAXCOUNTS:
-        ;
-    }
-    std::printf("\n");
-    ref.Disconnect();
-}
-
-
-
-int find_mod(
-    int yLow, int yHig,
-    int xLow, int xHig,
-    int modPulse)
-{
-#ifdef DEBUG
-    std::printf("find_mod(): yLow(%4d) yHig(%4d) xLow(%4d) xHig(%4d) modPulse(%4d)\n",
-                yLow,yHig,xLow,xHig,modPulse);
-#endif
-
-    int pulse = static_cast<int>(std::pow(2.0,static_cast<double>(modPulse)));
-
-    int modFound = -1;
-
-    const int modN = 2;
-    std::vector<int> modVec(modN);
-    for(auto& i: modVec) { i = -1; }
-    int modInd = 0;
-    int modX = -1,modY = -1;
-
-    auto backupDacs = backup_dacs();
-
-    //Set VPH_FINE to smth high, so pulses get visible
-    mimosis_sec_write( Data::fpga, dacs::VPHFINE, 0xff, Data::singleAccess );
-
-    hadaq::ReadoutHandle ref = hadaq::ReadoutHandle::Connect(Data::source.c_str());
-    if (ref.null()) return -2;
-    hadaq::RawEvent *evnt = nullptr;
-
-    uint32_t lastMimFraCnt;
-
-    while(modFound == -1)
-    {
-        while(true)
-        {
-            evnt = ref.NextEvent(1.,-1);
-            if (!evnt) continue;
-
-            hadaq::RawSubevent* sub = nullptr;
-
-            while (((sub = evnt->NextSubevent(sub)) != nullptr) && (sub->GetId() == Data::fpga))
-            // while ((sub = evnt->NextSubevent(sub)) != nullptr)
-            {
-                unsigned size = sub->GetNrOfDataWords();
-                int headerNow = 0;
-                uint32_t mimFraCnt;
-                unsigned region = 0, column = 0, row = 0;
-
-                for( unsigned i = 0; i<size; i++)
-                {
-                    uint32_t data = static_cast<uint32_t>(sub->Data(i));
-
-                    if((data & 0xFF000000) == 0xFE000000) {
-
-                        ++headerNow;
-
-                        if(headerNow == 1) {
-
-                            mimFraCnt  = (data & 0xFF0000) >> 16;
-                            mimFraCnt += (data & 0xFF) << 8;
-
-                        } else if(headerNow == 2) {
-
-                            mimFraCnt += data & 0xFF0000;
-                            mimFraCnt += (data & 0xFF) << 24;
-
-                        } else if(headerNow == 3) {
-                        } else if(headerNow == 4) {
-                        }
-
-                    } else if((data & 0xFF000000) == 0xFF000000) {
-
-                        headerNow = 0;
-
-                    } else {
-
-                        if( (data & 0xFF000000) == 0xFD000000 ) {
-
-                            int tmp =  (data>>16) & 0xFF;
-                            if(tmp > 63) continue;
-                            region = tmp;
-
-                        } else {
-
-                            decode_pixel(data>>16,column,row,region);
-
-                            if(column >= xLow &&
-                               column <= xHig &&
-                               row >= yLow &&
-                               row < yHig &&
-                               lastMimFraCnt != mimFraCnt &&
-                               modInd < modN &&
-                               (row == modY || modY == -1) &&
-                               (column == modX || modX == -1)) {
-
-                                modY = row;
-                                modX = column;
-
-                                modVec[modInd] = mimFraCnt%pulse;
-
-                                modInd++;
-
-                                lastMimFraCnt = mimFraCnt;
-
-                                if(modInd == modN) { goto EVALMODS; }
-                            }
-                        }
-
-                        if((data & 0x0000FF00) != 0x0000FC00) {
-
-                            decode_pixel(data&0xFFFF,column,row,region);
-
-                            if(column >= xLow &&
-                               column <= xHig &&
-                               row >= yLow &&
-                               row < yHig &&
-                               lastMimFraCnt != mimFraCnt &&
-                               modInd < modN &&
-                               (row == modY || modY == -1) &&
-                               (column == modX || modX == -1)) {
-
-                                modY = row;
-                                modX = column;
-
-                                modVec[modInd] = mimFraCnt%pulse;
-
-                                modInd++;
-
-                                lastMimFraCnt = mimFraCnt;
-
-                                if(modInd == modN) { goto EVALMODS; }
-                            }
-                        }
-                    }
-                } // End loop over data in sub event
-            } // End loop over sub-events in event
-        }
-
-        EVALMODS:
-
-        int firstMod = modVec[0];
-        int wrongMods = 0;
-
-        for(int i = 1; i < modN; i++) {
-            if(modVec[i] != firstMod) {
-                wrongMods++;
-            }
-        }
-
-        if(wrongMods > 0) {
-            modInd = 0;
-            continue;
-        } else if(wrongMods == 0) {
-            modFound = firstMod;
-            break;
-        }
-    } //End while mod not found
-
-    ref.Disconnect();
-
-    int ind = 0;
-    for( auto e: backupDacs ) {
-        mimosis::register_write(Data::fpga, 0x40+ind, e, Data::singleAccess);
-        ind++;
-    }
-
-    return modFound;
-}
-
-
-
-void loop_rows(
-    int ySta, int yEnd, int yTra,
-    int xSta, int xEnd,
-    int vphSta, int vphEnd, int vphTra,
-    int maxCounts, int exp)
-{
-#ifdef DEBUG
-    std::printf("loop_rows(): ySta(%4d) yEnd(%4d) yTra(%4d) xSta(%4d) xEnd(%4d) vphSta(%4d) vphEnd(%4d) vphTra(%4d) maxCounts(%8d) exp(%4d)\n",
-                ySta,yEnd,yTra,xSta,xEnd,vphSta,vphEnd,vphTra,maxCounts,exp);
-#endif
-
-    for(int yOff = ySta;
-        yOff <= yEnd;
-        yOff += yTra)
-    {
-        std::printf("Mark pixels: %d - %d, %d - %d\n", yOff, yOff+yTra-1, xSta, xEnd);
-
-        int y = yOff;
-
-        //Mark pixels for pulsing
-        for(; y < yOff + yTra && y <= yEnd; y++)
-        {
-            Data::yLowMax = y < Data::yLowMax ? y : Data::yLowMax;
-            Data::yHigMax = y > Data::yHigMax ? y : Data::yHigMax;
-
-            int regAddY = y/8;
-            int regBitY = (1<<(y%8));
-            int regWordY = (regAddY<<8)+0x84;
-
-            mimosis_sec_write(Data::fpga, regWordY, regBitY, Data::singleAccess );
-
-            int regAddX;
-            int regBitX;
-
-            int currRegX = xSta/16;
-
-            int word82 = 0;
-            int word81 = 0;
-
-            for (int x = xSta; x <= xEnd; x++)
-            {
-                Data::xLowMax = x < Data::xLowMax ? x : Data::xLowMax;
-                Data::xHigMax = x > Data::xHigMax ? x : Data::xHigMax;
-
-                if((x/16) == currRegX &&
-                    x != xEnd) {
-
-                    if      (x%2 == 1) { word82 |= (1<<((x/2)%8)); }
-                    else if (x%2 == 0) { word81 |= (1<<((x/2)%8)); }
-
-                } else {
-
-                    if(word82 == word81) {
-
-                        int addr = (currRegX<<8) + 0x83;
-                        mimosis_sec_write( Data::fpga, addr, word81, Data::singleAccess );
-                        mimosis::instr_write( Data::fpga,  0x05 );
-                        mimosis_sec_write( Data::fpga, addr, 0, Data::singleAccess );
-
-                    } else {
-                        int addr81 = (currRegX<<8) + 0x81;
-                        int addr82 = (currRegX<<8) + 0x82;
-                        mimosis_sec_write( Data::fpga, addr81, word81, Data::singleAccess );
-                        mimosis_sec_write( Data::fpga, addr82, word82, Data::singleAccess );
-                        mimosis::instr_write( Data::fpga,  0x05 );
-                        mimosis_sec_write( Data::fpga, addr81, 0, Data::singleAccess );
-                        mimosis_sec_write( Data::fpga, addr82, 0, Data::singleAccess );
-                    }
-                    currRegX = x/16;
-
-                    word81 = 0;
-                    word82 = 0;
-
-                    if      (x%2 == 1) { word82 = (1<<((x/2)%8)); }
-                    else if (x%2 == 0) { word81 = (1<<((x/2)%8)); }
-                }
-            }
-            mimosis_sec_write(Data::fpga, regWordY, 0x0, Data::singleAccess );
-        }
-
-        Data::mod = Data::mod == -1 ? find_mod(yOff, y, xSta, xEnd, exp) : Data::mod;
-        // int mod = find_mod(yOff, y, xSta, xEnd, exp);
-
-        mimosis_sec_write( Data::fpga, dacs::VPHFINE, 0, Data::singleAccess );
-        sleep(1);
-
-        loop_vph(yOff, y, xSta, xEnd, vphSta, vphEnd, vphTra, maxCounts, Data::mod, exp);
-
-        mimosis::instr_write( Data::fpga, 0x3f );
-        mimosis::instr_write( Data::fpga, 0x04 );
-        mimosis::instr_write( Data::fpga, 0x3e );
-
-        //Set VPH_FINE back to zero, to get rid of peak at begining of scan
-        //Do it double, to be sure
-        mimosis_sec_write( Data::fpga, dacs::VPHFINE, 0, Data::singleAccess );
-    }
-}
-
-
-
-//Write the METADATA file and put into dataDir.
-void write_meta()
-{
-    std::string fileName = Data::dataDir + "/METADATA";
-
-    std::ofstream file(fileName);
-
-    file << "START:" << '\t' << Data::dataDir << '\n';
-
-    file << "VCASN:";
-    for(const auto& i: Data::vcasnVec) {
-        file << '\t' << i;
-    }
-    file << '\n';
-
-    file << "YMIN:" << '\t' << Data::yLowMax << '\n';
-    file << "YMAX:" << '\t' << Data::yHigMax << '\n';
-    file << "XMIN:" << '\t' << Data::xLowMax << '\n';
-    file << "XMAX:" << '\t' << Data::xHigMax << '\n';
-
-    file << "EXITSTATE:" << '\t' << Data::state << '\n';
-
-    auto stop = high_resolution_clock::now();
-    auto duration = duration_cast<seconds>(stop - Data::start);
-    file << "TIME(s):" << '\t' << duration.count() << '\n';
-
-    file << "COMMENT:\t<insert comment here>\n";
-
-    file.close();
-}
-
-
-
-//Signal handler for clean exit at CTRL-C.
-//Data will be dumped and marked with 'INTERRUPTED',
-//if current state was a data taking state.
-void signal_handler( int signum )
-{
-   std::cout << "Interrupt signal (" << signum << ") received Cleaning up...\n";
-
-   if(Data::state == "TAKEDATA" ||
-      Data::state == "WAITDAQ" ||
-      Data::state == "FIT") {
-
-       std::string lastReg = "INTERRUPTED";
-       std::string lastVca = "INTERRUPTED";
-       write_data(lastReg, lastVca);
-       std::cout << "Remining data indicated by INTERRUPTED flags.\n";
-
-   } else {
-   }
-
-    //Set VPH_FINE back to zero, to get rid of peak at begining of scan
-    //Do it double, to be sure
-    mimosis_sec_write( Data::fpga, dacs::VPHFINE, 0, Data::singleAccess );
-
-   //Remove pid file
-   remove(pidName.c_str());
-
-   write_meta();
-
-   std::exit(signum);
-}
-
+#include "trbnet.h"
+#include <unistd.h>
 
 
-//main. Make initialization and then enter main loop.
-int main(int argc, char* argv[])
+int main(void)
 {
-    //Read stream url
-    Data::source = argv[1];
-
-
-    //Initialize trbnet for this run
-    int trbnetState =  init_ports();
-
-
-    //Start clock to report execution time METADATA
-    Data::start = high_resolution_clock::now();
-
-
-    //Generate the PID file
-    write_pid();
-
-
-    //Register signal SIGINT and signal handler
-    signal(SIGINT, signal_handler);
-
-
-    //Declare stateVec, that will hold the
-    //informations passed from control script
-    std::vector<std::string> stateVec;
-
-
-    //Create main data dir by time stamp
-    std::time_t time = std::time(0);
-    std::tm* now = std::localtime(&time);
-
-    Data::dataDir = std::to_string(now->tm_year + 1900) + '-'
-         + std::to_string(now->tm_mon + 1) + '-'
-         + std::to_string(now->tm_mday) + '-'
-         + std::to_string(now->tm_hour) + '-'
-         + std::to_string(now->tm_min);
-
-    mkdir(Data::dataDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
-
-    const char* linkName = "lastdir";
-
-    if(symlink_exists(linkName)) {
-        unlink(linkName);
-    }
-
-    symlink(Data::dataDir.c_str(), linkName);
-
-
-    //Initialize data array with 0's
-    for(int y = 0; y < 504; y++)
-        for(int x = 0; x < 1024; x++)
-            for(int s = 0; s < 256; s++)
-                Data::dataArray[SUPERINDEX(x,y,s)] = 0;
-
-
-    //Main control loop. After init phase,
-    //wait for commands from control script
-    AWAIT:
-    stateVec = await_params();
-    Data::state = stateVec[STATE];
-    Data::singleAccess = stateVec[SINGLEACCESS] == "1";
-    Data::fpga = std::stoi(stateVec[FPGA], nullptr, 10);
-
-    if(Data::state == "TAKEDATA") {
-
-        loop_rows(
-            std::stoi(stateVec[YSTA], nullptr, 10),
-            std::stoi(stateVec[YEND], nullptr, 10),
-            std::stoi(stateVec[YTRA], nullptr, 10),
-            std::stoi(stateVec[XLOW], nullptr, 10),
-            std::stoi(stateVec[XHIG], nullptr, 10),
-            std::stoi(stateVec[VPHSTA], nullptr, 10),
-            std::stoi(stateVec[VPHEND], nullptr, 10),
-            std::stoi(stateVec[VPHSTEP], nullptr, 10),
-            std::stoi(stateVec[COUNTS], nullptr, 10),
-            std::stoi(stateVec[MOD], nullptr, 10)
-        );
-
-        send_ack();
-
-        goto AWAIT;
-
-    } else if(Data::state == "FIT") {
-
-        std::string regStr = stateVec[REGION];
-        std::string vcaStr = stateVec[VCASN];
-
-        Data::vcasnVec.push_back(vcaStr);
-        std::printf("Write data: %s %s\n",regStr.c_str(),vcaStr.c_str());
-
-        write_data(regStr,vcaStr);
-        send_ack();
-
-        goto AWAIT;
-
-    } else if(Data::state == "DONE") {
-
-        std::printf("Done.\n");
-        send_ack();
-
-        remove(pidName.c_str());
-
-        write_meta();
-
-        return 0;
-
-    } else {
-
-        //Never happend so far, but just in case,
-        //exit cleanly and remove pid file
-        std::printf("Received garbage. Exiting.\n");
 
-        remove(pidName.c_str());
+  init_ports();
 
-        return 1;
-    }
+  while( true )
+  {
+    printf("%x\n", mimosis::register_read( 0xc200, 0x46, true));
+    sleep(1);
+  }
+  
 }