10 #include "GaudiKernel/SystemOfUnits.h"
12 #include "GaudiKernel/PhysicalConstants.h"
20 #include <unordered_map>
43 ISvcLocator* pSvcLocator ) :
45 m_lumiBlockMuTool(
"LumiBlockMuTool/LumiBlockMuTool")
60 std::string sth =
results[1].str();
61 std::string swp =
results[2].str();
63 int thres = std::stoi(sth);
88 for (
auto&
reader : m_tmva_reader) {
90 auto tmva =
std::array{std::make_unique<TMVA::Reader>(
"!Color:!Silent" ),
91 std::make_unique<TMVA::Reader>(
"!Color:!Silent" )};
92 for (
auto&
t : tmva) {
93 t->AddVariable(
"n_track_qual", &
reader.n_track_qual);
94 t->AddVariable(
"ly0_sp_frac", &
reader.ly0_sp_frac);
95 t->AddVariable(
"ly1_sp_frac", &
reader.ly1_sp_frac);
96 t->AddVariable(
"ly2_sp_frac", &
reader.ly2_sp_frac);
97 t->AddVariable(
"ly3_sp_frac", &
reader.ly3_sp_frac);
98 t->AddVariable(
"ly4_sp_frac", &
reader.ly4_sp_frac);
99 t->AddVariable(
"ly5_sp_frac", &
reader.ly5_sp_frac);
100 t->AddVariable(
"ly6_sp_frac", &
reader.ly6_sp_frac);
101 t->AddVariable(
"ly7_sp_frac", &
reader.ly7_sp_frac);
103 reader.tmva_0eta1 = std::move(tmva[0]);
104 reader.tmva_1eta2 = std::move(tmva[1]);
107 const std::string tuningVer =
"v22a";
108 const std::string methodName =
"BDT method";
111 "TrigHitDVHypo/HitDV.BDT.weights.0eta1." + tuningVer +
".xml");
113 "TrigHitDVHypo/HitDV.BDT.weights.1eta2." + tuningVer +
".xml");
116 reader.tmva_0eta1->BookMVA(methodName, weightfile_0eta1);
117 reader.tmva_1eta2->BookMVA(methodName, weightfile_1eta2);
120 return StatusCode::SUCCESS;
130 std::vector<TrigSiSpacePointBase> convertedSpacePoints;
131 convertedSpacePoints.reserve(5000);
144 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 );
149 ATH_CHECK( previousDecisionsHandle.isValid() );
151 ATH_MSG_DEBUG(
"Running with " << previousDecisionsHandle->size() <<
" previous decisions" );
152 if( previousDecisionsHandle->size()!=1 ) {
153 ATH_MSG_ERROR(
"Previous decision handle size is not 1. It is" << previousDecisionsHandle->size() );
154 return StatusCode::FAILURE;
156 const Decision * previousDecision = previousDecisionsHandle->at(0);
161 for(
auto decisionID: previousDecisionIDs) {
ATH_MSG_DEBUG(
" " << decisionID ); }
166 auto outputDecisions = outputHandle.
ptr();
176 if( jetsContainer ==
nullptr ) {
178 return StatusCode::FAILURE;
180 bool isJetEtPassToolsCut =
false;
181 float jetEtaToolsCut = 2.0;
185 float jet_eta =
static_cast<float>(
jet->eta());
187 isJetEtPassToolsCut =
true;
195 std::vector<HitDVSeed> hitDVSeedsContainer;
196 std::vector<HitDVTrk> hitDVTrksContainer;
197 std::vector<HitDVSpacePoint> hitDVSPsContainer;
200 ATH_CHECK(
findHitDV(context, convertedSpacePoints, *tracks, hitDVSeedsContainer, hitDVTrksContainer, hitDVSPsContainer) );
202 mon_n_dvtrks = hitDVTrksContainer.size();
203 mon_n_dvsps = hitDVSPsContainer.size();
204 const unsigned int N_MAX_SP_STORED = 100000;
205 bool isSPOverflow =
false;
206 if( hitDVSPsContainer.size() >= N_MAX_SP_STORED ) isSPOverflow =
true;
213 averageMu =
static_cast<float>(
m_lumiBlockMuTool->averageInteractionsPerCrossing());
222 mon_average_mu = averageMu;
225 std::vector<float> jetSeeds_pt;
226 std::vector<float> jetSeeds_eta;
227 std::vector<float> jetSeeds_phi;
229 int n_alljetseeds = jetSeeds_eta.size();
231 mon_n_jetseeds = jetSeeds_eta.size();
232 mon_n_jetseedsdel = n_alljetseeds - jetSeeds_eta.size();
235 std::vector<float> spSeeds_eta;
236 std::vector<float> spSeeds_phi;
237 std::vector<float> void_pt;
238 int n_allspseeds = 0;
241 n_allspseeds = spSeeds_eta.size();
243 mon_n_spseeds = spSeeds_eta.size();
244 mon_n_spseedsdel = n_allspseeds - spSeeds_eta.size();
248 mon_n_spseedsdel = 0;
252 auto hitDVContainer = std::make_unique<xAOD::TrigCompositeContainer>();
253 auto hitDVContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>();
254 hitDVContainer->setStore(hitDVContainerAux.get());
257 std::vector<TrigHitDVHypoTool::HitDVHypoInfo> hitDVHypoInputs;
258 std::unordered_map<Decision*, size_t> mapDecIdx;
261 if( isJetEtPassToolsCut ) {
262 const float preselBDTthreshold = -0.6;
264 int n_passed_jet = 0;
265 int seed_type = SeedType::HLTJet;
266 ATH_CHECK(
calculateBDT(context, hitDVSPsContainer, hitDVTrksContainer, jetSeeds_pt, jetSeeds_eta, jetSeeds_phi, preselBDTthreshold, seed_type, dvContainer, n_passed_jet) );
270 seed_type = SeedType::SP;
271 ATH_CHECK(
calculateBDT(context, hitDVSPsContainer, hitDVTrksContainer, void_pt, spSeeds_eta, spSeeds_phi, preselBDTthreshold, seed_type, dvContainer, n_passed_sp) );
274 ATH_MSG_DEBUG(
"nr of dv container / jet-seeded / sp-seed candidates = " << dvContainer->
size() <<
" / " << n_passed_jet <<
" / " << n_passed_sp );
277 for (
auto dv : *dvContainer ) {
279 mapDecIdx.emplace( newDecision,
dv->index() );
281 hitDVHypoInputs.push_back( hypoInfo );
296 ATH_CHECK( hitDVHandle.
record( std::move( hitDVContainer ), std::move( hitDVContainerAux ) ) );
300 while(
it != outputDecisions->end()) {
304 it = outputDecisions->erase(
it);
310 size_t idx = mapDecIdx.at(*
it);
326 return StatusCode::SUCCESS;
334 float dEta = eta_1 - eta_2;
343 float abseta = std::fabs(
eta);
356 const float PixBR6limit = 1.29612;
357 const float PixBR5limit = 1.45204;
358 const float PixBR4limit = 1.64909;
359 const float PixBR3limit = 1.90036;
360 const float PixBR2limit = 2.2146;
366 if( abseta > PixBR2limit )
return 2;
374 if( abseta > PixBR2limit )
return 2;
389 if( abseta < PixBR6limit )
return 7;
390 else if( abseta < PixBR5limit )
return 6;
398 if( abseta < PixBR5limit )
return 7;
399 else if( abseta < PixBR4limit )
return 6;
407 if( abseta < PixBR4limit )
return 7;
415 if( abseta < PixBR4limit )
return 6;
416 else if( abseta < PixBR3limit )
return 6;
424 if( abseta < PixBR3limit )
return 7;
432 if( abseta < PixBR3limit )
return 6;
440 if( abseta < PixBR3limit )
return 7;
448 if( abseta < PixBR3limit )
return 7;
467 std::vector<float> mnt_eta1_ly0_spfr;
468 std::vector<float> mnt_eta1_ly1_spfr;
469 std::vector<float> mnt_eta1_ly2_spfr;
470 std::vector<float> mnt_eta1_ly3_spfr;
471 std::vector<float> mnt_eta1_ly4_spfr;
472 std::vector<float> mnt_eta1_ly5_spfr;
473 std::vector<float> mnt_eta1_ly6_spfr;
474 std::vector<float> mnt_eta1_ly7_spfr;
475 std::vector<int> mnt_eta1_n_qtrk;
476 std::vector<float> mnt_eta1_bdtscore;
477 std::vector<float> mnt_1eta2_ly0_spfr;
478 std::vector<float> mnt_1eta2_ly1_spfr;
479 std::vector<float> mnt_1eta2_ly2_spfr;
480 std::vector<float> mnt_1eta2_ly3_spfr;
481 std::vector<float> mnt_1eta2_ly4_spfr;
482 std::vector<float> mnt_1eta2_ly5_spfr;
483 std::vector<float> mnt_1eta2_ly6_spfr;
484 std::vector<float> mnt_1eta2_ly7_spfr;
485 std::vector<int> mnt_1eta2_n_qtrk;
486 std::vector<float> mnt_1eta2_bdtscore;
508 mon_eta1_ly0_spfr, mon_eta1_ly1_spfr, mon_eta1_ly2_spfr, mon_eta1_ly3_spfr,
509 mon_eta1_ly4_spfr, mon_eta1_ly5_spfr, mon_eta1_ly6_spfr, mon_eta1_ly7_spfr,
510 mon_eta1_n_qtrk, mon_eta1_bdtscore,
511 mon_1eta2_ly0_spfr, mon_1eta2_ly1_spfr, mon_1eta2_ly2_spfr, mon_1eta2_ly3_spfr,
512 mon_1eta2_ly4_spfr, mon_1eta2_ly5_spfr, mon_1eta2_ly6_spfr, mon_1eta2_ly7_spfr,
513 mon_1eta2_n_qtrk, mon_1eta2_bdtscore);
516 for (
auto dv : *dvContainer ) {
517 int seed_type =
dv->getDetail<
int> (
"hitDV_seed_type");
519 if( seed_type == SeedType::SP )
continue;
520 float seed_eta =
dv->getDetail<
float>(
"hitDV_seed_eta");
521 int n_track_qual=
dv->getDetail<
int> (
"hitDV_n_track_qual");
522 float bdt_score =
dv->getDetail<
float>(
"hitDV_bdt_score");
523 float ly0_sp_frac =
dv->getDetail<
float>(
"hitDV_ly0_sp_frac");
524 float ly1_sp_frac =
dv->getDetail<
float>(
"hitDV_ly1_sp_frac");
525 float ly2_sp_frac =
dv->getDetail<
float>(
"hitDV_ly2_sp_frac");
526 float ly3_sp_frac =
dv->getDetail<
float>(
"hitDV_ly3_sp_frac");
527 float ly4_sp_frac =
dv->getDetail<
float>(
"hitDV_ly4_sp_frac");
528 float ly5_sp_frac =
dv->getDetail<
float>(
"hitDV_ly5_sp_frac");
529 float ly6_sp_frac =
dv->getDetail<
float>(
"hitDV_ly6_sp_frac");
530 float ly7_sp_frac =
dv->getDetail<
float>(
"hitDV_ly7_sp_frac");
531 if( std::abs(seed_eta) < 1.0 ) {
532 mnt_eta1_ly0_spfr.push_back(ly0_sp_frac);
533 mnt_eta1_ly1_spfr.push_back(ly1_sp_frac);
534 mnt_eta1_ly2_spfr.push_back(ly2_sp_frac);
535 mnt_eta1_ly3_spfr.push_back(ly3_sp_frac);
536 mnt_eta1_ly4_spfr.push_back(ly4_sp_frac);
537 mnt_eta1_ly5_spfr.push_back(ly5_sp_frac);
538 mnt_eta1_ly6_spfr.push_back(ly6_sp_frac);
539 mnt_eta1_ly7_spfr.push_back(ly7_sp_frac);
540 mnt_eta1_n_qtrk.push_back(n_track_qual);
541 mnt_eta1_bdtscore.push_back(bdt_score);
543 else if( std::abs(seed_eta) < 2.0 ) {
544 mnt_1eta2_ly0_spfr.push_back(ly0_sp_frac);
545 mnt_1eta2_ly1_spfr.push_back(ly1_sp_frac);
546 mnt_1eta2_ly2_spfr.push_back(ly2_sp_frac);
547 mnt_1eta2_ly3_spfr.push_back(ly3_sp_frac);
548 mnt_1eta2_ly4_spfr.push_back(ly4_sp_frac);
549 mnt_1eta2_ly5_spfr.push_back(ly5_sp_frac);
550 mnt_1eta2_ly6_spfr.push_back(ly6_sp_frac);
551 mnt_1eta2_ly7_spfr.push_back(ly7_sp_frac);
552 mnt_1eta2_n_qtrk.push_back(n_track_qual);
553 mnt_1eta2_bdtscore.push_back(bdt_score);
558 return StatusCode::SUCCESS;
565 const std::vector<HitDVSpacePoint>& spsContainer,
566 const std::vector<HitDVTrk>& trksContainer,
567 const std::vector<float>& seeds_pt,
568 const std::vector<float>& seeds_eta,
const std::vector<float>& seeds_phi,
569 const float& cutBDTthreshold,
const int seed_type,
572 if( seeds_eta.size() != seeds_phi.size() )
return StatusCode::SUCCESS;
575 for(
unsigned int iseed=0; iseed<seeds_eta.size(); iseed++) {
577 float seed_eta = seeds_eta[iseed];
578 float seed_phi = seeds_phi[iseed];
580 ATH_MSG_VERBOSE(
"+++++ seed eta: " << seed_eta <<
", phi:" << seed_phi <<
" +++++");
584 const float DR_SQUARED_TO_REF_CUT = 0.16;
587 int n_sp_injet_usedByTrk = 0;
589 int v_n_sp_injet_usedByTrk[
N_LAYER];
590 for(
int i=0;
i<
N_LAYER;
i++) { v_n_sp_injet[
i]=0; v_n_sp_injet_usedByTrk[
i]=0; }
592 for (
const auto & spData : spsContainer ) {
594 float sp_eta = spData.eta;
595 float sp_phi = spData.phi;
596 float dR2 =
deltaR2(sp_eta,sp_phi,seed_eta,seed_phi);
597 if( dR2 > DR_SQUARED_TO_REF_CUT )
continue;
600 int sp_layer = (
int)spData.layer;
601 int sp_trkid = (
int)spData.usedTrkId;
602 bool isUsedByTrk = (sp_trkid != -1);
608 v_n_sp_injet[ilayer]++;
610 n_sp_injet_usedByTrk++;
611 v_n_sp_injet_usedByTrk[ilayer]++;
615 ATH_MSG_VERBOSE(
"nr of SPs in jet: usedByTrk / all = " << n_sp_injet_usedByTrk <<
" / " << n_sp_injet);
619 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]);
620 v_ly_sp_frac[
i] =
frac;
621 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]);
625 const float TRK_PT_GEV_CUT = 2.0;
627 unsigned int n_qtrk_injet = 0;
628 for (
const auto& trk : trksContainer ) {
629 float trk_ptGeV = trk.pt;
631 if( trk_ptGeV < TRK_PT_GEV_CUT )
continue;
632 float dR2 =
deltaR2(trk.eta,trk.phi,seed_eta,seed_phi);
633 if( dR2 > DR_SQUARED_TO_REF_CUT )
continue;
636 ATH_MSG_DEBUG(
"nr of all / quality tracks matched = " << trksContainer.size() <<
" / " << n_qtrk_injet);
639 bool isSeedOutOfRange =
false;
640 if( n_qtrk_injet == 0 ) {
641 isSeedOutOfRange =
true;
643 if( std::fabs(v_ly_sp_frac[
i]) > 1
e-3 ) {
644 isSeedOutOfRange =
false;
break;
648 float bdt_score = -2.0;
649 if( ! isSeedOutOfRange ) {
650 auto&
reader = *m_tmva_reader.get(context);
651 reader.n_track_qual =
static_cast<float>(n_qtrk_injet);
652 reader.ly0_sp_frac = v_ly_sp_frac[0];
653 reader.ly1_sp_frac = v_ly_sp_frac[1];
654 reader.ly2_sp_frac = v_ly_sp_frac[2];
655 reader.ly3_sp_frac = v_ly_sp_frac[3];
656 reader.ly4_sp_frac = v_ly_sp_frac[4];
657 reader.ly5_sp_frac = v_ly_sp_frac[5];
658 reader.ly6_sp_frac = v_ly_sp_frac[6];
659 reader.ly7_sp_frac = v_ly_sp_frac[7];
661 if ( std::abs(seed_eta) < 1 ) {
662 bdt_score =
reader.tmva_0eta1->EvaluateMVA(
"BDT method");
663 }
else if ( std::abs(seed_eta) < 2 ) {
664 bdt_score =
reader.tmva_1eta2->EvaluateMVA(
"BDT method");
669 if( bdt_score < cutBDTthreshold )
continue;
677 dv->makePrivateStore();
681 if ( seed_type == SeedType::HLTJet ) seed_pt = seeds_pt[iseed];
682 dv->setDetail<
float>(
"hitDV_seed_pt", seed_pt);
683 dv->setDetail<
float>(
"hitDV_seed_eta", seed_eta);
684 dv->setDetail<
float>(
"hitDV_seed_phi", seed_phi);
685 dv->setDetail<
int> (
"hitDV_seed_type", seed_type);
686 dv->setDetail<
int> (
"hitDV_n_track_qual", n_qtrk_injet);
687 dv->setDetail<
float>(
"hitDV_ly0_sp_frac", v_ly_sp_frac[0]);
688 dv->setDetail<
float>(
"hitDV_ly1_sp_frac", v_ly_sp_frac[1]);
689 dv->setDetail<
float>(
"hitDV_ly2_sp_frac", v_ly_sp_frac[2]);
690 dv->setDetail<
float>(
"hitDV_ly3_sp_frac", v_ly_sp_frac[3]);
691 dv->setDetail<
float>(
"hitDV_ly4_sp_frac", v_ly_sp_frac[4]);
692 dv->setDetail<
float>(
"hitDV_ly5_sp_frac", v_ly_sp_frac[5]);
693 dv->setDetail<
float>(
"hitDV_ly6_sp_frac", v_ly_sp_frac[6]);
694 dv->setDetail<
float>(
"hitDV_ly7_sp_frac", v_ly_sp_frac[7]);
695 dv->setDetail<
float>(
"hitDV_bdt_score", bdt_score);
702 return StatusCode::SUCCESS;
709 std::vector<float>& jetSeeds_pt, std::vector<float>& jetSeeds_eta, std::vector<float>& jetSeeds_phi)
const
711 std::vector<float> mnt_jet_pt;
712 std::vector<float> mnt_jet_eta;
717 ATH_MSG_VERBOSE(
"looking for jet seed with pt cut=" << cutJetPt <<
", eta cut=" << cutJetEta);
720 if( jet_pt < cutJetPt ) {
724 mnt_jet_pt.push_back(jet_pt);
725 float jet_eta =
static_cast<float>(
jet->eta());
726 mnt_jet_eta.push_back(jet_eta);
727 if( std::fabs(jet_eta) > cutJetEta ) {
731 float jet_phi =
static_cast<float>(
jet->phi());
732 jetSeeds_pt.push_back(jet_pt);
733 jetSeeds_eta.push_back(jet_eta);
734 jetSeeds_phi.push_back(
jet_phi);
738 return StatusCode::SUCCESS;
745 std::vector<float>& seeds_eta, std::vector<float>& seeds_phi )
const
750 const int NBINS_ETA = 50;
751 const float ETA_MIN = -2.5;
754 const int NBINS_PHI = 80;
755 const float PHI_MIN = -4.0;
756 const float PHI_MAX = 4.0;
760 unsigned int slotnr = ctx.slot();
761 unsigned int subSlotnr = ctx.subSlot();
763 sprintf(
hname,
"hitdv_s%u_ss%u_ly6_h2_nsp",slotnr,subSlotnr);
764 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);
765 sprintf(
hname,
"hitdv_s%u_ss%u_ly7_h2_nsp",slotnr,subSlotnr);
766 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);
768 sprintf(
hname,
"hitdv_s%u_ss%u_ly6_h2_nsp_notrk",slotnr,subSlotnr);
769 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);
770 sprintf(
hname,
"hitdv_s%u_ss%u_ly7_h2_nsp_notrk",slotnr,subSlotnr);
771 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);
773 for (
const auto& spData : spsContainer ) {
774 int16_t sp_layer = spData.layer;
775 float sp_eta = spData.eta;
777 if( ilayer<6 )
continue;
779 int sp_trkid = (
int)spData.usedTrkId;
780 bool isUsedByTrk = (sp_trkid != -1);
781 float sp_phi = spData.phi;
783 bool fill_out_of_pi =
false;
786 sp_phi2 = 2*TMath::Pi() + sp_phi;
787 if( sp_phi2 < PHI_MAX ) fill_out_of_pi =
true;
790 sp_phi2 = -2*TMath::Pi() + sp_phi;
791 if( PHI_MIN < sp_phi2 ) fill_out_of_pi =
true;
794 ly6_h2_nsp->Fill(sp_eta,sp_phi);
795 if( fill_out_of_pi ) ly6_h2_nsp->Fill(sp_eta,sp_phi2);
796 if( ! isUsedByTrk ) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi);
797 if( ! isUsedByTrk && fill_out_of_pi) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
800 ly7_h2_nsp->Fill(sp_eta,sp_phi);
801 if( fill_out_of_pi ) ly7_h2_nsp->Fill(sp_eta,sp_phi2);
802 if( ! isUsedByTrk ) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi);
803 if( ! isUsedByTrk && fill_out_of_pi) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
810 std::vector<std::tuple<int,float,float,float>> QT;
812 for(
int ly6_ieta=1; ly6_ieta<=NBINS_ETA; ly6_ieta++) {
813 float ly6_eta = (ly6_h2_nsp->GetXaxis()->GetBinLowEdge(ly6_ieta) + ly6_h2_nsp->GetXaxis()->GetBinUpEdge(ly6_ieta))/2.0;
814 for(
int ly6_iphi=1; ly6_iphi<=NBINS_PHI; ly6_iphi++) {
815 float ly6_phi = (ly6_h2_nsp->GetYaxis()->GetBinLowEdge(ly6_iphi) + ly6_h2_nsp->GetYaxis()->GetBinUpEdge(ly6_iphi))/2.0;
817 float ly6_nsp = ly6_h2_nsp ->
GetBinContent(ly6_ieta,ly6_iphi);
818 float ly6_nsp_notrk = ly6_h2_nsp_notrk->
GetBinContent(ly6_ieta,ly6_iphi);
819 float ly6_frac = ( ly6_nsp > 0 ) ? ly6_nsp_notrk / ly6_nsp : 0;
820 if( ly6_nsp < 10 || ly6_frac < 0.85 )
continue;
822 float ly7_frac_max = 0;
823 float ly7_eta_max = 0;
824 float ly7_phi_max = 0;
825 for(
int ly7_ieta=
std::max(1,ly6_ieta-1); ly7_ieta<
std::min(NBINS_ETA,ly6_ieta+1); ly7_ieta++) {
826 for(
int ly7_iphi=
std::max(1,ly6_iphi-1); ly7_iphi<=
std::min(NBINS_PHI,ly6_iphi+1); ly7_iphi++) {
827 float ly7_nsp = ly7_h2_nsp ->
GetBinContent(ly7_ieta,ly7_iphi);
828 float ly7_nsp_notrk = ly7_h2_nsp_notrk->
GetBinContent(ly7_ieta,ly7_iphi);
829 float ly7_frac = ( ly7_nsp > 0 ) ? ly7_nsp_notrk / ly7_nsp : 0;
830 if( ly7_nsp < 10 )
continue;
831 if( ly7_frac > ly7_frac_max ) {
832 ly7_frac_max = ly7_frac;
833 ly7_eta_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_ieta) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_ieta))/2.0;
834 ly7_phi_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_iphi) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_iphi))/2.0;
838 if( ly7_frac_max < 0.85 )
continue;
840 float wsum = ly6_frac + ly7_frac_max;
841 float weta = (ly6_eta*ly6_frac + ly7_eta_max*ly7_frac_max) / wsum;
842 float wphi = (ly6_phi*ly6_frac + ly7_phi_max*ly7_frac_max) / wsum;
843 float w = wsum / 2.0;
844 QT.push_back(std::make_tuple(-1,
w,weta,wphi));
847 ATH_MSG_VERBOSE(
"nr of ly6/ly7 doublet candidate seeds=" << QT.size() <<
", doing clustering...");
850 std::sort(QT.begin(), QT.end(),
851 [](
const std::tuple<int,float,float,float>& lhs,
const std::tuple<int,float,float,float>& rhs) {
852 return std::get<1>(lhs) > std::get<1>(rhs); } );
855 const double CLUSTCUT_DIST_SQUARED = 0.04;
856 const double CLUSTCUT_SEED_FRAC = 0.9;
858 std::vector<float> seeds_wsum;
860 for(
unsigned int i=0;
i<QT.size();
i++) {
861 float phi = std::get<3>(QT[
i]);
862 float eta = std::get<2>(QT[
i]);
863 float w = std::get<1>(QT[
i]);
865 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
866 seeds_wsum.push_back(
w);
869 const int IDX_INITIAL = 100;
870 float dist2_min = 100.0;
872 for(
unsigned j=0; j<seeds_eta.size(); j++) {
873 float ceta = seeds_eta[j]/seeds_wsum[j];
874 float cphi = seeds_phi[j]/seeds_wsum[j];
876 float deta = std::fabs(ceta-
eta);
877 float dphi = std::fabs(cphi-
phi);
878 float dist2 = dphi*dphi+deta*deta;
879 if( dist2 < dist2_min ) {
884 int match_idx = IDX_INITIAL;
886 if( dist2_min < CLUSTCUT_DIST_SQUARED ) { match_idx =
idx_min; }
888 if( match_idx == IDX_INITIAL ) {
889 if(
w > CLUSTCUT_SEED_FRAC && dist2_min > CLUSTCUT_DIST_SQUARED ) {
890 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
891 seeds_wsum.push_back(
w);
895 float new_eta = seeds_eta[match_idx] +
w*
eta;
896 float new_phi = seeds_phi[match_idx] +
w*
phi;
897 float new_wsum = seeds_wsum[match_idx] +
w;
898 seeds_eta[match_idx] = new_eta;
899 seeds_phi[match_idx] = new_phi;
900 seeds_wsum[match_idx] = new_wsum;
903 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
904 float eta = seeds_eta[
i] / seeds_wsum[
i];
905 float phi = seeds_phi[
i] / seeds_wsum[
i];
908 if(
phi < -TMath::Pi() )
phi = 2*TMath::Pi() +
phi;
909 if(
phi > TMath::Pi() )
phi = -2*TMath::Pi() +
phi;
912 ATH_MSG_VERBOSE(
"after clustering, nr of seeds = " << seeds_eta.size());
915 std::vector<unsigned int> idx_to_delete;
916 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
917 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),
i) != idx_to_delete.end() )
continue;
918 float eta_i = seeds_eta[
i];
919 float phi_i = seeds_phi[
i];
920 for(
unsigned int j=
i+1; j<seeds_eta.size(); j++) {
921 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),j) != idx_to_delete.end() )
continue;
922 float eta_j = seeds_eta[j];
923 float phi_j = seeds_phi[j];
924 float dR2 =
deltaR2(eta_i,phi_i,eta_j,phi_j);
925 if( dR2 < CLUSTCUT_DIST_SQUARED ) idx_to_delete.push_back(j);
928 ATH_MSG_VERBOSE(
"nr of duplicated seeds to be removed = " << idx_to_delete.size());
929 if( idx_to_delete.size() > 0 ) {
930 std::sort(idx_to_delete.begin(),idx_to_delete.end());
931 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
932 unsigned int idx = idx_to_delete[j-1];
933 seeds_eta.erase(seeds_eta.begin()+
idx);
934 seeds_phi.erase(seeds_phi.begin()+
idx);
941 return StatusCode::SUCCESS;
948 std::vector<float>& jetSeeds_eta, std::vector<float>& jetSeeds_phi, std::vector<float>& jetSeeds_pt)
const
950 std::vector<unsigned int> idx_to_delete;
951 for(
unsigned int idx=0;
idx<jetSeeds_eta.size(); ++
idx) {
952 const float DR_SQUARED_CUT_TO_FTFSEED = 0.09;
953 float eta = jetSeeds_eta[
idx];
954 float phi = jetSeeds_phi[
idx];
956 for (
const auto& seed : hitDVSeedsContainer ) {
958 if( dR2 < dR2min ) dR2min = dR2;
960 if( dR2min > DR_SQUARED_CUT_TO_FTFSEED ) idx_to_delete.push_back(
idx);
962 if( idx_to_delete.size() > 0 ) {
963 std::sort(idx_to_delete.begin(),idx_to_delete.end());
964 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
965 unsigned int idx = idx_to_delete[j-1];
966 jetSeeds_eta.erase(jetSeeds_eta.begin()+
idx);
967 jetSeeds_phi.erase(jetSeeds_phi.begin()+
idx);
968 if( jetSeeds_pt.size() > 0 ) jetSeeds_pt.erase(jetSeeds_pt.begin()+
idx);
971 return StatusCode::SUCCESS;
978 const std::vector<float>& v_sp_eta,
const std::vector<float>& v_sp_phi,
979 const std::vector<int>& v_sp_layer,
const std::vector<int>& v_sp_usedTrkId,
980 std::vector<float>& seeds_eta, std::vector<float>& seeds_phi )
const
982 const int NBINS_ETA = 50;
983 const float ETA_MIN = -2.5;
986 const int NBINS_PHI = 80;
987 const float PHI_MIN = -4.0;
988 const float PHI_MAX = 4.0;
992 unsigned int slotnr = ctx.slot();
993 unsigned int subSlotnr = ctx.subSlot();
995 sprintf(
hname,
"ftf_s%u_ss%u_ly6_h2_nsp",slotnr,subSlotnr);
996 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);
997 sprintf(
hname,
"ftf_s%u_ss%u_ly7_h2_nsp",slotnr,subSlotnr);
998 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);
1000 sprintf(
hname,
"ftf_s%u_ss%u_ly6_h2_nsp_notrk",slotnr,subSlotnr);
1001 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);
1002 sprintf(
hname,
"ftf_s%u_ss%u_ly7_h2_nsp_notrk",slotnr,subSlotnr);
1003 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);
1005 for(
unsigned int iSeed=0; iSeed<v_sp_eta.size(); ++iSeed) {
1007 int sp_layer = v_sp_layer[iSeed];
1008 float sp_eta = v_sp_eta[iSeed];
1010 if( ilayer<6 )
continue;
1012 int sp_trkid = v_sp_usedTrkId[iSeed];
1013 bool isUsedByTrk = (sp_trkid != -1);
1014 float sp_phi = v_sp_phi[iSeed];
1016 bool fill_out_of_pi =
false;
1019 sp_phi2 = 2*TMath::Pi() + sp_phi;
1020 if( sp_phi2 < PHI_MAX ) fill_out_of_pi =
true;
1023 sp_phi2 = -2*TMath::Pi() + sp_phi;
1024 if( PHI_MIN < sp_phi2 ) fill_out_of_pi =
true;
1027 ly6_h2_nsp->Fill(sp_eta,sp_phi);
1028 if( fill_out_of_pi ) ly6_h2_nsp->Fill(sp_eta,sp_phi2);
1029 if( ! isUsedByTrk ) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi);
1030 if( ! isUsedByTrk && fill_out_of_pi) ly6_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
1033 ly7_h2_nsp->Fill(sp_eta,sp_phi);
1034 if( fill_out_of_pi ) ly7_h2_nsp->Fill(sp_eta,sp_phi2);
1035 if( ! isUsedByTrk ) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi);
1036 if( ! isUsedByTrk && fill_out_of_pi) ly7_h2_nsp_notrk->Fill(sp_eta,sp_phi2);
1043 std::vector<std::tuple<int,float,float,float>> QT;
1045 for(
int ly6_ieta=1; ly6_ieta<=NBINS_ETA; ly6_ieta++) {
1046 float ly6_eta = (ly6_h2_nsp->GetXaxis()->GetBinLowEdge(ly6_ieta) + ly6_h2_nsp->GetXaxis()->GetBinUpEdge(ly6_ieta))/2.0;
1047 for(
int ly6_iphi=1; ly6_iphi<=NBINS_PHI; ly6_iphi++) {
1048 float ly6_phi = (ly6_h2_nsp->GetYaxis()->GetBinLowEdge(ly6_iphi) + ly6_h2_nsp->GetYaxis()->GetBinUpEdge(ly6_iphi))/2.0;
1050 float ly6_nsp = ly6_h2_nsp ->
GetBinContent(ly6_ieta,ly6_iphi);
1051 float ly6_nsp_notrk = ly6_h2_nsp_notrk->
GetBinContent(ly6_ieta,ly6_iphi);
1052 float ly6_frac = ( ly6_nsp > 0 ) ? ly6_nsp_notrk / ly6_nsp : 0;
1053 if( ly6_nsp < 10 || ly6_frac < 0.85 )
continue;
1055 float ly7_frac_max = 0;
1056 float ly7_eta_max = 0;
1057 float ly7_phi_max = 0;
1058 for(
int ly7_ieta=
std::max(1,ly6_ieta-1); ly7_ieta<
std::min(NBINS_ETA,ly6_ieta+1); ly7_ieta++) {
1059 for(
int ly7_iphi=
std::max(1,ly6_iphi-1); ly7_iphi<=
std::min(NBINS_PHI,ly6_iphi+1); ly7_iphi++) {
1060 float ly7_nsp = ly7_h2_nsp ->
GetBinContent(ly7_ieta,ly7_iphi);
1061 float ly7_nsp_notrk = ly7_h2_nsp_notrk->
GetBinContent(ly7_ieta,ly7_iphi);
1062 float ly7_frac = ( ly7_nsp > 0 ) ? ly7_nsp_notrk / ly7_nsp : 0;
1063 if( ly7_nsp < 10 )
continue;
1064 if( ly7_frac > ly7_frac_max ) {
1065 ly7_frac_max = ly7_frac;
1066 ly7_eta_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_ieta) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_ieta))/2.0;
1067 ly7_phi_max = (ly7_h2_nsp->GetXaxis()->GetBinLowEdge(ly7_iphi) + ly7_h2_nsp->GetXaxis()->GetBinUpEdge(ly7_iphi))/2.0;
1071 if( ly7_frac_max < 0.85 )
continue;
1073 float wsum = ly6_frac + ly7_frac_max;
1074 float weta = (ly6_eta*ly6_frac + ly7_eta_max*ly7_frac_max) / wsum;
1075 float wphi = (ly6_phi*ly6_frac + ly7_phi_max*ly7_frac_max) / wsum;
1076 float w = wsum / 2.0;
1077 QT.push_back(std::make_tuple(-1,
w,weta,wphi));
1080 ATH_MSG_VERBOSE(
"nr of ly6/ly7 doublet candidate seeds=" << QT.size() <<
", doing clustering...");
1083 std::sort(QT.begin(), QT.end(),
1084 [](
const std::tuple<int,float,float,float>& lhs,
const std::tuple<int,float,float,float>& rhs) {
1085 return std::get<1>(lhs) > std::get<1>(rhs); } );
1088 const double CLUSTCUT_DIST_SQUARED = 0.04;
1089 const double CLUSTCUT_SEED_FRAC = 0.9;
1091 std::vector<float> seeds_wsum;
1093 for(
unsigned int i=0;
i<QT.size();
i++) {
1094 float phi = std::get<3>(QT[
i]);
1095 float eta = std::get<2>(QT[
i]);
1096 float w = std::get<1>(QT[
i]);
1098 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
1099 seeds_wsum.push_back(
w);
1102 const int IDX_INITIAL = 100;
1103 float dist2_min = 100.0;
1105 for(
unsigned j=0; j<seeds_eta.size(); j++) {
1106 float ceta = seeds_eta[j]/seeds_wsum[j];
1107 float cphi = seeds_phi[j]/seeds_wsum[j];
1109 float deta = std::fabs(ceta-
eta);
1110 float dphi = std::fabs(cphi-
phi);
1111 float dist2 = dphi*dphi+deta*deta;
1112 if( dist2 < dist2_min ) {
1117 int match_idx = IDX_INITIAL;
1118 if(
idx_min != IDX_INITIAL ) {
1119 if( dist2_min < CLUSTCUT_DIST_SQUARED ) { match_idx =
idx_min; }
1121 if( match_idx == IDX_INITIAL ) {
1122 if(
w > CLUSTCUT_SEED_FRAC && dist2_min > CLUSTCUT_DIST_SQUARED ) {
1123 seeds_eta.push_back(
w*
eta); seeds_phi.push_back(
w*
phi);
1124 seeds_wsum.push_back(
w);
1128 float new_eta = seeds_eta[match_idx] +
w*
eta;
1129 float new_phi = seeds_phi[match_idx] +
w*
phi;
1130 float new_wsum = seeds_wsum[match_idx] +
w;
1131 seeds_eta[match_idx] = new_eta;
1132 seeds_phi[match_idx] = new_phi;
1133 seeds_wsum[match_idx] = new_wsum;
1136 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
1137 float eta = seeds_eta[
i] / seeds_wsum[
i];
1138 float phi = seeds_phi[
i] / seeds_wsum[
i];
1141 if(
phi < -TMath::Pi() )
phi = 2*TMath::Pi() +
phi;
1142 if(
phi > TMath::Pi() )
phi = -2*TMath::Pi() +
phi;
1145 ATH_MSG_VERBOSE(
"after clustering, nr of seeds = " << seeds_eta.size());
1148 std::vector<unsigned int> idx_to_delete;
1149 for(
unsigned int i=0;
i<seeds_eta.size();
i++) {
1150 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),
i) != idx_to_delete.end() )
continue;
1151 float eta_i = seeds_eta[
i];
1152 float phi_i = seeds_phi[
i];
1153 for(
unsigned int j=
i+1; j<seeds_eta.size(); j++) {
1154 if(
std::find(idx_to_delete.begin(),idx_to_delete.end(),j) != idx_to_delete.end() )
continue;
1155 float eta_j = seeds_eta[j];
1156 float phi_j = seeds_phi[j];
1157 float dR2 =
deltaR2(eta_i,phi_i,eta_j,phi_j);
1158 if( dR2 < CLUSTCUT_DIST_SQUARED ) idx_to_delete.push_back(j);
1161 ATH_MSG_VERBOSE(
"nr of duplicated seeds to be removed = " << idx_to_delete.size());
1162 if( idx_to_delete.size() > 0 ) {
1163 std::sort(idx_to_delete.begin(),idx_to_delete.end());
1164 for(
unsigned int j=idx_to_delete.size(); j>0; j--) {
1165 unsigned int idx = idx_to_delete[j-1];
1166 seeds_eta.erase(seeds_eta.begin()+
idx);
1167 seeds_phi.erase(seeds_phi.begin()+
idx);
1174 return StatusCode::SUCCESS;
1179 std::vector<HitDVTrk>& hitDVTrksContainer,
1180 std::vector<HitDVSpacePoint>& hitDVSPsContainer)
const
1182 std::vector<int> v_dvtrk_id;
1183 std::vector<float> v_dvtrk_pt;
1184 std::vector<float> v_dvtrk_eta;
1185 std::vector<float> v_dvtrk_phi;
1186 std::vector<int> v_dvtrk_n_hits_inner;
1187 std::vector<int> v_dvtrk_n_hits_pix;
1188 std::vector<int> v_dvtrk_n_hits_sct;
1189 std::vector<float> v_dvtrk_a0beam;
1190 std::unordered_map<Identifier, int> umap_fittedTrack_identifier;
1191 int fittedTrack_id = -1;
1193 static constexpr
float TRKCUT_PTGEV_HITDV = 0.5;
1195 for (
const auto track: tracks) {
1196 float shift_x = 0;
float shift_y = 0;
1203 if (not igt) {
continue;}
1210 m =
track->measurementsOnTrack()->begin(),
1211 me =
track->measurementsOnTrack()->end ();
1212 for(;
m!=me; ++
m ) {
1214 if( prd ==
nullptr )
continue;
1216 if( umap_fittedTrack_identifier.find(id_prd) == umap_fittedTrack_identifier.end() ) {
1217 umap_fittedTrack_identifier.insert(std::make_pair(id_prd,fittedTrack_id));
1221 v_dvtrk_id.push_back(fittedTrack_id);
1223 v_dvtrk_eta.push_back(theTrackInfo.
eta);
1224 v_dvtrk_phi.push_back(
phi);
1225 v_dvtrk_n_hits_inner.push_back(theTrackInfo.
n_hits_inner);
1226 v_dvtrk_n_hits_pix.push_back(theTrackInfo.
n_hits_pix);
1227 v_dvtrk_n_hits_sct.push_back(theTrackInfo.
n_hits_sct);
1228 v_dvtrk_a0beam.push_back(theTrackInfo.
a0beam);
1230 ATH_MSG_DEBUG(
"Nr of selected tracks / all = " << fittedTrack_id <<
" / " << tracks.size());
1231 ATH_MSG_DEBUG(
"Nr of Identifiers used by selected tracks = " << umap_fittedTrack_identifier.size());
1235 int n_sp_usedByTrk = 0;
1237 std::unordered_map<Identifier, int> umap_sp_identifier;
1238 umap_sp_identifier.reserve(1.3*convertedSpacePoints.size());
1243 if( umap_sp_identifier.find(id_prd) == umap_sp_identifier.end() ) {
1244 umap_sp_identifier.insert(std::make_pair(id_prd,-1));
1249 for(
unsigned int iSp=0; iSp<convertedSpacePoints.size(); ++iSp) {
1250 bool isPix = convertedSpacePoints[iSp].isPixel();
1251 bool isSct = convertedSpacePoints[iSp].isSCT();
1252 if( !
isPix && ! isSct )
continue;
1253 const Trk::SpacePoint* sp = convertedSpacePoints[iSp].offlineSpacePoint();
1257 int n_id_usedByTrack = 0;
1258 for(
auto it=umap_sp_identifier.begin();
it!=umap_sp_identifier.end(); ++
it) {
1260 if( umap_fittedTrack_identifier.find(id_sp) != umap_fittedTrack_identifier.end() ) {
1261 umap_sp_identifier[id_sp] = umap_fittedTrack_identifier[id_sp];
1265 ATH_MSG_DEBUG(
"Nr of SPs / Identifiers (all) / Identifiers (usedByTrack) = " << convertedSpacePoints.size() <<
" / " << umap_sp_identifier.size() <<
" / " << n_id_usedByTrack);
1268 int usedTrack_id = -1;
1271 if( umap_sp_identifier.find(id_prd) != umap_sp_identifier.end() ) {
1272 usedTrack_id = umap_sp_identifier[id_prd];
1275 return usedTrack_id;
1278 std::vector<float> v_sp_eta;
1279 v_sp_eta.reserve(convertedSpacePoints.size());
1280 std::vector<float> v_sp_r;
1281 v_sp_r.reserve(convertedSpacePoints.size());
1282 std::vector<float> v_sp_phi;
1283 v_sp_phi.reserve(convertedSpacePoints.size());
1284 std::vector<int> v_sp_layer;
1285 v_sp_layer.reserve(convertedSpacePoints.size());
1286 std::vector<bool> v_sp_isPix;
1287 v_sp_isPix.reserve(convertedSpacePoints.size());
1288 std::vector<bool> v_sp_isSct;
1289 v_sp_isSct.reserve(convertedSpacePoints.size());
1290 std::vector<int> v_sp_usedTrkId;
1291 v_sp_usedTrkId.reserve(convertedSpacePoints.size());
1293 for(
const auto& sp : convertedSpacePoints) {
1294 bool isPix = sp.isPixel();
1295 bool isSct = sp.isSCT();
1296 if( !
isPix && ! isSct )
continue;
1299 int usedTrack_id = -1;
1300 int usedTrack_id_first = sp_map_used_id(osp->
clusterList().first);
1301 if (usedTrack_id_first != -1) {
1302 usedTrack_id = usedTrack_id_first;
1304 int usedTrack_id_second = sp_map_used_id(osp->
clusterList().second);
1305 if (usedTrack_id_second != -1) {
1306 usedTrack_id = usedTrack_id_second;
1311 if( usedTrack_id != -1 ) n_sp_usedByTrk++;
1312 int layer = sp.layer();
1313 float sp_r = sp.r();
1316 float sp_eta = pos_sp.eta();
1317 float sp_phi = pos_sp.phi();
1319 v_sp_eta.push_back(sp_eta);
1320 v_sp_r.push_back(sp_r);
1321 v_sp_phi.push_back(sp_phi);
1322 v_sp_layer.push_back(
layer);
1323 v_sp_isPix.push_back(
isPix);
1324 v_sp_isSct.push_back(isSct);
1325 v_sp_usedTrkId.push_back(usedTrack_id);
1327 ATH_MSG_VERBOSE(
"+++ SP eta / phi / layer / ixPix / usedTrack_id = " << sp_eta <<
" / " << sp_phi <<
" / " <<
layer <<
" / " <<
isPix <<
" / " << usedTrack_id);
1330 ATH_MSG_DEBUG(
"Nr of SPs / all = " << n_sp <<
" / " << convertedSpacePoints.size());
1331 ATH_MSG_DEBUG(
"Nr of SPs used by selected tracks = " << n_sp_usedByTrk);
1334 std::vector<float> v_seeds_eta;
1335 std::vector<float> v_seeds_phi;
1336 std::vector<int16_t> v_seeds_type;
1341 const unsigned int L1JET_ET_CUT = 30;
1345 if (!recJetRoiCollectionHandle.isValid()){
1347 return StatusCode::FAILURE;
1351 if( recRoI ==
nullptr )
continue;
1352 bool isSeed =
false;
1360 if( ! isSeed )
continue;
1364 v_seeds_eta.push_back(recRoI->
eta());
1365 v_seeds_phi.push_back(
roiPhi);
1366 v_seeds_type.push_back(0);
1368 ATH_MSG_DEBUG(
"Nr of L1_J" << L1JET_ET_CUT <<
" seeds = " << v_seeds_eta.size());
1371 std::vector<float> v_spseeds_eta;
1372 std::vector<float> v_spseeds_phi;
1373 ATH_CHECK(
findSPSeeds(ctx, v_sp_eta, v_sp_phi, v_sp_layer, v_sp_usedTrkId, v_spseeds_eta, v_spseeds_phi) );
1375 for(
size_t idx=0;
idx<v_spseeds_eta.size(); ++
idx) {
1376 v_seeds_eta.push_back(v_spseeds_eta[
idx]);
1377 v_seeds_phi.push_back(v_spseeds_phi[
idx]);
1378 v_seeds_type.push_back(1);
1380 ATH_MSG_DEBUG(
"Nr of SP + L1_J" << L1JET_ET_CUT <<
" seeds = " << v_seeds_eta.size());
1386 const int N_MAX_SEEDS = 200;
1387 int n_seeds =
std::min(N_MAX_SEEDS,(
int)v_seeds_eta.size());
1388 hitDVSeedsContainer.reserve(n_seeds);
1389 for(
auto iSeed=0; iSeed < n_seeds; ++iSeed) {
1391 seed.eta = v_seeds_eta[iSeed];
1392 seed.phi = v_seeds_phi[iSeed];
1393 seed.type = v_seeds_type[iSeed];
1394 hitDVSeedsContainer.push_back(seed);
1398 const float TRKCUT_DELTA_R_TO_SEED = 1.0;
1399 hitDVTrksContainer.reserve(v_dvtrk_pt.size());
1400 for(
unsigned int iTrk=0; iTrk<v_dvtrk_pt.size(); ++iTrk) {
1401 float trk_eta = v_dvtrk_eta[iTrk];
1402 float trk_phi = v_dvtrk_phi[iTrk];
1404 bool isNearSeed =
false;
1405 for (
unsigned int iSeed=0; iSeed<v_seeds_eta.size(); ++iSeed) {
1406 float seed_eta = v_seeds_eta[iSeed];
1407 float seed_phi = v_seeds_phi[iSeed];
1408 float dR2 =
deltaR2(trk_eta,trk_phi,seed_eta,seed_phi);
1409 if( dR2 <= TRKCUT_DELTA_R_TO_SEED*TRKCUT_DELTA_R_TO_SEED ) { isNearSeed =
true;
break; }
1411 if( ! isNearSeed )
continue;
1414 hitDVTrk.
id = v_dvtrk_id[iTrk];
1415 hitDVTrk.
pt = v_dvtrk_pt[iTrk];
1416 hitDVTrk.
eta = v_dvtrk_eta[iTrk];
1417 hitDVTrk.
phi = v_dvtrk_phi[iTrk];
1419 hitDVTrk.
n_hits_pix = v_dvtrk_n_hits_pix[iTrk];
1420 hitDVTrk.
n_hits_sct = v_dvtrk_n_hits_sct[iTrk];
1421 hitDVTrk.
a0beam = v_dvtrk_a0beam[iTrk];
1423 hitDVTrksContainer.push_back(hitDVTrk);
1427 const float SPCUT_DELTA_R_TO_SEED = 1.0;
1428 const size_t n_sp_max = std::min<size_t>(100000, v_sp_eta.size());
1429 size_t n_sp_stored = 0;
1431 hitDVSPsContainer.reserve(n_sp_max);
1433 for(
size_t iSp=0; iSp<v_sp_eta.size(); ++iSp) {
1435 const float sp_eta = v_sp_eta[iSp];
1436 const float sp_phi = v_sp_phi[iSp];
1437 bool isNearSeed =
false;
1438 for (
size_t iSeed=0; iSeed<v_seeds_eta.size(); ++iSeed) {
1439 const float seed_eta = v_seeds_eta[iSeed];
1440 const float seed_phi = v_seeds_phi[iSeed];
1441 const float dR2 =
deltaR2(sp_eta, sp_phi, seed_eta, seed_phi);
1442 if( dR2 <= SPCUT_DELTA_R_TO_SEED*SPCUT_DELTA_R_TO_SEED ) { isNearSeed =
true;
break; }
1444 if( ! isNearSeed )
continue;
1446 if( n_sp_stored >= n_sp_max )
break;
1448 hitDVSP.
eta = v_sp_eta[iSp];
1449 hitDVSP.
r = v_sp_r[iSp];
1450 hitDVSP.
phi = v_sp_phi[iSp];
1451 hitDVSP.
layer = v_sp_layer[iSp];
1452 hitDVSP.
isPix = v_sp_isPix[iSp];
1453 hitDVSP.
isSct = v_sp_isSct[iSp];
1454 hitDVSP.
usedTrkId = v_sp_usedTrkId[iSp];
1455 hitDVSPsContainer.push_back(hitDVSP);
1460 return StatusCode::SUCCESS;