64 std::vector<std::reference_wrapper<Monitored::IMonitoredVariable>> variables;
134 bool overlap =
false;
135 bool mismatchCoreEm =
false;
136 bool mismatchCoreHad =
false;
137 bool mismatchOverlapEm =
false;
138 bool mismatchOverlapHad =
false;
140 mismatchCoreEm =
compareEm(ttMapEm, cpMap, errorsCPM, overlap);
141 mismatchCoreHad =
compareHad(ttMapHad, cpMap, errorsCPM, overlap);
144 mismatchOverlapEm =
compareEm(ttMapEm, ovMap, errorsCPM, overlap);
145 mismatchOverlapHad =
compareHad(ttMapHad, ovMap, errorsCPM, overlap);
151 std::unique_ptr<xAOD::CPMTobRoIContainer> cpmRoiSIM = std::make_unique<xAOD::CPMTobRoIContainer>();
152 std::unique_ptr<xAOD::CPMTobRoIAuxContainer> cpmRoiSIMAux = std::make_unique<xAOD::CPMTobRoIAuxContainer>();
154 cpmRoiSIM.get()->setStore(cpmRoiSIMAux.get());
155 if (mismatchCoreEm || mismatchCoreHad || mismatchOverlapEm ||
156 mismatchOverlapHad) {
157 simulate(&cpMap, &ovMap, cpmRoiSIM.get(), ctx);
159 simulate(&cpMap, cpmRoiSIM.get(), ctx);
165 compare(crSimMap, crMap, errorsCPM, rodTESptr);
170 std::unique_ptr<xAOD::CMXCPTobContainer> cmxCpTobSIM = std::make_unique<xAOD::CMXCPTobContainer>();
171 std::unique_ptr<xAOD::CMXCPTobAuxContainer> cmxCpTobSIMAux = std::make_unique<xAOD::CMXCPTobAuxContainer>();
173 cmxCpTobSIM.get()->setStore(cmxCpTobSIMAux.get());
174 simulate(cpmRoiTESptr, cmxCpTobSIM.get());
178 compare(cbSimMap, cbMap, parityMap, errorsCPM, errorsCMX, rodTESptr);
183 std::unique_ptr<xAOD::CMXCPHitsContainer> cmxLocalSIM = std::make_unique<xAOD::CMXCPHitsContainer>();
184 std::unique_ptr<xAOD::CMXCPHitsAuxContainer> cmxLocalSIMAux = std::make_unique<xAOD::CMXCPHitsAuxContainer>();
185 cmxLocalSIM.get()->setStore(cmxLocalSIMAux.get());
191 cmxLocalSimMap.clear();
200 std::unique_ptr<xAOD::CMXCPHitsContainer> cmxTotalSIM = std::make_unique<xAOD::CMXCPHitsContainer>();
201 std::unique_ptr<xAOD::CMXCPHitsAuxContainer> cmxTotalSIMAux = std::make_unique<xAOD::CMXCPHitsAuxContainer>();
203 cmxTotalSIM->setStore(cmxTotalSIMAux.get());
204 simulate(cmxCpHitsTESptr, cmxTotalSIM.get());
209 cmxTotalSimMap.clear();
214 std::unique_ptr<xAOD::CMXCPHitsContainer> cmxTopoSIM = std::make_unique<xAOD::CMXCPHitsContainer>();
215 std::unique_ptr<xAOD::CMXCPHitsAuxContainer> cmxTopoSIMAux = std::make_unique<xAOD::CMXCPHitsAuxContainer>();
216 cmxTopoSIM.get()->setStore(cmxTopoSIMAux.get());
222 cmxTopoSimMap.clear();
240 const int maxErrorsPerLB=10;
241 bool error_tt{
false}, error_roi{
false}, error_tob{
false}, error_thresh{
false};
250 for (
int loc = 0; loc < cpmBins; ++loc) {
251 if ((errorsCPM[loc] >> err) & 0x1) {
256 const long long eventNumber = ctx.eventID().event_number();
257 if ((errorsCPM[loc + cpmBins] >> err) & 0x1) {
258 cpmErrorLoc_SimNeData=loc;
259 cpmError_SimNeData=err;
264 if (err==0 || err==1) {
267 std::lock_guard<std::mutex> lock(
m_mutex);
269 m_errorLB_tt_counter[
lb]+=1;
272 if (m_errorLB_tt_counter[
lb]<=maxErrorsPerLB) {
284 }
else if (err==2 || err==3) {
287 std::lock_guard<std::mutex> lock(
m_mutex);
289 m_errorLB_roi_counter[
lb]+=1;
292 if (m_errorLB_roi_counter[
lb]<=maxErrorsPerLB) {
304 }
else if (err==4 || err==5) {
307 std::lock_guard<std::mutex> lock(
m_mutex);
309 m_errorLB_tob_counter[
lb]+=1;
312 if(m_errorLB_tob_counter[
lb]<=maxErrorsPerLB) {
328 if ((errorsCMX[loc] >> err) & 0x1) {
329 cpmErrorLoc=loc+cpmBins;
333 if ((errorsCMX[loc + cmxBins] >> err) & 0x1) {
334 cpmErrorLoc_SimNeData=loc+cpmBins;
335 cpmError_SimNeData=err;
339 crateErr[loc /
m_cmxs] |= (1 << err);
349 std::lock_guard<std::mutex> lock(
m_mutex);
351 m_errorLB_thresh_counter[
lb]+=1;
354 if(m_errorLB_thresh_counter[
lb]<=maxErrorsPerLB) {
356 cmx_thresh_y=loc+offset;
372 auto save = std::make_unique<ErrorVector>(crateErr);
376 return StatusCode::FAILURE;
384 return StatusCode::SUCCESS;
389 bool overlap)
const {
431 bool mismatch =
false;
433 TriggerTowerMapEm::const_iterator ttMapIter = ttMap.begin();
434 TriggerTowerMapEm::const_iterator ttMapIterEnd = ttMap.end();
435 CpmTowerMap::const_iterator cpMapIter = cpMap.begin();
436 CpmTowerMap::const_iterator cpMapIterEnd = cpMap.end();
438 while (ttMapIter != ttMapIterEnd || cpMapIter != cpMapIterEnd) {
448 if (ttMapIter != ttMapIterEnd)
449 ttKey = ttMapIter->first;
450 if (cpMapIter != cpMapIterEnd)
451 cpKey = cpMapIter->first;
453 if ((cpMapIter == cpMapIterEnd) ||
454 ((ttMapIter != ttMapIterEnd) && (cpKey > ttKey))) {
460 const int layer = tt->layer();
475 }
else if ((ttMapIter == ttMapIterEnd) ||
476 ((cpMapIter != cpMapIterEnd) && (ttKey > cpKey))) {
484 cpEm = cp->emEnergy();
495 const int layer = tt->layer();
503 cpEm = cp->emEnergy();
518 const int loc = crate *
m_modules + cpm - 1;
521 double phiFPGA =
phi;
523 const double twoPi = 2. *
M_PI;
524 const double piByFour =
M_PI / 4.;
525 if (
phi > 7. * piByFour)
527 else if (
phi < piByFour)
530 const int loc2 =
fpga(crate, phiFPGA);
532 const double phiMod =
phi * (32./
M_PI);
534 if (ttEm && ttEm == cpEm) {
535 errors[loc] |= bitEm;
537 eta_em_PpmEqOverlap=
eta;
538 phi_em_PpmEqOverlap=phiMod;
542 phi_em_PpmEqCor=phiMod;
545 loc_PpmEqCpmFpga=loc;
546 loc_fpga_PpmEqCpmFpga=loc2;
549 }
else if (ttEm != cpEm) {
551 errors[loc + cpmBins] |= bitEm;
554 eta_em_PpmNeOverlap=
eta;
555 phi_em_PpmNeOverlap=phiMod;
559 phi_em_PpmNeCor=phiMod;
562 loc_PpmNeCpmFpga=loc;
563 loc_fpga_PpmNeCpmFpga=loc2;
568 eta_em_PpmNoOverlap=
eta;
569 phi_em_PpmNoOverlap=phiMod;
573 phi_em_PpmNoCor=phiMod;
576 loc_PpmNoCpmFpga=loc;
577 loc_fpga_PpmNoCpmFpga=loc2;
583 eta_em_OverlapNoPpm=
eta;
584 phi_em_OverlapNoPpm=phiMod;
587 eta_em_OverlapNoPpm=
eta;
588 phi_em_OverlapNoPpm=phiMod;
591 loc_CpmNoPpmFpga=loc;
592 loc_fpga_CpmNoPpmFpga=loc2;
596 ATH_MSG_DEBUG(
" EMTowerMismatch key/eta/phi/crate/cpm/tt/cp: "
597 << key <<
"/" <<
eta <<
"/" <<
phi <<
"/" << crate
598 <<
"/" << cpm <<
"/" << ttEm <<
"/" << cpEm);
607 bool overlap)
const {
651 bool mismatch =
false;
653 TriggerTowerMapHad::const_iterator ttMapIter = ttMap.begin();
654 TriggerTowerMapHad::const_iterator ttMapIterEnd = ttMap.end();
655 CpmTowerMap::const_iterator cpMapIter = cpMap.begin();
656 CpmTowerMap::const_iterator cpMapIterEnd = cpMap.end();
658 while (ttMapIter != ttMapIterEnd || cpMapIter != cpMapIterEnd) {
668 if (ttMapIter != ttMapIterEnd)
669 ttKey = ttMapIter->first;
670 if (cpMapIter != cpMapIterEnd)
671 cpKey = cpMapIter->first;
673 if ((cpMapIter == cpMapIterEnd) ||
674 ((ttMapIter != ttMapIterEnd) && (cpKey > ttKey))) {
680 const int layer = tt->layer();
699 }
else if ((ttMapIter == ttMapIterEnd) ||
700 ((cpMapIter != cpMapIterEnd) && (ttKey > cpKey))) {
708 cpHad = cp->hadEnergy();
719 const int layer = tt->layer();
730 cpHad = cp->hadEnergy();
734 if (!ttHad && !cpHad)
745 const int loc = crate *
m_modules + cpm - 1;
748 double phiFPGA =
phi;
750 const double twoPi = 2. *
M_PI;
751 const double piByFour =
M_PI / 4.;
752 if (
phi > 7. * piByFour)
754 else if (
phi < piByFour)
757 const int loc2 =
fpga(crate, phiFPGA);
758 const int loc2Mod = loc2+1;
760 const double phiMod =
phi * (32./
M_PI);
761 if (ttHad && ttHad == cpHad) {
762 errors[loc] |= bitHad;
764 eta_had_PpmEqOverlap=
eta;
765 phi_had_PpmEqOverlap=phiMod;
768 eta_had_PpmEqCor=
eta;
769 phi_had_PpmEqCor=phiMod;
772 loc_PpmEqCpmFpga=loc;
773 loc_fpga_PpmEqCpmFpga=loc2Mod;
777 }
else if (ttHad != cpHad) {
779 errors[loc + cpmBins] |= bitHad;
780 if (ttHad && cpHad) {
782 eta_had_PpmNeOverlap=
eta;
783 phi_had_PpmNeOverlap=phiMod;
786 eta_had_PpmNeCor=
eta;
787 phi_had_PpmNeCor=phiMod;
790 loc_PpmNeCpmFpga=loc;
791 loc_fpga_PpmNeCpmFpga=loc2Mod;
795 eta_had_PpmNoOverlap=
eta;
796 phi_had_PpmNoOverlap=phiMod;
799 eta_had_PpmNoCor=
eta;
800 phi_had_PpmNoCor=phiMod;
803 loc_PpmNoCpmFpga=loc;
804 loc_fpga_PpmNoCpmFpga=loc2Mod;
809 eta_had_OverlapNoPpm=
eta;
810 phi_had_OverlapNoPpm=phiMod;
813 loc_CpmNoPpmFpga=loc;
814 loc_fpga_CpmNoPpmFpga=loc2Mod;
818 ATH_MSG_DEBUG(
" HadTowerMismatch key/eta/phi/crate/cpm/tt/cp: "
819 << key <<
"/" <<
eta <<
"/" <<
phi <<
"/" << crate
820 <<
"/" << cpm <<
"/" << ttHad <<
"/" << cpHad);
837 CpmTobRoiMap::const_iterator simMapIter = roiSimMap.begin();
838 CpmTobRoiMap::const_iterator simMapIterEnd = roiSimMap.end();
839 CpmTobRoiMap::const_iterator datMapIter = roiMap.begin();
840 CpmTobRoiMap::const_iterator datMapIterEnd = roiMap.end();
895 while (simMapIter != simMapIterEnd || datMapIter != datMapIterEnd) {
899 unsigned int simEnergy = 0;
900 unsigned int datEnergy = 0;
901 unsigned int simIsol = 0;
902 unsigned int datIsol = 0;
905 if (simMapIter != simMapIterEnd)
906 simKey = simMapIter->first;
907 if (datMapIter != datMapIterEnd)
908 datKey = datMapIter->first;
910 if ((datMapIter == datMapIterEnd) ||
911 ((simMapIter != simMapIterEnd) && (datKey > simKey))) {
915 roi = simMapIter->second;
916 simEnergy = roi->
energy();
920 }
else if ((simMapIter == simMapIterEnd) ||
921 ((datMapIter != datMapIterEnd) && (simKey > datKey))) {
925 roi = datMapIter->second;
926 datEnergy = roi->
energy();
935 roi = datMapIter->second;
936 simEnergy = roiS->
energy();
938 datEnergy = roi->
energy();
944 if (!simEnergy && !simIsol && !datEnergy && !datIsol)
949 const int crate = roi->
crate();
955 const int cpm = roi->
cpm();
956 const int chip = roi->
chip();
959 const int locX = crate *
m_modules + cpm - 1;
960 const int locY = chip * 8 + local;
964 decoder.coordinate((roi->
roiWord()))
969 if (simEnergy || datEnergy) {
970 if (simEnergy == datEnergy) {
973 tauEnerSimEqDataLocX=locX;
974 tauEnerSimEqDataLocY=locY;
977 emEnerSimEqDataLocX=locX;
978 emEnerSimEqDataLocY=locY;
982 errors[locX + cpmBins] |= bit;
983 if (simEnergy && datEnergy) {
985 tauEnerSimNeDataLocX=locX;
986 tauEnerSimNeDataLocY=locY;
989 emEnerSimNeDataLocX=locX;
990 emEnerSimNeDataLocY=locY;
993 }
else if (simEnergy && !datEnergy) {
995 tauEnerSimNoDataLocX=locX;
996 tauEnerSimNoDataLocY=locY;
999 emEnerSimNoDataLocX=locX;
1000 emEnerSimNoDataLocY=locY;
1005 tauEnerDataNoSimLocX=locX;
1006 tauEnerDataNoSimLocY=locY;
1009 emEnerDataNoSimLocX=locX;
1010 emEnerDataNoSimLocY=locY;
1016 if (simIsol || datIsol) {
1017 if (simIsol == datIsol) {
1018 errors[locX] |= bit;
1020 tauIsolSimEqDataLocX=locX;
1021 tauIsolSimEqDataLocY=locY;
1024 emIsolSimEqDataLocX=locX;
1025 emIsolSimEqDataLocY=locY;
1030 errors[locX + cpmBins] |= bit;
1031 if (simIsol && datIsol) {
1033 tauIsolSimNeDataLocX=locX;
1034 tauIsolSimNeDataLocY=locY;
1037 emIsolSimNeDataLocX=locX;
1038 emIsolSimNeDataLocY=locY;
1041 }
else if (simIsol && !datIsol) {
1043 tauIsolSimNoDataLocX=locX;
1044 tauIsolSimNoDataLocY=locY;
1047 emIsolSimNoDataLocX=locX;
1048 emIsolSimNoDataLocY=locY;
1053 tauIsolDataNoSimLocX=locX;
1054 tauIsolDataNoSimLocY=locY;
1057 emIsolDataNoSimLocX=locX;
1058 emIsolDataNoSimLocY=locY;
1064 const double phiMod = (
phi * (32./
M_PI)) - 0.5;
1065 double etaMod =
eta - 0.05;
1066 if (simEnergy == datEnergy && simIsol == datIsol) {
1067 roiEtaSimEqData=etaMod;
1068 roiPhiSimEqData=phiMod;
1071 if ((simEnergy || simIsol) && (datEnergy || datIsol)) {
1072 roiEtaSimNeData=etaMod;
1073 roiPhiSimNeData=phiMod;
1075 }
else if (!datEnergy && !datIsol) {
1076 roiEtaSimNoData=etaMod;
1077 roiPhiSimNoData=phiMod;
1080 roiEtaDataNoSim=etaMod;
1081 roiPhiDataNoSim=phiMod;
1091 const std::vector<int> & parityMap,
ErrorVector &errorsCPM,
1158 CmxCpTobMap::const_iterator simMapIter = simMap.begin();
1159 CmxCpTobMap::const_iterator simMapIterEnd = simMap.end();
1160 CmxCpTobMap::const_iterator datMapIter = datMap.begin();
1161 CmxCpTobMap::const_iterator datMapIterEnd = datMap.end();
1163 while (simMapIter != simMapIterEnd || datMapIter != datMapIterEnd) {
1175 if (simMapIter != simMapIterEnd)
1176 simKey = simMapIter->first;
1177 if (datMapIter != datMapIterEnd)
1178 datKey = datMapIter->first;
1180 if ((datMapIter == datMapIterEnd) ||
1181 ((simMapIter != simMapIterEnd) && (datKey > simKey))) {
1185 tob = simMapIter->second;
1186 simEnergy = tob->
energy();
1191 }
else if ((simMapIter == simMapIterEnd) ||
1192 ((datMapIter != datMapIterEnd) && (simKey > datKey))) {
1196 tob = datMapIter->second;
1197 datEnergy = tob->
energy();
1207 tob = datMapIter->second;
1208 simEnergy = tobS->
energy();
1211 datEnergy = tob->
energy();
1218 if (!simEnergy && !simIsol && !datEnergy && !datIsol)
1223 const int crate = tob->
crate();
1226 const int cpm = tob->
cpm();
1227 const int cmx = tob->
cmx();
1228 if (!datEnergy && !datIsol) {
1230 if (parityMap[
index])
1236 const int chip = tob->
chip();
1238 const int locX = crate *
m_modules + cpm - 1;
1239 const int locY = chip * 4 + loc;
1240 const int loc2 = crate *
m_cmxs + cmx;
1244 const uint32_t roiWord = ((((((crate << 4) + cpm) << 4) + chip) << 2) + loc)
1247 decoder.coordinate(roiWord));
1251 if (simEnergy || datEnergy) {
1252 if (simEnergy == datEnergy) {
1253 errorsCPM[locX] |= bit;
1254 errorsCMX[loc2] |= bit;
1256 cmxRightEnerSimEqDataLocX=locX;
1257 cmxRightEnerSimEqDataLocY=locY;
1260 cmxLeftEnerSimEqDataLocX=locX;
1261 cmxLeftEnerSimEqDataLocY=locY;
1265 errorsCPM[locX + cpmBins] |= bit;
1266 errorsCMX[loc2 + cmxBins] |= bit;
1267 if (simEnergy && datEnergy) {
1269 cmxRightEnerSimNeDataLocX=locX;
1270 cmxRightEnerSimNeDataLocY=locY;
1273 cmxLeftEnerSimNeDataLocX=locX;
1274 cmxLeftEnerSimNeDataLocY=locY;
1277 }
else if (simEnergy && !datEnergy) {
1279 cmxRightEnerSimNoDataLocX=locX;
1280 cmxRightEnerSimNoDataLocY=locY;
1283 cmxLeftEnerSimNoDataLocX=locX;
1284 cmxLeftEnerSimNoDataLocY=locY;
1289 cmxRightEnerDataNoSimLocX=locX;
1290 cmxRightEnerDataNoSimLocY=locY;
1293 cmxLeftEnerDataNoSimLocX=locX;
1294 cmxLeftEnerDataNoSimLocY=locY;
1300 if (simIsol || datIsol) {
1301 if (simIsol == datIsol) {
1302 errorsCPM[locX] |= bit;
1303 errorsCMX[loc2] |= bit;
1305 cmxRightIsolSimEqDataLocX=locX;
1306 cmxRightIsolSimEqDataLocY=locY;
1309 cmxLeftIsolSimEqDataLocX=locX;
1310 cmxLeftIsolSimEqDataLocY=locY;
1314 errorsCPM[locX + cpmBins] |= bit;
1315 errorsCMX[loc2 + cmxBins] |= bit;
1316 if (simIsol && datIsol) {
1318 cmxRightIsolSimNeDataLocX=locX;
1319 cmxRightIsolSimNeDataLocY=locY;
1322 cmxLeftIsolSimNeDataLocX=locX;
1323 cmxLeftIsolSimNeDataLocY=locY;
1326 }
else if (simIsol && !datIsol) {
1328 cmxRightIsolSimNoDataLocX=locX;
1329 cmxRightIsolSimNoDataLocY=locY;
1332 cmxLeftIsolSimNoDataLocX=locX;
1333 cmxLeftIsolSimNoDataLocY=locY;
1338 cmxRightIsolDataNoSimLocX=locX;
1339 cmxRightIsolDataNoSimLocY=locY;
1342 cmxLeftIsolDataNoSimLocX=locX;
1343 cmxLeftIsolDataNoSimLocY=locY;
1349 if (simOvf || datOvf) {
1350 if (simOvf == datOvf) {
1351 errorsCPM[locX] |= bit;
1352 errorsCMX[loc2] |= bit;
1353 cmxOverLocXSimEqData = locX;
1354 cmxOverCmxSimEqData = cmx;
1357 errorsCPM[locX + cpmBins] |= bit;
1358 errorsCMX[loc2 + cmxBins] |= bit;
1359 cmxOverLocXSimNeData = locX;
1360 cmxOverCmxSimNeData = cmx;
1364 const double phiMod =
phi * (32./
M_PI) - 0.5;
1365 double etaMod =
eta - 0.05;
1366 if (simEnergy == datEnergy && simIsol == datIsol) {
1367 cmxEtaSimEqData=etaMod;
1368 cmxPhiSimEqData=phiMod;
1371 if ((simEnergy || simIsol) && (datEnergy || datIsol)) {
1372 cmxEtaSimNeData=etaMod;
1373 cmxPhiSimNeData=phiMod;
1375 }
else if (!datEnergy && !datIsol) {
1376 cmxEtaSimNoData=etaMod;
1377 cmxPhiSimNoData=phiMod;
1380 cmxEtaDataNoSim=etaMod;
1381 cmxPhiDataNoSim=phiMod;
1395 ATH_MSG_DEBUG(
"Compare Simulated CMX Hit Sums and Data CMX Hit Sums");
1402 if (!local && !remote && !total )
1440 CmxCpHitsMap::const_iterator cmxSimMapIter = cmxSimMap.begin();
1441 CmxCpHitsMap::const_iterator cmxSimMapIterEnd = cmxSimMap.end();
1442 CmxCpHitsMap::const_iterator cmxMapIter = cmxMap.begin();
1443 CmxCpHitsMap::const_iterator cmxMapIterEnd = cmxMap.end();
1445 while (cmxSimMapIter != cmxSimMapIterEnd || cmxMapIter != cmxMapIterEnd) {
1449 unsigned int cmxSimHits0 = 0;
1450 unsigned int cmxSimHits1 = 0;
1451 unsigned int cmxHits0 = 0;
1452 unsigned int cmxHits1 = 0;
1457 if (cmxSimMapIter != cmxSimMapIterEnd)
1458 cmxSimKey = cmxSimMapIter->first;
1459 if (cmxMapIter != cmxMapIterEnd)
1460 cmxKey = cmxMapIter->first;
1462 if ((cmxMapIter == cmxMapIterEnd) ||
1463 ((cmxSimMapIter != cmxSimMapIterEnd) && (cmxKey > cmxSimKey))) {
1481 cmxSimHits0 = cmxS->
hits0();
1482 cmxSimHits1 = cmxS->
hits1();
1483 crate = cmxS->
crate();
1486 }
else if ((cmxSimMapIter == cmxSimMapIterEnd) ||
1487 ((cmxMapIter != cmxMapIterEnd) && (cmxSimKey > cmxKey))) {
1507 cmxHits0 = cmxD->
hits0();
1508 cmxHits1 = cmxD->
hits1();
1509 crate = cmxD->
crate();
1535 cmxSimHits0 = cmxS->
hits0();
1536 cmxSimHits1 = cmxS->
hits1();
1537 cmxHits0 = cmxD->
hits0();
1538 cmxHits1 = cmxD->
hits1();
1539 crate = cmxS->
crate();
1543 if (!cmxSimHits0 && !cmxSimHits1 && !cmxHits0 && !cmxHits1)
1548 if (local || total) {
1549 int loc = crate *
m_cmxs + cmx;
1554 int loc_fill = (local) ? loc : 14 + cmx;
1555 if (cmxSimHits0 == cmxHits0 && cmxSimHits1 == cmxHits1) {
1557 cmx_sum_loc_SimEqData=loc_fill;
1560 errors[loc + cmxBins] |= bit;
1561 if ((cmxSimHits0 || cmxSimHits1) && (cmxHits0 || cmxHits1)) {
1562 cmx_sum_loc_SimNeData=loc_fill;
1564 }
else if (!cmxHits0 && !cmxHits1) {
1565 cmx_sum_loc_SimNoData=loc_fill;
1568 cmx_sum_loc_DataNoSim=loc_fill;
1573 loc = (local) ? loc : 14 + cmx;
1576 const int nThresh = 8;
1577 const int thrLen = 3;
1578 int same0 =
thresholdsSame(cmxHits0, cmxSimHits0, nThresh, thrLen);
1579 int diff0 =
thresholdsDiff(cmxHits0, cmxSimHits0, nThresh, thrLen);
1580 int same1 =
thresholdsSame(cmxHits1, cmxSimHits1, nThresh, thrLen);
1581 int diff1 =
thresholdsDiff(cmxHits1, cmxSimHits1, nThresh, thrLen);
1583 fillXVsThresholds(cmx_x_rightsums_SimEqData,cmx_y_rightsums_SimEqData,cmx_w_rightsums_SimEqData,
1584 loc, same0, nThresh, 1);
1585 fillXVsThresholds(cmx_x_rightsums_SimNeData,cmx_y_rightsums_SimNeData,cmx_w_rightsums_SimNeData,
1586 loc, diff0, nThresh, 1);
1587 const int offset = nThresh;
1588 fillXVsThresholds(cmx_x_rightsums_SimEqData,cmx_y_rightsums_SimEqData,cmx_w_rightsums_SimEqData,
1589 loc, same1, nThresh, 1, offset);
1590 fillXVsThresholds(cmx_x_rightsums_SimNeData,cmx_y_rightsums_SimNeData,cmx_w_rightsums_SimNeData,
1591 loc, diff1, nThresh, 1, offset);
1593 fillXVsThresholds(cmx_x_leftsums_SimEqData,cmx_y_leftsums_SimEqData,cmx_w_leftsums_SimEqData,
1594 loc, same0, nThresh, 1);
1595 fillXVsThresholds(cmx_x_leftsums_SimNeData,cmx_y_leftsums_SimNeData,cmx_w_leftsums_SimNeData,
1596 loc, diff0, nThresh, 1);
1597 const int offset = nThresh;
1598 fillXVsThresholds(cmx_x_leftsums_SimEqData,cmx_y_leftsums_SimEqData,cmx_w_leftsums_SimEqData,
1599 loc, same1, nThresh, 1, offset);
1600 fillXVsThresholds(cmx_x_leftsums_SimNeData,cmx_y_leftsums_SimNeData,cmx_w_leftsums_SimNeData,
1601 loc, diff1, nThresh, 1, offset);
1604 }
else if (remote) {
1607 hits0Sim[crate *
m_cmxs + cmx] = cmxSimHits0;
1608 hits1Sim[crate *
m_cmxs + cmx] = cmxSimHits1;
1612 hits0[remCrate *
m_cmxs + cmx] = cmxHits0;
1613 hits1[remCrate *
m_cmxs + cmx] = cmxHits1;
1617 const int locX = crate *
m_cmxs + cmx;
1621 if (cmxSimHits0 == cmxHits0 && cmxSimHits1 == cmxHits1) {
1622 errors[locX] |= bit;
1623 cmxTopoLocXSimEqData=locX;
1624 cmxTopoLocYSimEqData=locY;
1627 errors[locX + cmxBins] |= bit;
1628 if ((cmxSimHits0 || cmxSimHits1) && (cmxHits0 || cmxHits1)) {
1629 cmxTopoLocXSimNeData=locX;
1630 cmxTopoLocYSimNeData=locY;
1632 }
else if (!cmxHits0 && !cmxHits1) {
1633 cmxTopoLocXSimNoData=locX;
1634 cmxTopoLocYSimNoData=locY;
1637 cmxTopoLocXDataNoSim=locX;
1638 cmxTopoLocYDataNoSim=locY;
1645 for (
int crate = 0; crate <
m_crates - 1; ++crate) {
1646 for (
int cmx = 0; cmx <
m_cmxs; ++cmx) {
1647 int loc = crate *
m_cmxs + cmx;
1650 const unsigned int hd0 = hits0[loc];
1651 const unsigned int hd1 = hits1[loc];
1652 const unsigned int hs0 = hits0Sim[loc];
1653 const unsigned int hs1 = hits1Sim[loc];
1655 if (!hd0 && !hd1 && !hs0 && !hs1)
1658 int loc_fill = loc + 8;
1659 if (hs0 == hd0 && hs1 == hd1) {
1661 cmx_sum_loc_SimEqData=loc_fill;
1664 errors[loc + cmxBins] |= bit;
1665 if ((hs0 || hs1) && (hd0 || hd1)) {
1666 cmx_sum_loc_SimNeData=loc_fill;
1668 }
else if (!hd0 && !hd1) {
1669 cmx_sum_loc_SimNoData=loc_fill;
1672 cmx_sum_loc_DataNoSim=loc_fill;
1680 const int nThresh = 8;
1681 const int thrLen = 3;
1687 fillXVsThresholds(cmx_x_rightsums_SimEqData,cmx_y_rightsums_SimEqData,cmx_w_rightsums_SimEqData,
1688 loc, same0, nThresh, 1);
1689 fillXVsThresholds(cmx_x_rightsums_SimNeData,cmx_y_rightsums_SimNeData,cmx_w_rightsums_SimNeData,
1690 loc, diff0, nThresh, 1);
1691 const int offset = nThresh;
1692 fillXVsThresholds(cmx_x_rightsums_SimEqData,cmx_y_rightsums_SimEqData,cmx_w_rightsums_SimEqData,
1693 loc, same1, nThresh, 1, offset);
1694 fillXVsThresholds(cmx_x_rightsums_SimNeData,cmx_y_rightsums_SimNeData,cmx_w_rightsums_SimNeData,
1695 loc, diff1, nThresh, 1, offset);
1697 fillXVsThresholds(cmx_x_leftsums_SimEqData,cmx_y_leftsums_SimEqData,cmx_w_leftsums_SimEqData,
1698 loc, same0, nThresh, 1);
1699 fillXVsThresholds(cmx_x_leftsums_SimNeData,cmx_y_leftsums_SimNeData,cmx_w_leftsums_SimNeData,
1700 loc, diff0, nThresh, 1);
1701 const int offset = nThresh;
1702 fillXVsThresholds(cmx_x_leftsums_SimEqData,cmx_y_leftsums_SimEqData,cmx_w_leftsums_SimEqData,
1703 loc, same1, nThresh, 1, offset);
1704 fillXVsThresholds(cmx_x_leftsums_SimNeData,cmx_y_leftsums_SimNeData,cmx_w_leftsums_SimNeData,
1705 loc, diff1, nThresh, 1, offset);