diff --git a/Reconstruction/VKalVrt/GNNVertexConstructor/GNNVertexConstructor/GNNVertexConstructorTool.h b/Reconstruction/VKalVrt/GNNVertexConstructor/GNNVertexConstructor/GNNVertexConstructorTool.h index eb2010cb55492132a9e18dab704a54677c6fdf03..fcd4362c86039b8095cbff3faa1e17509d073a35 100644 --- a/Reconstruction/VKalVrt/GNNVertexConstructor/GNNVertexConstructor/GNNVertexConstructorTool.h +++ b/Reconstruction/VKalVrt/GNNVertexConstructor/GNNVertexConstructor/GNNVertexConstructorTool.h @@ -28,6 +28,12 @@ #include "iostream" #include "iterator" #include "map" +#include "set" +#include "algorithm" +#include "ranges" +#include "vector" +#include <numeric> +#include <vector> class TH2D; class TH1F; @@ -131,6 +137,8 @@ public: xAOD::VertexContainer*, const xAOD::Vertex & primaryVertex, const EventContext&) const; + + // Tools ToolHandle<FlavorTagDiscriminants::GNNTool> m_gnn_Tool{this, "gnn_Tool", "", @@ -140,6 +148,8 @@ public: // Read handles SG::ReadDecorHandleKey<xAOD::JetContainer> m_trackLinksKey{ this, "trackLinksKey", "", "Jet GNN Deco Read Key for track link"}; + SG::ReadDecorHandleKey<xAOD::JetContainer> m_trackOriginsKey{ + this, "trackLinksKey", "", "Jet GNN Deco Read Key for track origin"}; SG::ReadDecorHandleKey<xAOD::JetContainer> m_vertexLinksKey{ this, "vertexLinksKey", "", "Jet GNN Deco Read Key for vertex link"}; SG::ReadHandleKey<xAOD::EventInfo> m_eventInfoKey{this, "eventInfoKey", "EventInfo", diff --git a/Reconstruction/VKalVrt/GNNVertexConstructor/Root/GNNVertexConstructorTool.cxx b/Reconstruction/VKalVrt/GNNVertexConstructor/Root/GNNVertexConstructorTool.cxx index 406906583b4a05b125a0fc5b5d23b061d657159a..63b40c9611cf0f220fdcc74fc341c905245c7b2a 100644 --- a/Reconstruction/VKalVrt/GNNVertexConstructor/Root/GNNVertexConstructorTool.cxx +++ b/Reconstruction/VKalVrt/GNNVertexConstructor/Root/GNNVertexConstructorTool.cxx @@ -3,6 +3,8 @@ // Headers to Read & Write Decorations #include "StoreGate/ReadDecorHandle.h" #include "StoreGate/WriteDecorHandle.h" +#include "ranges" +#include <boost/iterator/zip_iterator.hpp> namespace Rec { @@ -24,10 +26,11 @@ GNNVertexConstructorTool::GNNVertexConstructorTool(const std::string &type, cons m_Rlayer1 (0.), m_Rlayer2 (0.), m_MultiWithPrimary(false), - m_minD0(0.1) + m_minD0(0.0) { declareInterface<IGNNVertexConstructorInterface>(this); declareProperty("JetTrackLinks", m_trackLinksKey = "AntiKt4EMPFlowJetsAuxDyn.TrackLinks"); + declareProperty("JetTrackLinks", m_trackOriginsKey = "AntiKt4EMPFlowJetsAuxDyn.GN2v01_TrackOrigin"); declareProperty("JetVertexLinks",m_vertexLinksKey = "AntiKt4EMPFlowJetsAuxDyn.GN2v01_VertexIndex"); declareProperty("GNNTool", m_gnn_Tool, "GNN Tool"); declareProperty("VertexFitterTool", m_vertexFitterTool, "Vertex fitting tool"); @@ -73,6 +76,7 @@ StatusCode GNNVertexConstructorTool::initialize() { // Initialize keys ATH_CHECK(m_trackLinksKey.initialize()); + ATH_CHECK(m_trackOriginsKey.initialize()); ATH_CHECK(m_vertexLinksKey.initialize()); m_jetWriteDecorKeyVertexLink = m_jetCollection + ".GNNVerticesLink"; @@ -96,10 +100,10 @@ StatusCode GNNVertexConstructorTool::decorateJets(const xAOD::JetContainer *jetC m_gnn_Tool->decorate(*jet); } - auto Vars =m_gnn_Tool->getDecoratorKeys(); - for (auto v : Vars){ - ATH_MSG_INFO(v); - } +// auto Vars =m_gnn_Tool->getDecoratorKeys(); +// for (auto v : Vars){ +// ATH_MSG_INFO(v); +// } return StatusCode::SUCCESS; } @@ -159,6 +163,7 @@ StatusCode GNNVertexConstructorTool::performVertexFit(const xAOD::JetContainer * //Read Decor Handle for Track links and Vertex links SG::ReadDecorHandle<xAOD::JetContainer, TLC> trackLinksHandle(m_trackLinksKey, ctx); + SG::ReadDecorHandle<xAOD::JetContainer, std::vector<char>> trackOriginsHandle(m_trackOriginsKey, ctx); SG::ReadDecorHandle<xAOD::JetContainer, std::vector<char>> vertexLinksHandle(m_vertexLinksKey, ctx); SG::WriteDecorHandle< xAOD::JetContainer, std::vector<ElementLink<xAOD::VertexContainer>>> @@ -191,16 +196,75 @@ StatusCode GNNVertexConstructorTool::performVertexFit(const xAOD::JetContainer * //Retrieve the Vertex and Track Collections auto vertexCollection = vertexLinksHandle(*jet); auto trackCollection = trackLinksHandle(*jet); + auto trackOriginCollection = trackOriginsHandle(*jet); - //Fill the map - int i = 0; - for (auto v : vertexCollection) { - //if ((*trackCollection[i])->d0()<m_minD0) continue; - vertexMap.insert(std::pair<int, TL>(v, (trackCollection[i]))); - i++; - } +// ATH_MSG_DEBUG(" TO Size " <<trackOriginCollection.size()); +// ATH_MSG_DEBUG(" T size "<<trackCollection.size()); +// ATH_MSG_DEBUG(" Vertex size " << vertexCollection.size()); + + + using indexList = std::vector< int >; + using trackCountMap = std::map< char, std::set<TL> >; + using vertex2trackCountMap = std::map< char, trackCountMap >; + + indexList iList(vertexCollection.size()); + + vertex2trackCountMap v2tcMap; + trackCountMap FittingMap; + FittingMap.clear(); - std::multimap<int, TL>::iterator itr; + std::for_each(boost::make_zip_iterator(boost::make_tuple(vertexCollection.cbegin(), trackOriginCollection.cbegin(), trackCollection.cbegin())), + boost::make_zip_iterator(boost::make_tuple(vertexCollection.cend(), trackOriginCollection.cend(), trackCollection.cend())), + [&v2tcMap, &FittingMap, &minD0=m_minD0](const boost::tuple<const char &, const char &, const TL &> &e) + { + auto v = e.get<0>(); + auto to = e.get<1>(); + auto tl = e.get<2>(); + + //d0 cut on tracks + if ((*tl)->d0()>minD0) + { + + v2tcMap[v][to].insert(tl); + } + }); + + + auto mapComp= [](const auto &LHS, const auto &RHS) + { + return LHS.second.size() < RHS.second.size(); + }; + + + auto vertex2trackOrigin = [&mapComp, &FittingMap](const auto &e){ + const auto &[v, tcm] = e; + const auto &[to, n] = *(std::max_element(tcm.cbegin(), tcm.cend(), mapComp)); + { + FittingMap.insert(std::pair<char, std::set<TL>>(v, n)); + //std::cout << "Test " << (int)v << " " << n.size() << std::endl; + + }; + //std::cout << (int)v << ", " << (int)to << ", " << n.size() << std::endl; + }; + + + std::for_each(v2tcMap.cbegin(), v2tcMap.cend(), vertex2trackOrigin); + + //Fill the map +// int i = 0; +// for (auto v : vertexCollection) { +// +// int a = trackOriginCollection[i]; +// +// int b = v; +// ATH_MSG_DEBUG(" Vertex " << b << " Track Origin " << a << " Track Links " << *trackCollection[i] ); +// +// +// vertexMap.insert(std::pair<int, TL>(v, (trackCollection[i]))); +// i++; +// } +// +// std::multimap<int, TL>::iterator itr; //Working xAOD workVectorArrxAOD *xAODwrk = new workVectorArrxAOD(); @@ -220,19 +284,22 @@ StatusCode GNNVertexConstructorTool::performVertexFit(const xAOD::JetContainer * std::vector<const xAOD::NeutralParticle *> neutralPartDummy(0); Amg::Vector3D IniVrt(0.,0.,0.); -// xAODwrk->listSelTracks.clear(); - // returns next value after last key - easier for "for loop" - auto lastKey = (vertexMap.end())->first; - - for (int k = 0; k < lastKey; ++k) { - if (vertexMap.count(k) >= 2) { + //auto lastKey = (FittingMap.end())->first; + //ATH_MSG_DEBUG("BAFFLED"); + //for (int k = 0; k < lastKey; ++k) { + //ATH_MSG_DEBUG("FUCK"); + //ATH_MSG_DEBUG(FittingMap.count(k)); + for(const auto& pair : FittingMap){ + + if (pair.second.size() >= 2) { // Need at least 2 tracks to perform a fit - auto elements = vertexMap.equal_range(k); + //auto elements = FittingMap.equal_range(k); - int NTRKS =vertexMap.count(k); - + //int NTRKS =FittingMap.count(k); + int NTRKS =pair.second.size(); + //ATH_MSG_DEBUG("FECKING TEST"); std::vector<double> InpMass(NTRKS,m_massPi); m_vertexFitterTool->setMassInputParticles( InpMass, *state); @@ -242,10 +309,10 @@ StatusCode GNNVertexConstructorTool::performVertexFit(const xAOD::JetContainer * // //newvrt.selTrk.clear(); //Retrieve the tracks and push to working xAOD - for (auto i = elements.first; i != elements.second; ++i) { - xAODwrk->listSelTracks.push_back(*(i->second)); - //ATH_MSG_DEBUG((*(i->second))->d0()); - } +// for (auto i = elements.first; i != elements.second; ++i) { +// xAODwrk->listSelTracks.push_back(*(i->second)); +// //ATH_MSG_DEBUG((*(i->second))->d0()); +// } ATH_MSG_DEBUG("#Tracks test " << xAODwrk->listSelTracks.size()); @@ -317,6 +384,8 @@ StatusCode GNNVertexConstructorTool::performVertexFit(const xAOD::JetContainer * ATH_MSG_DEBUG("Sum Tracks " << MomentumJet.E()); ATH_MSG_DEBUG("Vertex " << newvrt.vertexMom.E()); ATH_MSG_DEBUG("Jets " << jet->p4().E()); + ATH_MSG_DEBUG("Vertex R " << newvrt.vertex.perp()); + double eRatio = newvrt.vertexMom.E()/jet->p4().E(); @@ -325,6 +394,7 @@ StatusCode GNNVertexConstructorTool::performVertexFit(const xAOD::JetContainer * if(newvrt.vertex.perp()>m_Rbeampipe && Signif3D<20.) continue; + if(newvrt.vertex.perp()<0.5) continue; //Make New Container xAOD::Vertex *GNNvertex = new xAOD::Vertex; outVertexContainer->emplace_back(GNNvertex); diff --git a/Reconstruction/VKalVrt/GNNVertexConstructor/data/network_fold0.onnx b/Reconstruction/VKalVrt/GNNVertexConstructor/data/network_fold0.onnx deleted file mode 100644 index be94ec74b6dde37a3c45fc39b8c9d994573fb798..0000000000000000000000000000000000000000 Binary files a/Reconstruction/VKalVrt/GNNVertexConstructor/data/network_fold0.onnx and /dev/null differ diff --git a/Reconstruction/VKalVrt/GNNVertexConstructor/python/GNNVertexConstructorToolConfig.py b/Reconstruction/VKalVrt/GNNVertexConstructor/python/GNNVertexConstructorToolConfig.py index 28504c8bf64b8dbc4b47bc7006354e2d03e4134f..c89a542e8b07527ed76ded1cb78166ad56db46b8 100644 --- a/Reconstruction/VKalVrt/GNNVertexConstructor/python/GNNVertexConstructorToolConfig.py +++ b/Reconstruction/VKalVrt/GNNVertexConstructor/python/GNNVertexConstructorToolConfig.py @@ -12,7 +12,7 @@ def GNNVertexConstructorToolCfg(flags, name="LMEdevTool", **kwargs): gnnTool = acc.getPrimaryAndMerge( GNNToolCfg( flags, - NNFile ="GNNVertexConstructor/network_fold0.onnx", + NNFile ="BTagging/20231205/GN2v01/antikt4empflow/network_fold0.onnx", trackLinkType ="IPARTICLE", #Either IPARTICLE or TRACK_PARTICLE variableRemapping={"BTagTrackToJetAssociator" : "GhostTrack"}, )