Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:17:38

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