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