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
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 }