56 if (!h_JetCollectionName.
isValid()) {
58 return StatusCode::FAILURE;
67 ATH_MSG_DEBUG(
"#BTAG# Record the BTagging JF Vertex output container");
69 ATH_CHECK( h_BTagJFVtxCollectionName.
record(std::make_unique<xAOD::BTagVertexContainer>(),
70 std::make_unique<xAOD::BTagVertexAuxContainer>()) );
75 ATH_MSG_DEBUG(
"#BTAG# Record the BTagging Secondary Vertex output container");
77 ATH_CHECK( h_BTagSVCollectionName.
record(std::make_unique<xAOD::VertexContainer>(),
78 std::make_unique<xAOD::VertexAuxContainer>()) );
81 if (h_JetCollectionName->empty()) {
83 return StatusCode::SUCCESS;
87 if (!h_TrackCollectionName.
isValid()) {
89 return StatusCode::FAILURE;
96 if (!h_VertexCollectionName.
isValid()) {
98 return StatusCode::FAILURE;
103 if (!h_VxSecVertexInfoName.
isValid()) {
105 return StatusCode::FAILURE;
107 ATH_MSG_DEBUG(
"Size of VxSecVertexInfo: " << h_VxSecVertexInfoName->size());
109 if (h_VxSecVertexInfoName->size() != h_JetCollectionName->size()) {
110 ATH_MSG_ERROR(
"Size of jet container different than size of VxSecVertexInfo");
111 return StatusCode::FAILURE;
114 unsigned int nVertexes = h_VertexCollectionName->size();
115 if (nVertexes == 0) {
117 return StatusCode::FAILURE;
123 for (
const xAOD::Jet* jetToTag : *h_JetCollectionName) {
125 std::vector< ElementLink< xAOD::VertexContainer > > SVertexLinks;
126 if(myVertexInfo !=
nullptr) {
136 ATH_MSG_DEBUG(
"#BTAG# dynamic_cast failed for a non-nullptr myVertexInfo!");
139 h_jetSVLinkName(*jetToTag) = SVertexLinks;
145 for (
const xAOD::Jet* jetToTag : *h_JetCollectionName) {
147 std::vector< ElementLink< xAOD::BTagVertexContainer > > JFVtxLinks;
148 if(myVertexInfo !=
nullptr) {
150 ATH_MSG_DEBUG(
"#BTAG# Found VxJetFitterVertexInfo information");
151 StatusCode
sc =
createJFContainer(&(*h_BTagJFVtxCollectionName), &JFVtxLinks, myVertexInfoJetFitter, theTrackParticleContainer);
158 ATH_MSG_DEBUG(
"#BTAG# dynamic_cast failed for a non-nullptr myVertexInfo!");
161 h_jetSVLinkName(*jetToTag) = JFVtxLinks;
169 return StatusCode::SUCCESS;
198 const std::vector<Trk::VxJetCandidate*>& JFvertices = myVertexInfoJetFitter->
verticesJF();
201 if (!JFvertices.empty()) {
205 return StatusCode::SUCCESS;
210 typedef std::map<Trk::VxVertexOnJetAxis*, std::vector<std::pair<Trk::VxVertexOnJetAxis*,float> > > map2vtx;
211 map2vtx inverseCompMap;
213 if (ClusteringTable !=
nullptr) {
215 std::map<float,Trk::PairOfVxVertexOnJetAxis>::const_iterator mapiter = mapPairVtxOnJetAxis.begin();
216 for(;mapiter != mapPairVtxOnJetAxis.end(); ++mapiter){
220 float comp = mapiter->first;
222 std::pair<Trk::VxVertexOnJetAxis*,float> pair1(vtx1, comp);
223 std::pair<Trk::VxVertexOnJetAxis*,float> pair2(vtx1, comp);
225 inverseCompMap[vtx1].push_back(pair2);
226 inverseCompMap[vtx2].push_back(pair1);
233 ATH_MSG_DEBUG(
"#BTAG# VerticesOnJetAxis of VxJetCandidate size: " << Vtxonjetaxes.size());
234 std::vector<Trk::VxVertexOnJetAxis*>::const_iterator iterBegin = Vtxonjetaxes.begin();
235 std::vector<Trk::VxVertexOnJetAxis*>::const_iterator iterEnd = Vtxonjetaxes.end();
239 nVtx = Vtxonjetaxes.size();
240 std::map<Trk::VxVertexOnJetAxis*, ElementLink< xAOD::BTagVertexContainer> > oldnewmap;
242 for (std::vector<Trk::VxVertexOnJetAxis*>::const_iterator it=iterBegin; it!=iterEnd; ++it) {
247 comptoPV = (*it)->getCompatibilityToPrimaryVtx();
248 const std::vector<Trk::VxTrackAtVertex*> & trackatVtx = (*it)->getTracksAtVertex();
249 std::vector<Trk::VxTrackAtVertex*>::const_iterator itrBegin = trackatVtx.begin();
250 std::vector<Trk::VxTrackAtVertex*>::const_iterator itrEnd = trackatVtx.end();
251 std::vector< float> tmpchi2;
252 std::vector< float> tmpndf;
253 std::vector< ElementLink< xAOD::TrackParticleContainer > > trkLinks;
254 std::vector< float> tmpRefPx;
255 std::vector< float> tmpRefPy;
256 std::vector< float> tmpRefPz;
259 for (std::vector<Trk::VxTrackAtVertex*>::const_iterator itr=itrBegin; itr!=itrEnd; ++itr) {
264 tmpchi2.push_back(
float(tpchi2));
265 tmpndf.push_back(
float(tpndf));
269 if (!trkLinkTPxAOD) {
270 ATH_MSG_WARNING(
"#BTAG# bad ITrackLink is not a LinkToXAODTrackParticle");
277 trkLinks.push_back(tpel);
282 tmpRefPx.push_back(mytrack.x());
283 tmpRefPy.push_back(mytrack.y());
284 tmpRefPz.push_back(mytrack.z());
289 bTagJFVertexContainer->
push_back(newbtagVtx);
303 JFVerticesLinks->push_back(linkBTagVertex);
304 oldnewmap.insert(std::make_pair(*it,linkBTagVertex));
307 if(ClusteringTable !=
nullptr){
308 for (std::vector<Trk::VxVertexOnJetAxis*>::const_iterator it=iterBegin; it!=iterEnd; ++it) {
309 std::vector< ElementLink< xAOD::BTagVertexContainer > > JFCompLinks;
310 std::vector<float> JFCompValues;
313 map2vtx::iterator itmap = inverseCompMap.find(*it);
314 if(itmap == inverseCompMap.end()){
315 ATH_MSG_DEBUG(
"#BTAG# JF compatibility value in map2vtx map not found ");
321 std::vector<std::pair<Trk::VxVertexOnJetAxis*,float> > tmpvectpair = itmap->second;
323 for(
auto & icomppair : tmpvectpair){
324 std::map<Trk::VxVertexOnJetAxis*, ElementLink< xAOD::BTagVertexContainer> >
::iterator JFOlNewIter = oldnewmap.find(icomppair.first);
326 if(JFOlNewIter == oldnewmap.end()){
331 JFCompLinks.push_back(JFOlNewIter->second);
332 JFCompValues.push_back(icomppair.second);
341 ATH_MSG_DEBUG(
"#BTAGJF# size vtxPosition "<<vtxPositions.size());
342 std::vector< float > fittedPosition = std::vector<float>(nVtx+5,-1);
343 std::vector< float > fittedCov = std::vector<float>(nVtx+5,-1);
344 if (fittedPosition.size() < 5) std::abort();
345 if(vtxPositions.rows()>4 ) {
352 fittedCov[0] = vtxCovMatrix(0,0);
353 fittedCov[1] = vtxCovMatrix(1,1);
354 fittedCov[2] = vtxCovMatrix(2,2);
355 fittedCov[3] = vtxCovMatrix(3,3);
356 fittedCov[4] = vtxCovMatrix(4,4);
360 for(
int i=0; i<nVtx; ++i){
361 fittedPosition[i+5] = vtxPositions[i+5];
362 fittedCov[i+5] = vtxCovMatrix(i+5,i+5);
367 std::vector<Trk::VxTrackAtVertex*>::const_iterator irBegin = trackatPV.begin();
368 std::vector<Trk::VxTrackAtVertex*>::const_iterator irEnd = trackatPV.end();
369 std::vector< float > tracksAtPVchi2;
370 std::vector< float > tracksAtPVndf;
371 std::vector< ElementLink< xAOD::TrackParticleContainer > > tracksAtPVlinks;
373 for (std::vector<Trk::VxTrackAtVertex*>::const_iterator it=irBegin; it!=irEnd; ++it) {
377 tracksAtPVchi2.push_back(
float(tmpchi2));
378 tracksAtPVndf.push_back(
float(tmpndf));
383 if (!trkLinkTPxAOD) {
384 ATH_MSG_WARNING(
"#BTAG# bad ITrackLink is not a LinkToXAODTrackParticle");
390 tracksAtPVlinks.push_back(tpel);
397 return StatusCode::SUCCESS;