]> jspc29.x-matter.uni-frankfurt.de Git - mimosis_chain.git/commitdiff
added datachecks to analysis
authorMaps <maps@ikf>
Thu, 12 Dec 2024 10:51:09 +0000 (11:51 +0100)
committerMaps <maps@ikf>
Thu, 12 Dec 2024 10:51:09 +0000 (11:51 +0100)
analysis/datachecks/CRCVerilogJan2.C [new file with mode: 0644]
analysis/datachecks/dump [new file with mode: 0644]
analysis/datachecks/first.C [new file with mode: 0644]
analysis/datachecks/mimosis.h [new file with mode: 0644]
analysis/datachecks/mimosis.h.save [new file with mode: 0644]
analysis/datachecks/old_second.C [new file with mode: 0644]
analysis/datachecks/start.sh [new file with mode: 0755]
analysis/datachecks/ucrc_t.cpp [new file with mode: 0644]
analysis/datachecks/ucrc_t.h [new file with mode: 0644]

diff --git a/analysis/datachecks/CRCVerilogJan2.C b/analysis/datachecks/CRCVerilogJan2.C
new file mode 100644 (file)
index 0000000..96475e5
--- /dev/null
@@ -0,0 +1,187 @@
+#include <iostream>
+#include <bitset>
+#include <cstdint>
+#include <string>
+
+
+
+std::bitset<16> calc_crc(std::vector<std::bitset<128>>& data_in_array)
+{
+    std::bitset<16> lfsr_c (0xFFFF),lfsr_c_nomsb, lfsr_q;
+    std::bitset<128> data_in;
+
+   // reset
+    lfsr_c.set(); // = 0xFFFF;
+
+    for (size_t i=0; i<data_in_array.size(); i++) {
+//     for (size_t i=0; i<1; i++) {
+      data_in=data_in_array[i];
+      lfsr_q=lfsr_c;
+      cout << i << " " << std::hex << data_in << endl;
+
+      lfsr_c[0]  = lfsr_q[8] ^ lfsr_q[9]  ^ lfsr_q[10] ^ lfsr_q[11]  ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[15] ^ data_in[0] ^ data_in[1] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7] ^ data_in[8] ^ data_in[9] ^ data_in[10] ^ data_in[11] ^ data_in[12] ^ data_in[13] ^ data_in[15] ^ data_in[16] ^ data_in[17] ^ data_in[18] ^ data_in[19] ^ data_in[20] ^ data_in[21] ^ data_in[22] ^ data_in[23] ^ data_in[24] ^ data_in[25] ^ data_in[26] ^ data_in[27] ^ data_in[30] ^ data_in[31] ^ data_in[32] ^ data_in[33] ^ data_in[34] ^ data_in[35] ^ data_in[36] ^ data_in[37] ^ data_in[38] ^ data_in[39] ^ data_in[40] ^ data_in[41] ^ data_in[43] ^ data_in[45] ^ data_in[46] ^ data_in[47] ^ data_in[48] ^ data_in[49] ^ data_in[50] ^ data_in[51] ^ data_in[52] ^ data_in[53] ^ data_in[54] ^ data_in[55] ^ data_in[60] ^ data_in[61] ^ data_in[62] ^ data_in[63] ^ data_in[64] ^ data_in[65] ^ data_in[66] ^ data_in[67] ^ data_in[68] ^ data_in[69] ^ data_in[71] ^ data_in[72] ^ data_in[73] ^ data_in[75] ^ data_in[76] ^ data_in[77] ^ data_in[78] ^ data_in[79] ^ data_in[80] ^ data_in[81] ^ data_in[82] ^ data_in[83] ^ data_in[86] ^ data_in[87] ^ data_in[90] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[99] ^ data_in[101] ^ data_in[103] ^ data_in[105] ^ data_in[106] ^ data_in[107] ^ data_in[108] ^ data_in[109] ^ data_in[110] ^ data_in[111] ^ data_in[120] ^ data_in[121] ^ data_in[122] ^ data_in[123] ^ data_in[124] ^ data_in[125] ^ data_in[127];
+      lfsr_c[1]  = lfsr_q[0] ^ lfsr_q[9]  ^ lfsr_q[10] ^ lfsr_q[11]  ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[14] ^ data_in[1] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7] ^ data_in[8] ^ data_in[9] ^ data_in[10] ^ data_in[11] ^ data_in[12] ^ data_in[13] ^ data_in[14] ^ data_in[16] ^ data_in[17] ^ data_in[18] ^ data_in[19] ^ data_in[20] ^ data_in[21] ^ data_in[22] ^ data_in[23] ^ data_in[24] ^ data_in[25] ^ data_in[26] ^ data_in[27] ^ data_in[28] ^ data_in[31] ^ data_in[32] ^ data_in[33] ^ data_in[34] ^ data_in[35] ^ data_in[36] ^ data_in[37] ^ data_in[38] ^ data_in[39] ^ data_in[40] ^ data_in[41] ^ data_in[42] ^ data_in[44] ^ data_in[46] ^ data_in[47] ^ data_in[48] ^ data_in[49] ^ data_in[50] ^ data_in[51] ^ data_in[52] ^ data_in[53] ^ data_in[54] ^ data_in[55] ^ data_in[56] ^ data_in[61] ^ data_in[62] ^ data_in[63] ^ data_in[64] ^ data_in[65] ^ data_in[66] ^ data_in[67] ^ data_in[68] ^ data_in[69] ^ data_in[70] ^ data_in[72] ^ data_in[73] ^ data_in[74] ^ data_in[76] ^ data_in[77] ^ data_in[78] ^ data_in[79] ^ data_in[80] ^ data_in[81] ^ data_in[82] ^ data_in[83] ^ data_in[84] ^ data_in[87] ^ data_in[88] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[98] ^ data_in[100] ^ data_in[102] ^ data_in[104] ^ data_in[106] ^ data_in[107] ^ data_in[108] ^ data_in[109] ^ data_in[110] ^ data_in[111] ^ data_in[112] ^ data_in[121] ^ data_in[122] ^ data_in[123] ^ data_in[124] ^ data_in[125] ^ data_in[126];
+      lfsr_c[2]  = lfsr_q[0] ^ lfsr_q[1]  ^ lfsr_q[8]  ^ lfsr_q[9]   ^ lfsr_q[14] ^ data_in[0] ^ data_in[1] ^ data_in[14] ^ data_in[16] ^ data_in[28] ^ data_in[29] ^ data_in[30] ^ data_in[31] ^ data_in[42] ^ data_in[46] ^ data_in[56] ^ data_in[57] ^ data_in[60] ^ data_in[61] ^ data_in[70] ^ data_in[72] ^ data_in[74] ^ data_in[76] ^ data_in[84] ^ data_in[85] ^ data_in[86] ^ data_in[87] ^ data_in[88] ^ data_in[89] ^ data_in[90] ^ data_in[91] ^ data_in[98] ^ data_in[106] ^ data_in[112] ^ data_in[113] ^ data_in[120] ^ data_in[121] ^ data_in[126];
+      lfsr_c[3]  = lfsr_q[1] ^ lfsr_q[2]  ^ lfsr_q[9]  ^ lfsr_q[10]  ^ lfsr_q[15] ^ data_in[1] ^ data_in[2] ^ data_in[15] ^ data_in[17] ^ data_in[29] ^ data_in[30] ^ data_in[31] ^ data_in[32] ^ data_in[43] ^ data_in[47] ^ data_in[57] ^ data_in[58] ^ data_in[61] ^ data_in[62] ^ data_in[71] ^ data_in[73] ^ data_in[75] ^ data_in[77] ^ data_in[85] ^ data_in[86] ^ data_in[87] ^ data_in[88] ^ data_in[89] ^ data_in[90] ^ data_in[91] ^ data_in[92] ^ data_in[99] ^ data_in[107] ^ data_in[113] ^ data_in[114] ^ data_in[121] ^ data_in[122] ^ data_in[127];
+      lfsr_c[4]  = lfsr_q[2] ^ lfsr_q[3]  ^ lfsr_q[10] ^ lfsr_q[11]  ^ data_in[2] ^ data_in[3] ^ data_in[16] ^ data_in[18] ^ data_in[30] ^ data_in[31] ^ data_in[32] ^ data_in[33] ^ data_in[44] ^ data_in[48] ^ data_in[58] ^ data_in[59] ^ data_in[62] ^ data_in[63] ^ data_in[72] ^ data_in[74] ^ data_in[76] ^ data_in[78] ^ data_in[86] ^ data_in[87] ^ data_in[88] ^ data_in[89] ^ data_in[90] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[100] ^ data_in[108] ^ data_in[114] ^ data_in[115] ^ data_in[122] ^ data_in[123];
+      lfsr_c[5]  = lfsr_q[3] ^ lfsr_q[4]  ^ lfsr_q[11] ^ lfsr_q[12]  ^ data_in[3] ^ data_in[4] ^ data_in[17] ^ data_in[19] ^ data_in[31] ^ data_in[32] ^ data_in[33] ^ data_in[34] ^ data_in[45] ^ data_in[49] ^ data_in[59] ^ data_in[60] ^ data_in[63] ^ data_in[64] ^ data_in[73] ^ data_in[75] ^ data_in[77] ^ data_in[79] ^ data_in[87] ^ data_in[88] ^ data_in[89] ^ data_in[90] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[101] ^ data_in[109] ^ data_in[115] ^ data_in[116] ^ data_in[123] ^ data_in[124];
+      lfsr_c[6]  = lfsr_q[4] ^ lfsr_q[5]  ^ lfsr_q[12] ^ lfsr_q[13]  ^ data_in[4] ^ data_in[5] ^ data_in[18] ^ data_in[20] ^ data_in[32] ^ data_in[33] ^ data_in[34] ^ data_in[35] ^ data_in[46] ^ data_in[50] ^ data_in[60] ^ data_in[61] ^ data_in[64] ^ data_in[65] ^ data_in[74] ^ data_in[76] ^ data_in[78] ^ data_in[80] ^ data_in[88] ^ data_in[89] ^ data_in[90] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[102] ^ data_in[110] ^ data_in[116] ^ data_in[117] ^ data_in[124] ^ data_in[125];
+      lfsr_c[7]  = lfsr_q[5] ^ lfsr_q[6]  ^ lfsr_q[13] ^ lfsr_q[14]  ^ data_in[5] ^ data_in[6] ^ data_in[19] ^ data_in[21] ^ data_in[33] ^ data_in[34] ^ data_in[35] ^ data_in[36] ^ data_in[47] ^ data_in[51] ^ data_in[61] ^ data_in[62] ^ data_in[65] ^ data_in[66] ^ data_in[75] ^ data_in[77] ^ data_in[79] ^ data_in[81] ^ data_in[89] ^ data_in[90] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[103] ^ data_in[111] ^ data_in[117] ^ data_in[118] ^ data_in[125] ^ data_in[126];
+      lfsr_c[8]  = lfsr_q[0] ^ lfsr_q[6]  ^ lfsr_q[7]  ^ lfsr_q[14]  ^ lfsr_q[15] ^ data_in[6] ^ data_in[7] ^ data_in[20] ^ data_in[22] ^ data_in[34] ^ data_in[35] ^ data_in[36] ^ data_in[37] ^ data_in[48] ^ data_in[52] ^ data_in[62] ^ data_in[63] ^ data_in[66] ^ data_in[67] ^ data_in[76] ^ data_in[78] ^ data_in[80] ^ data_in[82] ^ data_in[90] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[104] ^ data_in[112] ^ data_in[118] ^ data_in[119] ^ data_in[126] ^ data_in[127];
+      lfsr_c[9]  = lfsr_q[1] ^ lfsr_q[7]  ^ lfsr_q[8]  ^ lfsr_q[15]  ^ data_in[7] ^ data_in[8] ^ data_in[21] ^ data_in[23] ^ data_in[35] ^ data_in[36] ^ data_in[37] ^ data_in[38] ^ data_in[49] ^ data_in[53] ^ data_in[63] ^ data_in[64] ^ data_in[67] ^ data_in[68] ^ data_in[77] ^ data_in[79] ^ data_in[81] ^ data_in[83] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[98] ^ data_in[105] ^ data_in[113] ^ data_in[119] ^ data_in[120] ^ data_in[127];
+      lfsr_c[10] = lfsr_q[2] ^ lfsr_q[8]  ^ lfsr_q[9]  ^ data_in[8]  ^ data_in[9] ^ data_in[22] ^ data_in[24] ^ data_in[36] ^ data_in[37] ^ data_in[38] ^ data_in[39] ^ data_in[50] ^ data_in[54] ^ data_in[64] ^ data_in[65] ^ data_in[68] ^ data_in[69] ^ data_in[78] ^ data_in[80] ^ data_in[82] ^ data_in[84] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[98] ^ data_in[99] ^ data_in[106] ^ data_in[114] ^ data_in[120] ^ data_in[121];
+      lfsr_c[11] = lfsr_q[3] ^ lfsr_q[9]  ^ lfsr_q[10] ^ data_in[9]  ^ data_in[10] ^ data_in[23] ^ data_in[25] ^ data_in[37] ^ data_in[38] ^ data_in[39] ^ data_in[40] ^ data_in[51] ^ data_in[55] ^ data_in[65] ^ data_in[66] ^ data_in[69] ^ data_in[70] ^ data_in[79] ^ data_in[81] ^ data_in[83] ^ data_in[85] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[98] ^ data_in[99] ^ data_in[100] ^ data_in[107] ^ data_in[115] ^ data_in[121] ^ data_in[122];
+      lfsr_c[12] = lfsr_q[4] ^ lfsr_q[10] ^ lfsr_q[11] ^ data_in[10] ^ data_in[11] ^ data_in[24] ^ data_in[26] ^ data_in[38] ^ data_in[39] ^ data_in[40] ^ data_in[41] ^ data_in[52] ^ data_in[56] ^ data_in[66] ^ data_in[67] ^ data_in[70] ^ data_in[71] ^ data_in[80] ^ data_in[82] ^ data_in[84] ^ data_in[86] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[98] ^ data_in[99] ^ data_in[100] ^ data_in[101] ^ data_in[108] ^ data_in[116] ^ data_in[122] ^ data_in[123];
+      lfsr_c[13] = lfsr_q[5] ^ lfsr_q[11] ^ lfsr_q[12] ^ data_in[11] ^ data_in[12] ^ data_in[25] ^ data_in[27] ^ data_in[39] ^ data_in[40] ^ data_in[41] ^ data_in[42] ^ data_in[53] ^ data_in[57] ^ data_in[67] ^ data_in[68] ^ data_in[71] ^ data_in[72] ^ data_in[81] ^ data_in[83] ^ data_in[85] ^ data_in[87] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[98] ^ data_in[99] ^ data_in[100] ^ data_in[101] ^ data_in[102] ^ data_in[109] ^ data_in[117] ^ data_in[123] ^ data_in[124];
+      lfsr_c[14] = lfsr_q[6] ^ lfsr_q[12] ^ lfsr_q[13] ^ data_in[12] ^ data_in[13] ^ data_in[26] ^ data_in[28] ^ data_in[40] ^ data_in[41] ^ data_in[42] ^ data_in[43] ^ data_in[54] ^ data_in[58] ^ data_in[68] ^ data_in[69] ^ data_in[72] ^ data_in[73] ^ data_in[82] ^ data_in[84] ^ data_in[86] ^ data_in[88] ^ data_in[96] ^ data_in[97] ^ data_in[98] ^ data_in[99] ^ data_in[100] ^ data_in[101] ^ data_in[102] ^ data_in[103] ^ data_in[110] ^ data_in[118] ^ data_in[124] ^ data_in[125];
+      lfsr_c[15] = lfsr_q[7] ^ lfsr_q[8]  ^ lfsr_q[9]  ^ lfsr_q[10]  ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[14] ^ lfsr_q[15] ^ data_in[0] ^ data_in[1] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7] ^ data_in[8] ^ data_in[9] ^ data_in[10] ^ data_in[11] ^ data_in[12] ^ data_in[14] ^ data_in[15] ^ data_in[16] ^ data_in[17] ^ data_in[18] ^ data_in[19] ^ data_in[20] ^ data_in[21] ^ data_in[22] ^ data_in[23] ^ data_in[24] ^ data_in[25] ^ data_in[26] ^ data_in[29] ^ data_in[30] ^ data_in[31] ^ data_in[32] ^ data_in[33] ^ data_in[34] ^ data_in[35] ^ data_in[36] ^ data_in[37] ^ data_in[38] ^ data_in[39] ^ data_in[40] ^ data_in[42] ^ data_in[44] ^ data_in[45] ^ data_in[46] ^ data_in[47] ^ data_in[48] ^ data_in[49] ^ data_in[50] ^ data_in[51] ^ data_in[52] ^ data_in[53] ^ data_in[54] ^ data_in[59] ^ data_in[60] ^ data_in[61] ^ data_in[62] ^ data_in[63] ^ data_in[64] ^ data_in[65] ^ data_in[66] ^ data_in[67] ^ data_in[68] ^ data_in[70] ^ data_in[71] ^ data_in[72] ^ data_in[74] ^ data_in[75] ^ data_in[76] ^ data_in[77] ^ data_in[78] ^ data_in[79] ^ data_in[80] ^ data_in[81] ^ data_in[82] ^ data_in[85] ^ data_in[86] ^ data_in[89] ^ data_in[90] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[98] ^ data_in[100] ^ data_in[102] ^ data_in[104] ^ data_in[105] ^ data_in[106] ^ data_in[107] ^ data_in[108] ^ data_in[109] ^ data_in[110] ^ data_in[119] ^ data_in[120] ^ data_in[121] ^ data_in[122] ^ data_in[123] ^ data_in[124] ^ data_in[126] ^ data_in[127];
+    } // end for
+
+
+
+    lfsr_c_nomsb=lfsr_c;
+    lfsr_c_nomsb[15]=0;
+
+    return lfsr_c_nomsb;
+}
+
+// Ziel: 0xfe00fe00 0xfe00fe00 0xfe1efe5f 0xfe80fe49
+
+ulong calculate_crc(uint32_t* inputMessage, uint32_t lengthOfArray)
+{
+
+    std::bitset<16> crc;
+
+    std::vector<std::bitset<128>> messageLong;
+
+    long sizeOfInput=lengthOfArray;
+
+
+    cout << sizeOfInput << endl;
+
+    long stepSize=4;
+
+    sizeOfInput=(sizeOfInput/stepSize)*stepSize; //truncate last words due to faulty handling in hardware
+
+    cout << sizeOfInput << endl;
+    cout << sizeOfInput/4 << endl;
+
+    for (long i=0; i<(sizeOfInput/stepSize); i++){
+
+        cout << i<< " ";
+
+        uint32_t tempInt = (inputMessage[4*i+stepSize-1]&0xffff)<<16;
+                 tempInt = tempInt|((inputMessage[4*i+stepSize-1]&0xffff0000)>>16);
+        std::bitset<128> messageTemp(tempInt);
+
+        cout << std::hex << (uint32_t)inputMessage[4*i+stepSize-1] << " ";
+
+
+        for(long j=1; j<stepSize; j++){
+
+            messageTemp=messageTemp<<32;
+            uint32_t tempInt = (inputMessage[4*i+stepSize-1-j]&0xffff)<<16;
+                     tempInt = tempInt|((inputMessage[4*i+stepSize-1-j]&0xffff0000)>>16);
+            std::bitset<128> lowerBits (tempInt);
+            cout << std::hex << (uint32_t)inputMessage[4*i+stepSize-1-j] << " ";
+            messageTemp=messageTemp|lowerBits;
+            //cout << std::hex << " messageTemp  " << messageTemp << endl;
+        }
+        cout << endl;
+        messageLong.push_back(messageTemp);
+    }
+
+//     for (long i=0; i<(sizeOfInput/stepSize); i++){
+//
+//         cout << i<< " ";
+//
+//         std::bitset<128> messageTemp(inputMessage[4*i]);
+//         cout << std::hex << (uint32_t)inputMessage[4*i] << " ";
+//
+//
+//         for(long j=1; j<stepSize; j++){
+//
+//             messageTemp=messageTemp<<32;
+//             std::bitset<128> lowerBits ((uint32_t)inputMessage[4*i+j]);
+//             cout << std::hex << (uint32_t)inputMessage[4*i+j] << " ";
+//             messageTemp=messageTemp|lowerBits;
+//             //cout << std::hex << " messageTemp  " << messageTemp << endl;
+//         }
+//         cout << endl;
+//         messageLong.push_back(messageTemp);
+//     }
+
+//     for(size_t i=0; i<messageLong.size(); i++){
+//         cout << i << " " << messageLong[i] << endl;
+//     };
+
+    crc = calc_crc(messageLong);
+    //message.flip(crc[0]);
+    std::cout << "CRC checksum: " << std::hex << crc.to_ulong() << std::endl;
+    //}
+    //cout << "Stop " << crc << endl;
+
+   return crc.to_ulong();
+}
+
+
+
+void CRCVerilogJan2() {
+
+uint32_t inputMessage[]={
+//          0xfe5ffe69, 0xfe02feff, 0xfe00fe00, 0xfe00fe00,
+        0xfe80fe49,0xfe1efe5f,0xfe00fe00,0xfe00fe00,0xfd000080,0x00c00100,0x02000300,0x044004c0,
+0x06c00800,0x09000b00,0x0c000c40,0x0d000ec0,0x100011c0,0x124013c0,0x17c021c0,0x7b8085c0,
+0xb500e0c0,0x01c80348,0x038803c8,0x04480588,0x064806c8,0x08480888,0x09880a08,0x0ac80b48,
+0x13482008,0xf7080350,0x051005d0,0x06100890,0x0fd08410,0x04d80518,0xf75802a0,0x05e007e0,
+0x08a00960,0x0a202368,0x4de8b7a8,0x0c700e30,0x0eb0f730,0x02380378,0x0b385738,0xc078fcaa,
+0xfd010800,0x15804100,0x1a88f708,0x0418d998,0x1420de28,0xfd02b4d0,0x6b20f5e8,0xfba8f538,
+0xfd032100,0xd380f0c0,0xda082910,0x2a18d818,0xfd047400,0xf7182ba8,0xf5b0fcaa,0xfd0558a8,
+0xd928fcaa,0xfd06e0c0,0xfd07fb90,0xfd09e7c0,0x67c8ade0,0xeff0fcaa,0xfd19f398,0xfd212348,
+0xd8c8f210,0x1758cb60,0x53e8fcaa,0xfd229f80,0xb5007b50,0xc178fcaa,0xfd23f588,0xa3e0cbb0,
+0xf9f8fcaa,0xfd24b388,0xcd08e128,0xadf0fcaa,0xfd25dcc8,0xd0106c30,0xfd26c080,0x0008e0d0,
+0xfd27b258,0xdbd8fbe0,0xe828d4f8,0xfd281b10,0x71105598,0xd098e0d8,0xfbe0e768,0xf4309238,
+0xfd29dd48,0xf108ecd0,0x71989420,0x802883e8,0x8ae8ec28,0xe4f0f0b0,0xf170d438,0xe978fcaa,
+0xfd2acfc0,0x8cc8bac8,0xee884090,0x7350aed0,0xfbd071d8,0x80a0e7a0,0xe8e009a8,0xd168dde8,
+0xe570e2f8,0xf278f4f8,0xf778fcaa,0xfd2b9300,0x92c8be48,0xc5c85c90,0xb4d0d6d0,0xd7d0f610,
+0xfad06a58,0xa698ce98,0xd3d8e1d8,0xecd86020,0x61e09020,0xa7e0f3e0,0xf520f8e0,0xf920fba0,
+0x7c688368,0x93e8c328,0xdb68eb28,0xece8f668,0xf828f928,0x303032b0,0x4c30df30,0xe370e470,
+0xfa709af8,0xb8f8ce78,0xcf78e0f8,0xfd2cdd00,0xf40062c8,0x94c8b108,0xddc8e088,0xe3c84c90,
+0x6a509c10,0xe510e710,0xe8d0e990,0xf610c6d8,0xcdd8ced8,0xd718dad8,0xedd8ef18,0xfad82460,
+0x93a0a2e0,0xbd20cd20,0xd060e5a0,0xee608fe8,0xba28c268,0xf0a8f0e8,0xf72863f0,0x84b0af30,
+0xb9f0bc70,0xc7f0cb30,0xd730e530,0xf330f430,0xfaf0fb70,0x13f8b5b8,0xc238caf8,0xd8b8e578,
+0xfb78fcaa,0xfd2d73c0,0x7640abc0,0xcac0d800,0xdac0f100,0xf8809008,0xc9c8cd88,0xd3c8de08,
+0xf148fa88,0x6fd0a110,0xccd0e750,0xf5108098,0x9d58b118,0xb2d8d8d8,0xf8d81220,0xc4e0e120,
+0xcba8cce8,0xd5a8da28,0xede8f3a8,0xf42892f0,0x9a30c8f0,0xdaf0e1b0,0xe930f1f0,0xf630f6b0,
+0xf930faf0,0xaff8e1f8,0xecb8f3b8,0xf5f8f8f8,0xfd2e91c0,0xa900c200,0xc700c7c0,0xd7006488,
+0x95c8a688,0xad08bac8,0xc2c8d4c8,0xdd88e408,0xe5c88610,0xa950c910,0xccd0d2d0,0xe0d0e990,
+0xedd01f98,0x91d8af58,0xbc18bf18,0xf618f898,0xf958fad8,0x192054a0,0x99e0cba0,0xec2084e8,
+0x8a28b8a8,0xd3e8d428,0xd6e8f768,0xf8a870f0,0x91f0ac30,0xc4f0c730,0xe2b0f5f0,0xf930f9f0,
+0xb938d5f8,0xeef8ef38,0xf4f8fcaa,0xfd2f52c0,0xa6c0e1c0,0xe400e7c0,0xf480c688,0xd008d1c8,
+0xe5c8bfd0,0xc510dc50,0xeed0f650,0x53d8d1e0,0xdbe0e320,0xd4e8f428,0xf8e8fbe8,0x7e30b5f0,
+0xc7b0ca70,0xdaf0e6f0,0xf0f0f530,0xf6f0f930,0x4d3895f8,0xb2f8e878,0xf9b8fcaa,0xfd307100,
+0xc8c0e800,0xea40f8c0,0xc408ddc8,0xfbc8cd50,0xfa506c98,0xf898fb98,0x3e20c960,0xf6e099e8,
+0xb028f8e8,0xfae86cf0,0x8a308ef0,0xf0f0f470,0xf4f0f5b0,0xf9b098f8,0xc0f8ee38,0xf038fa78,
+0xfd315980,0x8a40a6c0,0xe9c0f740,0xb948e9c8,0xf4c8f708,0x5110b590,0xc510d250,0xf9d05798,
+0x9218c8d8,0xe1d8f918,0xfbd8ce60,0xd820e6e0,0xec20f860,0x79e89d68,0xac68ace8,0x6a30cbf0,
+0xe1b0f430,0xf570f3b8,0xfd32c5c0,0xd980e080,0xe8c0fa00,0x4408b6c8,0xe6c8f3c8,0xf888fbc8,
+0x7810d650,0xe710e910,0xed10f050,0x98d8dcd8,0xdd18b1e0,0xba20c860,0xf92061e8,0xb1a8e828,
+0xeae8efa8,0x9770c3f0,0xc830fb30,0x6c388af8,0xd138e0b8,0xf138f3f8,0xf4b8f678,0xfd335c00,
+0x8d40a3c0,0xe1c0e700,0xf480f7c0,0xfb807008,0x76c8d308,0xdcc8f008,0x1f1079d0,0xadd0dc90,
+0xea101598,0x5218b198,0xd918e5d8,0xf018f6d8,0x33206ca0,0x96209c20,0x9da0b520,0xcf20d020,
+0xee20c328,0xd568f528,0xf7e8fb28,0x81f0e730,0xf5309578,0x9e78aef8,0xbe78c078,0xc0f8c7f8,
+0xdfb8dff8,0xf1f8f578,0xfbb8fcaa,0xfd34dfc0,0x5a88c0c8,0xdd08eb08,0xf108b910,0xe4d05758,
+0xb418e518,0xec58ed98,0xf658f718,0x3ee0c020,0xcea0cee0,0xd120dde0,0xeb2081a8,0xf428f528,
+0x2c30b9f0,0xe530e870,0xe9b0ebf0,0xef70f4f0,0x77388c38,0xc478ea38,0xfd358ec0,0x91c0cb00,
+0xd6c0e4c0,0xedc0f440,0xf680f740,0x29c854c8,0x83c8b948,0xdac8e308,0xe708ec08,0x81d08210,
+0xa390a810,0xc1d0d5d0,0xda90e010,0xefd0fb50,0x795883d8,0x8a58d258,0xe2d8e658,0xeb58ebd8,
+0xf218f5d8,0xfb983ea0,0xb120c320,0xc660c7a0,0xd560d620,0xdce0e5e0,0xe920e9e0,0xeda0eee0,
+0xf6e0fb20,0x2de87e28,0x94e8d928,0xe928eba8,0xece8f1e8,0xfa682af0,0x4bf05a30,0x86f0c4b0,
+0xcfb0d0f0,0xd170d3b0,0xe5f0eeb0,0xf4f03af8,0x58387038,0xa938d538,0xe878e978,0xf238f438,
+0xfb38fcaa,0xfd368a40,0xa980adc0,0xae40c000,0xd840de00,0xde80e1c0,0x67c8bc88,0xcfc8dc88,
+0xde08f1c8,0xf3c8f808,0x34907690};
+
+cout << std::hex << calculate_crc(inputMessage, sizeof(inputMessage)/sizeof(uint32_t)) << endl;
+
+}
+
diff --git a/analysis/datachecks/dump b/analysis/datachecks/dump
new file mode 100644 (file)
index 0000000..7d33ed9
--- /dev/null
@@ -0,0 +1,1846 @@
+find_mod(): source(mbss://localhost:36789)
+fpga(a001)
+yLow( 100)
+yHig( 100)
+xLow(   0)
+xHig( 127)
+exp(   3)
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
\ No newline at end of file
diff --git a/analysis/datachecks/first.C b/analysis/datachecks/first.C
new file mode 100644 (file)
index 0000000..82d8075
--- /dev/null
@@ -0,0 +1,63 @@
+// this is example for
+
+#include <cstdlib>
+
+#include "hadaq/TdcProcessor.h"
+#include "hadaq/TrbProcessor.h"
+#include "hadaq/HldProcessor.h"
+#include "base/ProcMgr.h"
+#include "mimosis.h"
+
+
+void first()
+{
+  //base::ProcMgr::instance()->SetRawAnalysis(true);
+    base::ProcMgr::instance()->SetTriggeredAnalysis(true);
+
+   // all new instances get this value
+    base::ProcMgr::instance()->SetHistFilling(4);
+
+   // [min..max] range for TDC ids
+   //hadaq::TrbProcessor::SetTDCRange(0x610, 0x613);
+   hadaq::TrbProcessor::SetTDCRange(0x0000, 0x5fff);
+
+   // [min..max] range for HUB ids
+   hadaq::TrbProcessor::SetHUBRange(0x8000, 0x8fff);
+
+   // when first argument true - TRB/TDC will be created on-the-fly
+   // second parameter is function name, called after elements are created
+   hadaq::HldProcessor* hld = new hadaq::HldProcessor(false, "after_create");
+
+
+   //--------------------------------------------------------------------------------------
+
+   // create TRB processor which holds custom data
+   hadaq::TrbProcessor* trb = new hadaq::TrbProcessor(0xa000, hld);
+   hadaq::TrbProcessor* trb1 = new hadaq::TrbProcessor(0xa001, hld);
+   hadaq::TrbProcessor* trb2 = new hadaq::TrbProcessor(0xa100, hld);
+   // create custom processor
+   hadaq::MimosisProcessor *mimosis = new hadaq::MimosisProcessor(trb, 0xa000);
+   hadaq::MimosisProcessor *mimosis1 = new hadaq::MimosisProcessor(trb1, 0xa001);
+   hadaq::MimosisProcessor *mimosis2 = new hadaq::MimosisProcessor(trb2, 0xa100);
+
+
+
+}
+
+// extern "C" required by DABC to find function from compiled code
+
+extern "C" void after_create(hadaq::HldProcessor* hld)
+{
+   printf("Called after all sub-components are created\n");
+
+   if (hld==0) return;
+
+   for (unsigned k=0;k<hld->NumberOfTRB();k++) {
+      hadaq::TrbProcessor* trb = hld->GetTRB(k);
+      if (trb==0) continue;
+
+
+      printf("Configure %s!\n", trb->GetName());
+      trb->SetPrintErrors(10);
+   }
+}
diff --git a/analysis/datachecks/mimosis.h b/analysis/datachecks/mimosis.h
new file mode 100644 (file)
index 0000000..aeb25b5
--- /dev/null
@@ -0,0 +1,404 @@
+#ifndef MimosisProcessor_h
+#define MimosisProcessor_h
+
+#include "hadaq/SubProcessor.h"
+#include <iostream>
+#include <bitset>
+#include <cstdint>
+#include <string>
+
+using namespace std;
+
+
+std::bitset<16> calc_crc(std::vector<std::bitset<128>>& data_in_array) {      // FOR CRC TESTS
+    std::bitset<16> lfsr_c (0xFFFF),lfsr_c_nomsb, lfsr_q;
+    std::bitset<128> data_in;
+
+    lfsr_c.set(); // = 0xFFFF;
+
+    for (size_t i=0; i<data_in_array.size(); i++)
+    {
+      data_in=data_in_array[i];
+      lfsr_q=lfsr_c;
+
+      lfsr_c[0]  = lfsr_q[8] ^ lfsr_q[9]  ^ lfsr_q[10] ^ lfsr_q[11]  ^ lfsr_q[12]  ^ lfsr_q[13]  ^ lfsr_q[15]  ^ data_in[0]  ^ data_in[1]  ^ data_in[2]  ^ data_in[3]  ^ data_in[4]  ^ data_in[5]  ^ data_in[6]  ^ data_in[7]  ^ data_in[8]  ^ data_in[9]  ^ data_in[10] ^ data_in[11] ^ data_in[12] ^ data_in[13] ^ data_in[15] ^ data_in[16] ^ data_in[17] ^ data_in[18] ^ data_in[19]  ^ data_in[20]  ^ data_in[21]  ^ data_in[22]  ^ data_in[23]  ^ data_in[24]  ^ data_in[25]  ^ data_in[26]  ^ data_in[27]  ^ data_in[30]  ^ data_in[31]  ^ data_in[32]  ^ data_in[33] ^ data_in[34] ^ data_in[35] ^ data_in[36] ^ data_in[37] ^ data_in[38] ^ data_in[39] ^ data_in[40] ^ data_in[41] ^ data_in[43] ^ data_in[45] ^ data_in[46] ^ data_in[47] ^ data_in[48] ^ data_in[49] ^ data_in[50] ^ data_in[51] ^ data_in[52] ^ data_in[53] ^ data_in[54] ^ data_in[55] ^ data_in[60] ^ data_in[61] ^ data_in[62] ^ data_in[63] ^ data_in[64] ^ data_in[65] ^ data_in[66] ^ data_in[67] ^ data_in[68] ^ data_in[69] ^ data_in[71] ^ data_in[72] ^ data_in[73] ^ data_in[75] ^ data_in[76] ^ data_in[77] ^ data_in[78] ^ data_in[79] ^ data_in[80] ^ data_in[81] ^ data_in[82] ^ data_in[83] ^ data_in[86] ^ data_in[87] ^ data_in[90] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[99]  ^ data_in[101] ^ data_in[103] ^ data_in[105] ^ data_in[106] ^ data_in[107] ^ data_in[108] ^ data_in[109] ^ data_in[110] ^ data_in[111] ^ data_in[120] ^ data_in[121] ^ data_in[122] ^ data_in[123] ^ data_in[124] ^ data_in[125] ^ data_in[127];
+      lfsr_c[1]  = lfsr_q[0] ^ lfsr_q[9]  ^ lfsr_q[10] ^ lfsr_q[11]  ^ lfsr_q[12]  ^ lfsr_q[13]  ^ lfsr_q[14]  ^ data_in[1]  ^ data_in[2]  ^ data_in[3]  ^ data_in[4]  ^ data_in[5]  ^ data_in[6]  ^ data_in[7]  ^ data_in[8]  ^ data_in[9]  ^ data_in[10] ^ data_in[11] ^ data_in[12] ^ data_in[13] ^ data_in[14] ^ data_in[16] ^ data_in[17] ^ data_in[18] ^ data_in[19] ^ data_in[20]  ^ data_in[21]  ^ data_in[22]  ^ data_in[23]  ^ data_in[24]  ^ data_in[25]  ^ data_in[26]  ^ data_in[27]  ^ data_in[28]  ^ data_in[31]  ^ data_in[32]  ^ data_in[33]  ^ data_in[34] ^ data_in[35] ^ data_in[36] ^ data_in[37] ^ data_in[38] ^ data_in[39] ^ data_in[40] ^ data_in[41] ^ data_in[42] ^ data_in[44] ^ data_in[46] ^ data_in[47] ^ data_in[48] ^ data_in[49] ^ data_in[50] ^ data_in[51] ^ data_in[52] ^ data_in[53] ^ data_in[54] ^ data_in[55] ^ data_in[56] ^ data_in[61] ^ data_in[62] ^ data_in[63] ^ data_in[64] ^ data_in[65] ^ data_in[66] ^ data_in[67] ^ data_in[68] ^ data_in[69] ^ data_in[70] ^ data_in[72] ^ data_in[73] ^ data_in[74] ^ data_in[76] ^ data_in[77] ^ data_in[78] ^ data_in[79] ^ data_in[80] ^ data_in[81] ^ data_in[82] ^ data_in[83] ^ data_in[84] ^ data_in[87] ^ data_in[88] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[98] ^ data_in[100] ^ data_in[102] ^ data_in[104] ^ data_in[106] ^ data_in[107] ^ data_in[108] ^ data_in[109] ^ data_in[110] ^ data_in[111] ^ data_in[112] ^ data_in[121] ^ data_in[122] ^ data_in[123] ^ data_in[124] ^ data_in[125] ^ data_in[126];
+      lfsr_c[2]  = lfsr_q[0] ^ lfsr_q[1]  ^ lfsr_q[8]  ^ lfsr_q[9]   ^ lfsr_q[14]  ^ data_in[0]  ^ data_in[1]  ^ data_in[14] ^ data_in[16] ^ data_in[28] ^ data_in[29] ^ data_in[30] ^ data_in[31] ^ data_in[42] ^ data_in[46] ^ data_in[56] ^ data_in[57] ^ data_in[60] ^ data_in[61] ^ data_in[70] ^ data_in[72] ^ data_in[74] ^ data_in[76] ^ data_in[84] ^ data_in[85] ^ data_in[86]  ^ data_in[87]  ^ data_in[88]  ^ data_in[89]  ^ data_in[90]  ^ data_in[91]  ^ data_in[98]  ^ data_in[106] ^ data_in[112] ^ data_in[113] ^ data_in[120] ^ data_in[121] ^ data_in[126];
+      lfsr_c[3]  = lfsr_q[1] ^ lfsr_q[2]  ^ lfsr_q[9]  ^ lfsr_q[10]  ^ lfsr_q[15]  ^ data_in[1]  ^ data_in[2]  ^ data_in[15] ^ data_in[17] ^ data_in[29] ^ data_in[30] ^ data_in[31] ^ data_in[32] ^ data_in[43] ^ data_in[47] ^ data_in[57] ^ data_in[58] ^ data_in[61] ^ data_in[62] ^ data_in[71] ^ data_in[73] ^ data_in[75] ^ data_in[77] ^ data_in[85] ^ data_in[86] ^ data_in[87]  ^ data_in[88]  ^ data_in[89]  ^ data_in[90]  ^ data_in[91]  ^ data_in[92]  ^ data_in[99]  ^ data_in[107] ^ data_in[113] ^ data_in[114] ^ data_in[121] ^ data_in[122] ^ data_in[127];
+      lfsr_c[4]  = lfsr_q[2] ^ lfsr_q[3]  ^ lfsr_q[10] ^ lfsr_q[11]  ^ data_in[2]  ^ data_in[3]  ^ data_in[16] ^ data_in[18] ^ data_in[30] ^ data_in[31] ^ data_in[32] ^ data_in[33] ^ data_in[44] ^ data_in[48] ^ data_in[58] ^ data_in[59] ^ data_in[62] ^ data_in[63] ^ data_in[72] ^ data_in[74] ^ data_in[76] ^ data_in[78] ^ data_in[86] ^ data_in[87] ^ data_in[88] ^ data_in[89]  ^ data_in[90]  ^ data_in[91]  ^ data_in[92]  ^ data_in[93]  ^ data_in[100] ^ data_in[108] ^ data_in[114] ^ data_in[115] ^ data_in[122] ^ data_in[123];
+      lfsr_c[5]  = lfsr_q[3] ^ lfsr_q[4]  ^ lfsr_q[11] ^ lfsr_q[12]  ^ data_in[3]  ^ data_in[4]  ^ data_in[17] ^ data_in[19] ^ data_in[31] ^ data_in[32] ^ data_in[33] ^ data_in[34] ^ data_in[45] ^ data_in[49] ^ data_in[59] ^ data_in[60] ^ data_in[63] ^ data_in[64] ^ data_in[73] ^ data_in[75] ^ data_in[77] ^ data_in[79] ^ data_in[87] ^ data_in[88] ^ data_in[89] ^ data_in[90]  ^ data_in[91]  ^ data_in[92]  ^ data_in[93]  ^ data_in[94]  ^ data_in[101] ^ data_in[109] ^ data_in[115] ^ data_in[116] ^ data_in[123] ^ data_in[124];
+      lfsr_c[6]  = lfsr_q[4] ^ lfsr_q[5]  ^ lfsr_q[12] ^ lfsr_q[13]  ^ data_in[4]  ^ data_in[5]  ^ data_in[18] ^ data_in[20] ^ data_in[32] ^ data_in[33] ^ data_in[34] ^ data_in[35] ^ data_in[46] ^ data_in[50] ^ data_in[60] ^ data_in[61] ^ data_in[64] ^ data_in[65] ^ data_in[74] ^ data_in[76] ^ data_in[78] ^ data_in[80] ^ data_in[88] ^ data_in[89] ^ data_in[90] ^ data_in[91]  ^ data_in[92]  ^ data_in[93]  ^ data_in[94]  ^ data_in[95]  ^ data_in[102] ^ data_in[110] ^ data_in[116] ^ data_in[117] ^ data_in[124] ^ data_in[125];
+      lfsr_c[7]  = lfsr_q[5] ^ lfsr_q[6]  ^ lfsr_q[13] ^ lfsr_q[14]  ^ data_in[5]  ^ data_in[6]  ^ data_in[19] ^ data_in[21] ^ data_in[33] ^ data_in[34] ^ data_in[35] ^ data_in[36] ^ data_in[47] ^ data_in[51] ^ data_in[61] ^ data_in[62] ^ data_in[65] ^ data_in[66] ^ data_in[75] ^ data_in[77] ^ data_in[79] ^ data_in[81] ^ data_in[89] ^ data_in[90] ^ data_in[91] ^ data_in[92]  ^ data_in[93]  ^ data_in[94]  ^ data_in[95]  ^ data_in[96]  ^ data_in[103] ^ data_in[111] ^ data_in[117] ^ data_in[118] ^ data_in[125] ^ data_in[126];
+      lfsr_c[8]  = lfsr_q[0] ^ lfsr_q[6]  ^ lfsr_q[7]  ^ lfsr_q[14]  ^ lfsr_q[15]  ^ data_in[6]  ^ data_in[7]  ^ data_in[20] ^ data_in[22] ^ data_in[34] ^ data_in[35] ^ data_in[36] ^ data_in[37] ^ data_in[48] ^ data_in[52] ^ data_in[62] ^ data_in[63] ^ data_in[66] ^ data_in[67] ^ data_in[76] ^ data_in[78] ^ data_in[80] ^ data_in[82] ^ data_in[90] ^ data_in[91] ^ data_in[92]  ^ data_in[93]  ^ data_in[94]  ^ data_in[95]  ^ data_in[96]  ^ data_in[97]  ^ data_in[104] ^ data_in[112] ^ data_in[118] ^ data_in[119] ^ data_in[126] ^ data_in[127];
+      lfsr_c[9]  = lfsr_q[1] ^ lfsr_q[7]  ^ lfsr_q[8]  ^ lfsr_q[15]  ^ data_in[7]  ^ data_in[8]  ^ data_in[21] ^ data_in[23] ^ data_in[35] ^ data_in[36] ^ data_in[37] ^ data_in[38] ^ data_in[49] ^ data_in[53] ^ data_in[63] ^ data_in[64] ^ data_in[67] ^ data_in[68] ^ data_in[77] ^ data_in[79] ^ data_in[81] ^ data_in[83] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94]  ^ data_in[95]  ^ data_in[96]  ^ data_in[97]  ^ data_in[98]  ^ data_in[105] ^ data_in[113] ^ data_in[119] ^ data_in[120] ^ data_in[127];
+      lfsr_c[10] = lfsr_q[2] ^ lfsr_q[8]  ^ lfsr_q[9]  ^ data_in[8]  ^ data_in[9]  ^ data_in[22] ^ data_in[24] ^ data_in[36] ^ data_in[37] ^ data_in[38] ^ data_in[39] ^ data_in[50] ^ data_in[54] ^ data_in[64] ^ data_in[65] ^ data_in[68] ^ data_in[69] ^ data_in[78] ^ data_in[80] ^ data_in[82] ^ data_in[84] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96]  ^ data_in[97]  ^ data_in[98]  ^ data_in[99]  ^ data_in[106] ^ data_in[114] ^ data_in[120] ^ data_in[121];
+      lfsr_c[11] = lfsr_q[3] ^ lfsr_q[9]  ^ lfsr_q[10] ^ data_in[9]  ^ data_in[10] ^ data_in[23] ^ data_in[25] ^ data_in[37] ^ data_in[38] ^ data_in[39] ^ data_in[40] ^ data_in[51] ^ data_in[55] ^ data_in[65] ^ data_in[66] ^ data_in[69] ^ data_in[70] ^ data_in[79] ^ data_in[81] ^ data_in[83] ^ data_in[85] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97]  ^ data_in[98]  ^ data_in[99]  ^ data_in[100] ^ data_in[107] ^ data_in[115] ^ data_in[121] ^ data_in[122];
+      lfsr_c[12] = lfsr_q[4] ^ lfsr_q[10] ^ lfsr_q[11] ^ data_in[10] ^ data_in[11] ^ data_in[24] ^ data_in[26] ^ data_in[38] ^ data_in[39] ^ data_in[40] ^ data_in[41] ^ data_in[52] ^ data_in[56] ^ data_in[66] ^ data_in[67] ^ data_in[70] ^ data_in[71] ^ data_in[80] ^ data_in[82] ^ data_in[84] ^ data_in[86] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[98]  ^ data_in[99]  ^ data_in[100] ^ data_in[101] ^ data_in[108] ^ data_in[116] ^ data_in[122] ^ data_in[123];
+      lfsr_c[13] = lfsr_q[5] ^ lfsr_q[11] ^ lfsr_q[12] ^ data_in[11] ^ data_in[12] ^ data_in[25] ^ data_in[27] ^ data_in[39] ^ data_in[40] ^ data_in[41] ^ data_in[42] ^ data_in[53] ^ data_in[57] ^ data_in[67] ^ data_in[68] ^ data_in[71] ^ data_in[72] ^ data_in[81] ^ data_in[83] ^ data_in[85] ^ data_in[87] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[98] ^ data_in[99]  ^ data_in[100] ^ data_in[101] ^ data_in[102] ^ data_in[109] ^ data_in[117] ^ data_in[123] ^ data_in[124];
+      lfsr_c[14] = lfsr_q[6] ^ lfsr_q[12] ^ lfsr_q[13] ^ data_in[12] ^ data_in[13] ^ data_in[26] ^ data_in[28] ^ data_in[40] ^ data_in[41] ^ data_in[42] ^ data_in[43] ^ data_in[54] ^ data_in[58] ^ data_in[68] ^ data_in[69] ^ data_in[72] ^ data_in[73] ^ data_in[82] ^ data_in[84] ^ data_in[86] ^ data_in[88] ^ data_in[96] ^ data_in[97] ^ data_in[98] ^ data_in[99] ^ data_in[100] ^ data_in[101] ^ data_in[102] ^ data_in[103] ^ data_in[110] ^ data_in[118] ^ data_in[124] ^ data_in[125];
+      lfsr_c[15] = lfsr_q[7] ^ lfsr_q[8]  ^ lfsr_q[9]  ^ lfsr_q[10]  ^ lfsr_q[11]  ^ lfsr_q[12]  ^ lfsr_q[14]  ^ lfsr_q[15]  ^ data_in[0]  ^ data_in[1]  ^ data_in[2]  ^ data_in[3]  ^ data_in[4]  ^ data_in[5]  ^ data_in[6]  ^ data_in[7]  ^ data_in[8]  ^ data_in[9]  ^ data_in[10] ^ data_in[11] ^ data_in[12] ^ data_in[14] ^ data_in[15] ^ data_in[16] ^ data_in[17] ^ data_in[18]  ^ data_in[19]  ^ data_in[20]  ^ data_in[21]  ^ data_in[22]  ^ data_in[23]  ^ data_in[24]  ^ data_in[25]  ^ data_in[26]  ^ data_in[29]  ^ data_in[30]  ^ data_in[31]  ^ data_in[32] ^ data_in[33] ^ data_in[34] ^ data_in[35] ^ data_in[36] ^ data_in[37] ^ data_in[38] ^ data_in[39] ^ data_in[40] ^ data_in[42] ^ data_in[44] ^ data_in[45] ^ data_in[46] ^ data_in[47] ^ data_in[48] ^ data_in[49] ^ data_in[50] ^ data_in[51] ^ data_in[52] ^ data_in[53] ^ data_in[54] ^ data_in[59] ^ data_in[60] ^ data_in[61] ^ data_in[62] ^ data_in[63] ^ data_in[64] ^ data_in[65] ^ data_in[66] ^ data_in[67] ^ data_in[68] ^ data_in[70] ^ data_in[71] ^ data_in[72] ^ data_in[74] ^ data_in[75] ^ data_in[76] ^ data_in[77] ^ data_in[78] ^ data_in[79] ^ data_in[80] ^ data_in[81] ^ data_in[82] ^ data_in[85] ^ data_in[86] ^ data_in[89] ^ data_in[90] ^ data_in[91] ^ data_in[92] ^ data_in[93] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[98]  ^ data_in[100] ^ data_in[102] ^ data_in[104] ^ data_in[105] ^ data_in[106] ^ data_in[107] ^ data_in[108] ^ data_in[109] ^ data_in[110] ^ data_in[119] ^ data_in[120] ^ data_in[121] ^ data_in[122] ^ data_in[123] ^ data_in[124] ^ data_in[126] ^ data_in[127];
+    } // end for
+
+    lfsr_c_nomsb=lfsr_c;
+    lfsr_c_nomsb[15]=0;
+
+    return lfsr_c_nomsb;
+}
+
+
+
+namespace hadaq
+{
+  
+  class TrbProcessor;
+
+    /** This is specialized sub-processor for custom data.
+      * It should be used together with TrbProcessor,
+      * which the only can provide data
+      **/
+  class MimosisProcessor : public SubProcessor
+  {
+    friend class TrbProcessor;
+
+    protected:
+      unsigned int nDataErrorChecks = 13; //new.
+      const base::H1handle HandleFrameLength             = MakeH1("FrameSize", "32bit words", 3000, 0, 3000, "ch");
+      TH1* FrameLength       = static_cast<TH1*>(HandleFrameLength);
+      const base::H1handle HandleNumHeaders              = MakeH1("NumHeaders",  "", 2000, 0, 2000, "#");
+      TH1* NumHeaders        = static_cast<TH1*>(HandleNumHeaders);
+      const base::H1handle HandleNumTrailers             = MakeH1("NumTrailers", "Consecutive Frames", 500, 0, 500, "#");
+      TH1* NumTrailers       = static_cast<TH1*>(HandleNumTrailers);
+      const base::H1handle HandleRegionHeaders           = MakeH1("RegionHeaders", "", 64, 0, 63, "#");
+      TH1* RegionHeaders     = static_cast<TH1*>(HandleRegionHeaders);
+      const base::H1handle HandleRegionCounts           = MakeH1("RegionCounts", "", 64, 0, 63, "#");
+      TH1* RegionCounts      = static_cast<TH1*>(HandleRegionCounts);
+      const base::H1handle HandleColumns                 = MakeH1("Columns", "Hits per Column", 1024, 0, 1024, "#");
+      TH1* Columns           = static_cast<TH1*>(HandleColumns);
+      const base::H1handle HandleErrorFlags              = MakeH1("ErrorFlags", "", 9, 0, 9, "Bit");
+      TH1* ErrorFlags        = static_cast<TH1*>(HandleErrorFlags);
+      const base::H2handle HandleFrameLengthDist         = MakeH2("FrameLengthDist", "", 1024,0,1024,1024,0,1024,"this frame ; last frame");
+      TH2* FrameLengthDist   = static_cast<TH2*>(HandleFrameLengthDist);
+      const base::H2handle HandleMatrix                  = MakeH2("Matrix", "", 1024,0,1024,508,0,508);
+      TH2* Matrix            = static_cast<TH2*>(HandleMatrix);
+      const base::H2handle HandleMatrixCurrent           = MakeH2("MatrixCurrent", "", 1024,0,1024,508,0,508);
+      TH2* MatrixCurrent     = static_cast<TH2*>(HandleMatrixCurrent);
+      const base::H2handle HandleMatrixLast              = MakeH2("MatrixLast", "", 1024,0,1024,508,0,508);
+      TH2* MatrixLast        = static_cast<TH2*>(HandleMatrixLast);
+      const base::H1handle HandleLast4096                = MakeH1("Last 4096 Content", "", 4095, 0, 4095, "Last 4096 Content");
+      TH1* Last4096          = static_cast<TH1*>(HandleLast4096);
+      const base::H1handle HandleDataErrorHist           = MakeH1("Data Error Histogram", "", nDataErrorChecks, 0, nDataErrorChecks, "Data Error Histogram");           // new
+      TH1* DataErrorHist     = static_cast<TH1*>(HandleDataErrorHist);                  // new
+      const base::H1handle wrongcrchandle = MakeH1("wrong CRC", "32bit words", 2, 0, 2, "ch");      // FOR CRC TESTS
+      TH1* wrongcrc = static_cast<TH1*>(wrongcrchandle);        // FOR CRC TESTS
+      
+      const base::H1handle HandleDiffFrameCountHist           = MakeH1("DiffFrameCountHist", "", 10000, 2, 10002, "Data Error Histogram");           // new
+      TH1* DiffFrameCountHist     = static_cast<TH1*>(HandleDiffFrameCountHist); 
+
+      unsigned int sensoraddress;
+      unsigned int sensor;
+      unsigned int length = 0;
+      unsigned int region = 0;
+      uint32_t frameCounter = 0;
+      uint32_t frameNumber = 0;
+      uint32_t oldFrameNumber = 0;
+      uint32_t frameCounter2 = 0;
+      TrbProcessor * const trb;
+      
+
+
+       ulong
+       calculate_crc(uint32_t* inputMessage, uint32_t lengthOfArray) { // FOR CRC TESTS
+           std::bitset<16> crc;
+           std::vector<std::bitset<128>> messageLong;
+           long sizeOfInput=lengthOfArray;
+           long stepSize=4;
+       
+           sizeOfInput=(sizeOfInput/stepSize)*stepSize; //truncate last words due to faulty handling in hardware
+       
+           for (long i=0; i<(sizeOfInput/stepSize); i++)
+           {
+               uint32_t tempInt = (inputMessage[4*i+stepSize-1]&0xffff)<<16;
+               tempInt = tempInt|((inputMessage[4*i+stepSize-1]&0xffff0000)>>16);
+       
+               std::bitset<128> messageTemp(tempInt);
+       
+               for(long j=1; j<stepSize; j++)
+               {
+                   messageTemp=messageTemp<<32;
+                   uint32_t tempInt = (inputMessage[4*i+stepSize-1-j]&0xffff)<<16;
+                            tempInt = tempInt|((inputMessage[4*i+stepSize-1-j]&0xffff0000)>>16);
+                   std::bitset<128> lowerBits (tempInt);
+                   messageTemp=messageTemp|lowerBits;
+               }
+               messageLong.push_back(messageTemp);
+           }
+           crc = calc_crc(messageLong);
+           return crc.to_ulong();
+       }
+
+
+
+      virtual bool DecodePixel(const unsigned int& word, unsigned int& column, unsigned int& row) const noexcept
+      {
+        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;
+        return true;
+      }
+
+
+    public:
+      MimosisProcessor(TrbProcessor * const trb, const unsigned subid) noexcept
+        : hadaq::SubProcessor(trb, "%04X", subid)
+        , trb(trb)
+        , sensor(subid-0xa000)
+        , sensoraddress(subid)
+      {}
+
+
+
+      virtual ~MimosisProcessor() noexcept override = default;
+
+
+      /** Scan all messages, find reference signals if returned false, buffer has error and must be discarded */
+      virtual bool FirstBufferScan(const base::Buffer&) noexcept override;
+
+
+      /** Scan buffer for selecting messages inside trigger window */
+      virtual bool SecondBufferScan(const base::Buffer&) const noexcept { return true; }
+  };
+} 
+  
+
+bool hadaq::MimosisProcessor::FirstBufferScan(const base::Buffer& buf) noexcept
+{
+      DataErrorHist->GetXaxis()->SetBinLabel(1,"MisTr");
+      DataErrorHist->GetXaxis()->SetBinLabel(2,"OverflTr");
+      DataErrorHist->GetXaxis()->SetBinLabel(3,"OverflRegTr");
+      DataErrorHist->GetXaxis()->SetBinLabel(4,"OverflSRegTr");
+      DataErrorHist->GetXaxis()->SetBinLabel(5,"FrSzLimTr");
+      DataErrorHist->GetXaxis()->SetBinLabel(6,"ErrChecks");
+      DataErrorHist->GetXaxis()->SetBinLabel(7,"ErrFollFN");
+      DataErrorHist->GetXaxis()->SetBinLabel(8,"ErrFollRA");
+      DataErrorHist->GetXaxis()->SetBinLabel(9,"2HiRA");
+      DataErrorHist->GetXaxis()->SetBinLabel(10,"ErrFollPE");
+      DataErrorHist->GetXaxis()->SetBinLabel(11,"OverflBitRegHead");
+      DataErrorHist->GetXaxis()->SetBinLabel(12,"ErrFollPix");
+      DataErrorHist->GetXaxis()->SetBinLabel(13,"MisHead");
+  
+  const uint32_t len = buf.datalen()/4;
+  uint32_t* arr = static_cast<uint32_t *>(buf.ptr());
+  unsigned int n = 0;
+  unsigned int column, row, lastcolumn = -1, lastrow = -1;
+  unsigned int headers = 0, trailers = 0;
+  unsigned int headersnow = 0;
+  unsigned int lastlength = -1;
+  unsigned int hitcount = 0;
+  uint32_t data;
+  uint32_t currFrameNumber = 0;                  // new
+  uint32_t prevData = 0;
+  uint32_t startCase = 0;
+  uint32_t trailDetected = 0;
+  
+      unsigned int nMissingTrailer = 0;             // new
+      unsigned int nOverflowInTrailer = 1;          // new. 
+      unsigned int nOverflowRegionInTrailer = 2;            // new
+      unsigned int nOverflowSuperRegionInTrailer = 3;           // new
+      unsigned int nFrameSizeLimitInTrailer = 4;            // new
+      unsigned int nIncorrectChecksum = 5;          // new
+      unsigned int nIncorrectFollowingFrameNumber = 6;              // new
+      unsigned int nIncorrectFollowingRegionAddress = 7;            // new
+      unsigned int nTooHighRegionAddress = 8;                   // new
+      unsigned int nIncorrectFollowingPE = 9;         // new
+      unsigned int nOverflowBitInRegionHeader = 10;
+      unsigned int nIncorrectFollowingPix = 11;
+      unsigned int nMissingHeader = 12;
+               int lastRegion = -1;
+               int prevPix    = -1;
+               int prevColumn = -1;
+               
+  uint16_t crcsum = 0;
+  int headerpos = -5;
+
+  for (; n < len; n++) {
+    data = arr[n];
+    length++;
+    
+    int assumeFirstFrameHeader = 1;
+
+// ----------- Begin of frame - store frame header
+    if ((data & 0xFF000000) == 0xFE000000) {
+      headers++;
+      headersnow++;
+      length = 0;
+      startCase = 1;
+      trailDetected = 0;
+      
+      headerpos = ( n-headerpos == 1 ) || ( n-headerpos == 2 ) || ( n-headerpos == 3 ) || ( n-headerpos == 4 ) ? headerpos : n;   // FOR CRC TESTS
+
+      if (headersnow == 1) {
+        oldFrameNumber = frameNumber;                    // new
+        frameNumber = (data & 0xFF0000) >> 16;
+        frameNumber += (data & 0xFF) << 8;
+        if (prevData != 0 && ((prevData & 0xFF000000) != 0xFF000000)) {DataErrorHist->Fill(nMissingTrailer);}             // new.
+      }
+
+      else if (headersnow == 2) {
+        frameNumber += data & 0xFF0000;
+        frameNumber += (data & 0xFF) << 24;
+        DiffFrameCountHist->Fill((frameNumber - oldFrameNumber) % 8000 );
+        frameCounter2++;
+        if ((oldFrameNumber != 0xFFFFFFFF) && oldFrameNumber + 1 != frameNumber && assumeFirstFrameHeader == 0) {
+          cout << frameCounter2 << " " << oldFrameNumber << " " << frameNumber << endl;
+          DataErrorHist->Fill(nIncorrectFollowingFrameNumber);
+        }
+        else if (assumeFirstFrameHeader == 1) {assumeFirstFrameHeader = 0;}
+      }
+      // else {cout << "headearsNowError" << headersnow <<" " << std::hex << data << endl;}
+      /*if ((headersnow == 2) && (oldFrameNumber != 0xFFFFFFFF) && !((oldFrameNumber + 1 == frameNumber) || (oldFrameNumber + 3 == frameNumber))) {
+      cout << oldFrameNumber << " " << frameNumber << endl;
+      DataErrorHist->Fill(nIncorrectFollowingFrameNumber);
+      }*/             // new
+    lastRegion = -1;   // new, declares new frame to check for region headers
+      
+    prevColumn = -1;
+      
+    }
+
+// ---------------- End Frame Header ------------------------
+
+
+
+    
+//End of frame - process frame results and error flags
+    else if ((data & 0xFF000000) == 0xFF000000) {
+      length--;
+      trailers++;
+      frameCounter++;
+      MatrixCurrent->Fill(-1, -1);
+      if (trailDetected == 1 && startCase == 1) {DataErrorHist->Fill(nMissingHeade);}
+      trailDetected = 1;
+      crcsum = data & 0xFFFF;                                                                                                     // FOR CRC TESTS
+      if(crcsum != calculate_crc(arr+headerpos,n-headerpos)) {wrongcrc->Fill(1); DataErrorHist->Fill(nIncorrectChecksum);}        // FOR CRC TESTS
+      else {wrongcrc->Fill(0);}                                                                                                   // FOR CRC TESTS
+   
+      Last4096->SetBinContent(frameNumber % 4096, hitcount);
+      hitcount = 0;
+
+      if (frameCounter == 10000) {
+        MatrixCurrent->Copy(*MatrixLast);
+        MatrixLast->SetName("MatrixLast10000");
+        MatrixCurrent->Reset();
+        RegionCounts->Reset();
+        frameCounter = 0;
+      }
+
+      headersnow = 0;
+      FrameLength->Fill(length);
+
+      if (lastlength != -1) {
+        FrameLengthDist->Fill(length, lastlength);
+      }
+
+      lastlength = length;
+      if (data & 0x00010000)      ErrorFlags->Fill(0);
+      if (data & 0x00020000)      ErrorFlags->Fill(1);
+      if (data & 0x00040000)      ErrorFlags->Fill(2);
+      if (data & 0x00080000)      ErrorFlags->Fill(3);
+      if (data & 0x00100000)      ErrorFlags->Fill(4);
+      if (data & 0x00200000)      ErrorFlags->Fill(5);
+      if (data & 0x00400000)      ErrorFlags->Fill(6);
+      if (data & 0x00800000)      ErrorFlags->Fill(7);
+      if (!(data & 0x00FF0000))   ErrorFlags->Fill(8);
+      
+      if (data & 0x00010000) DataErrorHist->Fill(nOverflowInTrailer);
+      if (data & 0x00020000) DataErrorHist->Fill(nOverflowRegionInTrailer);
+      if (data & 0x00040000) DataErrorHist->Fill(nOverflowSuperRegionInTrailer);
+      if (data & 0x00080000) DataErrorHist->Fill(nFrameSizeLimitInTrailer);
+      
+      /*
+      if (data & 0b0000000100000000) DataErrorHist->Fill(nOverflowInTrailer);
+      if (data & 0b0000001000000000) DataErrorHist->Fill(nOverflowRegionInTrailer);
+      if (data & 0b0000010000000000) DataErrorHist->Fill(nOverflowSuperRegionInTrailer);
+      if (data & 0b0000100000000000) DataErrorHist->Fill(nFrameSizeLimitInTrailer);
+      */
+    }
+
+    else {
+      headersnow = 0;
+
+//----------- New region starts - save region number ------------------
+      if ((data & 0xFF000000) == 0xFD000000) // if region header 
+        {
+        prevPix = -1;
+        if ((((data >> 16) & 0x80) >> 7 )) {         //detected overflow bit
+          DataErrorHist->Fill(nOverflowBitInRegionHeader);      // Fill error histogram -> Overflow bit in region header
+          cout << "Overflow in Buffer!" << endl;
+        }
+        int tmp = (data >> 16) & 0x7F; // extract new region number, ignore overflow bit
+        
+        if (lastRegion != -1 && lastRegion > tmp) { // if new region < region accounting for new frame (lastRegion==-1 if new frame was detected) // new
+          DataErrorHist->Fill(nIncorrectFollowingRegionAddress);                     // new
+        }                                               // new
+        if (tmp > 63) {
+            DataErrorHist->Fill(nTooHighRegionAddress);                     // new
+            continue;
+        }
+        region = tmp;
+        lastRegion = region;
+        RegionHeaders->Fill(region);
+
+//Hit data - decode pixel address and save
+      } 
+      
+      else {
+        DecodePixel(data >> 16, column, row);
+        hitcount++;
+        Columns->Fill(column);
+        Matrix->Fill(column, row);
+        MatrixCurrent->Fill(column, row);
+        RegionCounts->Fill(column/16);
+        if (prevColumn != -1 && prevColumn / 2 > column / 2 ) {DataErrorHist->Fill(nIncorrectFollowingPE); 
+          cout << "Here1!" << endl;
+          cout << prevColumn << " " << column << endl;
+        }
+        if (prevPix != -1 && (data >> 16 != 0xFCAA)) {
+          if (prevPix >= (data >> 16)) {DataErrorHist->Fill(nIncorrectFollowingPix);}
+          prevPix = data >> 16;
+        }
+      prevColumn = column;
+      }
+
+//Second Hit data - decode pixel address and save
+      if ((data & 0x0000FF00) != 0x0000FC00) {
+        DecodePixel(data & 0xFFFF, column, row);
+        hitcount++;
+        Columns->Fill(column);
+        Matrix->Fill(column, row);
+        MatrixCurrent->Fill(column, row);
+        RegionCounts->Fill(column/16);
+        if (prevColumn != -1 && prevColumn / 2 > column / 2) {DataErrorHist->Fill(nIncorrectFollowingPE); 
+          cout << "Here2! " << prevColumn << " " << column/2 << endl;
+          cout << prevColumn << " " << column << endl;
+        }
+        if (prevPix != -1 && ((data & 0xFFFF) != 0xFCAA)) {
+          if (prevPix >= (data & 0xFFFF)) {DataErrorHist->Fill(nIncorrectFollowingPix);}
+          prevPix = data & 0xFFFF;
+        }
+      prevColumn = column;
+      }
+    }                                 // new
+  
+  prevData = data;
+  }
+
+NumHeaders->Fill(headers);
+NumTrailers->Fill(trailers);
+
+return true;
+}
+
+#endif
diff --git a/analysis/datachecks/mimosis.h.save b/analysis/datachecks/mimosis.h.save
new file mode 100644 (file)
index 0000000..d7e4727
--- /dev/null
@@ -0,0 +1,230 @@
+#ifndef MimosisProcessor_h
+#define MimosisProcessor_h
+
+
+#include "hadaq/SubProcessor.h"
+
+
+
+namespace hadaq
+{
+  class TrbProcessor;
+
+    /** This is specialized sub-processor for custom data.
+      * It should be used together with TrbProcessor,
+      * which the only can provide data
+      **/
+  class MimosisProcessor : public SubProcessor
+  {
+    friend class TrbProcessor;
+
+    protected:
+      const base::H1handle HandleFrameLength             = MakeH1("FrameSize", "32bit words", 3000, 0, 3000, "ch");
+      TH1* FrameLength       = static_cast<TH1*>(HandleFrameLength);
+      const base::H1handle HandleNumHeaders              = MakeH1("NumHeaders",  "", 2000, 0, 2000, "#");
+      TH1* NumHeaders        = static_cast<TH1*>(HandleNumHeaders);
+      const base::H1handle HandleNumTrailers             = MakeH1("NumTrailers", "Consecutive Frames", 500, 0, 500, "#");
+      TH1* NumTrailers       = static_cast<TH1*>(HandleNumTrailers);
+      const base::H1handle HandleRegionHeaders           = MakeH1("RegionHeaders", "", 64, 0, 63, "#");
+      TH1* RegionHeaders     = static_cast<TH1*>(HandleRegionHeaders);
+      const base::H1handle HandleRegionCounts           = MakeH1("RegionCounts", "", 64, 0, 63, "#");
+      TH1* RegionCounts      = static_cast<TH1*>(HandleRegionCounts);
+      const base::H1handle HandleColumns                 = MakeH1("Columns", "Hits per Column", 1024, 0, 1024, "#");
+      TH1* Columns           = static_cast<TH1*>(HandleColumns);
+      const base::H1handle HandleErrorFlags              = MakeH1("ErrorFlags", "", 9, 0, 9, "Bit");
+      TH1* ErrorFlags        = static_cast<TH1*>(HandleErrorFlags);
+      const base::H2handle HandleFrameLengthDist         = MakeH2("FrameLengthDist", "", 1024,0,1024,1024,0,1024,"this frame ; last frame");
+      TH2* FrameLengthDist   = static_cast<TH2*>(HandleFrameLengthDist);
+      const base::H2handle HandleMatrix                  = MakeH2("Matrix", "", 1024,0,1024,508,0,508);
+      TH2* Matrix            = static_cast<TH2*>(HandleMatrix);
+      const base::H2handle HandleMatrixCurrent           = MakeH2("MatrixCurrent", "", 1024,0,1024,508,0,508);
+      TH2* MatrixCurrent     = static_cast<TH2*>(HandleMatrixCurrent);
+      const base::H2handle HandleMatrixLast              = MakeH2("MatrixLast", "", 1024,0,1024,508,0,508);
+      TH2* MatrixLast        = static_cast<TH2*>(HandleMatrixLast);
+      const base::H1handle HandleLast4096                = MakeH1("Last 4096 Content", "", 4095, 0, 4095, "Last 4096 Content");
+      TH1* Last4096          = static_cast<TH1*>(HandleLast4096);
+
+      const base::H1handle HandleDataErrorHist           = MakeH1("Data Error Histogram", "", nDataErrorChecks, 0, nDataErrorChecks, "Data Error Histogram");           // new
+      TH1* DataErrorHist     = static_cast<TH1*>(HandleDataErrorHist);                  // new
+
+      unsigned int sensoraddress;
+      unsigned int sensor;
+      unsigned int length = 0;
+      unsigned int region = 0;
+      unsigned int frameCounter = 0;
+      unsigned int frameNumber = 0;
+      unsigned int lastRegion = 0;
+      TrbProcessor * const trb;
+
+      unsigned int nDataErrorChecks = 6; //new. missing trailer, incorrect frame number in trailer, incorrect checksum, incorrect following frame number in following header, incorrectly following region addresses, region address > 63. 
+      unsigned int nMissingTrailer = 1;             // new
+      unsigned int nFrameOverflowInTrailer = 2;
+      unsigned int nRegionOverflowInTrailer = 3;
+      unsigned int nSuperRegionOverflowInTrailer = 4;
+      un
+      unsigned int nIncorrectChecksum = 3;          // new
+      unsigned int nIncorrectFollowingFrameNumber = 4;              // new
+      unsigned int nIncorrectFollowingRegionAddress = 5;            // new
+      unsigned int nTooHighRegionAddress = 6;                   // new
+
+      virtual bool DecodePixel(const unsigned int& word, unsigned int& column, unsigned int& row) const noexcept
+      {
+        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;
+        return true;
+      }
+
+
+    public:
+      MimosisProcessor(TrbProcessor * const trb, const unsigned subid) noexcept
+        : hadaq::SubProcessor(trb, "%04X", subid)
+        , trb(trb)
+        , sensor(subid-0xa000)
+        , sensoraddress(subid)
+      {}
+
+
+
+      virtual ~MimosisProcessor() noexcept override = default;
+
+
+      /** Scan all messages, find reference signals if returned false, buffer has error and must be discarded */
+      virtual bool FirstBufferScan(const base::Buffer&) noexcept override;
+
+
+      /** Scan buffer for selecting messages inside trigger window */
+      virtual bool SecondBufferScan(const base::Buffer&) const noexcept { return true; }
+  };
+}
+
+
+
+bool hadaq::MimosisProcessor::FirstBufferScan(const base::Buffer& buf) noexcept
+{
+  const uint32_t len = buf.datalen()/4;
+  const uint32_t* arr = static_cast<uint32_t *>(buf.ptr());
+  unsigned int n = 0;
+  unsigned int column, row, lastcolumn = -1, lastrow = -1;
+  unsigned int headers = 0, trailers = 0;
+  unsigned int headersnow = 0;
+  unsigned int lastlength = -1;
+  unsigned int hitcount = 0;
+  uint32_t data;
+  uint32_t currFrameNumber = 0                  // new
+  unit32_t prevData = 0;
+
+  for (; n < len; n++) {
+    data = arr[n];
+    length++;
+
+//Begin of frame - store frame header
+    if ((data & 0xFF000000) == 0xFE000000) {
+      headers++;
+      headersnow++;
+      length = 0;
+      uint32_t oldFrameNumber = currFrameNumber                    // new
+
+      if (headersnow == 1) {
+        frameNumber = (data & 0xFF0000) >> 16;
+        frameNumber += (data & 0xFF) << 8;
+      }
+
+      else if (headersnow == 2) {
+        frameNumber += data & 0xFF0000;
+        frameNumber += (data & 0xFF) << 24;
+      }
+      if (currFrameNumber != 0xFEFFFFFF && (oldFrameNumber >= frameNumber)) {DataErrorHist->Fill(nIncorrectFollowingFrameNumber);}             // new
+      if (prevData =! 0 && ((prevData & 0xFF000000) != 0xFF000000)) {DataErrorHist->Fill(nMissingTrailer);}             // new
+      prevData = data;                                  // new
+    }
+
+//End of frame - process frame results and error flags
+    else if ((data & 0xFF000000) == 0xFF000000) {
+      length--;
+      trailers++;
+      frameCounter++;
+      MatrixCurrent->Fill(-1, -1);
+
+      Last4096->SetBinContent(frameNumber % 4096, hitcount);
+      hitcount = 0;
+
+      if (frameCounter == 10000) {
+        MatrixCurrent->Copy(*MatrixLast);
+        MatrixLast->SetName("MatrixLast10000");
+        MatrixCurrent->Reset();
+        RegionCounts->Reset();
+        frameCounter = 0;
+      }
+
+      headersnow = 0;
+      FrameLength->Fill(length);
+
+      if (lastlength != -1) {
+        FrameLengthDist->Fill(length, lastlength);
+      }
+
+      lastlength = length;
+      if (data & 0x00010000)      ErrorFlags->Fill(0);
+      if (data & 0x00020000)      ErrorFlags->Fill(1);
+      if (data & 0x00040000)      ErrorFlags->Fill(2);
+      if (data & 0x00080000)      ErrorFlags->Fill(3);
+      if (data & 0x00100000)      ErrorFlags->Fill(4);
+      if (data & 0x00200000)      ErrorFlags->Fill(5);
+      if (data & 0x00400000)      ErrorFlags->Fill(6);
+      if (data & 0x00800000)      ErrorFlags->Fill(7);
+      if (!(data & 0x00FF0000))   ErrorFlags->Fill(8);
+    prevData = data;                                // new
+    }
+
+    else {
+      headersnow = 0;
+
+//New region starts - save region number
+      if ((data & 0xFF000000) == 0xFD000000) {
+        lastRegion = region;
+        int tmp = (data >> 16) & 0xFF;
+        if (lastRegion >= tmp) {                        // new
+            DataErrorHist->Fill(nIncorrectFollowingRegionAddress);                     // new
+        }                                               // new
+        if (tmp > 63) {
+            DataErrorHist->Fill(nTooHighRegionAddress);                     // new
+            continue;
+        }
+        region = tmp;
+        RegionHeaders->Fill(region);
+
+//Hit data - decode pixel address and save
+      } else {
+        DecodePixel(data >> 16, column, row);
+        hitcount++;
+        Columns->Fill(column);
+        Matrix->Fill(column, row);
+        MatrixCurrent->Fill(column, row);
+        RegionCounts->Fill(column/16);
+      }
+
+//Second Hit data - decode pixel address and save
+      if ((data & 0x0000FF00) != 0x0000FC00) {
+        DecodePixel(data & 0xFFFF, column, row);
+        hitcount++;
+        Columns->Fill(column);
+        Matrix->Fill(column, row);
+        MatrixCurrent->Fill(column, row);
+        RegionCounts->Fill(column/16);
+      }
+    }
+
+  prevData = data;                                  // new
+  }
+
+NumHeaders->Fill(headers);
+NumTrailers->Fill(trailers);
+
+return true;
+}
+
+#endif
diff --git a/analysis/datachecks/old_second.C b/analysis/datachecks/old_second.C
new file mode 100644 (file)
index 0000000..a8f7363
--- /dev/null
@@ -0,0 +1,266 @@
+#include "base/EventProc.h"
+#include "hadaq/TdcSubEvent.h"
+#include "hadaq/HldProcessor.h"
+#include "TString.h"
+
+//#include "base/Event.h"
+//#include "base/TimeStamp.h"
+// #include "hadaq/HldProcessor.h"
+
+#define MAXCH 64
+
+class SecondProc : public base::EventProc {
+protected:
+  std::string fTdcId;      //!< tdc id where channels will be selected
+  base::H2handle  hDiff;
+  base::H2handle  hPrevDiff;
+  base::H2handle  hRiseRef;
+
+  base::H2handle  hFineCh;
+  base::H2handle  hFineRiseCh;
+  base::H2handle  hFineFallCh;
+  base::H2handle  hDiffToScint[17];
+  base::H1handle  hScintCor;
+  base::H2handle  hSciTot[4];
+
+
+public:
+
+       SecondProc(const char* procname, const char* _tdcid);
+   virtual void CreateBranch(TTree* t);
+   virtual bool Process(base::Event* ev);
+};
+
+
+
+SecondProc::SecondProc(const char* procname, const char* _tdcid) :
+    base::EventProc(procname),
+    fTdcId(_tdcid)
+{
+   hDiff = MakeH2("Tdiff","Tdiff", MAXCH, 0, MAXCH, 50000, -100, 300, "ns");
+   hPrevDiff = MakeH2("TPrevdiff","TPrevdiff", MAXCH, 0, MAXCH, 50000, -300, 300, "ns");
+   hRiseRef = MakeH2("TRiseRef","Tdiffch", MAXCH, 0, MAXCH, 40000, -100, 100, "ns");
+   hFineCh = MakeH2("Finech","Fine distribution channels", MAXCH, 0, MAXCH, 600, 0, 600, "");
+   hFineRiseCh = MakeH2("FineRisech","Fine rising", MAXCH, 0, MAXCH, 600, 0, 600, "");
+   hFineFallCh = MakeH2("FineFallch","Fine falling", MAXCH, 0, MAXCH, 600, 0, 600, "");
+//
+//    hScintCor = MakeH1("ScintCor","Scint Cor",10000,-100,100,"ns");
+//   for(unsigned i = 9; i<=16; i++) {
+//     hDiffToScint[i] = MakeH2(TString::Format("DiffToScint_%d", i),"to sum26/27", 1000, -50, 0, 150, 0, 50, "ns");
+//     }
+//   for(unsigned i = 0; i<=3; i++) {
+//     hSciTot[i] = MakeH2(TString::Format("hSciTot_%d", i),"", 1000, -5, 5, 800, 0, 400, "ns");
+//     }
+}
+
+
+
+void SecondProc::CreateBranch(TTree* t)
+{
+  // only called when tree is created in first.C
+  // one can ignore
+  // t->Branch(GetName(), fHits, "hits[8]/D");
+}
+
+bool SecondProc::Process(base::Event* ev)
+{
+   hadaq::TdcSubEvent* sub =
+         dynamic_cast<hadaq::TdcSubEvent*> (ev->GetSubEvent(fTdcId));
+  if (!sub) {
+     printf("Fail to find %s\n", fTdcId.c_str());
+     return false;
+  }
+
+   hadaq::HldSubEvent *hld = dynamic_cast<hadaq::HldSubEvent*> (ev->GetSubEvent("HLD"));
+//    if (hld)
+//       printf("HLD: type %u seq %u run %u\n", hld->fMsg.trig_type,
+//                   hld->fMsg.seq_nr, hld->fMsg.run_nr);
+
+  unsigned trigtype = hld->fMsg.trig_type;
+
+  double last_stamp[2000][64];
+  unsigned id = std::stoi(fTdcId.substr(4).c_str());
+//   printf("%u",id);
+
+
+//   double ch0tm = 0,ch1tm=0;
+//   double ch17 = 0, ch24 = 0, ch26 = 0,ch25 = 0;
+//   double tot17 = 0, tot26=0;
+//   double lead = 0;
+  for (unsigned ihit=0;ihit<sub->Size();ihit++) {
+    hadaq::TdcMessageExt &ext = sub->msg(ihit);
+
+    unsigned ch = ext.msg().getHitChannel();
+    unsigned edge = ext.msg().getHitEdge();
+    double stamp = ext.GetGlobalTime(); // here in seconds
+
+
+    if(edge == 1) {
+      last_stamp[id][ch] = stamp;
+      }
+    }
+
+//     if(ch==26 && edge == 1) {ch26 = stamp;}
+//     if(ch==26 && edge == 0) {tot26 = stamp-ch26;}
+//     if(ch==25 && edge == 1) {ch25 = stamp;}
+//
+//     if(ch==17 && edge == 1) {ch17 = stamp;}
+//     if(ch==17 && edge == 0) {tot17 = stamp-ch17;}
+//     if(ch==24 && edge == 1) {ch24 = stamp;}
+//
+//
+//     if(ch==26 && edge == 0 && ch25 != 0 && ch24!=0 && ch17 !=0) {
+//       FillH2(hSciTot[0], ((ch26-ch25))*1E9,(tot26)*1E9);
+//       FillH2(hSciTot[1], ((ch26+ch25)/2-(ch24+ch17)/2)*1E9,(tot26)*1E9);
+//       FillH2(hSciTot[2], ((ch26+ch25)/2-(ch24+ch17)/2)*1E9,(tot17)*1E9);
+//       }
+//
+//     }
+//   ch0tm = (ch26+ch25)/2;
+//   ch1tm = (ch17+ch24)/2;
+//   if (ch26 != 0 && ch25 != 0 && ch24 != 0 && ch17 != 0) {
+//     FillH1(hScintCor,(ch0tm-ch1tm)*1E9);
+//     }
+
+//   if(ch1tm != 0) {
+//     for (unsigned ihit=0;ihit<sub->Size();ihit++) {
+//       hadaq::TdcMessageExt &ext = sub->msg(ihit);
+//       unsigned ch = ext.msg().getHitChannel();
+//
+//       if(ch >= 9 && ch <= 16) {
+//         unsigned edge = ext.msg().getHitEdge();
+//         double stamp = ext.GetGlobalTime(); // here in seconds
+//         if(edge == 1) {
+//           lead = stamp;
+//           }
+//         if(edge == 0) {
+//           FillH2(hDiffToScint[ch], (lead-ch1tm)*1E9,(stamp-lead)*1E9);
+//           }
+//         }
+//       }
+//     }
+
+
+
+
+
+  for (unsigned ihit=0;ihit<sub->Size();ihit++) {
+
+    hadaq::TdcMessageExt &ext = sub->msg(ihit);
+
+    unsigned ch = ext.msg().getHitChannel();
+    unsigned edge = ext.msg().getHitEdge();
+    unsigned fine = ext.msg().getHitTmFine();
+    unsigned coarse = ext.msg().getHitTmCoarse();
+    double stamp = ext.GetGlobalTime(); // here in seconds
+
+//    if(ch > 0 && edge == 1 && id==507) {
+//      FillH2(hDiff, ch, (last_stamp[300][ch]-stamp)*1E9);
+//      }
+    if(ch > 1 && edge == 1) {
+      FillH2(hPrevDiff, ch, (last_stamp[id][ch-1]-stamp)*1E9);
+      }
+
+//     if (ch==0) { ch0tm = stamp; }  // ch0 has absolute time, all other channels relative to ch0
+
+    if( (stamp < 50e-9 && stamp > -10e-9) || ch == 0 || trigtype != 0xd) {
+
+      if(edge == 1) {
+        FillH2(hFineRiseCh, ch, fine);
+//         printf("%i\n",id*64+ch);
+        FillH2(hDiff, ch, (last_stamp[0][0]-stamp)*1E9);
+        last_stamp[id][ch] = stamp;
+        last_stamp[0][0] = stamp;
+
+        FillH2(hRiseRef, ch, stamp*1E9);
+      }
+
+
+      if(edge == 0)
+        FillH2(hFineFallCh, ch, fine);
+
+      FillH2(hFineCh, ch, fine);
+
+    }
+  }
+
+
+
+
+
+//       // failure, but just keep it here
+// //       if (ch>=MAXCH) continue;
+//
+//       // printf("ch %u edge %u stamp %f\n", ch, edge, stamp*1e9);
+
+//       if (edge==0) {
+//          last_rising[ch] = stamp;
+//
+//          }
+//       } else if (!last_rising[ch]) {
+//          // printf(" ToT %f\n", stamp - last_rising[ch]);
+//          FillH1(hToT, stamp - last_rising[ch]);
+//          FillH2(hToTCh, ch, stamp - last_rising[ch]);
+//          last_rising[ch] = 0;
+//       }
+
+  return true;
+}
+
+// void second()
+// {
+//
+// //   for (auto &entry : ev->GetEventsMap())
+// //   printf("Name %s Instance %p\n", entry.first.c_str(), entry.second);
+//
+// //   new SecondProc("x0050", "TDC_0050");
+// //   new SecondProc("x0507", "TDC_0507");
+// //   new SecondProc("x0303", "TDC_0303");
+//   new SecondProc("x0201", "TDC_0201");
+//   new SecondProc("x0203", "TDC_0203");
+// }
+
+
+
+class SecondCreator : public base::EventProc {
+public:
+
+   bool fCreated{false};
+
+   SecondCreator(const char *name) : base::EventProc(name) {}
+
+   virtual bool Process(base::Event* ev)
+   {
+      if (fCreated)
+         return true;
+
+      if (ev->NumSubEvents() == 0)
+         return false;
+
+      for (auto &entry : ev->GetEventsMap()) {
+
+         if (entry.first.compare(0,3,"TDC") == 0) {
+            std::string procname = std::string("x") + entry.first.substr(4);
+            new SecondProc(procname.c_str(), entry.first.c_str());
+            printf("CREATE SECOND for %s\n", entry.first.c_str());
+            fCreated = true;
+         }
+      }
+
+      return true;
+   }
+
+};
+
+
+void second()
+{
+   new SecondCreator("Creator");
+  //new SecondProc("x0050", "TDC_0050");
+  //new SecondProc("x0507", "TDC_0507");
+  //new SecondProc("x0303", "TDC_0303");
+}
+
+
+
+
diff --git a/analysis/datachecks/start.sh b/analysis/datachecks/start.sh
new file mode 100755 (executable)
index 0000000..3a5e1b6
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+sleep 8
+
+if [[ ! -v DAQOPSERVER ]]; then
+    echo "DAQOPSERVER not set."
+elif [[ -z "$DAQOPSERVER" ]]; then
+    echo "DAQOPSERVER empty."
+elif [[ "$DAQOPSERVER" == "jspc29:150" ]]; then
+    echo "start go4 for Lab317."
+    source /d/jspc37/soft/trb3/trb3login
+    go4analysis -http 9999 -stream localhost:36789 -disable-asf
+elif [[ "$DAQOPSERVER" == "jspc29:31" ]]; then
+    echo "start go4 for Probestation."
+    source /d/jspc37/soft/trb3/trb3login
+    go4analysis -http 8031 -stream localhost:6788 -disable-asf
+else
+    echo "DAQOPSERVER unknown value."
+fi
+
+bash -i
+
diff --git a/analysis/datachecks/ucrc_t.cpp b/analysis/datachecks/ucrc_t.cpp
new file mode 100644 (file)
index 0000000..8be8e64
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * uCRC_t - is C++ class for calculation CRC any sizes 1-64 bits
+ *
+ *
+ * version 1.4
+ *
+ *
+ * BSD 3-Clause License
+ *
+ * Copyright (c) 2015, Koynov Stas - skojnov@yandex.ru
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <cstdio>
+#include <cerrno>
+#include <utility>
+#include "ucrc_t.h"
+
+
+
+
+
+uCRC_t::uCRC_t(std::string Name,
+               uint8_t     Bits,
+               uint64_t    Poly,
+               uint64_t    Init,
+               bool        RefIn,
+               bool        RefOut,
+               uint64_t    XorOut) noexcept:
+    name   (std::move(Name)),
+    poly   (Poly),
+    init   (Init),
+    xor_out(XorOut),
+    bits   (Bits),
+    ref_in (RefIn),
+    ref_out(RefOut)
+{
+    init_class();
+}
+
+
+
+uCRC_t::uCRC_t(uint8_t  Bits,
+               uint64_t Poly,
+               uint64_t Init,
+               bool     RefIn,
+               bool     RefOut,
+               uint64_t XorOut) noexcept:
+    poly   (Poly),
+    init   (Init),
+    xor_out(XorOut),
+    bits   (Bits),
+    ref_in (RefIn),
+    ref_out(RefOut)
+{
+    init_class();
+}
+
+
+
+int uCRC_t::get_crc(uint64_t &crc, const char *file_name, void *buf, size_t size_buf) const noexcept
+{
+    std::ifstream ifs(file_name, std::ios_base::binary);
+
+    if( !ifs || !buf || !size_buf)
+    {
+        errno = EINVAL;
+        return -1;
+    }
+
+    return get_crc(crc, ifs, buf, size_buf);
+}
+
+
+
+int uCRC_t::get_crc(uint64_t &crc, std::ifstream &ifs, void *buf, size_t size_buf) const noexcept
+{
+    crc = crc_init;
+
+    while( ifs )
+    {
+        ifs.read(static_cast<char *>(buf), size_buf);
+        crc = get_raw_crc(buf, ifs.gcount(), crc);
+    }
+
+    crc = get_end_crc(crc);
+
+    return (ifs.rdstate() & std::ios_base::badbit); //return 0 if all good
+}
+
+
+
+uint64_t uCRC_t::get_raw_crc(const void* data, size_t len, uint64_t raw_crc) const noexcept
+{
+    auto buf = static_cast< const uint8_t* >(data);
+
+
+    if(bits > 8)
+    {
+        if(ref_in)
+            while (len--)
+                raw_crc = (raw_crc >> 8) ^ crc_table[ (raw_crc ^ *buf++) & 0xff ];
+        else
+            while (len--)
+                raw_crc = (raw_crc << 8) ^ crc_table[ ((raw_crc >> shift) ^ *buf++) & 0xff ];
+    }
+    else
+    {
+        if (ref_in)
+            while (len--)
+                raw_crc = crc_table[ (raw_crc ^ *buf++) & 0xff ];
+        else
+            while (len--)
+                raw_crc = crc_table[ ((raw_crc << shift) ^ *buf++) & 0xff ];
+    }
+
+
+    return raw_crc;
+}
+
+
+
+uint64_t uCRC_t::reflect(uint64_t data, uint8_t num_bits) noexcept
+{
+    uint64_t reflection = 0;
+
+    while( num_bits-- )
+    {
+        reflection = (reflection << 1) | (data & 1);
+        data >>= 1;
+    }
+
+    return reflection;
+}
+
+
+
+void uCRC_t::init_crc_table() noexcept
+{
+    //Calculation of the standard CRC table for byte.
+    for(int i = 0; i < 256; i++)
+    {
+        uint64_t crc = 0;
+
+        for(uint8_t mask = 0x80; mask; mask >>= 1)
+        {
+
+            if ( i & mask )
+                crc ^= top_bit;
+
+
+            if (crc & top_bit)
+            {
+                crc <<= 1;
+                crc ^= poly;
+            }
+            else
+                crc <<= 1;
+        }
+
+        crc &= crc_mask; //for CRC not power 2
+
+        if(ref_in)
+            crc_table[reflect(i, 8)] = reflect(crc, bits);
+        else
+            crc_table[i] = crc;
+    }
+}
+
+
+
+void uCRC_t::init_class() noexcept
+{
+    top_bit  = (uint64_t)1 << (bits - 1);
+    crc_mask = ( (top_bit - 1) << 1) | 1;
+
+
+    if(bits > 8)
+        shift = (bits - 8);
+    else
+        shift = (8 - bits);
+
+
+    if(ref_in)
+        crc_init = reflect(init, bits);
+    else
+        crc_init = init;
+
+
+    init_crc_table();
+}
diff --git a/analysis/datachecks/ucrc_t.h b/analysis/datachecks/ucrc_t.h
new file mode 100644 (file)
index 0000000..124ac48
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * uCRC_t - is C++ class for calculation CRC any sizes 1-64 bits
+ *
+ *
+ * version 1.4
+ *
+ *
+ * BSD 3-Clause License
+ *
+ * Copyright (c) 2015, Koynov Stas - skojnov@yandex.ru
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ * more details see https://github.com/KoynovStas/uCRC_t
+ *
+ */
+
+#ifndef UCRC_T_H
+#define UCRC_T_H
+
+#include <cstdint>
+#include <string>
+#include <fstream>    // for std::ifstream
+#include <ios>        // for std::ios_base, etc.
+
+
+
+
+
+class uCRC_t
+{
+    public:
+        explicit uCRC_t(std::string Name   = "CRC-32",
+                        uint8_t     Bits   = 32,
+                        uint64_t    Poly   = 0x04c11db7,
+                        uint64_t    Init   = 0xffffffff,
+                        bool        RefIn  = true,
+                        bool        RefOut = true,
+                        uint64_t    XorOut = 0xffffffff) noexcept;
+
+
+        explicit uCRC_t(uint8_t  Bits,
+                        uint64_t Poly,
+                        uint64_t Init,
+                        bool     RefIn,
+                        bool     RefOut,
+                        uint64_t XorOut) noexcept;
+
+
+        std::string name;
+
+
+        // get param CRC
+        uint8_t  get_bits()    const noexcept { return bits;   }
+        uint64_t get_poly()    const noexcept { return poly;   }
+        uint64_t get_init()    const noexcept { return init;   }
+        uint64_t get_xor_out() const noexcept { return xor_out;}
+        bool     get_ref_in()  const noexcept { return ref_in; }
+        bool     get_ref_out() const noexcept { return ref_out;}
+
+        uint64_t get_top_bit() const noexcept { return top_bit; }
+        uint64_t get_crc_mask()const noexcept { return crc_mask;}
+        uint64_t get_crc_init()const noexcept { return crc_init;} //crc_init = reflect(init, bits) if RefIn, else = init
+        uint64_t get_check()   const noexcept;                    //crc for ASCII string "123456789" (i.e. 313233... (hexadecimal)).
+
+
+        // set param CRC
+        int  set_bits(uint8_t new_value)     noexcept;
+        void set_poly(uint64_t new_value)    noexcept { poly    = new_value; init_class();}
+        void set_init(uint64_t new_value)    noexcept { init    = new_value; init_class();}
+        void set_xor_out(uint64_t new_value) noexcept { xor_out = new_value;}
+        void set_ref_in(bool new_value)      noexcept { ref_in  = new_value; init_class();}
+        void set_ref_out(bool new_value)     noexcept { ref_out = new_value;}
+
+
+        // Calculate methods
+        uint64_t get_crc(const void* data, size_t len) const noexcept;
+        int      get_crc(uint64_t &crc, const char* file_name) const noexcept;
+        int      get_crc(uint64_t &crc, const char* file_name, void* buf, size_t size_buf) const noexcept;
+
+
+        // Calculate for chunks of data
+        uint64_t get_raw_crc(const void* data, size_t len) const noexcept;                   //get raw_crc for first chunk of data
+        uint64_t get_raw_crc(const void* data, size_t len, uint64_t raw_crc) const noexcept; //get raw_crc for chunk of data
+        uint64_t get_end_crc(uint64_t raw_crc) const noexcept;
+
+
+    private:
+        uint64_t poly;
+        uint64_t init;
+        uint64_t xor_out;
+        uint64_t crc_init;  //crc_init = reflect(init, bits) if RefIn, else = init
+        uint64_t top_bit;
+        uint64_t crc_mask;
+        uint64_t crc_table[256];
+
+        uint8_t  bits;
+        uint8_t  shift;
+        bool     ref_in;
+        bool     ref_out;
+
+
+        static uint64_t reflect(uint64_t data, uint8_t num_bits) noexcept;
+        void init_crc_table() noexcept;
+        void init_class() noexcept;
+
+        int  get_crc(uint64_t &crc, std::ifstream& ifs, void* buf, size_t size_buf) const noexcept;
+};
+
+
+
+
+
+inline uint64_t uCRC_t::get_check() const noexcept
+{
+    const uint8_t data[] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
+
+    return get_crc(data, sizeof(data));
+}
+
+
+
+inline int uCRC_t::set_bits(uint8_t new_value) noexcept
+{
+    if( (new_value < 1) || (new_value > 64) )
+        return -1; //error
+
+    bits = new_value;
+    init_class();
+
+    return 0; //good job
+}
+
+
+
+inline uint64_t uCRC_t::get_crc(const void* data, size_t len) const noexcept
+{
+    uint64_t crc = get_raw_crc(data, len, crc_init);
+
+    return get_end_crc(crc);
+}
+
+
+
+inline int uCRC_t::get_crc(uint64_t& crc, const char* file_name) const noexcept
+{
+    char buf[4096];
+
+    return get_crc(crc, file_name, buf, sizeof(buf));
+}
+
+
+
+inline uint64_t uCRC_t::get_raw_crc(const void* data, size_t len) const noexcept
+{
+    return get_raw_crc(data, len, crc_init);
+}
+
+
+
+inline uint64_t uCRC_t::get_end_crc(uint64_t raw_crc) const noexcept
+{
+    if(ref_out^ref_in) raw_crc = reflect(raw_crc, bits);
+
+    raw_crc ^= xor_out;
+    raw_crc &= crc_mask; //for CRC not power 2
+
+    return raw_crc;
+}
+
+
+
+
+
+#endif // UCRC_T_H