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