5 #ifndef _VrtSecInclusive_VrtSecInclusive_Utilities_H
6 #define _VrtSecInclusive_VrtSecInclusive_Utilities_H
28 setIntersection( trk,
layer, per );
38 template<
class TrackT>
44 const EventContext& ctx = Gaudi::Hive::currentContext();
45 std::unique_ptr<Trk::TrackParameters>
Output;
51 ATH_MSG_VERBOSE(
" >>> setIntersection: name = " << barrel->name() <<
", Radius = " << barrel->radius() );
58 barrel->x()->push_back(
Output?
Output->position().x() : -10000 );
59 barrel->y()->push_back(
Output?
Output->position().y() : -10000 );
60 barrel->z()->push_back(
Output?
Output->position().z() : -10000 );
68 ", zpos = " << endcap->
zpos() <<
69 ", Rmin = " << endcap->
rmin() <<
70 ", Rmax = " << endcap->
rmax() );
78 endcap->
x()->push_back(
Output?
Output->position().x() : -10000 );
79 endcap->
y()->push_back(
Output?
Output->position().y() : -10000 );
80 endcap->
z()->push_back(
Output?
Output->position().z() : -10000 );
86 trk->template auxdecor<float>( Form(
"intersection_%s_x",
layer->name().c_str()) ) =
Output->position().x();
87 trk->template auxdecor<float>( Form(
"intersection_%s_y",
layer->name().c_str()) ) =
Output->position().y();
88 trk->template auxdecor<float>( Form(
"intersection_%s_z",
layer->name().c_str()) ) =
Output->position().z();
93 template<
class LeptonFlavor>
94 void genSequence(
const LeptonFlavor*, std::vector<unsigned>& ) {}
100 template<
class LeptonFlavor>
107 template<
class LeptonFlavor>
112 ATH_CHECK( evtStore()->
retrieve( secondaryVertexContainer,
"VrtSecInclusive_" + m_jp.secondaryVerticesContainerName ) );
116 const LeptonContainer *leptonContainer(
nullptr );
119 if( !m_decor_d0_wrtSVs ) m_decor_d0_wrtSVs = std::make_unique<IPDecoratorType>(
"d0_wrtSVs" + m_jp.augVerString );
120 if( !m_decor_z0_wrtSVs ) m_decor_z0_wrtSVs = std::make_unique<IPDecoratorType>(
"z0_wrtSVs" + m_jp.augVerString );
121 if( !m_decor_pt_wrtSVs ) m_decor_pt_wrtSVs = std::make_unique<IPDecoratorType>(
"pt_wrtSVs" + m_jp.augVerString );
122 if( !m_decor_eta_wrtSVs ) m_decor_eta_wrtSVs = std::make_unique<IPDecoratorType>(
"eta_wrtSVs" + m_jp.augVerString );
123 if( !m_decor_phi_wrtSVs ) m_decor_phi_wrtSVs = std::make_unique<IPDecoratorType>(
"phi_wrtSVs" + m_jp.augVerString );
124 if( !m_decor_d0err_wrtSVs ) m_decor_d0err_wrtSVs = std::make_unique<IPDecoratorType>(
"d0err_wrtSVs" + m_jp.augVerString );
125 if( !m_decor_z0err_wrtSVs ) m_decor_z0err_wrtSVs = std::make_unique<IPDecoratorType>(
"z0err_wrtSVs" + m_jp.augVerString );
128 std::vector< IPDecoratorType* > decor_ipWrtSVs { m_decor_d0_wrtSVs.get(), m_decor_z0_wrtSVs.get(), m_decor_pt_wrtSVs.get(), m_decor_eta_wrtSVs.get(), m_decor_phi_wrtSVs.get(), m_decor_d0err_wrtSVs.get(), m_decor_z0err_wrtSVs.get() };
129 enum { k_ip_d0, k_ip_z0, k_ip_pt, k_ip_eta, k_ip_phi, k_ip_d0err, k_ip_z0err };
131 if( !m_decor_svLink ) m_decor_svLink = std::make_unique< VertexELType >(
"svLinks" + m_jp.augVerString );
134 for(
const auto& lepton : *leptonContainer ) {
136 std::vector< std::vector< std::vector<float> > > ip_wrtSVs( decor_ipWrtSVs.size() );
138 bool linkFlag {
false };
140 std::vector<unsigned> trackTypes;
141 genSequence<LeptonFlavor>( lepton, trackTypes );
144 for(
auto& trackType : trackTypes ) {
146 std::vector< std::vector<float> > ip_wrtSV( decor_ipWrtSVs.size() );
148 const auto* trk = getLeptonTrackParticle<LeptonFlavor>( lepton, trackType );
152 std::map< const xAOD::Vertex*, std::vector<double> > distanceMap;
154 std::vector<ElementLink< xAOD::VertexContainer > >
links;
157 for(
const auto vtx : *secondaryVertexContainer ) {
159 std::vector<double> impactParameters;
160 std::vector<double> impactParErrors;
162 m_fitSvc->VKalGetImpact( trk, vtx->position(),
static_cast<int>( lepton->charge() ), impactParameters, impactParErrors );
164 enum { k_d0, k_z0, k_theta, k_phi, k_qOverP };
165 enum { k_d0d0, k_d0z0, k_z0z0 };
167 const auto&
theta = impactParameters.at( k_theta );
168 const auto&
phi = impactParameters.at( k_phi );
169 const auto p = fabs( 1.0 / impactParameters.at(k_qOverP) );
174 ip_wrtSV.at( k_ip_d0 ) .emplace_back( impactParameters.at(k_d0) );
175 ip_wrtSV.at( k_ip_z0 ) .emplace_back( impactParameters.at(k_z0) );
176 ip_wrtSV.at( k_ip_pt ) .emplace_back(
pt );
177 ip_wrtSV.at( k_ip_eta ) .emplace_back(
eta );
178 ip_wrtSV.at( k_ip_phi ) .emplace_back(
phi );
179 ip_wrtSV.at( k_ip_d0err ) .emplace_back( impactParErrors.at(k_d0d0) );
180 ip_wrtSV.at( k_ip_z0err ) .emplace_back( impactParErrors.at(k_z0z0) );
185 links.emplace_back( link_SV );
193 ( *m_decor_svLink )( *lepton ) =
links;
197 for(
size_t ipar = 0; ipar < ip_wrtSVs.size(); ipar++ ) ip_wrtSVs.at( ipar ).emplace_back( ip_wrtSV.at( ipar ) );
202 for(
size_t ipar = 0; ipar < decor_ipWrtSVs.size(); ipar++ ) ( *( decor_ipWrtSVs.at( ipar ) ) )( *lepton ) = ip_wrtSVs.at( ipar );
206 return StatusCode::SUCCESS;