80 std::vector<const xAOD::PixelCluster*>& monitored_list,
81 std::vector<const xAOD::PixelCluster*>& reference_list,
82 const std::string& module_id,
84 std::pair<const xAOD::PixelCluster*, const xAOD::PixelCluster*>>& pairs)
const
88 std::vector<std::set<Identifier>> monitored_rdo_sets;
89 std::vector<std::set<Identifier>> reference_rdo_sets;
91 for (
const auto* c : monitored_list) {
92 const auto& rdoListRange = c->rdoList();
93 std::vector<Identifier> rdoList(rdoListRange.begin(), rdoListRange.end());
94 monitored_rdo_sets.emplace_back(rdoList.begin(), rdoList.end());
97 for (
const auto* c : reference_list) {
98 const auto& rdoListRange = c->rdoList();
99 std::vector<Identifier> rdoList(rdoListRange.begin(), rdoListRange.end());
100 reference_rdo_sets.emplace_back(rdoList.begin(), rdoList.end());
104 std::vector<std::pair<int, int>> matched_pairs;
105 std::vector<int> unmatched_monitored;
106 std::set<int> unmatched_reference;
108 for (
size_t j = 0; j < reference_rdo_sets.size(); ++j) {
109 unmatched_reference.insert(j);
112 for (
size_t i = 0; i < monitored_rdo_sets.size(); ++i) {
114 bool found_match =
false;
115 for (
size_t j = 0; j < reference_rdo_sets.size(); ++j) {
116 if (monitored_rdo_sets[i] == reference_rdo_sets[j]) {
117 matched_pairs.emplace_back(i, j);
118 pairs.emplace_back(monitored_list.at(i), reference_list.at(j));
120 unmatched_reference.erase(j);
125 unmatched_monitored.push_back(i);
130 if (!unmatched_monitored.empty() || !unmatched_reference.empty()) {
132 <<
": cluster mismatch detected!");
133 if (!unmatched_monitored.empty()) {
135 << unmatched_monitored.size() <<
"):");
136 for (
int i : unmatched_monitored) {
151 << monitored_cov(1, 1) <<
")");
155 if (!unmatched_reference.empty()) {
156 ATH_MSG_DEBUG(
" Unmatched reference clusters (" << unmatched_reference.size()
158 for (
int j : unmatched_reference) {
175 << reference_cov(1, 1) <<
")");
179 ATH_MSG_DEBUG(
"------------------------------------------------------------");
185 std::vector<const xAOD::StripCluster*>& monitored_list,
186 std::vector<const xAOD::StripCluster*>& reference_list,
187 const std::string& module_id,
189 std::pair<const xAOD::StripCluster*, const xAOD::StripCluster*>>& pairs)
const
193 std::vector<std::set<Identifier>> monitored_rdo_sets;
194 std::vector<std::set<Identifier>> reference_rdo_sets;
196 for (
const auto* c : monitored_list) {
197 const auto& rdoListRange = c->rdoList();
198 std::vector<Identifier> rdoList(rdoListRange.begin(), rdoListRange.end());
199 monitored_rdo_sets.emplace_back(rdoList.begin(), rdoList.end());
202 for (
const auto* c : reference_list) {
203 const auto& rdoListRange = c->rdoList();
204 std::vector<Identifier> rdoList(rdoListRange.begin(), rdoListRange.end());
205 reference_rdo_sets.emplace_back(rdoList.begin(), rdoList.end());
209 std::vector<std::pair<int, int>> matched_pairs;
210 std::vector<int> unmatched_monitored;
211 std::set<int> unmatched_reference;
213 for (
size_t j = 0; j < reference_rdo_sets.size(); ++j) {
214 unmatched_reference.insert(j);
217 for (
size_t i = 0; i < monitored_rdo_sets.size(); ++i) {
218 bool found_match =
false;
219 for (
size_t j = 0; j < reference_rdo_sets.size(); ++j) {
220 if (monitored_rdo_sets[i] == reference_rdo_sets[j]) {
221 matched_pairs.emplace_back(i, j);
222 pairs.emplace_back(monitored_list.at(i), reference_list.at(j));
224 unmatched_reference.erase(j);
229 unmatched_monitored.push_back(i);
234 if (!unmatched_monitored.empty() || !unmatched_reference.empty()) {
236 <<
": cluster mismatch detected!");
237 if (!unmatched_monitored.empty()) {
239 << unmatched_monitored.size() <<
"):");
240 for (
int i : unmatched_monitored) {
253 ATH_MSG_DEBUG(
" Monitored: (" << monitored_cov(0, 0) <<
")");
257 if (!unmatched_reference.empty()) {
258 ATH_MSG_DEBUG(
" Unmatched reference clusters (" << unmatched_reference.size()
260 for (
int j : unmatched_reference) {
274 ATH_MSG_DEBUG(
" Reference: (" << reference_cov(0, 0) <<
")");
278 ATH_MSG_DEBUG(
"------------------------------------------------------------");
283 const EventContext& eventContext, std::unordered_map<const xAOD::PixelCluster*, const xAOD::PixelCluster*>& pixel_cluster_matches, std::unordered_map<const xAOD::StripCluster*, const xAOD::StripCluster*>& strip_cluster_matches)
const
287 "============================================================");
296 "============================================================");
302 monitoredPixelClustersHandle.
cptr();
308 monitoredStripClustersHandle.
cptr();
314 referencePixelClustersHandle.
cptr();
320 referenceStripClustersHandle.
cptr();
322 size_t t_n_pixel = monitoredPixelClusters->
size();
323 size_t t_n_strip = monitoredStripClusters->
size();
324 size_t a_n_pixel = referencePixelClusters->
size();
325 size_t a_n_strip = referenceStripClusters->
size();
327 ATH_MSG_DEBUG(
" Monitored/reference pixel clusters " << t_n_pixel <<
" / "
329 ATH_MSG_DEBUG(
" Monitored/reference strip clusters " << t_n_strip <<
" / "
332 if (t_n_pixel != a_n_pixel) {
333 ATH_MSG_DEBUG(
"[ERROR] mismatched pixel cluster numbers found!");
334 ATH_MSG_DEBUG(
" Monitored/reference clusters " << t_n_pixel <<
" / "
337 if (t_n_strip != a_n_strip) {
338 ATH_MSG_DEBUG(
"[ERROR] mismatched strip cluster numbers found!");
339 ATH_MSG_DEBUG(
" Monitored/reference clusters " << t_n_strip <<
" / "
344 std::map<std::string, std::vector<const xAOD::PixelCluster*>>
345 monitored_pixel_map, reference_pixel_map;
346 std::map<std::string, std::vector<const xAOD::StripCluster*>>
347 monitored_strip_map, reference_strip_map;
349 for (
const auto* c : *monitoredPixelClusters) {
350 monitored_pixel_map[std::to_string(c->identifierHash())].push_back(c);
352 for (
const auto* c : *monitoredStripClusters) {
353 monitored_strip_map[std::to_string(c->identifierHash())].push_back(c);
355 for (
const auto* c : *referencePixelClusters) {
356 reference_pixel_map[std::to_string(c->identifierHash())].push_back(c);
358 for (
const auto* c : *referenceStripClusters) {
359 reference_strip_map[std::to_string(c->identifierHash())].push_back(c);
363 std::set<std::string> pixel_modules, strip_modules;
364 for (
const auto& [key, _] : monitored_pixel_map)
365 pixel_modules.insert(key);
366 for (
const auto& [key, _] : reference_pixel_map)
367 pixel_modules.insert(key);
368 for (
const auto& [key, _] : monitored_strip_map)
369 strip_modules.insert(key);
370 for (
const auto& [key, _] : reference_strip_map)
371 strip_modules.insert(key);
373 int pixel_unequal = 0, strip_unequal = 0;
374 int matched_pixel = 0, matched_strip = 0;
375 int pixel_pos_diff_0p5sig = 0;
376 int pixel_pos_diff_0p25sig = 0;
377 int pixel_pos_diff_1sig = 0;
378 int strip_pos_diff_0p5sig = 0;
379 int strip_pos_diff_0p25sig = 0;
380 int strip_pos_diff_1sig = 0;
382 ATH_MSG_DEBUG(
"Pixel/Strip modules " << pixel_modules.size() <<
" / "
383 << strip_modules.size());
386 "============================================================");
389 for (
const auto& hid : pixel_modules) {
390 auto& tpixel = monitored_pixel_map[hid];
391 auto& apixel = reference_pixel_map[hid];
393 if (tpixel.empty() && apixel.empty())
396 if (tpixel.size() != apixel.size()) {
398 <<
": mismatched clusters found!");
400 <<
" and monitored found " << tpixel.size() <<
" clusters!");
406 std::pair<const xAOD::PixelCluster*, const xAOD::PixelCluster*>>
410 matched_pixel += pixel_pairs.size();
413 for (
const auto&
pair : pixel_pairs) {
417 (pixel_cluster_matches)[
pair.first] =
pair.second;
424 double l_pos_diff = std::sqrt(l_dx * l_dx + l_dy * l_dy);
434 std::sqrt(g_dx * g_dx + g_dy * g_dy + g_dz * g_dz);
437 Eigen::Matrix<float, 2, 2> monitored_cov =
439 Eigen::Matrix<float, 2, 2> reference_cov =
447 monitored_element->
design());
451 double monitored_lorentz_shift =
456 if (std::abs(l_dx / (std::sqrt(monitored_cov(0, 0)))) > 0.25 ||
457 std::abs(l_dy / (std::sqrt(monitored_cov(1, 1)))) > 0.25) {
458 pixel_pos_diff_0p25sig++;
462 ATH_MSG_DEBUG(
"Lorentz shift: " << std::fixed << std::setprecision(9) << monitored_lorentz_shift);
474 <<
", Δr = " << l_pos_diff);
477 << monitored_cov(1, 1) <<
")");
479 << reference_cov(1, 1) <<
")");
480 ATH_MSG_DEBUG(
" Δx = " << monitored_cov(0, 0) - reference_cov(0, 0)
482 << monitored_cov(1, 1) - reference_cov(1, 1));
485 const auto& rdoListRange = monitored_cluster->
rdoList();
486 std::vector<Identifier> monitored_rdoList(
487 rdoListRange.begin(), rdoListRange.end());
488 for (
auto rdoIter : monitored_rdoList) {
491 std::array<InDetDD::PixelDiodeTree::CellIndexType, 2>
499 <<
", position: " << si_param.
position()[0]
523 if (std::abs(l_dx / (std::sqrt(monitored_cov(0, 0)))) > 0.5 ||
524 std::abs(l_dy / (std::sqrt(monitored_cov(1, 1)))) > 0.5) {
525 pixel_pos_diff_0p5sig++;
527 if (std::abs(l_dx / (std::sqrt(monitored_cov(0, 0)))) > 1 ||
528 std::abs(l_dy / (std::sqrt(monitored_cov(1, 1)))) > 1) {
529 pixel_pos_diff_1sig++;
543 << g_dz <<
", Δr = " << g_pos_diff);
549 "============================================================");
552 "============================================================");
554 for (
const auto& hid : strip_modules) {
555 auto& tstrip = monitored_strip_map[hid];
556 auto& astrip = reference_strip_map[hid];
558 if (tstrip.empty() && astrip.empty())
561 if (tstrip.size() != astrip.size()) {
563 << hid <<
": mismatched clusters found!");
565 <<
" and monitored found "
566 << tstrip.size() <<
" clusters!");
572 std::pair<const xAOD::StripCluster*, const xAOD::StripCluster*>>
576 matched_strip += strip_pairs.size();
579 for (
const auto&
pair : strip_pairs) {
583 (strip_cluster_matches)[
pair.first] =
pair.second;
591 Eigen::Matrix<float, 1, 1> monitored_cov =
593 Eigen::Matrix<float, 1, 1> reference_cov =
600 if (std::abs(pos_diff / (std::sqrt(monitored_cov(0, 0)))) > 0.25) {
601 strip_pos_diff_0p25sig++;
606 double monitored_lorentz_shift =
611 ATH_MSG_DEBUG(
"Lorentz shift: " << std::fixed << std::setprecision(9) << monitored_lorentz_shift);
621 ATH_MSG_DEBUG(
" Monitored: (" << monitored_cov(0, 0) <<
")");
622 ATH_MSG_DEBUG(
" Reference: (" << reference_cov(0, 0) <<
")");
623 ATH_MSG_DEBUG(
" Δx = " << monitored_cov(0, 0) - reference_cov(0, 0));
625 const auto& rdoListRange = monitored_cluster->
rdoList();
626 std::vector<Identifier> monitored_rdoList(
627 rdoListRange.begin(), rdoListRange.end());
629 if (monitored_element->
isBarrel()) {
632 for (
auto rdoIter : monitored_rdoList) {
640 <<
", position: " << loc_pos[0]
641 <<
", " << loc_pos[1]);
648 for (
auto rdoIter : monitored_rdoList) {
657 <<
", posiiton: " << loc_pos[0]
658 <<
", " << loc_pos[1]);
674 if (std::abs(pos_diff / (std::sqrt(monitored_cov(0, 0)))) > 0.5) {
675 strip_pos_diff_0p5sig++;
677 if (std::abs(pos_diff / (std::sqrt(monitored_cov(0, 0)))) > 1) {
678 strip_pos_diff_1sig++;
685 "============================================================");
689 "============================================================");
693 << pixel_pos_diff_1sig <<
" ("
694 << (matched_pixel > 0
695 ? 100.0 * pixel_pos_diff_1sig / matched_pixel
699 << pixel_pos_diff_0p5sig <<
" ("
700 << (matched_pixel > 0
701 ? 100.0 * pixel_pos_diff_0p5sig / matched_pixel
705 << pixel_pos_diff_0p25sig <<
" ("
706 << (matched_pixel > 0
707 ? 100.0 * pixel_pos_diff_0p25sig / matched_pixel
711 "============================================================");
713 "============================================================");
717 << strip_pos_diff_1sig <<
" ("
718 << (matched_strip > 0
719 ? 100.0 * strip_pos_diff_1sig / matched_strip
723 << strip_pos_diff_0p5sig <<
" ("
724 << (matched_strip > 0
725 ? 100.0 * strip_pos_diff_0p5sig / matched_strip
729 << strip_pos_diff_0p25sig <<
" ("
730 << (matched_strip > 0
731 ? 100.0 * strip_pos_diff_0p25sig / matched_strip
735 "============================================================");
748 return StatusCode::SUCCESS;
752 const EventContext& eventContext, std::unordered_map<const xAOD::PixelCluster*, const xAOD::PixelCluster*>& pixel_cluster_matches)
const
764 monitoredSpacepointsHandle.
cptr();
770 referenceSpacepointsHandle.
cptr();
772 size_t t_n_sp = monitoredSpacepoints->
size();
773 size_t a_n_sp = referenceSpacepoints->
size();
775 ATH_MSG_DEBUG(
" Monitored/reference spacepoints " << t_n_sp <<
" / " << a_n_sp);
777 if (t_n_sp != a_n_sp) {
778 ATH_MSG_DEBUG(
"[ERROR] mismatched spacepoint numbers found!");
779 ATH_MSG_DEBUG(
" Monitored/reference spacepoints " << t_n_sp <<
" / "
785 int unmatched_monitored_sp = 0;
786 int unmatched_reference_sp = 0;
787 int sp_global_pos_diff_1mm = 0;
788 int sp_global_pos_diff_5mm = 0;
789 int sp_variance_r_diff = 0;
790 int sp_variance_z_diff = 0;
792 std::vector<std::pair<const xAOD::SpacePoint*, const xAOD::SpacePoint*>>
794 std::set<const xAOD::SpacePoint*> matched_reference_sp;
796 for (
const auto* monitored_sp : *monitoredSpacepoints) {
798 const auto& monitored_measurements = monitored_sp->measurements();
801 bool found_match =
false;
802 for (
const auto* reference_sp : *referenceSpacepoints) {
804 const auto& reference_measurements = reference_sp->measurements();
807 if (monitored_measurements.size() != reference_measurements.size())
811 bool all_clusters_match =
true;
812 for (
size_t i = 0; i < monitored_measurements.size(); ++i) {
814 monitored_measurements[i];
816 reference_measurements[i];
819 auto monitored_pixel =
821 auto reference_pixel =
824 if (monitored_pixel && reference_pixel) {
825 auto it = pixel_cluster_matches.find(monitored_pixel);
826 if (it == pixel_cluster_matches.end() ||
827 it->second != reference_pixel) {
828 all_clusters_match =
false;
834 "strip spacepoints are not yet handled, skipping pair");
835 all_clusters_match =
false;
840 if (all_clusters_match) {
844 sp_matches.push_back(std::make_pair(monitored_sp, reference_sp));
845 matched_reference_sp.insert(reference_sp);
853 unmatched_monitored_sp++;
857 for (
auto& sp_pair : sp_matches) {
862 double dx = monitored_sp->
x() - reference_sp->
x();
863 double dy = monitored_sp->
y() - reference_sp->
y();
864 double dz = monitored_sp->
z() - reference_sp->
z();
865 double pos_diff = std::sqrt(dx * dx + dy * dy + dz * dz);
869 ATH_MSG_DEBUG(
" Monitored: (" << monitored_sp->
x() <<
", " << monitored_sp->
y()
870 <<
", " << monitored_sp->
z() <<
")");
871 ATH_MSG_DEBUG(
" Reference: (" << reference_sp->
x() <<
", " << reference_sp->
y()
872 <<
", " << reference_sp->
z() <<
")");
873 ATH_MSG_DEBUG(
" Δx = " << dx <<
", Δy = " << dy <<
", Δz = " << dz
874 <<
", Δr = " << pos_diff);
877 sp_global_pos_diff_1mm++;
879 sp_global_pos_diff_5mm++;
889 << reference_sp->
radius() <<
")");
900 sp_variance_r_diff++;
904 sp_variance_z_diff++;
908 unmatched_reference_sp = referenceSpacepoints->
size() - matched_reference_sp.size();
912 "============================================================");
914 ATH_MSG_INFO(
" Total monitored spacepoints: " << t_n_sp);
915 ATH_MSG_INFO(
" Total reference spacepoints: " << a_n_sp);
917 ATH_MSG_INFO(
" Unmatched monitored spacepoints: " << unmatched_monitored_sp);
918 ATH_MSG_INFO(
" Unmatched reference spacepoints: " << unmatched_reference_sp);
920 "============================================================");
923 " Spacepoints with global pos diff > 1 mm: "
924 << sp_global_pos_diff_1mm <<
" ("
925 << (matched_sp > 0 ? 100.0 * sp_global_pos_diff_1mm / matched_sp : 0.0)
928 " Spacepoints with global pos diff > 5 mm: "
929 << sp_global_pos_diff_5mm <<
" ("
930 << (matched_sp > 0 ? 100.0 * sp_global_pos_diff_5mm / matched_sp : 0.0)
933 "============================================================");
936 " Spacepoints with >10% variance R difference: "
937 << sp_variance_r_diff <<
" ("
938 << (matched_sp > 0 ? 100.0 * sp_variance_r_diff / matched_sp : 0.0)
941 " Spacepoints with >10% variance Z difference: "
942 << sp_variance_z_diff <<
" ("
943 << (matched_sp > 0 ? 100.0 * sp_variance_z_diff / matched_sp : 0.0)
946 "============================================================");
959 return StatusCode::SUCCESS;