364 std::map<Identifier, long int> clusterIDMapIdx;
367 std::map<Identifier, long int> clusterIDMapSpacePointIdx;
371 std::map<std::pair<int, int>, std::pair<bool, int>> allTruthParticles;
375 if (not mcEventCollectionHandle.
isValid()) {
377 return StatusCode::FAILURE;
379 mcCollptr = mcEventCollectionHandle.
cptr();
384 if (not eventInfoHandle.
isValid()) {
386 return StatusCode::FAILURE;
388 eventInfo = eventInfoHandle.
cptr();
393 std::map<int, int> allSubEvents;
397 bool duplicateSubeventID =
false;
398 for (
unsigned int cntr = 0; cntr < mcCollptr->
size(); ++cntr) {
399 int ID = mcCollptr->
at(cntr)->event_number();
407 std::map<int, int>::iterator it = allSubEvents.find(ID);
408 if (it == allSubEvents.end())
409 allSubEvents.insert(std::make_pair(ID, 1));
412 duplicateSubeventID =
true;
416 if (duplicateSubeventID) {
423 (*m_Part_vParentID).clear();
424 (*m_Part_vParentBarcode).clear();
427 for (
unsigned int cntr = 0; cntr < mcCollptr->
size(); ++cntr) {
437 for (
auto p : *genEvt) {
439 float px, py, pz, pt,
eta, vx, vy, vz, radius, status,
charge = 0.;
440 std::vector<int> vParentID;
441 std::vector<int> vParentBarcode;
443 int vProdNin, vProdNout, vProdStatus, vProdBarcode;
444 bool passed =
isPassed(p, px, py, pz, pt,
eta, vx, vy, vz, radius, status,
charge, vParentID, vParentBarcode,
445 vProdNin, vProdNout, vProdStatus, vProdBarcode);
446 allTruthParticles.insert(std::make_pair(std::make_pair(genEvt->event_number(),
HepMC::barcode(p)),
447 std::make_pair(
passed, 0)));
469 (*m_Part_vParentID).push_back(vParentID);
470 (*m_Part_vParentBarcode).push_back(vParentBarcode);
481 const InDet::PixelClusterContainer *PixelClusterContainer = 0;
483 if (not pixelClusterContainerHandle.
isValid()) {
485 return StatusCode::FAILURE;
487 PixelClusterContainer = pixelClusterContainerHandle.
cptr();
489 const InDet::SCT_ClusterContainer *SCT_ClusterContainer = 0;
491 if (not stripClusterContainerHandle.
isValid()) {
493 return StatusCode::FAILURE;
495 SCT_ClusterContainer = stripClusterContainerHandle.
cptr();
497 auto cartesion_to_spherical = [](
const Amg::Vector3D &xyzVec,
float &eta_,
float &phi_) {
499 for (
int idx = 0; idx < 3; ++idx) {
500 r3 += xyzVec[idx] * xyzVec[idx];
503 phi_ = atan2(xyzVec[1], xyzVec[0]);
504 float theta_ = acos(xyzVec[2] / r3);
505 eta_ = log(tan(0.5 * theta_));
514 (*m_CLhardware).clear();
515 (*m_CLparticleLink_eventIndex).clear();
516 (*m_CLparticleLink_barcode).clear();
517 (*m_CLbarcodesLinked).clear();
518 (*m_CLparticle_charge).clear();
522 (*m_CLlocal_cov).clear();
525 if (PixelClusterContainer->
size() > 0) {
529 if (not sdoCollectionHandle.
isValid()) {
531 return StatusCode::FAILURE;
533 sdoCollection = sdoCollectionHandle.
cptr();
535 for (
const auto clusterCollection : *PixelClusterContainer) {
537 if (clusterCollection->empty())
540 int barrel_endcap =
m_pixelID->barrel_ec(clusterCollection->identify());
541 int layer_disk =
m_pixelID->layer_disk(clusterCollection->identify());
542 int eta_module =
m_pixelID->eta_module(clusterCollection->identify());
543 int phi_module =
m_pixelID->phi_module(clusterCollection->identify());
548 float norm_x = fabs(my_normal.x()) > 1e-5 ? my_normal.x() : 0.;
549 float norm_y = fabs(my_normal.y()) > 1e-5 ? my_normal.y() : 0.;
550 float norm_z = fabs(my_normal.z()) > 1e-5 ? my_normal.z() : 0.;
555 ATH_MSG_ERROR(
"Dynamic cast failed at " << __LINE__ <<
" of MergedPixelsTool.cxx.");
556 return StatusCode::FAILURE;
560 for (
const auto cluster : *clusterCollection) {
566 const Amg::MatrixX &local_cov = cluster->localCovariance();
568 std::vector<std::pair<int, int>> barcodes = {};
569 std::vector<int> particleLink_eventIndex = {};
570 std::vector<int> particleLink_barcode = {};
571 std::vector<bool> barcodesLinked = {};
572 std::vector<float>
charge = {};
573 std::vector<int> phis = {};
574 std::vector<int> etas = {};
575 std::vector<int> tots = {};
581 float charge_count = 0;
584 for (
unsigned int rdo = 0; rdo < cluster->rdoList().
size(); rdo++) {
585 const auto &rdoID = cluster->rdoList().at(rdo);
598 charge_count += cluster->totList().at(rdo);
602 tots.push_back(cluster->totList().at(rdo));
604 auto pos = sdoCollection->find(rdoID);
605 if (pos != sdoCollection->end()) {
606 for (
auto deposit : pos->second.getdeposits()) {
610 if (std::find(barcodes.begin(), barcodes.end(), barcode) == barcodes.end()) {
611 barcodes.push_back(barcode);
612 particleLink_eventIndex.push_back(particleLink.
eventIndex());
613 particleLink_barcode.push_back(particleLink.
barcode());
614 charge.push_back(deposit.second);
615 barcodesLinked.push_back(particleLink.
isValid());
632 Amg::Vector3D localDirection = localEndPosition - localStartPosition;
634 float loc_eta = 0, loc_phi = 0;
635 cartesion_to_spherical(localDirection, loc_eta, loc_phi);
640 Amg::Vector3D direction = globalEndPosition - globalStartPosition;
641 float glob_eta = 0, glob_phi = 0;
642 cartesion_to_spherical(direction, glob_eta, glob_phi);
647 float trkphicomp = direction.dot(my_phiax);
648 float trketacomp = direction.dot(my_etaax);
649 float trknormcomp = direction.dot(my_normal);
650 double phi_angle = atan2(trknormcomp, trkphicomp);
651 double eta_angle = atan2(trknormcomp, trketacomp);
653 clusterIDMapIdx[cluster->identify()] =
m_selected;
654 std::vector<double> v_local_cov;
655 if (local_cov.size() > 0) {
656 for (
size_t i = 0, nRows = local_cov.rows(), nCols = local_cov.cols(); i < nRows; i++) {
657 for (
size_t j = 0; j < nCols; ++j) {
658 v_local_cov.push_back(local_cov(i, j));
665 (*m_CLhardware).push_back(
"PIXEL");
675 (*m_CLparticleLink_eventIndex).push_back(particleLink_eventIndex);
676 (*m_CLparticleLink_barcode).push_back(particleLink_barcode);
677 (*m_CLbarcodesLinked).push_back(barcodesLinked);
678 (*m_CLparticle_charge).push_back(
charge);
679 (*m_CLetas).push_back(etas);
680 (*m_CLphis).push_back(phis);
681 (*m_CLtots).push_back(tots);
699 (*m_CLlocal_cov).push_back(v_local_cov);
715 if (SCT_ClusterContainer->size() > 0) {
718 if (not sdoCollectionHandle.
isValid()) {
720 return StatusCode::FAILURE;
722 sdoCollection = sdoCollectionHandle.
cptr();
724 for (
const auto clusterCollection : *SCT_ClusterContainer) {
726 if (clusterCollection->empty())
729 int barrel_endcap =
m_SCT_ID->barrel_ec(clusterCollection->identify());
730 int layer_disk =
m_SCT_ID->layer_disk(clusterCollection->identify());
731 int eta_module =
m_SCT_ID->eta_module(clusterCollection->identify());
732 int phi_module =
m_SCT_ID->phi_module(clusterCollection->identify());
733 int side =
m_SCT_ID->side(clusterCollection->identify());
738 float norm_x = fabs(my_normal.x()) > 1e-5 ? my_normal.x() : 0.;
739 float norm_y = fabs(my_normal.y()) > 1e-5 ? my_normal.y() : 0.;
740 float norm_z = fabs(my_normal.z()) > 1e-5 ? my_normal.z() : 0.;
743 for (
const auto cluster : *clusterCollection) {
749 const Amg::MatrixX &local_cov = cluster->localCovariance();
751 std::vector<std::pair<int, int>> barcodes = {};
752 std::vector<int> particleLink_eventIndex = {};
753 std::vector<int> particleLink_barcode = {};
754 std::vector<bool> barcodesLinked = {};
755 std::vector<float>
charge = {};
757 std::vector<int> tots = {};
758 std::vector<int> strip_ids = {};
760 int max_strip = -999;
762 float charge_count = 0;
765 for (
unsigned int rdo = 0; rdo < cluster->rdoList().
size(); rdo++) {
766 const auto &rdoID = cluster->rdoList().at(rdo);
770 if (min_strip >
strip)
772 if (max_strip <
strip)
774 strip_ids.push_back(
strip);
779 auto pos = sdoCollection->find(rdoID);
780 if (pos != sdoCollection->end()) {
781 for (
auto deposit : pos->second.getdeposits()) {
786 if (std::find(barcodes.begin(), barcodes.end(), barcode) == barcodes.end()) {
787 barcodes.push_back(barcode);
788 particleLink_eventIndex.push_back(particleLink.
eventIndex());
789 particleLink_barcode.push_back(particleLink.
barcode());
790 charge.push_back(deposit.second);
791 barcodesLinked.push_back(particleLink.
isValid());
801 ATH_MSG_ERROR(
"Failed at " << __LINE__ <<
" of accessing SCT ModuleSide Design");
802 return StatusCode::FAILURE;
806 std::pair<Amg::Vector3D, Amg::Vector3D> ends(
820 Amg::Vector3D localDirection = localEndPosition - localStartPosition;
821 float loc_eta = 0, loc_phi = 0;
822 cartesion_to_spherical(localDirection, loc_eta, loc_phi);
827 Amg::Vector3D direction = globalEndPosition - globalStartPosition;
828 float glob_eta = 0, glob_phi = 0;
829 cartesion_to_spherical(direction, glob_eta, glob_phi);
834 float trkphicomp = direction.dot(my_phiax);
835 float trketacomp = direction.dot(my_etaax);
836 float trknormcomp = direction.dot(my_normal);
837 double phi_angle = atan2(trknormcomp, trkphicomp);
838 double eta_angle = atan2(trknormcomp, trketacomp);
841 clusterIDMapIdx[cluster->identify()] =
m_selected;
843 std::vector<int> cst;
847 std::vector<double> v_local_cov;
848 if (local_cov.size() > 0) {
849 for (
size_t i = 0, nRows = local_cov.rows(), nCols = local_cov.cols(); i < nRows; i++) {
850 for (
size_t j = 0; j < nCols; ++j) {
851 v_local_cov.push_back(local_cov(i, j));
857 (*m_CLhardware).push_back(
"STRIP");
867 (*m_CLparticleLink_eventIndex).push_back(particleLink_eventIndex);
868 (*m_CLparticleLink_barcode).push_back(particleLink_barcode);
869 (*m_CLbarcodesLinked).push_back(barcodesLinked);
870 (*m_CLparticle_charge).push_back(
charge);
871 (*m_CLetas).push_back(strip_ids);
872 (*m_CLphis).push_back(cst);
873 (*m_CLtots).push_back(tots);
891 (*m_CLlocal_cov).push_back(v_local_cov);
918 if (not xAODPixelSpacePointContainerHandle.
isValid()) {
920 return StatusCode::FAILURE;
923 xAODPixelSPContainer = xAODPixelSpacePointContainerHandle.
cptr();
928 if (not xAODStripSpacePointContainerHandle.
isValid()) {
930 return StatusCode::FAILURE;
932 xAODStripSPContainer = xAODStripSpacePointContainerHandle.
cptr();
937 if (not xAODStripSpacePointOverlapContainerHandle.
isValid()) {
939 return StatusCode::FAILURE;
941 xAODStripSPOverlapContainer = xAODStripSpacePointOverlapContainerHandle.
cptr();
946 if (xAODPixelSPContainer && xAODPixelSPContainer->
size() > 0) {
947 for (
const auto sp : *xAODPixelSPContainer) {
950 ATH_MSG_FATAL(
"no pixel SpacePoint link for xAOD::SpacePoint");
953 auto trk_sp = *linkAcc(*
sp);
978 if (xAODStripSPContainer && xAODStripSPContainer->
size() > 0) {
981 for (
const auto sp : *xAODStripSPContainer) {
985 auto trk_sp = *striplinkAcc(*
sp);
1005 std::vector<float> topstripDir(
sp->topStripDirection().data(),
1006 sp->topStripDirection().data() +
1007 sp->topStripDirection().size());
1009 std::vector<float> botstripDir(
sp->bottomStripDirection().data(),
1010 sp->bottomStripDirection().data() +
1011 sp->bottomStripDirection().size());
1013 std::vector<float> DstripCnt(
sp->stripCenterDistance().data(),
1014 sp->stripCenterDistance().data() +
1015 sp->stripCenterDistance().size());
1017 std::vector<float> topstripCnt(
sp->topStripCenter().data(),
1018 sp->topStripCenter().data() +
1019 sp->topStripCenter().size());
1021 (*m_SPtopStripDirection).push_back(topstripDir);
1022 (*m_SPbottomStripDirection).push_back(botstripDir);
1023 (*m_SPstripCenterDistance).push_back(DstripCnt);
1024 (*m_SPtopStripCenterPosition).push_back(topstripCnt);
1039 if (xAODStripSPOverlapContainer && xAODStripSPOverlapContainer->
size() > 0) {
1042 for (
const auto sp : *xAODStripSPOverlapContainer) {
1046 auto trk_sp = *stripOverlaplinkAcc(*
sp);
1067 if ( flag<1 || flag > 3 )
1076 std::vector<float> topstripDir(
sp->topStripDirection().data(),
1077 sp->topStripDirection().data() +
1078 sp->topStripDirection().size());
1080 std::vector<float> botstripDir(
sp->bottomStripDirection().data(),
1081 sp->bottomStripDirection().data() +
1082 sp->bottomStripDirection().size());
1084 std::vector<float> DstripCnt(
sp->stripCenterDistance().data(),
1085 sp->stripCenterDistance().data() +
1086 sp->stripCenterDistance().size());
1088 std::vector<float> topstripCnt(
sp->topStripCenter().data(),
1089 sp->topStripCenter().data() +
1090 sp->topStripCenter().size());
1092 (*m_SPtopStripDirection).push_back(topstripDir);
1093 (*m_SPbottomStripDirection).push_back(botstripDir);
1094 (*m_SPstripCenterDistance).push_back(DstripCnt);
1095 (*m_SPtopStripCenterPosition).push_back(topstripCnt);
1115 if (not trackCollectionHandle.
isValid()) {
1117 return StatusCode::FAILURE;
1119 trackCollection = trackCollectionHandle.
cptr();
1123 if (not trackTruthCollectionHandle.
isValid()) {
1125 return StatusCode::FAILURE;
1127 trackTruthCollection = trackTruthCollectionHandle.
cptr();
1135 (*m_TRKproperties).clear();
1136 (*m_TRKpattern).clear();
1137 (*m_TRKperigee_position).clear();
1138 (*m_TRKperigee_momentum).clear();
1139 (*m_TRKmeasurementsOnTrack_pixcl_sctcl_index).clear();
1140 (*m_TRKoutliersOnTrack_pixcl_sctcl_index).clear();
1143 for (; trackIterator < (*trackCollection).end(); ++trackIterator) {
1144 if (!((*trackIterator))) {
1158 TrackTruthCollection::const_iterator found = trackTruthCollection->find(tracklink2);
1160 const std::bitset<Trk::TrackInfo::NumberOfTrackProperties> &properties = info.properties();
1161 std::vector<int> v_properties;
1162 for (std::size_t i = 0; i < properties.size(); i++) {
1163 if (properties[i]) {
1164 v_properties.push_back(i);
1168 const std::bitset<Trk::TrackInfo::NumberOfTrackRecoInfo> &pattern = info.patternRecognition();
1169 std::vector<int> v_pattern;
1170 for (std::size_t i = 0; i < pattern.size(); i++) {
1172 v_pattern.push_back(i);
1182 std::vector<double> position, momentum;
1193 position.push_back(0);
1194 position.push_back(0);
1195 position.push_back(0);
1196 momentum.push_back(0);
1197 momentum.push_back(0);
1198 momentum.push_back(0);
1202 if (measurementsOnTrack)
1203 mot = measurementsOnTrack->
size();
1204 if (outliersOnTrack)
1205 oot = outliersOnTrack->
size();
1206 std::vector<int> measurementsOnTrack_pixcl_sctcl_index, outliersOnTrack_pixcl_sctcl_index;
1207 int TTCindex, TTCevent_index, TTCparticle_link;
1208 float TTCprobability;
1209 if (measurementsOnTrack) {
1210 for (
size_t i = 0; i < measurementsOnTrack->
size(); i++) {
1215 measurementsOnTrack_pixcl_sctcl_index.push_back(clusterIDMapIdx[pixcl->
prepRawData()->
identify()]);
1218 measurementsOnTrack_pixcl_sctcl_index.push_back(clusterIDMapIdx[sctcl->
prepRawData()->
identify()]);
1220 measurementsOnTrack_pixcl_sctcl_index.push_back(-1);
1224 if (outliersOnTrack) {
1225 for (
size_t i = 0; i < outliersOnTrack->
size(); i++) {
1230 outliersOnTrack_pixcl_sctcl_index.push_back(clusterIDMapIdx[pixcl->
prepRawData()->
identify()]);
1232 outliersOnTrack_pixcl_sctcl_index.push_back(clusterIDMapIdx[sctcl->
prepRawData()->
identify()]);
1234 outliersOnTrack_pixcl_sctcl_index.push_back(-1);
1238 if (found != trackTruthCollection->end()) {
1239 TTCindex = found->first.index();
1240 TTCevent_index = found->second.particleLink().eventIndex();
1241 TTCparticle_link = found->second.particleLink().barcode();
1242 TTCprobability = found->second.probability();
1244 TTCindex = TTCevent_index = TTCparticle_link = -999;
1245 TTCprobability = -1;
1253 (*m_TRKproperties).push_back(v_properties);
1254 (*m_TRKpattern).push_back(v_pattern);
1257 (*m_TRKmeasurementsOnTrack_pixcl_sctcl_index).push_back(measurementsOnTrack_pixcl_sctcl_index);
1258 (*m_TRKoutliersOnTrack_pixcl_sctcl_index).push_back(outliersOnTrack_pixcl_sctcl_index);
1260 (*m_TRKperigee_position).push_back(position);
1261 (*m_TRKperigee_momentum).push_back(momentum);
1281 if (not detailedTrackTruthCollectionHandle.
isValid()) {
1283 return StatusCode::FAILURE;
1285 detailedTrackTruthCollection = detailedTrackTruthCollectionHandle.
cptr();
1289 (*m_DTTtrajectory_eventindex).clear();
1290 (*m_DTTtrajectory_barcode).clear();
1291 (*m_DTTstTruth_subDetType).clear();
1292 (*m_DTTstTrack_subDetType).clear();
1293 (*m_DTTstCommon_subDetType).clear();
1297 DetailedTrackTruthCollection::const_iterator detailedTrackTruthIterator = (*detailedTrackTruthCollection).begin();
1298 for (; detailedTrackTruthIterator != (*detailedTrackTruthCollection).end(); ++detailedTrackTruthIterator) {
1299 std::vector<int> DTTtrajectory_eventindex, DTTtrajectory_barcode, DTTstTruth_subDetType, DTTstTrack_subDetType,
1300 DTTstCommon_subDetType;
1301 const TruthTrajectory &traj = detailedTrackTruthIterator->second.trajectory();
1302 for (
size_t j = 0; j < traj.size(); j++) {
1303 DTTtrajectory_eventindex.push_back(traj[j].eventIndex());
1304 DTTtrajectory_barcode.push_back(traj[j].barcode());
1322 (*m_DTTtrajectory_eventindex).push_back(DTTtrajectory_eventindex);
1323 (*m_DTTtrajectory_barcode).push_back(DTTtrajectory_barcode);
1324 (*m_DTTstTruth_subDetType).push_back(DTTstTruth_subDetType);
1325 (*m_DTTstTrack_subDetType).push_back(DTTstTrack_subDetType);
1326 (*m_DTTstCommon_subDetType).push_back(DTTstCommon_subDetType);
1337 return StatusCode::SUCCESS;