34 m_JFvarFactory(
"Analysis::JetFitterVariablesFactory",this)
36 declareInterface<IBTagLightSecVertexing>(
this);
61 return StatusCode::FAILURE;
65 ATH_MSG_ERROR(
"#BTAG# Size mismatch between secVertexFinderBaseName and track name list ");
66 return StatusCode::FAILURE;
75 return StatusCode::SUCCESS;
87 std::vector< ElementLink< xAOD::VertexContainer > > SVertexLinks;
88 if (myVertexInfoVKal) {
91 return StatusCode::FAILURE;
93 SVertexLinks = h_jetSVLinkName(myJet);
96 std::vector<ElementLink<xAOD::TrackParticleContainer> > TrkList;
97 float mass = 0, energyfrc = NAN, energyTrk = 0, dsttomatlayer = NAN;
98 int n2trk = 0, npsec = 0;
101 if (myVertexInfoVKal) {
102 std::vector<xAOD::Vertex*>::const_iterator verticesBegin = myVertexInfoVKal->
vertices().begin();
103 std::vector<xAOD::Vertex*>::const_iterator verticesEnd = myVertexInfoVKal->
vertices().end();
104 for (std::vector<xAOD::Vertex*>::const_iterator verticesIter = verticesBegin; verticesIter!=verticesEnd;++verticesIter) {
105 std::vector<ElementLink<xAOD::TrackParticleContainer> > theseTracks = (*verticesIter)->trackParticleLinks();
106 npsec += theseTracks.size();
107 for (
auto & theseTrack : theseTracks){
108 TrkList.push_back(theseTrack);
113 ATH_MSG_DEBUG(
"#BTAG# Size of the sec vertex linked to the BTagging: " << SVertexLinks.size());
114 newBTag->
setVariable<std::vector<ElementLink<xAOD::VertexContainer> > >(
basename,
"vertices", SVertexLinks);
117 if(!SVertexLinks.empty() && myVertexInfoVKal){
146 newBTag->
setVariable<std::vector<ElementLink<xAOD::TrackParticleContainer> > >(
basename,
"TrackParticleLinks", TrkList);
150 std::vector<ElementLink<xAOD::TrackParticleContainer> > badtrackEL;
151 if(theTrackParticleContainer && myVertexInfoVKal){
152 std::vector<const xAOD::IParticle*> btip = myVertexInfoVKal->
badTracksIP();
164 badtrackEL.push_back(tpel);
167 newBTag->
setVariable<std::vector<ElementLink<xAOD::TrackParticleContainer> > >(
basename,
"badTracksIP", badtrackEL);
170 return StatusCode::SUCCESS;
178 const std::string&
basename)
const {
183 std::vector< ElementLink< xAOD::BTagVertexContainer > > JFVerticesLinks;
186 std::vector< const xAOD::Vertex*> vecTwoTrkVtx;
187 if (myVertexInfoJetFitter) {
191 ATH_MSG_ERROR(
" cannot retrieve vertex container EL decoration with key " <<
key.key() );
192 return StatusCode::FAILURE;
194 JFVerticesLinks = h_jetJFVtxLinkName(myJet);
197 int N2TrkVtx = vecTwoTrkVtx.size();
206 std::vector<Trk::VxJetCandidate*> JFvertices;
207 if (myVertexInfoJetFitter) JFvertices = myVertexInfoJetFitter->
verticesJF();
211 std::vector<Trk::VxVertexOnJetAxis*> Vtxonjetaxes;
212 if (!JFvertices.empty()) {
216 return StatusCode::SUCCESS;
223 nVtx = Vtxonjetaxes.size();
224 typedef std::vector<ElementLink<xAOD::BTagVertexContainer> > BTagVertices;
226 newBTag->
setVariable<std::vector<ElementLink<xAOD::BTagVertexContainer> > >(
basename,
"JFvertices", JFVerticesLinks);
229 ATH_MSG_DEBUG(
"#BTAGJF# n vertices: " << vertsAcc (*newBTag).size());
235 vtxPositions = recVtxposition.
position();
237 ATH_MSG_DEBUG(
"#BTAGJF# size vtxPosition "<<vtxPositions.size());
239 std::vector< float > fittedPosition = std::vector<float>(nVtx+5,-1);
240 std::vector< float > fittedCov = std::vector<float>(nVtx+5,-1);
241 if(vtxPositions.rows()>4 ) {
245 fittedPosition[3] = nVtx > 0 ? vtxPositions[
Trk::jet_phi] : NAN;
246 fittedPosition[4] = nVtx > 0 ? vtxPositions[
Trk::jet_theta] : NAN;
248 fittedCov[0] = vtxCovMatrix(0,0);
249 fittedCov[1] = vtxCovMatrix(1,1);
250 fittedCov[2] = vtxCovMatrix(2,2);
251 fittedCov[3] = vtxCovMatrix(3,3);
252 fittedCov[4] = vtxCovMatrix(4,4);
255 for(
int i=0;
i<nVtx; ++
i){
256 fittedPosition[
i+5] = vtxPositions[
i+5];
257 fittedCov[
i+5] = vtxCovMatrix(
i+5,
i+5);
264 std::vector<Trk::VxTrackAtVertex*> trackatPV;
265 std::vector< float > tracksAtPVchi2;
266 std::vector< float > tracksAtPVndf;
267 std::vector< ElementLink< xAOD::TrackParticleContainer > > tracksAtPVlinks;
270 std::vector<Trk::VxTrackAtVertex*>::const_iterator irBegin = trackatPV.begin();
271 std::vector<Trk::VxTrackAtVertex*>::const_iterator irEnd = trackatPV.end();
272 for (std::vector<Trk::VxTrackAtVertex*>::const_iterator
it=irBegin;
it!=irEnd; ++
it) {
276 tracksAtPVchi2.push_back(
float(tmpchi2));
277 tracksAtPVndf.push_back(
float(tmpndf));
281 if (!trkLinkTPxAOD) {
282 ATH_MSG_WARNING(
"#BTAG# bad ITrackLink is not a LinkToXAODTrackParticle");
288 tracksAtPVlinks.push_back(tpel);
294 newBTag->
setVariable<std::vector< ElementLink< xAOD::TrackParticleContainer > > >(
basename,
"tracksAtPVlinks", tracksAtPVlinks);
299 ATH_MSG_ERROR(
"#BTAG# error filling variables in JetFitterVariablesFactory" );
303 return StatusCode::SUCCESS;
313 if (!h_VertexCollectionName.
isValid()) {
315 return StatusCode::FAILURE;
317 unsigned int nVertexes = h_VertexCollectionName->
size();
318 if (nVertexes == 0) {
320 return StatusCode::SUCCESS;
322 for (
const auto *fz : *h_VertexCollectionName) {
330 if (! primaryVertex) {
331 ATH_MSG_DEBUG(
"#BTAG# No vertex labeled as VxType::PriVtx!");
342 if (h_VxSecVertexInfoName.
isValid()) {
344 ATH_MSG_ERROR(
"Size of jet container different than size of VxSecVertexInfo: " << infoCont.key());
345 return StatusCode::FAILURE;
361 trackAcc (trackname);
362 std::vector<ElementLink< xAOD::TrackParticleContainer > > tracksInJet;
363 tracksInJet = trackAcc (**btagIter);
365 std::vector<ElementLink< xAOD::TrackParticleContainer > >
::iterator itEL = tracksInJet.begin();
366 std::vector<ElementLink< xAOD::TrackParticleContainer > >
::iterator itELend = tracksInJet.end();
368 if(tracksInJet.empty()){
369 ATH_MSG_DEBUG(
"#BTAG# no tracks associated to the jet. Set some with the track selection tool " << trackname <<
" for VertexFinderxAODBaseName "<<
basename);
371 std::vector<ElementLink<xAOD::TrackParticleContainer> > TrkList;
372 (*btagIter)->setSV1_TrackParticleLinks(TrkList);
373 std::vector<ElementLink<xAOD::TrackParticleContainer> > badtrackEL;
374 (*btagIter)->setVariable<std::vector<ElementLink<xAOD::TrackParticleContainer> > >(
basename,
"badTracksIP", badtrackEL);
375 (*btagIter)->setDynTPELName(
basename,
"badTracksIP");
376 std::vector< ElementLink< xAOD::VertexContainer > > SVertexLinks;
377 (*btagIter)->setVariable<std::vector<ElementLink<xAOD::VertexContainer> > >(
basename,
"vertices", SVertexLinks);
378 (*btagIter)->setDynVxELName(
basename,
"vertices");
381 std::vector<ElementLink<xAOD::TrackParticleContainer> > badtrackEL;
382 (*btagIter)->setVariable<std::vector<ElementLink<xAOD::TrackParticleContainer> > >(
basename,
"badTracksIP", badtrackEL);
383 (*btagIter)->setDynTPELName(
basename,
"badTracksIP");
384 std::vector< ElementLink< xAOD::VertexContainer > > SVertexLinks;
385 (*btagIter)->setVariable<std::vector<ElementLink<xAOD::VertexContainer> > >(
basename,
"vertices", SVertexLinks);
386 (*btagIter)->setDynVxELName(
basename,
"vertices");
389 std::vector< ElementLink< xAOD::TrackParticleContainer > > tracksAtPVlinks;
390 (*btagIter)->setVariable<std::vector< ElementLink< xAOD::TrackParticleContainer > > >(
basename,
"tracksAtPVlinks", tracksAtPVlinks);
391 (*btagIter)->setDynTPELName(
basename,
"tracksAtPVlinks");
395 for ( ; itEL != itELend; ++itEL ) {
398 theTrackParticleContainer = (*itEL).getStorableObjectPointer();
403 ATH_MSG_DEBUG(
"#BTAG# Found valid VKalVertexInfo information: " << infoCont.key());
411 ATH_MSG_DEBUG(
"#BTAG# Found valid VxJetFitterVertexInfo information: " << infoCont.key());
418 ATH_MSG_DEBUG(
"#BTAG# BTagLightSecVertexing: VxSecVertexInfo pointer cannot be interpreted for " <<
basename);
423 ATH_MSG_DEBUG(
"#BTAG# VxJetFitterVertexInfo container " << infoCont.key() <<
" is not valid");
428 return StatusCode::SUCCESS;