Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:19:56

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 (const 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 (const 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       auto caloit = _vtxs.find(GlobalVertex::VTXTYPE::CALO);
0134       if(caloit == _vtxs.end())
0135     {
0136       return std::numeric_limits<float>::quiet_NaN();
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 GlobalVertexv2::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 GlobalVertexv2::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 GlobalVertexv2::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 }