7 #include "TLorentzVector.h"
13 #include "GaudiKernel/IChronoStatSvc.h"
20 const std::string&
name,
27 m_jetMaxPtCut(3500000.),
28 m_jetMinPtCut( 35000.),
33 m_calibFileName(
"TrackClassif_3cl.v03.root"),
34 m_calibFileNameFivePtJetBin(
"TrackClassif_3cl.v04.root"),
36 m_useFivePtJetBinVersion(kFALSE)
67 std::unique_ptr<TFile>
rootFile(TFile::Open(fullPathToFile.c_str(),
"READ"));
71 return StatusCode::FAILURE;
75 std::unique_ptr<TTree> training((TTree*)
rootFile->Get(
"BDT"));
76 m_vTrkClassBDT.push_back(std::make_unique<MVAUtils::BDT>(training.get()));
80 unsigned int nPtjetRanges=5;
81 std::vector<std::string> v_BDTName(nPtjetRanges,
"");
89 for(
const auto& bdtname : v_BDTName)
91 std::unique_ptr<TTree> training((TTree*)
rootFile->Get(bdtname.c_str()));
92 m_vTrkClassBDT.push_back(std::make_unique<MVAUtils::BDT>(training.get()));
100 return StatusCode::SUCCESS;
106 ATH_MSG_DEBUG(
" No implemented Trk::ITrkVKalVrtFitter interface");
107 return StatusCode::SUCCESS;
134 return StatusCode::SUCCESS;
141 return StatusCode::SUCCESS;
147 std::vector<float> safeReturn(3,0.);
151 if(
Trk->pt() > wrkJetPt)
return safeReturn;
152 if(
Trk->numberDoF() == 0)
return safeReturn;
159 std::vector<double> Impact,ImpactError;
161 AmgVector(5) tmpPerigee =
Trk->perigeeParameters().parameters();
162 if(
std::sin(tmpPerigee[2]-
Jet.Phi())*Impact[0] < 0 ){ Impact[0] = -std::abs(Impact[0]);}
163 else{ Impact[0] = std::abs(Impact[0]);}
164 if( (tmpPerigee[3]-
Jet.Theta())*Impact[1] < 0 ) { Impact[1] = -std::abs(Impact[1]);}
165 else{ Impact[1] = std::abs(Impact[1]);}
166 double SignifR = Impact[0]/ std::sqrt(ImpactError[0]);
167 double SignifZ = Impact[1]/ std::sqrt(ImpactError[2]);
170 if( std::sqrt(SignifR*SignifR +SignifZ*SignifZ) < 1.)
return safeReturn;
172 int hitIBL=0, hitBL=0;
173 uint8_t IBLhit,BLhit,IBLexp,BLexp;
178 hitIBL=IBLhit;
if( IBLexp==0 ) hitIBL=-1;
179 hitBL = BLhit;
if( BLexp==0 ) hitBL =-1;
200 float prbP= pfrac/(coeffPt+pfrac);
201 float etatrk=
Trk->eta();
204 if(Sig3D<coeffSig)
return safeReturn;
213 TLV.SetPtEtaPhiE(
Trk->pt(),
Trk->eta(),
Trk->phi(),
Trk->e());
214 float pTvsJet=TLV.Perp(
Jet.Vect());
218 std::vector<float> bdt_vars={Sig3D, prbP, pTvsJet,
d0, SigR, SigZ, ptjet, (
float)hitIBL, (
float)hitBL, etatrk};
219 std::vector<float> weights;
226 else if(ptjet > 1.e6 && ptjet < 2.e6) {e_ptjet =
e_ptjet1to2TeV; }
228 else {
ATH_MSG_ERROR(
"Not a valid ptjet value in five ptjet bin TrackClassification application: " << ptjet);
return safeReturn; }
229 weights =
m_vTrkClassBDT.at(e_ptjet)->GetMultiResponse(bdt_vars,3);
243 std::vector<float> v_tctScore =
trkTypeWgts(trk,PV,curjet->
p4());
244 trackWriteDecorHandleTCTScore(*trk) = v_tctScore;
247 trackWriteDecorHandleJetLink(*trk) = linkJet;
257 for(
const auto *itrk : trks)
259 std::vector<float> v_tctScore =
trkTypeWgts(itrk,PV,curjet->
p4());
260 jetWriteDecorHandleTCTScore(*curjet).push_back(v_tctScore);
265 jetWriteDecorHandleTrackLink(*curjet).push_back(linkTrack);