diff --git a/Reconstruction/VKalVrt/VrtSecInclusive/VrtSecInclusive/details/Utilities.h b/Reconstruction/VKalVrt/VrtSecInclusive/VrtSecInclusive/details/Utilities.h index f06f8bcd3d14d38a752463559fe190a5f904d7b8..87d3c3d7acb851d725494b4228a853785c4aa949 100644 --- a/Reconstruction/VKalVrt/VrtSecInclusive/VrtSecInclusive/details/Utilities.h +++ b/Reconstruction/VKalVrt/VrtSecInclusive/VrtSecInclusive/details/Utilities.h @@ -111,18 +111,25 @@ namespace VKalVrtAthena { const LeptonContainer *leptonContainer( nullptr ); ATH_CHECK( evtStore()->retrieve( leptonContainer, containerName ) ); - static SG::AuxElement::Decorator< std::vector< std::vector<float> > > decor_d0wrtSV( "d0_wrtSVs" ); - static SG::AuxElement::Decorator< std::vector< std::vector<float> > > decor_z0wrtSV( "z0_wrtSVs" ); + using IPDecoratorType = SG::AuxElement::Decorator< std::vector< std::vector<float> > >; + static IPDecoratorType decor_d0wrtSV ( "d0_wrtSVs" ); + static IPDecoratorType decor_z0wrtSV ( "z0_wrtSVs" ); + static IPDecoratorType decor_ptwrtSV ( "pt_wrtSVs" ); + static IPDecoratorType decor_etawrtSV ( "eta_wrtSVs" ); + static IPDecoratorType decor_phiwrtSV ( "phi_wrtSVs" ); + static IPDecoratorType decor_d0errWrtSV ( "d0err_wrtSVs" ); + static IPDecoratorType decor_z0errWrtSV ( "z0err_wrtSVs" ); + + // Grouping decorators + std::vector< IPDecoratorType > decor_ipWrtSVs { decor_d0wrtSV, decor_z0wrtSV, decor_ptwrtSV, decor_etawrtSV, decor_phiwrtSV, decor_d0errWrtSV, decor_z0errWrtSV }; + enum { k_ip_d0, k_ip_z0, k_ip_pt, k_ip_eta, k_ip_phi, k_ip_d0err, k_ip_z0err }; + static SG::AuxElement::Decorator< std::vector<ElementLink< xAOD::VertexContainer > > > decor_svLink("svLinks"); - std::vector< std::vector<float> > d0wrtSVs; - std::vector< std::vector<float> > z0wrtSVs; - - // Loop over muons + // Loop over leptons for( const auto& lepton : *leptonContainer ) { - d0wrtSVs.clear(); - z0wrtSVs.clear(); + std::vector< std::vector< std::vector<float> > > ip_wrtSVs( decor_ipWrtSVs.size() ); // triple nest of { ip parameters, tracks, DVs } bool linkFlag { false }; @@ -132,8 +139,7 @@ namespace VKalVrtAthena { // Loop over lepton types for( auto& trackType : trackTypes ) { - std::vector<float> d0wrtSV; - std::vector<float> z0wrtSV; + std::vector< std::vector<float> > ip_wrtSV( decor_ipWrtSVs.size() ); // nest of { tracks, DVs } const auto* trk = getLeptonTrackParticle<LeptonFlavor>( lepton, trackType ); @@ -142,18 +148,32 @@ namespace VKalVrtAthena { std::map< const xAOD::Vertex*, std::vector<double> > distanceMap; std::vector<ElementLink< xAOD::VertexContainer > > links; - + + // Loop over vertices for( const auto& vtx : *secondaryVertexContainer ) { std::vector<double> impactParameters; std::vector<double> impactParErrors; - m_fitSvc->VKalGetImpact( trk, vtx->position(), static_cast<int>( lepton->charge() ), impactParameters, impactParErrors); + m_fitSvc->VKalGetImpact( trk, vtx->position(), static_cast<int>( lepton->charge() ), impactParameters, impactParErrors ); - enum { k_d0, k_z0, k_theta, k_phi, k_qOverP }; + enum { k_d0, k_z0, k_theta, k_phi, k_qOverP }; // for the impact parameter + enum { k_d0d0, k_d0z0, k_z0z0 }; // for the par errors - d0wrtSV.emplace_back( impactParameters.at(k_d0) ); - z0wrtSV.emplace_back( impactParameters.at(k_z0) ); + const auto& theta = impactParameters.at( k_theta ); + const auto& phi = impactParameters.at( k_phi ); + const auto p = fabs( 1.0 / impactParameters.at(k_qOverP) ); + const auto pt = fabs( p * sin( theta ) ); + const auto eta = -log( tan(theta/2.) ); + + // filling the parameters to the corresponding container + ip_wrtSV.at( k_ip_d0 ) .emplace_back( impactParameters.at(k_d0) ); + ip_wrtSV.at( k_ip_z0 ) .emplace_back( impactParameters.at(k_d0) ); + ip_wrtSV.at( k_ip_pt ) .emplace_back( pt ); + ip_wrtSV.at( k_ip_eta ) .emplace_back( eta ); + ip_wrtSV.at( k_ip_phi ) .emplace_back( phi ); + ip_wrtSV.at( k_ip_d0err ) .emplace_back( impactParErrors.at(k_d0d0) ); + ip_wrtSV.at( k_ip_z0err ) .emplace_back( impactParErrors.at(k_z0z0) ); if( !linkFlag ) { @@ -162,22 +182,22 @@ namespace VKalVrtAthena { } - } - + } // end of vertex loop + + // The linking to the vertices need to be done only once if( !linkFlag ) { decor_svLink ( *lepton ) = links; linkFlag = true; } - d0wrtSVs.emplace_back( d0wrtSV ); - z0wrtSVs.emplace_back( z0wrtSV ); + for( size_t ipar = 0; ipar < ip_wrtSVs.size(); ipar++ ) ip_wrtSVs.at( ipar ).emplace_back( ip_wrtSV.at( ipar ) ); - } + } // end of track type loop - decor_d0wrtSV( *lepton ) = d0wrtSVs; - decor_z0wrtSV( *lepton ) = z0wrtSVs; + // decoration + for( size_t ipar = 0; ipar < decor_ipWrtSVs.size(); ipar++ ) decor_ipWrtSVs.at( ipar )( *lepton ) = ip_wrtSVs.at( ipar ); - } + } // end of lepton container loop return StatusCode::SUCCESS; }