6 #include "GaudiKernel/EventContext.h"
8 #include "Acts/Definitions/Units.hpp"
9 #include "Acts/MagneticField/MagneticFieldContext.hpp"
26 #include "GaudiKernel/ITHistSvc.h"
52 ATH_MSG_ERROR(
"Activate seeding on at least one between Pixel and Strip space point collections!");
53 return StatusCode::FAILURE;
75 return StatusCode::SUCCESS;
84 std::string tree_name = std::string(
"SeedTree_") +
name();
85 std::replace( tree_name.begin(), tree_name.end(),
'.',
'_' );
87 m_outputTree =
new TTree( tree_name.c_str() ,
"ActsSeedMakerValTool");
89 m_outputTree->Branch(
"eventNumber", &m_eventNumber,
"eventNumber/L");
114 std::string full_tree_name =
"/" + m_treeFolder +
"/" + tree_name;
117 return StatusCode::SUCCESS;
127 data.v_ActsSpacePointForSeed.emplace_back(sp);
133 float R = std::hypotf(
x,
y);
135 if (std::abs(
z) > 200. && R < 50.)
151 r[3] =
static_cast<float>(Tp(0, 2));
152 r[4] =
static_cast<float>(Tp(1, 2));
153 r[5] =
static_cast<float>(Tp(2, 2));
169 std::pair<Amg::Vector3D, Amg::Vector3D>
e0 =
171 std::pair<Amg::Vector3D, Amg::Vector3D>
e1 =
182 r[3] =
static_cast<float>(b0[0]);
183 r[4] =
static_cast<float>(b0[1]);
184 r[5] =
static_cast<float>(b0[2]);
187 r[6] =
static_cast<float>(b1[0]);
188 r[7] =
static_cast<float>(b1[1]);
189 r[8] =
static_cast<float>(b1[2]);
192 r[9] =
static_cast<float>(d02[0]);
193 r[10] =
static_cast<float>(d02[1]);
194 r[11] =
static_cast<float>(d02[2]);
197 r[12] =
static_cast<float>(s0[0]) -
data.xbeam[0];
198 r[13] =
static_cast<float>(s0[1]) -
data.ybeam[0];
199 r[14] =
static_cast<float>(s0[2]) -
data.zbeam[0];
211 if (not inputSpacePointContainer.
isValid()){
213 return StatusCode::FAILURE;
219 if (prd_to_track_map_cptr !=
nullptr and
isUsed(sp, *prd_to_track_map_cptr))
continue;
223 return StatusCode::SUCCESS;
229 const std::vector<IdentifierHash>&
ids,
232 if (
ids.empty())
return StatusCode::SUCCESS;
236 if (not inputSpacePointContainer.
isValid()){
238 return StatusCode::FAILURE;
251 detElements->size());
254 if (not
accessor.isIdentifierPresent(
id)) {
259 for (
auto [firstElement, lastElement] :
ranges) {
260 for (; firstElement != lastElement; ++firstElement) {
262 if (prd_to_track_map_cptr !=
nullptr and
isUsed(sp, *prd_to_track_map_cptr))
continue;
268 return StatusCode::SUCCESS;
280 if (!inputSpacePointContainer.
isValid()){
282 return StatusCode::FAILURE;
288 if (prd_to_track_map_cptr !=
nullptr and
isUsed(sp, *prd_to_track_map_cptr))
continue;
292 return StatusCode::SUCCESS;
298 const std::vector<IdentifierHash>&
ids,
302 if (
ids.empty())
return StatusCode::SUCCESS;
306 if (not inputSpacePointContainer.
isValid()){
308 return StatusCode::FAILURE;
321 detElements->size());
324 if (not
accessor.isIdentifierPresent(
id)) {
329 for (
auto [firstElement, lastElement] :
ranges) {
330 for (; firstElement != lastElement; ++firstElement) {
332 if (prd_to_track_map_cptr !=
nullptr and
isUsed(sp, *prd_to_track_map_cptr))
continue;
338 return StatusCode::SUCCESS;
351 if (!inputSpacePointContainer.
isValid()){
353 return StatusCode::FAILURE;
359 if (prd_to_track_map_cptr !=
nullptr and
isUsed(sp, *prd_to_track_map_cptr))
continue;
363 return StatusCode::SUCCESS;
369 const std::vector<IdentifierHash>&
ids,
372 if (
ids.empty())
return StatusCode::SUCCESS;
376 if (not inputSpacePointContainer.
isValid()){
378 return StatusCode::FAILURE;
391 detElements->size());
394 if (not
accessor.isIdentifierPresent(
id)) {
399 for (
auto [firstElement, lastElement] :
ranges) {
400 for (; firstElement != lastElement; ++firstElement) {
402 if (prd_to_track_map_cptr !=
nullptr and
isUsed(sp, *prd_to_track_map_cptr))
continue;
408 return StatusCode::SUCCESS;
418 double tx =
std::tan(beamSpotHandle->beamTilt(0));
419 double ty =
std::tan(beamSpotHandle->beamTilt(1));
421 double phi = std::atan2(ty,
tx);
422 double theta = std::acos(1. / std::sqrt(1. +
tx *
tx + ty * ty));
428 data.xbeam[0] =
static_cast<float>(cb.x());
429 data.xbeam[1] =
static_cast<float>(cosTheta * cosPhi * cosPhi + sinPhi * sinPhi);
430 data.xbeam[2] =
static_cast<float>(cosTheta * sinPhi * cosPhi - sinPhi * cosPhi);
431 data.xbeam[3] = -
static_cast<float>(sinTheta * cosPhi);
433 data.ybeam[0] =
static_cast<float>(cb.y());
434 data.ybeam[1] =
static_cast<float>(cosTheta * cosPhi * sinPhi - sinPhi * cosPhi);
435 data.ybeam[2] =
static_cast<float>(cosTheta * sinPhi * sinPhi + cosPhi * cosPhi);
436 data.ybeam[3] = -
static_cast<float>(sinTheta * sinPhi);
438 data.zbeam[0] =
static_cast<float>(cb.z());
439 data.zbeam[1] =
static_cast<float>(sinTheta * cosPhi);
440 data.zbeam[2] =
static_cast<float>(sinTheta * sinPhi);
441 data.zbeam[3] =
static_cast<float>(cosTheta);
447 if ( not readHandle.isValid() ) {
448 throw std::runtime_error(
"Error while retrieving Atlas Field Cache Cond DB");
451 if (fieldCondObj ==
nullptr) {
457 Acts::MagneticFieldContext magFieldContext(fieldCondObj);
466 Acts::MagneticFieldProvider::Cache magFieldCache = magneticField.
makeCache( magFieldContext );
467 Acts::Vector3 bField = *magneticField.
getField( beamPos,
470 data.bField[0] = bField[0];
471 data.bField[1] = bField[1];
472 data.bField[2] = bField[2];
474 data.K = 2. * s_toTesla / (300. * bField[2]);
486 const std::vector<IdentifierHash>& vPixel,
487 const std::vector<IdentifierHash>& vStrip)
const
494 data.i_ITkSpacePointForSeed =
data.l_ITkSpacePointForSeed.begin();
495 data.v_ActsSpacePointForSeed.clear();
498 data.i_ITkSeed =
data.i_ITkSeeds.begin();
509 if ( not prd_handle.
isValid() ) {
512 prd_to_track_map_cptr = prd_handle.
get();
514 if (prd_to_track_map_cptr !=
nullptr) {
530 data.initialized =
true;
541 data.iteration = iteration;
548 data.i_ITkSpacePointForSeed =
data.l_ITkSpacePointForSeed.begin();
549 data.v_ActsSpacePointForSeed.clear();
554 data.i_ITkSeed =
data.i_ITkSeeds.begin();
568 if (
data.iteration == 0)
580 if ( not prd_handle.
isValid() ) {
583 prd_to_track_map_cptr = prd_handle.
get();
590 if (isPixel and not
retrievePixel(ctx,
data, prd_to_track_map_cptr).isSuccess() ) {
604 data.initialized =
true;
610 const std::list<Trk::Vertex>& )
const
613 if (
data.v_ActsSpacePointForSeed.empty() )
620 std::vector<ITk::SiSpacePointForSeed*> sp_storage;
623 std::unique_ptr< ActsTrk::SeedContainer > seedPtrs = std::make_unique< ActsTrk::SeedContainer >();
625 std::string combinationType = isPixel ?
"PPP" :
"SSS";
626 ATH_MSG_DEBUG(
"Running Seed Finding (" << combinationType <<
") ...");
633 Acts::Vector3 bField(
data.bField[0],
data.bField[1],
data.bField[2] );
639 data.v_ActsSpacePointForSeed,
645 data.v_ActsSpacePointForSeed,
651 if (
sc == StatusCode::FAILURE) {
652 ATH_MSG_ERROR(
"Error during seed production (" << combinationType <<
")");
677 data.i_ITkSeed =
data.i_ITkSeeds.begin();
688 if (
data.i_ITkSeed ==
data.i_ITkSeeds.end())
692 }
while (!(*
data.i_ITkSeed++).set3(
data.seedOutput, 1./(1000. *
data.K)));
695 return &
data.seedOutput;
707 std::lock_guard<std::mutex> lock(
m_mutex);
709 if(
track !=
nullptr) {
710 m_trackPt = (
track->trackParameters()->front()->pT())/1000.
f;
711 m_trackEta = std::abs(
track->trackParameters()->front()->eta());
718 m_z0 = seed->zVertex();
733 m_dzdr_b = seed->dzdr_b();
734 m_dzdr_t = seed->dzdr_t();
736 m_givesTrack = !(
track ==
nullptr);
750 MsgStream&
out)
const
764 std::string
s2,
s3,
s4, s5;
779 out<<
"|---------------------------------------------------------------------|"
795 out<<
"| useStripOverlap | "
798 out<<
"|---------------------------------------------------------------------|"
800 out<<
"| Beam X center | "
801 <<std::setw(12)<<std::setprecision(5)<<
data.xbeam[0]
803 out<<
"| Beam Y center | "
804 <<std::setw(12)<<std::setprecision(5)<<
data.ybeam[0]
806 out<<
"| Beam Z center | "
807 <<std::setw(12)<<std::setprecision(5)<<
data.zbeam[0]
809 out<<
"| Beam X-axis direction | "
810 <<std::setw(12)<<std::setprecision(5)<<
data.xbeam[1]
811 <<std::setw(12)<<std::setprecision(5)<<
data.xbeam[2]
812 <<std::setw(12)<<std::setprecision(5)<<
data.xbeam[3]
814 out<<
"| Beam Y-axis direction | "
815 <<std::setw(12)<<std::setprecision(5)<<
data.ybeam[1]
816 <<std::setw(12)<<std::setprecision(5)<<
data.ybeam[2]
817 <<std::setw(12)<<std::setprecision(5)<<
data.ybeam[3]
819 out<<
"| Beam Z-axis direction | "
820 <<std::setw(12)<<std::setprecision(5)<<
data.zbeam[1]
821 <<std::setw(12)<<std::setprecision(5)<<
data.zbeam[2]
822 <<std::setw(12)<<std::setprecision(5)<<
data.zbeam[3]
824 out<<
"|---------------------------------------------------------------------|"
837 out<<
"|---------------------------------------------------------------------|"
840 <<std::setw(12)<<
data.ns
843 <<std::setw(12)<<
data.nsaz
846 <<std::setw(12)<<
data.nsazv
848 out<<
"|---------------------------------------------------------------------|"
866 data.v_StripSpacePointForSeed.clear();
869 std::array<const Trk::SpacePoint*, 3> spacePoints {};
870 std::array<ITk::SiSpacePointForSeed*, 3> stripSpacePointsForSeeds {};
878 ATH_MSG_FATAL(
"no sctSpacePointLink/stripOverlapSpacePointLink for bottom sp!");
883 ATH_MSG_FATAL(
"no sctSpacePointLink/stripOverlapSpacePointLink for middle sp!");
888 ATH_MSG_FATAL(
"no sctSpacePointLink/stripOverlapSpacePointLink for top sp!");
892 for (std::size_t nsp(0ul); nsp < 3ul; ++nsp) {
893 spacePoints[nsp] = linkAcc.
isAvailable(*seed->sp()[nsp])
894 ? *linkAcc(*seed->sp()[nsp])
895 : *overlaplinkAcc(*seed->sp()[nsp]);
900 const auto& bottom_idx = seed->sp()[0]->measurements();
901 const auto& medium_idx = seed->sp()[1]->measurements();
902 const auto& top_idx = seed->sp()[2]->measurements();
904 std::array<const xAOD::StripCluster*, 6> strip_cluster {
913 if (not stripLinkAcc.
isAvailable(*strip_cluster[0]) or
915 ATH_MSG_FATAL(
"no sctClusterLink for clusters associated to bottom sp!");
918 if (not stripLinkAcc.
isAvailable(*strip_cluster[2]) or
920 ATH_MSG_FATAL(
"no sctClusterLink for clusters associated to middle sp!");
923 if (not stripLinkAcc.
isAvailable(*strip_cluster[4]) or
925 ATH_MSG_FATAL(
"no sctClusterLink for clusters associated to top sp!");
929 std::pair<std::size_t, std::size_t> key_b = std::make_pair(strip_cluster[0]->
index(), strip_cluster[1]->
index());
930 std::pair<std::size_t, std::size_t> key_m = std::make_pair(strip_cluster[2]->
index(), strip_cluster[3]->
index());
931 std::pair<std::size_t, std::size_t> key_t = std::make_pair(strip_cluster[4]->
index(), strip_cluster[5]->
index());
933 std::unique_ptr<InDet::SCT_SpacePoint>& ptr_b =
data.v_StripSpacePointForSeed[key_b];
935 ptr_b = std::make_unique<InDet::SCT_SpacePoint>(std::make_pair<IdentifierHash, IdentifierHash>(strip_cluster[0]->identifierHash(), strip_cluster[1]->identifierHash()),
936 Amg::Vector3D(seed->sp()[0]->x(), seed->sp()[0]->y(), seed->sp()[0]->z()),
937 std::make_pair<const Trk::PrepRawData*, const Trk::PrepRawData*>(*(stripLinkAcc(*strip_cluster[0])), *(stripLinkAcc(*strip_cluster[1]))));
939 std::unique_ptr<InDet::SCT_SpacePoint>& ptr_m =
data.v_StripSpacePointForSeed[key_m];
941 ptr_m = std::make_unique<InDet::SCT_SpacePoint>(std::make_pair<IdentifierHash, IdentifierHash>(strip_cluster[2]->identifierHash(), strip_cluster[3]->identifierHash()),
942 Amg::Vector3D(seed->sp()[1]->x(), seed->sp()[1]->y(), seed->sp()[1]->z()),
943 std::make_pair<const Trk::PrepRawData*, const Trk::PrepRawData*>(*(stripLinkAcc(*strip_cluster[2])), *(stripLinkAcc(*strip_cluster[3]))));
945 std::unique_ptr<InDet::SCT_SpacePoint>& ptr_t =
data.v_StripSpacePointForSeed[key_t];
947 ptr_t = std::make_unique<InDet::SCT_SpacePoint>(std::make_pair<IdentifierHash, IdentifierHash>(strip_cluster[4]->identifierHash(), strip_cluster[5]->identifierHash()),
948 Amg::Vector3D(seed->sp()[2]->x(), seed->sp()[2]->y(), seed->sp()[2]->z()),
949 std::make_pair<const Trk::PrepRawData*, const Trk::PrepRawData*>(*(stripLinkAcc(*strip_cluster[4])), *(stripLinkAcc(*strip_cluster[5]))));
953 data.v_StripSpacePointForSeed[key_b].get(),
954 data.v_StripSpacePointForSeed[key_m].get(),
955 data.v_StripSpacePointForSeed[key_t].get()
962 r[0] = seed->sp()[
index]->x();
963 r[1] = seed->sp()[
index]->y();
964 r[2] = seed->sp()[
index]->z();
967 stripSpacePointsForSeeds[
index]->setQuality(-seed->seedQuality());
970 data.i_ITkSeeds.emplace_back(stripSpacePointsForSeeds[0], stripSpacePointsForSeeds[1],
971 stripSpacePointsForSeeds[2], seed->z());
972 data.i_ITkSeeds.back().setQuality(-seed->seedQuality());
989 data.v_PixelSpacePointForSeed.clear();
992 data.v_PixelSiSpacePointForSeed.clear();
993 data.v_PixelSiSpacePointForSeed.reserve(
data.ns);
994 std::unordered_map<std::size_t, std::size_t> bridge_idx_sispacepoints;
996 std::array<const Trk::SpacePoint*, 3> spacePoints {
nullptr,
nullptr,
nullptr};
997 std::array<ITk::SiSpacePointForSeed*, 3> pixelSpacePointsForSeeds {
nullptr,
nullptr,
nullptr};
1000 std::array<std::size_t, 3> indexes {
1001 seed->sp()[0]->index(),
1002 seed->sp()[1]->index(),
1003 seed->sp()[2]->index()
1006 const auto [bottom_idx, medium_idx, top_idx] = indexes;
1007 std::size_t max_index =
std::max(bottom_idx,
std::max(medium_idx, top_idx));
1008 if (
data.v_PixelSpacePointForSeed.size() < max_index + 1) {
1009 data.v_PixelSpacePointForSeed.resize( max_index + 1 );
1029 *linkAcc(*seed->sp()[0]),
1030 *linkAcc(*seed->sp()[1]),
1031 *linkAcc(*seed->sp()[2])
1040 if (not pixelLinkAcc.
isAvailable(*bottom_cluster)) {
1041 ATH_MSG_FATAL(
"no pixelClusterLink for cluster associated to bottom sp!");
1044 if (not pixelLinkAcc.
isAvailable(*medium_cluster)) {
1045 ATH_MSG_FATAL(
"no pixelClusterLink for cluster associated to middle sp!");
1049 ATH_MSG_FATAL(
"no pixelClusterLink for cluster associated to top sp!");
1053 if (not
data.v_PixelSpacePointForSeed[bottom_idx])
1054 data.v_PixelSpacePointForSeed[bottom_idx] = std::make_unique<InDet::PixelSpacePoint>(bottom_cluster->
identifierHash(), *(pixelLinkAcc(*bottom_cluster)));
1055 if (not
data.v_PixelSpacePointForSeed[medium_idx])
1056 data.v_PixelSpacePointForSeed[medium_idx] = std::make_unique<InDet::PixelSpacePoint>(medium_cluster->
identifierHash(), *(pixelLinkAcc(*medium_cluster)));
1057 if (not
data.v_PixelSpacePointForSeed[top_idx])
1058 data.v_PixelSpacePointForSeed[top_idx] = std::make_unique<InDet::PixelSpacePoint>(top_cluster->
identifierHash(), *(pixelLinkAcc(*top_cluster)));
1061 data.v_PixelSpacePointForSeed[bottom_idx].get(),
1062 data.v_PixelSpacePointForSeed[medium_idx].get(),
1063 data.v_PixelSpacePointForSeed[top_idx].get()
1069 std::size_t sp_idx = indexes[
index];
1074 auto [itr, outcome] = bridge_idx_sispacepoints.try_emplace(sp_idx,
data.v_PixelSiSpacePointForSeed.size());
1075 std::size_t mapped_idx = itr->second;
1079 r[0] = seed->sp()[
index]->x();
1080 r[1] = seed->sp()[
index]->y();
1081 r[2] = seed->sp()[
index]->z();
1083 data.v_PixelSiSpacePointForSeed.emplace_back( spacePoints[
index],
r );
1086 data.v_PixelSiSpacePointForSeed[mapped_idx].setQuality(-seed->seedQuality());
1087 pixelSpacePointsForSeeds[
index] = &
data.v_PixelSiSpacePointForSeed[mapped_idx];
1090 data.i_ITkSeeds.emplace_back(pixelSpacePointsForSeeds[0],
1091 pixelSpacePointsForSeeds[1],
1092 pixelSpacePointsForSeeds[2],
1094 data.i_ITkSeeds.back().setQuality(-seed->seedQuality());