10 #include "GaudiKernel/SystemOfUnits.h"
12 #include "GaudiKernel/PhysicalConstants.h"
24 #include <unordered_map>
47 ISvcLocator* pSvcLocator ) :
49 m_lumiBlockMuTool(
"LumiBlockMuTool/LumiBlockMuTool")
64 std::string sth =
results[1].str();
65 std::string swp =
results[2].str();
67 int thres = std::stoi(sth);
93 std::string weightfile[2];
96 for (
unsigned int i=0;
i<2; ++
i) {
97 std::unique_ptr<TFile>
rootFile(TFile::Open(weightfile[
i].c_str(),
"READ"));
100 return StatusCode::FAILURE;
102 std::unique_ptr<TTree>
tree((TTree*)
rootFile->Get(
"BDT"));
104 ATH_MSG_ERROR(
"Can not find BDT tree in file: " << weightfile[
i]);
105 return StatusCode::FAILURE;
107 ATH_MSG_INFO(
"Loading BDT tree from file: " << weightfile[
i]);
111 return StatusCode::SUCCESS;
121 std::vector<TrigSiSpacePointBase> convertedSpacePoints;
122 convertedSpacePoints.reserve(5000);
135 auto monitorIt =
Monitored::Group(
m_monTool, mon_n_dvtrks, mon_n_dvsps, mon_n_jetseeds, mon_n_jetseedsdel, mon_n_spseeds, mon_n_spseedsdel, mon_average_mu );
140 ATH_CHECK( previousDecisionsHandle.isValid() );
142 ATH_MSG_DEBUG(
"Running with " << previousDecisionsHandle->size() <<
" previous decisions" );
143 if( previousDecisionsHandle->size()!=1 ) {
144 ATH_MSG_ERROR(
"Previous decision handle size is not 1. It is" << previousDecisionsHandle->size() );
145 return StatusCode::FAILURE;
147 const Decision * previousDecision = previousDecisionsHandle->at(0);
152 for(
auto decisionID: previousDecisionIDs) {
ATH_MSG_DEBUG(
" " << decisionID ); }
157 auto outputDecisions = outputHandle.
ptr();
167 if( jetsContainer ==
nullptr ) {
169 return StatusCode::FAILURE;
171 bool isJetEtPassToolsCut =
false;
172 float jetEtaToolsCut = 2.0;
176 float jet_eta =
static_cast<float>(
jet->eta());
178 isJetEtPassToolsCut =
true;
186 std::vector<HitDVSeed> hitDVSeedsContainer;
187 std::vector<HitDVTrk> hitDVTrksContainer;
188 std::vector<HitDVSpacePoint> hitDVSPsContainer;
191 ATH_CHECK(
findHitDV(context, convertedSpacePoints, *tracks, hitDVSeedsContainer, hitDVTrksContainer, hitDVSPsContainer) );
193 mon_n_dvtrks = hitDVTrksContainer.size();
194 mon_n_dvsps = hitDVSPsContainer.size();
195 const unsigned int N_MAX_SP_STORED = 100000;
196 bool isSPOverflow =
false;
197 if( hitDVSPsContainer.size() >= N_MAX_SP_STORED ) isSPOverflow =
true;
204 averageMu =
static_cast<float>(
m_lumiBlockMuTool->averageInteractionsPerCrossing(context));
213 mon_average_mu = averageMu;
216 std::vector<float> jetSeeds_pt;
217 std::vector<float> jetSeeds_eta;
218 std::vector<float> jetSeeds_phi;
220 int n_alljetseeds = jetSeeds_eta.size();
222 mon_n_jetseeds = jetSeeds_eta.size();
223 mon_n_jetseedsdel = n_alljetseeds - jetSeeds_eta.size();
226 std::vector<float> spSeeds_eta;
227 std::vector<float> spSeeds_phi;
228 std::vector<float> void_pt;
229 int n_allspseeds = 0;
232 n_allspseeds = spSeeds_eta.size();
234 mon_n_spseeds = spSeeds_eta.size();
235 mon_n_spseedsdel = n_allspseeds - spSeeds_eta.size();
239 mon_n_spseedsdel = 0;
243 auto hitDVContainer = std::make_unique<xAOD::TrigCompositeContainer>();
244 auto hitDVContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>();
245 hitDVContainer->setStore(hitDVContainerAux.get());
248 std::vector<TrigHitDVHypoTool::HitDVHypoInfo> hitDVHypoInputs;
249 std::unordered_map<Decision*, size_t> mapDecIdx;
252 if( isJetEtPassToolsCut ) {
253 const float preselBDTthreshold = -0.6;
255 int n_passed_jet = 0;
256 int seed_type = SeedType::HLTJet;
257 ATH_CHECK(
calculateBDT(hitDVSPsContainer, hitDVTrksContainer, jetSeeds_pt, jetSeeds_eta, jetSeeds_phi, preselBDTthreshold, seed_type, dvContainer, n_passed_jet) );
261 seed_type = SeedType::SP;
262 ATH_CHECK(
calculateBDT(hitDVSPsContainer, hitDVTrksContainer, void_pt, spSeeds_eta, spSeeds_phi, preselBDTthreshold, seed_type, dvContainer, n_passed_sp) );
265 ATH_MSG_DEBUG(
"nr of dv container / jet-seeded / sp-seed candidates = " << dvContainer->
size() <<
" / " << n_passed_jet <<
" / " << n_passed_sp );
268 for (
auto dv : *dvContainer ) {
270 mapDecIdx.emplace( newDecision,
dv->index() );
272 hitDVHypoInputs.push_back( hypoInfo );
287 ATH_CHECK( hitDVHandle.
record( std::move( hitDVContainer ), std::move( hitDVContainerAux ) ) );
291 while(
it != outputDecisions->end()) {
295 it = outputDecisions->erase(
it);
301 size_t idx = mapDecIdx.at(*
it);
317 return StatusCode::SUCCESS;
325 float dEta = eta_1 - eta_2;
334 float abseta = std::fabs(
eta);
347 const float PixBR6limit = 1.29612;
348 const float PixBR5limit = 1.45204;
349 const float PixBR4limit = 1.64909;
350 const float PixBR3limit = 1.90036;
351 const float PixBR2limit = 2.2146;
357 if( abseta > PixBR2limit )
return 2;
365 if( abseta > PixBR2limit )
return 2;
380 if( abseta < PixBR6limit )
return 7;
381 else if( abseta < PixBR5limit )
return 6;
389 if( abseta < PixBR5limit )
return 7;
390 else if( abseta < PixBR4limit )
return 6;
398 if( abseta < PixBR4limit )
return 7;
406 if( abseta < PixBR4limit )
return 6;
407 else if( abseta < PixBR3limit )
return 6;
415 if( abseta < PixBR3limit )
return 7;
423 if( abseta < PixBR3limit )
return 6;
431 if( abseta < PixBR3limit )
return 7;
439 if( abseta < PixBR3limit )
return 7;
459 "ly0_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly0_sp_frac"); });
461 "ly1_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly1_sp_frac"); });
463 "ly2_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly2_sp_frac"); });
465 "ly3_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly3_sp_frac"); });
467 "ly4_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly4_sp_frac"); });
469 "ly5_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly5_sp_frac"); });
471 "ly6_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly6_sp_frac"); });
473 "ly7_spfr", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_ly7_sp_frac"); });
475 "bdtscore", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
float>(
"hitDV_bdt_score"); });
477 "n_qtrk", *dvContainer, [&](
const Decision*
d){
return d->getDetail<
int>(
"hitDV_n_track_qual"); });
480 std::vector<char> mask_eta1(dvContainer->
size(), 0);
481 std::vector<char> mask_1eta2(dvContainer->
size(), 0);
485 for (
size_t i = 0;
i<dvContainer->
size(); ++
i) {
489 if(
dv->getDetail<
int>(
"hitDV_seed_type") == SeedType::SP )
continue;
492 const float abs_eta = std::abs(
dv->getDetail<
float>(
"hitDV_seed_eta"));
493 if ( abs_eta < 1.0 ) mask_eta1[
i] = 1;
494 else if( abs_eta < 2.0 ) mask_1eta2[
i] = 1;
498 mon_ly0_spfr, mon_ly1_spfr, mon_ly2_spfr, mon_ly3_spfr,
499 mon_ly4_spfr, mon_ly5_spfr, mon_ly6_spfr, mon_ly7_spfr,
500 mon_n_qtrk, mon_bdtscore, mon_eta1_mask, mon_1eta2_mask );
502 return StatusCode::SUCCESS;
509 const std::vector<HitDVTrk>& trksContainer,
510 const std::vector<float>& seeds_pt,
511 const std::vector<float>& seeds_eta,
const std::vector<float>& seeds_phi,
512 const float& cutBDTthreshold,
const int seed_type,
515 if( seeds_eta.size() != seeds_phi.size() )
return StatusCode::SUCCESS;
518 for(
unsigned int iseed=0; iseed<seeds_eta.size(); iseed++) {
520 float seed_eta = seeds_eta[iseed];
521 float seed_phi = seeds_phi[iseed];
523 ATH_MSG_VERBOSE(
"+++++ seed eta: " << seed_eta <<
", phi:" << seed_phi <<
" +++++");
527 const float DR_SQUARED_TO_REF_CUT = 0.16;
530 int n_sp_injet_usedByTrk = 0;
532 int v_n_sp_injet_usedByTrk[
N_LAYER];
533 for(
int i=0;
i<
N_LAYER;
i++) { v_n_sp_injet[
i]=0; v_n_sp_injet_usedByTrk[
i]=0; }
535 for (
const auto & spData : spsContainer ) {
537 float sp_eta = spData.eta;
538 float sp_phi = spData.phi;
539 float dR2 =
deltaR2(sp_eta,sp_phi,seed_eta,seed_phi);
540 if( dR2 > DR_SQUARED_TO_REF_CUT )
continue;
543 int sp_layer = (
int)spData.layer;
544 int sp_trkid = (
int)spData.usedTrkId;
545 bool isUsedByTrk = (sp_trkid != -1);
551 v_n_sp_injet[ilayer]++;
553 n_sp_injet_usedByTrk++;
554 v_n_sp_injet_usedByTrk[ilayer]++;
558 ATH_MSG_VERBOSE(
"nr of SPs in jet: usedByTrk / all = " << n_sp_injet_usedByTrk <<
" / " << n_sp_injet);
562 if( v_n_sp_injet[
i] > 0 )
frac = 1.0 -
static_cast<float>(v_n_sp_injet_usedByTrk[
i]) /
static_cast<float>(v_n_sp_injet[
i]);
563 v_ly_sp_frac[
i] =
frac;
564 ATH_MSG_VERBOSE(
"Layer " <<
i <<
": frac=" << v_ly_sp_frac[
i] <<
", n used / all = " << v_n_sp_injet_usedByTrk[
i] <<
" / " << v_n_sp_injet[
i]);
568 const float TRK_PT_GEV_CUT = 2.0;
570 unsigned int n_qtrk_injet = 0;
571 for (
const auto& trk : trksContainer ) {
572 float trk_ptGeV = trk.pt;
574 if( trk_ptGeV < TRK_PT_GEV_CUT )
continue;
575 float dR2 =
deltaR2(trk.eta,trk.phi,seed_eta,seed_phi);
576 if( dR2 > DR_SQUARED_TO_REF_CUT )
continue;
579 ATH_MSG_DEBUG(
"nr of all / quality tracks matched = " << trksContainer.size() <<
" / " << n_qtrk_injet);
582 bool isSeedOutOfRange =
false;
583 if( n_qtrk_injet == 0 ) {
584 isSeedOutOfRange =
true;
586 if( std::fabs(v_ly_sp_frac[
i]) > 1
e-3 ) {
587 isSeedOutOfRange =
false;
break;
591 float bdt_score = -2.0;
592 if( ! isSeedOutOfRange ) {
593 const std::vector<float> input_values = {
594 static_cast<float>(n_qtrk_injet),
604 if ( std::abs(seed_eta) < 1 ) {
605 bdt_score =
m_bdt_eta[0]->GetClassification(input_values);
606 }
else if ( std::abs(seed_eta) < 2 ) {
607 bdt_score =
m_bdt_eta[1]->GetClassification(input_values);
612 if( bdt_score < cutBDTthreshold )
continue;
620 dv->makePrivateStore();
624 if ( seed_type == SeedType::HLTJet ) seed_pt = seeds_pt[iseed];
625 dv->setDetail<
float>(
"hitDV_seed_pt", seed_pt);
626 dv->setDetail<
float>(
"hitDV_seed_eta", seed_eta);
627 dv->setDetail<
float>(
"hitDV_seed_phi", seed_phi);
628 dv->setDetail<
int> (
"hitDV_seed_type", seed_type);
629 dv->setDetail<
int> (
"hitDV_n_track_qual", n_qtrk_injet);
630 dv->setDetail<
float>(
"hitDV_ly0_sp_frac", v_ly_sp_frac[0]);
631 dv->setDetail<
float>(
"hitDV_ly1_sp_frac", v_ly_sp_frac[1]);
632 dv->setDetail<
float>(
"hitDV_ly2_sp_frac", v_ly_sp_frac[2]);
633 dv->setDetail<
float>(
"hitDV_ly3_sp_frac", v_ly_sp_frac[3]);
634 dv->setDetail<
float>(
"hitDV_ly4_sp_frac", v_ly_sp_frac[4]);
635 dv->setDetail<
float>(
"hitDV_ly5_sp_frac", v_ly_sp_frac[5]);
636 dv->setDetail<
float>(
"hitDV_ly6_sp_frac", v_ly_sp_frac[6]);
637 dv->setDetail<
float>(
"hitDV_ly7_sp_frac", v_ly_sp_frac[7]);
638 dv->setDetail<
float>(
"hitDV_bdt_score", bdt_score);
645 return StatusCode::SUCCESS;
652 std::vector<float>& jetSeeds_pt, std::vector<float>& jetSeeds_eta, std::vector<float>& jetSeeds_phi)
const
654 std::vector<float> mnt_jet_pt;
655 std::vector<float> mnt_jet_eta;
660 ATH_MSG_VERBOSE(
"looking for jet seed with pt cut=" << cutJetPt <<
", eta cut=" << cutJetEta);
663 if( jet_pt < cutJetPt ) {
667 mnt_jet_pt.push_back(jet_pt);
668 float jet_eta =
static_cast<float>(
jet->eta());
669 mnt_jet_eta.push_back(jet_eta);
670 if( std::fabs(jet_eta) > cutJetEta ) {
674 float jet_phi =
static_cast<float>(
jet->phi());
675 jetSeeds_pt.push_back(jet_pt);
676 jetSeeds_eta.push_back(jet_eta);
677 jetSeeds_phi.push_back(
jet_phi);
681 return StatusCode::SUCCESS;
688 std::vector<float>& seeds_eta, std::vector<float>& seeds_phi )
const
693 const int NBINS_ETA = 50;
694 const float ETA_MIN = -2.5;
695 const float ETA_MAX = 2.5;
697 const int NBINS_PHI = 80;
698 const float PHI_MIN = -4.0;
699 const float PHI_MAX = 4.0;
703 unsigned int slotnr = ctx.slot();
704 unsigned int subSlotnr = ctx.subSlot();
706 sprintf(
hname,
"hitdv_s%u_ss%u_ly6_h2_nsp",slotnr,subSlotnr);
707 std::unique_ptr<TH2F> ly6_h2_nsp = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
708 sprintf(
hname,
"hitdv_s%u_ss%u_ly7_h2_nsp",slotnr,subSlotnr);
709 std::unique_ptr<TH2F> ly7_h2_nsp = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
711 sprintf(
hname,
"hitdv_s%u_ss%u_ly6_h2_nsp_notrk",slotnr,subSlotnr);
712 std::unique_ptr<TH2F> ly6_h2_nsp_notrk = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
713 sprintf(
hname,
"hitdv_s%u_ss%u_ly7_h2_nsp_notrk",slotnr,subSlotnr);
714 std::unique_ptr<TH2F> ly7_h2_nsp_notrk = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
716 for (
const auto& spData : spsContainer ) {
717 int16_t sp_layer = spData.layer;
718 float sp_eta = spData.eta;
720 if( ilayer<6 )
continue;
722 int sp_trkid = (
int)spData.usedTrkId;
723 bool isUsedByTrk = (sp_trkid != -1);
724 float sp_phi = spData.phi;
726 bool fill_out_of_pi =
false;
729 sp_phi2 = 2*TMath::Pi() + sp_phi;
730 if( sp_phi2 < PHI_MAX ) fill_out_of_pi =
true;
733 sp_phi2 = -2*TMath::Pi() + sp_phi;
734 if( PHI_MIN < sp_phi2 ) fill_out_of_pi =
true;
737 ly6_h2_nsp->Fill(sp_eta,sp_phi);
738 if( fill_out_of_pi ) ly6_h2_nsp->Fill(sp_eta,sp_phi2);
739 if( ! isUsedByTrk ) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi);
740 if( ! isUsedByTrk && fill_out_of_pi) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
743 ly7_h2_nsp->Fill(sp_eta,sp_phi);
744 if( fill_out_of_pi ) ly7_h2_nsp->Fill(sp_eta,sp_phi2);
745 if( ! isUsedByTrk ) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi);
746 if( ! isUsedByTrk && fill_out_of_pi) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
753 std::vector<std::tuple<int,float,float,float>> QT;
755 for(
int ly6_ieta=1; ly6_ieta<=NBINS_ETA; ly6_ieta++) {
756 float ly6_eta = (ly6_h2_nsp->GetXaxis()->GetBinLowEdge(ly6_ieta) + ly6_h2_nsp->GetXaxis()->GetBinUpEdge(ly6_ieta))/2.0;
757 for(
int ly6_iphi=1; ly6_iphi<=NBINS_PHI; ly6_iphi++) {
758 float ly6_phi = (ly6_h2_nsp->GetYaxis()->GetBinLowEdge(ly6_iphi) + ly6_h2_nsp->GetYaxis()->GetBinUpEdge(ly6_iphi))/2.0;
760 float ly6_nsp = ly6_h2_nsp ->GetBinContent(ly6_ieta,ly6_iphi);
761 float ly6_nsp_notrk = ly6_h2_nsp_notrk->GetBinContent(ly6_ieta,ly6_iphi);
762 float ly6_frac = ( ly6_nsp > 0 ) ? ly6_nsp_notrk / ly6_nsp : 0;
763 if( ly6_nsp < 10 || ly6_frac < 0.85 )
continue;
765 float ly7_frac_max = 0;
766 float ly7_eta_max = 0;
767 float ly7_phi_max = 0;
768 for(
int ly7_ieta=
std::max(1,ly6_ieta-1); ly7_ieta<
std::min(NBINS_ETA,ly6_ieta+1); ly7_ieta++) {
769 for(
int ly7_iphi=
std::max(1,ly6_iphi-1); ly7_iphi<=
std::min(NBINS_PHI,ly6_iphi+1); ly7_iphi++) {
770 float ly7_nsp = ly7_h2_nsp ->GetBinContent(ly7_ieta,ly7_iphi);
771 float ly7_nsp_notrk = ly7_h2_nsp_notrk->GetBinContent(ly7_ieta,ly7_iphi);
772 float ly7_frac = ( ly7_nsp > 0 ) ? ly7_nsp_notrk / ly7_nsp : 0;
773 if( ly7_nsp < 10 )
continue;
774 if( ly7_frac > ly7_frac_max ) {
775 ly7_frac_max = ly7_frac;
776 ly7_eta_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_ieta) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_ieta))/2.0;
777 ly7_phi_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_iphi) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_iphi))/2.0;
781 if( ly7_frac_max < 0.85 )
continue;
783 float wsum = ly6_frac + ly7_frac_max;
784 float weta = (ly6_eta*ly6_frac + ly7_eta_max*ly7_frac_max) / wsum;
785 float wphi = (ly6_phi*ly6_frac + ly7_phi_max*ly7_frac_max) / wsum;
786 float w = wsum / 2.0;
787 QT.push_back(std::make_tuple(-1,
w,weta,wphi));
790 ATH_MSG_VERBOSE(
"nr of ly6/ly7 doublet candidate seeds=" << QT.size() <<
", doing clustering...");
793 std::sort(QT.begin(), QT.end(),
794 [](
const std::tuple<int,float,float,float>& lhs,
const std::tuple<int,float,float,float>& rhs) {
795 return std::get<1>(lhs) > std::get<1>(rhs); } );
798 const double CLUSTCUT_DIST_SQUARED = 0.04;
799 const double CLUSTCUT_SEED_FRAC = 0.9;
801 std::vector<float> seeds_wsum;
803 for(
unsigned int i=0;
i<QT.size();
i++) {
804 float phi = std::get<3>(QT[
i]);
805 float eta = std::get<2>(QT[
i]);
806 float w = std::get<1>(QT[
i]);
808 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
809 seeds_wsum.push_back(
w);
812 const int IDX_INITIAL = 100;
813 float dist2_min = 100.0;
815 for(
unsigned j=0; j<seeds_eta.size(); j++) {
816 float ceta = seeds_eta[j]/seeds_wsum[j];
817 float cphi = seeds_phi[j]/seeds_wsum[j];
819 float deta = std::fabs(ceta-
eta);
820 float dphi = std::fabs(cphi-
phi);
821 float dist2 = dphi*dphi+deta*deta;
822 if( dist2 < dist2_min ) {
827 int match_idx = IDX_INITIAL;
829 if( dist2_min < CLUSTCUT_DIST_SQUARED ) { match_idx =
idx_min; }
831 if( match_idx == IDX_INITIAL ) {
832 if(
w > CLUSTCUT_SEED_FRAC && dist2_min > CLUSTCUT_DIST_SQUARED ) {
833 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
834 seeds_wsum.push_back(
w);
838 float new_eta = seeds_eta[match_idx] +
w*
eta;
839 float new_phi = seeds_phi[match_idx] +
w*
phi;
840 float new_wsum = seeds_wsum[match_idx] +
w;
841 seeds_eta[match_idx] = new_eta;
842 seeds_phi[match_idx] = new_phi;
843 seeds_wsum[match_idx] = new_wsum;
846 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
847 float eta = seeds_eta[
i] / seeds_wsum[
i];
848 float phi = seeds_phi[
i] / seeds_wsum[
i];
851 if(
phi < -TMath::Pi() )
phi = 2*TMath::Pi() +
phi;
852 if(
phi > TMath::Pi() )
phi = -2*TMath::Pi() +
phi;
855 ATH_MSG_VERBOSE(
"after clustering, nr of seeds = " << seeds_eta.size());
858 std::vector<unsigned int> idx_to_delete;
859 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
860 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),
i) != idx_to_delete.end() )
continue;
861 float eta_i = seeds_eta[
i];
862 float phi_i = seeds_phi[
i];
863 for(
unsigned int j=
i+1; j<seeds_eta.size(); j++) {
864 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),j) != idx_to_delete.end() )
continue;
865 float eta_j = seeds_eta[j];
866 float phi_j = seeds_phi[j];
867 float dR2 =
deltaR2(eta_i,phi_i,eta_j,phi_j);
868 if( dR2 < CLUSTCUT_DIST_SQUARED ) idx_to_delete.push_back(j);
871 ATH_MSG_VERBOSE(
"nr of duplicated seeds to be removed = " << idx_to_delete.size());
872 if( idx_to_delete.size() > 0 ) {
873 std::sort(idx_to_delete.begin(),idx_to_delete.end());
874 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
875 unsigned int idx = idx_to_delete[j-1];
876 seeds_eta.erase(seeds_eta.begin()+
idx);
877 seeds_phi.erase(seeds_phi.begin()+
idx);
884 return StatusCode::SUCCESS;
891 std::vector<float>& jetSeeds_eta, std::vector<float>& jetSeeds_phi, std::vector<float>& jetSeeds_pt)
const
893 std::vector<unsigned int> idx_to_delete;
894 for(
unsigned int idx=0;
idx<jetSeeds_eta.size(); ++
idx) {
895 const float DR_SQUARED_CUT_TO_FTFSEED = 0.09;
896 float eta = jetSeeds_eta[
idx];
897 float phi = jetSeeds_phi[
idx];
899 for (
const auto& seed : hitDVSeedsContainer ) {
901 if( dR2 < dR2min ) dR2min = dR2;
903 if( dR2min > DR_SQUARED_CUT_TO_FTFSEED ) idx_to_delete.push_back(
idx);
905 if( idx_to_delete.size() > 0 ) {
906 std::sort(idx_to_delete.begin(),idx_to_delete.end());
907 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
908 unsigned int idx = idx_to_delete[j-1];
909 jetSeeds_eta.erase(jetSeeds_eta.begin()+
idx);
910 jetSeeds_phi.erase(jetSeeds_phi.begin()+
idx);
911 if( jetSeeds_pt.size() > 0 ) jetSeeds_pt.erase(jetSeeds_pt.begin()+
idx);
914 return StatusCode::SUCCESS;
921 const std::vector<float>& v_sp_eta,
const std::vector<float>& v_sp_phi,
922 const std::vector<int>& v_sp_layer,
const std::vector<int>& v_sp_usedTrkId,
923 std::vector<float>& seeds_eta, std::vector<float>& seeds_phi )
const
925 const int NBINS_ETA = 50;
926 const float ETA_MIN = -2.5;
927 const float ETA_MAX = 2.5;
929 const int NBINS_PHI = 80;
930 const float PHI_MIN = -4.0;
931 const float PHI_MAX = 4.0;
935 unsigned int slotnr = ctx.slot();
936 unsigned int subSlotnr = ctx.subSlot();
938 sprintf(
hname,
"ftf_s%u_ss%u_ly6_h2_nsp",slotnr,subSlotnr);
939 std::unique_ptr<TH2F> ly6_h2_nsp = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
940 sprintf(
hname,
"ftf_s%u_ss%u_ly7_h2_nsp",slotnr,subSlotnr);
941 std::unique_ptr<TH2F> ly7_h2_nsp = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
943 sprintf(
hname,
"ftf_s%u_ss%u_ly6_h2_nsp_notrk",slotnr,subSlotnr);
944 std::unique_ptr<TH2F> ly6_h2_nsp_notrk = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
945 sprintf(
hname,
"ftf_s%u_ss%u_ly7_h2_nsp_notrk",slotnr,subSlotnr);
946 std::unique_ptr<TH2F> ly7_h2_nsp_notrk = std::make_unique<TH2F>(
hname,
hname,NBINS_ETA,ETA_MIN,ETA_MAX,NBINS_PHI,PHI_MIN,PHI_MAX);
948 for(
unsigned int iSeed=0; iSeed<v_sp_eta.size(); ++iSeed) {
950 int sp_layer = v_sp_layer[iSeed];
951 float sp_eta = v_sp_eta[iSeed];
953 if( ilayer<6 )
continue;
955 int sp_trkid = v_sp_usedTrkId[iSeed];
956 bool isUsedByTrk = (sp_trkid != -1);
957 float sp_phi = v_sp_phi[iSeed];
959 bool fill_out_of_pi =
false;
962 sp_phi2 = 2*TMath::Pi() + sp_phi;
963 if( sp_phi2 < PHI_MAX ) fill_out_of_pi =
true;
966 sp_phi2 = -2*TMath::Pi() + sp_phi;
967 if( PHI_MIN < sp_phi2 ) fill_out_of_pi =
true;
970 ly6_h2_nsp->Fill(sp_eta,sp_phi);
971 if( fill_out_of_pi ) ly6_h2_nsp->Fill(sp_eta,sp_phi2);
972 if( ! isUsedByTrk ) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi);
973 if( ! isUsedByTrk && fill_out_of_pi) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
976 ly7_h2_nsp->Fill(sp_eta,sp_phi);
977 if( fill_out_of_pi ) ly7_h2_nsp->Fill(sp_eta,sp_phi2);
978 if( ! isUsedByTrk ) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi);
979 if( ! isUsedByTrk && fill_out_of_pi) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
986 std::vector<std::tuple<int,float,float,float>> QT;
988 for(
int ly6_ieta=1; ly6_ieta<=NBINS_ETA; ly6_ieta++) {
989 float ly6_eta = (ly6_h2_nsp->GetXaxis()->GetBinLowEdge(ly6_ieta) + ly6_h2_nsp->GetXaxis()->GetBinUpEdge(ly6_ieta))/2.0;
990 for(
int ly6_iphi=1; ly6_iphi<=NBINS_PHI; ly6_iphi++) {
991 float ly6_phi = (ly6_h2_nsp->GetYaxis()->GetBinLowEdge(ly6_iphi) + ly6_h2_nsp->GetYaxis()->GetBinUpEdge(ly6_iphi))/2.0;
993 float ly6_nsp = ly6_h2_nsp ->GetBinContent(ly6_ieta,ly6_iphi);
994 float ly6_nsp_notrk = ly6_h2_nsp_notrk->GetBinContent(ly6_ieta,ly6_iphi);
995 float ly6_frac = ( ly6_nsp > 0 ) ? ly6_nsp_notrk / ly6_nsp : 0;
996 if( ly6_nsp < 10 || ly6_frac < 0.85 )
continue;
998 float ly7_frac_max = 0;
999 float ly7_eta_max = 0;
1000 float ly7_phi_max = 0;
1001 for(
int ly7_ieta=
std::max(1,ly6_ieta-1); ly7_ieta<
std::min(NBINS_ETA,ly6_ieta+1); ly7_ieta++) {
1002 for(
int ly7_iphi=
std::max(1,ly6_iphi-1); ly7_iphi<=
std::min(NBINS_PHI,ly6_iphi+1); ly7_iphi++) {
1003 float ly7_nsp = ly7_h2_nsp ->GetBinContent(ly7_ieta,ly7_iphi);
1004 float ly7_nsp_notrk = ly7_h2_nsp_notrk->GetBinContent(ly7_ieta,ly7_iphi);
1005 float ly7_frac = ( ly7_nsp > 0 ) ? ly7_nsp_notrk / ly7_nsp : 0;
1006 if( ly7_nsp < 10 )
continue;
1007 if( ly7_frac > ly7_frac_max ) {
1008 ly7_frac_max = ly7_frac;
1009 ly7_eta_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_ieta) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_ieta))/2.0;
1010 ly7_phi_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_iphi) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_iphi))/2.0;
1014 if( ly7_frac_max < 0.85 )
continue;
1016 float wsum = ly6_frac + ly7_frac_max;
1017 float weta = (ly6_eta*ly6_frac + ly7_eta_max*ly7_frac_max) / wsum;
1018 float wphi = (ly6_phi*ly6_frac + ly7_phi_max*ly7_frac_max) / wsum;
1019 float w = wsum / 2.0;
1020 QT.push_back(std::make_tuple(-1,
w,weta,wphi));
1023 ATH_MSG_VERBOSE(
"nr of ly6/ly7 doublet candidate seeds=" << QT.size() <<
", doing clustering...");
1026 std::sort(QT.begin(), QT.end(),
1027 [](
const std::tuple<int,float,float,float>& lhs,
const std::tuple<int,float,float,float>& rhs) {
1028 return std::get<1>(lhs) > std::get<1>(rhs); } );
1031 const double CLUSTCUT_DIST_SQUARED = 0.04;
1032 const double CLUSTCUT_SEED_FRAC = 0.9;
1034 std::vector<float> seeds_wsum;
1036 for(
unsigned int i=0;
i<QT.size();
i++) {
1037 float phi = std::get<3>(QT[
i]);
1038 float eta = std::get<2>(QT[
i]);
1039 float w = std::get<1>(QT[
i]);
1041 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
1042 seeds_wsum.push_back(
w);
1045 const int IDX_INITIAL = 100;
1046 float dist2_min = 100.0;
1048 for(
unsigned j=0; j<seeds_eta.size(); j++) {
1049 float ceta = seeds_eta[j]/seeds_wsum[j];
1050 float cphi = seeds_phi[j]/seeds_wsum[j];
1052 float deta = std::fabs(ceta-
eta);
1053 float dphi = std::fabs(cphi-
phi);
1054 float dist2 = dphi*dphi+deta*deta;
1055 if( dist2 < dist2_min ) {
1060 int match_idx = IDX_INITIAL;
1061 if(
idx_min != IDX_INITIAL ) {
1062 if( dist2_min < CLUSTCUT_DIST_SQUARED ) { match_idx =
idx_min; }
1064 if( match_idx == IDX_INITIAL ) {
1065 if(
w > CLUSTCUT_SEED_FRAC && dist2_min > CLUSTCUT_DIST_SQUARED ) {
1066 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
1067 seeds_wsum.push_back(
w);
1071 float new_eta = seeds_eta[match_idx] +
w*
eta;
1072 float new_phi = seeds_phi[match_idx] +
w*
phi;
1073 float new_wsum = seeds_wsum[match_idx] +
w;
1074 seeds_eta[match_idx] = new_eta;
1075 seeds_phi[match_idx] = new_phi;
1076 seeds_wsum[match_idx] = new_wsum;
1079 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
1080 float eta = seeds_eta[
i] / seeds_wsum[
i];
1081 float phi = seeds_phi[
i] / seeds_wsum[
i];
1083 if(
phi < -TMath::Pi() )
phi = 2*TMath::Pi() +
phi;
1084 if(
phi > TMath::Pi() )
phi = -2*TMath::Pi() +
phi;
1087 ATH_MSG_VERBOSE(
"after clustering, nr of seeds = " << seeds_eta.size());
1090 std::vector<unsigned int> idx_to_delete;
1091 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
1092 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),
i) != idx_to_delete.end() )
continue;
1093 float eta_i = seeds_eta[
i];
1094 float phi_i = seeds_phi[
i];
1095 for(
unsigned int j=
i+1; j<seeds_eta.size(); j++) {
1096 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),j) != idx_to_delete.end() )
continue;
1097 float eta_j = seeds_eta[j];
1098 float phi_j = seeds_phi[j];
1099 float dR2 =
deltaR2(eta_i,phi_i,eta_j,phi_j);
1100 if( dR2 < CLUSTCUT_DIST_SQUARED ) idx_to_delete.push_back(j);
1103 ATH_MSG_VERBOSE(
"nr of duplicated seeds to be removed = " << idx_to_delete.size());
1104 if( idx_to_delete.size() > 0 ) {
1105 std::sort(idx_to_delete.begin(),idx_to_delete.end());
1106 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
1107 unsigned int idx = idx_to_delete[j-1];
1108 seeds_eta.erase(seeds_eta.begin()+
idx);
1109 seeds_phi.erase(seeds_phi.begin()+
idx);
1116 return StatusCode::SUCCESS;
1121 std::vector<HitDVTrk>& hitDVTrksContainer,
1122 std::vector<HitDVSpacePoint>& hitDVSPsContainer)
const
1124 std::vector<int> v_dvtrk_id;
1125 std::vector<float> v_dvtrk_pt;
1126 std::vector<float> v_dvtrk_eta;
1127 std::vector<float> v_dvtrk_phi;
1128 std::vector<int> v_dvtrk_n_hits_inner;
1129 std::vector<int> v_dvtrk_n_hits_pix;
1130 std::vector<int> v_dvtrk_n_hits_sct;
1131 std::vector<float> v_dvtrk_a0beam;
1132 std::unordered_map<Identifier, int> umap_fittedTrack_identifier;
1133 int fittedTrack_id = -1;
1135 static constexpr
float TRKCUT_PTGEV_HITDV = 0.5;
1137 for (
const auto track: tracks) {
1138 float shift_x = 0;
float shift_y = 0;
1145 if (not igt) {
continue;}
1152 m =
track->measurementsOnTrack()->begin(),
1153 me =
track->measurementsOnTrack()->end ();
1154 for(;
m!=me; ++
m ) {
1156 if( prd ==
nullptr )
continue;
1158 if( umap_fittedTrack_identifier.find(id_prd) == umap_fittedTrack_identifier.end() ) {
1159 umap_fittedTrack_identifier.insert(std::make_pair(id_prd,fittedTrack_id));
1163 v_dvtrk_id.push_back(fittedTrack_id);
1165 v_dvtrk_eta.push_back(theTrackInfo.
eta);
1166 v_dvtrk_phi.push_back(
phi);
1167 v_dvtrk_n_hits_inner.push_back(theTrackInfo.
n_hits_inner);
1168 v_dvtrk_n_hits_pix.push_back(theTrackInfo.
n_hits_pix);
1169 v_dvtrk_n_hits_sct.push_back(theTrackInfo.
n_hits_sct);
1170 v_dvtrk_a0beam.push_back(theTrackInfo.
a0beam);
1172 ATH_MSG_DEBUG(
"Nr of selected tracks / all = " << fittedTrack_id <<
" / " << tracks.size());
1173 ATH_MSG_DEBUG(
"Nr of Identifiers used by selected tracks = " << umap_fittedTrack_identifier.size());
1177 int n_sp_usedByTrk = 0;
1179 std::unordered_map<Identifier, int> umap_sp_identifier;
1180 umap_sp_identifier.reserve(1.3*convertedSpacePoints.size());
1185 if( umap_sp_identifier.find(id_prd) == umap_sp_identifier.end() ) {
1186 umap_sp_identifier.insert(std::make_pair(id_prd,-1));
1191 for(
unsigned int iSp=0; iSp<convertedSpacePoints.size(); ++iSp) {
1192 bool isPix = convertedSpacePoints[iSp].isPixel();
1193 bool isSct = convertedSpacePoints[iSp].isSCT();
1194 if( !
isPix && ! isSct )
continue;
1195 const Trk::SpacePoint* sp = convertedSpacePoints[iSp].offlineSpacePoint();
1199 int n_id_usedByTrack = 0;
1200 for(
auto it=umap_sp_identifier.begin();
it!=umap_sp_identifier.end(); ++
it) {
1202 if( umap_fittedTrack_identifier.find(id_sp) != umap_fittedTrack_identifier.end() ) {
1203 umap_sp_identifier[id_sp] = umap_fittedTrack_identifier[id_sp];
1207 ATH_MSG_DEBUG(
"Nr of SPs / Identifiers (all) / Identifiers (usedByTrack) = " << convertedSpacePoints.size() <<
" / " << umap_sp_identifier.size() <<
" / " << n_id_usedByTrack);
1210 int usedTrack_id = -1;
1213 if( umap_sp_identifier.find(id_prd) != umap_sp_identifier.end() ) {
1214 usedTrack_id = umap_sp_identifier[id_prd];
1217 return usedTrack_id;
1220 std::vector<float> v_sp_eta;
1221 v_sp_eta.reserve(convertedSpacePoints.size());
1222 std::vector<float> v_sp_r;
1223 v_sp_r.reserve(convertedSpacePoints.size());
1224 std::vector<float> v_sp_phi;
1225 v_sp_phi.reserve(convertedSpacePoints.size());
1226 std::vector<int> v_sp_layer;
1227 v_sp_layer.reserve(convertedSpacePoints.size());
1228 std::vector<bool> v_sp_isPix;
1229 v_sp_isPix.reserve(convertedSpacePoints.size());
1230 std::vector<bool> v_sp_isSct;
1231 v_sp_isSct.reserve(convertedSpacePoints.size());
1232 std::vector<int> v_sp_usedTrkId;
1233 v_sp_usedTrkId.reserve(convertedSpacePoints.size());
1235 for(
const auto& sp : convertedSpacePoints) {
1236 bool isPix = sp.isPixel();
1237 bool isSct = sp.isSCT();
1238 if( !
isPix && ! isSct )
continue;
1241 int usedTrack_id = -1;
1242 int usedTrack_id_first = sp_map_used_id(osp->
clusterList().first);
1243 if (usedTrack_id_first != -1) {
1244 usedTrack_id = usedTrack_id_first;
1246 int usedTrack_id_second = sp_map_used_id(osp->
clusterList().second);
1247 if (usedTrack_id_second != -1) {
1248 usedTrack_id = usedTrack_id_second;
1253 if( usedTrack_id != -1 ) n_sp_usedByTrk++;
1254 int layer = sp.layer();
1255 float sp_r = sp.r();
1258 float sp_eta = pos_sp.eta();
1259 float sp_phi = pos_sp.phi();
1261 v_sp_eta.push_back(sp_eta);
1262 v_sp_r.push_back(sp_r);
1263 v_sp_phi.push_back(sp_phi);
1264 v_sp_layer.push_back(
layer);
1265 v_sp_isPix.push_back(
isPix);
1266 v_sp_isSct.push_back(isSct);
1267 v_sp_usedTrkId.push_back(usedTrack_id);
1269 ATH_MSG_VERBOSE(
"+++ SP eta / phi / layer / ixPix / usedTrack_id = " << sp_eta <<
" / " << sp_phi <<
" / " <<
layer <<
" / " <<
isPix <<
" / " << usedTrack_id);
1272 ATH_MSG_DEBUG(
"Nr of SPs / all = " << n_sp <<
" / " << convertedSpacePoints.size());
1273 ATH_MSG_DEBUG(
"Nr of SPs used by selected tracks = " << n_sp_usedByTrk);
1276 std::vector<float> v_seeds_eta;
1277 std::vector<float> v_seeds_phi;
1278 std::vector<int16_t> v_seeds_type;
1283 const unsigned int L1JET_ET_CUT = 27;
1287 if (!jetRoiCollectionHandle.isValid()){
1289 return StatusCode::FAILURE;
1293 if( jetRoI ==
nullptr )
continue;
1295 if( jetRoI->
et() >= L1JET_ET_CUT ) {
1296 v_seeds_eta.push_back(jetRoI->
eta());
1297 v_seeds_phi.push_back(jetRoI->
phi());
1298 v_seeds_type.push_back(0);
1301 ATH_MSG_DEBUG(
"Nr of L1_J" << L1JET_ET_CUT <<
" seeds = " << v_seeds_eta.size());
1304 std::vector<float> v_spseeds_eta;
1305 std::vector<float> v_spseeds_phi;
1306 ATH_CHECK(
findSPSeeds(ctx, v_sp_eta, v_sp_phi, v_sp_layer, v_sp_usedTrkId, v_spseeds_eta, v_spseeds_phi) );
1308 for(
size_t idx=0;
idx<v_spseeds_eta.size(); ++
idx) {
1309 v_seeds_eta.push_back(v_spseeds_eta[
idx]);
1310 v_seeds_phi.push_back(v_spseeds_phi[
idx]);
1311 v_seeds_type.push_back(1);
1313 ATH_MSG_DEBUG(
"Nr of SP + L1_J" << L1JET_ET_CUT <<
" seeds = " << v_seeds_eta.size());
1319 const int N_MAX_SEEDS = 200;
1320 int n_seeds =
std::min(N_MAX_SEEDS,(
int)v_seeds_eta.size());
1321 hitDVSeedsContainer.reserve(n_seeds);
1322 for(
auto iSeed=0; iSeed < n_seeds; ++iSeed) {
1324 seed.eta = v_seeds_eta[iSeed];
1325 seed.phi = v_seeds_phi[iSeed];
1326 seed.type = v_seeds_type[iSeed];
1327 hitDVSeedsContainer.push_back(seed);
1331 const float TRKCUT_DELTA_R_TO_SEED = 1.0;
1332 hitDVTrksContainer.reserve(v_dvtrk_pt.size());
1333 for(
unsigned int iTrk=0; iTrk<v_dvtrk_pt.size(); ++iTrk) {
1334 float trk_eta = v_dvtrk_eta[iTrk];
1335 float trk_phi = v_dvtrk_phi[iTrk];
1337 bool isNearSeed =
false;
1338 for (
unsigned int iSeed=0; iSeed<v_seeds_eta.size(); ++iSeed) {
1339 float seed_eta = v_seeds_eta[iSeed];
1340 float seed_phi = v_seeds_phi[iSeed];
1341 float dR2 =
deltaR2(trk_eta,trk_phi,seed_eta,seed_phi);
1342 if( dR2 <= TRKCUT_DELTA_R_TO_SEED*TRKCUT_DELTA_R_TO_SEED ) { isNearSeed =
true;
break; }
1344 if( ! isNearSeed )
continue;
1347 hitDVTrk.
id = v_dvtrk_id[iTrk];
1348 hitDVTrk.
pt = v_dvtrk_pt[iTrk];
1349 hitDVTrk.
eta = v_dvtrk_eta[iTrk];
1350 hitDVTrk.
phi = v_dvtrk_phi[iTrk];
1352 hitDVTrk.
n_hits_pix = v_dvtrk_n_hits_pix[iTrk];
1353 hitDVTrk.
n_hits_sct = v_dvtrk_n_hits_sct[iTrk];
1354 hitDVTrk.
a0beam = v_dvtrk_a0beam[iTrk];
1356 hitDVTrksContainer.push_back(hitDVTrk);
1360 const float SPCUT_DELTA_R_TO_SEED = 1.0;
1361 const size_t n_sp_max = std::min<size_t>(100000, v_sp_eta.size());
1362 size_t n_sp_stored = 0;
1364 hitDVSPsContainer.reserve(n_sp_max);
1366 for(
size_t iSp=0; iSp<v_sp_eta.size(); ++iSp) {
1368 const float sp_eta = v_sp_eta[iSp];
1369 const float sp_phi = v_sp_phi[iSp];
1370 bool isNearSeed =
false;
1371 for (
size_t iSeed=0; iSeed<v_seeds_eta.size(); ++iSeed) {
1372 const float seed_eta = v_seeds_eta[iSeed];
1373 const float seed_phi = v_seeds_phi[iSeed];
1374 const float dR2 =
deltaR2(sp_eta, sp_phi, seed_eta, seed_phi);
1375 if( dR2 <= SPCUT_DELTA_R_TO_SEED*SPCUT_DELTA_R_TO_SEED ) { isNearSeed =
true;
break; }
1377 if( ! isNearSeed )
continue;
1379 if( n_sp_stored >= n_sp_max )
break;
1381 hitDVSP.
eta = v_sp_eta[iSp];
1382 hitDVSP.
r = v_sp_r[iSp];
1383 hitDVSP.
phi = v_sp_phi[iSp];
1384 hitDVSP.
layer = v_sp_layer[iSp];
1385 hitDVSP.
isPix = v_sp_isPix[iSp];
1386 hitDVSP.
isSct = v_sp_isSct[iSp];
1387 hitDVSP.
usedTrkId = v_sp_usedTrkId[iSp];
1388 hitDVSPsContainer.push_back(hitDVSP);
1393 return StatusCode::SUCCESS;