Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2026-04-02 08:12:46

0001 #include "GlobalVertexv3.h"
0002 
0003 #include <limits>
0004 
0005 GlobalVertexv3::GlobalVertexv3(const unsigned int id)
0006   : _id(id)
0007 {
0008 }
0009 
0010 GlobalVertexv3::~GlobalVertexv3()
0011 {
0012   GlobalVertexv3::Reset();
0013 }
0014 
0015 void GlobalVertexv3::Reset()
0016 {
0017   for (auto& _vtx : _vtxs)
0018   {
0019     for (const auto* vertex : _vtx.second)
0020     {
0021       delete vertex;
0022     }
0023   }
0024   _vtxs.clear();
0025 }
0026 
0027 void GlobalVertexv3::identify(std::ostream& os) const
0028 {
0029   os << "---GlobalVertexv3-----------------------" << std::endl;
0030 
0031   os << " list of vtx ids: " << std::endl;
0032   for (ConstVertexIter iter = begin_vertexes(); iter != end_vertexes(); ++iter)
0033   {
0034     os << "  Vertex type " << iter->first << " has " << iter->second.size()
0035        << " vertices associated to it" << std::endl;
0036     for (const auto& vertex : iter->second)
0037     {
0038       vertex->identify();
0039     }
0040   }
0041 
0042   os << "-----------------------------------------------" << std::endl;
0043 }
0044 
0045 int GlobalVertexv3::isValid() const
0046 {
0047   if (_vtxs.empty())
0048   {
0049     return 0;
0050   }
0051   return 1;
0052 }
0053 
0054 void GlobalVertexv3::insert_vtx(GlobalVertex::VTXTYPE type, const Vertex* vertex)
0055 {
0056   auto it = _vtxs.find(type);
0057   if (it == _vtxs.end())
0058   {
0059     VertexVector vector;
0060     vector.push_back(vertex);
0061     _vtxs.insert(std::make_pair(type, vector));
0062     return;
0063   }
0064 
0065   it->second.push_back(vertex);
0066 }
0067 
0068 void GlobalVertexv3::clone_insert_vtx(GlobalVertex::VTXTYPE type, const Vertex* vertex)
0069 {
0070   auto it = _vtxs.find(type);
0071   Vertex* clone = dynamic_cast<Vertex*>(vertex->CloneMe());
0072   if (it == _vtxs.end())
0073   {
0074     VertexVector vector;
0075     vector.push_back(clone);
0076     _vtxs.insert(std::make_pair(type, vector));
0077     return;
0078   }
0079 
0080   it->second.push_back(clone);
0081 }
0082 
0083 size_t GlobalVertexv3::count_vtxs(GlobalVertex::VTXTYPE type) const
0084 {
0085   auto it = _vtxs.find(type);
0086   if (it == _vtxs.end())
0087   {
0088     return 0;
0089   }
0090 
0091   return it->second.size();
0092 }
0093 
0094 float GlobalVertexv3::get_t() const
0095 {
0096   auto it = _vtxs.find(GlobalVertex::VTXTYPE::MBD);
0097   if (it == _vtxs.end())
0098   {
0099     return std::numeric_limits<float>::quiet_NaN();
0100   }
0101 
0102   return it->second[0]->get_t();
0103 }
0104 
0105 float GlobalVertexv3::get_t_err() const
0106 {
0107   auto it = _vtxs.find(GlobalVertex::VTXTYPE::MBD);
0108   if (it == _vtxs.end())
0109   {
0110     return std::numeric_limits<float>::quiet_NaN();
0111   }
0112 
0113   return it->second[0]->get_t_err();
0114 }
0115 
0116 float GlobalVertexv3::get_x() const { return get_position(0); }
0117 float GlobalVertexv3::get_y() const { return get_position(1); }
0118 float GlobalVertexv3::get_z() const { return get_position(2); }
0119 
0120 float GlobalVertexv3::get_position(unsigned int coor) const
0121 {
0122   auto svtxit = _vtxs.find(GlobalVertex::VTXTYPE::SVTX);
0123   if (svtxit == _vtxs.end())
0124   {
0125     auto mbdit = _vtxs.find(GlobalVertex::VTXTYPE::MBD);
0126     if (mbdit == _vtxs.end())
0127     {
0128       auto caloit = _vtxs.find(GlobalVertex::VTXTYPE::CALO);
0129       if (caloit == _vtxs.end())
0130       {
0131         auto truthit = _vtxs.find(GlobalVertex::VTXTYPE::TRUTH);
0132         if (truthit == _vtxs.end())
0133         {
0134           return std::numeric_limits<float>::quiet_NaN();
0135         }
0136         return truthit->second[0]->get_position(coor);
0137       }
0138       return caloit->second[0]->get_position(coor);
0139     }
0140     return mbdit->second[0]->get_position(coor);
0141   }
0142 
0143   GlobalVertex::VertexVector trackvertices = svtxit->second;
0144   size_t mosttracks = 0;
0145   float pos = std::numeric_limits<float>::quiet_NaN();
0146   for (const auto* vertex : trackvertices)
0147   {
0148     if (vertex->size_tracks() > mosttracks)
0149     {
0150       mosttracks = vertex->size_tracks();
0151       pos = vertex->get_position(coor);
0152     }
0153   }
0154 
0155   return pos;
0156 }
0157 
0158 float GlobalVertexv3::get_chisq() const
0159 {
0160   auto svtxit = _vtxs.find(GlobalVertex::VTXTYPE::SVTX);
0161   if (svtxit == _vtxs.end())
0162   {
0163     return std::numeric_limits<float>::quiet_NaN();
0164   }
0165 
0166   GlobalVertex::VertexVector trackvertices = svtxit->second;
0167   size_t mosttracks = 0;
0168   float chisq = std::numeric_limits<float>::quiet_NaN();
0169   for (const auto* vertex : trackvertices)
0170   {
0171     if (vertex->size_tracks() > mosttracks)
0172     {
0173       mosttracks = vertex->size_tracks();
0174       chisq = vertex->get_chisq();
0175     }
0176   }
0177 
0178   return chisq;
0179 }
0180 
0181 unsigned int GlobalVertexv3::get_ndof() const
0182 {
0183   auto svtxit = _vtxs.find(GlobalVertex::VTXTYPE::SVTX);
0184   if (svtxit == _vtxs.end())
0185   {
0186     return std::numeric_limits<unsigned int>::max();
0187   }
0188 
0189   GlobalVertex::VertexVector trackvertices = svtxit->second;
0190   size_t mosttracks = 0;
0191   unsigned int ndf = std::numeric_limits<unsigned int>::max();
0192   for (const auto* vertex : trackvertices)
0193   {
0194     if (vertex->size_tracks() > mosttracks)
0195     {
0196       mosttracks = vertex->size_tracks();
0197       ndf = vertex->get_ndof();
0198     }
0199   }
0200 
0201   return ndf;
0202 }
0203 
0204 float GlobalVertexv3::get_error(unsigned int i, unsigned int j) const
0205 {
0206   auto svtxit = _vtxs.find(GlobalVertex::VTXTYPE::SVTX);
0207   if (svtxit == _vtxs.end())
0208   {
0209     auto mbdit = _vtxs.find(GlobalVertex::VTXTYPE::MBD);
0210     if (mbdit == _vtxs.end())
0211     {
0212       return std::numeric_limits<float>::quiet_NaN();
0213     }
0214     // MBD only has z error defined
0215     if (i == 2 && j == 2)
0216     {
0217       return mbdit->second[0]->get_z_err();
0218     }
0219 
0220     return std::numeric_limits<float>::quiet_NaN();
0221   }
0222 
0223   GlobalVertex::VertexVector trackvertices = svtxit->second;
0224   size_t mosttracks = 0;
0225   float err = std::numeric_limits<float>::quiet_NaN();
0226   for (const auto* vertex : trackvertices)
0227   {
0228     if (vertex->size_tracks() > mosttracks)
0229     {
0230       mosttracks = vertex->size_tracks();
0231       err = vertex->get_error(i, j);
0232     }
0233   }
0234 
0235   return err;
0236 }