Unpacker main function for upto version 136.
873{
874
875 int version_check = (rdat[0] >> 12) & 0xf;
876 if (version_check != 15) return;
877
878
879 unsigned char check_sum = (rdat[nnn - 1] >> 24) & 0xFF;
880 unsigned char data_sum = 0;
881 unsigned char kdat[4] = {0};
882 for (int j = nnn - 2; j > -1; j--) {
883 kdat[0] = rdat[j] & 0xff;
884 kdat[1] = (rdat[j] >> 8) & 0xff;
885 kdat[2] = (rdat[j] >> 16) & 0xff;
886 kdat[3] = (rdat[j] >> 24) & 0xff;
887 for (int k = 0; k < 4; k++) {
888 data_sum = data_sum + kdat[k];
889 }
890 }
891
892 int flag_checksum = 0;
893
894 if (check_sum == data_sum) {
895 flag_checksum = 0;
896 } else {
897 flag_checksum = 1;
898 }
899
900
901 int l1_revo = rdat[0] & 0x7ff;
902 int i = 0;
903 int window_num = 0;
904
905
906
907 int summary_data = 0;
908
909 int summary_revo = 0;
910
911 bool summary_trg = false;
912
913 int data_win = 0;
914
915
916
917 int ntc_win = 0;
918 bool tc_trg = false;
919
920 int tc_id = 0;
921 int tc_t = 0;
922 int tc_e = 0;
923 int conv_tc_t = 0;
924 int win3_revo = -9999;
925
926 vector<unsigned> sum_data;
927 vector<vector<unsigned>> sum_info;
928
929 vector<int> tc_data;
930 vector<vector<int>> tc_info;
931 vector<vector<int>> tc_info_FE1;
932 vector<vector<int>> tc_info_FE2;
933 vector<vector<int>> tc_info_BE1;
934 vector<vector<int>> tc_info_BE2;
935
936
937 while (i < nnn - 2) {
938 summary_data = rdat[i + 1];
939 summary_trg = (summary_data >> 23) & 0x1;
940 summary_revo = (summary_data >> 16) & 0x7f;
941 ntc_win = summary_data & 0x3ff;
942 if (ntc_win == 0) {
943 tc_trg = false;
944 } else {
945 tc_trg = true;
946 }
947 data_win = window_num;
948 if (window_num == 3) win3_revo = summary_revo;
949
950 if (summary_trg == true) {
951
952 sum_data.push_back(data_win);
953 sum_data.push_back(summary_revo);
954 for (int j = 0; j < 9; j++) {
955 sum_data.push_back(rdat[i + j + 2]);
956 }
957 sum_info.push_back(sum_data);
958 sum_data.clear();
959 i = i + 11;
960
961 if (tc_trg == true) {
962 for (int j = 0; j < ntc_win; j++) {
963 tc_id = (rdat[i + j] >> 20) & 0x3FF;
964 tc_t = (rdat[i + j] >> 12) & 0x7F;
965 tc_e = rdat[i + j] & 0xFFF;
966 conv_tc_t = (data_win - 3) * 128 + tc_t;
967
968
969 tc_data.push_back(tc_id);
970 tc_data.push_back(conv_tc_t);
971 tc_data.push_back(tc_e);
972 tc_data.push_back(data_win);
973 if (tc_id < 81) {
974 if (tc_id > 75) {
975 tc_info_FE1.push_back(tc_data);
976 } else {
977 tc_info_FE2.push_back(tc_data);
978 }
979 } else if (tc_id > 512) {
980 if (tc_id > 572) {
981 tc_info_BE1.push_back(tc_data);
982 } else {
983 tc_info_BE2.push_back(tc_data);
984 }
985 } else {
986 tc_info.push_back(tc_data);
987 }
988 tc_data.clear();
989 }
990 i = i + ntc_win - 1;
991 }
992
993 } else {
994 if (tc_trg == true) {
995 for (int j = 0; j < ntc_win; j++) {
996 tc_id = (rdat[i + j + 2] >> 20) & 0x3FF;
997 tc_t = (rdat[i + j + 2] >> 12) & 0x7F;
998 conv_tc_t = (data_win - 3) * 128 + tc_t;
999 tc_e = rdat[i + j + 2] & 0xFFF;
1000
1001
1002 tc_data.push_back(tc_id);
1003 tc_data.push_back(conv_tc_t);
1004 tc_data.push_back(tc_e);
1005 tc_data.push_back(data_win);
1006 if (tc_id < 81) {
1007 if (tc_id > 75) {
1008 tc_info_FE1.push_back(tc_data);
1009 } else {
1010 tc_info_FE2.push_back(tc_data);
1011 }
1012 } else if (tc_id > 512) {
1013 if (tc_id > 572) {
1014 tc_info_BE1.push_back(tc_data);
1015 } else {
1016 tc_info_BE2.push_back(tc_data);
1017 }
1018 } else {
1019 tc_info.push_back(tc_data);
1020 }
1021 tc_data.clear();
1022 }
1023 i = i + ntc_win + 1;
1024 } else {
1025 i = i + 1;
1026 }
1027 }
1028 window_num++;
1029 }
1030
1031
1032
1033
1034
1035 int sum_num = 0;
1036
1037 int sum_revo = 0;
1038 int cl_theta[6] = {0};
1039 int cl_phi[6] = {0};
1040 int cl_time[6] = { -9999};
1041 int cl_energy[6] = {0};
1042 int ncl = 0;
1043 int low_multi = 0;
1044 int b2bhabha_v = 0;
1045 int b2bhabha_s = 0;
1046 int mumu = 0;
1047 int prescale = 0;
1048 int icn_over = 0;
1049 int bg_veto = 0;
1050 int icn = 0;
1051 int etot_type = 0;
1052 int etot = 0;
1053 int b1_type = 0;
1054 int b1bhabha = 0;
1055 int physics = 0;
1056 int time_type = 0;
1057 int time = 0;
1058 int ecl_bst = 0;
1059
1060 int m_sumNum = 0;
1061
1064
1065 vector<int> cl_1d;
1066 vector<vector<int>> cl_2d;
1067
1068 vector<int> evt_1d_vector;
1069 vector<vector<int>> evt_2d_vector;
1070
1071
1072 int sum_size = sum_info.size();
1073 if (sum_size != 0) {
1074 for (int j = 0; j < sum_size; j++) {
1075 sum_num = sum_info[j][0];
1076 sum_revo = sum_info[j][1];
1078 ecl_bst = (sum_info[j][2] >> 26) & 0x1;
1079 }
1081 cl_theta[5] = (sum_info[j][2] >> 19) & 0x7f;
1082 cl_phi[5] = (sum_info[j][2] >> 11) & 0xff;
1083 cl_time[5] = (sum_info[j][2] >> 3) & 0xff;
1084 cl_energy[5] = ((sum_info[j][2] & 0x7) << 9) + ((sum_info[j][3] >> 23) & 0x1ff);
1085
1086 cl_theta[4] = (sum_info[j][3] >> 16) & 0x7f;
1087 cl_phi[4] = (sum_info[j][3] >> 8) & 0xff;
1088 cl_time[4] = (sum_info[j][3]) & 0xff;
1089 cl_energy[4] = (sum_info[j][4] >> 20) & 0xfff;
1090
1091 cl_theta[3] = (sum_info[j][4] >> 13) & 0x7f;
1092 cl_phi[3] = (sum_info[j][4] >> 5) & 0xff;
1093 cl_time[3] = ((sum_info[j][4] & 0x1f) << 3) + ((sum_info[j][5] >> 29) & 0x7);
1094 cl_energy[3] = (sum_info[j][5] >> 17) & 0xfff;
1095
1096 cl_theta[2] = (sum_info[j][5] >> 10) & 0x7f;
1097 cl_phi[2] = (sum_info[j][5] >> 2) & 0xff;
1098 cl_time[2] = ((sum_info[j][5] & 0x3) << 6) + ((sum_info[j][6] >> 26) & 0x3f);
1099 cl_energy[2] = (sum_info[j][6] >> 14) & 0xfff;
1100
1101 cl_theta[1] = (sum_info[j][6] >> 7) & 0x7f;
1102 cl_phi[1] = ((sum_info[j][6] & 0x7f) << 1) + ((sum_info[j][7] >> 31) & 0x1);
1103 cl_time[1] = (sum_info[j][7] >> 23) & 0xff;
1104 cl_energy[1] = (sum_info[j][7] >> 11) & 0xfff;
1105
1106 cl_theta[0] = (sum_info[j][7] >> 4) & 0x7f;
1107 cl_phi[0] = ((sum_info[j][7] & 0xf) << 4) + ((sum_info[j][8] >> 28) & 0xf);
1108 cl_time[0] = (sum_info[j][8] >> 20) & 0xff;
1109 cl_energy[0] = (sum_info[j][8] >> 8) & 0xfff;
1110
1111 ncl = (sum_info[j][8] >> 5) & 0x7;
1112
1113 prescale = (sum_info[j][8] >> 4) & 0x1;
1114 mumu = (sum_info[j][8] >> 3) & 0x1;
1115 b2bhabha_s = (sum_info[j][8] >> 2) & 0x1;
1117 low_multi = (((sum_info[j][2] >> 27) & 0x3) << 12) + ((sum_info[j][8] & 0x3) << 10) + ((sum_info[j][9] >> 22) & 0x3ff);
1118 } else {
1119 low_multi = ((sum_info[j][8] & 0x3) << 10) + ((sum_info[j][9] >> 22) & 0x3ff);
1120 }
1121 b2bhabha_v = (sum_info[j][9] >> 21) & 0x1;
1122 icn_over = (sum_info[j][9] >> 20) & 0x1;
1123 bg_veto = (sum_info[j][9] >> 17) & 0x7;
1124 icn = (sum_info[j][9] >> 10) & 0x7f;
1125 etot_type = (sum_info[j][9] >> 7) & 0x7;
1126 etot = ((sum_info[j][9] & 0x7f) << 6) + ((sum_info[j][10] >> 26) & 0x3f);
1127 b1_type = (sum_info[j][10] >> 12) & 0x3fff;
1128 b1bhabha = (sum_info[j][10] >> 11) & 0x1;
1129 physics = (sum_info[j][10] >> 10) & 0x1;
1130 time_type = (sum_info[j][10] >> 7) & 0x7;
1131 time = (sum_info[j][10]) & 0x7f;
1132 } else {
1133 cl_theta[5] = (sum_info[j][2] >> 24) & 0x7f;
1134 cl_phi[5] = (sum_info[j][2] >> 16) & 0xff;
1135 cl_time[5] = (sum_info[j][2] >> 8) & 0xff;
1136 cl_energy[5] = ((sum_info[j][2] & 0xff) << 4) + ((sum_info[j][3] >> 28) & 0xf);
1137
1138 cl_theta[4] = (sum_info[j][3] >> 21) & 0x7f;
1139 cl_phi[4] = (sum_info[j][3] >> 13) & 0xff;
1140 cl_time[4] = (sum_info[j][3] >> 5) & 0xff;
1141 cl_energy[4] = ((sum_info[j][3] & 0x1f) << 7) + ((sum_info[j][4] >> 25) & 0x7f);
1142
1143 cl_theta[3] = (sum_info[j][4] >> 18) & 0x7f;
1144 cl_phi[3] = (sum_info[j][4] >> 10) & 0xff;
1145 cl_time[3] = (sum_info[j][4] >> 2) & 0xff;
1146 cl_energy[3] = ((sum_info[j][4] & 0x3) << 10) + ((sum_info[j][5] >> 22) & 0x3ff);
1147
1148 cl_theta[2] = (sum_info[j][5] >> 15) & 0x7f;
1149 cl_phi[2] = (sum_info[j][5] >> 7) & 0xff;
1150 cl_time[2] = ((sum_info[j][5] & 0x7f) << 1) + ((sum_info[j][6] >> 31) & 0x1);
1151 cl_energy[2] = (sum_info[j][6] >> 19) & 0xfff;
1152
1153 cl_theta[1] = (sum_info[j][6] >> 12) & 0x7f;
1154 cl_phi[1] = (sum_info[j][6] >> 4) & 0xff;
1155 cl_time[1] = ((sum_info[j][6] & 0xf) << 4) + ((sum_info[j][7] >> 28) & 0xf);
1156 cl_energy[1] = (sum_info[j][7] >> 16) & 0xfff;
1157
1158 cl_theta[0] = (sum_info[j][7] >> 9) & 0x7f;
1159 cl_phi[0] = (sum_info[j][7] >> 1) & 0xff;
1160 cl_time[0] = ((sum_info[j][7] & 0x1) << 7) + ((sum_info[j][8] >> 25) & 0x7f);
1161 cl_energy[0] = (sum_info[j][8] >> 13) & 0xfff;
1162
1163 ncl = (sum_info[j][8] >> 10) & 0x7;
1164
1165 low_multi = ((sum_info[j][8] & 0x3ff) << 2) + ((sum_info[j][9] >> 30) & 0x3);
1166 b2bhabha_v = (sum_info[j][9] >> 29) & 0x1;
1167 icn_over = (sum_info[j][9] >> 28) & 0x1;
1168 bg_veto = (sum_info[j][9] >> 25) & 0x7;
1169 icn = (sum_info[j][9] >> 18) & 0x7f;
1170 etot_type = (sum_info[j][9] >> 15) & 0x7;
1171 etot = (sum_info[j][9] >> 2) & 0x1fff;
1172
1173 b1_type = ((sum_info[j][9] & 0x3) << 12) + ((sum_info[j][10] >> 20) & 0xfff);
1174 b1bhabha = (sum_info[j][10] >> 19) & 0x1;
1175 physics = (sum_info[j][10] >> 18) & 0x1;
1176 time_type = (sum_info[j][10] >> 15) & 0x7;
1177 time = (sum_info[j][10] >> 8) & 0x7f;
1178
1179 b2bhabha_s = 0;
1180 mumu = 0;
1181 prescale = 0;
1182 }
1183
1210
1211 for (int k = 0; k < 6; k++) {
1212 cl_1d.push_back(cl_theta[k]);
1213 cl_1d.push_back(cl_phi[k]);
1214 cl_1d.push_back(cl_time[k]);
1215 cl_1d.push_back(cl_energy[k]);
1216 cl_2d.push_back(cl_1d);
1217 cl_1d.clear();
1218 }
1219 sort(cl_2d.begin(), cl_2d.end(),
1220 [](const vector<int>& aa1, const vector<int>& aa2) {return aa1[3] > aa2[3];});
1221
1222 evt_1d_vector.push_back(abs(sum_num - 3));
1223 evt_1d_vector.push_back(sum_revo);
1224 evt_1d_vector.push_back(sum_num);
1225 evt_1d_vector.push_back(time);
1226 for (int k = 0; k < 6; k++) {
1227 evt_1d_vector.push_back(cl_2d[k][0]);
1228 evt_1d_vector.push_back(cl_2d[k][1]);
1229 evt_1d_vector.push_back(cl_2d[k][2]);
1230 evt_1d_vector.push_back(cl_2d[k][3]);
1231 }
1232 cl_2d.clear();
1233 evt_1d_vector.push_back(ncl);
1234 evt_1d_vector.push_back(low_multi);
1235 evt_1d_vector.push_back(b2bhabha_v);
1236 evt_1d_vector.push_back(b2bhabha_s);
1237 evt_1d_vector.push_back(mumu);
1238 evt_1d_vector.push_back(prescale);
1239 evt_1d_vector.push_back(icn);
1240 evt_1d_vector.push_back(icn_over);
1241 evt_1d_vector.push_back(etot_type);
1242 evt_1d_vector.push_back(etot);
1243 evt_1d_vector.push_back(ecl_bst);
1244 evt_1d_vector.push_back(b1_type);
1245 evt_1d_vector.push_back(b1bhabha);
1246 evt_1d_vector.push_back(physics);
1247 evt_1d_vector.push_back(time_type);
1248 evt_2d_vector.push_back(evt_1d_vector);
1249 evt_1d_vector.clear();
1250 }
1251 } else {
1252
1253 for (int k = 0; k < 6; k++) {
1254 cl_theta[k] = 0;
1255 cl_phi[k] = 0;
1256 cl_time[k] = -9999;
1257 cl_energy[k] = 0;
1258 }
1259 ncl = 0;
1260 low_multi = 0;
1261 b2bhabha_v = 0;
1262 b2bhabha_s = 0;
1263 mumu = 0;
1264 prescale = 0;
1265 icn_over = 0;
1266 bg_veto = 0;
1267 icn = 0;
1268 etot_type = 0;
1269 etot = 0;
1270 ecl_bst = 0;
1271 b1_type = 0;
1272 b1bhabha = 0;
1273 physics = 0;
1274 time_type = 0;
1275 time = -9999;
1276
1302 }
1303
1304
1305 tc_info.insert(tc_info.end(), tc_info_FE1.begin(), tc_info_FE1.end());
1306 tc_info.insert(tc_info.end(), tc_info_FE2.begin(), tc_info_FE2.end());
1307 tc_info.insert(tc_info.end(), tc_info_BE1.begin(), tc_info_BE1.end());
1308 tc_info.insert(tc_info.end(), tc_info_BE2.begin(), tc_info_BE2.end());
1309
1310 int m_evtNum = 0;
1311
1312 int m_tcNum = 0;
1313
1314 int m_tcid = 0;
1315
1316 int m_time = -9999;
1317
1318 int m_energy = 0;
1319
1320 int m_win = 0;
1321
1322 int m_revo = 0;
1323
1324 int m_caltime = -9999;
1325
1326 int tot_ntc = tc_info.size();
1327
1328 int evt_ntc = 0;
1329
1330 int evt_revo = -9999;
1331
1332 int evt_win = 0;
1333
1334 int evt_timing = -9999;
1335 int evt_cl_theta[6] = {0};
1336 int evt_cl_phi[6] = {0};
1337 int evt_cl_time[6] = { -9999};
1338 int evt_cl_energy[6] = {0};
1339
1340 int evt_ncl = 0;
1341
1342 int evt_low_multi = 0;
1343
1344 int evt_b2bhabha_v = 0;
1345
1346 int evt_b2bhabha_s = 0;
1347
1348 int evt_mumu = 0;
1349
1350 int evt_prescale = 0;
1351
1352 int evt_icn = 0;
1353
1354 int evt_icn_over = 0;
1355
1356 int evt_etot_type = 0;
1357
1358 int evt_etot = 0;
1359
1360 int evt_ecl_bst = 0;
1361
1362 int evt_b1_type = 0;
1363
1364 int evt_b1bhabha = 0;
1365
1366 int evt_physics = 0;
1367
1368 int evt_time_type = 0;
1369
1370 int evt_etot_all = 0;
1371
1372 int evt_time_min = 0;
1373
1374 int evt_time_max = 0;
1375
1376 int evt_time_win = 0;
1377
1378 int etot_i = 0;
1379
1380 int etot_c = 0;
1381
1382 int etot_f = 0;
1383
1384 int cl_tcid = 0;
1385
1386 int cl_thetaid = 0;
1387
1388 int cl_phiid = 0;
1389
1390 int m_clNum = 0;
1391
1392
1393 int evt_v_size = evt_2d_vector.size();
1394 if (evt_v_size != 0) {
1395
1396 sort(evt_2d_vector.begin(), evt_2d_vector.end(),
1397 [](const vector<int>& aa1, const vector<int>& aa2) {return aa1[0] < aa2[0];});
1398 }
1399
1400 if (tot_ntc != 0 && flag_checksum == 0 && nnn > 7) {
1401 if (evt_v_size == 0) {
1402
1403 sort(tc_info.begin(), tc_info.end(),
1404 [](const vector<int>& aa1, const vector<int>& aa2) {return aa1[2] > aa2[2];});
1405 evt_revo = win3_revo;
1406 evt_win = tc_info[0][3];
1407 evt_timing = tc_info[0][1];
1408 for (int k = 0; k < 6; k++) {
1409 evt_cl_theta[k] = 0;
1410 evt_cl_phi[k] = 0;
1411 evt_cl_time[k] = 0;
1412 evt_cl_energy[k] = 0;
1413 }
1414 evt_ncl = 0;
1415 evt_low_multi = 0;
1416 evt_b2bhabha_v = 0;
1417 evt_b2bhabha_s = 0;
1418 evt_mumu = 0;
1419 evt_prescale = 0;
1420 evt_icn = 0;
1421 evt_icn_over = 0;
1422 evt_etot_type = 0;
1423 evt_etot = 0;
1424 evt_ecl_bst = 0;
1425 evt_b1_type = 0;
1426 evt_b1bhabha = 0;
1427 evt_physics = 0;
1428 evt_time_type = 0;
1429 } else {
1430 evt_revo = evt_2d_vector[0][1];
1431 evt_win = evt_2d_vector[0][2];
1432 evt_timing = evt_2d_vector[0][3];
1433 for (int k = 0; k < 6; k++) {
1434 evt_cl_theta[k] = evt_2d_vector[0][4 + k * 4];
1435 evt_cl_phi[k] = evt_2d_vector[0][5 + k * 4];
1436 evt_cl_time[k] = evt_2d_vector[0][6 + k * 4];
1437 evt_cl_energy[k] = evt_2d_vector[0][7 + k * 4];
1438 }
1439 evt_ncl = evt_2d_vector[0][28];
1440 evt_low_multi = evt_2d_vector[0][29];
1441 evt_b2bhabha_v = evt_2d_vector[0][30];
1442 evt_b2bhabha_s = evt_2d_vector[0][31];
1443 evt_mumu = evt_2d_vector[0][32];
1444 evt_prescale = evt_2d_vector[0][33];
1445 evt_icn = evt_2d_vector[0][34];
1446 evt_icn_over = evt_2d_vector[0][35];
1447 evt_etot_type = evt_2d_vector[0][36];
1448 evt_etot = evt_2d_vector[0][37];
1449 evt_ecl_bst = evt_2d_vector[0][38];
1450 evt_b1_type = evt_2d_vector[0][39];
1451 evt_b1bhabha = evt_2d_vector[0][40];
1452 evt_physics = evt_2d_vector[0][41];
1453 evt_time_type = evt_2d_vector[0][42];
1454 }
1455
1456 sort(tc_info.begin(), tc_info.end(),
1457 [](const vector<int>& aa1, const vector<int>& aa2) {return aa1[0] < aa2[0];});
1458
1459 for (int ii = 0; ii < tot_ntc; ii++) {
1460 m_tcid = tc_info[ii][0];
1461 m_time = tc_info[ii][1];
1462 m_energy = tc_info[ii][2];
1463 m_win = tc_info[ii][3];
1464 m_revo = win3_revo;
1465 m_caltime = m_time - ((evt_win - 3) * 128 + evt_timing);
1476
1477 if (m_win == evt_win || m_win == evt_win + 1) evt_ntc++;
1478 if (m_win == evt_win - 1) {
1479 etot_i += m_energy;
1480 }
1481 if (m_win == evt_win) {
1482 etot_c += m_energy;
1483 }
1484 if (m_win == evt_win + 1) {
1485 etot_f += m_energy;
1486 }
1487 }
1488
1489 if (etot_i == 0 && etot_f == 0) {
1490 evt_etot_all = etot_c;
1491 evt_time_min = - evt_timing;
1492 evt_time_max = 256 - evt_timing;
1493 evt_time_win = 1;
1494 } else if (etot_i >= etot_f) {
1495 evt_etot_all = etot_c + etot_i;
1496 evt_time_min = -128 - evt_timing;
1497 evt_time_max = 128 - evt_timing;
1498 evt_time_win = -1;
1499 } else {
1500 evt_etot_all = etot_c + etot_f;
1501 evt_time_min = - evt_timing;
1502 evt_time_max = 256 - evt_timing;
1503 evt_time_win = 1;
1504 }
1505
1506 for (int icluster = 0; icluster < 6; icluster++) {
1507 if (evt_cl_energy[icluster] == 0 || evt_cl_theta[icluster] == 0 || evt_cl_phi[icluster] == 0) {continue;}
1509 if (cl_tcid == 0) {continue;}
1512
1518
1524 double cl_timing = -1000;
1525 for (int i_tc = 0; i_tc < tot_ntc; i_tc++) {
1526 if (cl_tcid == tc_info[i_tc][0]) {
1527 cl_timing = tc_info[i_tc][1];
1528 break;
1529 }
1530 }
1535 }
1571 } else {
1582
1592 for (int k = 0; k < 6; k++) {
1593 evt_cl_theta[k] = 0;
1594 evt_cl_phi[k] = 0;
1595 evt_cl_time[k] = -9999;
1596 evt_cl_energy[k] = 0;
1597 }
1624 }
1625
1626 return;
1627}