369 std::map<Identifier, long int> clusterIDMapIdx;
372 std::map<Identifier, long int> clusterIDMapSpacePointIdx;
376 std::map<std::pair<int, int>, std::pair<bool, int>> allTruthParticles;
380 if (not mcEventCollectionHandle.
isValid()) {
382 return StatusCode::FAILURE;
384 mcCollptr = mcEventCollectionHandle.
cptr();
389 if (not eventInfoHandle.
isValid()) {
391 return StatusCode::FAILURE;
393 eventInfo = eventInfoHandle.
cptr();
398 std::map<int, int> allSubEvents;
402 bool duplicateSubeventID =
false;
403 for (
unsigned int cntr = 0; cntr < mcCollptr->
size(); ++cntr) {
404 int ID = mcCollptr->
at(cntr)->event_number();
412 std::map<int, int>::iterator it = allSubEvents.find(ID);
413 if (it == allSubEvents.end())
414 allSubEvents.insert(std::make_pair(ID, 1));
417 duplicateSubeventID =
true;
421 if (duplicateSubeventID) {
428 (*m_Part_vParentID).clear();
429 (*m_Part_vParentBarcode).clear();
432 for (
unsigned int cntr = 0; cntr < mcCollptr->
size(); ++cntr) {
442 for (
auto p : *genEvt) {
444 float px, py, pz, pt,
eta, vx, vy, vz, radius, status,
charge = 0.;
445 std::vector<int> vParentID;
446 std::vector<int> vParentBarcode;
448 int vProdNin, vProdNout, vProdStatus, vProdBarcode;
449 bool passed =
isPassed(p, px, py, pz, pt,
eta, vx, vy, vz, radius, status,
charge, vParentID, vParentBarcode,
450 vProdNin, vProdNout, vProdStatus, vProdBarcode);
451 allTruthParticles.insert(std::make_pair(std::make_pair(genEvt->event_number(),
HepMC::barcode(p)),
452 std::make_pair(
passed, 0)));
474 (*m_Part_vParentID).push_back(std::move(vParentID));
475 (*m_Part_vParentBarcode).push_back(std::move(vParentBarcode));
486 const InDet::PixelClusterContainer *PixelClusterContainer = 0;
488 if (not pixelClusterContainerHandle.
isValid()) {
490 return StatusCode::FAILURE;
492 PixelClusterContainer = pixelClusterContainerHandle.
cptr();
494 const InDet::SCT_ClusterContainer *SCT_ClusterContainer = 0;
496 if (not stripClusterContainerHandle.
isValid()) {
498 return StatusCode::FAILURE;
500 SCT_ClusterContainer = stripClusterContainerHandle.
cptr();
502 auto cartesion_to_spherical = [](
const Amg::Vector3D &xyzVec,
float &eta_,
float &phi_) {
504 for (
int idx = 0; idx < 3; ++idx) {
505 r3 += xyzVec[idx] * xyzVec[idx];
508 phi_ = atan2(xyzVec[1], xyzVec[0]);
509 float theta_ = acos(xyzVec[2] / r3);
510 eta_ = log(tan(0.5 * theta_));
519 (*m_CLhardware).clear();
520 (*m_CLparticleLink_eventIndex).clear();
521 (*m_CLparticleLink_barcode).clear();
522 (*m_CLbarcodesLinked).clear();
523 (*m_CLparticle_charge).clear();
527 (*m_CLlocal_cov).clear();
530 if (PixelClusterContainer->
size() > 0) {
534 if (not sdoCollectionHandle.
isValid()) {
536 return StatusCode::FAILURE;
538 sdoCollection = sdoCollectionHandle.
cptr();
540 for (
const auto clusterCollection : *PixelClusterContainer) {
542 if (clusterCollection->empty())
545 int barrel_endcap =
m_pixelID->barrel_ec(clusterCollection->identify());
546 int layer_disk =
m_pixelID->layer_disk(clusterCollection->identify());
547 int eta_module =
m_pixelID->eta_module(clusterCollection->identify());
548 int phi_module =
m_pixelID->phi_module(clusterCollection->identify());
553 float norm_x = fabs(my_normal.x()) > 1e-5 ? my_normal.x() : 0.;
554 float norm_y = fabs(my_normal.y()) > 1e-5 ? my_normal.y() : 0.;
555 float norm_z = fabs(my_normal.z()) > 1e-5 ? my_normal.z() : 0.;
560 ATH_MSG_ERROR(
"Dynamic cast failed at " << __LINE__ <<
" of MergedPixelsTool.cxx.");
561 return StatusCode::FAILURE;
565 for (
const auto cluster : *clusterCollection) {
571 const Amg::MatrixX &local_cov = cluster->localCovariance();
573 std::vector<std::pair<int, int>> barcodes = {};
574 std::vector<int> particleLink_eventIndex = {};
575 std::vector<int> particleLink_barcode = {};
576 std::vector<bool> barcodesLinked = {};
577 std::vector<float>
charge = {};
578 std::vector<int> phis = {};
579 std::vector<int> etas = {};
580 std::vector<int> tots = {};
586 float charge_count = 0;
589 for (
unsigned int rdo = 0; rdo < cluster->rdoList().
size(); rdo++) {
590 const auto &rdoID = cluster->rdoList().at(rdo);
603 charge_count += cluster->totList().at(rdo);
607 tots.push_back(cluster->totList().at(rdo));
609 auto pos = sdoCollection->find(rdoID);
610 if (pos != sdoCollection->end()) {
611 for (
const auto & deposit : pos->second.getdeposits()) {
615 if (std::find(barcodes.begin(), barcodes.end(), barcode) == barcodes.end()) {
616 barcodes.push_back(barcode);
617 particleLink_eventIndex.push_back(particleLink.
eventIndex());
618 particleLink_barcode.push_back(particleLink.
barcode());
619 charge.push_back(deposit.second);
620 barcodesLinked.push_back(particleLink.
isValid());
637 Amg::Vector3D localDirection = localEndPosition - localStartPosition;
639 float loc_eta = 0, loc_phi = 0;
640 cartesion_to_spherical(localDirection, loc_eta, loc_phi);
645 Amg::Vector3D direction = globalEndPosition - globalStartPosition;
646 float glob_eta = 0, glob_phi = 0;
647 cartesion_to_spherical(direction, glob_eta, glob_phi);
652 float trkphicomp = direction.dot(my_phiax);
653 float trketacomp = direction.dot(my_etaax);
654 float trknormcomp = direction.dot(my_normal);
655 double phi_angle = atan2(trknormcomp, trkphicomp);
656 double eta_angle = atan2(trknormcomp, trketacomp);
658 clusterIDMapIdx[cluster->identify()] =
m_selected;
659 std::vector<double> v_local_cov;
660 if (local_cov.size() > 0) {
661 for (
size_t i = 0, nRows = local_cov.rows(), nCols = local_cov.cols(); i < nRows; i++) {
662 for (
size_t j = 0; j < nCols; ++j) {
663 v_local_cov.push_back(local_cov(i, j));
670 (*m_CLhardware).push_back(
"PIXEL");
680 (*m_CLparticleLink_eventIndex).push_back(std::move(particleLink_eventIndex));
681 (*m_CLparticleLink_barcode).push_back(std::move(particleLink_barcode));
682 (*m_CLbarcodesLinked).push_back(std::move(barcodesLinked));
683 (*m_CLparticle_charge).push_back(std::move(
charge));
684 (*m_CLetas).push_back(std::move(etas));
685 (*m_CLphis).push_back(std::move(phis));
686 (*m_CLtots).push_back(std::move(tots));
704 (*m_CLlocal_cov).push_back(std::move(v_local_cov));
720 if (SCT_ClusterContainer->size() > 0) {
723 if (not sdoCollectionHandle.
isValid()) {
725 return StatusCode::FAILURE;
727 sdoCollection = sdoCollectionHandle.
cptr();
729 for (
const auto clusterCollection : *SCT_ClusterContainer) {
731 if (clusterCollection->empty())
734 int barrel_endcap =
m_SCT_ID->barrel_ec(clusterCollection->identify());
735 int layer_disk =
m_SCT_ID->layer_disk(clusterCollection->identify());
736 int eta_module =
m_SCT_ID->eta_module(clusterCollection->identify());
737 int phi_module =
m_SCT_ID->phi_module(clusterCollection->identify());
738 int side =
m_SCT_ID->side(clusterCollection->identify());
743 float norm_x = fabs(my_normal.x()) > 1e-5 ? my_normal.x() : 0.;
744 float norm_y = fabs(my_normal.y()) > 1e-5 ? my_normal.y() : 0.;
745 float norm_z = fabs(my_normal.z()) > 1e-5 ? my_normal.z() : 0.;
748 for (
const auto cluster : *clusterCollection) {
754 const Amg::MatrixX &local_cov = cluster->localCovariance();
756 std::vector<std::pair<int, int>> barcodes = {};
757 std::vector<int> particleLink_eventIndex = {};
758 std::vector<int> particleLink_barcode = {};
759 std::vector<bool> barcodesLinked = {};
760 std::vector<float>
charge = {};
762 std::vector<int> tots = {};
763 std::vector<int> strip_ids = {};
765 int max_strip = -999;
767 float charge_count = 0;
770 for (
unsigned int rdo = 0; rdo < cluster->rdoList().
size(); rdo++) {
771 const auto &rdoID = cluster->rdoList().at(rdo);
775 if (min_strip >
strip)
777 if (max_strip <
strip)
779 strip_ids.push_back(
strip);
784 auto pos = sdoCollection->find(rdoID);
785 if (pos != sdoCollection->end()) {
786 for (
auto deposit : pos->second.getdeposits()) {
791 if (std::find(barcodes.begin(), barcodes.end(), barcode) == barcodes.end()) {
792 barcodes.push_back(barcode);
793 particleLink_eventIndex.push_back(particleLink.
eventIndex());
794 particleLink_barcode.push_back(particleLink.
barcode());
795 charge.push_back(deposit.second);
796 barcodesLinked.push_back(particleLink.
isValid());
806 ATH_MSG_ERROR(
"Failed at " << __LINE__ <<
" of accessing SCT ModuleSide Design");
807 return StatusCode::FAILURE;
811 std::pair<Amg::Vector3D, Amg::Vector3D> ends(
825 Amg::Vector3D localDirection = localEndPosition - localStartPosition;
826 float loc_eta = 0, loc_phi = 0;
827 cartesion_to_spherical(localDirection, loc_eta, loc_phi);
832 Amg::Vector3D direction = globalEndPosition - globalStartPosition;
833 float glob_eta = 0, glob_phi = 0;
834 cartesion_to_spherical(direction, glob_eta, glob_phi);
839 float trkphicomp = direction.dot(my_phiax);
840 float trketacomp = direction.dot(my_etaax);
841 float trknormcomp = direction.dot(my_normal);
842 double phi_angle = atan2(trknormcomp, trkphicomp);
843 double eta_angle = atan2(trknormcomp, trketacomp);
846 clusterIDMapIdx[cluster->identify()] =
m_selected;
848 std::vector<int> cst;
852 std::vector<double> v_local_cov;
853 if (local_cov.size() > 0) {
854 for (
size_t i = 0, nRows = local_cov.rows(), nCols = local_cov.cols(); i < nRows; i++) {
855 for (
size_t j = 0; j < nCols; ++j) {
856 v_local_cov.push_back(local_cov(i, j));
862 (*m_CLhardware).push_back(
"STRIP");
872 (*m_CLparticleLink_eventIndex).push_back(std::move(particleLink_eventIndex));
873 (*m_CLparticleLink_barcode).push_back(std::move(particleLink_barcode));
874 (*m_CLbarcodesLinked).push_back(std::move(barcodesLinked));
875 (*m_CLparticle_charge).push_back(std::move(
charge));
876 (*m_CLetas).push_back(std::move(strip_ids));
877 (*m_CLphis).push_back(std::move(cst));
878 (*m_CLtots).push_back(std::move(tots));
896 (*m_CLlocal_cov).push_back(v_local_cov);
923 if (not xAODPixelSpacePointContainerHandle.
isValid()) {
925 return StatusCode::FAILURE;
928 xAODPixelSPContainer = xAODPixelSpacePointContainerHandle.
cptr();
933 if (not xAODStripSpacePointContainerHandle.
isValid()) {
935 return StatusCode::FAILURE;
937 xAODStripSPContainer = xAODStripSpacePointContainerHandle.
cptr();
942 if (not xAODStripSpacePointOverlapContainerHandle.
isValid()) {
944 return StatusCode::FAILURE;
946 xAODStripSPOverlapContainer = xAODStripSpacePointOverlapContainerHandle.
cptr();
951 if (xAODPixelSPContainer && xAODPixelSPContainer->
size() > 0) {
952 for (
const auto sp : *xAODPixelSPContainer) {
955 ATH_MSG_FATAL(
"no pixel SpacePoint link for xAOD::SpacePoint");
958 auto trk_sp = *linkAcc(*
sp);
983 if (xAODStripSPContainer && xAODStripSPContainer->
size() > 0) {
986 for (
const auto sp : *xAODStripSPContainer) {
990 auto trk_sp = *striplinkAcc(*
sp);
1010 std::vector<float> topstripDir(
sp->topStripDirection().data(),
1011 sp->topStripDirection().data() +
1012 sp->topStripDirection().size());
1014 std::vector<float> botstripDir(
sp->bottomStripDirection().data(),
1015 sp->bottomStripDirection().data() +
1016 sp->bottomStripDirection().size());
1018 std::vector<float> DstripCnt(
sp->stripCenterDistance().data(),
1019 sp->stripCenterDistance().data() +
1020 sp->stripCenterDistance().size());
1022 std::vector<float> topstripCnt(
sp->topStripCenter().data(),
1023 sp->topStripCenter().data() +
1024 sp->topStripCenter().size());
1026 (*m_SPtopStripDirection).push_back(std::move(topstripDir));
1027 (*m_SPbottomStripDirection).push_back(std::move(botstripDir));
1028 (*m_SPstripCenterDistance).push_back(std::move(DstripCnt));
1029 (*m_SPtopStripCenterPosition).push_back(std::move(topstripCnt));
1044 if (xAODStripSPOverlapContainer && xAODStripSPOverlapContainer->
size() > 0) {
1047 for (
const auto sp : *xAODStripSPOverlapContainer) {
1051 auto trk_sp = *stripOverlaplinkAcc(*
sp);
1072 if ( flag<1 || flag > 3 )
1081 std::vector<float> topstripDir(
sp->topStripDirection().data(),
1082 sp->topStripDirection().data() +
1083 sp->topStripDirection().size());
1085 std::vector<float> botstripDir(
sp->bottomStripDirection().data(),
1086 sp->bottomStripDirection().data() +
1087 sp->bottomStripDirection().size());
1089 std::vector<float> DstripCnt(
sp->stripCenterDistance().data(),
1090 sp->stripCenterDistance().data() +
1091 sp->stripCenterDistance().size());
1093 std::vector<float> topstripCnt(
sp->topStripCenter().data(),
1094 sp->topStripCenter().data() +
1095 sp->topStripCenter().size());
1097 (*m_SPtopStripDirection).push_back(topstripDir);
1098 (*m_SPbottomStripDirection).push_back(botstripDir);
1099 (*m_SPstripCenterDistance).push_back(DstripCnt);
1100 (*m_SPtopStripCenterPosition).push_back(topstripCnt);
1120 if (not trackCollectionHandle.
isValid()) {
1122 return StatusCode::FAILURE;
1124 trackCollection = trackCollectionHandle.
cptr();
1128 if (not trackTruthCollectionHandle.
isValid()) {
1130 return StatusCode::FAILURE;
1132 trackTruthCollection = trackTruthCollectionHandle.
cptr();
1140 (*m_TRKproperties).clear();
1141 (*m_TRKpattern).clear();
1142 (*m_TRKperigee_position).clear();
1143 (*m_TRKperigee_momentum).clear();
1144 (*m_TRKmeasurementsOnTrack_pixcl_sctcl_index).clear();
1145 (*m_TRKoutliersOnTrack_pixcl_sctcl_index).clear();
1148 for (; trackIterator < (*trackCollection).end(); ++trackIterator) {
1149 if (!((*trackIterator))) {
1163 TrackTruthCollection::const_iterator found = trackTruthCollection->find(tracklink2);
1165 const std::bitset<Trk::TrackInfo::NumberOfTrackProperties> &properties = info.properties();
1166 std::vector<int> v_properties;
1167 for (std::size_t i = 0; i < properties.size(); i++) {
1168 if (properties[i]) {
1169 v_properties.push_back(i);
1173 const std::bitset<Trk::TrackInfo::NumberOfTrackRecoInfo> &pattern = info.patternRecognition();
1174 std::vector<int> v_pattern;
1175 for (std::size_t i = 0; i < pattern.size(); i++) {
1177 v_pattern.push_back(i);
1187 std::vector<double> position, momentum;
1198 position.push_back(0);
1199 position.push_back(0);
1200 position.push_back(0);
1201 momentum.push_back(0);
1202 momentum.push_back(0);
1203 momentum.push_back(0);
1207 if (measurementsOnTrack)
1208 mot = measurementsOnTrack->
size();
1209 if (outliersOnTrack)
1210 oot = outliersOnTrack->
size();
1211 std::vector<int> measurementsOnTrack_pixcl_sctcl_index, outliersOnTrack_pixcl_sctcl_index;
1212 int TTCindex, TTCevent_index, TTCparticle_link;
1213 float TTCprobability;
1214 if (measurementsOnTrack) {
1215 for (
size_t i = 0; i < measurementsOnTrack->
size(); i++) {
1220 measurementsOnTrack_pixcl_sctcl_index.push_back(clusterIDMapIdx[pixcl->
prepRawData()->
identify()]);
1223 measurementsOnTrack_pixcl_sctcl_index.push_back(clusterIDMapIdx[sctcl->
prepRawData()->
identify()]);
1225 measurementsOnTrack_pixcl_sctcl_index.push_back(-1);
1229 if (outliersOnTrack) {
1230 for (
size_t i = 0; i < outliersOnTrack->
size(); i++) {
1235 outliersOnTrack_pixcl_sctcl_index.push_back(clusterIDMapIdx[pixcl->
prepRawData()->
identify()]);
1237 outliersOnTrack_pixcl_sctcl_index.push_back(clusterIDMapIdx[sctcl->
prepRawData()->
identify()]);
1239 outliersOnTrack_pixcl_sctcl_index.push_back(-1);
1243 if (found != trackTruthCollection->end()) {
1244 TTCindex = found->first.index();
1245 TTCevent_index = found->second.particleLink().eventIndex();
1246 TTCparticle_link = found->second.particleLink().barcode();
1247 TTCprobability = found->second.probability();
1249 TTCindex = TTCevent_index = TTCparticle_link = -999;
1250 TTCprobability = -1;
1258 (*m_TRKproperties).push_back(std::move(v_properties));
1259 (*m_TRKpattern).push_back(std::move(v_pattern));
1262 (*m_TRKmeasurementsOnTrack_pixcl_sctcl_index).push_back(std::move(measurementsOnTrack_pixcl_sctcl_index));
1263 (*m_TRKoutliersOnTrack_pixcl_sctcl_index).push_back(std::move(outliersOnTrack_pixcl_sctcl_index));
1265 (*m_TRKperigee_position).push_back(std::move(position));
1266 (*m_TRKperigee_momentum).push_back(std::move(momentum));
1286 if (not detailedTrackTruthCollectionHandle.
isValid()) {
1288 return StatusCode::FAILURE;
1290 detailedTrackTruthCollection = detailedTrackTruthCollectionHandle.
cptr();
1294 (*m_DTTtrajectory_eventindex).clear();
1295 (*m_DTTtrajectory_barcode).clear();
1296 (*m_DTTstTruth_subDetType).clear();
1297 (*m_DTTstTrack_subDetType).clear();
1298 (*m_DTTstCommon_subDetType).clear();
1302 DetailedTrackTruthCollection::const_iterator detailedTrackTruthIterator = (*detailedTrackTruthCollection).begin();
1303 for (; detailedTrackTruthIterator != (*detailedTrackTruthCollection).end(); ++detailedTrackTruthIterator) {
1304 std::vector<int> DTTtrajectory_eventindex, DTTtrajectory_barcode, DTTstTruth_subDetType, DTTstTrack_subDetType,
1305 DTTstCommon_subDetType;
1306 const TruthTrajectory &traj = detailedTrackTruthIterator->second.trajectory();
1307 for (
size_t j = 0; j < traj.size(); j++) {
1308 DTTtrajectory_eventindex.push_back(traj[j].eventIndex());
1309 DTTtrajectory_barcode.push_back(traj[j].barcode());
1327 (*m_DTTtrajectory_eventindex).push_back(std::move(DTTtrajectory_eventindex));
1328 (*m_DTTtrajectory_barcode).push_back(std::move(DTTtrajectory_barcode));
1329 (*m_DTTstTruth_subDetType).push_back(std::move(DTTstTruth_subDetType));
1330 (*m_DTTstTrack_subDetType).push_back(std::move(DTTstTrack_subDetType));
1331 (*m_DTTstCommon_subDetType).push_back(std::move(DTTstCommon_subDetType));
1342 return StatusCode::SUCCESS;